lkml.org 
[lkml]   [2018]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 61/86] netfilter: x_tables: pass xt_counters struct instead of packet counter
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Florian Westphal <fw@strlen.de>

    commit 4d31eef5176df06f218201bc9c0ce40babb41660 upstream.

    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 <fw@strlen.de>
    Acked-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    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(-)

    --- a/include/linux/netfilter/x_tables.h
    +++ b/include/linux/netfilter/x_tables.h
    @@ -402,11 +402,7 @@ static inline unsigned long xt_percpu_co

    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)
    --- a/net/ipv4/netfilter/arp_tables.c
    +++ b/net/ipv4/netfilter/arp_tables.c
    @@ -447,7 +447,7 @@ find_check_entry(struct arpt_entry *e, c
    err:
    module_put(t->u.kernel.target->me);
    out:
    - xt_percpu_counter_free(e->counters.pcnt);
    + xt_percpu_counter_free(&e->counters);

    return ret;
    }
    @@ -527,7 +527,7 @@ static inline void cleanup_entry(struct
    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
    --- a/net/ipv4/netfilter/ip_tables.c
    +++ b/net/ipv4/netfilter/ip_tables.c
    @@ -591,7 +591,7 @@ find_check_entry(struct ipt_entry *e, st
    cleanup_match(ematch, net);
    }

    - xt_percpu_counter_free(e->counters.pcnt);
    + xt_percpu_counter_free(&e->counters);

    return ret;
    }
    @@ -679,7 +679,7 @@ cleanup_entry(struct ipt_entry *e, struc
    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
    --- a/net/ipv6/netfilter/ip6_tables.c
    +++ b/net/ipv6/netfilter/ip6_tables.c
    @@ -620,7 +620,7 @@ find_check_entry(struct ip6t_entry *e, s
    cleanup_match(ematch, net);
    }

    - xt_percpu_counter_free(e->counters.pcnt);
    + xt_percpu_counter_free(&e->counters);

    return ret;
    }
    @@ -707,8 +707,7 @@ static void cleanup_entry(struct ip6t_en
    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
    --- a/net/netfilter/x_tables.c
    +++ b/net/netfilter/x_tables.c
    @@ -1619,6 +1619,15 @@ void xt_proto_fini(struct net *net, u_in
    }
    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;

    \
     
     \ /
      Last update: 2018-03-16 18:03    [W:4.115 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site