lkml.org 
[lkml]   [2021]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 05/18] locking/lockdep: Improve noinstr vs errors
    Better handle the failure paths.

    vmlinux.o: warning: objtool: debug_locks_off()+0x23: call to console_verbose() leaves .noinstr.text section
    vmlinux.o: warning: objtool: debug_locks_off()+0x19: call to __kasan_check_write() leaves .noinstr.text section

    debug_locks_off+0x19/0x40:
    instrument_atomic_write at include/linux/instrumented.h:86
    (inlined by) __debug_locks_off at include/linux/debug_locks.h:17
    (inlined by) debug_locks_off at lib/debug_locks.c:41

    Fixes: 6eebad1ad303 ("lockdep: __always_inline more for noinstr")
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h
    index 2915f56ad421..edb5c186b0b7 100644
    --- a/include/linux/debug_locks.h
    +++ b/include/linux/debug_locks.h
    @@ -27,8 +27,10 @@ extern int debug_locks_off(void);
    int __ret = 0; \
    \
    if (!oops_in_progress && unlikely(c)) { \
    + instrumentation_begin(); \
    if (debug_locks_off() && !debug_locks_silent) \
    WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c); \
    + instrumentation_end(); \
    __ret = 1; \
    } \
    __ret; \
    diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
    index cb8af6a3e154..6fc60d363d26 100644
    --- a/kernel/locking/lockdep.c
    +++ b/kernel/locking/lockdep.c
    @@ -843,7 +843,7 @@ static int count_matching_names(struct lock_class *new_class)
    }

    /* used from NMI context -- must be lockless */
    -static __always_inline struct lock_class *
    +static noinstr struct lock_class *
    look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass)
    {
    struct lockdep_subclass_key *key;
    @@ -851,12 +851,14 @@ look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass)
    struct lock_class *class;

    if (unlikely(subclass >= MAX_LOCKDEP_SUBCLASSES)) {
    + instrumentation_begin();
    debug_locks_off();
    printk(KERN_ERR
    "BUG: looking up invalid subclass: %u\n", subclass);
    printk(KERN_ERR
    "turning off the locking correctness validator.\n");
    dump_stack();
    + instrumentation_end();
    return NULL;
    }

    diff --git a/lib/debug_locks.c b/lib/debug_locks.c
    index 06d3135bd184..a75ee30b77cb 100644
    --- a/lib/debug_locks.c
    +++ b/lib/debug_locks.c
    @@ -36,7 +36,7 @@ EXPORT_SYMBOL_GPL(debug_locks_silent);
    /*
    * Generic 'turn off all lock debugging' function:
    */
    -noinstr int debug_locks_off(void)
    +int debug_locks_off(void)
    {
    if (debug_locks && __debug_locks_off()) {
    if (!debug_locks_silent) {

    \
     
     \ /
      Last update: 2021-06-21 14:04    [W:5.703 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site