Commit 23dfeae8 authored by Linus Torvalds's avatar Linus Torvalds

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
parents c39cbc5b 2b8272ff
...@@ -1487,8 +1487,22 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen, ...@@ -1487,8 +1487,22 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
return ret; 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) 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 * If the platform does not support hotplug, report it explicitly to
* differentiate it from a transient offlining failure. * differentiate it from a transient offlining failure.
...@@ -1497,7 +1511,15 @@ static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target) ...@@ -1497,7 +1511,15 @@ static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (cpu_hotplug_disabled) if (cpu_hotplug_disabled)
return -EBUSY; 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) static int cpu_down(unsigned int cpu, enum cpuhp_state target)
......
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