From 27c0b6fbc5ffe0979436a6436187d1bf952e9a24 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 5 Feb 2018 00:13:40 -0500 Subject: [PATCH] use futex instead of pthread cond variable for schedule --- include/linux/sched.h | 5 +---- linux/kthread.c | 2 -- linux/sched.c | 25 ++++++++++--------------- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 885cc56..38a5fec 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -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; diff --git a/linux/kthread.c b/linux/kthread.c index 80a9ac9..eef73fe 100644 --- a/linux/kthread.c +++ b/linux/kthread.c @@ -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); diff --git a/linux/sched.c b/linux/sched.c index cc614b1..2d61c48 100644 --- a/linux/sched.c +++ b/linux/sched.c @@ -1,4 +1,5 @@ +#include #include #include @@ -6,6 +7,7 @@ #include #include #include +#include #include __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(¤t->lock); - - while (current->state != TASK_RUNNING) - pthread_cond_wait(¤t->wait, ¤t->lock); + rcu_quiescent_state(); - pthread_mutex_unlock(¤t->lock); + while ((v = current->state) != TASK_RUNNING) + futex(¤t->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); -- 2.39.2