ipv4: icmp: use percpu allocation
authorEric Dumazet <edumazet@google.com>
Thu, 29 Jan 2015 23:58:09 +0000 (15:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Feb 2015 01:48:18 +0000 (17:48 -0800)
Get rid of nr_cpu_ids and use modern percpu allocation.

Note that the sockets themselves are not yet allocated
using NUMA affinity.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/ipv4.h
net/ipv4/icmp.c

index 24945cefc4fde6bfaf9c4560080c91b2e3b12d0d..7283f4d39ae2e48b22060d3fa54a078d3b87741e 100644 (file)
@@ -48,7 +48,8 @@ struct netns_ipv4 {
        struct hlist_head       *fib_table_hash;
        struct sock             *fibnl;
 
-       struct sock             **icmp_sk;
+       struct sock  * __percpu *icmp_sk;
+
        struct inet_peer_base   *peers;
        struct tcpm_hash_bucket *tcp_metrics_hash;
        unsigned int            tcp_metrics_hash_log;
index 36f5584d93c5da194caad055505b2ca97807c988..5e564014a0b75d04a8f64d48c6d3a14fe6df18a1 100644 (file)
@@ -205,7 +205,7 @@ static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
  */
 static struct sock *icmp_sk(struct net *net)
 {
-       return net->ipv4.icmp_sk[smp_processor_id()];
+       return *this_cpu_ptr(net->ipv4.icmp_sk);
 }
 
 static inline struct sock *icmp_xmit_lock(struct net *net)
@@ -1140,8 +1140,8 @@ static void __net_exit icmp_sk_exit(struct net *net)
        int i;
 
        for_each_possible_cpu(i)
-               inet_ctl_sock_destroy(net->ipv4.icmp_sk[i]);
-       kfree(net->ipv4.icmp_sk);
+               inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.icmp_sk, i));
+       free_percpu(net->ipv4.icmp_sk);
        net->ipv4.icmp_sk = NULL;
 }
 
@@ -1149,9 +1149,8 @@ static int __net_init icmp_sk_init(struct net *net)
 {
        int i, err;
 
-       net->ipv4.icmp_sk =
-               kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
-       if (net->ipv4.icmp_sk == NULL)
+       net->ipv4.icmp_sk = alloc_percpu(struct sock *);
+       if (!net->ipv4.icmp_sk)
                return -ENOMEM;
 
        for_each_possible_cpu(i) {
@@ -1162,7 +1161,7 @@ static int __net_init icmp_sk_init(struct net *net)
                if (err < 0)
                        goto fail;
 
-               net->ipv4.icmp_sk[i] = sk;
+               *per_cpu_ptr(net->ipv4.icmp_sk, i) = sk;
 
                /* Enough space for 2 64K ICMP packets, including
                 * sk_buff/skb_shared_info struct overhead.
@@ -1203,8 +1202,8 @@ static int __net_init icmp_sk_init(struct net *net)
 
 fail:
        for_each_possible_cpu(i)
-               inet_ctl_sock_destroy(net->ipv4.icmp_sk[i]);
-       kfree(net->ipv4.icmp_sk);
+               inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.icmp_sk, i));
+       free_percpu(net->ipv4.icmp_sk);
        return err;
 }