1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2021, BELLSOFT. All rights reserved.
4 * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
5 * AUTHOR: Saji Kumar.V.R <saji.kumar@wipro.com>
6 */
7
8/*\
9 * [Description]
10 *
11 * Checks functionality for sched_setparam(2) for pid != 0
12 *
13 * This test forks a child and changes its parent's scheduling priority.
14 */
15
16#include <stdlib.h>
17
18#include "tst_test.h"
19#include "tst_sched.h"
20
21static void run(void)
22{
23	struct sched_variant *tv = &sched_variants[tst_variant];
24	struct sched_param p5 = { .sched_priority = 5 };
25	struct sched_param p;
26	pid_t child_pid;
27
28	child_pid = SAFE_FORK();
29
30	if (!child_pid) {
31		TST_EXP_PASS_SILENT(tv->sched_setparam(getppid(), &p5));
32		exit(0);
33	}
34	tst_reap_children();
35
36	TST_EXP_PASS_SILENT(tv->sched_getparam(0, &p));
37
38	if (p.sched_priority == p5.sched_priority)
39		tst_res(TPASS, "got expected priority %d", p.sched_priority);
40	else
41		tst_res(TFAIL, "got priority %d, expected 5", p.sched_priority);
42}
43
44void setup(void)
45{
46	struct sched_variant *tv = &sched_variants[tst_variant];
47	struct sched_param p = { .sched_priority = 1 };
48
49	tst_res(TINFO, "Testing %s variant", tv->desc);
50
51	if (tv->sched_setscheduler(0, SCHED_FIFO, &p))
52		tst_brk(TBROK | TERRNO, "sched_setcheduler(0, SCHED_FIFO, 1)");
53}
54
55static struct tst_test test = {
56	.forks_child = 1,
57	.needs_root = 1,
58	.setup = setup,
59	.test_variants = ARRAY_SIZE(sched_variants),
60	.test_all = run,
61};
62