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
67 char *TCID = "cpuctl_latency_tests";
68 int TST_COUNT = 1;
69 int TST_TOTAL = 1;
70 pid_t script_pid;
71
main(int argc,char * argv[])72 int 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