BUG: sleeping function called from invalid context - seen with UML

John Stultz
2016-08-02T16:17:48Z

I'm trying to run UML with recent upstream kernels, and I've been
seeing the following BUG trigger over and over:

BUG: sleeping function called from invalid context at mm/slab.h:393
in_atomic(): 0, irqs_disabled(): 1, pid: 0, name: swapper
CPU: 0 PID: 0 Comm: swapper Tainted: G W 4.7.0-09120-ge48af7a #794
Stack:
603e1d20 60069689 600976ea 6002fb08
00000000 00000000 603e1d30 601c6336
603e1d80 60058225 603e1d60 603e4e50
Call Trace:
[<600976ea>] ? printk+0x0/0x94
[<6001d345>] show_stack+0xfe/0x158
[<60069689>] ? dump_stack_print_info+0xe1/0xea
[<600976ea>] ? printk+0x0/0x94
[<6002fb08>] ? get_signals+0x0/0xf
[<601c6336>] dump_stack+0x2a/0x2c
[<60058225>] ___might_sleep+0x181/0x18c
[<60058307>] __might_sleep+0xd7/0xe2
[<60069fa1>] ? handle_irq_event+0x56/0x6a
[<600cf35f>] __kmalloc+0x5a/0x121
[<6001bc10>] uml_kmalloc+0x13/0x15
[<6002e19d>] __wrap_malloc+0x3f/0x71
[<6002fa46>] sig_handler_common+0x3e/0x100
[<6002fa08>] ? sig_handler_common+0x0/0x100
[<6002f944>] ? block_signals+0x0/0x16
[<600976ea>] ? printk+0x0/0x94
[<6002f9c5>] unblock_signals+0x6b/0xae
[<601cc073>] ? strlen+0x0/0x16
[<6001c35b>] arch_cpu_idle+0x53/0x5a
[<601cc073>] ? strlen+0x0/0x16
[<6006029d>] default_idle_call+0x32/0x34
[<6007db99>] ? tick_nohz_idle_enter+0x75/0x77
[<60060353>] cpu_startup_entry+0xb4/0x11d
[<6006009e>] ? complete+0x0/0x5a
[<600382ec>] ? kernel_thread+0x0/0x2d
[<600382ec>] ? kernel_thread+0x0/0x2d
[<602fe646>] rest_init+0xa7/0xae
[<6002fb08>] ? get_signals+0x0/0xf
[<6002fb08>] ? get_signals+0x0/0xf
[<60001bc0>] start_kernel+0x529/0x538
[<60003626>] start_kernel_proc+0x49/0x4d
[<600660b8>] ? kmsg_dump_register+0x84/0x93
[<6001bf03>] new_thread_handler+0x81/0xa3
[<600035db>] ? kmsg_dumper_stdout_init+0x1a/0x1c
[<6001ee17>] uml_finishsetup+0x54/0x59

I tried to bisect it down, and it apparently popped up in the v4.7
merge window, with the following commit:

b6024b21fec8 ("um: extend fpstate to _xstate to support YMM
registers") which adds a malloc call to the sig_handler

Unfortunately just reverting that patch against v4.7 doesn't work, as
I then hit:

This architecture does not have kernel memory protection.
Registers -
0 0x2
1 0x0
2 0x0
3 0x0
4 0x0
5 0x0
6 0x0
7 0x0
8 0x0
9 0x0
10 0x0
11 0x0
12 0x0
13 0x0
14 0x0
15 0x0
16 0x10007b
17 0x0
18 0x0
19 0x0
20 0x0
21 0x0
22 0x0
23 0x0
24 0x0
25 0x0
26 0x0
Kernel panic - not syncing: do_syscall_stub : PTRACE_SETREGS failed, errno = 5

CPU: 0 PID: 1 Comm: swapper Not tainted 4.7.0-00001-g0a9f717 #795
Stack:
80455be0 60068d01 601ce033 60373c73
807928f0 60096cdf 80455bf0 601c4109
80455d10 600960cd 00002458 807928f0
Call Trace:
[<60096cdf>] ? printk+0x0/0x94
[<6001d345>] show_stack+0xfe/0x158
[<60068d01>] ? dump_stack_print_info+0xe1/0xea
[<601ce033>] ? bust_spinlocks+0x0/0x4f
[<60096cdf>] ? printk+0x0/0x94
[<601c4109>] dump_stack+0x2a/0x2c
[<600960cd>] panic+0x163/0x2f0
[<60095f6a>] ? panic+0x0/0x2f0
[<60096cdf>] ? printk+0x0/0x94
[<60096cdf>] ? printk+0x0/0x94
[<60057bb9>] ? __might_sleep+0xd7/0xe2
[<6003191a>] run_syscall_stub+0x145/0x2d4
[<60096cdf>] ? printk+0x0/0x94
[<600cda05>] ? kmem_cache_alloc+0x0/0xff
[<6003302e>] write_ldt_entry+0x84/0x8f
[<60033298>] init_new_ldt+0x25f/0x350
[<600cda05>] ? kmem_cache_alloc+0x0/0xff
[<6001f165>] init_new_context+0x102/0x14e
[<6009fa4a>] ? __get_free_pages+0x1c/0x5a
[<60063cc9>] ? __raw_spin_lock_init+0x0/0x1e
[<600359bf>] mm_init+0x1cc/0x211
[<600cdad3>] ? kmem_cache_alloc+0xce/0xff
[<60035e73>] mm_alloc+0x62/0x6d
[<600da275>] do_execveat_common+0x2b3/0x65e
[<600da641>] do_execve+0x21/0x23
[<6001a6d8>] run_init_process+0x3b/0x3f
[<6001a69d>] ? run_init_process+0x0/0x3f
[<60096cdf>] ? printk+0x0/0x94
[<602f9b5c>] kernel_init+0xbf/0x156
[<6001bf03>] new_thread_handler+0x81/0xa3

Any thoughts on how to get around this?

thanks
-john