diff options
author | 2017-08-07 16:12:53 +0900 | |
---|---|---|
committer | 2017-08-10 12:29:08 +0200 | |
commit | 23f873d8f9526ed7e49a1a02a45f8afb9ae5fb84 (patch) | |
tree | c926e87ad1197db61dca6677b5e7e7184271698a /include/linux/lockdep.h | |
parent | locking/lockdep: Implement the 'crossrelease' feature (diff) | |
download | linux-23f873d8f9526ed7e49a1a02a45f8afb9ae5fb84.tar.gz linux-23f873d8f9526ed7e49a1a02a45f8afb9ae5fb84.tar.bz2 linux-23f873d8f9526ed7e49a1a02a45f8afb9ae5fb84.zip |
locking/lockdep: Detect and handle hist_lock ring buffer overwrite
The ring buffer can be overwritten by hardirq/softirq/work contexts.
That cases must be considered on rollback or commit. For example,
|<------ hist_lock ring buffer size ----->|
ppppppppppppiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
wrapped > iiiiiiiiiiiiiiiiiiiiiii....................
where 'p' represents an acquisition in process context,
'i' represents an acquisition in irq context.
On irq exit, crossrelease tries to rollback idx to original position,
but it should not because the entry already has been invalid by
overwriting 'i'. Avoid rollback or commit for entries overwritten.
Signed-off-by: Byungchul Park <byungchul.park@lge.com>
Signed-off-by: Peter 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: akpm@linux-foundation.org
Cc: boqun.feng@gmail.com
Cc: kernel-team@lge.com
Cc: kirill@shutemov.name
Cc: npiggin@gmail.com
Cc: walken@google.com
Cc: willy@infradead.org
Link: http://lkml.kernel.org/r/1502089981-21272-7-git-send-email-byungchul.park@lge.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/lockdep.h')
-rw-r--r-- | include/linux/lockdep.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index e1e0fcd99613..c75eedd55af5 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -284,6 +284,26 @@ struct held_lock { */ struct hist_lock { /* + * Id for each entry in the ring buffer. This is used to + * decide whether the ring buffer was overwritten or not. + * + * For example, + * + * |<----------- hist_lock ring buffer size ------->| + * pppppppppppppppppppppiiiiiiiiiiiiiiiiiiiiiiiiiiiii + * wrapped > iiiiiiiiiiiiiiiiiiiiiiiiiii....................... + * + * where 'p' represents an acquisition in process + * context, 'i' represents an acquisition in irq + * context. + * + * In this example, the ring buffer was overwritten by + * acquisitions in irq context, that should be detected on + * rollback or commit. + */ + unsigned int hist_id; + + /* * Seperate stack_trace data. This will be used at commit step. */ struct stack_trace trace; |