idletime: maintain cpuset over lifetime of idle thread
authorJens Axboe <axboe@fb.com>
Wed, 28 Jan 2015 21:47:48 +0000 (14:47 -0700)
committerJens Axboe <axboe@fb.com>
Wed, 28 Jan 2015 21:47:48 +0000 (14:47 -0700)
Signed-off-by: Jens Axboe <axboe@fb.com>
idletime.c
idletime.h

index a366d2b16311bf6ec1b8e8d50fb84c44edc71eda..db272fe4331e5783b7c755c846e9b4a3f58d9c3d 100644 (file)
@@ -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;
 }
 
index 819da25e19a0819a44ed34a4190fc35c5f138256..bd6dcef022659979919d4c7778e0dfebb9cae6cc 100644 (file)
@@ -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 {