From: Dmitry V. Levin Date: Wed, 29 Jul 2015 07:59:56 +0000 (+0000) Subject: Implement sched_getattr and sched_setattr syscalls decoding X-Git-Tag: v4.11~320 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3456bcca6732829c00b66745743325fc6162322f;p=strace Implement sched_getattr and sched_setattr syscalls decoding * xlat/sched_flags.in: New file. * sched.c: Include "xlat/sched_flags.h". (print_sched_attr, sys_sched_setattr, sys_sched_getattr): New functions. * linux/dummy.h (sys_sched_getattr, sys_sched_setattr): Remove. * tests/sched_xetattr.c: New file. * tests/sched_xetattr.test: New test. * tests/Makefile.am (check_PROGRAMS): Add sched_xetattr. (TESTS): Add sched_xetattr.test. * tests/.gitignore: Add sched_xetattr. --- diff --git a/linux/dummy.h b/linux/dummy.h index 1fc2d0b9..93949043 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -39,8 +39,6 @@ #define sys_lookup_dcookie printargs #define sys_name_to_handle_at printargs #define sys_open_by_handle_at printargs -#define sys_sched_getattr printargs -#define sys_sched_setattr printargs #define sys_sysfs printargs #define sys_vm86 printargs #define sys_vm86old printargs diff --git a/sched.c b/sched.c index eda241fd..e4730469 100644 --- a/sched.c +++ b/sched.c @@ -3,6 +3,7 @@ #include #include "xlat/schedulers.h" +#include "xlat/sched_flags.h" SYS_FUNC(sched_getscheduler) { @@ -62,3 +63,56 @@ SYS_FUNC(sched_rr_get_interval) } return 0; } + +static void +print_sched_attr(struct tcb *tcp, const long addr, unsigned int size) +{ + struct { + uint32_t size; + uint32_t sched_policy; + uint64_t sched_flags; + uint32_t sched_nice; + uint32_t sched_priority; + uint64_t sched_runtime; + uint64_t sched_deadline; + uint64_t sched_period; + } attr = {}; + + if (size > sizeof(attr)) + size = sizeof(attr); + if (umoven_or_printaddr(tcp, addr, size, &attr)) + return; + + tprintf("{size=%u, sched_policy=", attr.size); + printxval(schedulers, attr.sched_policy, "SCHED_???"); + tprints(", sched_flags="); + printflags(sched_flags, attr.sched_flags, "SCHED_FLAG_???"); + tprintf(", sched_nice=%d", attr.sched_nice); + tprintf(", sched_priority=%u", attr.sched_priority); + tprintf(", sched_runtime=%" PRIu64, attr.sched_runtime); + tprintf(", sched_deadline=%" PRIu64, attr.sched_deadline); + tprintf(", sched_period=%" PRIu64 "}", attr.sched_period); +} + +SYS_FUNC(sched_setattr) +{ + tprintf("%d, ", (int) tcp->u_arg[0]); + print_sched_attr(tcp, tcp->u_arg[1], 0x100); + tprintf(", %u", (unsigned int) tcp->u_arg[2]); + + return RVAL_DECODED; +} + +SYS_FUNC(sched_getattr) +{ + if (entering(tcp)) { + tprintf("%d, ", (int) tcp->u_arg[0]); + } else { + print_sched_attr(tcp, tcp->u_arg[1], tcp->u_arg[2]); + tprintf(", %u, %u", + (unsigned int) tcp->u_arg[2], + (unsigned int) tcp->u_arg[3]); + } + + return 0; +} diff --git a/tests/.gitignore b/tests/.gitignore index 6354c7a2..51d8dd2a 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -20,6 +20,7 @@ netlink_inet_diag netlink_unix_diag pc pipe +sched_xetattr scm_rights seccomp select diff --git a/tests/Makefile.am b/tests/Makefile.am index e56643cc..2eb31330 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -31,6 +31,7 @@ check_PROGRAMS = \ netlink_unix_diag \ pc \ pipe \ + sched_xetattr \ scm_rights \ seccomp \ select \ @@ -79,6 +80,7 @@ TESTS = \ ipc_msg.test \ ipc_shm.test \ ipc_sem.test \ + sched_xetattr.test \ scm_rights-fd.test \ seccomp.test \ select.test \ diff --git a/tests/sched_xetattr.c b/tests/sched_xetattr.c new file mode 100644 index 00000000..9a30eff2 --- /dev/null +++ b/tests/sched_xetattr.c @@ -0,0 +1,65 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#if defined __NR_sched_getattr && defined __NR_sched_setattr + +int +main(void) +{ + static union { + struct { + uint32_t size; + uint32_t sched_policy; + uint64_t sched_flags; + uint32_t sched_nice; + uint32_t sched_priority; + uint64_t sched_runtime; + uint64_t sched_deadline; + uint64_t sched_period; + } attr; + char buf[256]; + } sched; + + if (syscall(__NR_sched_getattr, 0, &sched, sizeof(sched), 0)) + return 77; + + printf("sched_getattr\\(0, \\{size=%u, sched_policy=SCHED_[A-Z]+, sched_flags=%s, sched_nice=%u, sched_priority=%u, sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 "\\}, 256, 0\\) += 0\n", + sched.attr.size, + sched.attr.sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0", + sched.attr.sched_nice, + sched.attr.sched_priority, + sched.attr.sched_runtime, + sched.attr.sched_deadline, + sched.attr.sched_period); + + sched.attr.sched_flags |= 1; + if (syscall(__NR_sched_setattr, 0, &sched, 0)) + return 77; + + printf("sched_setattr\\(0, \\{size=%u, sched_policy=SCHED_[A-Z]+, sched_flags=%s, sched_nice=%u, sched_priority=%u, sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 "\\}, 0\\) += 0\n", + sched.attr.size, + "SCHED_FLAG_RESET_ON_FORK", + sched.attr.sched_nice, + sched.attr.sched_priority, + sched.attr.sched_runtime, + sched.attr.sched_deadline, + sched.attr.sched_period); + + return 0; +} + +#else + +int +main(void) +{ + return 77; +} + +#endif diff --git a/tests/sched_xetattr.test b/tests/sched_xetattr.test new file mode 100755 index 00000000..fe7efece --- /dev/null +++ b/tests/sched_xetattr.test @@ -0,0 +1,13 @@ +#!/bin/sh + +# Check sched_getattr and sched_setattr syscalls decoding. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -e sched_getattr,sched_setattr $args > "$OUT" +match_grep "$LOG" "$OUT" +rm -f "$OUT" + +exit 0 diff --git a/xlat/sched_flags.in b/xlat/sched_flags.in new file mode 100644 index 00000000..824d91dc --- /dev/null +++ b/xlat/sched_flags.in @@ -0,0 +1 @@ +SCHED_FLAG_RESET_ON_FORK 1