• Yuyang Du's avatar
    locking/lockdep: Change the range of class_idx in held_lock struct · 01bb6f0a
    Yuyang Du authored
    held_lock->class_idx is used to point to the class of the held lock. The
    index is shifted by 1 to make index 0 mean no class, which results in class
    index shifting back and forth but is not worth doing so.
    
    The reason is: (1) there will be no "no-class" held_lock to begin with, and
    (2) index 0 seems to be used for error checking, but if something wrong
    indeed happened, the index can't be counted on to distinguish it as that
    something won't set the class_idx to 0 on purpose to tell us it is wrong.
    
    Therefore, change the index to start from 0. This saves a lot of
    back-and-forth shifts and a class slot back to lock_classes.
    
    Since index 0 is now used for lock class, we change the initial chain key to
    -1 to avoid key collision, which is due to the fact that __jhash_mix(0, 0, 0) = 0.
    Actually, the initial chain key can be any arbitrary value other than 0.
    
    In addition, a bitmap is maintained to keep track of the used lock classes,
    and we check the validity of the held lock against that bitmap.
    Signed-off-by: default avatarYuyang Du <duyuyang@gmail.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: bvanassche@acm.org
    Cc: frederic@kernel.org
    Cc: ming.lei@redhat.com
    Cc: will.deacon@arm.com
    Link: https://lkml.kernel.org/r/20190506081939.74287-10-duyuyang@gmail.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    01bb6f0a
lockdep.c 131 KB