Modified existing bpf_iter_test_file.c program to check whether
all accessed files from the main thread or not.

Modified existing bpf_iter_test_file program to check
whether all accessed files from the main thread or not.
  $ ./test_progs -n 4
  ...
  #4/7 task_file:OK
  ...
  #4 bpf_iter:OK
  Summary: 1/24 PASSED, 0 SKIPPED, 0 FAILED

Signed-off-by: Yonghong Song <y...@fb.com>
---
 .../selftests/bpf/prog_tests/bpf_iter.c       | 21 +++++++++++++++++++
 .../selftests/bpf/progs/bpf_iter_task_file.c  | 10 ++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c 
b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
index 7375d9a6d242..375ffaf85d78 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
@@ -132,17 +132,38 @@ static void test_task_stack(void)
        bpf_iter_task_stack__destroy(skel);
 }
 
+static void *do_nothing(void *arg)
+{
+       pthread_exit(arg);
+}
+
 static void test_task_file(void)
 {
        struct bpf_iter_task_file *skel;
+       pthread_t thread_id;
+       void *ret;
 
        skel = bpf_iter_task_file__open_and_load();
        if (CHECK(!skel, "bpf_iter_task_file__open_and_load",
                  "skeleton open_and_load failed\n"))
                return;
 
+       skel->bss->tgid = getpid();
+
+       if (CHECK(pthread_create(&thread_id, NULL, &do_nothing, NULL),
+                 "pthread_create", "pthread_create failed\n"))
+               goto done;
+
        do_dummy_read(skel->progs.dump_task_file);
 
+       if (CHECK(pthread_join(thread_id, &ret) || ret != NULL,
+                 "pthread_join", "pthread_join failed\n"))
+               goto done;
+
+       CHECK(skel->bss->count != 0, "",
+             "invalid non pthread file visit %d\n", skel->bss->count);
+
+done:
        bpf_iter_task_file__destroy(skel);
 }
 
diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_task_file.c 
b/tools/testing/selftests/bpf/progs/bpf_iter_task_file.c
index 8b787baa2654..b2f7c7c5f952 100644
--- a/tools/testing/selftests/bpf/progs/bpf_iter_task_file.c
+++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_file.c
@@ -6,6 +6,9 @@
 
 char _license[] SEC("license") = "GPL";
 
+int count = 0;
+int tgid = 0;
+
 SEC("iter/task_file")
 int dump_task_file(struct bpf_iter__task_file *ctx)
 {
@@ -17,8 +20,13 @@ int dump_task_file(struct bpf_iter__task_file *ctx)
        if (task == (void *)0 || file == (void *)0)
                return 0;
 
-       if (ctx->meta->seq_num == 0)
+       if (ctx->meta->seq_num == 0) {
+               count = 0;
                BPF_SEQ_PRINTF(seq, "    tgid      gid       fd      file\n");
+       }
+
+       if (tgid == task->tgid && task->tgid != task->pid)
+               count++;
 
        BPF_SEQ_PRINTF(seq, "%8d %8d %8d %lx\n", task->tgid, task->pid, fd,
                       (long)file->f_op);
-- 
2.24.1

Reply via email to