diff options
author | Mark Wielaard <mjw@redhat.com> | 2010-03-21 17:23:17 +0100 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2010-03-21 17:34:41 +0100 |
commit | a1ecf9ff0f6fc6ef0bcdaf231ed2d395ee979b4b (patch) | |
tree | f1d81e2993184326b3ca30314e8ae6b7e0476696 | |
parent | 6c8598ca45b8c0910fc0f45352b31711164e4d1c (diff) | |
download | systemtap-steved-a1ecf9ff0f6fc6ef0bcdaf231ed2d395ee979b4b.tar.gz systemtap-steved-a1ecf9ff0f6fc6ef0bcdaf231ed2d395ee979b4b.tar.xz systemtap-steved-a1ecf9ff0f6fc6ef0bcdaf231ed2d395ee979b4b.zip |
Support signalfd4 in syscalls2.stp tapset.
* tapset/aux_syscalls.stp (_signalfd4_flags_str): New utility function.
* tapset/syscalls2.stp (syscall.signalfd[.return]): Handle signalfd4 variant
when available.
* testsuite/systemtap.syscall/signalfd.c: New test.
-rw-r--r-- | tapset/aux_syscalls.stp | 23 | ||||
-rw-r--r-- | tapset/syscalls2.stp | 22 | ||||
-rw-r--r-- | testsuite/systemtap.syscall/signalfd.c | 35 |
3 files changed, 75 insertions, 5 deletions
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index 6179719c..bd62817d 100644 --- a/tapset/aux_syscalls.stp +++ b/tapset/aux_syscalls.stp @@ -1685,6 +1685,29 @@ function _eventfd2_flag_str:string(f:long) %} %{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) +#include <linux/signalfd.h> +#endif +%} +function _signalfd4_flags_str:string(f:long) +%{ /* pure */ + long flags = THIS->f; + char *str = THIS->__retvalue; + int len; + +#if defined(SFD_CLOEXEC) && defined(SFD_NONBLOCK) + if (flags & SFD_NONBLOCK) + strlcat(str, "SFD_NONBLOCK|", MAXSTRINGLEN); + if (flags & SFD_CLOEXEC) + strlcat(str, "SFD_CLOEXEC|", MAXSTRINGLEN); +#endif + + len = strlen(str); + if (len) + str[strlen(str)-1] = 0; +%} + +%{ #include <linux/inotify.h> %} function _inotify_init1_flag_str:string(f:long) diff --git a/tapset/syscalls2.stp b/tapset/syscalls2.stp index da6b637e..31a29560 100644 --- a/tapset/syscalls2.stp +++ b/tapset/syscalls2.stp @@ -2524,16 +2524,28 @@ probe syscall.signal.return = kernel.function("SyS_signal").return !, # long compat_sys_signalfd(int ufd, const compat_sigset_t __user *sigmask, # compat_size_t sigsetsize) # -probe syscall.signalfd = kernel.function("SyS_signalfd").call !, +probe syscall.signalfd = kernel.function("SyS_signalfd4").call !, + kernel.function("sys_signalfd4").call !, + kernel.function("SyS_signalfd").call !, kernel.function("sys_signalfd").call ? { - name = "signalfd" - argstr = sprintf("%d, %p, %d", $ufd, $user_mask, $sizemask) + flags = @defined($flags) ? $flags : 0; + if (flags == 0) { + name = "signalfd" + argstr = sprintf("%d, %p, %d", $ufd, $user_mask, $sizemask) + } else { + name = "signalfd4" + argstr = sprintf("%d, %p, %d, %s", $ufd, $user_mask, + $sizemask, _signalfd4_flags_str($flags)) + } } -probe syscall.signalfd.return = kernel.function("SyS_signalfd").return !, +probe syscall.signalfd.return = kernel.function("SyS_signalfd4").return !, + kernel.function("sys_signalfd4").return !, + kernel.function("SyS_signalfd").return !, kernel.function("sys_signalfd").return ? { - name = "signalfd" + flags = @defined($flags) ? $flags : 0; + name = (flags == 0) ? "signalfd" : "signalfd4" retstr = returnstr(1) } probe syscall.compat_signalfd = kernel.function("compat_sys_signalfd").call ? diff --git a/testsuite/systemtap.syscall/signalfd.c b/testsuite/systemtap.syscall/signalfd.c new file mode 100644 index 00000000..e4621bf9 --- /dev/null +++ b/testsuite/systemtap.syscall/signalfd.c @@ -0,0 +1,35 @@ +/* COVERAGE: signalfd */ +#include <sys/signalfd.h> +#include <sys/syscall.h> +#include <sys/types.h> +#include <unistd.h> +#include <signal.h> +#include <string.h> + +int main() +{ + sigset_t mask; + int sfd; + + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + sfd = signalfd(-1, &mask, 0); + //staptest// signalfd (-1, XXXX, NNNN) = NNNN + + sigaddset(&mask, SIGUSR1); + sigaddset(&mask, SIGUSR2); + sfd = signalfd(sfd, &mask, 0); + //staptest// signalfd (NNNN, XXXX, NNNN) = NNNN + +#if defined(SFD_NONBLOCK) && defined(SFD_CLOEXEC) + sfd = signalfd(-1, &mask, SFD_NONBLOCK); + //staptest// signalfd4 (-1, XXXX, NNNN, SFD_NONBLOCK) = NNNN + sfd = signalfd(-1, &mask, SFD_CLOEXEC); + //staptest// signalfd4 (-1, XXXX, NNNN, SFD_CLOEXEC) = NNNN + sfd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC); + //staptest// signalfd4 (-1, XXXX, NNNN, SFD_NONBLOCK|SFD_CLOEXEC) = NNNN +#endif + + return 0; +} |