138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/*
238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved.
438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions
738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met:
838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    derived from this software without specific prior written permission.
1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */
2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin
28fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin#include "defs.h"
29fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
30fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levinenum {
31fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_WHO_PROCESS = 1,
32fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_WHO_PGRP,
33fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_WHO_USER
34fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin};
35fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
360ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/ioprio_who.h"
37fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
38fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levinenum {
39fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_CLASS_NONE,
40fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_CLASS_RT,
41fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_CLASS_BE,
42fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	IOPRIO_CLASS_IDLE
43fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin};
44fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
450ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/ioprio_class.h"
46fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
47fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin#define IOPRIO_CLASS_SHIFT	(13)
48fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin#define IOPRIO_PRIO_MASK	((1ul << IOPRIO_CLASS_SHIFT) - 1)
49fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
50fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin#define IOPRIO_PRIO_CLASS(mask)	((mask) >> IOPRIO_CLASS_SHIFT)
51fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin#define IOPRIO_PRIO_DATA(mask)	((mask) & IOPRIO_PRIO_MASK)
52fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
53fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levinstatic const char *
54fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levinsprint_ioprio(int ioprio)
55fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin{
56fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	static char outstr[256];
57fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	const char *str;
58fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	int class, data;
59fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
60fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	class = IOPRIO_PRIO_CLASS(ioprio);
61fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	data = IOPRIO_PRIO_DATA(ioprio);
62fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	str = xlookup(ioprio_class, class);
63fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	if (str)
64fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		sprintf(outstr, "IOPRIO_PRIO_VALUE(%s,%d)", str, data);
65fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	else
66fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		sprintf(outstr, "IOPRIO_PRIO_VALUE(%#x /* %s */,%d)",
67fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin			class, "IOPRIO_CLASS_???", data);
68fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
69fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	return outstr;
70fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin}
71fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
72a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(ioprio_get)
73fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin{
74fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	if (entering(tcp)) {
75fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		/* int which */
76fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
77fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		/* int who */
78fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		tprintf(", %d", (int) tcp->u_arg[1]);
79fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		return 0;
80fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	} else {
81fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		if (syserror(tcp))
82fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin			return 0;
83fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
84fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		tcp->auxstr = sprint_ioprio(tcp->u_rval);
85fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin		return RVAL_STR;
86fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin	}
87fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin}
88fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin
89a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(ioprio_set)
90fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin{
91a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	/* int which */
92a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
93a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	/* int who */
94a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	tprintf(", %d, ", (int) tcp->u_arg[1]);
95a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	/* int ioprio */
96a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	tprints(sprint_ioprio(tcp->u_arg[2]));
97a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin
98a58ad74f79015398bee378c08b0f1e25c26edc79Dmitry V. Levin	return RVAL_DECODED;
99fc4727de60fa79b0f638a2c78a3edf865dc75943Dmitry V. Levin}
100