tools/intel_residency: use setitimer instead of {,u}alarm

It seems that Android doesn't have ualarm(). Let's use setitimer()
instead.

The tool still won't compile on Android due to igt_fb requiring Cairo,
but we're supposed to solve this in another patch since our igt_fb
calls don't actually require Cairo.

Reported-by: Derek Morton <derek.j.morton@intel.com>
Tested-by: Derek Morton <derek.j.morton@intel.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
This commit is contained in:
Paulo Zanoni 2016-01-25 19:36:25 -02:00
parent ec5deb218d
commit 3005665ead

View File

@ -23,6 +23,8 @@
* Authors: Paulo Zanoni <paulo.r.zanoni@intel.com> * Authors: Paulo Zanoni <paulo.r.zanoni@intel.com>
* *
*/ */
#include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
@ -311,6 +313,14 @@ static void setup_alarm(void)
sigaction(SIGALRM, &sa, NULL); sigaction(SIGALRM, &sa, NULL);
} }
static void set_alarm(time_t sec, suseconds_t usec)
{
struct itimerval timerval = {{0, 0}, {sec, usec}};
alarm_received = false;
igt_assert(setitimer(ITIMER_REAL, &timerval, NULL) == 0);
}
static void unset_mode(void) static void unset_mode(void)
{ {
int rc; int rc;
@ -370,8 +380,7 @@ static void wait_until_idle(void)
uint64_t tsc, pc, res; uint64_t tsc, pc, res;
do { do {
alarm_received = false; set_alarm(0, 500 * 1000);
ualarm(500 * 1000, 0);
tsc = msr_read(IA32_TIME_STAMP_COUNTER); tsc = msr_read(IA32_TIME_STAMP_COUNTER);
pc = msr_read(deepest_pc_state); pc = msr_read(deepest_pc_state);
@ -398,12 +407,10 @@ static uint64_t do_measurement(void (*callback)(void *ptr), void *ptr)
wait_until_idle(); wait_until_idle();
alarm_received = false; set_alarm(opts.res_warm_time, 0);
alarm(opts.res_warm_time);
callback(ptr); callback(ptr);
alarm_received = false; set_alarm(opts.res_calc_time, 0);
alarm(opts.res_calc_time);
tsc = msr_read(IA32_TIME_STAMP_COUNTER); tsc = msr_read(IA32_TIME_STAMP_COUNTER);
pc = msr_read(deepest_pc_state); pc = msr_read(deepest_pc_state);
@ -423,13 +430,11 @@ static void setup_idle(void)
for (retries = 0; ; retries++) { for (retries = 0; ; retries++) {
alarm_received = false; set_alarm(opts.res_warm_time, 0);
alarm(opts.res_warm_time);
while (!alarm_received) while (!alarm_received)
pause(); pause();
alarm_received = false; set_alarm(opts.res_calc_time, 0);
alarm(opts.res_calc_time);
tsc = msr_read(IA32_TIME_STAMP_COUNTER); tsc = msr_read(IA32_TIME_STAMP_COUNTER);
for (pc_i = best_pc_i; pc_i < NUM_PC_STATES; pc_i++) for (pc_i = best_pc_i; pc_i < NUM_PC_STATES; pc_i++)