All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/2] cpuhp: fix some st->target issues
@ 2022-07-21 14:28 Phil Auld
  2022-07-21 14:28 ` [PATCH v4 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
  2022-07-21 14:28 ` [PATCH v4 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
  0 siblings, 2 replies; 3+ messages in thread
From: Phil Auld @ 2022-07-21 14:28 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider, Steven Price

Fix a couple of cpuhp inconsistencies.

The first prevents target_store() from calling cpu_down() when
target == state which prevents the cpu being incorrectly marked
as dying.  The second just makes the boot cpu have a valid cpuhp
target rather than 0 (CPU_OFFLINE) while being in state
CPU_ONLINE.

A further issue which these two patches don't address is that
the cpuX/online file looks at the device->offline state and can
thus get out of sync with the actual cpuhp state if the cpuhp
target is used to change state.

v3: Added code to make sure st->target == target in the nop case.

v4: Use WARN_ON in the case where state == target but st->target does
not.

Phil Auld (2):
  cpuhp: make target_store() a nop when target == state
  cpuhp: Set cpuhp target for boot cpu

 kernel/cpu.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

-- 
2.31.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v4 1/2] cpuhp: make target_store() a nop when target == state
  2022-07-21 14:28 [PATCH v4 0/2] cpuhp: fix some st->target issues Phil Auld
@ 2022-07-21 14:28 ` Phil Auld
  2022-07-21 14:28 ` [PATCH v4 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
  1 sibling, 0 replies; 3+ messages in thread
From: Phil Auld @ 2022-07-21 14:28 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider, Steven Price

Writing the current state back in hotplug/target calls cpu_down()
which will set cpu dying even when it isn't and then nothing will
ever clear it. A stress test that reads values and writes them back
for all cpu device files in sysfs will trigger the BUG() in
select_fallback_rq once all cpus are marked as dying.

kernel/cpu.c::target_store()
	...
        if (st->state < target)
                ret = cpu_up(dev->id, target);
        else
                ret = cpu_down(dev->id, target);

cpu_down() -> cpu_set_state()
	 bool bringup = st->state < target;
	 ...
	 if (cpu_dying(cpu) != !bringup)
		set_cpu_dying(cpu, !bringup);

Fix this by letting state==target fall through in the target_store()
conditional. Also make sure st->target == target in that case.

Signed-off-by: Phil Auld <pauld@redhat.com>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
---
 kernel/cpu.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index bbad5e375d3b..979de993f853 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -2326,8 +2326,10 @@ static ssize_t target_store(struct device *dev, struct device_attribute *attr,
 
 	if (st->state < target)
 		ret = cpu_up(dev->id, target);
-	else
+	else if (st->state > target)
 		ret = cpu_down(dev->id, target);
+	else if (WARN_ON(st->target != target))
+		st->target = target;
 out:
 	unlock_device_hotplug();
 	return ret ? ret : count;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v4 2/2] cpuhp: Set cpuhp target for boot cpu
  2022-07-21 14:28 [PATCH v4 0/2] cpuhp: fix some st->target issues Phil Auld
  2022-07-21 14:28 ` [PATCH v4 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
@ 2022-07-21 14:28 ` Phil Auld
  1 sibling, 0 replies; 3+ messages in thread
From: Phil Auld @ 2022-07-21 14:28 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider, Steven Price

Since the boot cpu does not go through the hotplug process it ends
up with state == CPUHP_ONLINE but target == CPUHP_OFFLINE.
So set the target to match in boot_cpu_hotplug_init().

Signed-off-by: Phil Auld <pauld@redhat.com>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
---
 kernel/cpu.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 979de993f853..3f704a8896b0 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -2690,6 +2690,7 @@ void __init boot_cpu_hotplug_init(void)
 	cpumask_set_cpu(smp_processor_id(), &cpus_booted_once_mask);
 #endif
 	this_cpu_write(cpuhp_state.state, CPUHP_ONLINE);
+	this_cpu_write(cpuhp_state.target, CPUHP_ONLINE);
 }
 
 /*
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-07-21 14:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-21 14:28 [PATCH v4 0/2] cpuhp: fix some st->target issues Phil Auld
2022-07-21 14:28 ` [PATCH v4 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
2022-07-21 14:28 ` [PATCH v4 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.