mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 13:41:30 +00:00
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler updates from Thomas Gleixner: - Cleanup and improvement of NUMA balancing - Refactoring and improvements to the PELT (Per Entity Load Tracking) code - Watchdog simplification and related cleanups - The usual pile of small incremental fixes and improvements * 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (41 commits) watchdog: Reduce message verbosity stop_machine: Reflow cpu_stop_queue_two_works() sched/numa: Move task_numa_placement() closer to numa_migrate_preferred() sched/numa: Use group_weights to identify if migration degrades locality sched/numa: Update the scan period without holding the numa_group lock sched/numa: Remove numa_has_capacity() sched/numa: Modify migrate_swap() to accept additional parameters sched/numa: Remove unused task_capacity from 'struct numa_stats' sched/numa: Skip nodes that are at 'hoplimit' sched/debug: Reverse the order of printing faults sched/numa: Use task faults only if numa_group is not yet set up sched/numa: Set preferred_node based on best_cpu sched/numa: Simplify load_too_imbalanced() sched/numa: Evaluate move once per node sched/numa: Remove redundant field sched/debug: Show the sum wait time of a task group sched/fair: Remove #ifdefs from scale_rt_capacity() sched/core: Remove get_cpu() from sched_fork() sched/cpufreq: Clarify sugov_get_util() sched/sysctl: Remove unused sched_time_avg_ms sysctl ...
This commit is contained in:
commit
f7951c33f0
38 changed files with 1015 additions and 876 deletions
|
@ -238,13 +238,24 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1,
|
|||
struct cpu_stopper *stopper2 = per_cpu_ptr(&cpu_stopper, cpu2);
|
||||
DEFINE_WAKE_Q(wakeq);
|
||||
int err;
|
||||
|
||||
retry:
|
||||
/*
|
||||
* The waking up of stopper threads has to happen in the same
|
||||
* scheduling context as the queueing. Otherwise, there is a
|
||||
* possibility of one of the above stoppers being woken up by another
|
||||
* CPU, and preempting us. This will cause us to not wake up the other
|
||||
* stopper forever.
|
||||
*/
|
||||
preempt_disable();
|
||||
raw_spin_lock_irq(&stopper1->lock);
|
||||
raw_spin_lock_nested(&stopper2->lock, SINGLE_DEPTH_NESTING);
|
||||
|
||||
err = -ENOENT;
|
||||
if (!stopper1->enabled || !stopper2->enabled)
|
||||
if (!stopper1->enabled || !stopper2->enabled) {
|
||||
err = -ENOENT;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure that if we race with __stop_cpus() the stoppers won't get
|
||||
* queued up in reverse order leading to system deadlock.
|
||||
|
@ -255,36 +266,30 @@ retry:
|
|||
* It can be falsely true but it is safe to spin until it is cleared,
|
||||
* queue_stop_cpus_work() does everything under preempt_disable().
|
||||
*/
|
||||
err = -EDEADLK;
|
||||
if (unlikely(stop_cpus_in_progress))
|
||||
goto unlock;
|
||||
if (unlikely(stop_cpus_in_progress)) {
|
||||
err = -EDEADLK;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
__cpu_stop_queue_work(stopper1, work1, &wakeq);
|
||||
__cpu_stop_queue_work(stopper2, work2, &wakeq);
|
||||
/*
|
||||
* The waking up of stopper threads has to happen
|
||||
* in the same scheduling context as the queueing.
|
||||
* Otherwise, there is a possibility of one of the
|
||||
* above stoppers being woken up by another CPU,
|
||||
* and preempting us. This will cause us to n ot
|
||||
* wake up the other stopper forever.
|
||||
*/
|
||||
preempt_disable();
|
||||
|
||||
unlock:
|
||||
raw_spin_unlock(&stopper2->lock);
|
||||
raw_spin_unlock_irq(&stopper1->lock);
|
||||
|
||||
if (unlikely(err == -EDEADLK)) {
|
||||
preempt_enable();
|
||||
|
||||
while (stop_cpus_in_progress)
|
||||
cpu_relax();
|
||||
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (!err) {
|
||||
wake_up_q(&wakeq);
|
||||
preempt_enable();
|
||||
}
|
||||
wake_up_q(&wakeq);
|
||||
preempt_enable();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue