13c744274b453bf857361a94a6950422215c529a9subrata_modak/******************************************************************************/
23c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
33c744274b453bf857361a94a6950422215c529a9subrata_modak/* Copyright (c) International Business Machines  Corp., 2007                 */
43c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
53c744274b453bf857361a94a6950422215c529a9subrata_modak/* This program is free software;  you can redistribute it and/or modify      */
63c744274b453bf857361a94a6950422215c529a9subrata_modak/* it under the terms of the GNU General Public License as published by       */
73c744274b453bf857361a94a6950422215c529a9subrata_modak/* the Free Software Foundation; either version 2 of the License, or          */
83c744274b453bf857361a94a6950422215c529a9subrata_modak/* (at your option) any later version.                                        */
93c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
103c744274b453bf857361a94a6950422215c529a9subrata_modak/* This program is distributed in the hope that it will be useful,            */
113c744274b453bf857361a94a6950422215c529a9subrata_modak/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
123c744274b453bf857361a94a6950422215c529a9subrata_modak/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
133c744274b453bf857361a94a6950422215c529a9subrata_modak/* the GNU General Public License for more details.                           */
143c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
153c744274b453bf857361a94a6950422215c529a9subrata_modak/* You should have received a copy of the GNU General Public License          */
163c744274b453bf857361a94a6950422215c529a9subrata_modak/* along with this program;  if not, write to the Free Software               */
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
183c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
193c744274b453bf857361a94a6950422215c529a9subrata_modak/******************************************************************************/
203c744274b453bf857361a94a6950422215c529a9subrata_modak
213c744274b453bf857361a94a6950422215c529a9subrata_modak/******************************************************************************/
223c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
233c744274b453bf857361a94a6950422215c529a9subrata_modak/* File:        cpuctl_test04.c                                               */
243c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
253c744274b453bf857361a94a6950422215c529a9subrata_modak/* Description: This is a c program that tests the cpucontroller fairness of  */
263c744274b453bf857361a94a6950422215c529a9subrata_modak/*              scheduling the tasks according to their group shares. This    */
273c744274b453bf857361a94a6950422215c529a9subrata_modak/*              testcase tests the ability of the cpu controller to provide   */
283c744274b453bf857361a94a6950422215c529a9subrata_modak/*              fairness for share values (absolute).                         */
293c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
3072d13509bbe99a677e7b764d4f2f39e2b03b2f81subrata_modak/* Total Tests: 2                                                             */
313c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
328e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak/* Test 09:     Heavy stress test with nice value change                      */
338e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak/* Test 10:     Heavy stress test (effect of heavy group on light group)      */
348e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak/*                                                                            */
353c744274b453bf857361a94a6950422215c529a9subrata_modak/* Test Name:   cpu_controller_test04                                         */
363c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
373c744274b453bf857361a94a6950422215c529a9subrata_modak/* Test Assertion                                                             */
383c744274b453bf857361a94a6950422215c529a9subrata_modak/*              Please refer to the file cpuctl_testplan.txt                  */
393c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
40d3ba25b3d046e18320734e03dbcfe42b089115f8subrata_modak/* Author:      Sudhir Kumar skumar@linux.vnet.ibm.com                        */
413c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
423c744274b453bf857361a94a6950422215c529a9subrata_modak/* History:                                                                   */
43d3ba25b3d046e18320734e03dbcfe42b089115f8subrata_modak/* Created-     20/12/2007 -Sudhir Kumar <skumar@linux.vnet.ibm.com>          */
443c744274b453bf857361a94a6950422215c529a9subrata_modak/*                                                                            */
453c744274b453bf857361a94a6950422215c529a9subrata_modak/******************************************************************************/
463c744274b453bf857361a94a6950422215c529a9subrata_modak
473c744274b453bf857361a94a6950422215c529a9subrata_modak#include <unistd.h>
483c744274b453bf857361a94a6950422215c529a9subrata_modak#include <math.h>
493c744274b453bf857361a94a6950422215c529a9subrata_modak#include <signal.h>
503c744274b453bf857361a94a6950422215c529a9subrata_modak#include <stdio.h>
513c744274b453bf857361a94a6950422215c529a9subrata_modak#include <stdlib.h>
523c744274b453bf857361a94a6950422215c529a9subrata_modak#include <string.h>
533c744274b453bf857361a94a6950422215c529a9subrata_modak#include <sys/resource.h>
543c744274b453bf857361a94a6950422215c529a9subrata_modak#include <sys/syscall.h>
553c744274b453bf857361a94a6950422215c529a9subrata_modak#include <sys/time.h>
563c744274b453bf857361a94a6950422215c529a9subrata_modak#include <sys/types.h>
57b15aafd4f07a07e790ac504343cf8d9bd77963afsubrata_modak#include <sys/stat.h>
58b15aafd4f07a07e790ac504343cf8d9bd77963afsubrata_modak#include <fcntl.h>
593c744274b453bf857361a94a6950422215c529a9subrata_modak#include <time.h>
603c744274b453bf857361a94a6950422215c529a9subrata_modak#include <unistd.h>
613c744274b453bf857361a94a6950422215c529a9subrata_modak
62287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak#include "../libcontrollers/libcontrollers.h"
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include "test.h"		/* LTP harness APIs */
643c744274b453bf857361a94a6950422215c529a9subrata_modak
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define TIME_INTERVAL	100	/* Time interval in seconds */
66354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define NUM_INTERVALS	2	/* How many iterations of TIME_INTERVAL */
673c744274b453bf857361a94a6950422215c529a9subrata_modak
683750bdad20cb54252af92f96265e664965342a02Yuan Sunchar *TCID = "cpuctl_test04";
6972d13509bbe99a677e7b764d4f2f39e2b03b2f81subrata_modakint TST_TOTAL = 2;
703c744274b453bf857361a94a6950422215c529a9subrata_modakpid_t scriptpid;
71287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modakchar path[] = "/dev/cpuctl";
72287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoextern void cleanup()
743c744274b453bf857361a94a6950422215c529a9subrata_modak{
75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	kill(scriptpid, SIGUSR1);	/* Inform the shell to do cleanup */
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_exit();		/* Report exit status */
773c744274b453bf857361a94a6950422215c529a9subrata_modak}
783c744274b453bf857361a94a6950422215c529a9subrata_modak
79575839ea989d07d4efa8816256469da86c2dab5csubrata_modakvolatile int timer_expired = 0;
803c744274b453bf857361a94a6950422215c529a9subrata_modak
81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char *argv[])
823c744274b453bf857361a94a6950422215c529a9subrata_modak{
833c744274b453bf857361a94a6950422215c529a9subrata_modak
84b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	int test_num;
85b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	int task_num;
86b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	int len;
87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int num_cpus;		/* Total time = TIME_INTERVAL *num_cpus in the machine */
8837aed20773b801a903517a7ef896176d0d93a4efsubrata_modak	char mygroup[FILENAME_MAX], mytaskfile[FILENAME_MAX];
8937aed20773b801a903517a7ef896176d0d93a4efsubrata_modak	char mysharesfile[FILENAME_MAX], ch;
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* Following variables are to capture parameters from script */
91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *group_num_p, *mygroup_p, *script_pid_p, *num_cpus_p, *test_num_p,
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    *task_num_p;
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	gid_t mygroup_num;	/* A number attached with a group */
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int fd;			/* A descriptor to open a fifo for synchronized start */
95354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int counter = 0;	/* To take n number of readings */
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	double total_cpu_time,	/* Accumulated cpu time */
97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 delta_cpu_time,	/* Time the task could run on cpu(s) (in an interval) */
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 prev_cpu_time = 0;
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	double exp_cpu_time;	/* Expected time in % as obtained by shares calculation */
1003c744274b453bf857361a94a6950422215c529a9subrata_modak	struct rusage cpu_usage;
1013c744274b453bf857361a94a6950422215c529a9subrata_modak	unsigned long int mygroup_shares;
1023c744274b453bf857361a94a6950422215c529a9subrata_modak	time_t current_time, prev_time, delta_time;
103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	unsigned int fmyshares, num_tasks;	/* f-> from file. num_tasks is tasks in this group */
1043c744274b453bf857361a94a6950422215c529a9subrata_modak	struct sigaction newaction, oldaction;
105b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper
106b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	mygroup_num = -1;
107b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	num_cpus = 0;
108b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	task_num = 0;
109b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper	test_num = 0;
110b6ff02cd9592e40c4b435ff7755cb69572a23f47Garrett Cooper
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* Signal handling for alarm */
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	sigemptyset(&newaction.sa_mask);
1133c744274b453bf857361a94a6950422215c529a9subrata_modak	newaction.sa_handler = signal_handler_alarm;
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	newaction.sa_flags = 0;
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	sigaction(SIGALRM, &newaction, &oldaction);
1163c744274b453bf857361a94a6950422215c529a9subrata_modak
1173c744274b453bf857361a94a6950422215c529a9subrata_modak	/* Collect the parameters passed by the script */
118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	group_num_p = getenv("GROUP_NUM");
119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	mygroup_p = getenv("MYGROUP");
120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	script_pid_p = getenv("SCRIPT_PID");
121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	num_cpus_p = getenv("NUM_CPUS");
122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	test_num_p = getenv("TEST_NUM");
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	task_num_p = getenv("TASK_NUM");
1243c744274b453bf857361a94a6950422215c529a9subrata_modak	/* Check if all of them are valid */
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((test_num_p != NULL)
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    && (((test_num = atoi(test_num_p)) <= 10)
127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		&& ((test_num = atoi(test_num_p)) >= 9))) {
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((group_num_p != NULL) && (mygroup_p != NULL)
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    && (script_pid_p != NULL) && (num_cpus_p != NULL)
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    && (task_num_p != NULL)) {
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			mygroup_num = atoi(group_num_p);
132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			scriptpid = atoi(script_pid_p);
133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			num_cpus = atoi(num_cpus_p);
134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			task_num = atoi(task_num_p);
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sprintf(mygroup, "%s", mygroup_p);
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_brkm(TBROK, cleanup,
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 "Invalid other input parameters\n");
1393c744274b453bf857361a94a6950422215c529a9subrata_modak		}
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else {
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup, "Invalid test number passed\n");
1423c744274b453bf857361a94a6950422215c529a9subrata_modak	}
1433c744274b453bf857361a94a6950422215c529a9subrata_modak
144402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	/*
145402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	 * Let us give the default group 100 shares, as other groups will have
146402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	 * a multiple of 100 shares.
147402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	 * WARN: For large num of groups this may hit MAX_SHARES
148402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	 */
149402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak	mygroup_shares = mygroup_num * 100;
150402fe7bdddfd10440b6290c2d7609ebcda03ffdbsubrata_modak
1513c744274b453bf857361a94a6950422215c529a9subrata_modak	sprintf(mytaskfile, "%s", mygroup);
152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	strcat(mytaskfile, "/tasks");
1533c744274b453bf857361a94a6950422215c529a9subrata_modak	sprintf(mysharesfile, "%s", mygroup);
154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	strcat(mysharesfile, "/cpu.shares");
1553c744274b453bf857361a94a6950422215c529a9subrata_modak	/* Need some technique so as only 1 task per grp writes to shares file */
1568e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak	if (test_num == 9)
157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		write_to_file(mysharesfile, "w", mygroup_shares);	/* Write the shares of the group */
15872d13509bbe99a677e7b764d4f2f39e2b03b2f81subrata_modak
159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	write_to_file(mytaskfile, "a", getpid());	/* Assign the task to it's group */
1603c744274b453bf857361a94a6950422215c529a9subrata_modak
161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fd = open("./myfifo", 0);
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (fd == -1) {
163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup,
164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "Could not open fifo for synchronization");
1653c744274b453bf857361a94a6950422215c529a9subrata_modak	}
1663c744274b453bf857361a94a6950422215c529a9subrata_modak
167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	read(fd, &ch, 1);	/* To block all tasks here and fire them up at the same time */
168287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
169287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	/*
170287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	 * We now calculate the expected % cpu time of this task by getting
171287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	 * it's group's shares, the total shares of all the groups and the
172287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	 * number of tasks in this group.
173287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	 */
174287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	FLAG = 0;
175287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	total_shares = 0;
176287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	shares_pointer = &total_shares;
177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	len = strlen(path);
178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strncpy(fullpath, path, len))
179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup, "Could not copy directory path %s ",
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 path);
181287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
182bd1f58065370eddeea275a238b0a439451c8b70esubrata_modak	if (scan_shares_files(shares_pointer) != 0)
183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup,
184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "From function scan_shares_files in %s ", fullpath);
185287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
186287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	/* return val: -1 in case of function error, else 2 is min share value */
187287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak	if ((fmyshares = read_shares_file(mysharesfile)) < 2)
188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup, "in reading shares files  %s ",
189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 mysharesfile);
190287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((read_file(mytaskfile, GET_TASKS, &num_tasks)) < 0)
192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK, cleanup, "in reading tasks files  %s ",
193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 mytaskfile);
194287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exp_cpu_time = (double)(fmyshares * 100) / (total_shares * num_tasks);
196287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	prev_time = time(NULL);	/* Note down the time */
1983c744274b453bf857361a94a6950422215c529a9subrata_modak
199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (1) {
200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		/* Need to run some cpu intensive task, which also frequently checks the timer value */
201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		double f = 274.345, mytime;	/*just a float number to take sqrt */
202354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		alarm(TIME_INTERVAL);
2033c744274b453bf857361a94a6950422215c529a9subrata_modak		timer_expired = 0;
204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		while (!timer_expired)	/* Let the task run on cpu for TIME_INTERVAL */
205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			f = sqrt(f * f);	/* Time of this operation should not be high otherwise we can
206354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 * exceed the TIME_INTERVAL to measure cpu usage
207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 */
208354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		current_time = time(NULL);
209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		delta_time = current_time - prev_time;	/* Duration in case its not exact TIME_INTERVAL */
210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		getrusage(0, &cpu_usage);
212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		total_cpu_time = (cpu_usage.ru_utime.tv_sec + cpu_usage.ru_utime.tv_usec * 1e-6 +	/* user time */
213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  cpu_usage.ru_stime.tv_sec + cpu_usage.ru_stime.tv_usec * 1e-6);	/* system time */
2143c744274b453bf857361a94a6950422215c529a9subrata_modak		delta_cpu_time = total_cpu_time - prev_cpu_time;
2153c744274b453bf857361a94a6950422215c529a9subrata_modak
2163c744274b453bf857361a94a6950422215c529a9subrata_modak		prev_cpu_time = total_cpu_time;
2173c744274b453bf857361a94a6950422215c529a9subrata_modak		prev_time = current_time;
2188e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak
2198e843c6a701cc4de95ca6cc501ba5ee901be3a5asubrata_modak		/* calculate % cpu time each task gets */
2203c744274b453bf857361a94a6950422215c529a9subrata_modak		if (delta_time > TIME_INTERVAL)
221354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			mytime =
222354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    (delta_cpu_time * 100) / (delta_time * num_cpus);
2233c744274b453bf857361a94a6950422215c529a9subrata_modak		else
224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			mytime =
225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    (delta_cpu_time * 100) / (TIME_INTERVAL * num_cpus);
2263c744274b453bf857361a94a6950422215c529a9subrata_modak
227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fprintf(stdout, "Grp:-%3d task-%3d:CPU TIME{calc:-%6.2f(s)i.e. %6.2f(%%) exp:-%6.2f(%%)}\
228354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaowith %3u shares in %lu (s) INTERVAL\n", mygroup_num, task_num, delta_cpu_time,
229354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			mytime, exp_cpu_time, fmyshares, delta_time);
230287d18bf1010633ce7ce49daabb14f90bc7d997asubrata_modak
2313c744274b453bf857361a94a6950422215c529a9subrata_modak		counter++;
2323c744274b453bf857361a94a6950422215c529a9subrata_modak
233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (counter >= NUM_INTERVALS) {	/* Take n sets of readings for each shares value */
234354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			switch (test_num) {
235354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			case 9:	/* Test 09 */
236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				exit(0);	/* This task is done with its job */
2373c744274b453bf857361a94a6950422215c529a9subrata_modak				break;
238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			case 10:	/* Test 10 */
239354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				exit(0);	/* This task is done with its job */
24072d13509bbe99a677e7b764d4f2f39e2b03b2f81subrata_modak				break;
2413c744274b453bf857361a94a6950422215c529a9subrata_modak			default:
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_brkm(TBROK, cleanup,
243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "Invalid test number passed\n");
2443c744274b453bf857361a94a6950422215c529a9subrata_modak				break;
2453c744274b453bf857361a94a6950422215c529a9subrata_modak
246354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}	/* end switch */
247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}		/* end if */
248354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}			/* end while */
249354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}				/* end main */
250