summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-02-05 00:13:40 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-02-05 00:13:40 -0500
commit27c0b6fbc5ffe0979436a6436187d1bf952e9a24 (patch)
tree6978012f0721c356a50fa1455bb32ddd5bbc6074
parent7c29c458db133a8a5ad92b73c2a22561cd279da0 (diff)
use futex instead of pthread cond variable for schedule
-rw-r--r--include/linux/sched.h5
-rw-r--r--linux/kthread.c2
-rw-r--r--linux/sched.c25
3 files changed, 11 insertions, 21 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 885cc56c..38a5fecb 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 80a9ac9a..eef73fe8 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 cc614b12..2d61c480 100644
--- a/linux/sched.c
+++ b/linux/sched.c
@@ -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);