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 |
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); > } > > /*
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); > > } > > > > /* >
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); > > > } > > > > > > /* > > >
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); > } > > /*
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); > > } > > > > /*
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 --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); } /*