]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
use futex instead of pthread cond variable for schedule
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 5 Feb 2018 05:13:40 +0000 (00:13 -0500)
committerKent Overstreet <kent.overstreet@gmail.com>
Mon, 5 Feb 2018 05:13:40 +0000 (00:13 -0500)
include/linux/sched.h
linux/kthread.c
linux/sched.c

index 885cc56c8c4557cfa13251f4490332e42f0cd25c..38a5fecb46d4827b9e87c742c2f60ce0b8704938 100644 (file)
@@ -74,11 +74,8 @@ struct task_struct {
        int                     (*thread_fn)(void *);
        void                    *thread_data;
 
-       pthread_mutex_t         lock;
-       pthread_cond_t          wait;
-
        atomic_t                usage;
-       volatile long           state;
+       int                     state;
 
        /* kthread: */
        unsigned long           kthread_flags;
index 80a9ac9a85d26e702f620cb934a53da1497ea382..eef73fe8632eb7c017d3a9a849bbf2e356838748 100644 (file)
@@ -68,8 +68,6 @@ struct task_struct *kthread_create(int (*thread_fn)(void *data),
        p->thread_fn    = thread_fn;
        p->thread_data  = thread_data;
        p->state        = TASK_UNINTERRUPTIBLE;
-       pthread_mutex_init(&p->lock, NULL);
-       pthread_cond_init(&p->wait, NULL);
        atomic_set(&p->usage, 1);
        init_completion(&p->exited);
 
index cc614b123ba36408176b70293204ec5e7d0725b6..2d61c480d5532c2074ecbdd181bab7e0e083d802 100644 (file)
@@ -1,4 +1,5 @@
 
+#include <linux/futex.h>
 #include <string.h>
 #include <sys/mman.h>
 
@@ -6,6 +7,7 @@
 #include <linux/printk.h>
 #include <linux/rcupdate.h>
 #include <linux/sched.h>
+#include <linux/slab.h>
 #include <linux/timer.h>
 
 __thread struct task_struct *current;
@@ -19,28 +21,23 @@ void __put_task_struct(struct task_struct *t)
 /* returns true if process was woken up, false if it was already running */
 int wake_up_process(struct task_struct *p)
 {
-       int ret;
+       int ret = p->state != TASK_RUNNING;
 
-       pthread_mutex_lock(&p->lock);
-       ret = p->state != TASK_RUNNING;
        p->state = TASK_RUNNING;
-
-       pthread_cond_signal(&p->wait);
-       pthread_mutex_unlock(&p->lock);
-
+       futex(&p->state, FUTEX_WAKE|FUTEX_PRIVATE_FLAG,
+             INT_MAX, NULL, NULL, 0);
        return ret;
 }
 
 void schedule(void)
 {
-       rcu_quiescent_state();
+       int v;
 
-       pthread_mutex_lock(&current->lock);
-
-       while (current->state != TASK_RUNNING)
-               pthread_cond_wait(&current->wait, &current->lock);
+       rcu_quiescent_state();
 
-       pthread_mutex_unlock(&current->lock);
+       while ((v = current->state) != TASK_RUNNING)
+               futex(&current->state, FUTEX_WAIT|FUTEX_PRIVATE_FLAG,
+                     v, NULL, NULL, 0);
 }
 
 static void process_timeout(unsigned long __data)
@@ -169,8 +166,6 @@ static void sched_init(void)
        memset(p, 0, sizeof(*p));
 
        p->state        = TASK_RUNNING;
-       pthread_mutex_init(&p->lock, NULL);
-       pthread_cond_init(&p->wait, NULL);
        atomic_set(&p->usage, 1);
        init_completion(&p->exited);