Skip to content

Commit 2bbf47f

Browse files
ljskernelbrauner
authored andcommitted
selftests/pidfd: add tests for PIDFD_SELF_*
Add tests to assert that PIDFD_SELF* correctly refers to the current thread and process. We explicitly test pidfd_send_signal(), however We defer testing of mm-specific functionality which uses pidfd, namely process_madvise() and process_mrelease() to mm testing (though note the latter can not be sensibly tested as it would require the testing process to be dying). We also correct the pidfd_open_test.c fields which refer to .request_mask whereas the UAPI header refers to .mask, which otherwise break the import of the UAPI header. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Link: https://lore.kernel.org/r/7ab0e48b26ba53abf7b703df2dd11a2e99b8efb2.1738268370.git.lorenzo.stoakes@oracle.com Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent e943271 commit 2bbf47f

2 files changed

Lines changed: 67 additions & 15 deletions

File tree

tools/testing/selftests/pidfd/pidfd_open_test.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#define PIDFD_INFO_CGROUPID (1UL << 0)
3232

3333
struct pidfd_info {
34-
__u64 request_mask;
34+
__u64 mask;
3535
__u64 cgroupid;
3636
__u32 pid;
3737
__u32 tgid;
@@ -148,7 +148,7 @@ static pid_t get_pid_from_fdinfo_file(int pidfd, const char *key, size_t keylen)
148148
int main(int argc, char **argv)
149149
{
150150
struct pidfd_info info = {
151-
.request_mask = PIDFD_INFO_CGROUPID,
151+
.mask = PIDFD_INFO_CGROUPID,
152152
};
153153
int pidfd = -1, ret = 1;
154154
pid_t pid;
@@ -227,7 +227,7 @@ int main(int argc, char **argv)
227227
getegid(), info.sgid);
228228
goto on_error;
229229
}
230-
if ((info.request_mask & PIDFD_INFO_CGROUPID) && info.cgroupid == 0) {
230+
if ((info.mask & PIDFD_INFO_CGROUPID) && info.cgroupid == 0) {
231231
ksft_print_msg("cgroupid should not be 0 when PIDFD_INFO_CGROUPID is set\n");
232232
goto on_error;
233233
}

tools/testing/selftests/pidfd/pidfd_test.c

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,41 @@ static pid_t pidfd_clone(int flags, int *pidfd, int (*fn)(void *))
4242
#endif
4343
}
4444

45-
static int signal_received;
45+
static pthread_t signal_received;
4646

4747
static void set_signal_received_on_sigusr1(int sig)
4848
{
4949
if (sig == SIGUSR1)
50-
signal_received = 1;
50+
signal_received = pthread_self();
51+
}
52+
53+
static int send_signal(int pidfd)
54+
{
55+
int ret = 0;
56+
57+
if (sys_pidfd_send_signal(pidfd, SIGUSR1, NULL, 0) < 0) {
58+
ret = -EINVAL;
59+
goto exit;
60+
}
61+
62+
if (signal_received != pthread_self()) {
63+
ret = -EINVAL;
64+
goto exit;
65+
}
66+
67+
exit:
68+
signal_received = 0;
69+
return ret;
70+
}
71+
72+
static void *send_signal_worker(void *arg)
73+
{
74+
int pidfd = (int)(intptr_t)arg;
75+
int ret;
76+
77+
/* We forward any errors for the caller to handle. */
78+
ret = send_signal(pidfd);
79+
return (void *)(intptr_t)ret;
5180
}
5281

5382
/*
@@ -56,8 +85,11 @@ static void set_signal_received_on_sigusr1(int sig)
5685
*/
5786
static int test_pidfd_send_signal_simple_success(void)
5887
{
59-
int pidfd, ret;
88+
int pidfd;
6089
const char *test_name = "pidfd_send_signal send SIGUSR1";
90+
pthread_t thread;
91+
void *thread_res;
92+
int err;
6193

6294
if (!have_pidfd_send_signal) {
6395
ksft_test_result_skip(
@@ -66,25 +98,45 @@ static int test_pidfd_send_signal_simple_success(void)
6698
return 0;
6799
}
68100

101+
signal(SIGUSR1, set_signal_received_on_sigusr1);
102+
103+
/* Try sending a signal to ourselves via /proc/self. */
69104
pidfd = open("/proc/self", O_DIRECTORY | O_CLOEXEC);
70105
if (pidfd < 0)
71106
ksft_exit_fail_msg(
72107
"%s test: Failed to open process file descriptor\n",
73108
test_name);
109+
err = send_signal(pidfd);
110+
if (err)
111+
ksft_exit_fail_msg(
112+
"%s test: Error %d on sending pidfd signal\n",
113+
test_name, err);
114+
close(pidfd);
74115

75-
signal(SIGUSR1, set_signal_received_on_sigusr1);
116+
/* Now try the same thing only using PIDFD_SELF_THREAD_GROUP. */
117+
err = send_signal(PIDFD_SELF_THREAD_GROUP);
118+
if (err)
119+
ksft_exit_fail_msg(
120+
"%s test: Error %d on PIDFD_SELF_THREAD_GROUP signal\n",
121+
test_name, err);
76122

77-
ret = sys_pidfd_send_signal(pidfd, SIGUSR1, NULL, 0);
78-
close(pidfd);
79-
if (ret < 0)
80-
ksft_exit_fail_msg("%s test: Failed to send signal\n",
123+
/*
124+
* Now try the same thing in a thread and assert thread ID is equal to
125+
* worker thread ID.
126+
*/
127+
if (pthread_create(&thread, NULL, send_signal_worker,
128+
(void *)(intptr_t)PIDFD_SELF_THREAD))
129+
ksft_exit_fail_msg("%s test: Failed to create thread\n",
81130
test_name);
82-
83-
if (signal_received != 1)
84-
ksft_exit_fail_msg("%s test: Failed to receive signal\n",
131+
if (pthread_join(thread, &thread_res))
132+
ksft_exit_fail_msg("%s test: Failed to join thread\n",
85133
test_name);
134+
err = (int)(intptr_t)thread_res;
135+
if (err)
136+
ksft_exit_fail_msg(
137+
"%s test: Error %d on PIDFD_SELF_THREAD signal\n",
138+
test_name, err);
86139

87-
signal_received = 0;
88140
ksft_test_result_pass("%s test: Sent signal\n", test_name);
89141
return 0;
90142
}

0 commit comments

Comments
 (0)