From patchwork Tue Jan 10 13:31:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Desrochers X-Patchwork-Id: 713257 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3tyXxz185gz9ssP; Wed, 11 Jan 2017 00:32:23 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical-com.20150623.gappssmtp.com header.i=@canonical-com.20150623.gappssmtp.com header.b="f+J2cQ0G"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1cQwXB-0000pt-Bs; Tue, 10 Jan 2017 13:32:17 +0000 Received: from mail-it0-f49.google.com ([209.85.214.49]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1cQwX3-0000ox-Ra for kernel-team@lists.ubuntu.com; Tue, 10 Jan 2017 13:32:09 +0000 Received: by mail-it0-f49.google.com with SMTP id x2so87754867itf.1 for ; Tue, 10 Jan 2017 05:32:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=3bbHS4YA8y8Ya7f43Ued5blK7DflLS92erqzT97g1P0=; b=f+J2cQ0GqkvlhaN72nThBK6PVdPEGhJmFBvhw/n+jA1MfI05RCO9xbnGr8dNgK6Vbq fPn4GwFwo+AnqYEZkggH82fSq9HlrLTJRvAEU7Z//VDYZoNL/Qhx+rC3A8U4jv0oG3AJ IBL/8B1OvCMQEWI7xZoCTijzsGm490HGtfkDevGZKjrQjILf1FPttf6G2j0aO3+/JGrP +uBlh+SHtCXS+AmMDxQRF/CmrL3RSqeKEcYF2rQe2RQG10B6SVQPL+e2MKihuUoHOcUL L5GITMF12QqD2FPoNGA8S0XM/zZooCiDX7nIuJDBhphYuOjGCKYACgguwfrjwbcS0lOT 6ImQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=3bbHS4YA8y8Ya7f43Ued5blK7DflLS92erqzT97g1P0=; b=dbDv1ljj1wqLAEyDhV7unJa+Jg/AL4bDDIF4kix10JV2DWt5YjUB6C4TMZwDbTTpmE zA6gpIU2GT3niwfAjcW+KNWbgnTwmanC7EEQzCsCEM3V50uaOEixDW0tJQYg5XEkgJjb xwGXRdnlkKHbp5Ch3cpIdqRJZvISyklBtTwu4oQ5GZwI/FFGlh/S2KVgr/S+P2NRe0QR 6SeEx+pBhbpcqpMLROAvv+BncKL3uAlFudJFbjNNzo94EAoOhJdH5AfMuRJ5VLCeELtO Unzsaz7MlD6D6+6EpzeB4lTC9RNmjzI6r/NQCHZZUfqHDJqevPTN15l32J2SH4GFVCV7 dwwA== X-Gm-Message-State: AIkVDXLFFRrds4JjsF+7t5E2atjMFsUFhexC7+WNcJSn7+UdhHuIeXF5eNpTsEodTRprhHcg X-Received: by 10.36.46.17 with SMTP id i17mr3076642ita.104.1484055128357; Tue, 10 Jan 2017 05:32:08 -0800 (PST) Received: from macbuntu.slashd.local (modemcable057.191-130-66.mc.videotron.ca. [66.130.191.57]) by smtp.gmail.com with ESMTPSA id j19sm8208136iti.3.2017.01.10.05.32.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 Jan 2017 05:32:07 -0800 (PST) From: Eric Desrochers To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/3][SRU][Y, Z] netfilter: x_tables: pass xt_counters struct instead of packet counter Date: Tue, 10 Jan 2017 08:31:59 -0500 Message-Id: <1484055121-5443-2-git-send-email-eric.desrochers@canonical.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484055121-5443-1-git-send-email-eric.desrochers@canonical.com> References: <1484055121-5443-1-git-send-email-eric.desrochers@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Florian Westphal BugLink: https://bugs.launchpad.net/bugs/1640786 On SMP we overload the packet counter (unsigned long) to contain percpu offset. Hide this from callers and pass xt_counters address instead. Preparation patch to allocate the percpu counters in page-sized batch chunks. Signed-off-by: Florian Westphal Acked-by: Eric Dumazet Signed-off-by: Pablo Neira Ayuso (cherry picked from commit 4d31eef5176df06f218201bc9c0ce40babb41660) Signed-off-by: Eric Desrochers --- include/linux/netfilter/x_tables.h | 6 +----- net/ipv4/netfilter/arp_tables.c | 4 ++-- net/ipv4/netfilter/ip_tables.c | 4 ++-- net/ipv6/netfilter/ip6_tables.c | 5 ++--- net/netfilter/x_tables.c | 9 +++++++++ 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 2ad1a2b..dfd56c1 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h @@ -402,11 +402,7 @@ static inline unsigned long xt_percpu_counter_alloc(void) return 0; } -static inline void xt_percpu_counter_free(u64 pcnt) -{ - if (nr_cpu_ids > 1) - free_percpu((void __percpu *) (unsigned long) pcnt); -} +void xt_percpu_counter_free(struct xt_counters *cnt); static inline struct xt_counters * xt_get_this_cpu_counter(struct xt_counters *cnt) diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 624b0fd..a2be65c 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -460,7 +460,7 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size) err: module_put(t->u.kernel.target->me); out: - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); return ret; } @@ -540,7 +540,7 @@ static inline void cleanup_entry(struct arpt_entry *e) if (par.target->destroy != NULL) par.target->destroy(&par); module_put(par.target->me); - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); } /* Checks and translates the user-supplied table segment (held in diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index ebaed2b..7c25dd4 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -603,7 +603,7 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name, cleanup_match(ematch, net); } - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); return ret; } @@ -691,7 +691,7 @@ cleanup_entry(struct ipt_entry *e, struct net *net) if (par.target->destroy != NULL) par.target->destroy(&par); module_put(par.target->me); - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); } /* Checks and translates the user-supplied table segment (held in diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 063217e..862e20f 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -633,7 +633,7 @@ find_check_entry(struct ip6t_entry *e, struct net *net, const char *name, cleanup_match(ematch, net); } - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); return ret; } @@ -720,8 +720,7 @@ static void cleanup_entry(struct ip6t_entry *e, struct net *net) if (par.target->destroy != NULL) par.target->destroy(&par); module_put(par.target->me); - - xt_percpu_counter_free(e->counters.pcnt); + xt_percpu_counter_free(&e->counters); } /* Checks and translates the user-supplied table segment (held in diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index fc49774..93703c9 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c @@ -1615,6 +1615,15 @@ void xt_proto_fini(struct net *net, u_int8_t af) } EXPORT_SYMBOL_GPL(xt_proto_fini); +void xt_percpu_counter_free(struct xt_counters *counters) +{ + unsigned long pcnt = counters->pcnt; + + if (nr_cpu_ids > 1) + free_percpu((void __percpu *)pcnt); +} +EXPORT_SYMBOL_GPL(xt_percpu_counter_free); + static int __net_init xt_net_init(struct net *net) { int i;