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

Several small fixes that clean up some 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.

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] 7+ messages in thread

* [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state
  2022-07-11 21:16 [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
@ 2022-07-11 21:16 ` Phil Auld
  2022-07-19 14:34   ` Valentin Schneider
  2022-07-11 21:16 ` [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
  2022-08-10 14:45 ` [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
  2 siblings, 1 reply; 7+ messages in thread
From: Phil Auld @ 2022-07-11 21:16 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider

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>
---
 kernel/cpu.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index bbad5e375d3b..305694a2ca26 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 (st->target != target)
+		st->target = target;
 out:
 	unlock_device_hotplug();
 	return ret ? ret : count;
-- 
2.31.1


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

* [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu
  2022-07-11 21:16 [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
  2022-07-11 21:16 ` [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
@ 2022-07-11 21:16 ` Phil Auld
  2022-07-19 14:34   ` Valentin Schneider
  2022-08-10 14:45 ` [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
  2 siblings, 1 reply; 7+ messages in thread
From: Phil Auld @ 2022-07-11 21:16 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider

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

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

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 305694a2ca26..104f43a6f4ad 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] 7+ messages in thread

* Re: [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state
  2022-07-11 21:16 ` [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
@ 2022-07-19 14:34   ` Valentin Schneider
  2022-07-19 15:03     ` Phil Auld
  0 siblings, 1 reply; 7+ messages in thread
From: Valentin Schneider @ 2022-07-19 14:34 UTC (permalink / raw)
  To: Phil Auld, linux-kernel; +Cc: Thomas Gleixner, Peter Zijlstra

On 11/07/22 17:16, Phil Auld wrote:
> 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>

One nit below, otherwise:
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..305694a2ca26 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 (st->target != target)

Should we make this:

        else if (WARN(st->target != target))

> +		st->target = target;
>  out:
>       unlock_device_hotplug();
>       return ret ? ret : count;
> --
> 2.31.1


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

* Re: [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu
  2022-07-11 21:16 ` [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
@ 2022-07-19 14:34   ` Valentin Schneider
  0 siblings, 0 replies; 7+ messages in thread
From: Valentin Schneider @ 2022-07-19 14:34 UTC (permalink / raw)
  To: Phil Auld, linux-kernel; +Cc: Thomas Gleixner, Peter Zijlstra

On 11/07/22 17:16, Phil Auld wrote:
> Since the boot cpu does not go through the hotplug process it ends
> up with state == CPUHP_ONLINE but target == CPUHP_OFFLINE.
> 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>


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

* Re: [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state
  2022-07-19 14:34   ` Valentin Schneider
@ 2022-07-19 15:03     ` Phil Auld
  0 siblings, 0 replies; 7+ messages in thread
From: Phil Auld @ 2022-07-19 15:03 UTC (permalink / raw)
  To: Valentin Schneider; +Cc: linux-kernel, Thomas Gleixner, Peter Zijlstra

On Tue, Jul 19, 2022 at 03:34:03PM +0100 Valentin Schneider wrote:
> On 11/07/22 17:16, Phil Auld wrote:
> > 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>
> 
> One nit below, otherwise:
> Reviewed-by: Valentin Schneider <vschneid@redhat.com>
>

Thanks!

> > ---
> >  kernel/cpu.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/kernel/cpu.c b/kernel/cpu.c
> > index bbad5e375d3b..305694a2ca26 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 (st->target != target)
> 
> Should we make this:
> 
>         else if (WARN(st->target != target))
>

If you think that's important I can make it a WARN, sure.

I'll try to remember to keep your Reviewed-bys this time if that's okay.



Cheers,
Phil

> > +		st->target = target;
> >  out:
> >       unlock_device_hotplug();
> >       return ret ? ret : count;
> > --
> > 2.31.1
> 

-- 


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

* Re: [PATCH v3 0/2] cpuhp: fix some st->target issues
  2022-07-11 21:16 [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
  2022-07-11 21:16 ` [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
  2022-07-11 21:16 ` [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
@ 2022-08-10 14:45 ` Phil Auld
  2 siblings, 0 replies; 7+ messages in thread
From: Phil Auld @ 2022-08-10 14:45 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Peter Zijlstra, Valentin Schneider

On Mon, Jul 11, 2022 at 05:16:17PM -0400 Phil Auld wrote:
> Several small fixes that clean up some 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.
> 
> 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
> 

Ping?

Any thoughts on this? I'm not sure what tree it needs to go in but
getting a cpu shutdown by writing the current target/state back
in here seems wrong.


Thanks,
Phil

-- 


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

end of thread, other threads:[~2022-08-10 14:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-11 21:16 [PATCH v3 0/2] cpuhp: fix some st->target issues Phil Auld
2022-07-11 21:16 ` [PATCH v3 1/2] cpuhp: make target_store() a nop when target == state Phil Auld
2022-07-19 14:34   ` Valentin Schneider
2022-07-19 15:03     ` Phil Auld
2022-07-11 21:16 ` [PATCH v3 2/2] cpuhp: Set cpuhp target for boot cpu Phil Auld
2022-07-19 14:34   ` Valentin Schneider
2022-08-10 14:45 ` [PATCH v3 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.