summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2010-03-19 23:19:19 +0100
committerMark Wielaard <mjw@redhat.com>2010-03-21 17:34:41 +0100
commit41877d526c4c864aa851bed5d405d6d197c0b39b (patch)
tree6af3702ed0f231d0c547a5bbe7f7458af90954e2
parent08ee70c354131edccb0d1a73aa67abb9c65870fc (diff)
downloadsystemtap-steved-41877d526c4c864aa851bed5d405d6d197c0b39b.tar.gz
systemtap-steved-41877d526c4c864aa851bed5d405d6d197c0b39b.tar.xz
systemtap-steved-41877d526c4c864aa851bed5d405d6d197c0b39b.zip
Support epoll_create1 syscall.
* tapset/aux_syscalls.stp (_epoll_create1_flag_str): New helper function. * tapset/syscalls.stp (syscall.epoll_create[.return]): Match epoll_creat1 if available.
-rw-r--r--tapset/aux_syscalls.stp10
-rw-r--r--tapset/syscalls.stp24
-rw-r--r--testsuite/systemtap.syscall/poll.c5
3 files changed, 33 insertions, 6 deletions
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index 84342448..c101ae19 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -1632,6 +1632,16 @@ function _at_flag_str:string(f:long)
_stp_lookup_str(_stp_atflag_list, THIS->f, THIS->__retvalue, MAXSTRINGLEN);
%}
+%{
+#include <linux/eventpoll.h>
+%}
+function _epoll_create1_flag_str:string(f:long)
+%{ /* pure */
+#ifdef EPOLL_CLOEXEC
+ if (THIS->f == EPOLL_CLOEXEC)
+ strlcpy (THIS->__retvalue, "EPOLL_CLOEXEC", MAXSTRINGLEN);
+#endif
+%}
%{
#include <linux/shm.h>
diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp
index 0970df5b..743318b2 100644
--- a/tapset/syscalls.stp
+++ b/tapset/syscalls.stp
@@ -582,17 +582,29 @@ probe syscall.dup2.return = kernel.function("SyS_dup2").return !,
# epoll_create _______________________________________________
# long sys_epoll_create(int size)
-probe syscall.epoll_create = kernel.function("SyS_epoll_create").call !,
+# SYSCALL_DEFINE1(epoll_create1, int, flags)
+probe syscall.epoll_create = kernel.function("SyS_epoll_create1").call !,
+ kernel.function("sys_epoll_create1").call !,
+ kernel.function("SyS_epoll_create").call !,
kernel.function("sys_epoll_create").call ?
{
- name = "epoll_create"
- size = $size
- argstr = sprint($size)
+ size = @defined($size) ? $size : 0;
+ flags = @defined($flags) ? $flags : 0;
+ if (flags == 0) {
+ name = "epoll_create";
+ argstr = sprint(size);
+ } else {
+ name = "epoll_create1";
+ argstr = _epoll_create1_flag_str(flags);
+ }
}
-probe syscall.epoll_create.return = kernel.function("SyS_epoll_create").return !,
+probe syscall.epoll_create.return = kernel.function("SyS_epoll_create1").return !,
+ kernel.function("sys_epoll_create1").return !,
+ kernel.function("SyS_epoll_create").return !,
kernel.function("sys_epoll_create").return ?
{
- name = "epoll_create"
+ flags = @defined($flags) ? $flags : 0;
+ name = (flags == 0) ? "epoll_create" : "epoll_create1";
retstr = returnstr(1)
}
diff --git a/testsuite/systemtap.syscall/poll.c b/testsuite/systemtap.syscall/poll.c
index 3caa2b14..c34277b8 100644
--- a/testsuite/systemtap.syscall/poll.c
+++ b/testsuite/systemtap.syscall/poll.c
@@ -16,8 +16,13 @@ int main()
sigemptyset(&sigs);
sigaddset(&sigs,SIGUSR2);
+#ifdef EPOLL_CLOEXEC
+ fd = epoll_create1(EPOLL_CLOEXEC);
+ //staptest// epoll_create1 (EPOLL_CLOEXEC)
+#else
fd = epoll_create(32);
//staptest// epoll_create (32)
+#endif
epoll_ctl(fd, EPOLL_CTL_ADD, 13, &ev);
//staptest// epoll_ctl (NNNN, EPOLL_CTL_ADD, 13, XXXX)