Commit 16f7432c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'linux-kselftest-fixes-5.17-rc4' of...

Merge tag 'linux-kselftest-fixes-5.17-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull Kselftest fixes from Shuah Khan:
 "Build and run-time fixes to pidfd, clone3, and ir tests"

* tag 'linux-kselftest-fixes-5.17-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  selftests/ir: fix build with ancient kernel headers
  selftests: fixup build warnings in pidfd / clone3 tests
  pidfd: fix test failure due to stack overflow on some arches
parents ff008548 183f80fd
...@@ -126,8 +126,6 @@ static void test_clone3(uint64_t flags, size_t size, int expected, ...@@ -126,8 +126,6 @@ static void test_clone3(uint64_t flags, size_t size, int expected,
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
pid_t pid;
uid_t uid = getuid(); uid_t uid = getuid();
ksft_print_header(); ksft_print_header();
......
...@@ -29,6 +29,16 @@ ...@@ -29,6 +29,16 @@
#define SYSFS_PATH_MAX 256 #define SYSFS_PATH_MAX 256
#define DNAME_PATH_MAX 256 #define DNAME_PATH_MAX 256
/*
* Support ancient lirc.h which does not have these values. Can be removed
* once RHEL 8 is no longer a relevant testing platform.
*/
#if RC_PROTO_MAX < 26
#define RC_PROTO_RCMM12 24
#define RC_PROTO_RCMM24 25
#define RC_PROTO_RCMM32 26
#endif
static const struct { static const struct {
enum rc_proto proto; enum rc_proto proto;
const char *name; const char *name;
......
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
#define PIDFD_SKIP 3 #define PIDFD_SKIP 3
#define PIDFD_XFAIL 4 #define PIDFD_XFAIL 4
int wait_for_pid(pid_t pid) static inline int wait_for_pid(pid_t pid)
{ {
int status, ret; int status, ret;
...@@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid) ...@@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid)
if (errno == EINTR) if (errno == EINTR)
goto again; goto again;
ksft_print_msg("waitpid returned -1, errno=%d\n", errno);
return -1; return -1;
} }
if (!WIFEXITED(status)) if (!WIFEXITED(status)) {
ksft_print_msg(
"waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n",
WIFSIGNALED(status), WTERMSIG(status));
return -1; return -1;
}
return WEXITSTATUS(status); 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) static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <string.h> #include <string.h>
#include <syscall.h> #include <syscall.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/mman.h>
#include "pidfd.h" #include "pidfd.h"
#include "../kselftest.h" #include "../kselftest.h"
...@@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name) ...@@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name)
return err->code; return err->code;
} }
#define CHILD_STACK_SIZE 8192
struct child { struct child {
char *stack;
pid_t pid; pid_t pid;
int fd; int fd;
}; };
...@@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args, ...@@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args,
struct error *err) struct error *err)
{ {
static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD; static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD;
size_t stack_size = 1024;
char *stack[1024] = { 0 };
struct child ret; struct child ret;
if (!(flags & CLONE_NEWUSER) && geteuid() != 0) if (!(flags & CLONE_NEWUSER) && geteuid() != 0)
flags |= CLONE_NEWUSER; flags |= CLONE_NEWUSER;
ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
if (ret.stack == MAP_FAILED) {
error_set(err, -1, "mmap of stack failed (errno %d)", errno);
return ret;
}
#ifdef __ia64__ #ifdef __ia64__
ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd); ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd);
#else #else
ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd); ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd);
#endif #endif
if (ret.pid < 0) { if (ret.pid < 0) {
...@@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err) ...@@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err)
else if (r > 0) else if (r > 0)
error_set(err, r, "child %d reported: %d", child->pid, r); error_set(err, r, "child %d reported: %d", child->pid, r);
if (munmap(child->stack, CHILD_STACK_SIZE)) {
error_set(err, -1, "munmap of child stack failed (errno %d)", errno);
r = -1;
}
return r; return r;
} }
......
...@@ -441,7 +441,6 @@ static void test_pidfd_poll_exec(int use_waitpid) ...@@ -441,7 +441,6 @@ static void test_pidfd_poll_exec(int use_waitpid)
{ {
int pid, pidfd = 0; int pid, pidfd = 0;
int status, ret; int status, ret;
pthread_t t1;
time_t prog_start = time(NULL); time_t prog_start = time(NULL);
const char *test_name = "pidfd_poll check for premature notification on child thread exec"; const char *test_name = "pidfd_poll check for premature notification on child thread exec";
...@@ -500,13 +499,14 @@ static int child_poll_leader_exit_test(void *args) ...@@ -500,13 +499,14 @@ static int child_poll_leader_exit_test(void *args)
*/ */
*child_exit_secs = time(NULL); *child_exit_secs = time(NULL);
syscall(SYS_exit, 0); syscall(SYS_exit, 0);
/* Never reached, but appeases compiler thinking we should return. */
exit(0);
} }
static void test_pidfd_poll_leader_exit(int use_waitpid) static void test_pidfd_poll_leader_exit(int use_waitpid)
{ {
int pid, pidfd = 0; int pid, pidfd = 0;
int status, ret; int status, ret = 0;
time_t prog_start = time(NULL);
const char *test_name = "pidfd_poll check for premature notification on non-empty" const char *test_name = "pidfd_poll check for premature notification on non-empty"
"group leader exit"; "group leader exit";
......
...@@ -39,7 +39,7 @@ static int sys_waitid(int which, pid_t pid, siginfo_t *info, int options, ...@@ -39,7 +39,7 @@ static int sys_waitid(int which, pid_t pid, siginfo_t *info, int options,
TEST(wait_simple) TEST(wait_simple)
{ {
int pidfd = -1, status = 0; int pidfd = -1;
pid_t parent_tid = -1; pid_t parent_tid = -1;
struct clone_args args = { struct clone_args args = {
.parent_tid = ptr_to_u64(&parent_tid), .parent_tid = ptr_to_u64(&parent_tid),
...@@ -47,7 +47,6 @@ TEST(wait_simple) ...@@ -47,7 +47,6 @@ TEST(wait_simple)
.flags = CLONE_PIDFD | CLONE_PARENT_SETTID, .flags = CLONE_PIDFD | CLONE_PARENT_SETTID,
.exit_signal = SIGCHLD, .exit_signal = SIGCHLD,
}; };
int ret;
pid_t pid; pid_t pid;
siginfo_t info = { siginfo_t info = {
.si_signo = 0, .si_signo = 0,
...@@ -88,7 +87,7 @@ TEST(wait_simple) ...@@ -88,7 +87,7 @@ TEST(wait_simple)
TEST(wait_states) TEST(wait_states)
{ {
int pidfd = -1, status = 0; int pidfd = -1;
pid_t parent_tid = -1; pid_t parent_tid = -1;
struct clone_args args = { struct clone_args args = {
.parent_tid = ptr_to_u64(&parent_tid), .parent_tid = ptr_to_u64(&parent_tid),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment