lkml.org 
[lkml]   [2019]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 038/106] powerpc/pseries: correctly track irq state in default idle
    Date
    From: Nathan Lynch <nathanl@linux.ibm.com>

    [ Upstream commit 92c94dfb69e350471473fd3075c74bc68150879e ]

    prep_irq_for_idle() is intended to be called before entering
    H_CEDE (and it is used by the pseries cpuidle driver). However the
    default pseries idle routine does not call it, leading to mismanaged
    lazy irq state when the cpuidle driver isn't in use. Manifestations of
    this include:

    * Dropped IPIs in the time immediately after a cpu comes
    online (before it has installed the cpuidle handler), making the
    online operation block indefinitely waiting for the new cpu to
    respond.

    * Hitting this WARN_ON in arch_local_irq_restore():
    /*
    * We should already be hard disabled here. We had bugs
    * where that wasn't the case so let's dbl check it and
    * warn if we are wrong. Only do that when IRQ tracing
    * is enabled as mfmsr() can be costly.
    */
    if (WARN_ON_ONCE(mfmsr() & MSR_EE))
    __hard_irq_disable();

    Call prep_irq_for_idle() from pseries_lpar_idle() and honor its
    result.

    Fixes: 363edbe2614a ("powerpc: Default arch idle could cede processor on pseries")
    Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20190910225244.25056-1-nathanl@linux.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/platforms/pseries/setup.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
    index ba1791fd3234d..67f49159ea708 100644
    --- a/arch/powerpc/platforms/pseries/setup.c
    +++ b/arch/powerpc/platforms/pseries/setup.c
    @@ -325,6 +325,9 @@ static void pseries_lpar_idle(void)
    * low power mode by ceding processor to hypervisor
    */

    + if (!prep_irq_for_idle())
    + return;
    +
    /* Indicate to hypervisor that we are idle. */
    get_lppaca()->idle = 1;

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-06 20:00    [W:4.035 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site