Commit 84205d05 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] sync wakeup on UP

This fixes the scheduler's sync-wakeup code to be consistent on UP as
well.

Right now there's a behavioral difference between an UP kernel and an
SMP kernel running on a UP box: sync wakeups (which are only activated
on SMP) can cause a wakeup of a higher prio task, without preemption.
On UP kernels this does not happen.  This difference in wakeup behavior
is bad.

This patch activates sync wakeups on UP as well - in the cases sync
wakeups are done the waker knows that it will schedule away soon, so
this 'delay preemption' decision is correct on UP as well.
parent d1347e18
...@@ -111,15 +111,12 @@ extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int ...@@ -111,15 +111,12 @@ extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int
#define wake_up(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1) #define wake_up(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1)
#define wake_up_nr(x, nr) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr) #define wake_up_nr(x, nr) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr)
#define wake_up_all(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0) #define wake_up_all(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0)
#define wake_up_all_sync(x) __wake_up_sync((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0)
#define wake_up_interruptible(x) __wake_up((x),TASK_INTERRUPTIBLE, 1) #define wake_up_interruptible(x) __wake_up((x),TASK_INTERRUPTIBLE, 1)
#define wake_up_interruptible_nr(x, nr) __wake_up((x),TASK_INTERRUPTIBLE, nr) #define wake_up_interruptible_nr(x, nr) __wake_up((x),TASK_INTERRUPTIBLE, nr)
#define wake_up_interruptible_all(x) __wake_up((x),TASK_INTERRUPTIBLE, 0) #define wake_up_interruptible_all(x) __wake_up((x),TASK_INTERRUPTIBLE, 0)
#define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE) #define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
#ifdef CONFIG_SMP
#define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1) #define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
#else
#define wake_up_interruptible_sync(x) __wake_up((x),TASK_INTERRUPTIBLE, 1)
#endif
#define __wait_event(wq, condition) \ #define __wait_event(wq, condition) \
do { \ do { \
......
...@@ -1414,8 +1414,6 @@ void __wake_up_locked(wait_queue_head_t *q, unsigned int mode) ...@@ -1414,8 +1414,6 @@ void __wake_up_locked(wait_queue_head_t *q, unsigned int mode)
__wake_up_common(q, mode, 1, 0); __wake_up_common(q, mode, 1, 0);
} }
#ifdef CONFIG_SMP
/** /**
* __wake_up - sync- wake up threads blocked on a waitqueue. * __wake_up - sync- wake up threads blocked on a waitqueue.
* @q: the waitqueue * @q: the waitqueue
...@@ -1426,6 +1424,8 @@ void __wake_up_locked(wait_queue_head_t *q, unsigned int mode) ...@@ -1426,6 +1424,8 @@ void __wake_up_locked(wait_queue_head_t *q, unsigned int mode)
* away soon, so while the target thread will be woken up, it will not * away soon, so while the target thread will be woken up, it will not
* be migrated to another CPU - ie. the two threads are 'synchronized' * be migrated to another CPU - ie. the two threads are 'synchronized'
* with each other. This can prevent needless bouncing between CPUs. * with each other. This can prevent needless bouncing between CPUs.
*
* On UP it can prevent extra preemption.
*/ */
void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
{ {
...@@ -1442,8 +1442,6 @@ void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) ...@@ -1442,8 +1442,6 @@ void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
spin_unlock_irqrestore(&q->lock, flags); spin_unlock_irqrestore(&q->lock, flags);
} }
#endif
void complete(struct completion *x) void complete(struct completion *x)
{ {
unsigned long flags; unsigned long flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment