Commit 232dbd9f authored by Anton Blanchard's avatar Anton Blanchard

Merge samba.org:/scratch/anton/linux-2.5

into samba.org:/scratch/anton/sfr
parents e2f14013 f2478c00
VERSION = 2 VERSION = 2
PATCHLEVEL = 5 PATCHLEVEL = 5
SUBLEVEL = 59 SUBLEVEL = 60
EXTRAVERSION = EXTRAVERSION =
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -110,7 +110,7 @@ config QDIO ...@@ -110,7 +110,7 @@ config QDIO
This driver is also available as a module ( = code which can be This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want). inserted in and removed from the running kernel whenever you want).
The module will be called qdio.o. If you want to compile it as a The module will be called qdio. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
If unsure, say Y. If unsure, say Y.
...@@ -210,7 +210,7 @@ config BINFMT_ELF ...@@ -210,7 +210,7 @@ config BINFMT_ELF
If you want to compile this as a module ( = code which can be If you want to compile this as a module ( = code which can be
inserted in and removed from the running kernel whenever you want), inserted in and removed from the running kernel whenever you want),
say M here and read <file:Documentation/modules.txt>. The module say M here and read <file:Documentation/modules.txt>. The module
will be called binfmt_elf.o. Saying M or N here is dangerous because will be called binfmt_elf. Saying M or N here is dangerous because
some crucial programs on your system might be in ELF format. some crucial programs on your system might be in ELF format.
config BINFMT_MISC config BINFMT_MISC
...@@ -235,7 +235,7 @@ config BINFMT_MISC ...@@ -235,7 +235,7 @@ config BINFMT_MISC
use this part of the kernel. use this part of the kernel.
You may say M here for module support and later load the module when You may say M here for module support and later load the module when
you have use for it; the module is called binfmt_misc.o. If you you have use for it; the module is called binfmt_misc. If you
don't know what to answer at this point, say Y. don't know what to answer at this point, say Y.
config PROCESS_DEBUG config PROCESS_DEBUG
......
...@@ -124,7 +124,7 @@ config QDIO ...@@ -124,7 +124,7 @@ config QDIO
This driver is also available as a module ( = code which can be This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want). inserted in and removed from the running kernel whenever you want).
The module will be called qdio.o. If you want to compile it as a The module will be called qdio. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
If unsure, say Y. If unsure, say Y.
...@@ -224,7 +224,7 @@ config BINFMT_ELF ...@@ -224,7 +224,7 @@ config BINFMT_ELF
If you want to compile this as a module ( = code which can be If you want to compile this as a module ( = code which can be
inserted in and removed from the running kernel whenever you want), inserted in and removed from the running kernel whenever you want),
say M here and read <file:Documentation/modules.txt>. The module say M here and read <file:Documentation/modules.txt>. The module
will be called binfmt_elf.o. Saying M or N here is dangerous because will be called binfmt_elf. Saying M or N here is dangerous because
some crucial programs on your system might be in ELF format. some crucial programs on your system might be in ELF format.
config BINFMT_MISC config BINFMT_MISC
...@@ -249,7 +249,7 @@ config BINFMT_MISC ...@@ -249,7 +249,7 @@ config BINFMT_MISC
use this part of the kernel. use this part of the kernel.
You may say M here for module support and later load the module when You may say M here for module support and later load the module when
you have use for it; the module is called binfmt_misc.o. If you you have use for it; the module is called binfmt_misc. If you
don't know what to answer at this point, say Y. don't know what to answer at this point, say Y.
config PROCESS_DEBUG config PROCESS_DEBUG
......
...@@ -311,7 +311,7 @@ config SC520_WDT ...@@ -311,7 +311,7 @@ config SC520_WDT
amount of time. amount of time.
You can compile this driver directly into the kernel, or use You can compile this driver directly into the kernel, or use
it as a module. The module will be called sc520_wdt.o. it as a module. The module will be called sc520_wdt.
config ALIM7101_WDT config ALIM7101_WDT
tristate "ALi M7101 PMU Computer Watchdog" tristate "ALi M7101 PMU Computer Watchdog"
...@@ -322,7 +322,7 @@ config ALIM7101_WDT ...@@ -322,7 +322,7 @@ config ALIM7101_WDT
This driver is also available as a module ( = code which can be This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want). inserted in and removed from the running kernel whenever you want).
The module is called alim7101_wdt.o. If you want to compile it as a The module is called alim7101_wdt. If you want to compile it as a
module, say M here and read Documentation/modules.txt. Most module, say M here and read Documentation/modules.txt. Most
people will say N. people will say N.
...@@ -337,7 +337,7 @@ config SC1200_WDT ...@@ -337,7 +337,7 @@ config SC1200_WDT
This driver is also available as a module ( = code which can be This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want). inserted in and removed from the running kernel whenever you want).
The module is called sc1200wdt.o. If you want to compile it as a The module is called sc1200wdt. If you want to compile it as a
module, say M here and read Documentation/modules.txt. Most module, say M here and read Documentation/modules.txt. Most
people will say N. people will say N.
......
...@@ -152,7 +152,7 @@ config ITE_I2C_ALGO ...@@ -152,7 +152,7 @@ config ITE_I2C_ALGO
This support is also available as a module. If you want to compile This support is also available as a module. If you want to compile
it as a module, say M here and read Documentation/modules.txt. it as a module, say M here and read Documentation/modules.txt.
The module will be called i2c-algo-ite.o. The module will be called i2c-algo-ite.
config ITE_I2C_ADAP config ITE_I2C_ADAP
tristate "ITE I2C Adapter" tristate "ITE I2C Adapter"
...@@ -164,7 +164,7 @@ config ITE_I2C_ADAP ...@@ -164,7 +164,7 @@ config ITE_I2C_ADAP
This support is also available as a module. If you want to compile This support is also available as a module. If you want to compile
it as a module, say M here and read Documentation/modules.txt. it as a module, say M here and read Documentation/modules.txt.
The module will be called i2c-adap-ite.o. The module will be called i2c-adap-ite.
config I2C_ALGO8XX config I2C_ALGO8XX
tristate "MPC8xx CPM I2C interface" tristate "MPC8xx CPM I2C interface"
......
...@@ -516,6 +516,7 @@ extern unsigned long itimer_ticks; ...@@ -516,6 +516,7 @@ extern unsigned long itimer_ticks;
extern unsigned long itimer_next; extern unsigned long itimer_next;
extern void do_timer(struct pt_regs *); extern void do_timer(struct pt_regs *);
extern int FASTCALL(wake_up_state(struct task_struct * tsk, unsigned int state));
extern int FASTCALL(wake_up_process(struct task_struct * tsk)); extern int FASTCALL(wake_up_process(struct task_struct * tsk));
extern void FASTCALL(wake_up_forked_process(struct task_struct * tsk)); extern void FASTCALL(wake_up_forked_process(struct task_struct * tsk));
extern void FASTCALL(sched_exit(task_t * p)); extern void FASTCALL(sched_exit(task_t * p));
......
...@@ -438,6 +438,7 @@ void kick_if_running(task_t * p) ...@@ -438,6 +438,7 @@ void kick_if_running(task_t * p)
/*** /***
* try_to_wake_up - wake up a thread * try_to_wake_up - wake up a thread
* @p: the to-be-woken-up thread * @p: the to-be-woken-up thread
* @state: the mask of task states that can be woken
* @sync: do a synchronous wakeup? * @sync: do a synchronous wakeup?
* *
* Put it on the run-queue if it's not already there. The "current" * Put it on the run-queue if it's not already there. The "current"
...@@ -448,7 +449,7 @@ void kick_if_running(task_t * p) ...@@ -448,7 +449,7 @@ void kick_if_running(task_t * p)
* *
* returns failure only if the task is already active. * returns failure only if the task is already active.
*/ */
static int try_to_wake_up(task_t * p, int sync) static int try_to_wake_up(task_t * p, unsigned int state, int sync)
{ {
unsigned long flags; unsigned long flags;
int success = 0; int success = 0;
...@@ -458,28 +459,30 @@ static int try_to_wake_up(task_t * p, int sync) ...@@ -458,28 +459,30 @@ static int try_to_wake_up(task_t * p, int sync)
repeat_lock_task: repeat_lock_task:
rq = task_rq_lock(p, &flags); rq = task_rq_lock(p, &flags);
old_state = p->state; old_state = p->state;
if (!p->array) { if (old_state & state) {
/* if (!p->array) {
* Fast-migrate the task if it's not running or runnable /*
* currently. Do not violate hard affinity. * Fast-migrate the task if it's not running or runnable
*/ * currently. Do not violate hard affinity.
if (unlikely(sync && !task_running(rq, p) && */
(task_cpu(p) != smp_processor_id()) && if (unlikely(sync && !task_running(rq, p) &&
(p->cpus_allowed & (1UL << smp_processor_id())))) { (task_cpu(p) != smp_processor_id()) &&
(p->cpus_allowed & (1UL << smp_processor_id())))) {
set_task_cpu(p, smp_processor_id());
task_rq_unlock(rq, &flags); set_task_cpu(p, smp_processor_id());
goto repeat_lock_task; task_rq_unlock(rq, &flags);
goto repeat_lock_task;
}
if (old_state == TASK_UNINTERRUPTIBLE)
rq->nr_uninterruptible--;
activate_task(p, rq);
if (p->prio < rq->curr->prio)
resched_task(rq->curr);
success = 1;
} }
if (old_state == TASK_UNINTERRUPTIBLE) p->state = TASK_RUNNING;
rq->nr_uninterruptible--;
activate_task(p, rq);
if (p->prio < rq->curr->prio)
resched_task(rq->curr);
success = 1;
} }
p->state = TASK_RUNNING;
task_rq_unlock(rq, &flags); task_rq_unlock(rq, &flags);
return success; return success;
...@@ -487,7 +490,12 @@ static int try_to_wake_up(task_t * p, int sync) ...@@ -487,7 +490,12 @@ static int try_to_wake_up(task_t * p, int sync)
int wake_up_process(task_t * p) int wake_up_process(task_t * p)
{ {
return try_to_wake_up(p, 0); return try_to_wake_up(p, TASK_STOPPED | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0);
}
int wake_up_state(task_t *p, unsigned int state)
{
return try_to_wake_up(p, state, 0);
} }
/* /*
...@@ -1263,7 +1271,7 @@ asmlinkage void preempt_schedule(void) ...@@ -1263,7 +1271,7 @@ asmlinkage void preempt_schedule(void)
int default_wake_function(wait_queue_t *curr, unsigned mode, int sync) int default_wake_function(wait_queue_t *curr, unsigned mode, int sync)
{ {
task_t *p = curr->task; task_t *p = curr->task;
return ((p->state & mode) && try_to_wake_up(p, sync)); return try_to_wake_up(p, mode, sync);
} }
/* /*
...@@ -2418,7 +2426,7 @@ void __init sched_init(void) ...@@ -2418,7 +2426,7 @@ void __init sched_init(void)
rq->curr = current; rq->curr = current;
rq->idle = current; rq->idle = current;
set_task_cpu(current, smp_processor_id()); set_task_cpu(current, smp_processor_id());
wake_up_process(current); wake_up_forked_process(current);
init_timers(); init_timers();
......
...@@ -620,13 +620,8 @@ static void handle_stop_signal(int sig, struct task_struct *p) ...@@ -620,13 +620,8 @@ static void handle_stop_signal(int sig, struct task_struct *p)
t = p; t = p;
do { do {
rm_from_queue(SIG_KERNEL_STOP_MASK, &t->pending); rm_from_queue(SIG_KERNEL_STOP_MASK, &t->pending);
/* /*
* This wakeup is only need if in TASK_STOPPED,
* but there can be SMP races with testing for that.
* In the normal SIGCONT case, all will be stopped.
* A spuriously sent SIGCONT will interrupt all running
* threads to check signals even if it's ignored.
*
* If there is a handler for SIGCONT, we must make * If there is a handler for SIGCONT, we must make
* sure that no thread returns to user mode before * sure that no thread returns to user mode before
* we post the signal, in case it was the only * we post the signal, in case it was the only
...@@ -636,12 +631,14 @@ static void handle_stop_signal(int sig, struct task_struct *p) ...@@ -636,12 +631,14 @@ static void handle_stop_signal(int sig, struct task_struct *p)
* flag set, the thread will pause and acquire the * flag set, the thread will pause and acquire the
* siglock that we hold now and until we've queued * siglock that we hold now and until we've queued
* the pending signal. * the pending signal.
*
* Wake up the stopped thread _after_ setting
* TIF_SIGPENDING
*/ */
if (!(t->flags & PF_EXITING)) { if (!sigismember(&t->blocked, SIGCONT))
if (!sigismember(&t->blocked, SIGCONT)) set_tsk_thread_flag(t, TIF_SIGPENDING);
set_tsk_thread_flag(t, TIF_SIGPENDING); wake_up_state(t, TASK_STOPPED);
wake_up_process(t);
}
t = next_thread(t); t = next_thread(t);
} while (t != p); } while (t != p);
} }
......
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