syscalls/pidfd_send_signal01
PATCH v2 2/4 syscalls/pidfd_send_signal01
Add testcase to check if pidfd_send_signal() can provide the same functionality as rt_sigqueueinfo().
--- configure.ac | 2 + runtest/syscalls | 2 + .../kernel/syscalls/pidfd_send_signal/.gitignore | 1 + .../kernel/syscalls/pidfd_send_signal/Makefile | 14 +++ .../syscalls/pidfd_send_signal/pidfd_send_signal.h | 27 ++++++ .../pidfd_send_signal/pidfd_send_signal01.c | 108 +++++++++++++++++++++ 6 files changed, 154 insertions(+) create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/.gitignore create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/Makefile create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal.h create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c
configure.ac +2 -0
@@ -71,6 +71,7 @@ AC_CHECK_FUNCS([ \ mkdirat \ mknodat \ openat \ + pidfd_send_signal \ preadv \ preadv2 \ profil \
@@ -237,6 +238,7 @@ else fi AC_DEFINE_UNQUOTED(NUMA_ERROR_MSG, ["$numa_error_msg"], [Error message when no NUMA support]) + LTP_CHECK_SYSCALL_PERF_EVENT_OPEN LTP_CHECK_SYSCALL_QUOTACTL LTP_CHECK_SYSCALL_SIGNALFD
runtest/syscalls +2 -0
@@ -836,6 +836,8 @@ pause03 pause03 personality01 personality01 personality02 personality02 +pidfd_send_signal01 pidfd_send_signal01 + pipe01 pipe01 pipe02 pipe02 pipe03 pipe03
testcases/kernel/syscalls/pidfd_send_signal/.gitignore new file +1 -0
@@ -0,0 +1 @@ +/pidfd_send_signal01
testcases/kernel/syscalls/pidfd_send_signal/Makefile new file +14 -0
@@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (c) 2019 SUSE LLC +# +# Author: Christian Amann <[email protected]> +# + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk + +pidfd_send_signal01: CFLAGS += -pthread
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal.h new file +27 -0
@@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 SUSE LLC +* Author: Christian Amann <[email protected]> +*/ + +#ifndef PIDFD_SEND_SIGNAL_H +#define PIDFD_SEND_SIGNAL_H + +#include "tst_test.h" +#include "lapi/syscalls.h" + +static void check_syscall_support (void ) +{ +/* allow the tests to fail early */ +tst_syscall (__NR_pidfd_send_signal); +} + +#ifndef HAVE_PIDFD_SEND_SIGNAL +static int pidfd_send_signal (int pidfd,int sig,siginfo_t *info, +unsigned int flags) +{ +return tst_syscall (__NR_pidfd_send_signal, pidfd, sig, info, flags); +} +#endif /* HAVE_PIDFD_SEND_SIGNAL */ + +#endif /* PIDFD_SEND_SIGNAL_H */
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +108 -0
108 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH v2 3/4 syscalls/pidfd_send_signal02
Add test to check basic error handling of the syscall.
--- runtest/syscalls | 1 + .../kernel/syscalls/pidfd_send_signal/.gitignore | 1 + .../pidfd_send_signal/pidfd_send_signal02.c | 106 +++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal02.c
runtest/syscalls +1 -0
@@ -837,6 +837,7 @@ personality01 personality01 personality02 personality02 pidfd_send_signal01 pidfd_send_signal01 +pidfd_send_signal02 pidfd_send_signal02 pipe01 pipe01 pipe02 pipe02
testcases/kernel/syscalls/pidfd_send_signal/.gitignore +1 -0
@@ -1 +1,2 @@ /pidfd_send_signal01 +/pidfd_send_signal02
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal02.c new file +106 -0
106 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH v2 3/4 syscalls/pidfd_send_signal02
Hi Christian,
Quoted 3 lines
Add test to check basic error handling of the syscall.
Signed-off-by Christian Amann <[email protected]>
...
Quoted 1 line
+#define
_GNU_SOURCE
Again, if not needed, remove it.
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal02.c line 27
Quoted 3 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal02.c new file +3
-0+ +#include <signal.h> +#include "pwd.h"
#include <pwd.h">
The rest LGTM.
Kind regards,
Petr
PATCH v2 4/4 syscalls/pidfd_send_signal03
In reply to Christian AmannAdd testcase to check if the syscall will send a signal to a process with the same PID as the targeted process.
--- runtest/syscalls | 1 + .../kernel/syscalls/pidfd_send_signal/.gitignore | 1 + .../pidfd_send_signal/pidfd_send_signal03.c | 142 +++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c
runtest/syscalls +1 -0
@@ -838,6 +838,7 @@ personality02 personality02 pidfd_send_signal01 pidfd_send_signal01 pidfd_send_signal02 pidfd_send_signal02 +pidfd_send_signal03 pidfd_send_signal03 pipe01 pipe01 pipe02 pipe02
testcases/kernel/syscalls/pidfd_send_signal/.gitignore +1 -0
@@ -1,2 +1,3 @@ /pidfd_send_signal01 /pidfd_send_signal02 +/pidfd_send_signal03
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +142 -0
142 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH v2 4/4 syscalls/pidfd_send_signal03
Quoted 2 lines
Add testcase to check if the syscall will send a signal to a process with the same PID as the targeted process.
LGTM, thanks for your patch!
Quoted 1 line
+++
b/testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c
...
Quoted 1 line
+#define
_GNU_SOURCE
I guess this is not needed.
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c line 25
Quoted 7 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +7
-0+ +#include <signal.h> +#include <stdio.h> +#include <unistd.h> +#include "pidfd_send_signal.h" +#include "tst_safe_pthread.h" +//#include "tst_safe_file_ops.h"
Reviewer should remove this comment.
Quoted 62 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +62
-0+ +#define PIDTRIES 3 + +static char *last_pid_file; +static int pidfd, new_pidfd; +static int old_inode, new_inode; + +static int get_inode_number (int fd) +{ +struct stat file_stat; + +SAFE_FSTAT (fd, &file_stat); +return file_stat.st_ino; +} + +static void verify_pidfd_send_signal (void ) +{ +pid_t pid, new_pid; +char pid_filename[32 ]; +char pid_str[16 ]; +int i, fail; + + fail =1 ; +for (i =0 ; i <PIDTRIES ; i++) { + pid =SAFE_FORK (); +if (pid ==0 ) { +TST_CHECKPOINT_WAIT (0 ); +return ; + } + +sprintf (pid_filename,"/proc/%d" , pid); + pidfd =SAFE_OPEN (pid_filename,O_DIRECTORY |O_CLOEXEC ); + old_inode =get_inode_number (pidfd); + +TST_CHECKPOINT_WAKE (0 ); +tst_reap_children (); + +/* Manipulate PID for next process */ +sprintf (pid_str,"%d" , pid -1 ); +SAFE_FILE_PRINTF (last_pid_file, pid_str); + + new_pid =SAFE_FORK (); +if (new_pid ==0 ) { +TST_CHECKPOINT_WAIT (0 ); +return ; + } + +if (new_pid == pid) { + new_pidfd =SAFE_OPEN (pid_filename, +O_DIRECTORY |O_CLOEXEC ); + new_inode =get_inode_number (new_pidfd); +SAFE_CLOSE (new_pidfd); + fail =0 ; +break ; + } + +if (i <PIDTRIES ) { +tst_res (TINFO , +"Failed to set correct PID, trying again..." ); + } +SAFE_CLOSE (pidfd); +TST_CHECKPOINT_WAKE (0 );
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c line 97
Quoted 10 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +10
-0+tst_reap_children (); + } +if (fail) { +tst_brk (TBROK , +"Could not set new child to same PID as the old one!" ); + } +if (old_inode == new_inode) { +tst_res (TWARN , +"File descriptor of new process points to the inode " +"of the old process!" );
I'd join this string on a single line. Also not sure if this is not TFAIL, but probably not.
Quoted 5 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +5
-0+ } + +TEST (pidfd_send_signal (pidfd,SIGUSR1 ,NULL ,0 )); +if (TST_RET ==-1 &&TST_ERR ==ESRCH ) { + tst_res(TPASS,
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c line 112
Quoted 10 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal03.c new file +10
-0+ "Did not send signal to wrong process with same PID!"); + }else { +tst_res (TFAIL |TTERRNO , +"pidf_send_signal() ended unexpectedly - return value: %ld, error" , +TST_RET ); + } +TST_CHECKPOINT_WAKE (0 ); +tst_reap_children (); + +SAFE_CLOSE (pidfd);
A bit repeating yourself, but not important.
Kind regards,
Petr
PATCH v2 2/4 syscalls/pidfd_send_signal01
In reply to Christian AmannHi!
When I attempty to compile this code I get:
In file included from pidfd_send_signal.h:11:0,
from pidfd_send_signal01.c:17:
pidfd_send_signal.h: In function 'check_syscall_support':
pidfd_send_signal.h:16:14: error: '__NR_pidfd_send_signal' undeclared (first use in this function); did you mean '__NR_perf_event_open'?
tst_syscall(__NR_pidfd_send_signal);
^
../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall'
if (NR == __LTP__NR_INVALID_SYSCALL) { \
^~
pidfd_send_signal.h:16:14: note: each undeclared identifier is reported only once for each function it appears in
tst_syscall(__NR_pidfd_send_signal);
^
../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall'
if (NR == __LTP__NR_INVALID_SYSCALL) { \
^~
pidfd_send_signal.h: In function 'pidfd_send_signal':
pidfd_send_signal.h:23:21: error: '__NR_pidfd_send_signal' undeclared (first use in this function); did you mean 'pidfd_send_signal'?
return tst_syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags);
^
../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall'
if (NR == __LTP__NR_INVALID_SYSCALL) { \
^~make: *** [<builtin>: pidfd_send_signal01] Error 1
Have you forgotten to git add the *.in files with syscall numbers?
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v2 2/4 syscalls/pidfd_send_signal01
Hi,
No, the *.in file changes are in a separate commit [1]. I didn't include it in version 2 of this patch because it didn't change.
Sorry for that, I will include those commits in the future.
Kind regards,
Christian
[1] https://patchwork.ozlabs.org/patch/1099966/
Quoted 30 lines · Cyril Hrubis
Hi!
When I attempty to compile this code I get:In file included from pidfd_send_signal.h:11:0,
from pidfd_send_signal01.c:17: pidfd_send_signal.h: In function 'check_syscall_support': pidfd_send_signal.h:16:14: error: '__NR_pidfd_send_signal' undeclared (first use in this function); did you mean '__NR_perf_event_open'? tst_syscall(__NR_pidfd_send_signal); ^ ../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall' if (NR == __LTP__NR_INVALID_SYSCALL) { \ ^~ pidfd_send_signal.h:16:14: note: each undeclared identifier is reported only once for each function it appears in tst_syscall(__NR_pidfd_send_signal); ^ ../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall' if (NR == __LTP__NR_INVALID_SYSCALL) { \ ^~ pidfd_send_signal.h: In function 'pidfd_send_signal': pidfd_send_signal.h:23:21: error: '__NR_pidfd_send_signal' undeclared (first use in this function); did you mean 'pidfd_send_signal'? return tst_syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags); ^ ../../../../include/lapi/syscalls.h:39:6: note: in definition of macro 'tst_syscall' if (NR == __LTP__NR_INVALID_SYSCALL) { \ ^~make: *** [<builtin>:
pidfd_send_signal01] Error 1Have you forgotten to git add the *.in files with syscall numbers?
PATCH v2 2/4 syscalls/pidfd_send_signal01
In reply to Christian AmannQuoted 4 lines
Add testcase to check if
pidfd_send_signal()can provide the same functionality asrt_sigqueueinfo().Signed-off-by Christian Amann <[email protected]>
Generally LGTM, nice work, just tiny details below.
BTW inspiration for other tests from kernel selftest [1]
...
Quoted 8 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +2
-0@@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c line 12
Quoted 10 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +10
-0+* Copyright (c) 2019 SUSE LLC +* Author: Christian Amann <[email protected]> +*/ +/* +* Tests if the pidfd_send_signal syscall behaves +* like rt_sigqueueinfo when a pointer to a siginfo_t +* struct is passed. +*/ + +#define _GNU_SOURCE
Why _GNU_SOURCE? I removed it from all 3 tests and the header and it compiles fine....
...
Quoted 4 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +4
-0+ +static void check_syscall_support (void ) +{ +/* allow the tests to fail early */
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c line 26
Quoted 10 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +10
-0+tst_syscall (__NR_pidfd_send_signal); +} + +#ifndef HAVE_PIDFD_SEND_SIGNAL +static int pidfd_send_signal (int pidfd,int sig,siginfo_t *info, +unsigned int flags) +{ +return tst_syscall (__NR_pidfd_send_signal, pidfd, sig, info, flags); +} +#endif /* HAVE_PIDFD_SEND_SIGNAL */
I wonder if we want to info whether our wrapper or libc wrapper it's used (it probably takes time when glibc takes it).
Quoted 90 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +2
-0+ +#endif /* PIDFD_SEND_SIGNAL_H */ testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +82
-0@@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 SUSE LLC +* Author: Christian Amann <[email protected]> +*/ +/* +* Tests if the pidfd_send_signal syscall behaves +* like rt_sigqueueinfo when a pointer to a siginfo_t +* struct is passed. +*/ + +#define _GNU_SOURCE + +#include <signal.h> +#include <stdlib.h> +#include "tst_safe_pthread.h" +#include "pidfd_send_signal.h" + +#define SIGNAL SIGUSR1 +#define DATA 777 + +static struct sigaction *sig_action; +static int sig_rec; +static siginfo_t *uinfo; +static int pidfd; + +static void received_signal (int sig,siginfo_t *info,void *ucontext) +{ +if (info && ucontext) { +if (sig ==SIGNAL && uinfo->si_value.sival_int ==DATA ) { +tst_res (TPASS ,"Received correct signal and data!" ); + sig_rec =1 ; + }else { +tst_res (TFAIL ,"Received wrong signal and/or data!" ); + } + }else { +tst_res (TFAIL ,"Signal handling went wrong!" ); + } +} + +static void *handle_thread (void *arg) +{ +SAFE_SIGACTION (SIGNAL , sig_action,NULL ); +TST_CHECKPOINT_WAKE_AND_WAIT (0 ); +return arg; +} + +static void verify_pidfd_send_signal (void ) +{ +pthread_t thr; + +SAFE_PTHREAD_CREATE (&thr,NULL , handle_thread,NULL ); + +TST_CHECKPOINT_WAIT (0 ); + +TEST (pidfd_send_signal (pidfd,SIGNAL , uinfo,0 )); +if (TST_RET !=0 ) { +tst_res (TFAIL |TTERRNO ,"pidfd_send_signal() failed" ); +return ; + } + +TST_CHECKPOINT_WAKE (0 ); +SAFE_PTHREAD_JOIN (thr,NULL ); + +if (sig_rec) { +tst_res (TPASS , +"pidfd_send_signal() behaved like rt_sigqueueinfo()" ); + } +} + +static void setup (void ) +{ +check_syscall_support (); + + pidfd =SAFE_OPEN ("/proc/self" ,O_DIRECTORY |O_CLOEXEC ); + + sig_action =SAFE_MALLOC (sizeof (struct sigaction )); + +memset (sig_action,0 ,sizeof (*sig_action)); + sig_action->sa_sigaction = received_signal; + sig_action->sa_flags =SA_SIGINFO ; +
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c line 92
Quoted 10 lines
testcases/kernel/syscalls/pidfd_send_signal/pidfd_send_signal01.c new file +10
-0+ uinfo =SAFE_MALLOC (sizeof (siginfo_t)); + +memset (uinfo,0 ,sizeof (*uinfo)); + uinfo->si_signo =SIGNAL ; + uinfo->si_code =SI_QUEUE ; + uinfo->si_pid =getpid (); + uinfo->si_uid =getuid (); + uinfo->si_value.sival_int =DATA ; + + sig_rec =0 ;
I guess this is not needed (as sig_rec is static.
Kind regards,
Petr