bpf: Move bpf map owner out of common struct
Given this is only relevant for BPF tail call maps, it is adding up space and penalizing other map types. We also need to extend this with further objects to track / compare to. Therefore, lets move this out into a separate structure and dynamically allocate it only for BPF tail call maps. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/r/20250730234733.530041-2-daniel@iogearbox.net Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
12df58ad29
commit
fd1c98f0ef
+18
-17
@@ -2377,28 +2377,29 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map,
|
||||
const struct bpf_prog *fp)
|
||||
{
|
||||
enum bpf_prog_type prog_type = resolve_prog_type(fp);
|
||||
bool ret;
|
||||
struct bpf_prog_aux *aux = fp->aux;
|
||||
bool ret = false;
|
||||
|
||||
if (fp->kprobe_override)
|
||||
return false;
|
||||
return ret;
|
||||
|
||||
spin_lock(&map->owner.lock);
|
||||
if (!map->owner.type) {
|
||||
/* There's no owner yet where we could check for
|
||||
* compatibility.
|
||||
*/
|
||||
map->owner.type = prog_type;
|
||||
map->owner.jited = fp->jited;
|
||||
map->owner.xdp_has_frags = aux->xdp_has_frags;
|
||||
map->owner.attach_func_proto = aux->attach_func_proto;
|
||||
spin_lock(&map->owner_lock);
|
||||
/* There's no owner yet where we could check for compatibility. */
|
||||
if (!map->owner) {
|
||||
map->owner = bpf_map_owner_alloc(map);
|
||||
if (!map->owner)
|
||||
goto err;
|
||||
map->owner->type = prog_type;
|
||||
map->owner->jited = fp->jited;
|
||||
map->owner->xdp_has_frags = aux->xdp_has_frags;
|
||||
map->owner->attach_func_proto = aux->attach_func_proto;
|
||||
ret = true;
|
||||
} else {
|
||||
ret = map->owner.type == prog_type &&
|
||||
map->owner.jited == fp->jited &&
|
||||
map->owner.xdp_has_frags == aux->xdp_has_frags;
|
||||
ret = map->owner->type == prog_type &&
|
||||
map->owner->jited == fp->jited &&
|
||||
map->owner->xdp_has_frags == aux->xdp_has_frags;
|
||||
if (ret &&
|
||||
map->owner.attach_func_proto != aux->attach_func_proto) {
|
||||
map->owner->attach_func_proto != aux->attach_func_proto) {
|
||||
switch (prog_type) {
|
||||
case BPF_PROG_TYPE_TRACING:
|
||||
case BPF_PROG_TYPE_LSM:
|
||||
@@ -2411,8 +2412,8 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map,
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&map->owner.lock);
|
||||
|
||||
err:
|
||||
spin_unlock(&map->owner_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -887,6 +887,7 @@ static void bpf_map_free_deferred(struct work_struct *work)
|
||||
|
||||
security_bpf_map_free(map);
|
||||
bpf_map_release_memcg(map);
|
||||
bpf_map_owner_free(map);
|
||||
bpf_map_free(map);
|
||||
}
|
||||
|
||||
@@ -981,12 +982,12 @@ static void bpf_map_show_fdinfo(struct seq_file *m, struct file *filp)
|
||||
struct bpf_map *map = filp->private_data;
|
||||
u32 type = 0, jited = 0;
|
||||
|
||||
if (map_type_contains_progs(map)) {
|
||||
spin_lock(&map->owner.lock);
|
||||
type = map->owner.type;
|
||||
jited = map->owner.jited;
|
||||
spin_unlock(&map->owner.lock);
|
||||
spin_lock(&map->owner_lock);
|
||||
if (map->owner) {
|
||||
type = map->owner->type;
|
||||
jited = map->owner->jited;
|
||||
}
|
||||
spin_unlock(&map->owner_lock);
|
||||
|
||||
seq_printf(m,
|
||||
"map_type:\t%u\n"
|
||||
@@ -1496,7 +1497,7 @@ static int map_create(union bpf_attr *attr, bool kernel)
|
||||
atomic64_set(&map->refcnt, 1);
|
||||
atomic64_set(&map->usercnt, 1);
|
||||
mutex_init(&map->freeze_mutex);
|
||||
spin_lock_init(&map->owner.lock);
|
||||
spin_lock_init(&map->owner_lock);
|
||||
|
||||
if (attr->btf_key_type_id || attr->btf_value_type_id ||
|
||||
/* Even the map's value is a kernel's struct,
|
||||
|
||||
Reference in New Issue
Block a user