Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
 1// SPDX-License-Identifier: GPL-2.0
 2/* Copyright (c) 2021 Facebook */
 3
 4#define _GNU_SOURCE         /* See feature_test_macros(7) */
 5#include <unistd.h>
 6#include <sys/syscall.h>   /* For SYS_xxx definitions */
 7#include <sys/types.h>
 8#include <test_progs.h>
 9#include "task_local_storage.skel.h"
10#include "task_local_storage_exit_creds.skel.h"
11#include "task_ls_recursion.skel.h"
12
13static void test_sys_enter_exit(void)
14{
15	struct task_local_storage *skel;
16	int err;
17
18	skel = task_local_storage__open_and_load();
19	if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
20		return;
21
22	skel->bss->target_pid = syscall(SYS_gettid);
23
24	err = task_local_storage__attach(skel);
25	if (!ASSERT_OK(err, "skel_attach"))
26		goto out;
27
28	syscall(SYS_gettid);
29	syscall(SYS_gettid);
30
31	/* 3x syscalls: 1x attach and 2x gettid */
32	ASSERT_EQ(skel->bss->enter_cnt, 3, "enter_cnt");
33	ASSERT_EQ(skel->bss->exit_cnt, 3, "exit_cnt");
34	ASSERT_EQ(skel->bss->mismatch_cnt, 0, "mismatch_cnt");
35out:
36	task_local_storage__destroy(skel);
37}
38
39static void test_exit_creds(void)
40{
41	struct task_local_storage_exit_creds *skel;
42	int err;
43
44	skel = task_local_storage_exit_creds__open_and_load();
45	if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
46		return;
47
48	err = task_local_storage_exit_creds__attach(skel);
49	if (!ASSERT_OK(err, "skel_attach"))
50		goto out;
51
52	/* trigger at least one exit_creds() */
53	if (CHECK_FAIL(system("ls > /dev/null")))
54		goto out;
55
56	/* sync rcu to make sure exit_creds() is called for "ls" */
57	kern_sync_rcu();
58	ASSERT_EQ(skel->bss->valid_ptr_count, 0, "valid_ptr_count");
59	ASSERT_NEQ(skel->bss->null_ptr_count, 0, "null_ptr_count");
60out:
61	task_local_storage_exit_creds__destroy(skel);
62}
63
64static void test_recursion(void)
65{
66	struct task_ls_recursion *skel;
67	int err;
68
69	skel = task_ls_recursion__open_and_load();
70	if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
71		return;
72
73	err = task_ls_recursion__attach(skel);
74	if (!ASSERT_OK(err, "skel_attach"))
75		goto out;
76
77	/* trigger sys_enter, make sure it does not cause deadlock */
78	syscall(SYS_gettid);
79
80out:
81	task_ls_recursion__destroy(skel);
82}
83
84void test_task_local_storage(void)
85{
86	if (test__start_subtest("sys_enter_exit"))
87		test_sys_enter_exit();
88	if (test__start_subtest("exit_creds"))
89		test_exit_creds();
90	if (test__start_subtest("recursion"))
91		test_recursion();
92}