123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #ifndef __PIDFD_H
- #define __PIDFD_H
- #define _GNU_SOURCE
- #include <errno.h>
- #include <fcntl.h>
- #include <sched.h>
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <syscall.h>
- #include <sys/mount.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include "../kselftest.h"
- #ifndef P_PIDFD
- #define P_PIDFD 3
- #endif
- #ifndef CLONE_NEWTIME
- #define CLONE_NEWTIME 0x00000080
- #endif
- #ifndef CLONE_PIDFD
- #define CLONE_PIDFD 0x00001000
- #endif
- #ifndef __NR_pidfd_open
- #define __NR_pidfd_open -1
- #endif
- #ifndef __NR_pidfd_send_signal
- #define __NR_pidfd_send_signal -1
- #endif
- #ifndef __NR_clone3
- #define __NR_clone3 -1
- #endif
- #ifndef __NR_pidfd_getfd
- #define __NR_pidfd_getfd -1
- #endif
- #ifndef PIDFD_NONBLOCK
- #define PIDFD_NONBLOCK O_NONBLOCK
- #endif
- /*
- * The kernel reserves 300 pids via RESERVED_PIDS in kernel/pid.c
- * That means, when it wraps around any pid < 300 will be skipped.
- * So we need to use a pid > 300 in order to test recycling.
- */
- #define PID_RECYCLE 1000
- /*
- * Define a few custom error codes for the child process to clearly indicate
- * what is happening. This way we can tell the difference between a system
- * error, a test error, etc.
- */
- #define PIDFD_PASS 0
- #define PIDFD_FAIL 1
- #define PIDFD_ERROR 2
- #define PIDFD_SKIP 3
- #define PIDFD_XFAIL 4
- static inline int wait_for_pid(pid_t pid)
- {
- int status, ret;
- again:
- ret = waitpid(pid, &status, 0);
- if (ret == -1) {
- if (errno == EINTR)
- goto again;
- ksft_print_msg("waitpid returned -1, errno=%d\n", errno);
- return -1;
- }
- if (!WIFEXITED(status)) {
- ksft_print_msg(
- "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n",
- WIFSIGNALED(status), WTERMSIG(status));
- return -1;
- }
- ret = WEXITSTATUS(status);
- ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret);
- return ret;
- }
- static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
- {
- return syscall(__NR_pidfd_open, pid, flags);
- }
- static inline int sys_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
- unsigned int flags)
- {
- return syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags);
- }
- static inline int sys_pidfd_getfd(int pidfd, int fd, int flags)
- {
- return syscall(__NR_pidfd_getfd, pidfd, fd, flags);
- }
- static inline int sys_memfd_create(const char *name, unsigned int flags)
- {
- return syscall(__NR_memfd_create, name, flags);
- }
- #endif /* __PIDFD_H */
|