bpf: Disable migration when destroying inode storage

When destroying inode storage, it invokes bpf_local_storage_destroy() to
remove all storage elements saved in the inode storage. The destroy
procedure will call bpf_selem_free() to free the element, and
bpf_selem_free() calls bpf_obj_free_fields() to free the special fields
in map value (e.g., kptr). Since kptrs may be allocated from bpf memory
allocator, migrate_{disable|enable} pairs are necessary for the freeing
of these kptrs.

To simplify reasoning about when migrate_disable() is needed for the
freeing of these dynamically-allocated kptrs, let the caller to
guarantee migration is disabled before invoking bpf_obj_free_fields().
Therefore, the patch adds migrate_{disable|enable} pair in
bpf_inode_storage_free(). The migrate_{disable|enable} pairs in the
underlying implementation of bpf_obj_free_fields() will be removed by
the following patch.

Signed-off-by: Hou Tao <houtao1@huawei.com>
Link: https://lore.kernel.org/r/20250108010728.207536-7-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Hou Tao 2025-01-08 09:07:18 +08:00 committed by Alexei Starovoitov
parent 9e6c958b54
commit e319cdc895

View File

@ -62,16 +62,17 @@ void bpf_inode_storage_free(struct inode *inode)
if (!bsb) if (!bsb)
return; return;
migrate_disable();
rcu_read_lock(); rcu_read_lock();
local_storage = rcu_dereference(bsb->storage); local_storage = rcu_dereference(bsb->storage);
if (!local_storage) { if (!local_storage)
rcu_read_unlock(); goto out;
return;
}
bpf_local_storage_destroy(local_storage); bpf_local_storage_destroy(local_storage);
out:
rcu_read_unlock(); rcu_read_unlock();
migrate_enable();
} }
static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key) static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key)