lkml.org 
[lkml]   [2011]   [Sep]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 55/55] powerpc: Work around tracing from dyntick-idle mode
    Date
    PowerPC LPAR's __trace_hcall_exit() can invoke event tracing at a
    point where RCU has been told that the CPU is in dyntick-idle mode.
    Because event tracing uses RCU, this can result in failures.

    A correct fix would arrange for RCU to be told about dyntick-idle
    mode after tracing had completed, however, this will require some care
    because it appears that __trace_hcall_exit() can also be called from
    non-dyntick-idle mode.

    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: anton@samba.org
    Cc: benh@kernel.crashing.org
    Cc: paulus@samba.org
    ---
    arch/powerpc/platforms/pseries/lpar.c | 6 ++++++
    1 files changed, 6 insertions(+), 0 deletions(-)

    diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
    index 39e6e0a..668f300 100644
    --- a/arch/powerpc/platforms/pseries/lpar.c
    +++ b/arch/powerpc/platforms/pseries/lpar.c
    @@ -715,12 +715,14 @@ EXPORT_SYMBOL(arch_free_page);
    /* NB: reg/unreg are called while guarded with the tracepoints_mutex */
    extern long hcall_tracepoint_refcount;

    +#if 0 /* work around buggy use of RCU from dyntick-idle mode */
    /*
    * Since the tracing code might execute hcalls we need to guard against
    * recursion. One example of this are spinlocks calling H_YIELD on
    * shared processor partitions.
    */
    static DEFINE_PER_CPU(unsigned int, hcall_trace_depth);
    +#endif /* #if 0 work around buggy use of RCU from dyntick-idle mode */

    void hcall_tracepoint_regfunc(void)
    {
    @@ -734,6 +736,7 @@ void hcall_tracepoint_unregfunc(void)

    void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
    {
    +#if 0 /* work around buggy use of RCU from dyntick-idle mode */
    unsigned long flags;
    unsigned int *depth;

    @@ -750,11 +753,13 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args)

    out:
    local_irq_restore(flags);
    +#endif /* #if 0 work around buggy use of RCU from dyntick-idle mode */
    }

    void __trace_hcall_exit(long opcode, unsigned long retval,
    unsigned long *retbuf)
    {
    +#if 0 /* work around buggy use of RCU from dyntick-idle mode */
    unsigned long flags;
    unsigned int *depth;

    @@ -771,6 +776,7 @@ void __trace_hcall_exit(long opcode, unsigned long retval,

    out:
    local_irq_restore(flags);
    +#endif /* #if 0 work around buggy use of RCU from dyntick-idle mode */
    }
    #endif

    --
    1.7.3.2


    \
     
     \ /
      Last update: 2011-09-07 08:33    [W:0.023 / U:88.680 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site