OrangePi_CM5/lib
Peter Zijlstra de8f5e4f2d lockdep: Introduce wait-type checks
Extend lockdep to validate lock wait-type context.

The current wait-types are:

	LD_WAIT_FREE,		/* wait free, rcu etc.. */
	LD_WAIT_SPIN,		/* spin loops, raw_spinlock_t etc.. */
	LD_WAIT_CONFIG,		/* CONFIG_PREEMPT_LOCK, spinlock_t etc.. */
	LD_WAIT_SLEEP,		/* sleeping locks, mutex_t etc.. */

Where lockdep validates that the current lock (the one being acquired)
fits in the current wait-context (as generated by the held stack).

This ensures that there is no attempt to acquire mutexes while holding
spinlocks, to acquire spinlocks while holding raw_spinlocks and so on. In
other words, its a more fancy might_sleep().

Obviously RCU made the entire ordeal more complex than a simple single
value test because RCU can be acquired in (pretty much) any context and
while it presents a context to nested locks it is not the same as it
got acquired in.

Therefore its necessary to split the wait_type into two values, one
representing the acquire (outer) and one representing the nested context
(inner). For most 'normal' locks these two are the same.

[ To make static initialization easier we have the rule that:
  .outer == INV means .outer == .inner; because INV == 0. ]

It further means that its required to find the minimal .inner of the held
stack to compare against the outer of the new lock; because while 'normal'
RCU presents a CONFIG type to nested locks, if it is taken while already
holding a SPIN type it obviously doesn't relax the rules.

Below is an example output generated by the trivial test code:

  raw_spin_lock(&foo);
  spin_lock(&bar);
  spin_unlock(&bar);
  raw_spin_unlock(&foo);

 [ BUG: Invalid wait context ]
 -----------------------------
 swapper/0/1 is trying to lock:
 ffffc90000013f20 (&bar){....}-{3:3}, at: kernel_init+0xdb/0x187
 other info that might help us debug this:
 1 lock held by swapper/0/1:
  #0: ffffc90000013ee0 (&foo){+.+.}-{2:2}, at: kernel_init+0xd1/0x187

The way to read it is to look at the new -{n,m} part in the lock
description; -{3:3} for the attempted lock, and try and match that up to
the held locks, which in this case is the one: -{2,2}.

This tells that the acquiring lock requires a more relaxed environment than
presented by the lock stack.

Currently only the normal locks and RCU are converted, the rest of the
lockdep users defaults to .inner = INV which is ignored. More conversions
can be done when desired.

The check for spinlock_t nesting is not enabled by default. It's a separate
config option for now as there are known problems which are currently
addressed. The config option allows to identify these problems and to
verify that the solutions found are indeed solving them.

The config switch will be removed and the checks will permanently enabled
once the vast majority of issues has been addressed.

[ bigeasy: Move LD_WAIT_FREE,… out of CONFIG_LOCKDEP to avoid compile
	   failure with CONFIG_DEBUG_SPINLOCK + !CONFIG_LOCKDEP]
[ tglx: Add the config option ]

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200321113242.427089655@linutronix.de
2020-03-21 16:00:24 +01:00
..
842 lib: 842: no need to check return value of debugfs_create functions 2019-07-03 16:57:17 +02:00
crypto crypto: chacha20poly1305 - prevent integer overflow on large input 2020-02-14 14:48:37 +08:00
dim lib/dim: Fix -Wunused-const-variable warnings 2019-07-25 11:34:39 -07:00
fonts
…
kunit kunit: allow kunit to be loaded as a module 2020-01-09 16:43:40 -07:00
livepatch livepatch/samples/selftest: Use klp_shadow_alloc() API correctly 2020-01-17 11:12:06 +01:00
lz4 lz4: do not export static symbol 2019-09-20 09:06:26 -07:00
lzo lib/lzo/lzo1x_compress.c: fix alignment bug in lzo-rle 2019-09-25 17:51:41 -07:00
math lib/math/rational.c: fix possible incorrect result from rational fractions helper 2019-12-04 19:44:13 -08:00
mpi lib/mpi: Eliminate unused umul_ppmm definitions for MIPS 2019-08-22 14:39:36 +10:00
raid6 kbuild: rename hostprogs-y/always to hostprogs/always-y 2020-02-04 01:53:07 +09:00
reed_solomon rslib: Make some functions static 2019-07-02 08:41:37 +02:00
vdso lib/vdso: Only read hrtimer_res when needed in __cvdso_clock_getres() 2020-01-16 21:24:46 +01:00
xz lib/xz: fix XZ_DYNALLOC to avoid useless memory reallocations 2019-11-15 18:34:00 -08:00
zlib_deflate lib/zlib: add zlib_deflate_dfltcc_enabled() function 2020-01-31 10:30:40 -08:00
zlib_dfltcc lib/zlib: add zlib_deflate_dfltcc_enabled() function 2020-01-31 10:30:40 -08:00
zlib_inflate lib/zlib: add s390 hardware support for kernel zlib_inflate 2020-01-31 10:30:40 -08:00
zstd lib/zstd/mem.h: replace __inline by inline 2019-09-15 19:42:16 +02:00
.gitignore
…
Kconfig Various fixes: 2020-02-11 16:39:18 -08:00
Kconfig.debug lockdep: Introduce wait-type checks 2020-03-21 16:00:24 +01:00
Kconfig.kasan kasan: support backing vmalloc space with real shadow memory 2019-12-01 12:59:05 -08:00
Kconfig.kgdb lib/: fix Kconfig indentation 2019-12-07 11:00:19 -08:00
Kconfig.ubsan
…
Makefile Various fixes: 2020-02-11 16:39:18 -08:00
argv_split.c
…
ashldi3.c
…
ashrdi3.c
…
asn1_decoder.c
…
assoc_array.c
…
atomic64.c
…
atomic64_test.c
…
audit.c
…
bcd.c
…
bch.c
…
bitmap.c lib: rework bitmap_parse() 2020-02-04 03:05:26 +00:00
bitrev.c
…
bootconfig.c bootconfig: Add append value operator support 2020-02-21 09:59:39 -05:00
bsearch.c lib/bsearch: Use generic type for comparator function 2019-11-14 13:15:11 -05:00
btree.c
…
bucket_locks.c
…
bug.c bug: move WARN_ON() "cut here" into exception handler 2019-09-25 17:51:41 -07:00
build_OID_registry
…
bust_spinlocks.c
…
check_signature.c
…
checksum.c
…
clz_ctz.c
…
clz_tab.c
…
cmdline.c
…
cmpdi2.c
…
compat_audit.c
…
cpu_rmap.c lib: cpu_rmap: Use pr_warn instead of pr_warning 2019-10-18 15:01:57 +02:00
cpumask.c
…
crc-ccitt.c
…
crc-itu-t.c
…
crc-t10dif.c
…
crc4.c
…
crc7.c
…
crc8.c
…
crc16.c
…
crc32.c
…
crc32defs.h
…
crc32test.c
…
crc64.c lib: crc64: include <linux/crc64.h> for 'crc64_be' 2020-01-23 11:40:01 -07:00
ctype.c
…
debug_info.c
…
debug_locks.c
…
debugobjects.c debugobjects: Fix various data races 2020-01-17 15:45:01 +01:00
dec_and_lock.c
…
decompress.c
…
decompress_bunzip2.c
…
decompress_inflate.c lib/zlib: add s390 hardware support for kernel zlib_inflate 2020-01-31 10:30:40 -08:00
decompress_unlz4.c
…
decompress_unlzma.c
…
decompress_unlzo.c
…
decompress_unxz.c
…
devres.c remove ioremap_nocache and devm_ioremap_nocache 2020-01-06 09:45:59 +01:00
digsig.c Revert "Merge tag 'keys-acl-20190703' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs" 2019-07-10 18:43:43 -07:00
dump_stack.c dump_stack: avoid the livelock of the dump_lock 2019-11-06 08:47:50 -08:00
dynamic_debug.c
…
dynamic_queue_limits.c
…
earlycpio.c
…
errname.c printf: add support for printing symbolic error names 2019-10-17 16:23:25 +02:00
error-inject.c
…
errseq.c
…
extable.c lib/extable.c: add missing prototypes 2019-09-25 17:51:39 -07:00
fault-inject.c
…
fdt.c
…
fdt_addresses.c libfdt: include fdt_addresses.c 2020-01-08 16:59:19 +00:00
fdt_empty_tree.c
…
fdt_ro.c
…
fdt_rw.c
…
fdt_strerror.c
…
fdt_sw.c
…
fdt_wip.c
…
find_bit.c lib/find_bit.c: uninline helper _find_next_bit() 2020-01-31 10:30:41 -08:00
find_bit_benchmark.c
…
flex_proportions.c
…
gen_crc32table.c
…
gen_crc64table.c
…
genalloc.c lib/genalloc.c: rename addr_in_gen_pool to gen_pool_has_addr 2019-12-04 19:44:13 -08:00
generic-radix-tree.c lib/generic-radix-tree.c: add kmemleak annotations 2019-10-14 15:04:00 -07:00
glob.c
…
globtest.c
…
hexdump.c lib/hexdump: make print_hex_dump_bytes() a nop on !DEBUG builds 2019-09-25 17:51:39 -07:00
hweight.c
…
idr.c idr: Fix idr_get_next_ul race with idr_remove 2019-11-01 22:26:34 -04:00
inflate.c
…
interval_tree.c
…
interval_tree_test.c
…
iomap.c
…
iomap_copy.c
…
iommu-helper.c
…
ioremap.c lib: provide a simple generic ioremap implementation 2019-11-11 21:18:20 +01:00
iov_iter.c pipe: Fix bogus dereference in iov_iter_alignment() 2019-12-16 12:48:10 -05:00
irq_poll.c
…
irq_regs.c
…
is_single_threaded.c
…
kasprintf.c
…
kfifo.c Partially revert "kfifo: fix kfifo_alloc() and kfifo_init()" 2019-08-30 18:47:15 -07:00
klist.c
…
kobject.c
…
kobject_uevent.c
…
kstrtox.c
…
kstrtox.h
…
libcrc32c.c
…
list-test.c kunit: allow kunit tests to be loaded as a module 2020-01-09 16:42:29 -07:00
list_debug.c
…
list_sort.c
…
llist.c
…
locking-selftest-hardirq.h
…
locking-selftest-mutex.h
…
locking-selftest-rlock-hardirq.h
…
locking-selftest-rlock-softirq.h
…
locking-selftest-rlock.h
…
locking-selftest-rsem.h
…
locking-selftest-rtmutex.h
…
locking-selftest-softirq.h
…
locking-selftest-spin-hardirq.h
…
locking-selftest-spin-softirq.h
…
locking-selftest-spin.h
…
locking-selftest-wlock-hardirq.h
…
locking-selftest-wlock-softirq.h
…
locking-selftest-wlock.h
…
locking-selftest-wsem.h
…
locking-selftest.c locking/lockdep: Remove unused @nested argument from lock_release() 2019-10-09 12:46:10 +02:00
lockref.c
…
logic_pio.c lib: logic_pio: Enforce LOGIC_PIO_INDIRECT region ops are set at registration 2019-11-05 08:45:25 +08:00
lru_cache.c
…
lshrdi3.c
…
memcat_p.c
…
memory-notifier-error-inject.c
…
memregion.c lib: Uplevel the pmem "region" ida to a global allocator 2019-11-07 15:44:29 +01:00
memweight.c
…
muldi3.c
…
net_utils.c
…
netdev-notifier-error-inject.c
…
nlattr.c
…
nmi_backtrace.c
…
nodemask.c
…
notifier-error-inject.c lib: notifier-error-inject: no need to check return value of debugfs_create functions 2019-07-03 16:57:18 +02:00
notifier-error-inject.h
…
objagg.c
…
of-reconfig-notifier-error-inject.c
…
oid_registry.c
…
once.c
…
packing.c
…
parman.c
…
parser.c
…
pci_iomap.c
…
percpu-refcount.c Merge branch 'for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu 2019-07-14 16:17:18 -07:00
percpu_counter.c
…
percpu_test.c
…
plist.c
…
pm-notifier-error-inject.c
…
radix-tree.c idr: Fix idr_alloc_u32 on 32-bit systems 2019-11-03 06:36:50 -05:00
random32.c
…
ratelimit.c
…
rbtree.c lib/rbtree: avoid generating code twice for the cached versions 2019-07-16 19:23:22 -07:00
rbtree_test.c augmented rbtree: add new RB_DECLARE_CALLBACKS_MAX macro 2019-09-25 17:51:39 -07:00
refcount.c locking/refcount: Consolidate implementations of refcount_t 2019-11-25 09:15:32 +01:00
rhashtable.c
…
sbitmap.c sbitmap: only queue kyber's wait callback if not already active 2019-12-20 16:51:54 -07:00
scatterlist.c lib/scatterlist.c: adjust indentation in __sg_alloc_table 2020-01-31 10:30:40 -08:00
seq_buf.c seq_buf: Add printing formatted hex dumps 2019-11-14 13:15:12 -05:00
sg_pool.c SCSI sg on 20190709 2019-07-11 15:17:41 -07:00
sg_split.c lib: scatterlist: Fix to support no mapped sg 2019-08-08 07:45:01 -06:00
sha1.c
…
show_mem.c mm: remove quicklist page table caches 2019-09-24 15:54:09 -07:00
siphash.c
…
smp_processor_id.c lib/smp_processor_id: Don't use cpumask_equal() 2019-10-09 12:46:10 +02:00
sort.c lib/sort: Move swap, cmp and cmp_r function types for wider use 2019-11-14 13:15:11 -05:00
stackdepot.c lib/stackdepot.c: fix global out-of-bounds in stack_slabs 2020-02-21 11:22:15 -08:00
stmp_device.c
…
string.c lib/string.c: update match_string() doc-strings with correct behavior 2020-02-21 11:22:15 -08:00
string_helpers.c lib/string_helpers: fix some kerneldoc warnings 2019-07-16 19:23:22 -07:00
strncpy_from_user.c lib: Reduce user_access_begin() boundaries in strncpy_from_user() and strnlen_user() 2020-01-24 09:27:34 -08:00
strnlen_user.c lib: Reduce user_access_begin() boundaries in strncpy_from_user() and strnlen_user() 2020-01-24 09:27:34 -08:00
syscall.c
…
test-kstrtox.c
…
test-string_helpers.c
…
test_bitfield.c
…
test_bitmap.c lib: new testcases for bitmap_parse{_user} 2020-02-04 03:05:27 +00:00
test_blackhole_dev.c blackhole_dev: add a selftest 2019-07-01 19:34:46 -07:00
test_bpf.c bpf, testing: Introduce 'gso_linear_no_head_frag' skb_segment test 2019-10-30 16:37:08 +01:00
test_debug_virtual.c
…
test_firmware.c test_firmware: add support for request_firmware_into_buf 2019-09-04 13:31:28 +02:00
test_hash.c
…
test_hexdump.c
…
test_ida.c
…
test_kasan.c lib/test_kasan.c: fix memory leak in kmalloc_oob_krealloc_more() 2020-01-31 10:30:38 -08:00
test_kmod.c
…
test_list_sort.c
…
test_memcat_p.c
…
test_meminit.c lib/test_meminit.c: add bulk alloc/free tests 2019-12-04 19:44:13 -08:00
test_module.c
…
test_objagg.c
…
test_overflow.c lib/test_overflow.c: avoid tainting the kernel and fix wrap size 2019-07-16 19:23:22 -07:00
test_parman.c
…
test_printf.c Device properties framework updates for 5.5-rc1 2019-11-26 19:45:12 -08:00
test_rhashtable.c
…
test_siphash.c
…
test_sort.c
…
test_stackinit.c
…
test_static_key_base.c
…
test_static_keys.c
…
test_string.c lib/test_string.c: add some testcases for strchr and strnchr 2019-07-16 19:23:22 -07:00
test_strscpy.c
…
test_sysctl.c
…
test_ubsan.c
…
test_user_copy.c usercopy: Avoid soft lockups in test_check_nonzero_user() 2019-10-16 14:56:21 +02:00
test_uuid.c
…
test_vmalloc.c
…
test_xarray.c XArray: Fix xas_find returning too many entries 2020-01-17 22:33:33 -05:00
textsearch.c lib: textsearch: fix escapes in example code 2019-10-03 12:12:23 -04:00
timerqueue.c lib/timerqueue: Rely on rbtree semantics for next timer 2019-07-24 17:38:01 +02:00
ts_bm.c
…
ts_fsm.c
…
ts_kmp.c
…
ubsan.c lib/ubsan: don't serialize UBSAN report 2019-12-04 19:44:14 -08:00
ubsan.h int128: move __uint128_t compiler test to Kconfig 2019-11-17 09:02:42 +08:00
ucmpdi2.c
…
ucs2_string.c
…
usercopy.c lib: introduce copy_struct_from_user() helper 2019-10-01 15:45:03 +02:00
uuid.c
…
vsprintf.c rss_stat: add support to detect RSS updates of external mm 2019-12-01 06:29:18 -08:00
win_minmax.c
…
xarray.c XArray: Fix xas_find returning too many entries 2020-01-17 22:33:33 -05:00
xxhash.c
…