summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2010-03-21 17:23:17 +0100
committerMark Wielaard <mjw@redhat.com>2010-03-21 17:34:41 +0100
commita1ecf9ff0f6fc6ef0bcdaf231ed2d395ee979b4b (patch)
treef1d81e2993184326b3ca30314e8ae6b7e0476696 /tapset
parent6c8598ca45b8c0910fc0f45352b31711164e4d1c (diff)
downloadsystemtap-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.
Diffstat (limited to 'tapset')
-rw-r--r--tapset/aux_syscalls.stp23
-rw-r--r--tapset/syscalls2.stp22
2 files changed, 40 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 ?