Ding Tianhong
bedc196915
rcu: Fix soft lockup for rcu_nocb_kthread
Carrying out the following steps results in a softlockup in the
RCU callback-offload (rcuo) kthreads:
1. Connect to ixgbevf, and set the speed to 10Gb/s.
2. Use ifconfig to bring the nic up and down repeatedly.
[ 317.005148] IPv6: ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready
[ 368.106005] BUG: soft lockup - CPU#1 stuck for 22s! [rcuos/1:15]
[ 368.106005] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[ 368.106005] task: ffff88057dd8a220 ti: ffff88057dd9c000 task.ti: ffff88057dd9c000
[ 368.106005] RIP: 0010:[<ffffffff81579e04>] [<ffffffff81579e04>] fib_table_lookup+0x14/0x390
[ 368.106005] RSP: 0018:ffff88061fc83ce8 EFLAGS: 00000286
[ 368.106005] RAX: 0000000000000001 RBX: 00000000020155c0 RCX: 0000000000000001
[ 368.106005] RDX: ffff88061fc83d50 RSI: ffff88061fc83d70 RDI: ffff880036d11a00
[ 368.106005] RBP: ffff88061fc83d08 R08: 0000000000000001 R09: 0000000000000000
[ 368.106005] R10: ffff880036d11a00 R11: ffffffff819e0900 R12: ffff88061fc83c58
[ 368.106005] R13: ffffffff816154dd R14: ffff88061fc83d08 R15: 00000000020155c0
[ 368.106005] FS: 0000000000000000(0000) GS:ffff88061fc80000(0000) knlGS:0000000000000000
[ 368.106005] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 368.106005] CR2: 00007f8c2aee9c40 CR3: 000000057b222000 CR4: 00000000000407e0
[ 368.106005] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 368.106005] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[ 368.106005] Stack:
[ 368.106005] 00000000010000c0 ffff88057b766000 ffff8802e380b000 ffff88057af03e00
[ 368.106005] ffff88061fc83dc0 ffffffff815349a6 ffff88061fc83d40 ffffffff814ee146
[ 368.106005] ffff8802e380af00 00000000e380af00 ffffffff819e0900 020155c0010000c0
[ 368.106005] Call Trace:
[ 368.106005] <IRQ>
[ 368.106005]
[ 368.106005] [<ffffffff815349a6>] ip_route_input_noref+0x516/0xbd0
[ 368.106005] [<ffffffff814ee146>] ? skb_release_data+0xd6/0x110
[ 368.106005] [<ffffffff814ee20a>] ? kfree_skb+0x3a/0xa0
[ 368.106005] [<ffffffff8153698f>] ip_rcv_finish+0x29f/0x350
[ 368.106005] [<ffffffff81537034>] ip_rcv+0x234/0x380
[ 368.106005] [<ffffffff814fd656>] __netif_receive_skb_core+0x676/0x870
[ 368.106005] [<ffffffff814fd868>] __netif_receive_skb+0x18/0x60
[ 368.106005] [<ffffffff814fe4de>] process_backlog+0xae/0x180
[ 368.106005] [<ffffffff814fdcb2>] net_rx_action+0x152/0x240
[ 368.106005] [<ffffffff81077b3f>] __do_softirq+0xef/0x280
[ 368.106005] [<ffffffff8161619c>] call_softirq+0x1c/0x30
[ 368.106005] <EOI>
[ 368.106005]
[ 368.106005] [<ffffffff81015d95>] do_softirq+0x65/0xa0
[ 368.106005] [<ffffffff81077174>] local_bh_enable+0x94/0xa0
[ 368.106005] [<ffffffff81114922>] rcu_nocb_kthread+0x232/0x370
[ 368.106005] [<ffffffff81098250>] ? wake_up_bit+0x30/0x30
[ 368.106005] [<ffffffff811146f0>] ? rcu_start_gp+0x40/0x40
[ 368.106005] [<ffffffff8109728f>] kthread+0xcf/0xe0
[ 368.106005] [<ffffffff810971c0>] ? kthread_create_on_node+0x140/0x140
[ 368.106005] [<ffffffff816147d8>] ret_from_fork+0x58/0x90
[ 368.106005] [<ffffffff810971c0>] ? kthread_create_on_node+0x140/0x140
==================================cut here==============================
It turns out that the rcuos callback-offload kthread is busy processing
a very large quantity of RCU callbacks, and it is not reliquishing the
CPU while doing so. This commit therefore adds an cond_resched_rcu_qs()
within the loop to allow other tasks to run.
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
[ paulmck: Substituted cond_resched_rcu_qs for cond_resched. ]
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
|
2016-08-22 07:53:20 -07:00 |
| .. |
|
bpf
|
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
|
2016-07-27 12:03:20 -07:00 |
|
configs
|
config: add android config fragments
|
2016-08-02 19:35:42 -04:00 |
|
debug
|
mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings
|
2016-02-22 08:51:37 +01:00 |
|
events
|
perf/core: Change log level for duration warning to KERN_INFO
|
2016-08-02 10:23:57 +02:00 |
|
gcov
|
gcov: add support for gcc version >= 6
|
2016-07-15 14:54:27 +09:00 |
|
irq
|
genirq: Fix missing irq allocation affinity hint
|
2016-07-19 10:49:47 +02:00 |
|
livepatch
|
modules: add ro_after_init support
|
2016-08-04 10:16:55 +09:30 |
|
locking
|
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-07-25 12:41:29 -07:00 |
|
power
|
mm, vmscan: move LRU lists to node
|
2016-07-28 16:07:41 -07:00 |
|
printk
|
printk: add kernel parameter to control writes to /dev/kmsg
|
2016-08-02 19:35:06 -04:00 |
|
rcu
|
rcu: Fix soft lockup for rcu_nocb_kthread
|
2016-08-22 07:53:20 -07:00 |
|
sched
|
xen: features and fixes for 4.8-rc0
|
2016-07-27 11:35:37 -07:00 |
|
time
|
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-07-29 13:55:30 -07:00 |
|
trace
|
block: rename bio bi_rw to bi_opf
|
2016-08-07 14:41:02 -06:00 |
|
.gitignore
|
|
|
|
acct.c
|
|
|
|
async.c
|
|
|
|
audit.c
|
Merge branch 'stable-4.8' of git://git.infradead.org/users/pcmoore/audit
|
2016-07-29 17:54:17 -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: cleanup prune_tree_thread
|
2016-04-04 09:46:47 -04:00 |
|
audit_watch.c
|
don't bother with ->d_inode->i_sb - it's always equal to ->d_sb
|
2016-04-10 17:11:51 -04: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.8' of git://git.infradead.org/users/pcmoore/audit
|
2016-07-29 17:54:17 -07:00 |
|
backtracetest.c
|
|
|
|
bounds.c
|
|
|
|
capability.c
|
kernel: Add noaudit variant of ns_capable()
|
2016-06-06 20:16:18 +10:00 |
|
cgroup.c
|
Merge branch 'for-4.7-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
|
2016-07-29 14:29:04 -07:00 |
|
cgroup_freezer.c
|
|
|
|
cgroup_pids.c
|
cgroup: Use lld instead of ld when printing pids controller events_limit
|
2016-06-21 15:03:36 -04:00 |
|
compat.c
|
|
|
|
configs.c
|
|
|
|
context_tracking.c
|
|
|
|
cpu.c
|
timers/core: Correct callback order during CPU hot plug
|
2016-07-28 18:56:22 +02:00 |
|
cpu_pm.c
|
|
|
|
cpuset.c
|
cpuset, mm: fix TIF_MEMDIE check in cpuset_change_task_nodemask
|
2016-07-28 16:07:41 -07: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
|
kernel/exit.c: quieten greatest stack depth printk
|
2016-08-02 19:35:23 -04:00 |
|
extable.c
|
|
|
|
fork.c
|
mm: fix memcg stack accounting for sub-page stacks
|
2016-07-28 16:07:41 -07:00 |
|
freezer.c
|
freezer, oom: check TIF_MEMDIE on the correct task
|
2016-07-28 16:07:41 -07:00 |
|
futex.c
|
futex: Calculate the futex key based on a tail page for file-based futexes
|
2016-06-08 19:23:54 +02:00 |
|
futex_compat.c
|
|
|
|
groups.c
|
|
|
|
hung_task.c
|
kernel/hung_task.c: use timeout diff when timeout is updated
|
2016-03-22 15:36:02 -07:00 |
|
irq_work.c
|
|
|
|
jump_label.c
|
powerpc updates for 4.8 #2
|
2016-08-05 09:00:54 -04:00 |
|
kallsyms.c
|
kallsyms: add support for relative offsets in kallsyms address table
|
2016-03-15 16:55:16 -07:00 |
|
kcmp.c
|
|
|
|
Kconfig.freezer
|
|
|
|
Kconfig.hz
|
|
|
|
Kconfig.locks
|
|
|
|
Kconfig.preempt
|
|
|
|
kcov.c
|
kernel/kcov: unproxify debugfs file's fops
|
2016-06-15 04:56:35 -07: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: introduce a protection mechanism for the crashkernel reserved memory
|
2016-05-23 17:04:14 -07:00 |
|
kexec_internal.h
|
|
|
|
kmod.c
|
|
|
|
kprobes.c
|
|
|
|
ksysfs.c
|
kexec: add a kexec_crash_loaded() function
|
2016-08-02 19:35:30 -04:00 |
|
kthread.c
|
|
|
|
latencytop.c
|
|
|
|
Makefile
|
ELF/MIPS build fix
|
2016-05-23 17:04:14 -07:00 |
|
membarrier.c
|
|
|
|
memremap.c
|
libnvdimm for 4.8
|
2016-07-28 17:38:16 -07:00 |
|
module-internal.h
|
|
|
|
module.c
|
Removed the MODULE_SIG_FORCE-means-no-MODULE_FORCE_LOAD patch.
|
2016-08-04 09:14:38 -04:00 |
|
module_signing.c
|
KEYS: Move the point of trust determination to __key_link()
|
2016-04-11 22:43:43 +01:00 |
|
notifier.c
|
|
|
|
nsproxy.c
|
cgroup: introduce cgroup namespaces
|
2016-02-16 13:04:58 -05:00 |
|
padata.c
|
kernel/padata.c: hide unused functions
|
2016-05-19 19:12:14 -07:00 |
|
panic.c
|
kexec: use core_param for crash_kexec_post_notifiers boot option
|
2016-08-02 19:35:29 -04:00 |
|
params.c
|
|
|
|
pid.c
|
remove lots of IS_ERR_VALUE abuses
|
2016-05-27 15:26:11 -07:00 |
|
pid_namespace.c
|
|
|
|
profile.c
|
profile: Convert to hotplug state machine
|
2016-07-15 10:41:42 +02:00 |
|
ptrace.c
|
tree-wide: replace config_enabled() with IS_ENABLED()
|
2016-08-04 08:50:07 -04:00 |
|
range.c
|
|
|
|
reboot.c
|
|
|
|
relay.c
|
relay: add global mode support for buffer-only channels
|
2016-08-02 19:35:41 -04:00 |
|
resource.c
|
/proc/iomem: only expose physical resource addresses to privileged users
|
2016-04-14 12:56:09 -07:00 |
|
seccomp.c
|
tree-wide: replace config_enabled() with IS_ENABLED()
|
2016-08-04 08:50:07 -04:00 |
|
signal.c
|
signals: Use hrtimer for sigtimedwait()
|
2016-07-07 10:35:07 +02:00 |
|
smp.c
|
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-07-29 13:55:30 -07:00 |
|
smpboot.c
|
cpu/hotplug: Unpark smpboot threads from the state machine
|
2016-03-01 20:36:56 +01:00 |
|
smpboot.h
|
cpu/hotplug: Create hotplug threads
|
2016-03-01 20:36:56 +01:00 |
|
softirq.c
|
arch, ftrace: for KASAN put hard/soft IRQ entries into separate sections
|
2016-03-25 16:37:42 -07:00 |
|
stacktrace.c
|
|
|
|
stop_machine.c
|
stop_machine: Touch_nmi_watchdog() after MULTI_STOP_PREPARE
|
2016-07-27 11:12:11 +02: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
|
|
|
|
sysctl.c
|
printk: add kernel parameter to control writes to /dev/kmsg
|
2016-08-02 19:35:06 -04: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: use the libnl API to align nlattr on 64-bit
|
2016-04-23 20:13:25 -04:00 |
|
test_kprobes.c
|
|
|
|
torture.c
|
torture: Stop onoff task if there is only one cpu
|
2016-06-14 16:03:28 -07:00 |
|
tracepoint.c
|
kernel/...: convert pr_warning to pr_warn
|
2016-03-22 15:36:02 -07:00 |
|
tsacct.c
|
time, acct: Drop irq save & restore from __acct_update_integrals()
|
2016-02-29 09:53:09 +01:00 |
|
uid16.c
|
|
|
|
up.c
|
|
|
|
user-return-notifier.c
|
|
|
|
user.c
|
|
|
|
user_namespace.c
|
fs: Limit file caps to the user namespace of the super block
|
2016-06-24 10:40:31 -05:00 |
|
utsname.c
|
|
|
|
utsname_sysctl.c
|
|
|
|
watchdog.c
|
Revert "perf/x86/intel, watchdog: Switch NMI watchdog to ref cycles on x86"
|
2016-07-10 20:58:36 +02:00 |
|
workqueue.c
|
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-07-29 13:55:30 -07:00 |
|
workqueue_internal.h
|
sched/core: Get rid of 'cpu' argument in wq_worker_sleeping()
|
2016-03-02 10:28:47 -05:00 |