From patchwork Sun Apr 3 03:08:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 605504 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qd0Sb2VXlz9t3Z for ; Sun, 3 Apr 2016 13:08:47 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=HHoIZtDK; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752097AbcDCDI2 (ORCPT ); Sat, 2 Apr 2016 23:08:28 -0400 Received: from mail-qg0-f65.google.com ([209.85.192.65]:35237 "EHLO mail-qg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750819AbcDCDIZ (ORCPT ); Sat, 2 Apr 2016 23:08:25 -0400 Received: by mail-qg0-f65.google.com with SMTP id b32so13849710qgf.2 for ; Sat, 02 Apr 2016 20:08:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OVEJLXSzG0jWT/SgD+kAXfsUjAHA2WbXi2t5ebFX/fg=; b=HHoIZtDKP1ojKtR8tTJWPImKZOVKxV5wZqfqmf5kZkbMKGO/MarAtxBlujgFU2odQQ 19djlrvIs3n8tsTYSCzxUm3P80OQsnmOh3V091OB39915DtPNnZDwpXURq3sD11tIiLt vTck0pQSHUcf5PFW1OOP3130i5Al6+Ta5qcLN7UOtgC/hwE9eIkFbwAmTSdgMQ5zhP5A DrQpzUYgW/vPlx9AaFQ6VWemmJ48rI/71hPhiZjZIuwttm1nyZ28kgrW+c+nyNQadQJf 3yRsREMsoRCVDV78ulgPlDANd6SZY9ZRKY55tK3Zy4MNUY/b+W7UI+RzdeMcwPdSlnmB 2xCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OVEJLXSzG0jWT/SgD+kAXfsUjAHA2WbXi2t5ebFX/fg=; b=i56Gy5eeKYFu1MHE7ccvK413iRlZguouZY8n7SEBviZ4cj7I0qK6blZGwfH+vQsDXG AfODPs35JGpC38szBWso1o9vaQ5C6iSdB9NpS0Blrbj6WmB8h6kqX8vLPb6ws/IESrUX 58Qz7d5UsJ7MAzJU8020VXCYbwTMccr8JhqSBofypnAwO+Q3D0VUYlgjaKIaWVb4jE94 GzcosNRteVppzNXnpevMlXIHYNJfc34jxJOYQYBckoieOkZPD8Y4Fg8/RJZCm+fGueC6 iKh/mA4k5h2ttA2DQ0MzQdNA2OHVBFRBAsWJ2rmbhCCYqAX7vX5j6wjRLaWhevqTaImb mu/w== X-Gm-Message-State: AD7BkJKJFu6wb+PlrM4MRWwW3YR3t0UEKEOIc2f9tIauCzCYiN8c7gY1KL+Suu0+J/JMbw== X-Received: by 10.141.28.209 with SMTP id f200mr5485990qhe.53.1459652904244; Sat, 02 Apr 2016 20:08:24 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id r65sm9611121qki.17.2016.04.02.20.08.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 02 Apr 2016 20:08:23 -0700 (PDT) From: Soheil Hassas Yeganeh To: davem@davemloft.net, netdev@vger.kernel.org Cc: willemb@google.com, edumazet@google.com, ycheng@google.com, ncardwell@google.com, kafai@fb.com, Soheil Hassas Yeganeh Subject: [PATCH v3 net-next 3/8] tcp: use one bit in TCP_SKB_CB to mark ACK timestamps Date: Sat, 2 Apr 2016 23:08:08 -0400 Message-Id: <1459652893-14207-4-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459652893-14207-1-git-send-email-soheil.kdev@gmail.com> References: <1459652893-14207-1-git-send-email-soheil.kdev@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Soheil Hassas Yeganeh Currently, to avoid a cache line miss for accessing skb_shinfo, tcp_ack_tstamp skips socket that do not have SOF_TIMESTAMPING_TX_ACK bit set in sk_tsflags. This is implemented based on an implicit assumption that the SOF_TIMESTAMPING_TX_ACK is set via socket options for the duration that ACK timestamps are needed. To implement per-write timestamps, this check should be removed and replaced with a per-packet alternative that quickly skips packets missing ACK timestamps marks without a cache-line miss. To enable per-packet marking without a cache line miss, use one bit in TCP_SKB_CB to mark a whether a SKB might need a ack tx timestamp or not. Further checks in tcp_ack_tstamp are not modified and work as before. Signed-off-by: Soheil Hassas Yeganeh Acked-by: Willem de Bruijn Acked-by: Eric Dumazet --- include/net/tcp.h | 3 ++- net/ipv4/tcp.c | 2 ++ net/ipv4/tcp_input.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index b91370f..f3a80ec 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -754,7 +754,8 @@ struct tcp_skb_cb { TCPCB_REPAIRED) __u8 ip_dsfield; /* IPv4 tos or IPv6 dsfield */ - /* 1 byte hole */ + __u8 txstamp_ack:1, /* Record TX timestamp for ack? */ + unused:7; __u32 ack_seq; /* Sequence number ACK'd */ union { struct inet_skb_parm h4; diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 08b8b96..ce3c9eb 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -432,10 +432,12 @@ static void tcp_tx_timestamp(struct sock *sk, struct sk_buff *skb) { if (sk->sk_tsflags) { struct skb_shared_info *shinfo = skb_shinfo(skb); + struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); sock_tx_timestamp(sk, &shinfo->tx_flags); if (shinfo->tx_flags & SKBTX_ANY_TSTAMP) shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + tcb->txstamp_ack = !!(shinfo->tx_flags & SKBTX_ACK_TSTAMP); } } diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index e6e65f7..2d5fee4 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -3093,7 +3093,7 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, const struct skb_shared_info *shinfo; /* Avoid cache line misses to get skb_shinfo() and shinfo->tx_flags */ - if (likely(!(sk->sk_tsflags & SOF_TIMESTAMPING_TX_ACK))) + if (likely(!TCP_SKB_CB(skb)->txstamp_ack)) return; shinfo = skb_shinfo(skb);