Initial Version
[qa-tools:mnts.git] / mnts-power-tests / src / check_tickless_busy.c
1 /*
2  * Copyright (C) 2009 Intel Corporation.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  * 
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
11  * for more details.  
12  * 
13  * You should have received a copy of the GNU General Public License along with
14  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15  * Place - Suite 330, Boston, MA 02111-1307 USA.
16  * 
17  * Authors:                                                               
18  *              Gong,Zhipeng  (zhipeng.gong@intel.com)
19  *
20  */
21  
22  
23
24
25
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <fcntl.h>
32 #define __USE_GNU
33 #include <pthread.h>
34 #include <semaphore.h>
35 #include <unistd.h>
36 #include <sched.h>
37 #include <time.h>
38
39 #define BUF_LEN 4096
40 #define TIMER_FLAG "Local timer"
41
42 volatile int ct_stop_workload = 0;
43 sem_t sem;
44
45 void *ct_cpu_workload_thread(void *cpu) {
46         cpu_set_t mask;
47         if ((int)cpu == 1) {
48                 printf("run cpu benchmark at CPU0\n");
49                 CPU_ZERO (&mask);
50                 CPU_SET (0, &mask);
51                 sched_setaffinity (0, sizeof(cpu_set_t), &mask);
52         }
53         printf("......start cpu workload......\n");
54         sem_post(&sem);
55     while (!ct_stop_workload) {
56             long long i = 2;
57             int j = 32;
58             while (j--) {
59                     i = i * 2;
60             }
61     }
62         printf("......stop cpu workload......\n");
63         if ((int) cpu == 1) {
64                 CPU_ZERO(&mask);
65                 sched_setaffinity(0, sizeof(cpu_set_t), &mask);
66         }
67     return NULL;
68 }
69
70 int read_timer_interrupts(unsigned long *timer1, unsigned long *timer2)
71 {
72         FILE *fd;
73         char buffer[BUF_LEN];
74         char str1[BUF_LEN],str4[BUF_LEN];
75
76         if ((fd = fopen("/proc/interrupts", "r")) == NULL) {
77                 perror("open");
78                 exit(2);
79         }       
80         
81         while ((fgets(buffer, BUF_LEN, fd)) != NULL) {
82                 if (strstr(buffer, TIMER_FLAG) != NULL) {
83                         sscanf(buffer, "%s %lu %lu %s", str1, timer1, timer2, str4);                    
84                         printf("\n-%s- -%lu- -%lu- -%s-\n", str1, *timer1, *timer2, str4);
85                 }
86         }
87         fclose(fd);
88         return 0;
89 }
90
91
92 int main(int argc, char *argv[])
93 {
94         pthread_t threadid;
95         unsigned long timer1_before, timer2_before, timer1_after, timer2_after;
96         int rc;
97         int config_hz;
98         sem_init(&sem, 0, 0);
99         clock_t clock_before, clock_after;
100
101         if (argc != 2) {
102                 printf("usage: %s config_hz\n", argv[0]);
103                 exit(2);
104         }
105         config_hz=atoi(argv[1]);
106         if (pthread_create(&threadid, NULL, ct_cpu_workload_thread, (void *)1) != 0) {
107                 perror("create");
108                 exit(2);
109         }
110         sem_wait(&sem);
111         printf("read timer interrupts\n");
112         read_timer_interrupts(&timer1_before,&timer2_before);
113         clock_before = clock();
114         sleep(1);
115         clock_after = clock();
116         read_timer_interrupts(&timer1_after,&timer2_after);
117         ct_stop_workload = 1;
118         printf("before\t %lu %lu\n", timer1_before, timer2_before);
119         printf("after\t %lu %lu\n", timer1_after, timer2_after);
120         printf("diff\t %lu %lu\n", timer1_after - timer1_before, timer2_after - timer2_before);
121         printf("clock\t %lu %lu %lu\n", (unsigned long)clock_before, 
122                         (unsigned long)clock_after, (unsigned long)(clock_after - clock_before));
123
124         pthread_join(threadid, NULL);
125         if (timer1_after - timer1_before >= ((config_hz * 90) / 100)) {
126                 rc = 0;
127         } else {
128                 rc = 1;
129         }
130         return rc;
131 }