From patchwork Wed Mar 30 22:37:23 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: 603686 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 3qb2by1L6Vz9sBm for ; Thu, 31 Mar 2016 09:38:22 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=OzcCmInq; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755348AbcC3WiO (ORCPT ); Wed, 30 Mar 2016 18:38:14 -0400 Received: from mail-qg0-f65.google.com ([209.85.192.65]:34057 "EHLO mail-qg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754301AbcC3Whs (ORCPT ); Wed, 30 Mar 2016 18:37:48 -0400 Received: by mail-qg0-f65.google.com with SMTP id j35so6150023qge.1 for ; Wed, 30 Mar 2016 15:37:48 -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=BAGpbFUPHyQB3dBzlmDJoV87iIjLplkNZWO6WMCLYPk=; b=OzcCmInq9k4ieudSjjLqWZChZtPTD6xnD2xSO0nNJfcByGI5/9ZwQBF3Wnzp7W9GYu 7J+zJ/u5MZdvcOEX+XRo5XiMsuFQMnwgi+yA9ZS19k7+szLiKjNWpkLeHljm3Ap11dom t1ZTLBbrHgd+HzkIujT1Fot9PG0WDQha3WMz9C3xsVa6eJm4VDACx442ECtiNimqMgNY oAlES15aHwv62XcSgZABwqnS9mznY0Tyr9FxyRqebD5w1V1zLdMUujqDYrGogAH/hXxT /NknTHRMBhG1OmE/qfZJt5HYiTFFLzOtgOUG4NrZbY8A/ixsEaoijOUlURc3Z6PPIni0 hAyw== 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=BAGpbFUPHyQB3dBzlmDJoV87iIjLplkNZWO6WMCLYPk=; b=A+AdFXQ0OO17AbX0R+mdt9STl2ZweOcx+JsYVozC12LzayeN/QOVHQ/rDLRm2/MnqM h6r8DTvvvpYsgB0VksNAPiWSOAOrEkmMxmJcuLk6LwXs2nz81y28znbRihFt9AksV3JX Or1jNLvtCemYbscmnw+VwKEUbkbmbeMBItRmeqVZayuNi3kl24FPidRosgSIbrbZUEHn 2jCxzkFAjsFz5oGqsb2K012MGyD+yM4xyqjRyCoHC2l929gycschHV13g2S7aLMl+mEy EqY91eq6se1YdiXTMdFu02wFZZ9OwO5uGGDgidNEVZEFvo/DVOj+0gjywfDN2vq21GPL Bwsg== X-Gm-Message-State: AD7BkJLM98nD/tVvLsz65F/Y0O591Gxoob1NXdu5DAjmskkgBt0xqRRKd8fVSF/OP4VvvQ== X-Received: by 10.140.132.68 with SMTP id 65mr13832308qhe.13.1459377468000; Wed, 30 Mar 2016 15:37:48 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id l67sm2782265qgl.47.2016.03.30.15.37.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 30 Mar 2016 15:37:47 -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 net-next 3/8] tcp: use one bit in TCP_SKB_CB to mark ACK timestamps Date: Wed, 30 Mar 2016 18:37:23 -0400 Message-Id: <1459377448-2239-4-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459377448-2239-1-git-send-email-soheil.kdev@gmail.com> References: <1459377448-2239-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 --- 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);