1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
2d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
3d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
4d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is free software; you can redistribute it and/or modify it
5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * under the terms of version 2 of the GNU General Public License as
6d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * published by the Free Software Foundation.
7d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
8d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is distributed in the hope that it would be useful, but
9d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * WITHOUT ANY WARRANTY; without even the implied warranty of
10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
12d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * You should have received a copy of the GNU General Public License along
13fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc.,
14fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
16d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/**********************************************************
174bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
18d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    TEST IDENTIFIER	: sched_setparam02
194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
20d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    EXECUTED BY	: root / superuser
214bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
22d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    TEST TITLE	: Checks functionality for sched_setparam(2)
234bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
24d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    TEST CASE TOTAL	: 1
254bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
26d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    AUTHOR		: Saji Kumar.V.R <saji.kumar@wipro.com>
274bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
28d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    SIGNALS
29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	Uses SIGUSR1 to pause before test if option set.
30d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	(See the parse_opts(3) man page).
31d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *    DESCRIPTION
33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	This test changes the scheduling priority for current process
34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	and verifies it by calling sched_getparam().
354bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
36d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	Setup:
37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	  Setup signal handling.
38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	  Pause for SIGUSR1 if option specified.
39d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	  Change scheduling policy to SCHED_FIFO
404bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
41d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	Test:
42d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	 Loop if the proper options are given.
43d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	  Execute system call
44d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	  If scheduling priority is set properly,
45d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *		TEST passed
46d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *	  else
47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *		TEST failed
484bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
49d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	Cleanup:
50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 	  Print errno log and/or timing stats if options given
514bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * USAGE:  <for command-line>
53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *  sched_setparam02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p]
54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *			where,  -c n : Run n copies concurrently.
55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-e   : Turn on errno logging.
56d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-h   : Show help screen
57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-f   : Turn off functional testing
58d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-i n : Execute test n times.
59d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-I x : Execute test for x seconds.
60d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-p   : Pause for SIGUSR1 before starting
61d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-P x : Pause for x seconds between iterations.
62d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *				-t   : Turn on syscall timing.
63d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
64d13d74bbf207c2d01598c6fef092a75b93b07c71vapier ****************************************************************/
65d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h>
67d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sched.h>
68d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "test.h"
69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
70d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define FIFO_OR_RR_PRIO 5
71d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define OTHER_PRIO 0
72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
73d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void setup();
74d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void cleanup();
75d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic int verify_priority(int);
76d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
77fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "sched_setparam02";
78d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
79d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic struct sched_param param;
80d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic struct sched_param param1 = { 1 };
81d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
82d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic struct test_cases_t {
83d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	char *desc;
84d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int policy;
85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int priority;
86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} testcases[] = {
8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	{
8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	"Test with policy SCHED_FIFO", SCHED_FIFO, FIFO_OR_RR_PRIO}, {
8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	"Test with policy SCHED_RR", SCHED_RR, FIFO_OR_RR_PRIO}, {
9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	"Test with SCHED_OTHER", SCHED_OTHER, OTHER_PRIO}
91d13d74bbf207c2d01598c6fef092a75b93b07c71vapier};
92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
93d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(testcases) / sizeof(testcases[0]);
94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
9556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
9889af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc, i;
99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
100d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
102d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	setup();
103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	for (lc = 0; TEST_LOOPING(lc); lc++) {
105d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
106d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
108d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		for (i = 0; i < TST_TOTAL; ++i) {
109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (i == 2) {
111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				param1.sched_priority = 0;
11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			} else {
113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				param1.sched_priority = 1;
114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if ((sched_setscheduler(0, testcases[i].policy,
116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						&param1)) == -1) {
117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				tst_brkm(TBROK, cleanup, "sched_setscheduler()"
11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "  failed");
119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			param.sched_priority = testcases[i].priority;
1214bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			/*
122d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			 * Call sched_setparam(2) with pid=0 sothat it will
123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			 * set the scheduling parameters for the calling process
124d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			 */
125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			TEST(sched_setparam(0, &param));
126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if ((TEST_RETURN == 0) && (verify_priority(i))) {
128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				tst_resm(TPASS, "%s Passed", testcases[i].desc);
129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TFAIL | TTERRNO,
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "%s Failed. sched_setparam()"
132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 " returned %ld", testcases[i].desc,
133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 TEST_RETURN);
134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
135d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
1362c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* cleanup and exit */
139d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	cleanup();
140d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
14153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
1432c28215423293e443469a07ae7011135d058b671Garrett Cooper}
144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */
146c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
1482c28215423293e443469a07ae7011135d058b671Garrett Cooper
149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	tst_sig(NOFORK, DEF_HANDLER, cleanup);
150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	TEST_PAUSE;
152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
1532c28215423293e443469a07ae7011135d058b671Garrett Cooper}
154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() -  performs all ONE TIME cleanup for this test at
157d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *		completion or premature exit.
158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
159c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
1612c28215423293e443469a07ae7011135d058b671Garrett Cooper}
162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
163d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * verify_priority() -  This function checks whether the priority is
165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *			set correctly
166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint verify_priority(int i)
168d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
169d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	struct sched_param p;
170d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if ((sched_getparam(0, &p)) == 0) {
172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (p.sched_priority == testcases[i].priority) {
173d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			return 1;
174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
175d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			tst_resm(TWARN, "sched_getparam() returned priority"
17656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				 " value as %d", p.sched_priority);
177d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			return 0;
178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
179d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
180d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	tst_resm(TWARN, "sched_getparam() failed");
182d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	return 0;
183ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
184