sched.c revision 38a34c9349267c99ce1ddbd0b6e985147415d355
138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/*
238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2005 Roland McGrath <roland@redhat.com>
438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2012-2015 Dmitry V. Levin <ldv@altlinux.org>
538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved.
638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions
938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met:
1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    derived from this software without specific prior written permission.
1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */
2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin
30fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin#include "defs.h"
31fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
32fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin#include <sched.h>
33fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
34fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin#include "xlat/schedulers.h"
353456bcca6732829c00b66745743325fc6162322fDmitry V. Levin#include "xlat/sched_flags.h"
36fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
37a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_getscheduler)
38fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
39fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	if (entering(tcp)) {
40fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		tprintf("%d", (int) tcp->u_arg[0]);
41fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	} else if (!syserror(tcp)) {
42fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		tcp->auxstr = xlookup(schedulers, tcp->u_rval);
43fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		if (tcp->auxstr != NULL)
44fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin			return RVAL_STR;
45fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	}
46fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	return 0;
47fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
48fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
49a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_setscheduler)
50fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
5110c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	tprintf("%d, ", (int) tcp->u_arg[0]);
5210c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	printxval(schedulers, tcp->u_arg[1], "SCHED_???");
5310c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	tprints(", ");
5410c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	printnum_int(tcp, tcp->u_arg[2], "%d");
5510c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin
5610c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	return RVAL_DECODED;
57fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
58fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
59a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_getparam)
60fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
61f8bf1d56330288b2a5f4e54763062a45f0f26f58Dmitry V. Levin	if (entering(tcp))
62fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		tprintf("%d, ", (int) tcp->u_arg[0]);
63f8bf1d56330288b2a5f4e54763062a45f0f26f58Dmitry V. Levin	else
64f8bf1d56330288b2a5f4e54763062a45f0f26f58Dmitry V. Levin		printnum_int(tcp, tcp->u_arg[1], "%d");
65fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	return 0;
66fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
67fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
68a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_setparam)
69fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
7010c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	tprintf("%d, ", (int) tcp->u_arg[0]);
7110c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	printnum_int(tcp, tcp->u_arg[1], "%d");
7210c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin
7310c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	return RVAL_DECODED;
74fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
75fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
76a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_get_priority_min)
77fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
7810c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	printxval(schedulers, tcp->u_arg[0], "SCHED_???");
7910c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin
8010c408aceaa63c4d0be454d0262a68f1f6fde467Dmitry V. Levin	return RVAL_DECODED;
81fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
82fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin
83a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(sched_rr_get_interval)
84fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin{
85fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	if (entering(tcp)) {
86f8bf1d56330288b2a5f4e54763062a45f0f26f58Dmitry V. Levin		tprintf("%d, ", (int) tcp->u_arg[0]);
87fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	} else {
88fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		if (syserror(tcp))
89f8bf1d56330288b2a5f4e54763062a45f0f26f58Dmitry V. Levin			printaddr(tcp->u_arg[1]);
90fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin		else
91fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin			print_timespec(tcp, tcp->u_arg[1]);
92fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	}
93fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin	return 0;
94fff2f319f97c7555eef4a6de350c6353283634e0Dmitry V. Levin}
953456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
963456bcca6732829c00b66745743325fc6162322fDmitry V. Levinstatic void
973456bcca6732829c00b66745743325fc6162322fDmitry V. Levinprint_sched_attr(struct tcb *tcp, const long addr, unsigned int size)
983456bcca6732829c00b66745743325fc6162322fDmitry V. Levin{
993456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	struct {
1003456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint32_t size;
1013456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint32_t sched_policy;
1023456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint64_t sched_flags;
1033456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint32_t sched_nice;
1043456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint32_t sched_priority;
1053456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint64_t sched_runtime;
1063456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint64_t sched_deadline;
1073456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		uint64_t sched_period;
1083456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	} attr = {};
1093456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1103456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	if (size > sizeof(attr))
1113456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		size = sizeof(attr);
1123456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	if (umoven_or_printaddr(tcp, addr, size, &attr))
1133456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		return;
1143456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1153456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf("{size=%u, sched_policy=", attr.size);
1163456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	printxval(schedulers, attr.sched_policy, "SCHED_???");
1173456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprints(", sched_flags=");
1183456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	printflags(sched_flags, attr.sched_flags, "SCHED_FLAG_???");
1193456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", sched_nice=%d", attr.sched_nice);
1203456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", sched_priority=%u", attr.sched_priority);
1213456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", sched_runtime=%" PRIu64, attr.sched_runtime);
1223456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", sched_deadline=%" PRIu64, attr.sched_deadline);
1233456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", sched_period=%" PRIu64 "}", attr.sched_period);
1243456bcca6732829c00b66745743325fc6162322fDmitry V. Levin}
1253456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1263456bcca6732829c00b66745743325fc6162322fDmitry V. LevinSYS_FUNC(sched_setattr)
1273456bcca6732829c00b66745743325fc6162322fDmitry V. Levin{
1283456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf("%d, ", (int) tcp->u_arg[0]);
1293456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	print_sched_attr(tcp, tcp->u_arg[1], 0x100);
1303456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	tprintf(", %u", (unsigned int) tcp->u_arg[2]);
1313456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1323456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	return RVAL_DECODED;
1333456bcca6732829c00b66745743325fc6162322fDmitry V. Levin}
1343456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1353456bcca6732829c00b66745743325fc6162322fDmitry V. LevinSYS_FUNC(sched_getattr)
1363456bcca6732829c00b66745743325fc6162322fDmitry V. Levin{
1373456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	if (entering(tcp)) {
1383456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		tprintf("%d, ", (int) tcp->u_arg[0]);
1393456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	} else {
1403456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		print_sched_attr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1413456bcca6732829c00b66745743325fc6162322fDmitry V. Levin		tprintf(", %u, %u",
1423456bcca6732829c00b66745743325fc6162322fDmitry V. Levin			(unsigned int) tcp->u_arg[2],
1433456bcca6732829c00b66745743325fc6162322fDmitry V. Levin			(unsigned int) tcp->u_arg[3]);
1443456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	}
1453456bcca6732829c00b66745743325fc6162322fDmitry V. Levin
1463456bcca6732829c00b66745743325fc6162322fDmitry V. Levin	return 0;
1473456bcca6732829c00b66745743325fc6162322fDmitry V. Levin}
148