xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/pidfd/pidfd.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */
2*053f45beSAndroid Build Coastguard Worker 
3*053f45beSAndroid Build Coastguard Worker #ifndef __PIDFD_H
4*053f45beSAndroid Build Coastguard Worker #define __PIDFD_H
5*053f45beSAndroid Build Coastguard Worker 
6*053f45beSAndroid Build Coastguard Worker #define _GNU_SOURCE
7*053f45beSAndroid Build Coastguard Worker #include <errno.h>
8*053f45beSAndroid Build Coastguard Worker #include <fcntl.h>
9*053f45beSAndroid Build Coastguard Worker #include <sched.h>
10*053f45beSAndroid Build Coastguard Worker #include <signal.h>
11*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
12*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
13*053f45beSAndroid Build Coastguard Worker #include <string.h>
14*053f45beSAndroid Build Coastguard Worker #include <syscall.h>
15*053f45beSAndroid Build Coastguard Worker #include <sys/mount.h>
16*053f45beSAndroid Build Coastguard Worker #include <sys/types.h>
17*053f45beSAndroid Build Coastguard Worker #include <sys/wait.h>
18*053f45beSAndroid Build Coastguard Worker 
19*053f45beSAndroid Build Coastguard Worker #include "../kselftest.h"
20*053f45beSAndroid Build Coastguard Worker 
21*053f45beSAndroid Build Coastguard Worker #ifndef P_PIDFD
22*053f45beSAndroid Build Coastguard Worker #define P_PIDFD 3
23*053f45beSAndroid Build Coastguard Worker #endif
24*053f45beSAndroid Build Coastguard Worker 
25*053f45beSAndroid Build Coastguard Worker #ifndef CLONE_NEWTIME
26*053f45beSAndroid Build Coastguard Worker #define CLONE_NEWTIME 0x00000080
27*053f45beSAndroid Build Coastguard Worker #endif
28*053f45beSAndroid Build Coastguard Worker 
29*053f45beSAndroid Build Coastguard Worker #ifndef CLONE_PIDFD
30*053f45beSAndroid Build Coastguard Worker #define CLONE_PIDFD 0x00001000
31*053f45beSAndroid Build Coastguard Worker #endif
32*053f45beSAndroid Build Coastguard Worker 
33*053f45beSAndroid Build Coastguard Worker #ifndef __NR_pidfd_open
34*053f45beSAndroid Build Coastguard Worker #define __NR_pidfd_open -1
35*053f45beSAndroid Build Coastguard Worker #endif
36*053f45beSAndroid Build Coastguard Worker 
37*053f45beSAndroid Build Coastguard Worker #ifndef __NR_pidfd_send_signal
38*053f45beSAndroid Build Coastguard Worker #define __NR_pidfd_send_signal -1
39*053f45beSAndroid Build Coastguard Worker #endif
40*053f45beSAndroid Build Coastguard Worker 
41*053f45beSAndroid Build Coastguard Worker #ifndef __NR_clone3
42*053f45beSAndroid Build Coastguard Worker #define __NR_clone3 -1
43*053f45beSAndroid Build Coastguard Worker #endif
44*053f45beSAndroid Build Coastguard Worker 
45*053f45beSAndroid Build Coastguard Worker #ifndef __NR_pidfd_getfd
46*053f45beSAndroid Build Coastguard Worker #define __NR_pidfd_getfd -1
47*053f45beSAndroid Build Coastguard Worker #endif
48*053f45beSAndroid Build Coastguard Worker 
49*053f45beSAndroid Build Coastguard Worker #ifndef PIDFD_NONBLOCK
50*053f45beSAndroid Build Coastguard Worker #define PIDFD_NONBLOCK O_NONBLOCK
51*053f45beSAndroid Build Coastguard Worker #endif
52*053f45beSAndroid Build Coastguard Worker 
53*053f45beSAndroid Build Coastguard Worker /*
54*053f45beSAndroid Build Coastguard Worker  * The kernel reserves 300 pids via RESERVED_PIDS in kernel/pid.c
55*053f45beSAndroid Build Coastguard Worker  * That means, when it wraps around any pid < 300 will be skipped.
56*053f45beSAndroid Build Coastguard Worker  * So we need to use a pid > 300 in order to test recycling.
57*053f45beSAndroid Build Coastguard Worker  */
58*053f45beSAndroid Build Coastguard Worker #define PID_RECYCLE 1000
59*053f45beSAndroid Build Coastguard Worker 
60*053f45beSAndroid Build Coastguard Worker /*
61*053f45beSAndroid Build Coastguard Worker  * Define a few custom error codes for the child process to clearly indicate
62*053f45beSAndroid Build Coastguard Worker  * what is happening. This way we can tell the difference between a system
63*053f45beSAndroid Build Coastguard Worker  * error, a test error, etc.
64*053f45beSAndroid Build Coastguard Worker  */
65*053f45beSAndroid Build Coastguard Worker #define PIDFD_PASS 0
66*053f45beSAndroid Build Coastguard Worker #define PIDFD_FAIL 1
67*053f45beSAndroid Build Coastguard Worker #define PIDFD_ERROR 2
68*053f45beSAndroid Build Coastguard Worker #define PIDFD_SKIP 3
69*053f45beSAndroid Build Coastguard Worker #define PIDFD_XFAIL 4
70*053f45beSAndroid Build Coastguard Worker 
wait_for_pid(pid_t pid)71*053f45beSAndroid Build Coastguard Worker static inline int wait_for_pid(pid_t pid)
72*053f45beSAndroid Build Coastguard Worker {
73*053f45beSAndroid Build Coastguard Worker 	int status, ret;
74*053f45beSAndroid Build Coastguard Worker 
75*053f45beSAndroid Build Coastguard Worker again:
76*053f45beSAndroid Build Coastguard Worker 	ret = waitpid(pid, &status, 0);
77*053f45beSAndroid Build Coastguard Worker 	if (ret == -1) {
78*053f45beSAndroid Build Coastguard Worker 		if (errno == EINTR)
79*053f45beSAndroid Build Coastguard Worker 			goto again;
80*053f45beSAndroid Build Coastguard Worker 
81*053f45beSAndroid Build Coastguard Worker 		ksft_print_msg("waitpid returned -1, errno=%d\n", errno);
82*053f45beSAndroid Build Coastguard Worker 		return -1;
83*053f45beSAndroid Build Coastguard Worker 	}
84*053f45beSAndroid Build Coastguard Worker 
85*053f45beSAndroid Build Coastguard Worker 	if (!WIFEXITED(status)) {
86*053f45beSAndroid Build Coastguard Worker 		ksft_print_msg(
87*053f45beSAndroid Build Coastguard Worker 		       "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n",
88*053f45beSAndroid Build Coastguard Worker 		       WIFSIGNALED(status), WTERMSIG(status));
89*053f45beSAndroid Build Coastguard Worker 		return -1;
90*053f45beSAndroid Build Coastguard Worker 	}
91*053f45beSAndroid Build Coastguard Worker 
92*053f45beSAndroid Build Coastguard Worker 	ret = WEXITSTATUS(status);
93*053f45beSAndroid Build Coastguard Worker 	ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret);
94*053f45beSAndroid Build Coastguard Worker 	return ret;
95*053f45beSAndroid Build Coastguard Worker }
96*053f45beSAndroid Build Coastguard Worker 
sys_pidfd_open(pid_t pid,unsigned int flags)97*053f45beSAndroid Build Coastguard Worker static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
98*053f45beSAndroid Build Coastguard Worker {
99*053f45beSAndroid Build Coastguard Worker 	return syscall(__NR_pidfd_open, pid, flags);
100*053f45beSAndroid Build Coastguard Worker }
101*053f45beSAndroid Build Coastguard Worker 
sys_pidfd_send_signal(int pidfd,int sig,siginfo_t * info,unsigned int flags)102*053f45beSAndroid Build Coastguard Worker static inline int sys_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
103*053f45beSAndroid Build Coastguard Worker 					unsigned int flags)
104*053f45beSAndroid Build Coastguard Worker {
105*053f45beSAndroid Build Coastguard Worker 	return syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags);
106*053f45beSAndroid Build Coastguard Worker }
107*053f45beSAndroid Build Coastguard Worker 
sys_pidfd_getfd(int pidfd,int fd,int flags)108*053f45beSAndroid Build Coastguard Worker static inline int sys_pidfd_getfd(int pidfd, int fd, int flags)
109*053f45beSAndroid Build Coastguard Worker {
110*053f45beSAndroid Build Coastguard Worker 	return syscall(__NR_pidfd_getfd, pidfd, fd, flags);
111*053f45beSAndroid Build Coastguard Worker }
112*053f45beSAndroid Build Coastguard Worker 
sys_memfd_create(const char * name,unsigned int flags)113*053f45beSAndroid Build Coastguard Worker static inline int sys_memfd_create(const char *name, unsigned int flags)
114*053f45beSAndroid Build Coastguard Worker {
115*053f45beSAndroid Build Coastguard Worker 	return syscall(__NR_memfd_create, name, flags);
116*053f45beSAndroid Build Coastguard Worker }
117*053f45beSAndroid Build Coastguard Worker 
118*053f45beSAndroid Build Coastguard Worker #endif /* __PIDFD_H */
119