diff mbox series

powerpc/powernv: Clear LPCR[PECE1] via stop-api only for deep state offline

Message ID 1504180061-32345-1-git-send-email-ego@linux.vnet.ibm.com (mailing list archive)
State Accepted
Commit 5d298baa41883fc421acfd932799c0f4177249ae
Headers show
Series powerpc/powernv: Clear LPCR[PECE1] via stop-api only for deep state offline | expand

Commit Message

Gautham R Shenoy Aug. 31, 2017, 11:47 a.m. UTC
From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>

commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
an offlined CPU which is in a deep stop state.

In the case where the stop-api support is found to be lacking, the
commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
states when stop-api fails") disables deep states that lose hypervisor
context. Thus in this case, the offlined CPU will be put to some
shallow idle state.

However, we currently unconditionally clear the PECE1 in LPCR via
stop-api during CPU-Hotplug even when deep states are disabled due to
stop-api failure.

Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
*only* when the offlined CPU will be put to a deep state that loses
hypervisor context.

Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
stop-api only on Hotplug")

Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Nicholas Piggin Aug. 31, 2017, 12:07 p.m. UTC | #1
On Thu, 31 Aug 2017 17:17:41 +0530
"Gautham R. Shenoy" <ego@linux.vnet.ibm.com> wrote:

> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> 
> commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> an offlined CPU which is in a deep stop state.
> 
> In the case where the stop-api support is found to be lacking, the
> commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> states when stop-api fails") disables deep states that lose hypervisor
> context. Thus in this case, the offlined CPU will be put to some
> shallow idle state.
> 
> However, we currently unconditionally clear the PECE1 in LPCR via
> stop-api during CPU-Hotplug even when deep states are disabled due to
> stop-api failure.
> 
> Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> *only* when the offlined CPU will be put to a deep state that loses
> hypervisor context.

This looks okay to me. The bug is due to calling opal_slw_set_reg when
firmware has not enabled that feature, right?

> 
> Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug")
> 
> Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> ---
>  arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c
> index 9f59041..23f8fba 100644
> --- a/arch/powerpc/platforms/powernv/idle.c
> +++ b/arch/powerpc/platforms/powernv/idle.c
> @@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
>  	u64 pir = get_hard_smp_processor_id(cpu);
>  
>  	mtspr(SPRN_LPCR, lpcr_val);
> -	opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> +
> +	/*
> +	 * Program the LPCR via stop-api only for deepest stop state
> +	 * can lose hypervisor context.
> +	 */
> +	if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
> +		opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
>  }
>  
>  /*
Akshay Adiga Sept. 1, 2017, 10:08 a.m. UTC | #2
On 08/31/2017 05:37 PM, Nicholas Piggin wrote:
> On Thu, 31 Aug 2017 17:17:41 +0530
> "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> wrote:
>
> > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> >
> > commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> > stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> > an offlined CPU which is in a deep stop state.
> >
> > In the case where the stop-api support is found to be lacking, the
> > commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> > states when stop-api fails") disables deep states that lose hypervisor
> > context. Thus in this case, the offlined CPU will be put to some
> > shallow idle state.
> >
> > However, we currently unconditionally clear the PECE1 in LPCR via
> > stop-api during CPU-Hotplug even when deep states are disabled due to
> > stop-api failure.
> >
> > Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> > *only* when the offlined CPU will be put to a deep state that loses
> > hypervisor context.
>
> This looks okay to me. The bug is due to calling opal_slw_set_reg when
> firmware has not enabled that feature, right?
Yes,

In the case where the stop-api support is found to be lacking, the 
commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT 
states when stop-api fails") disables deep states that lose hypervisor 
context. Thus in this case, the offlined CPU will be put to some shallow 
idle state.

If a shallow state ( < stop4 ) is being chosen for cpu hotplug, then :
1) this opal call is not required.
2) may not be supported.

Hence  should call opal_slw_set_reg() only if a deep state chosen for 
cpu hotplug.
>
> >
> > Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > stop-api only on Hotplug")
> >
> > Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> > ---
> >  arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/powerpc/platforms/powernv/idle.c
> b/arch/powerpc/platforms/powernv/idle.c
> > index 9f59041..23f8fba 100644
> > --- a/arch/powerpc/platforms/powernv/idle.c
> > +++ b/arch/powerpc/platforms/powernv/idle.c
> > @@ -393,7 +393,13 @@ static void
> pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
> >      u64 pir = get_hard_smp_processor_id(cpu);
> >
> >      mtspr(SPRN_LPCR, lpcr_val);
> > -    opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> > +
> > +    /*
> > +     * Program the LPCR via stop-api only for deepest stop state
> > +     * can lose hypervisor context.
> > +     */
> > +    if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
> > +        opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> >  }
> >
> >  /*
>
Nicholas Piggin Sept. 1, 2017, 10:38 a.m. UTC | #3
On Fri, 1 Sep 2017 15:38:59 +0530
Akshay Adiga <akshay.adiga@linux.vnet.ibm.com> wrote:

> On 08/31/2017 05:37 PM, Nicholas Piggin wrote:
> > On Thu, 31 Aug 2017 17:17:41 +0530
> > "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> wrote:
> >  
> > > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> > >
> > > commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > > stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> > > stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> > > an offlined CPU which is in a deep stop state.
> > >
> > > In the case where the stop-api support is found to be lacking, the
> > > commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> > > states when stop-api fails") disables deep states that lose hypervisor
> > > context. Thus in this case, the offlined CPU will be put to some
> > > shallow idle state.
> > >
> > > However, we currently unconditionally clear the PECE1 in LPCR via
> > > stop-api during CPU-Hotplug even when deep states are disabled due to
> > > stop-api failure.
> > >
> > > Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> > > *only* when the offlined CPU will be put to a deep state that loses
> > > hypervisor context.  
> >
> > This looks okay to me. The bug is due to calling opal_slw_set_reg when
> > firmware has not enabled that feature, right?  
> Yes,
> 
> In the case where the stop-api support is found to be lacking, the 
> commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT 
> states when stop-api fails") disables deep states that lose hypervisor 
> context. Thus in this case, the offlined CPU will be put to some shallow 
> idle state.
> 
> If a shallow state ( < stop4 ) is being chosen for cpu hotplug, then :
> 1) this opal call is not required.
> 2) may not be supported.
> 
> Hence  should call opal_slw_set_reg() only if a deep state chosen for 
> cpu hotplug.

That makes sense, thanks for confirming.

> >  
> > >
> > > Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > > stop-api only on Hotplug")
> > >
> > > Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> > > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>


Reviewed-by: Nicholas Piggin <npiggin@gmail.com>


> > > ---
> > >  arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
> > >  1 file changed, 7 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/arch/powerpc/platforms/powernv/idle.c  
> > b/arch/powerpc/platforms/powernv/idle.c  
> > > index 9f59041..23f8fba 100644
> > > --- a/arch/powerpc/platforms/powernv/idle.c
> > > +++ b/arch/powerpc/platforms/powernv/idle.c
> > > @@ -393,7 +393,13 @@ static void  
> > pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)  
> > >      u64 pir = get_hard_smp_processor_id(cpu);
> > >
> > >      mtspr(SPRN_LPCR, lpcr_val);
> > > -    opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> > > +
> > > +    /*
> > > +     * Program the LPCR via stop-api only for deepest stop state
> > > +     * can lose hypervisor context.
> > > +     */
> > > +    if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
> > > +        opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> > >  }
> > >
> > >  /*  
> >  
>
pavrampu Sept. 6, 2017, 9:02 a.m. UTC | #4
On 2017-08-31 17:17, Gautham R. Shenoy wrote:
> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> 
> commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> an offlined CPU which is in a deep stop state.
> 
> In the case where the stop-api support is found to be lacking, the
> commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> states when stop-api fails") disables deep states that lose hypervisor
> context. Thus in this case, the offlined CPU will be put to some
> shallow idle state.
> 
> However, we currently unconditionally clear the PECE1 in LPCR via
> stop-api during CPU-Hotplug even when deep states are disabled due to
> stop-api failure.
> 
> Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> *only* when the offlined CPU will be put to a deep state that loses
> hypervisor context.
> 
> Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug")
> 
> Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>

Tested-by: Pavithra Prakash <pavrampu@linux.vnet.ibm.com>

> ---
>  arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/idle.c
> b/arch/powerpc/platforms/powernv/idle.c
> index 9f59041..23f8fba 100644
> --- a/arch/powerpc/platforms/powernv/idle.c
> +++ b/arch/powerpc/platforms/powernv/idle.c
> @@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned
> int cpu, u64 lpcr_val)
>  	u64 pir = get_hard_smp_processor_id(cpu);
> 
>  	mtspr(SPRN_LPCR, lpcr_val);
> -	opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> +
> +	/*
> +	 * Program the LPCR via stop-api only for deepest stop state
> +	 * can lose hypervisor context.
> +	 */
> +	if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
> +		opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
>  }
> 
>  /*
Akshay Adiga Sept. 19, 2017, 2:32 p.m. UTC | #5
Hi Michael,

Any comments on this patch ?

On 09/06/2017 02:32 PM, pavrampu wrote:
> On 2017-08-31 17:17, Gautham R. Shenoy wrote:
> > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> >
> > commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> > stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> > an offlined CPU which is in a deep stop state.
> >
> > In the case where the stop-api support is found to be lacking, the
> > commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> > states when stop-api fails") disables deep states that lose hypervisor
> > context. Thus in this case, the offlined CPU will be put to some
> > shallow idle state.
> >
> > However, we currently unconditionally clear the PECE1 in LPCR via
> > stop-api during CPU-Hotplug even when deep states are disabled due to
> > stop-api failure.
> >
> > Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> > *only* when the offlined CPU will be put to a deep state that loses
> > hypervisor context.
> >
> > Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> > stop-api only on Hotplug")
> >
> > Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
>
> Tested-by: Pavithra Prakash <pavrampu@linux.vnet.ibm.com>
>
> > ---
> >  arch/powerpc/platforms/powernv/idle.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/powerpc/platforms/powernv/idle.c
> > b/arch/powerpc/platforms/powernv/idle.c
> > index 9f59041..23f8fba 100644
> > --- a/arch/powerpc/platforms/powernv/idle.c
> > +++ b/arch/powerpc/platforms/powernv/idle.c
> > @@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned
> > int cpu, u64 lpcr_val)
> >      u64 pir = get_hard_smp_processor_id(cpu);
> >
> >      mtspr(SPRN_LPCR, lpcr_val);
> > -    opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> > +
> > +    /*
> > +     * Program the LPCR via stop-api only for deepest stop state
> > +     * can lose hypervisor context.
> > +     */
> > +    if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
> > +        opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
> >  }
> >
> >  /*
Michael Ellerman Sept. 21, 2017, 1:46 a.m. UTC | #6
On Thu, 2017-08-31 at 11:47:41 UTC, "Gautham R. Shenoy" wrote:
> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> 
> commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug") clears the PECE1 bit of the LPCR via
> stop-api during CPU-Hotplug to prevent wakeup due to a decrementer on
> an offlined CPU which is in a deep stop state.
> 
> In the case where the stop-api support is found to be lacking, the
> commit 785a12afdb4a ("powerpc/powernv/idle: Disable LOSE_FULL_CONTEXT
> states when stop-api fails") disables deep states that lose hypervisor
> context. Thus in this case, the offlined CPU will be put to some
> shallow idle state.
> 
> However, we currently unconditionally clear the PECE1 in LPCR via
> stop-api during CPU-Hotplug even when deep states are disabled due to
> stop-api failure.
> 
> Fix this by clearing PECE1 of LPCR via stop-api during CPU-Hotplug
> *only* when the offlined CPU will be put to a deep state that loses
> hypervisor context.
> 
> Fixes: commit 24be85a23d1f ("powerpc/powernv: Clear PECE1 in LPCR via
> stop-api only on Hotplug")
> 
> Reported-by: Pavithra Prakash <pavirampu@linux.vnet.ibm.com>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
> Tested-by: Pavithra Prakash <pavrampu@linux.vnet.ibm.com>

Applied to powerpc fixes, thanks.

https://git.kernel.org/powerpc/c/5d298baa41883fc421acfd932799c0

cheers
diff mbox series

Patch

diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c
index 9f59041..23f8fba 100644
--- a/arch/powerpc/platforms/powernv/idle.c
+++ b/arch/powerpc/platforms/powernv/idle.c
@@ -393,7 +393,13 @@  static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
 	u64 pir = get_hard_smp_processor_id(cpu);
 
 	mtspr(SPRN_LPCR, lpcr_val);
-	opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
+
+	/*
+	 * Program the LPCR via stop-api only for deepest stop state
+	 * can lose hypervisor context.
+	 */
+	if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
+		opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
 }
 
 /*