Skip to content

Commit 4ff04ab

Browse files
Yonghong SongAlexei Starovoitov
authored andcommitted
bpf: Add necessary migrate_disable to range_tree.
When running bpf selftest (./test_progs -j), the following warnings showed up: $ ./test_progs -t arena_atomics ... BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u19:0/12501 caller is bpf_mem_free+0x128/0x330 ... Call Trace: <TASK> dump_stack_lvl check_preemption_disabled bpf_mem_free range_tree_destroy arena_map_free bpf_map_free_deferred process_scheduled_works ... For selftests arena_htab and arena_list, similar smp_process_id() BUGs are dumped, and the following are two stack trace: <TASK> dump_stack_lvl check_preemption_disabled bpf_mem_alloc range_tree_set arena_map_alloc map_create ... <TASK> dump_stack_lvl check_preemption_disabled bpf_mem_alloc range_tree_clear arena_vm_fault do_pte_missing handle_mm_fault do_user_addr_fault ... Add migrate_{disable,enable}() around related bpf_mem_{alloc,free}() calls to fix the issue. Fixes: b795379 ("bpf: Introduce range_tree data structure and use it in bpf arena") Signed-off-by: Yonghong Song <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent ab4dc30 commit 4ff04ab

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

kernel/bpf/range_tree.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ int range_tree_clear(struct range_tree *rt, u32 start, u32 len)
150150
range_it_insert(rn, rt);
151151

152152
/* Add a range */
153+
migrate_disable();
153154
new_rn = bpf_mem_alloc(&bpf_global_ma, sizeof(struct range_node));
155+
migrate_enable();
154156
if (!new_rn)
155157
return -ENOMEM;
156158
new_rn->rn_start = last + 1;
@@ -170,7 +172,9 @@ int range_tree_clear(struct range_tree *rt, u32 start, u32 len)
170172
} else {
171173
/* in the middle of the clearing range */
172174
range_it_remove(rn, rt);
175+
migrate_disable();
173176
bpf_mem_free(&bpf_global_ma, rn);
177+
migrate_enable();
174178
}
175179
}
176180
return 0;
@@ -223,7 +227,9 @@ int range_tree_set(struct range_tree *rt, u32 start, u32 len)
223227
range_it_remove(right, rt);
224228
left->rn_last = right->rn_last;
225229
range_it_insert(left, rt);
230+
migrate_disable();
226231
bpf_mem_free(&bpf_global_ma, right);
232+
migrate_enable();
227233
} else if (left) {
228234
/* Combine with the left range */
229235
range_it_remove(left, rt);
@@ -235,7 +241,9 @@ int range_tree_set(struct range_tree *rt, u32 start, u32 len)
235241
right->rn_start = start;
236242
range_it_insert(right, rt);
237243
} else {
244+
migrate_disable();
238245
left = bpf_mem_alloc(&bpf_global_ma, sizeof(struct range_node));
246+
migrate_enable();
239247
if (!left)
240248
return -ENOMEM;
241249
left->rn_start = start;
@@ -251,7 +259,9 @@ void range_tree_destroy(struct range_tree *rt)
251259

252260
while ((rn = range_it_iter_first(rt, 0, -1U))) {
253261
range_it_remove(rn, rt);
262+
migrate_disable();
254263
bpf_mem_free(&bpf_global_ma, rn);
264+
migrate_enable();
255265
}
256266
}
257267

0 commit comments

Comments
 (0)