cpuctl_latency_check_task.c revision 4548c6cf9bcdd96d8303caa4130ab638b61f8a30
1/******************************************************************************/
2/*                                                                            */
3/* Copyright (c) International Business Machines  Corp., 2008                 */
4/*                                                                            */
5/* This program is free software;  you can redistribute it and/or modify      */
6/* it under the terms of the GNU General Public License as published by       */
7/* the Free Software Foundation; either version 2 of the License, or          */
8/* (at your option) any later version.                                        */
9/*                                                                            */
10/* This program is distributed in the hope that it will be useful,            */
11/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
12/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
13/* the GNU General Public License for more details.                           */
14/*                                                                            */
15/* You should have received a copy of the GNU General Public License          */
16/* along with this program;  if not, write to the Free Software               */
17/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
18/*                                                                            */
19/******************************************************************************/
20
21/******************************************************************************/
22/*                                                                            */
23/* File:        cpuctl_latency_check_task.c                                   */
24/*                                                                            */
25/* Description: This is a c program that runs a task which does frequent sleep*/
26/*              on a busy machine and checks if there is any added latency    */
27/*              The file is to be used by script                              */
28/*                                                                            */
29/* Total Tests: 1                                                             */
30/*                                                                            */
31/* Test Name:   cpu_controller_latency_tests                                  */
32/*                                                                            */
33/* Test Assertion                                                             */
34/*              Please refer to the file cpuctl_testplan.txt                  */
35/*                                                                            */
36/* Author:      Sudhir Kumar skumar@linux.vnet.ibm.com                        */
37/*                                                                            */
38/* History:                                                                   */
39/* Created-     26/11/2008 -Sudhir Kumar <skumar@linux.vnet.ibm.com>          */
40/*                                                                            */
41/******************************************************************************/
42
43#include <unistd.h>
44#include <math.h>
45#include <signal.h>
46#include <stdio.h>
47#include <stdlib.h>
48#include <sys/time.h>
49#include <string.h>
50
51#include "../libcontrollers/libcontrollers.h"
52
53/* #define VERBOSE	1 to print verbose output */
54
55#ifdef VERBOSE
56#define verbose(x...) printf(x)
57#else
58#define verbose(x...) do {} while (0);
59#endif
60
61#define NUM_TIMES 200 /* How many intervals you want to check*/
62#define INTERVALS 1  /* How many milliseconds interval in iterations*/
63#define USECONDS  1000  /* microseconds to sleep*/
64#define info	printf("The results FAIL is just intuitive and not exact" \
65		" failure. Please look at cpuctl_testplan.txt in the test directory.\n");
66
67char *TCID = "cpuctl_latency_tests";
68int TST_COUNT = 1;
69int TST_TOTAL = 1;
70pid_t script_pid;
71
72int main(int argc, char *argv[])
73{
74	int count, i = 0, iteration = 0;
75	int fail = 0, ALLOWED;
76	char mytaskfile[FILENAME_MAX];
77	int test_num;
78	struct timeval prev_time, cur_time;
79	unsigned int actual, actual_s, actual_us, sleeptime;
80	unsigned int delta, delta_max = 0;
81	pid_t script_pid;
82
83	if ((argc < 4) || (argc > 5)) {
84		printf("Invalid #args received from script. Exiting test..\n");
85		exit(1);
86	}
87
88	test_num = atoi(argv[1]);
89	script_pid = (pid_t) atoi(argv[2]);
90	ALLOWED = atoi(argv[3]);
91	if ((test_num < 0) || (script_pid < 0) || (ALLOWED < 0)) {
92		printf("Invalid args received from script. Exiting test..\n");
93		exit(1);
94	}
95
96	if (test_num == 2) {
97		strncpy(mytaskfile, argv[4], FILENAME_MAX);
98		strncat(mytaskfile, "/tasks",
99					 FILENAME_MAX - strlen(mytaskfile) - 1);
100		write_to_file(mytaskfile, "a", getpid());
101
102		/* Give a chance to other tasks too to go to their class */
103		sleep(8);
104	}
105
106	printf("TINFO \tThe latency check task started\n");
107
108	/* Let us start capturing the time now */
109	for (count = NUM_TIMES; count >= 0 ; count -= INTERVALS) {
110		if (gettimeofday(&prev_time, NULL) == -1)
111			perror("In Iteration no 1 \n");
112		/* sleep for specified time */
113		sleeptime = count * USECONDS;
114		usleep(sleeptime);
115
116		if (gettimeofday(&cur_time, NULL) == -1)
117			perror("In Iteration no 1 \n");
118
119		/* Get the actual difference */
120		actual_s = cur_time.tv_sec - prev_time.tv_sec;
121		actual_us = cur_time.tv_usec - prev_time.tv_usec;
122		actual = 1e6 * actual_s + actual_us;
123		delta = actual - sleeptime;
124
125		/*  capture the maximum latency observed */
126		if (delta >= delta_max) {
127			delta_max = delta;
128			iteration = i;
129		}
130
131		if (delta > ALLOWED)
132			fail = 1;
133
134		verbose("Iteration %d: Exp(us) =%u, Actual =%u delta = %u\n",
135						 i++, sleeptime, actual, delta);
136	}
137
138	if (fail) {
139		printf("FAIL \tThe Latency test %d failed\n", test_num);
140		printf("Max latency observed = %u in Iteration %d\n",
141							 delta_max, iteration);
142		info;
143	} else {
144		printf("PASS \tThe Latency test %d passed\n", test_num);
145		printf("Max latency observed = %u microsec in Iteration %d\n",
146							 delta_max, iteration);
147	}
148	return fail;
149}
150