Skip to content

Commit

Permalink
Merge branch 'two-tiny-fixes-for-btf-record'
Browse files Browse the repository at this point in the history
Hou Tao says:

====================
The tiny patch set aims to fix two problems found during the development
of supporting dynptr key in hash table. Patch #1 fixes the missed
btf_record_free() when map creation fails and patch #2 fixes the missed
kfree() when there is no special field in the passed btf.
====================

Link: https://lore.kernel.org/r/20240912012845.3458483-1-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
  • Loading branch information
Alexei Starovoitov committed Sep 13, 2024
2 parents 211bf9c + 986deb2 commit ca7a5ba
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
4 changes: 3 additions & 1 deletion kernel/bpf/btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -5572,8 +5572,10 @@ btf_parse_struct_metas(struct bpf_verifier_log *log, struct btf *btf)
aof->ids[aof->cnt++] = i;
}

if (!aof->cnt)
if (!aof->cnt) {
kfree(aof);
return NULL;
}
sort(&aof->ids, aof->cnt, sizeof(aof->ids[0]), btf_id_cmp_func, NULL);

for (i = 1; i < n; i++) {
Expand Down
19 changes: 12 additions & 7 deletions kernel/bpf/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -735,15 +735,11 @@ void bpf_obj_free_fields(const struct btf_record *rec, void *obj)
}
}

/* called from workqueue */
static void bpf_map_free_deferred(struct work_struct *work)
static void bpf_map_free(struct bpf_map *map)
{
struct bpf_map *map = container_of(work, struct bpf_map, work);
struct btf_record *rec = map->record;
struct btf *btf = map->btf;

security_bpf_map_free(map);
bpf_map_release_memcg(map);
/* implementation dependent freeing */
map->ops->map_free(map);
/* Delay freeing of btf_record for maps, as map_free
Expand All @@ -762,6 +758,16 @@ static void bpf_map_free_deferred(struct work_struct *work)
btf_put(btf);
}

/* called from workqueue */
static void bpf_map_free_deferred(struct work_struct *work)
{
struct bpf_map *map = container_of(work, struct bpf_map, work);

security_bpf_map_free(map);
bpf_map_release_memcg(map);
bpf_map_free(map);
}

static void bpf_map_put_uref(struct bpf_map *map)
{
if (atomic64_dec_and_test(&map->usercnt)) {
Expand Down Expand Up @@ -1413,8 +1419,7 @@ static int map_create(union bpf_attr *attr)
free_map_sec:
security_bpf_map_free(map);
free_map:
btf_put(map->btf);
map->ops->map_free(map);
bpf_map_free(map);
put_token:
bpf_token_put(token);
return err;
Expand Down

0 comments on commit ca7a5ba

Please sign in to comment.