From: Jens Axboe Date: Wed, 28 Jan 2015 21:47:48 +0000 (-0700) Subject: idletime: maintain cpuset over lifetime of idle thread X-Git-Tag: fio-2.2.6~23 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=54ed125bb0deffa937286e64367ed8e4e94413f1 idletime: maintain cpuset over lifetime of idle thread Signed-off-by: Jens Axboe --- diff --git a/idletime.c b/idletime.c index a366d2b1..db272fe4 100644 --- a/idletime.c +++ b/idletime.c @@ -43,16 +43,26 @@ static double calibrate_unit(unsigned char *data) return tunit / CALIBRATE_SCALE; } +static void free_cpu_affinity(struct idle_prof_thread *ipt) +{ +#if defined(FIO_HAVE_CPU_AFFINITY) + fio_cpuset_exit(&ipt->cpu_mask); +#endif +} + static int set_cpu_affinity(struct idle_prof_thread *ipt) { #if defined(FIO_HAVE_CPU_AFFINITY) - os_cpu_mask_t cpu_mask; + if (fio_cpuset_init(&ipt->cpu_mask)) { + log_err("fio: cpuset init failed\n"); + return -1; + } - memset(&cpu_mask, 0, sizeof(cpu_mask)); - fio_cpu_set(&cpu_mask, ipt->cpu); + fio_cpu_set(&ipt->cpu_mask, ipt->cpu); - if (fio_setaffinity(gettid(), cpu_mask)) { + if (fio_setaffinity(gettid(), ipt->cpu_mask)) { log_err("fio: fio_setaffinity failed\n"); + fio_cpuset_exit(&ipt->cpu_mask); return -1; } @@ -98,7 +108,7 @@ static void *idle_prof_thread_fn(void *data) if (retval == -1) { ipt->state = TD_EXITED; pthread_mutex_unlock(&ipt->init_lock); - return NULL; + goto do_exit; } ipt->state = TD_INITIALIZED; @@ -113,13 +123,13 @@ static void *idle_prof_thread_fn(void *data) /* exit if other threads failed to initialize */ if (ipc.status == IDLE_PROF_STATUS_ABORT) { pthread_mutex_unlock(&ipt->start_lock); - return NULL; + goto do_exit; } /* exit if we are doing calibration only */ if (ipc.status == IDLE_PROF_STATUS_CALI_STOP) { pthread_mutex_unlock(&ipt->start_lock); - return NULL; + goto do_exit; } fio_gettime(&ipt->tps, NULL); @@ -143,6 +153,8 @@ idle_prof_done: ipt->state = TD_EXITED; pthread_mutex_unlock(&ipt->start_lock); +do_exit: + free_cpu_affinity(ipt); return NULL; } diff --git a/idletime.h b/idletime.h index 819da25e..bd6dcef0 100644 --- a/idletime.h +++ b/idletime.h @@ -34,6 +34,8 @@ struct idle_prof_thread { pthread_cond_t cond; pthread_mutex_t init_lock; pthread_mutex_t start_lock; + + os_cpu_mask_t cpu_mask; }; struct idle_prof_common {