selftests/bpf: Validate multiple ref release_on_unlock logic
authorDave Marchevsky <davemarchevsky@fb.com>
Thu, 1 Dec 2022 18:34:06 +0000 (10:34 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 2 Dec 2022 03:38:17 +0000 (19:38 -0800)
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>
tools/testing/selftests/bpf/progs/linked_list.c

index 2c7b615c6d41dcf107e6172380fce3e6b50affba..4ad88da5cda2d199aafc4a1649f6736e1e880efb 100644 (file)
@@ -99,13 +99,28 @@ int list_push_pop_multiple(struct bpf_spin_lock *lock, struct bpf_list_head *hea
        struct foo *f[8], *pf;
        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));
                if (!f[i])
                        return 2;
                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_list_push_front(head, &f[i]->node);
+               bpf_list_push_front(head, &f[i + 1]->node);
                bpf_spin_unlock(lock);
        }