netfilter: x_tables: pass xt_counters struct to counter allocator

Keeps some noise away from a followup patch.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
Florian Westphal
2016-11-22 14:44:18 +01:00
committed by Pablo Neira Ayuso
parent 4d31eef517
commit f28e15bace
5 changed files with 34 additions and 38 deletions

View File

@@ -415,13 +415,10 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size)
{
struct xt_entry_target *t;
struct xt_target *target;
unsigned long pcnt;
int ret;
pcnt = xt_percpu_counter_alloc();
if (IS_ERR_VALUE(pcnt))
if (!xt_percpu_counter_alloc(&e->counters))
return -ENOMEM;
e->counters.pcnt = pcnt;
t = arpt_get_target(e);
target = xt_request_find_target(NFPROTO_ARP, t->u.user.name,

View File

@@ -539,12 +539,9 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name,
unsigned int j;
struct xt_mtchk_param mtpar;
struct xt_entry_match *ematch;
unsigned long pcnt;
pcnt = xt_percpu_counter_alloc();
if (IS_ERR_VALUE(pcnt))
if (!xt_percpu_counter_alloc(&e->counters))
return -ENOMEM;
e->counters.pcnt = pcnt;
j = 0;
mtpar.net = net;

View File

@@ -570,12 +570,9 @@ find_check_entry(struct ip6t_entry *e, struct net *net, const char *name,
unsigned int j;
struct xt_mtchk_param mtpar;
struct xt_entry_match *ematch;
unsigned long pcnt;
pcnt = xt_percpu_counter_alloc();
if (IS_ERR_VALUE(pcnt))
if (!xt_percpu_counter_alloc(&e->counters))
return -ENOMEM;
e->counters.pcnt = pcnt;
j = 0;
mtpar.net = net;

View File

@@ -1615,6 +1615,36 @@ void xt_proto_fini(struct net *net, u_int8_t af)
}
EXPORT_SYMBOL_GPL(xt_proto_fini);
/**
* xt_percpu_counter_alloc - allocate x_tables rule counter
*
* @counter: pointer to counter struct inside the ip(6)/arpt_entry struct
*
* On SMP, the packet counter [ ip(6)t_entry->counters.pcnt ] will then
* contain the address of the real (percpu) counter.
*
* Rule evaluation needs to use xt_get_this_cpu_counter() helper
* to fetch the real percpu counter.
*
* returns false on error.
*/
bool xt_percpu_counter_alloc(struct xt_counters *counter)
{
void __percpu *res;
if (nr_cpu_ids <= 1)
return true;
res = __alloc_percpu(sizeof(struct xt_counters),
sizeof(struct xt_counters));
if (!res)
return false;
counter->pcnt = (__force unsigned long)res;
return true;
}
EXPORT_SYMBOL_GPL(xt_percpu_counter_alloc);
void xt_percpu_counter_free(struct xt_counters *counters)
{
unsigned long pcnt = counters->pcnt;