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