lkml.org 
[lkml]   [2012]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 09/15] rcu: Avoid rcu_print_detail_task_stall_rnp() segfault
    Date
    From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>

    The rcu_print_detail_task_stall_rnp() function invokes
    rcu_preempt_blocked_readers_cgp() to verify that there are some preempted
    RCU readers blocking the current grace period outside of the protection
    of the rcu_node structure's ->lock. This means that the last blocked
    reader might exit its RCU read-side critical section and remove itself
    from the ->blkd_tasks list before the ->lock is acquired, resulting in
    a segmentation fault when the subsequent code attempts to dereference
    the now-NULL gp_tasks pointer.

    This commit therefore moves the test under the lock. This will not
    have measurable effect on lock contention because this code is invoked
    only when printing RCU CPU stall warnings, in other words, in the common
    case, never.

    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    kernel/rcutree_plugin.h | 6 ++++--
    1 files changed, 4 insertions(+), 2 deletions(-)

    diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
    index 139a803..c02dc1d 100644
    --- a/kernel/rcutree_plugin.h
    +++ b/kernel/rcutree_plugin.h
    @@ -422,9 +422,11 @@ static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp)
    unsigned long flags;
    struct task_struct *t;

    - if (!rcu_preempt_blocked_readers_cgp(rnp))
    - return;
    raw_spin_lock_irqsave(&rnp->lock, flags);
    + if (!rcu_preempt_blocked_readers_cgp(rnp)) {
    + raw_spin_unlock_irqrestore(&rnp->lock, flags);
    + return;
    + }
    t = list_entry(rnp->gp_tasks,
    struct task_struct, rcu_node_entry);
    list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry)
    --
    1.7.8


    \
     
     \ /
      Last update: 2012-08-31 01:01    [W:4.140 / U:0.456 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site