git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge to Fedora kernel-2.6.17-1.2187_FC5 patched with stable patch-2.6.17.13-vs2...
[linux-2.6.git]
/
kernel
/
sched.c
diff --git
a/kernel/sched.c
b/kernel/sched.c
index
60bff8b
..
026ba1f
100644
(file)
--- a/
kernel/sched.c
+++ b/
kernel/sched.c
@@
-4189,17
+4189,22
@@
asmlinkage long sys_sched_yield(void)
return 0;
}
return 0;
}
-static inline void __cond_resched(void)
+static inline int __resched_legal(int expected_preempt_count)
+{
+ if (unlikely(preempt_count() != expected_preempt_count))
+ return 0;
+ if (unlikely(system_state != SYSTEM_RUNNING))
+ return 0;
+ return 1;
+}
+
+static void __cond_resched(void)
{
/*
* The BKS might be reacquired before we have dropped
* PREEMPT_ACTIVE, which could trigger a second
* cond_resched() call.
*/
{
/*
* The BKS might be reacquired before we have dropped
* PREEMPT_ACTIVE, which could trigger a second
* cond_resched() call.
*/
- if (unlikely(preempt_count()))
- return;
- if (unlikely(system_state != SYSTEM_RUNNING))
- return;
do {
add_preempt_count(PREEMPT_ACTIVE);
schedule();
do {
add_preempt_count(PREEMPT_ACTIVE);
schedule();
@@
-4209,13
+4214,12
@@
static inline void __cond_resched(void)
int __sched cond_resched(void)
{
int __sched cond_resched(void)
{
- if (need_resched()) {
+ if (need_resched()
&& __resched_legal(0)
) {
__cond_resched();
return 1;
}
return 0;
}
__cond_resched();
return 1;
}
return 0;
}
-
EXPORT_SYMBOL(cond_resched);
/*
EXPORT_SYMBOL(cond_resched);
/*
@@
-4236,7
+4240,7
@@
int cond_resched_lock(spinlock_t *lock)
ret = 1;
spin_lock(lock);
}
ret = 1;
spin_lock(lock);
}
- if (need_resched()) {
+ if (need_resched()
&& __resched_legal(1)
) {
_raw_spin_unlock(lock);
preempt_enable_no_resched();
__cond_resched();
_raw_spin_unlock(lock);
preempt_enable_no_resched();
__cond_resched();
@@
-4245,14
+4249,13
@@
int cond_resched_lock(spinlock_t *lock)
}
return ret;
}
}
return ret;
}
-
EXPORT_SYMBOL(cond_resched_lock);
int __sched cond_resched_softirq(void)
{
BUG_ON(!in_softirq());
EXPORT_SYMBOL(cond_resched_lock);
int __sched cond_resched_softirq(void)
{
BUG_ON(!in_softirq());
- if (need_resched()) {
+ if (need_resched()
&& __resched_legal(0)
) {
__local_bh_enable();
__cond_resched();
local_bh_disable();
__local_bh_enable();
__cond_resched();
local_bh_disable();
@@
-4260,10
+4263,8
@@
int __sched cond_resched_softirq(void)
}
return 0;
}
}
return 0;
}
-
EXPORT_SYMBOL(cond_resched_softirq);
EXPORT_SYMBOL(cond_resched_softirq);
-
/**
* yield - yield the current processor to other threads.
*
/**
* yield - yield the current processor to other threads.
*