|
@@ -110,7 +110,7 @@ static int smpboot_thread_fn(void *data)
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
preempt_disable();
|
|
preempt_disable();
|
|
if (kthread_should_stop()) {
|
|
if (kthread_should_stop()) {
|
|
- set_current_state(TASK_RUNNING);
|
|
|
|
|
|
+ __set_current_state(TASK_RUNNING);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
if (ht->cleanup)
|
|
if (ht->cleanup)
|
|
ht->cleanup(td->cpu, cpu_online(td->cpu));
|
|
ht->cleanup(td->cpu, cpu_online(td->cpu));
|
|
@@ -136,26 +136,27 @@ static int smpboot_thread_fn(void *data)
|
|
/* Check for state change setup */
|
|
/* Check for state change setup */
|
|
switch (td->status) {
|
|
switch (td->status) {
|
|
case HP_THREAD_NONE:
|
|
case HP_THREAD_NONE:
|
|
|
|
+ __set_current_state(TASK_RUNNING);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
if (ht->setup)
|
|
if (ht->setup)
|
|
ht->setup(td->cpu);
|
|
ht->setup(td->cpu);
|
|
td->status = HP_THREAD_ACTIVE;
|
|
td->status = HP_THREAD_ACTIVE;
|
|
- preempt_disable();
|
|
|
|
- break;
|
|
|
|
|
|
+ continue;
|
|
|
|
+
|
|
case HP_THREAD_PARKED:
|
|
case HP_THREAD_PARKED:
|
|
|
|
+ __set_current_state(TASK_RUNNING);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
if (ht->unpark)
|
|
if (ht->unpark)
|
|
ht->unpark(td->cpu);
|
|
ht->unpark(td->cpu);
|
|
td->status = HP_THREAD_ACTIVE;
|
|
td->status = HP_THREAD_ACTIVE;
|
|
- preempt_disable();
|
|
|
|
- break;
|
|
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
|
|
if (!ht->thread_should_run(td->cpu)) {
|
|
if (!ht->thread_should_run(td->cpu)) {
|
|
- preempt_enable();
|
|
|
|
|
|
+ preempt_enable_no_resched();
|
|
schedule();
|
|
schedule();
|
|
} else {
|
|
} else {
|
|
- set_current_state(TASK_RUNNING);
|
|
|
|
|
|
+ __set_current_state(TASK_RUNNING);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
ht->thread_fn(td->cpu);
|
|
ht->thread_fn(td->cpu);
|
|
}
|
|
}
|