* Spurious lockdep splat in v4.15-rc9 @ 2018-01-22 17:10 Tejun Heo 2018-01-22 17:40 ` Peter Zijlstra 2018-01-22 21:53 ` Peter Zijlstra 0 siblings, 2 replies; 5+ messages in thread From: Tejun Heo @ 2018-01-22 17:10 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar; +Cc: linux-kernel Hello, Peter, Ingo. I get the below lockdep warning if I try to write a config into cgroup cpu.max file. It's warning about A-A deadlock, but it's obviously spurious - the system doesn't lock up and the warning is about two get_online_cpus() calls nesting. Thanks. [ 79.106704] [ 79.106886] ============================================ [ 79.107319] WARNING: possible recursive locking detected [ 79.107741] 4.15.0-rc9-work+ #61 Not tainted [ 79.108080] -------------------------------------------- [ 79.108505] bash/2133 is trying to acquire lock: [ 79.108872] (cpu_hotplug_lock.rw_sem){++++}, at: [<00000000b3203afd>] static_key_slow_inc+0xe/0xa0 [ 79.109593] [ 79.109593] but task is already holding lock: [ 79.110058] (cpu_hotplug_lock.rw_sem){++++}, at: [<00000000748e6cec>] tg_set_cfs_bandwidth+0x51/0x330 [ 79.110801] [ 79.110801] other info that might help us debug this: [ 79.111322] Possible unsafe locking scenario: [ 79.111322] [ 79.111792] CPU0 [ 79.111992] ---- [ 79.112197] lock(cpu_hotplug_lock.rw_sem); [ 79.112537] lock(cpu_hotplug_lock.rw_sem); [ 79.112880] [ 79.112880] *** DEADLOCK *** [ 79.112880] [ 79.113355] May be due to missing lock nesting notation [ 79.113355] [ 79.113893] 5 locks held by bash/2133: [ 79.114199] #0: (sb_writers#7){.+.+}, at: [<00000000259a9362>] vfs_write+0x18a/0x1c0 [ 79.114830] #1: (&of->mutex){+.+.}, at: [<00000000b1a2a028>] kernfs_fop_write+0xde/0x1a0 [ 79.115492] #2: (kn->count#182){.+.+}, at: [<000000008f74a9a4>] kernfs_fop_write+0xe6/0x1a0 [ 79.116182] #3: (cpu_hotplug_lock.rw_sem){++++}, at: [<00000000748e6cec>] tg_set_cfs_bandwidth+0x51/0x330 [ 79.116956] #4: (cfs_constraints_mutex){+.+.}, at: [<000000007a63f0e9>] tg_set_cfs_bandwidth+0x5f/0x330 [ 79.117717] [ 79.117717] stack backtrace: [ 79.118072] CPU: 13 PID: 2133 Comm: bash Not tainted 4.15.0-rc9-work+ #61 [ 79.118616] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-3.el7_4.1 04/01/2014 [ 79.119331] Call Trace: [ 79.119539] dump_stack+0x5e/0x8f [ 79.119809] __lock_acquire+0x150e/0x15f0 [ 79.120136] ? tg_set_cfs_bandwidth+0x5f/0x330 [ 79.120497] ? __mutex_lock+0x204/0x930 [ 79.120805] ? tg_set_cfs_bandwidth+0x5f/0x330 [ 79.121164] lock_acquire+0xb0/0x200 [ 79.121454] ? static_key_slow_inc+0xe/0xa0 [ 79.121798] cpus_read_lock+0x43/0xb0 [ 79.122095] ? static_key_slow_inc+0xe/0xa0 [ 79.122438] static_key_slow_inc+0xe/0xa0 [ 79.122763] tg_set_cfs_bandwidth+0x30e/0x330 [ 79.123112] ? tg_set_cfs_bandwidth+0xaa/0x330 [ 79.123473] cpu_max_write+0xb8/0x100 [ 79.123773] cgroup_file_write+0x69/0x200 [ 79.124100] kernfs_fop_write+0x10e/0x1a0 [ 79.124430] __vfs_write+0x23/0x130 [ 79.124721] ? rcu_read_lock_sched_held+0x96/0xa0 [ 79.125100] ? rcu_sync_lockdep_assert+0x2a/0x50 [ 79.125475] ? __sb_start_write+0x194/0x230 [ 79.125812] ? vfs_write+0x18a/0x1c0 [ 79.126109] ? __close_fd+0x66/0xd0 [ 79.126392] vfs_write+0xbf/0x1c0 [ 79.126660] SyS_write+0x45/0xa0 [ 79.126928] entry_SYSCALL_64_fastpath+0x18/0x85 [ 79.127306] RIP: 0033:0x7f3b040e21f0 -- tejun ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious lockdep splat in v4.15-rc9 2018-01-22 17:10 Spurious lockdep splat in v4.15-rc9 Tejun Heo @ 2018-01-22 17:40 ` Peter Zijlstra 2018-01-22 21:53 ` Peter Zijlstra 1 sibling, 0 replies; 5+ messages in thread From: Peter Zijlstra @ 2018-01-22 17:40 UTC (permalink / raw) To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel On Mon, Jan 22, 2018 at 09:10:18AM -0800, Tejun Heo wrote: > Hello, Peter, Ingo. > > I get the below lockdep warning if I try to write a config into cgroup > cpu.max file. It's warning about A-A deadlock, but it's obviously > spurious - the system doesn't lock up and the warning is about two > get_online_cpus() calls nesting. Looks real, just not instantly fatal. It would generate an actual deadlock the moment there is a contending hotplug operation around though. I'll have a wee look. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious lockdep splat in v4.15-rc9 2018-01-22 17:10 Spurious lockdep splat in v4.15-rc9 Tejun Heo 2018-01-22 17:40 ` Peter Zijlstra @ 2018-01-22 21:53 ` Peter Zijlstra 2018-01-22 22:03 ` Tejun Heo 2018-01-24 10:38 ` [tip:sched/urgent] sched/core: Fix cpu.max vs. cpuhotplug deadlock tip-bot for Peter Zijlstra 1 sibling, 2 replies; 5+ messages in thread From: Peter Zijlstra @ 2018-01-22 21:53 UTC (permalink / raw) To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel, Thomas Gleixner Tejun, does the below work for you (compile tested only). --- Subject: sched: Fix cpu.max vs cpuhotplug deadlock Tejun reported the following cpu-hotplug lock (percpu-rwsem) read recursion: tg_set_cfs_bandwidth() get_online_cpus() cpus_read_lock() cfs_bandwidth_usage_inc() static_key_slow_inc() cpus_read_lock() Reported-by: Tejun Heo <tj@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- include/linux/jump_label.h | 7 +++++++ kernel/jump_label.c | 12 +++++++++--- kernel/sched/fair.c | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index c7b368c734af..e0340ca08d98 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -160,6 +160,8 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry, extern int jump_label_text_reserved(void *start, void *end); extern void static_key_slow_inc(struct static_key *key); extern void static_key_slow_dec(struct static_key *key); +extern void static_key_slow_inc_cpuslocked(struct static_key *key); +extern void static_key_slow_dec_cpuslocked(struct static_key *key); extern void jump_label_apply_nops(struct module *mod); extern int static_key_count(struct static_key *key); extern void static_key_enable(struct static_key *key); @@ -222,6 +224,9 @@ static inline void static_key_slow_dec(struct static_key *key) atomic_dec(&key->enabled); } +#define static_key_slow_inc_cpuslocked(key) static_key_slow_inc(key) +#define static_key_slow_dec_cpuslocked(key) static_key_slow_dec(key) + static inline int jump_label_text_reserved(void *start, void *end) { return 0; @@ -416,6 +421,8 @@ struct static_key_false { #define static_branch_inc(x) static_key_slow_inc(&(x)->key) #define static_branch_dec(x) static_key_slow_dec(&(x)->key) +#define static_branch_inc_cpuslocked(x) static_key_slow_inc_cpuslocked(&(x)->key) +#define static_branch_dec_cpuslocked(x) static_key_slow_dec_cpuslocked(&(x)->key) /* * Normal usage; boolean enable/disable. diff --git a/kernel/jump_label.c b/kernel/jump_label.c index 8594d24e4adc..b4517095db6a 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c @@ -79,7 +79,7 @@ int static_key_count(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_count); -static void static_key_slow_inc_cpuslocked(struct static_key *key) +void static_key_slow_inc_cpuslocked(struct static_key *key) { int v, v1; @@ -180,7 +180,7 @@ void static_key_disable(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_disable); -static void static_key_slow_dec_cpuslocked(struct static_key *key, +static void __static_key_slow_dec_cpuslocked(struct static_key *key, unsigned long rate_limit, struct delayed_work *work) { @@ -211,7 +211,7 @@ static void __static_key_slow_dec(struct static_key *key, struct delayed_work *work) { cpus_read_lock(); - static_key_slow_dec_cpuslocked(key, rate_limit, work); + __static_key_slow_dec_cpuslocked(key, rate_limit, work); cpus_read_unlock(); } @@ -229,6 +229,12 @@ void static_key_slow_dec(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_slow_dec); +void static_key_slow_dec_cpuslocked(struct static_key *key) +{ + STATIC_KEY_CHECK_USE(key); + __static_key_slow_dec_cpuslocked(key, 0, NULL); +} + void static_key_slow_dec_deferred(struct static_key_deferred *key) { STATIC_KEY_CHECK_USE(key); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1070803cb423..7b6535987500 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4361,12 +4361,12 @@ static inline bool cfs_bandwidth_used(void) void cfs_bandwidth_usage_inc(void) { - static_key_slow_inc(&__cfs_bandwidth_used); + static_key_slow_inc_cpuslocked(&__cfs_bandwidth_used); } void cfs_bandwidth_usage_dec(void) { - static_key_slow_dec(&__cfs_bandwidth_used); + static_key_slow_dec_cpuslocked(&__cfs_bandwidth_used); } #else /* HAVE_JUMP_LABEL */ static bool cfs_bandwidth_used(void) ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: Spurious lockdep splat in v4.15-rc9 2018-01-22 21:53 ` Peter Zijlstra @ 2018-01-22 22:03 ` Tejun Heo 2018-01-24 10:38 ` [tip:sched/urgent] sched/core: Fix cpu.max vs. cpuhotplug deadlock tip-bot for Peter Zijlstra 1 sibling, 0 replies; 5+ messages in thread From: Tejun Heo @ 2018-01-22 22:03 UTC (permalink / raw) To: Peter Zijlstra; +Cc: Ingo Molnar, linux-kernel, Thomas Gleixner Hello, Peter. On Mon, Jan 22, 2018 at 10:53:29PM +0100, Peter Zijlstra wrote: > > Tejun, does the below work for you (compile tested only). Yeap, that gets rid of the lockdep warning. Thanks a lot. -- tejun ^ permalink raw reply [flat|nested] 5+ messages in thread
* [tip:sched/urgent] sched/core: Fix cpu.max vs. cpuhotplug deadlock 2018-01-22 21:53 ` Peter Zijlstra 2018-01-22 22:03 ` Tejun Heo @ 2018-01-24 10:38 ` tip-bot for Peter Zijlstra 1 sibling, 0 replies; 5+ messages in thread From: tip-bot for Peter Zijlstra @ 2018-01-24 10:38 UTC (permalink / raw) To: linux-tip-commits; +Cc: tglx, tj, peterz, hpa, linux-kernel, torvalds, mingo Commit-ID: ce48c146495a1a50e48cdbfbfaba3e708be7c07c Gitweb: https://git.kernel.org/tip/ce48c146495a1a50e48cdbfbfaba3e708be7c07c Author: Peter Zijlstra <peterz@infradead.org> AuthorDate: Mon, 22 Jan 2018 22:53:28 +0100 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Wed, 24 Jan 2018 10:03:44 +0100 sched/core: Fix cpu.max vs. cpuhotplug deadlock Tejun reported the following cpu-hotplug lock (percpu-rwsem) read recursion: tg_set_cfs_bandwidth() get_online_cpus() cpus_read_lock() cfs_bandwidth_usage_inc() static_key_slow_inc() cpus_read_lock() Reported-by: Tejun Heo <tj@kernel.org> Tested-by: Tejun Heo <tj@kernel.org> 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> Link: http://lkml.kernel.org/r/20180122215328.GP3397@worktop Signed-off-by: Ingo Molnar <mingo@kernel.org> --- include/linux/jump_label.h | 7 +++++++ kernel/jump_label.c | 12 +++++++++--- kernel/sched/fair.c | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index c7b368c..e0340ca 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -160,6 +160,8 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry, extern int jump_label_text_reserved(void *start, void *end); extern void static_key_slow_inc(struct static_key *key); extern void static_key_slow_dec(struct static_key *key); +extern void static_key_slow_inc_cpuslocked(struct static_key *key); +extern void static_key_slow_dec_cpuslocked(struct static_key *key); extern void jump_label_apply_nops(struct module *mod); extern int static_key_count(struct static_key *key); extern void static_key_enable(struct static_key *key); @@ -222,6 +224,9 @@ static inline void static_key_slow_dec(struct static_key *key) atomic_dec(&key->enabled); } +#define static_key_slow_inc_cpuslocked(key) static_key_slow_inc(key) +#define static_key_slow_dec_cpuslocked(key) static_key_slow_dec(key) + static inline int jump_label_text_reserved(void *start, void *end) { return 0; @@ -416,6 +421,8 @@ extern bool ____wrong_branch_error(void); #define static_branch_inc(x) static_key_slow_inc(&(x)->key) #define static_branch_dec(x) static_key_slow_dec(&(x)->key) +#define static_branch_inc_cpuslocked(x) static_key_slow_inc_cpuslocked(&(x)->key) +#define static_branch_dec_cpuslocked(x) static_key_slow_dec_cpuslocked(&(x)->key) /* * Normal usage; boolean enable/disable. diff --git a/kernel/jump_label.c b/kernel/jump_label.c index 8594d24..b451709 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c @@ -79,7 +79,7 @@ int static_key_count(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_count); -static void static_key_slow_inc_cpuslocked(struct static_key *key) +void static_key_slow_inc_cpuslocked(struct static_key *key) { int v, v1; @@ -180,7 +180,7 @@ void static_key_disable(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_disable); -static void static_key_slow_dec_cpuslocked(struct static_key *key, +static void __static_key_slow_dec_cpuslocked(struct static_key *key, unsigned long rate_limit, struct delayed_work *work) { @@ -211,7 +211,7 @@ static void __static_key_slow_dec(struct static_key *key, struct delayed_work *work) { cpus_read_lock(); - static_key_slow_dec_cpuslocked(key, rate_limit, work); + __static_key_slow_dec_cpuslocked(key, rate_limit, work); cpus_read_unlock(); } @@ -229,6 +229,12 @@ void static_key_slow_dec(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_slow_dec); +void static_key_slow_dec_cpuslocked(struct static_key *key) +{ + STATIC_KEY_CHECK_USE(key); + __static_key_slow_dec_cpuslocked(key, 0, NULL); +} + void static_key_slow_dec_deferred(struct static_key_deferred *key) { STATIC_KEY_CHECK_USE(key); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2fe3aa8..26a71eb 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4365,12 +4365,12 @@ static inline bool cfs_bandwidth_used(void) void cfs_bandwidth_usage_inc(void) { - static_key_slow_inc(&__cfs_bandwidth_used); + static_key_slow_inc_cpuslocked(&__cfs_bandwidth_used); } void cfs_bandwidth_usage_dec(void) { - static_key_slow_dec(&__cfs_bandwidth_used); + static_key_slow_dec_cpuslocked(&__cfs_bandwidth_used); } #else /* HAVE_JUMP_LABEL */ static bool cfs_bandwidth_used(void) ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-01-24 10:43 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-01-22 17:10 Spurious lockdep splat in v4.15-rc9 Tejun Heo 2018-01-22 17:40 ` Peter Zijlstra 2018-01-22 21:53 ` Peter Zijlstra 2018-01-22 22:03 ` Tejun Heo 2018-01-24 10:38 ` [tip:sched/urgent] sched/core: Fix cpu.max vs. cpuhotplug deadlock tip-bot for Peter Zijlstra
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).