bpf: Refactor codes handling percpu map
authorMartin KaFai Lau <kafai@fb.com>
Fri, 11 Nov 2016 18:55:08 +0000 (10:55 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Nov 2016 16:50:20 +0000 (11:50 -0500)
Refactor the codes that populate the value
of a htab_elem in a BPF_MAP_TYPE_PERCPU_HASH
typed bpf_map.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
kernel/bpf/hashtab.c

index ad1bc67..b478d80 100644 (file)
@@ -420,6 +420,24 @@ static void free_htab_elem(struct bpf_htab *htab, struct htab_elem *l)
        }
 }
 
+static void pcpu_copy_value(struct bpf_htab *htab, void __percpu *pptr,
+                           void *value, bool onallcpus)
+{
+       if (!onallcpus) {
+               /* copy true value_size bytes */
+               memcpy(this_cpu_ptr(pptr), value, htab->map.value_size);
+       } else {
+               u32 size = round_up(htab->map.value_size, 8);
+               int off = 0, cpu;
+
+               for_each_possible_cpu(cpu) {
+                       bpf_long_memcpy(per_cpu_ptr(pptr, cpu),
+                                       value + off, size);
+                       off += size;
+               }
+       }
+}
+
 static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
                                         void *value, u32 key_size, u32 hash,
                                         bool percpu, bool onallcpus,
@@ -479,18 +497,8 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
                        }
                }
 
-               if (!onallcpus) {
-                       /* copy true value_size bytes */
-                       memcpy(this_cpu_ptr(pptr), value, htab->map.value_size);
-               } else {
-                       int off = 0, cpu;
+               pcpu_copy_value(htab, pptr, value, onallcpus);
 
-                       for_each_possible_cpu(cpu) {
-                               bpf_long_memcpy(per_cpu_ptr(pptr, cpu),
-                                               value + off, size);
-                               off += size;
-                       }
-               }
                if (!prealloc)
                        htab_elem_set_ptr(l_new, key_size, pptr);
        } else {
@@ -606,22 +614,9 @@ static int __htab_percpu_map_update_elem(struct bpf_map *map, void *key,
                goto err;
 
        if (l_old) {
-               void __percpu *pptr = htab_elem_get_ptr(l_old, key_size);
-               u32 size = htab->map.value_size;
-
                /* per-cpu hash map can update value in-place */
-               if (!onallcpus) {
-                       memcpy(this_cpu_ptr(pptr), value, size);
-               } else {
-                       int off = 0, cpu;
-
-                       size = round_up(size, 8);
-                       for_each_possible_cpu(cpu) {
-                               bpf_long_memcpy(per_cpu_ptr(pptr, cpu),
-                                               value + off, size);
-                               off += size;
-                       }
-               }
+               pcpu_copy_value(htab, htab_elem_get_ptr(l_old, key_size),
+                               value, onallcpus);
        } else {
                l_new = alloc_htab_elem(htab, key, value, key_size,
                                        hash, true, onallcpus, false);