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