lkml.org 
[lkml]   [2011]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 3/4] printk, lockdep: Remove lockdep_off() usage
    Remove the lockdep_off() usage from printk(). Also add a
    debug_locks_off() call to zap_locks() since that'll mess up the lock
    state in a royal way anyway, and zap_locks() when lockdep causes a
    printk() recursion so that we can at observe the splat.

    Further switch to local_irq_ ops so that the irq state is properly
    tracked (raw_local_irq_* isn't tracked by lockdep, causing confusion).
    Also drop superfluous preempt_disable(), disabling IRQs already avoids
    scheduling.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    ---
    kernel/printk.c | 11 ++++-------
    1 file changed, 4 insertions(+), 7 deletions(-)

    Index: linux-2.6/kernel/printk.c
    ===================================================================
    --- linux-2.6.orig/kernel/printk.c
    +++ linux-2.6/kernel/printk.c
    @@ -686,6 +686,7 @@ static void zap_locks(void)

    oops_timestamp = jiffies;

    + debug_locks_off();
    /* If a crash is occurring, make sure we can't deadlock */
    spin_lock_init(&logbuf_lock);
    /* And make sure that we print immediately */
    @@ -838,9 +839,8 @@ asmlinkage int vprintk(const char *fmt,
    boot_delay_msec();
    printk_delay();

    - preempt_disable();
    /* This stops the holder of console_sem just where we want him */
    - raw_local_irq_save(flags);
    + local_irq_save(flags);
    this_cpu = smp_processor_id();

    /*
    @@ -854,14 +854,13 @@ asmlinkage int vprintk(const char *fmt,
    * recursion and return - but flag the recursion so that
    * it can be printed at the next appropriate moment:
    */
    - if (!oops_in_progress) {
    + if (!oops_in_progress && !lockdep_recursing(current)) {
    recursion_bug = 1;
    goto out_restore_irqs;
    }
    zap_locks();
    }

    - lockdep_off();
    spin_lock(&logbuf_lock);
    printk_cpu = this_cpu;

    @@ -958,11 +957,9 @@ asmlinkage int vprintk(const char *fmt,
    if (console_trylock_for_printk(this_cpu))
    console_unlock();

    - lockdep_on();
    out_restore_irqs:
    - raw_local_irq_restore(flags);
    + local_irq_restore(flags);

    - preempt_enable();
    return printed_len;
    }
    EXPORT_SYMBOL(printk);
    diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
    index ef820a3..132d210 100644
    --- a/include/linux/lockdep.h
    +++ b/include/linux/lockdep.h
    @@ -343,6 +343,8 @@ extern void lockdep_trace_alloc(gfp_t mask);

    #define lockdep_assert_held(l) WARN_ON(debug_locks && !lockdep_is_held(l))

    +#define lockdep_recursing(tsk) ((tsk)->lockdep_recursion)
    +
    #else /* !LOCKDEP */

    static inline void lockdep_off(void)
    @@ -392,6 +394,8 @@ struct lock_class_key { };

    #define lockdep_assert_held(l) do { } while (0)

    +#define lockdep_recursing(tsk) (0)
    +
    #endif /* !LOCKDEP */

    #ifdef CONFIG_LOCK_STAT



    \
     
     \ /
      Last update: 2011-06-21 17:43    [W:6.828 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site