]> sourceware.org Git - systemtap.git/commitdiff
PR18492: Add tapset support and test coverage for sched_{get,set}attr
authorMartin Cermak <mcermak@redhat.com>
Tue, 9 Jun 2015 07:47:01 +0000 (09:47 +0200)
committerMartin Cermak <mcermak@redhat.com>
Tue, 9 Jun 2015 07:47:01 +0000 (09:47 +0200)
* tapset/linux/aux_syscalls.stp: New function _struct_sched_attr_u()
* tapset/linux/nd_syscalls2.stp: New probes nd_syscall.sched_{g,s}etattr
* tapset/linux/syscalls2.stp: New probes syscall.sched_{g,s}etattr
* testsuite/buildok/aux_syscalls-embedded.stp: New subtest
* testsuite/buildok/nd_syscalls2-detailed.stp: Ditto
* testsuite/buildok/syscalls2-detailed.stp: Ditto
* testsuite/systemtap.syscall/sched_attr.c: New testcase

tapset/linux/aux_syscalls.stp
tapset/linux/nd_syscalls2.stp
tapset/linux/syscalls2.stp
testsuite/buildok/aux_syscalls-embedded.stp
testsuite/buildok/nd_syscalls2-detailed.stp
testsuite/buildok/syscalls2-detailed.stp
testsuite/systemtap.syscall/sched_attr.c [new file with mode: 0644]

index 4f3fc33a59bdd3a08612a744ec9334a692c2b466..6604cb76a892f5cc62c54ff7b3bcb4316fc9eca8 100644 (file)
@@ -5886,3 +5886,30 @@ function _kcmp_type_str:string(type:long)
                         STAP_RETVALUE, MAXSTRINGLEN);
 %}
 
+function _struct_sched_attr_u:string(uaddr:long)
+%{ /* pure */
+       struct sched_attr sa;
+       char *ptr = (char *)(unsigned long)STAP_ARG_uaddr;
+       if (ptr == NULL)
+               strlcpy(STAP_RETVALUE, "NULL", MAXSTRINGLEN);
+       else
+       {
+               if (_stp_copy_from_user((char*)&sa, ptr,
+                   sizeof(struct sched_attr)) == 0)
+               {
+                       snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                                "{size=%u, sched_policy=%u, sched_flags=%llu, "
+                                "sched_nice=%d, sched_priority=%u, sched_runtime=%llu, "
+                                "sched_deadline=%llu, sched_period=%llu}",
+                                sa.size, sa.sched_policy, sa.sched_flags, sa.sched_nice,
+                                sa.sched_priority, sa.sched_runtime, sa.sched_deadline,
+                                sa.sched_period);
+               }
+               else
+               {
+                       snprintf(STAP_RETVALUE, MAXSTRINGLEN, "0x%lx",
+                                (unsigned long)ptr);
+               }
+       }
+%}
+
index 4be81c8a12f13d5f6b3286e1da6ceafbb9d20820..dd45cf14ffe44b1593ebff6f7ac6cff5c23ddfbd 100644 (file)
@@ -2055,6 +2055,29 @@ probe nd_syscall.sched_getaffinity.return =
        retstr = returnstr(1)
 }
 
+# sched_getattr ______________________________________________
+#
+# SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
+#                 unsigned int, size, unsigned int, flags)
+#
+probe nd_syscall.sched_getattr = kprobe.function("sys_sched_getattr") ?
+{
+       name = "sched_getattr"
+       asmlinkage()
+       pid = int_arg(1)
+       sched_attr_uaddr = pointer_arg(2)
+       sched_attr_str = _struct_sched_attr_u(sched_attr_uaddr)
+       size = uint_arg(3)
+       flags = uint_arg(4)
+       argstr = sprintf("%d, %s, %u, %u", pid, sched_attr_str, size, flags)
+}
+probe nd_syscall.sched_getattr.return =
+       kprobe.function("sys_sched_getattr").return ?
+{
+       name = "sched_getattr"
+       retstr = returnstr(1)
+}
+
 # sched_getparam _____________________________________________
 #
 # asmlinkage long
@@ -2161,6 +2184,28 @@ probe __nd_syscall.sched_rr_get_interval.return =
        @__syscall_gate(%{ __NR_sched_rr_get_interval %})
 }
 
+# sched_setattr ______________________________________________
+#
+# SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr,
+#                 unsigned int, flags)
+#
+probe nd_syscall.sched_setattr = kprobe.function("sys_sched_setattr") ?
+{
+       name = "sched_setattr"
+       asmlinkage()
+       pid = int_arg(1)
+       sched_attr_uaddr = pointer_arg(2)
+       sched_attr_str = _struct_sched_attr_u(sched_attr_uaddr)
+       flags = uint_arg(3)
+       argstr = sprintf("%d, %s, %u", pid, sched_attr_str, flags)
+}
+probe nd_syscall.sched_setattr.return =
+       kprobe.function("sys_sched_setattr").return ?
+{
+       name = "sched_setattr"
+       retstr = returnstr(1)
+}
+
 # sched_setaffinity __________________________________________
 # long sys_sched_setaffinity(pid_t pid,
 #      unsigned int len,
index 5f0f4f65b977aaf4614d25299ca57640de7a3449..01e10d4dc918495d4aba4bfa76548f7c361e30d6 100644 (file)
@@ -1992,6 +1992,29 @@ probe syscall.sched_getaffinity.return =
        name = "sched_getaffinity"
        retstr = return_str(1, $return)
 }
+
+# sched_getattr ______________________________________________
+#
+# SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
+#                 unsigned int, size, unsigned int, flags)
+#
+probe syscall.sched_getattr = kernel.function("sys_sched_getattr") ?
+{
+       name = "sched_getattr"
+       pid = __int32($pid)
+       sched_attr_uaddr = $uattr
+       sched_attr_str = _struct_sched_attr_u(sched_attr_uaddr)
+       size = __uint32($size)
+       flags = __uint32($flags)
+       argstr = sprintf("%d, %s, %u, %u", pid, sched_attr_str, size, flags)
+}
+probe syscall.sched_getattr.return =
+       kernel.function("sys_sched_getattr").return ?
+{
+       name = "sched_getattr"
+       retstr = return_str(1, $return)
+}
+
 # sched_getparam _____________________________________________
 #
 # asmlinkage long
@@ -2090,6 +2113,27 @@ probe __syscall.sched_rr_get_interval.return =
        @__syscall_gate(%{ __NR_sched_rr_get_interval %})
 }
 
+# sched_setattr ______________________________________________
+#
+# SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr,
+#                 unsigned int, flags)
+#
+probe syscall.sched_setattr = kernel.function("sys_sched_setattr") ?
+{
+       name = "sched_setattr"
+       pid = __int32($pid)
+       sched_attr_uaddr = $uattr
+       sched_attr_str = _struct_sched_attr_u(sched_attr_uaddr)
+       flags = __uint32($flags)
+       argstr = sprintf("%d, %s, %u", pid, sched_attr_str, flags)
+}
+probe syscall.sched_setattr.return =
+       kernel.function("sys_sched_setattr").return ?
+{
+       name = "sched_setattr"
+       retstr = return_str(1, $return)
+}
+
 # sched_setaffinity __________________________________________
 # long sys_sched_setaffinity(pid_t pid,
 #      unsigned int len,
index 9f1c10437df0989eb078b7336eb31c654bb6fc8d..ab5b00b69e8f57144441b463c9237e49c331b40b 100755 (executable)
@@ -208,4 +208,7 @@ probe begin {
        print (_fanotify_mark_mask_str(0))
        print (_perf_event_open_flags_str(0))
        print (_kcmp_type_str(0))
+%( kernel_v >= "3.14" %?
+       print (_struct_sched_attr_u(0))
+%)
 }
index e50e8ae56cbc4f8e66f41dbe72c2c6db0d4b49fa..2d880912bc242a6009d3bd5ab7098f988930af27 100755 (executable)
@@ -565,6 +565,16 @@ probe nd_syscall.sched_getaffinity.return
        printf("%s %s\n", name, retstr)
 }
 
+probe nd_syscall.sched_getattr ?
+{
+       printf("%s(%s)\n", name, argstr)
+       printf("%d, %s, %u, %u", pid, sched_attr_str, size, flags)
+}
+probe nd_syscall.sched_getattr.return ?
+{
+       printf("%s %s\n", name, retstr)
+}
+
 probe nd_syscall.sched_getparam
 {
        printf("%s(%s)\n", name, argstr)
@@ -606,6 +616,16 @@ probe nd_syscall.sched_rr_get_interval.return
        printf("%s %s\n", name, retstr)
 }
 
+probe nd_syscall.sched_setattr ?
+{
+       printf("%s(%s)\n", name, argstr)
+       printf("%d, %s, %u", pid, sched_attr_str, flags)
+}
+probe nd_syscall.sched_setattr.return ?
+{
+       printf("%s %s\n", name, retstr)
+}
+
 probe nd_syscall.sched_setaffinity
 {
        printf("%s(%s)\n", name, argstr)
index 857c3713380b48c05ec61842fa724798d25c5f19..9eef475ce17378a03eb817cf5fe92cc47814f750 100755 (executable)
@@ -561,6 +561,16 @@ probe syscall.sched_getaffinity.return
        printf("%s %s\n", name, retstr)
 }
 
+probe syscall.sched_getattr ?
+{
+       printf("%s(%s)\n", name, argstr)
+       printf("%d, %s, %u, %u", pid, sched_attr_str, size, flags)
+}
+probe syscall.sched_getattr.return ?
+{
+       printf("%s %s\n", name, retstr)
+}
+
 probe syscall.sched_getparam
 {
        printf("%s(%s)\n", name, argstr)
@@ -602,6 +612,16 @@ probe syscall.sched_rr_get_interval.return
        printf("%s %s\n", name, retstr)
 }
 
+probe syscall.sched_setattr ?
+{
+       printf("%s(%s)\n", name, argstr)
+       printf("%d, %s, %u", pid, sched_attr_str, flags)
+}
+probe syscall.sched_setattr.return ?
+{
+       printf("%s %s\n", name, retstr)
+}
+
 probe syscall.sched_setaffinity
 {
        printf("%s(%s)\n", name, argstr)
diff --git a/testsuite/systemtap.syscall/sched_attr.c b/testsuite/systemtap.syscall/sched_attr.c
new file mode 100644 (file)
index 0000000..c9432ce
--- /dev/null
@@ -0,0 +1,73 @@
+/* COVERAGE: sched_getattr sched_setattr */
+
+#define _GNU_SOURCE
+#include <sched.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <malloc.h>
+
+#if defined __NR_sched_getattr && defined __NR_sched_setattr
+
+static inline int __sched_getattr(pid_t pid, void *attr, unsigned int size,
+                                  unsigned int flags)
+{
+    return syscall(__NR_sched_getattr, pid, attr, size, flags);
+}
+
+static inline int __sched_setattr(pid_t pid, void *attr, unsigned int flags)
+{
+    return syscall(__NR_sched_setattr, pid, attr, flags);
+}
+
+int main()
+{
+    int mypid = getpid();
+
+    // Declaration of struct sched_attr not in available in 4.1.0-0 kernel headers.
+    // Following avoids declaring the structure within this test program.
+    int sas = 1024;
+    int sal = 8; /* __alignof__ (struct sched_attr) */
+    void *sa = memalign(sal, sas);
+
+    __sched_getattr(mypid, sa, sas, 0);
+    //staptest// sched_getattr (NNNN, {size=NNNN, sched_policy=NNNN, sched_flags=NNNN, sched_nice=NNNN, sched_priority=NNNN, sched_runtime=NNNN, sched_deadline=NNNN, sched_period=NNNN}, NNNN, NNNN) = 0
+
+    __sched_setattr(mypid, sa, 0);
+    //staptest// sched_setattr (NNNN, {size=NNNN, sched_policy=NNNN, sched_flags=NNNN, sched_nice=NNNN, sched_priority=NNNN, sched_runtime=NNNN, sched_deadline=NNNN, sched_period=NNNN}, NNNN) = 0
+
+    // Limit testing
+
+    __sched_getattr(-1, 0, 0, 0);
+    //staptest// sched_getattr (-1, NULL, 0, 0) = -NNNN
+
+    __sched_getattr(0, (void *)-1, 0, 0);
+    //staptest// sched_getattr (0, 0x[f]+, 0, 0) = -NNNN
+
+    __sched_getattr(0, 0, -1, 0);
+    //staptest// sched_getattr (0, NULL, 4294967295, 0) = -NNNN
+
+    __sched_getattr(0, 0, 0, -1);
+    //staptest// sched_getattr (0, NULL, 0, 4294967295) = -NNNN
+
+    __sched_setattr(-1, NULL, 0);
+    //staptest// sched_setattr (-1, NULL, 0) = -NNNN
+
+    __sched_setattr(0, (void *)-1, 0);
+    //staptest// sched_setattr (0, 0x[f]+, 0) = -NNNN
+
+    __sched_setattr(0, NULL, -1);
+    //staptest// sched_setattr (0, NULL, 4294967295) = -NNNN
+
+    free(sa);
+
+    return 0;
+}
+#else
+int main()
+{
+    return 0;
+}
+#endif
This page took 0.049541 seconds and 5 git commands to generate.