Eric Dumazet
f45f4f8a7c
bpf: fix lockdep splat
[ Upstream commit 89ad2fa3f043a1e8daae193bcb5fe34d5f8caf28 ]
pcpu_freelist_pop() needs the same lockdep awareness than
pcpu_freelist_populate() to avoid a false positive.
[ INFO: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected ]
switchto-defaul/12508 [HC0[0]:SC0[6]:HE0:SE0] is trying to acquire:
(&htab->buckets[i].lock){......}, at: [<ffffffff9dc099cb>] __htab_percpu_map_update_elem+0x1cb/0x300
and this task is already holding:
(dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2){+.-...}, at: [<ffffffff9e135848>] __dev_queue_xmit+0
x868/0x1240
which would create a new lock dependency:
(dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2){+.-...} -> (&htab->buckets[i].lock){......}
but this new dependency connects a SOFTIRQ-irq-safe lock:
(dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2){+.-...}
... which became SOFTIRQ-irq-safe at:
[<ffffffff9db5931b>] __lock_acquire+0x42b/0x1f10
[<ffffffff9db5b32c>] lock_acquire+0xbc/0x1b0
[<ffffffff9da05e38>] _raw_spin_lock+0x38/0x50
[<ffffffff9e135848>] __dev_queue_xmit+0x868/0x1240
[<ffffffff9e136240>] dev_queue_xmit+0x10/0x20
[<ffffffff9e1965d9>] ip_finish_output2+0x439/0x590
[<ffffffff9e197410>] ip_finish_output+0x150/0x2f0
[<ffffffff9e19886d>] ip_output+0x7d/0x260
[<ffffffff9e19789e>] ip_local_out+0x5e/0xe0
[<ffffffff9e197b25>] ip_queue_xmit+0x205/0x620
[<ffffffff9e1b8398>] tcp_transmit_skb+0x5a8/0xcb0
[<ffffffff9e1ba152>] tcp_write_xmit+0x242/0x1070
[<ffffffff9e1baffc>] __tcp_push_pending_frames+0x3c/0xf0
[<ffffffff9e1b3472>] tcp_rcv_established+0x312/0x700
[<ffffffff9e1c1acc>] tcp_v4_do_rcv+0x11c/0x200
[<ffffffff9e1c3dc2>] tcp_v4_rcv+0xaa2/0xc30
[<ffffffff9e191107>] ip_local_deliver_finish+0xa7/0x240
[<ffffffff9e191a36>] ip_local_deliver+0x66/0x200
[<ffffffff9e19137d>] ip_rcv_finish+0xdd/0x560
[<ffffffff9e191e65>] ip_rcv+0x295/0x510
[<ffffffff9e12ff88>] __netif_receive_skb_core+0x988/0x1020
[<ffffffff9e130641>] __netif_receive_skb+0x21/0x70
[<ffffffff9e1306ff>] process_backlog+0x6f/0x230
[<ffffffff9e132129>] net_rx_action+0x229/0x420
[<ffffffff9da07ee8>] __do_softirq+0xd8/0x43d
[<ffffffff9e282bcc>] do_softirq_own_stack+0x1c/0x30
[<ffffffff9dafc2f5>] do_softirq+0x55/0x60
[<ffffffff9dafc3a8>] __local_bh_enable_ip+0xa8/0xb0
[<ffffffff9db4c727>] cpu_startup_entry+0x1c7/0x500
[<ffffffff9daab333>] start_secondary+0x113/0x140
to a SOFTIRQ-irq-unsafe lock:
(&head->lock){+.+...}
... which became SOFTIRQ-irq-unsafe at:
... [<ffffffff9db5971f>] __lock_acquire+0x82f/0x1f10
[<ffffffff9db5b32c>] lock_acquire+0xbc/0x1b0
[<ffffffff9da05e38>] _raw_spin_lock+0x38/0x50
[<ffffffff9dc0b7fa>] pcpu_freelist_pop+0x7a/0xb0
[<ffffffff9dc08b2c>] htab_map_alloc+0x50c/0x5f0
[<ffffffff9dc00dc5>] SyS_bpf+0x265/0x1200
[<ffffffff9e28195f>] entry_SYSCALL_64_fastpath+0x12/0x17
other info that might help us debug this:
Chain exists of:
dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2 --> &htab->buckets[i].lock --> &head->lock
Possible interrupt unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&head->lock);
local_irq_disable();
lock(dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2);
lock(&htab->buckets[i].lock);
<Interrupt>
lock(dev_queue->dev->qdisc_class ?: &qdisc_tx_lock#2);
*** DEADLOCK ***
Fixes: e19494edab ("bpf: introduce percpu_freelist")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
2017-12-14 09:28:23 +01:00 |
| .. |
|
bpf
|
bpf: fix lockdep splat
|
2017-12-14 09:28:23 +01:00 |
|
configs
|
config: android: enable CONFIG_SECCOMP
|
2016-10-11 15:06:32 -07:00 |
|
debug
|
kdb: Fix handling of kallsyms_symbol_next() return value
|
2017-12-14 09:28:13 +01:00 |
|
events
|
perf/x86/intel: Account interrupts for PEBS errors
|
2017-12-09 22:01:52 +01:00 |
|
gcov
|
gcov: support GCC 7.1
|
2017-09-02 07:07:53 +02:00 |
|
irq
|
genirq: Make sparse_irq_lock protect what it should protect
|
2017-10-05 09:43:58 +02:00 |
|
livepatch
|
livepatch/module: make TAINT_LIVEPATCH module-specific
|
2016-08-26 14:42:08 +02:00 |
|
locking
|
locking/lockdep: Add nest_lock integrity test
|
2017-10-21 17:21:33 +02:00 |
|
power
|
sched/cpuset/pm: Fix cpuset vs. suspend-resume bugs
|
2017-10-12 11:51:25 +02:00 |
|
printk
|
printk: use rcuidle console tracepoint
|
2017-02-23 17:44:36 +01:00 |
|
rcu
|
rcu: Allow for page faults in NMI handlers
|
2017-10-18 09:35:38 +02:00 |
|
sched
|
sched/fair: Make select_idle_cpu() more aggressive
|
2017-12-14 09:28:17 +01:00 |
|
time
|
hrtimer: Catch invalid clockids again
|
2017-10-21 17:21:38 +02:00 |
|
trace
|
ftrace: Fix kmemleak in unregister_ftrace_graph
|
2017-10-12 11:51:24 +02:00 |
|
.gitignore
|
|
|
|
acct.c
|
|
|
|
async.c
|
|
|
|
audit.c
|
Merge branch 'stable-4.9' of git://git.infradead.org/users/pcmoore/audit
|
2016-10-04 14:21:41 -07:00 |
|
audit.h
|
Merge branch 'stable-4.8' of git://git.infradead.org/users/pcmoore/audit
|
2016-07-29 17:54:17 -07:00 |
|
audit_fsnotify.c
|
|
|
|
audit_tree.c
|
|
|
|
audit_watch.c
|
audit: Fix use after free in audit_remove_watch_rule()
|
2017-08-24 17:12:18 -07:00 |
|
auditfilter.c
|
audit: add fields to exclude filter by reusing user filter
|
2016-06-27 11:01:00 -04:00 |
|
auditsc.c
|
Merge branch 'stable-4.9' of git://git.infradead.org/users/pcmoore/audit
|
2016-10-04 14:21:41 -07:00 |
|
backtracetest.c
|
|
|
|
bounds.c
|
|
|
|
capability.c
|
ptrace: Capture the ptracer's creds not PT_PTRACE_CAP
|
2017-01-06 10:40:13 +01:00 |
|
cgroup.c
|
cgroup: fix error return value from cgroup_subtree_control()
|
2017-08-11 08:49:28 -07:00 |
|
cgroup_freezer.c
|
|
|
|
cgroup_pids.c
|
cgroup/pids: remove spurious suspicious RCU usage warning
|
2017-03-26 13:05:58 +02:00 |
|
compat.c
|
|
|
|
configs.c
|
|
|
|
context_tracking.c
|
|
|
|
cpu.c
|
smp/hotplug: Move step CPUHP_AP_SMPCFD_DYING to the correct place
|
2017-12-14 09:28:13 +01:00 |
|
cpu_pm.c
|
|
|
|
cpuset.c
|
sched/cpuset/pm: Fix cpuset vs. suspend-resume bugs
|
2017-10-12 11:51:25 +02:00 |
|
crash_dump.c
|
|
|
|
cred.c
|
cred: Reject inodes with invalid ids in set_create_file_as()
|
2016-06-30 18:05:09 -05:00 |
|
delayacct.c
|
|
|
|
dma.c
|
|
|
|
elfcore.c
|
|
|
|
exec_domain.c
|
|
|
|
exit.c
|
sched/autogroup: Do not use autogroup->tg in zombie threads
|
2016-11-22 12:33:43 +01:00 |
|
extable.c
|
kernel/extable.c: mark core_kernel_text notrace
|
2017-07-21 07:42:21 +02:00 |
|
fork.c
|
mm, uprobes: fix multiple free of ->uprobes_state.xol_area
|
2017-09-07 08:35:39 +02:00 |
|
freezer.c
|
freezer, oom: check TIF_MEMDIE on the correct task
|
2016-07-28 16:07:41 -07:00 |
|
futex.c
|
futex: Remove unnecessary warning from get_futex_key
|
2017-08-16 13:43:15 -07:00 |
|
futex_compat.c
|
|
|
|
groups.c
|
cred: simpler, 1D supplementary groups
|
2016-10-07 18:46:30 -07:00 |
|
hung_task.c
|
hung_task: allow hung_task_panic when hung_task_warnings is 0
|
2016-10-11 15:06:33 -07:00 |
|
irq_work.c
|
|
|
|
jump_label.c
|
jump_labels: API for flushing deferred jump label updates
|
2017-01-19 20:17:59 +01:00 |
|
kallsyms.c
|
|
|
|
kcmp.c
|
|
|
|
Kconfig.freezer
|
|
|
|
Kconfig.hz
|
|
|
|
Kconfig.locks
|
|
|
|
Kconfig.preempt
|
|
|
|
kcov.c
|
kcov: add missing #include <linux/sched.h>
|
2016-12-07 17:10:00 -08:00 |
|
kexec.c
|
kexec: allow architectures to override boot mapping
|
2016-08-02 19:35:27 -04:00 |
|
kexec_core.c
|
kexec: add restriction on kexec_load() segment sizes
|
2016-08-02 19:35:31 -04:00 |
|
kexec_file.c
|
kexec: fix double-free when failing to relocate the purgatory
|
2016-09-01 17:52:01 -07:00 |
|
kexec_internal.h
|
|
|
|
kmod.c
|
|
|
|
kprobes.c
|
tracing/kprobes: Enforce kprobes teardown after testing
|
2017-05-25 15:44:47 +02:00 |
|
ksysfs.c
|
kexec: add a kexec_crash_loaded() function
|
2016-08-02 19:35:30 -04:00 |
|
kthread.c
|
cgroup, kthread: close race window where new kthreads can be migrated to non-root cgroups
|
2017-04-21 09:31:18 +02:00 |
|
latencytop.c
|
|
|
|
Makefile
|
kernel/watchdog.c: move hardlockup detector to separate file
|
2017-06-17 06:41:57 +02:00 |
|
membarrier.c
|
Fix: Disable sys_membarrier when nohz_full is enabled
|
2017-03-12 06:41:45 +01:00 |
|
memremap.c
|
mm, devm_memremap_pages: hold device_hotplug lock over mem_hotplug_{begin, done}
|
2017-03-12 06:41:43 +01:00 |
|
module-internal.h
|
|
|
|
module.c
|
Re-enable CONFIG_MODVERSIONS in a slightly weaker form
|
2016-11-29 16:01:30 -08:00 |
|
module_signing.c
|
|
|
|
notifier.c
|
|
|
|
nsproxy.c
|
|
|
|
padata.c
|
padata: free correct variable
|
2017-05-20 14:28:40 +02:00 |
|
panic.c
|
kernel/panic.c: add missing \n
|
2017-07-05 14:40:24 +02:00 |
|
params.c
|
|
|
|
pid.c
|
pids: make task_tgid_nr_ns() safe
|
2017-08-24 17:12:21 -07:00 |
|
pid_namespace.c
|
pid_ns: Sleep in TASK_INTERRUPTIBLE in zap_pid_ns_processes
|
2017-05-25 15:44:38 +02:00 |
|
profile.c
|
profile: Convert to hotplug state machine
|
2016-07-15 10:41:42 +02:00 |
|
ptrace.c
|
ptrace: Properly initialize ptracer_cred on fork
|
2017-06-14 15:05:54 +02:00 |
|
range.c
|
|
|
|
reboot.c
|
|
|
|
relay.c
|
relay: check array offset before using it
|
2017-01-12 11:39:30 +01:00 |
|
resource.c
|
|
|
|
seccomp.c
|
seccomp: fix the usage of get/put_seccomp_filter() in seccomp_get_filter()
|
2017-10-05 09:44:02 +02:00 |
|
signal.c
|
signal: protect SIGNAL_UNKILLABLE from unintentional clearing.
|
2017-08-11 08:49:36 -07:00 |
|
smp.c
|
smp: Allocate smp_call_on_cpu() workqueue on stack too
|
2016-09-22 14:49:10 +02:00 |
|
smpboot.c
|
kthread/smpboot: do not park in kthread_create_on_cpu()
|
2016-10-11 15:06:33 -07:00 |
|
smpboot.h
|
|
|
|
softirq.c
|
softirq: Display IRQ_POLL for irq-poll statistics
|
2016-10-21 15:45:47 -06:00 |
|
stacktrace.c
|
stacktrace, lockdep: Fix address, newline ugliness
|
2017-02-14 15:25:42 -08:00 |
|
stop_machine.c
|
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-10-03 13:39:00 -07:00 |
|
sys.c
|
prctl: make PR_SET_THP_DISABLE wait for mmap_sem killable
|
2016-05-23 17:04:14 -07:00 |
|
sys_ni.c
|
x86/pkeys: Fix pkeys build breakage for some non-x86 arches
|
2016-09-13 14:41:36 +02:00 |
|
sysctl.c
|
timer/sysclt: Restrict timer migration sysctl values to 0 and 1
|
2017-10-05 09:44:04 +02:00 |
|
sysctl_binary.c
|
kernel/sysctl_binary.c: use generic UUID library
|
2016-05-20 17:58:30 -07:00 |
|
task_work.c
|
task_work: use READ_ONCE/lockless_dereference, avoid pi_lock if !task_works
|
2016-08-02 19:35:02 -04:00 |
|
taskstats.c
|
taskstats: fix the length of cgroupstats_cmd_get_policy
|
2016-11-03 16:55:58 -04:00 |
|
test_kprobes.c
|
|
|
|
torture.c
|
torture: Convert torture_shutdown() to hrtimer
|
2016-08-22 10:01:49 -07:00 |
|
tracepoint.c
|
|
|
|
tsacct.c
|
|
|
|
ucount.c
|
kernel/ucount.c: mark user_header with kmemleak_ignore()
|
2017-06-17 06:41:51 +02:00 |
|
uid16.c
|
cred: simpler, 1D supplementary groups
|
2016-10-07 18:46:30 -07:00 |
|
up.c
|
smp: Add function to execute a function synchronously on a CPU
|
2016-09-05 13:52:39 +02:00 |
|
user-return-notifier.c
|
|
|
|
user.c
|
|
|
|
user_namespace.c
|
Merge branch 'nsfs-ioctls' into HEAD
|
2016-09-22 20:00:36 -05:00 |
|
utsname.c
|
Merge branch 'nsfs-ioctls' into HEAD
|
2016-09-22 20:00:36 -05:00 |
|
utsname_sysctl.c
|
|
|
|
watchdog.c
|
kernel/watchdog: prevent false hardlockup on overloaded system
|
2017-06-17 06:41:57 +02:00 |
|
watchdog_hld.c
|
kernel/watchdog: prevent false hardlockup on overloaded system
|
2017-06-17 06:41:57 +02:00 |
|
workqueue.c
|
workqueue: trigger WARN if queue_delayed_work() is called with NULL @wq
|
2017-12-14 09:28:19 +01:00 |
|
workqueue_internal.h
|
workqueue: Fix NULL pointer dereference
|
2017-11-15 15:53:17 +01:00 |