lkml.org 
[lkml]   [2011]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 20/86] rcu: Enable DEBUG_OBJECTS_RCU_HEAD from !PREEMPT
    Date
    From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>

    The prohibition of DEBUG_OBJECTS_RCU_HEAD from !PREEMPT was due to the
    fixup actions. So just produce a warning from !PREEMPT.

    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    kernel/rcupdate.c | 26 +++++++++++++++++++++-----
    lib/Kconfig.debug | 2 +-
    2 files changed, 22 insertions(+), 6 deletions(-)

    diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c
    index f3240e9..b54d6d1 100644
    --- a/kernel/rcupdate.c
    +++ b/kernel/rcupdate.c
    @@ -142,7 +142,14 @@ static int rcuhead_fixup_init(void *addr, enum debug_obj_state state)
    * Ensure that queued callbacks are all executed.
    * If we detect that we are nested in a RCU read-side critical
    * section, we should simply fail, otherwise we would deadlock.
    + * In !PREEMPT configurations, there is no way to tell if we are
    + * in a RCU read-side critical section or not, so we never
    + * attempt any fixup and just print a warning.
    */
    +#ifndef CONFIG_PREEMPT
    + WARN_ON(1);
    + return 0;
    +#endif
    if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
    irqs_disabled()) {
    WARN_ON(1);
    @@ -184,7 +191,14 @@ static int rcuhead_fixup_activate(void *addr, enum debug_obj_state state)
    * Ensure that queued callbacks are all executed.
    * If we detect that we are nested in a RCU read-side critical
    * section, we should simply fail, otherwise we would deadlock.
    + * In !PREEMPT configurations, there is no way to tell if we are
    + * in a RCU read-side critical section or not, so we never
    + * attempt any fixup and just print a warning.
    */
    +#ifndef CONFIG_PREEMPT
    + WARN_ON(1);
    + return 0;
    +#endif
    if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
    irqs_disabled()) {
    WARN_ON(1);
    @@ -214,12 +228,14 @@ static int rcuhead_fixup_free(void *addr, enum debug_obj_state state)
    * Ensure that queued callbacks are all executed.
    * If we detect that we are nested in a RCU read-side critical
    * section, we should simply fail, otherwise we would deadlock.
    - * Note that the machinery to reliably determine whether
    - * or not we are in an RCU read-side critical section
    - * exists only in the preemptible RCU implementations
    - * (TINY_PREEMPT_RCU and TREE_PREEMPT_RCU), which is why
    - * DEBUG_OBJECTS_RCU_HEAD is disallowed if !PREEMPT.
    + * In !PREEMPT configurations, there is no way to tell if we are
    + * in a RCU read-side critical section or not, so we never
    + * attempt any fixup and just print a warning.
    */
    +#ifndef CONFIG_PREEMPT
    + WARN_ON(1);
    + return 0;
    +#endif
    if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
    irqs_disabled()) {
    WARN_ON(1);
    diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
    index 93ce6de..3aa2780 100644
    --- a/lib/Kconfig.debug
    +++ b/lib/Kconfig.debug
    @@ -337,7 +337,7 @@ config DEBUG_OBJECTS_WORK

    config DEBUG_OBJECTS_RCU_HEAD
    bool "Debug RCU callbacks objects"
    - depends on DEBUG_OBJECTS && PREEMPT
    + depends on DEBUG_OBJECTS
    help
    Enable this to turn on debugging of RCU list heads (call_rcu() usage).

    --
    1.7.3.2


    \
     
     \ /
      Last update: 2011-05-01 15:39    [W:2.874 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site