From patchwork Fri Apr 1 15:04:35 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: 604881 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 3qc4SN702cz9t3w for ; Sat, 2 Apr 2016 02:05:24 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=fPFds8s3; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759151AbcDAPFO (ORCPT ); Fri, 1 Apr 2016 11:05:14 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:33442 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752751AbcDAPEp (ORCPT ); Fri, 1 Apr 2016 11:04:45 -0400 Received: by mail-qk0-f196.google.com with SMTP id q184so4712834qkb.0 for ; Fri, 01 Apr 2016 08:04:44 -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=o3jc0KFlt/ky/X2YgcPMv1R+V4adSvf05vG5oDi+evI=; b=fPFds8s3LPcfmayncxWJ3POnNLs0eYgSqddhZ9p5zWaQzzqMSc58AM2azjxAfSJUrC NLQnNDB96xjdakIIRgN5TkzN2DZjIgVWXr4RThfogxjCo7StHi60psST76Lza867D4jD X7gdgA3ZxFXTVQD0VRBLhyTdlzbRDekuuCdsY19UmsUvucj/QDzyZHUvkDohfUajjsxg Uh0EGJlvAhdFH4pc8bGggWddy3Oui1mB6iYRi+pihSQ0HfAv1L8ifogjJ4CUsgvIvI0r nWqiF2T9A7y/4LGrfbsmnKlIw8rOvd4pqNVX+Zj4ngG2T/SMdeeOlZ4w7xhmQDkV270f 8QHg== 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=o3jc0KFlt/ky/X2YgcPMv1R+V4adSvf05vG5oDi+evI=; b=d1eqi7tRkyvF0s7eW5AT/mHb2NPhXG4rj7ui+Tco3//ptEqniUpJ+rXvvaNoewj5Ap hOMrv9jZBIfbj3BkCusJY9VA9gFP+fjPQ7vaLhWFXabnmXCL7LaVW4cISblyBX7uE+xZ AVJ01RD38qlaUyIs8XYadsjn0n4bM7ELuNh8HZb54tuABlboTP6JAz3qLHX7n0DXSWM1 iexHRxc65yTblA64KZBO5+5oX11/6JPZVuVHY6TYWpWczostU1f2vh+8XUhCbJOxiz/e aUa1Itqd4SbINFmwRMGte/gUK/rI2bLoy50zbIh5+s7kUh7D157FyZbk5O2VIJSfF3uG aGNw== X-Gm-Message-State: AD7BkJLNFkEDPpZQuha7LlygabBRW8z6B081CHbw7edgGVaVDkNldxrZYIwg1Qp6WFkHGA== X-Received: by 10.55.192.14 with SMTP id o14mr19303145qki.31.1459523084331; Fri, 01 Apr 2016 08:04:44 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id d6sm6312885qkb.13.2016.04.01.08.04.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Apr 2016 08:04:43 -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 v2 net-next 3/8] tcp: use one bit in TCP_SKB_CB to mark ACK timestamps Date: Fri, 1 Apr 2016 11:04:35 -0400 Message-Id: <1459523080-29329-4-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459523080-29329-1-git-send-email-soheil.kdev@gmail.com> References: <1459523080-29329-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);