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.9 10/47] powerpc/pseries/mobility: use cond_resched when updating device tree
    Date
    From: Nathan Lynch <nathanl@linux.ibm.com>

    [ Upstream commit ccfb5bd71d3d1228090a8633800ae7cdf42a94ac ]

    After a partition migration, pseries_devicetree_update() processes
    changes to the device tree communicated from the platform to
    Linux. This is a relatively heavyweight operation, with multiple
    device tree searches, memory allocations, and conversations with
    partition firmware.

    There's a few levels of nested loops which are bounded only by
    decisions made by the platform, outside of Linux's control, and indeed
    we have seen RCU stalls on large systems while executing this call
    graph. Use cond_resched() in these loops so that the cpu is yielded
    when needed.

    Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20190802192926.19277-4-nathanl@linux.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/platforms/pseries/mobility.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
    index 3784a7abfcc80..74791e8382d22 100644
    --- a/arch/powerpc/platforms/pseries/mobility.c
    +++ b/arch/powerpc/platforms/pseries/mobility.c
    @@ -11,6 +11,7 @@

    #include <linux/kernel.h>
    #include <linux/kobject.h>
    +#include <linux/sched.h>
    #include <linux/smp.h>
    #include <linux/stat.h>
    #include <linux/completion.h>
    @@ -206,7 +207,11 @@ static int update_dt_node(__be32 phandle, s32 scope)

    prop_data += vd;
    }
    +
    + cond_resched();
    }
    +
    + cond_resched();
    } while (rtas_rc == 1);

    of_node_put(dn);
    @@ -282,8 +287,12 @@ int pseries_devicetree_update(s32 scope)
    add_dt_node(phandle, drc_index);
    break;
    }
    +
    + cond_resched();
    }
    }
    +
    + cond_resched();
    } while (rc == 1);

    kfree(rtas_buf);
    --
    2.20.1


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