diff options
author | Mark Wielaard <mjw@redhat.com> | 2010-03-20 22:43:51 +0100 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2010-03-21 17:34:41 +0100 |
commit | c01a52256bfbd9a3d2873b2d48f7f94177d14641 (patch) | |
tree | 7767a9acc35a98e93f4d05fdd63db3d83ab3bbdf /tapset | |
parent | 9d2d9895621fdfe5c73034039183fc2fc31a1495 (diff) | |
download | systemtap-steved-c01a52256bfbd9a3d2873b2d48f7f94177d14641.tar.gz systemtap-steved-c01a52256bfbd9a3d2873b2d48f7f94177d14641.tar.xz systemtap-steved-c01a52256bfbd9a3d2873b2d48f7f94177d14641.zip |
Add support for eventfd2 to syscall.stp tapset.
* tapset/aux_syscalls.stp (_eventfd2_flag_str): New utility function.
* tapset/syscalls.stp (syscall.eventfd[.return]): Add alternatives to
handle eventfd2.
* testsuite/systemtap.syscall/eventfd.c: New test.
Diffstat (limited to 'tapset')
-rw-r--r-- | tapset/aux_syscalls.stp | 23 | ||||
-rw-r--r-- | tapset/syscalls.stp | 23 |
2 files changed, 40 insertions, 6 deletions
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index 15a70484..5377bafd 100644 --- a/tapset/aux_syscalls.stp +++ b/tapset/aux_syscalls.stp @@ -1645,6 +1645,29 @@ function _epoll_create1_flag_str:string(f:long) #endif %} +%{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) +#include <linux/eventfd.h> +#endif +%} +function _eventfd2_flag_str:string(f:long) +%{ /* pure */ + long flags = THIS->f; + char *str = THIS->__retvalue; + int len; + +#if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) + if (flags & EFD_NONBLOCK) + strlcat(str, "EFD_NONBLOCK|", MAXSTRINGLEN); + if (flags & EFD_CLOEXEC) + strlcat(str, "EFD_CLOEXEC|", MAXSTRINGLEN); +#endif + + len = strlen(str); + if (len) + str[strlen(str)-1] = 0; +%} + function _dup3_flag_str:string(f:long) %{ /* pure */ #ifdef O_CLOEXEC diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp index 90cdbd0e..86f81abf 100644 --- a/tapset/syscalls.stp +++ b/tapset/syscalls.stp @@ -733,17 +733,28 @@ probe syscall.epoll_wait.return = kernel.function("compat_sys_epoll_wait").retur # eventfd _____________________________________________________ # long sys_eventfd(unsigned int count) -# -probe syscall.eventfd = kernel.function("SyS_eventfd").call !, +# SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags) +probe syscall.eventfd = kernel.function("SyS_eventfd2").call !, + kernel.function("sys_eventfd2").call !, + kernel.function("SyS_eventfd").call !, kernel.function("sys_eventfd").call ? { - name = "eventfd" - argstr = sprint($count) + flags = @defined($flags) ? $flags : 0 + if (flags == 0) { + name = "eventfd" + argstr = sprint($count) + } else { + name = "eventfd2" + argstr = sprintf("%d, %s", $count, _eventfd2_flag_str(flags)) + } } -probe syscall.eventfd.return = kernel.function("SyS_eventfd").return !, +probe syscall.eventfd.return = kernel.function("SyS_eventfd2").return !, + kernel.function("sys_eventfd2").return !, + kernel.function("SyS_eventfd").return !, kernel.function("sys_eventfd").return ? { - name = "eventfd" + flags = @defined($flags) ? $flags : 0 + name = flags == 0 ? "eventfd" : "eventfd2" retstr = returnstr(1) } |