selftests/bpf: Validate multiple ref release_on_unlock logic
Modify list_push_pop_multiple to alloc and insert nodes 2-at-a-time. Without the previous patch's fix, this block of code: bpf_spin_lock(lock); bpf_list_push_front(head, &f[i]->node); bpf_list_push_front(head, &f[i + 1]->node); bpf_spin_unlock(lock); would fail check_reference_leak check as release_on_unlock logic would miss a ref that should've been released. Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com> cc: Kumar Kartikeya Dwivedi <memxor@gmail.com> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/r/20221201183406.1203621-2-davemarchevsky@fb.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
1f82dffc10
commit
78b037bd40
|
@ -99,13 +99,28 @@ int list_push_pop_multiple(struct bpf_spin_lock *lock, struct bpf_list_head *hea
|
||||||
struct foo *f[8], *pf;
|
struct foo *f[8], *pf;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(f); i++) {
|
/* Loop following this check adds nodes 2-at-a-time in order to
|
||||||
|
* validate multiple release_on_unlock release logic
|
||||||
|
*/
|
||||||
|
if (ARRAY_SIZE(f) % 2)
|
||||||
|
return 10;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(f); i += 2) {
|
||||||
f[i] = bpf_obj_new(typeof(**f));
|
f[i] = bpf_obj_new(typeof(**f));
|
||||||
if (!f[i])
|
if (!f[i])
|
||||||
return 2;
|
return 2;
|
||||||
f[i]->data = i;
|
f[i]->data = i;
|
||||||
|
|
||||||
|
f[i + 1] = bpf_obj_new(typeof(**f));
|
||||||
|
if (!f[i + 1]) {
|
||||||
|
bpf_obj_drop(f[i]);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
f[i + 1]->data = i + 1;
|
||||||
|
|
||||||
bpf_spin_lock(lock);
|
bpf_spin_lock(lock);
|
||||||
bpf_list_push_front(head, &f[i]->node);
|
bpf_list_push_front(head, &f[i]->node);
|
||||||
|
bpf_list_push_front(head, &f[i + 1]->node);
|
||||||
bpf_spin_unlock(lock);
|
bpf_spin_unlock(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue