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);
+ }
+ }
+%}
+
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
@__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,
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
@__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,
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))
+%)
}
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)
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)
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)
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)
--- /dev/null
+/* 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