bpf: Refactor codes handling percpu map
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>
This commit is contained in:
parent
961578b634
commit
fd91de7b3c
|
@ -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,
|
static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
|
||||||
void *value, u32 key_size, u32 hash,
|
void *value, u32 key_size, u32 hash,
|
||||||
bool percpu, bool onallcpus,
|
bool percpu, bool onallcpus,
|
||||||
|
@ -479,18 +497,8 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!onallcpus) {
|
pcpu_copy_value(htab, pptr, value, onallcpus);
|
||||||
/* copy true value_size bytes */
|
|
||||||
memcpy(this_cpu_ptr(pptr), value, htab->map.value_size);
|
|
||||||
} else {
|
|
||||||
int off = 0, cpu;
|
|
||||||
|
|
||||||
for_each_possible_cpu(cpu) {
|
|
||||||
bpf_long_memcpy(per_cpu_ptr(pptr, cpu),
|
|
||||||
value + off, size);
|
|
||||||
off += size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!prealloc)
|
if (!prealloc)
|
||||||
htab_elem_set_ptr(l_new, key_size, pptr);
|
htab_elem_set_ptr(l_new, key_size, pptr);
|
||||||
} else {
|
} else {
|
||||||
|
@ -606,22 +614,9 @@ static int __htab_percpu_map_update_elem(struct bpf_map *map, void *key,
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (l_old) {
|
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 */
|
/* per-cpu hash map can update value in-place */
|
||||||
if (!onallcpus) {
|
pcpu_copy_value(htab, htab_elem_get_ptr(l_old, key_size),
|
||||||
memcpy(this_cpu_ptr(pptr), value, size);
|
value, onallcpus);
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
l_new = alloc_htab_elem(htab, key, value, key_size,
|
l_new = alloc_htab_elem(htab, key, value, key_size,
|
||||||
hash, true, onallcpus, false);
|
hash, true, onallcpus, false);
|
||||||
|
|
Loading…
Reference in New Issue