mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 13:11:14 +00:00
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull smp hotplug updates from Thomas Gleixner: "This is the next part of the hotplug rework. - Convert all notifiers with a priority assigned - Convert all CPU_STARTING/DYING notifiers The final removal of the STARTING/DYING infrastructure will happen when the merge window closes. Another 700 hundred line of unpenetrable maze gone :)" * 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (70 commits) timers/core: Correct callback order during CPU hot plug leds/trigger/cpu: Move from CPU_STARTING to ONLINE level powerpc/numa: Convert to hotplug state machine arm/perf: Fix hotplug state machine conversion irqchip/armada: Avoid unused function warnings ARC/time: Convert to hotplug state machine clocksource/atlas7: Convert to hotplug state machine clocksource/armada-370-xp: Convert to hotplug state machine clocksource/exynos_mct: Convert to hotplug state machine clocksource/arm_global_timer: Convert to hotplug state machine rcu: Convert rcutree to hotplug state machine KVM/arm/arm64/vgic-new: Convert to hotplug state machine smp/cfd: Convert core to hotplug state machine x86/x2apic: Convert to CPU hotplug state machine profile: Convert to hotplug state machine timers/core: Convert to hotplug state machine hrtimer: Convert to hotplug state machine x86/tboot: Convert to hotplug state machine arm64/armv8 deprecated: Convert to hotplug state machine hwtracing/coresight-etm4x: Convert to hotplug state machine ...
This commit is contained in:
commit
a6408f6cb6
75 changed files with 1321 additions and 2018 deletions
|
@ -4607,84 +4607,65 @@ static void restore_unbound_workers_cpumask(struct worker_pool *pool, int cpu)
|
|||
WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, &cpumask) < 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Workqueues should be brought up before normal priority CPU notifiers.
|
||||
* This will be registered high priority CPU notifier.
|
||||
*/
|
||||
static int workqueue_cpu_up_callback(struct notifier_block *nfb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
int workqueue_prepare_cpu(unsigned int cpu)
|
||||
{
|
||||
struct worker_pool *pool;
|
||||
|
||||
for_each_cpu_worker_pool(pool, cpu) {
|
||||
if (pool->nr_workers)
|
||||
continue;
|
||||
if (!create_worker(pool))
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int workqueue_online_cpu(unsigned int cpu)
|
||||
{
|
||||
int cpu = (unsigned long)hcpu;
|
||||
struct worker_pool *pool;
|
||||
struct workqueue_struct *wq;
|
||||
int pi;
|
||||
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_UP_PREPARE:
|
||||
for_each_cpu_worker_pool(pool, cpu) {
|
||||
if (pool->nr_workers)
|
||||
continue;
|
||||
if (!create_worker(pool))
|
||||
return NOTIFY_BAD;
|
||||
}
|
||||
break;
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
|
||||
case CPU_DOWN_FAILED:
|
||||
case CPU_ONLINE:
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
for_each_pool(pool, pi) {
|
||||
mutex_lock(&pool->attach_mutex);
|
||||
|
||||
for_each_pool(pool, pi) {
|
||||
mutex_lock(&pool->attach_mutex);
|
||||
if (pool->cpu == cpu)
|
||||
rebind_workers(pool);
|
||||
else if (pool->cpu < 0)
|
||||
restore_unbound_workers_cpumask(pool, cpu);
|
||||
|
||||
if (pool->cpu == cpu)
|
||||
rebind_workers(pool);
|
||||
else if (pool->cpu < 0)
|
||||
restore_unbound_workers_cpumask(pool, cpu);
|
||||
|
||||
mutex_unlock(&pool->attach_mutex);
|
||||
}
|
||||
|
||||
/* update NUMA affinity of unbound workqueues */
|
||||
list_for_each_entry(wq, &workqueues, list)
|
||||
wq_update_unbound_numa(wq, cpu, true);
|
||||
|
||||
mutex_unlock(&wq_pool_mutex);
|
||||
break;
|
||||
mutex_unlock(&pool->attach_mutex);
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
|
||||
/* update NUMA affinity of unbound workqueues */
|
||||
list_for_each_entry(wq, &workqueues, list)
|
||||
wq_update_unbound_numa(wq, cpu, true);
|
||||
|
||||
mutex_unlock(&wq_pool_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Workqueues should be brought down after normal priority CPU notifiers.
|
||||
* This will be registered as low priority CPU notifier.
|
||||
*/
|
||||
static int workqueue_cpu_down_callback(struct notifier_block *nfb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
int workqueue_offline_cpu(unsigned int cpu)
|
||||
{
|
||||
int cpu = (unsigned long)hcpu;
|
||||
struct work_struct unbind_work;
|
||||
struct workqueue_struct *wq;
|
||||
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_DOWN_PREPARE:
|
||||
/* unbinding per-cpu workers should happen on the local CPU */
|
||||
INIT_WORK_ONSTACK(&unbind_work, wq_unbind_fn);
|
||||
queue_work_on(cpu, system_highpri_wq, &unbind_work);
|
||||
/* unbinding per-cpu workers should happen on the local CPU */
|
||||
INIT_WORK_ONSTACK(&unbind_work, wq_unbind_fn);
|
||||
queue_work_on(cpu, system_highpri_wq, &unbind_work);
|
||||
|
||||
/* update NUMA affinity of unbound workqueues */
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
list_for_each_entry(wq, &workqueues, list)
|
||||
wq_update_unbound_numa(wq, cpu, false);
|
||||
mutex_unlock(&wq_pool_mutex);
|
||||
/* update NUMA affinity of unbound workqueues */
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
list_for_each_entry(wq, &workqueues, list)
|
||||
wq_update_unbound_numa(wq, cpu, false);
|
||||
mutex_unlock(&wq_pool_mutex);
|
||||
|
||||
/* wait for per-cpu unbinding to finish */
|
||||
flush_work(&unbind_work);
|
||||
destroy_work_on_stack(&unbind_work);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
/* wait for per-cpu unbinding to finish */
|
||||
flush_work(&unbind_work);
|
||||
destroy_work_on_stack(&unbind_work);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -5486,9 +5467,6 @@ static int __init init_workqueues(void)
|
|||
|
||||
pwq_cache = KMEM_CACHE(pool_workqueue, SLAB_PANIC);
|
||||
|
||||
cpu_notifier(workqueue_cpu_up_callback, CPU_PRI_WORKQUEUE_UP);
|
||||
hotcpu_notifier(workqueue_cpu_down_callback, CPU_PRI_WORKQUEUE_DOWN);
|
||||
|
||||
wq_numa_init();
|
||||
|
||||
/* initialize CPU pools */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue