All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/2] cpuhp: fix some st->target issues
@ 2022-11-17 16:23 Phil Auld
  2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Phil Auld @ 2022-11-17 16:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider,
	Steven Price, Mark Rutland, Frederic Weisbecker, pauld

Fix a few cpuhp related issues.

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.

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.

v5: Fixed lowercase on first patch title and cleaned up cover letter.
Rebased on v6.1-rc5.

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

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

-- 
2.31.1


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

* [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state
  2022-11-17 16:23 [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
@ 2022-11-17 16:23 ` Phil Auld
  2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
  2022-12-02 11:51   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
  2022-11-17 16:23 ` [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
  2022-12-01 12:26 ` [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
  2 siblings, 2 replies; 8+ messages in thread
From: Phil Auld @ 2022-11-17 16:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider,
	Steven Price, Mark Rutland, Frederic Weisbecker, pauld

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>
Fixes: 757c989b9994 ("cpu/hotplug: Make target state writeable")
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Cc: Steven Price <steven.price@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Frederic Weisbecker <frederic@kernel.org>
---
 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] 8+ messages in thread

* [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu
  2022-11-17 16:23 [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
  2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
@ 2022-11-17 16:23 ` Phil Auld
  2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
  2022-12-02 11:50   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
  2022-12-01 12:26 ` [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
  2 siblings, 2 replies; 8+ messages in thread
From: Phil Auld @ 2022-11-17 16:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider,
	Steven Price, Mark Rutland, Frederic Weisbecker, pauld

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>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Cc: Steven Price <steven.price@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Frederic Weisbecker <frederic@kernel.org>
---
 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] 8+ messages in thread

* [tip: smp/core] cpuhp: Set cpuhp target for boot cpu
  2022-11-17 16:23 ` [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
@ 2022-12-01 11:41   ` tip-bot2 for Phil Auld
  2022-12-02 11:50   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Phil Auld @ 2022-12-01 11:41 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Phil Auld, Thomas Gleixner, Valentin Schneider, x86, linux-kernel

The following commit has been merged into the smp/core branch of tip:

Commit-ID:     f4576ee2315f1ad5f147a356c6e5c223462fd599
Gitweb:        https://git.kernel.org/tip/f4576ee2315f1ad5f147a356c6e5c223462fd599
Author:        Phil Auld <pauld@redhat.com>
AuthorDate:    Thu, 17 Nov 2022 11:23:29 -05:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 01 Dec 2022 12:35:08 +01:00

cpuhp: Set cpuhp target for boot cpu

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>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Link: https://lore.kernel.org/r/20221117162329.3164999-3-pauld@redhat.com

---
 kernel/cpu.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 979de99..3f704a8 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);
 }
 
 /*

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

* [tip: smp/core] cpuhp: Make target_store() a nop when target == state
  2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
@ 2022-12-01 11:41   ` tip-bot2 for Phil Auld
  2022-12-02 11:51   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Phil Auld @ 2022-12-01 11:41 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Phil Auld, Thomas Gleixner, Valentin Schneider, x86, linux-kernel

The following commit has been merged into the smp/core branch of tip:

Commit-ID:     0fa5abb6b7d85bf5688b2e11113f50317fb0121c
Gitweb:        https://git.kernel.org/tip/0fa5abb6b7d85bf5688b2e11113f50317fb0121c
Author:        Phil Auld <pauld@redhat.com>
AuthorDate:    Thu, 17 Nov 2022 11:23:28 -05:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 01 Dec 2022 12:35:08 +01:00

cpuhp: Make target_store() a nop when target == state

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.

Fixes: 757c989b9994 ("cpu/hotplug: Make target state writeable")
Signed-off-by: Phil Auld <pauld@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Link: https://lore.kernel.org/r/20221117162329.3164999-2-pauld@redhat.com

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

diff --git a/kernel/cpu.c b/kernel/cpu.c
index bbad5e3..979de99 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;

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

* Re: [PATCH v5 0/2] cpuhp: fix some st->target issues
  2022-11-17 16:23 [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
  2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
  2022-11-17 16:23 ` [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
@ 2022-12-01 12:26 ` Phil Auld
  2 siblings, 0 replies; 8+ messages in thread
From: Phil Auld @ 2022-12-01 12:26 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider,
	Steven Price, Mark Rutland, Frederic Weisbecker

On Thu, Nov 17, 2022 at 11:23:27AM -0500 Phil Auld wrote:
> Fix a few cpuhp related issues.
> 
> 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.
> 
> 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.
> 
> v5: Fixed lowercase on first patch title and cleaned up cover letter.
> Rebased on v6.1-rc5.
> 
> Phil Auld (2):
>   cpuhp: Make target_store() a nop when target == state
>   cpuhp: Set cpuhp target for boot cpu
> 
>  cpu.c |    5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>

Thanks for picking these up, Thomas!


Cheers,
Phil


> -- 
> 2.31.1
> 

-- 


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

* [tip: smp/core] cpu/hotplug: Set cpuhp target for boot cpu
  2022-11-17 16:23 ` [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
  2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
@ 2022-12-02 11:50   ` tip-bot2 for Phil Auld
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Phil Auld @ 2022-12-02 11:50 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Phil Auld, Thomas Gleixner, Valentin Schneider, x86, linux-kernel

The following commit has been merged into the smp/core branch of tip:

Commit-ID:     d385febc9a19635d4ef197bfad3e84729002f57c
Gitweb:        https://git.kernel.org/tip/d385febc9a19635d4ef197bfad3e84729002f57c
Author:        Phil Auld <pauld@redhat.com>
AuthorDate:    Thu, 17 Nov 2022 11:23:29 -05:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Fri, 02 Dec 2022 12:43:02 +01:00

cpu/hotplug: Set cpuhp target for boot cpu

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>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Link: https://lore.kernel.org/r/20221117162329.3164999-3-pauld@redhat.com


---
 kernel/cpu.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 979de99..3f704a8 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);
 }
 
 /*

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

* [tip: smp/core] cpu/hotplug: Make target_store() a nop when target == state
  2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
  2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
@ 2022-12-02 11:51   ` tip-bot2 for Phil Auld
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Phil Auld @ 2022-12-02 11:51 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Phil Auld, Thomas Gleixner, Valentin Schneider, x86, linux-kernel

The following commit has been merged into the smp/core branch of tip:

Commit-ID:     64ea6e44f85b9b75925ebe1ba0e6e8430cc4e06f
Gitweb:        https://git.kernel.org/tip/64ea6e44f85b9b75925ebe1ba0e6e8430cc4e06f
Author:        Phil Auld <pauld@redhat.com>
AuthorDate:    Thu, 17 Nov 2022 11:23:28 -05:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Fri, 02 Dec 2022 12:43:02 +01:00

cpu/hotplug: Make target_store() a nop when target == state

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.

Fixes: 757c989b9994 ("cpu/hotplug: Make target state writeable")
Signed-off-by: Phil Auld <pauld@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Link: https://lore.kernel.org/r/20221117162329.3164999-2-pauld@redhat.com


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

diff --git a/kernel/cpu.c b/kernel/cpu.c
index bbad5e3..979de99 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;

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

end of thread, other threads:[~2022-12-02 11:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-17 16:23 [PATCH v5 0/2] cpuhp: fix some st->target issues Phil Auld
2022-11-17 16:23 ` [PATCH v5 1/2] cpuhp: Make target_store() a nop when target == state Phil Auld
2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
2022-12-02 11:51   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
2022-11-17 16:23 ` [PATCH v5 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
2022-12-01 11:41   ` [tip: smp/core] " tip-bot2 for Phil Auld
2022-12-02 11:50   ` [tip: smp/core] cpu/hotplug: " tip-bot2 for Phil Auld
2022-12-01 12:26 ` [PATCH v5 0/2] cpuhp: fix some st->target issues 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.