Merge tag 'smp-urgent-2023-09-02' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull CPU hotplug fix from Ingo Molnar: "Fix a CPU hotplug related deadlock between the task which initiates and controls a CPU hot-unplug operation vs. the CFS bandwidth timer" * tag 'smp-urgent-2023-09-02' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: cpu/hotplug: Prevent self deadlock on CPU hot-unplug
This commit is contained in:
+23
-1
@@ -1487,8 +1487,22 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct cpu_down_work {
|
||||
unsigned int cpu;
|
||||
enum cpuhp_state target;
|
||||
};
|
||||
|
||||
static long __cpu_down_maps_locked(void *arg)
|
||||
{
|
||||
struct cpu_down_work *work = arg;
|
||||
|
||||
return _cpu_down(work->cpu, 0, work->target);
|
||||
}
|
||||
|
||||
static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
|
||||
{
|
||||
struct cpu_down_work work = { .cpu = cpu, .target = target, };
|
||||
|
||||
/*
|
||||
* If the platform does not support hotplug, report it explicitly to
|
||||
* differentiate it from a transient offlining failure.
|
||||
@@ -1497,7 +1511,15 @@ static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
|
||||
return -EOPNOTSUPP;
|
||||
if (cpu_hotplug_disabled)
|
||||
return -EBUSY;
|
||||
return _cpu_down(cpu, 0, target);
|
||||
|
||||
/*
|
||||
* Ensure that the control task does not run on the to be offlined
|
||||
* CPU to prevent a deadlock against cfs_b->period_timer.
|
||||
*/
|
||||
cpu = cpumask_any_but(cpu_online_mask, cpu);
|
||||
if (cpu >= nr_cpu_ids)
|
||||
return -EBUSY;
|
||||
return work_on_cpu(cpu, __cpu_down_maps_locked, &work);
|
||||
}
|
||||
|
||||
static int cpu_down(unsigned int cpu, enum cpuhp_state target)
|
||||
|
||||
Reference in New Issue
Block a user