linux-kselftest-fixes-5.17-rc4
This Kselftest fixes updated for Linux 5.17-rc4 consists of build and run-time fixes to pidfd, clone3, and ir tests. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAmIFciQACgkQCwJExA0N QxzuAQ/+O0vNPey8c4RjZEiDHakDD2tBRr7Oy64xQtrvdhPO6+lmVr5nnvpqcq3t hD8zyBgyBvQM0sa5h7Yqmy2ohfYNWNW8L2ELTNxgCnQ5fqWDlIvxCIfwpBfzdrS8 5Dn9BpT0N0a7uX3n3TfmBHNF5CNDFuqG+wC+wibgGoC0xTsM9S2Tn+zA+oQ2ERvz Pq/GBIkWItoQwSMjrHEfZJPH3tE9h1s/vFWMkDFN83l8pDli48OaZqXYSkj9qotA l9OhoyZz6FNZc8DxIVH5e8u090cXa0FvHmgL4X4SxgG0NdFlhZ1uQXLGYSASk/F7 5/rMW5Hqa/gjDIjP4jdIAG6I7lsbaUXmGtpGLCaOqhFCnFif0J68UsPqlzgHVvtq 2VSm4OHn+6aVzl26U+RujTcjZbuKUc6ZzXzmblQGfQlCizGmTuPwwaVlhSlsABPc cYXEw//7eXqXp1phnH2qMDHSEwlK7VWpAvErw1MmMyho73R3wxG/OdLupUT413ty a8xgD48IcbiBtJlZlO3CwPPd7I4I2dLeI0r+Quh1Zc8BYF04m7OEYePUt2btX4j4 Mlb3mhrcUZppwruWNHYZkGmdZYM7/JhHpetI/GCNtfeXxXGWwLu9Py2QrQORcXkK tQnqVSvhTleY7HzqjGPVSNvsYUqbBaS+j36Rh2j/8itzLv5DD7I= =UT3I -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
16f7432c88
@ -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 @@
|
|||||||
#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 @@
|
|||||||
#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 @@ again:
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
*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,
|
|||||||
|
|
||||||
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)
|
|||||||
.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)
|
|||||||
|
|
||||||
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),
|
||||||
|
Loading…
Reference in New Issue
Block a user