ipv6: sr: static percpu allocation for hmac_ring
authorEric Dumazet <edumazet@google.com>
Thu, 12 Jan 2017 16:50:10 +0000 (08:50 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Jan 2017 21:52:19 +0000 (16:52 -0500)
Current allocations are not NUMA aware, and lack proper
cleanup in case of error.

It is perfectly fine to use static per cpu allocations for 256 bytes
per cpu.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: David Lebrun <david.lebrun@uclouvain.be>
Acked-by: David Lebrun <david.lebrun@uclouvain.be>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/seg6_hmac.c

index ef1c8a46e7aceee45b2044d4b4338dc3aed88807..6389bf3e9c9f28cdd3e30175f2880b74e099e273 100644 (file)
@@ -45,7 +45,7 @@
 #include <net/seg6_hmac.h>
 #include <linux/random.h>
 
-static char * __percpu *hmac_ring;
+static DEFINE_PER_CPU(char [SEG6_HMAC_RING_SIZE], hmac_ring);
 
 static int seg6_hmac_cmpfn(struct rhashtable_compare_arg *arg, const void *obj)
 {
@@ -192,7 +192,7 @@ int seg6_hmac_compute(struct seg6_hmac_info *hinfo, struct ipv6_sr_hdr *hdr,
         */
 
        local_bh_disable();
-       ring = *this_cpu_ptr(hmac_ring);
+       ring = this_cpu_ptr(hmac_ring);
        off = ring;
 
        /* source address */
@@ -353,27 +353,6 @@ out:
 }
 EXPORT_SYMBOL(seg6_push_hmac);
 
-static int seg6_hmac_init_ring(void)
-{
-       int i;
-
-       hmac_ring = alloc_percpu(char *);
-
-       if (!hmac_ring)
-               return -ENOMEM;
-
-       for_each_possible_cpu(i) {
-               char *ring = kzalloc(SEG6_HMAC_RING_SIZE, GFP_KERNEL);
-
-               if (!ring)
-                       return -ENOMEM;
-
-               *per_cpu_ptr(hmac_ring, i) = ring;
-       }
-
-       return 0;
-}
-
 static int seg6_hmac_init_algo(void)
 {
        struct seg6_hmac_algo *algo;
@@ -422,16 +401,7 @@ static int seg6_hmac_init_algo(void)
 
 int __init seg6_hmac_init(void)
 {
-       int ret;
-
-       ret = seg6_hmac_init_ring();
-       if (ret < 0)
-               goto out;
-
-       ret = seg6_hmac_init_algo();
-
-out:
-       return ret;
+       return seg6_hmac_init_algo();
 }
 EXPORT_SYMBOL(seg6_hmac_init);
 
@@ -450,13 +420,6 @@ void seg6_hmac_exit(void)
        struct seg6_hmac_algo *algo = NULL;
        int i, alg_count, cpu;
 
-       for_each_possible_cpu(i) {
-               char *ring = *per_cpu_ptr(hmac_ring, i);
-
-               kfree(ring);
-       }
-       free_percpu(hmac_ring);
-
        alg_count = sizeof(hmac_algos) / sizeof(struct seg6_hmac_algo);
        for (i = 0; i < alg_count; i++) {
                algo = &hmac_algos[i];