Skip to content

Commit c838fe1

Browse files
author
Alexei Starovoitov
committed
Merge branch 'bpf-use-gfp_kernel-in-bpf_event_entry_gen'
Hou Tao says: ==================== The simple patch set aims to replace GFP_ATOMIC by GFP_KERNEL in bpf_event_entry_gen(). These two patches in the patch set were preparatory patches in "Fix the release of inner map" patchset [1] and are not needed for v2, so re-post it to bpf-next tree. Patch #1 reduces the scope of rcu_read_lock when updating fd map and patch #2 replaces GFP_ATOMIC by GFP_KERNEL. Please see individual patches for more details. Change Log: v3: * patch #1: fallback to patch #1 in v1. Update comments in bpf_fd_htab_map_update_elem() to explain the reason for rcu_read_lock() (Alexei) v2: https://lore.kernel.org/bpf/[email protected]/ * patch #1: add rcu_read_lock/unlock() for bpf_fd_array_map_update_elem as well to make it consistent with bpf_fd_htab_map_update_elem and update commit message accordingly (Alexei) * patch #1/#2: collects ack tags from Yonghong v1: https://lore.kernel.org/bpf/[email protected]/ [1]: https://lore.kernel.org/bpf/[email protected]/ ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
2 parents 2a0c6b4 + dc68540 commit c838fe1

File tree

3 files changed

+7
-5
lines changed

3 files changed

+7
-5
lines changed

kernel/bpf/arraymap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,7 @@ static struct bpf_event_entry *bpf_event_entry_gen(struct file *perf_file,
11951195
{
11961196
struct bpf_event_entry *ee;
11971197

1198-
ee = kzalloc(sizeof(*ee), GFP_ATOMIC);
1198+
ee = kzalloc(sizeof(*ee), GFP_KERNEL);
11991199
if (ee) {
12001200
ee->event = perf_file->private_data;
12011201
ee->perf_file = perf_file;

kernel/bpf/hashtab.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2523,7 +2523,13 @@ int bpf_fd_htab_map_update_elem(struct bpf_map *map, struct file *map_file,
25232523
if (IS_ERR(ptr))
25242524
return PTR_ERR(ptr);
25252525

2526+
/* The htab bucket lock is always held during update operations in fd
2527+
* htab map, and the following rcu_read_lock() is only used to avoid
2528+
* the WARN_ON_ONCE in htab_map_update_elem().
2529+
*/
2530+
rcu_read_lock();
25262531
ret = htab_map_update_elem(map, key, &ptr, map_flags);
2532+
rcu_read_unlock();
25272533
if (ret)
25282534
map->ops->map_fd_put_ptr(map, ptr, false);
25292535

kernel/bpf/syscall.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,11 @@ static int bpf_map_update_value(struct bpf_map *map, struct file *map_file,
184184
err = bpf_percpu_cgroup_storage_update(map, key, value,
185185
flags);
186186
} else if (IS_FD_ARRAY(map)) {
187-
rcu_read_lock();
188187
err = bpf_fd_array_map_update_elem(map, map_file, key, value,
189188
flags);
190-
rcu_read_unlock();
191189
} else if (map->map_type == BPF_MAP_TYPE_HASH_OF_MAPS) {
192-
rcu_read_lock();
193190
err = bpf_fd_htab_map_update_elem(map, map_file, key, value,
194191
flags);
195-
rcu_read_unlock();
196192
} else if (map->map_type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY) {
197193
/* rcu_read_lock() is not needed */
198194
err = bpf_fd_reuseport_array_update_elem(map, key, value,

0 commit comments

Comments
 (0)