summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@zip.com.au>2002-07-04 08:31:00 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-07-04 08:31:00 -0700
commitb5b6fa5267d4e0da8b2f46904cec4d4f11c45d2e (patch)
tree4309a6321e8eb764f479f92966f173543c5da064
parentb2bd3a26bbf30c69062d45de4622e7e5b412ad16 (diff)
[PATCH] set TASK_RUNNING in yield()
It seems that the yield() macro requires state TASK_RUNNING, but practically none of the callers remember to do that. The patch turns yield() into a real function which sets state TASK_RUNNING before scheduling.
-rw-r--r--drivers/net/e100/e100.h8
-rw-r--r--fs/buffer.c1
-rw-r--r--include/linux/sched.h3
-rw-r--r--kernel/ksyms.c2
-rw-r--r--kernel/sched.c6
-rw-r--r--kernel/softirq.c1
-rw-r--r--kernel/suspend.c3
-rw-r--r--mm/page_alloc.c1
8 files changed, 9 insertions, 16 deletions
diff --git a/drivers/net/e100/e100.h b/drivers/net/e100/e100.h
index 107a7a84cf3a..9e6b5d3d4e26 100644
--- a/drivers/net/e100/e100.h
+++ b/drivers/net/e100/e100.h
@@ -1031,14 +1031,6 @@ extern unsigned char e100_selftest(struct e100_private *bdp, u32 *st_timeout,
extern unsigned char e100_get_link_state(struct e100_private *bdp);
extern unsigned char e100_wait_scb(struct e100_private *bdp);
-#ifndef yield
-#define yield() \
- do { \
- current->policy |= SCHED_YIELD; \
- schedule(); \
- } while (0)
-#endif
-
extern void e100_deisolate_driver(struct e100_private *bdp,
u8 recover, u8 full_reset);
extern unsigned char e100_hw_reset_recover(struct e100_private *bdp,
diff --git a/fs/buffer.c b/fs/buffer.c
index 6ba5de4d2051..5558b4e7dde9 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -494,7 +494,6 @@ static void free_more_memory(void)
wakeup_bdflush();
try_to_free_pages(zone, GFP_NOFS, 0);
blk_run_queues();
- __set_current_state(TASK_RUNNING);
yield();
}
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 9b5af2cc11d2..29410b021b6c 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -418,8 +418,7 @@ extern int task_prio(task_t *p);
extern int task_nice(task_t *p);
extern int idle_cpu(int cpu);
-asmlinkage long sys_sched_yield(void);
-#define yield() sys_sched_yield()
+void yield(void);
/*
* The default (Linux) execution domain.
diff --git a/kernel/ksyms.c b/kernel/ksyms.c
index e88333d0c08b..65bc2fcac173 100644
--- a/kernel/ksyms.c
+++ b/kernel/ksyms.c
@@ -472,7 +472,7 @@ EXPORT_SYMBOL(schedule);
EXPORT_SYMBOL(preempt_schedule);
#endif
EXPORT_SYMBOL(schedule_timeout);
-EXPORT_SYMBOL(sys_sched_yield);
+EXPORT_SYMBOL(yield);
EXPORT_SYMBOL(__cond_resched);
EXPORT_SYMBOL(set_user_nice);
EXPORT_SYMBOL(task_nice);
diff --git a/kernel/sched.c b/kernel/sched.c
index 11ede675025f..8dfe1941e7e0 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1453,6 +1453,12 @@ void __cond_resched(void)
schedule();
}
+void yield(void)
+{
+ set_current_state(TASK_RUNNING);
+ sys_sched_yield();
+}
+
asmlinkage long sys_sched_get_priority_max(int policy)
{
int ret = -EINVAL;
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 3f233a3b3844..04f666d0e02b 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -262,7 +262,6 @@ void tasklet_kill(struct tasklet_struct *t)
printk("Attempt to kill tasklet from interrupt\n");
while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
- current->state = TASK_RUNNING;
do
yield();
while (test_bit(TASKLET_STATE_SCHED, &t->state));
diff --git a/kernel/suspend.c b/kernel/suspend.c
index 12e5b0f01f57..f4f389c566b4 100644
--- a/kernel/suspend.c
+++ b/kernel/suspend.c
@@ -237,8 +237,7 @@ int freeze_processes(void)
todo++;
}
read_unlock(&tasklist_lock);
- sys_sched_yield();
- schedule();
+ yield();
if (time_after(jiffies, start_time + TIMEOUT)) {
PRINTK( "\n" );
printk(KERN_ERR " stopping tasks failed (%d tasks remaining)\n", todo );
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index cf914bd8180b..4d50db51b1b6 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -441,7 +441,6 @@ nopage:
goto nopage;
/* Yield for kswapd, and try again */
- __set_current_state(TASK_RUNNING);
yield();
goto rebalance;
}