From patchwork Sat Mar 31 19:59:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 893874 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="dI8DZgir"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40D8Tz6jfmz9s3B for ; Sun, 1 Apr 2018 06:00:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753169AbeCaUAF (ORCPT ); Sat, 31 Mar 2018 16:00:05 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:34393 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753074AbeCaUAA (ORCPT ); Sat, 31 Mar 2018 16:00:00 -0400 Received: by mail-pf0-f196.google.com with SMTP id q9so7481860pff.1 for ; Sat, 31 Mar 2018 13:00:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qJCifLGWAzgI94xQ7F6MbuFGFqVfuJ65eQvF+GKwPDA=; b=dI8DZgirzL5Fe66oJzTlHqQdMl6/Sq04RS5QgueroJrMvvL2tV7l3ASMSAlzg7RgKB 6Wv4Ru3RzonI+Gc/RSZnmYjtzbYYafZR2DnL5VCZCEuMnbNbZHeRcvqvbA/RixTzFn59 uul2ISr/IENSyPuvGQHuTiit8u2btlt/sKuvnaEHqcmD+w8TQmrJtzL5BwJtez72BWnM K6KLEkqqvVbvUrc+N2k9L9t2k3qZg0MEY+3mzyGtQmYGSyvs2QxHj9QBHdg5n7Zjfhmk jRn2i+jd3kuy3FCCSNgbohPM/jmskbetwHlQR0OWY9jdP9tUMas6xXSl0QllOHZtEk+5 jTJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qJCifLGWAzgI94xQ7F6MbuFGFqVfuJ65eQvF+GKwPDA=; b=ken0e7STkKGyjkyQKKtIItC+e0f9KSXFyelFZ5+xe2FPbcxNzanVjDiTOUN8ZzIDY3 emTn82pgFCA28dCj998AMJhJBGne13htmlDJQzuugYGL0DsNNPgpshhAjwYI7yANF8In XMKodvYUnM505cjKv7JZ3BKb/AAsVNWG955AkA3OHcxTI7yoCmivp0G3EhLL7PfBi+af YTFp9aUFbqom2brtRmXU5HGXidHzsujEDu0Px+mcty3TRyAp6A8zhnLLxupmdIOy36H0 7e3OO95O2zK4GP91jVFLSVsNgmJ/ITKy8IE9QSToLohwSZTNIJlVW98dgL1P05U70+vz 4dxQ== X-Gm-Message-State: AElRT7GWRYPYzbu7AZgugfOeNv6fYjpgeKwMkWX1SwZd87cQBIYVt55z rZ8vhMmkNQI9rPtCyldly9eVWg== X-Google-Smtp-Source: AIpwx495jFJZn5fLlOgCQ84fuKG/9aA9KufySTd0pBTFB2te/RhepzgkQCXyFtadUFpBMyocJ6BgwQ== X-Received: by 2002:a17:902:4481:: with SMTP id l1-v6mr4084590pld.43.1522526399304; Sat, 31 Mar 2018 12:59:59 -0700 (PDT) Received: from localhost ([2620:15c:2c4:201:f5a:7eca:440a:3ead]) by smtp.gmail.com with ESMTPSA id i86sm5108087pfi.26.2018.03.31.12.59.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 31 Mar 2018 12:59:58 -0700 (PDT) From: Eric Dumazet To: "David S . Miller" Cc: netdev , Florian Westphal , Herbert Xu , Thomas Graf , Jesper Dangaard Brouer , Alexander Aring , Stefan Schmidt , Kirill Tkhai , Eric Dumazet , Eric Dumazet Subject: [PATCH v4 net-next 19/19] inet: frags: get rid of nf_ct_frag6_skb_cb/NFCT_FRAG6_CB Date: Sat, 31 Mar 2018 12:59:00 -0700 Message-Id: <20180331195900.183604-20-edumazet@google.com> X-Mailer: git-send-email 2.17.0.rc1.321.gba9d0f2565-goog In-Reply-To: <20180331195900.183604-1-edumazet@google.com> References: <20180331195900.183604-1-edumazet@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org nf_ct_frag6_queue() uses skb->cb[] to store the fragment offset, meaning that we could use two cache lines per skb when finding the insertion point, if for some reason inet6_skb_parm size is increased in the future. By using skb->ip_defrag_offset instead of skb->cb[] we pack all the fields in a single cache line, matching what we did for IPv4. Signed-off-by: Eric Dumazet --- net/ipv6/netfilter/nf_conntrack_reasm.c | 29 ++++++++++--------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 603a395928593a071aff28105578d3bfdbf1b31e..3622aac343aea3cd0d8165d8681f42595735cd90 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c @@ -52,14 +52,6 @@ static const char nf_frags_cache_name[] = "nf-frags"; -struct nf_ct_frag6_skb_cb -{ - struct inet6_skb_parm h; - int offset; -}; - -#define NFCT_FRAG6_CB(skb) ((struct nf_ct_frag6_skb_cb *)((skb)->cb)) - static struct inet_frags nf_frags; #ifdef CONFIG_SYSCTL @@ -270,13 +262,13 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, * this fragment, right? */ prev = fq->q.fragments_tail; - if (!prev || NFCT_FRAG6_CB(prev)->offset < offset) { + if (!prev || prev->ip_defrag_offset < offset) { next = NULL; goto found; } prev = NULL; for (next = fq->q.fragments; next != NULL; next = next->next) { - if (NFCT_FRAG6_CB(next)->offset >= offset) + if (next->ip_defrag_offset >= offset) break; /* bingo! */ prev = next; } @@ -292,14 +284,19 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, /* Check for overlap with preceding fragment. */ if (prev && - (NFCT_FRAG6_CB(prev)->offset + prev->len) > offset) + (prev->ip_defrag_offset + prev->len) > offset) goto discard_fq; /* Look for overlap with succeeding segment. */ - if (next && NFCT_FRAG6_CB(next)->offset < end) + if (next && next->ip_defrag_offset < end) goto discard_fq; - NFCT_FRAG6_CB(skb)->offset = offset; + /* Note : skb->ip_defrag_offset and skb->dev share the same location */ + if (skb->dev) + fq->iif = skb->dev->ifindex; + /* Makes sure compiler wont do silly aliasing games */ + barrier(); + skb->ip_defrag_offset = offset; /* Insert this fragment in the chain of fragments. */ skb->next = next; @@ -310,10 +307,6 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, else fq->q.fragments = skb; - if (skb->dev) { - fq->iif = skb->dev->ifindex; - skb->dev = NULL; - } fq->q.stamp = skb->tstamp; fq->q.meat += skb->len; fq->ecn |= ecn; @@ -357,7 +350,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic inet_frag_kill(&fq->q); WARN_ON(head == NULL); - WARN_ON(NFCT_FRAG6_CB(head)->offset != 0); + WARN_ON(head->ip_defrag_offset != 0); ecn = ip_frag_ecn_table[fq->ecn]; if (unlikely(ecn == 0xff))