• Julien Grall's avatar
    xen/events: events_fifo: Don't use {get,put}_cpu() in xen_evtchn_fifo_init() · 22f12f0d
    Julien Grall authored
    When booting Linux as Xen guest with CONFIG_DEBUG_ATOMIC, the following
    splat appears:
    
    [    0.002323] Mountpoint-cache hash table entries: 1024 (order: 1, 8192 bytes)
    [    0.019717] ASID allocator initialised with 65536 entries
    [    0.020019] xen:grant_table: Grant tables using version 1 layout
    [    0.020051] Grant table initialized
    [    0.020069] BUG: sleeping function called from invalid context at /data/src/linux/mm/page_alloc.c:4046
    [    0.020100] in_atomic(): 1, irqs_disabled(): 0, pid: 1, name: swapper/0
    [    0.020123] no locks held by swapper/0/1.
    [    0.020143] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.13.0-rc5 #598
    [    0.020166] Hardware name: FVP Base (DT)
    [    0.020182] Call trace:
    [    0.020199] [<ffff00000808a5c0>] dump_backtrace+0x0/0x270
    [    0.020222] [<ffff00000808a95c>] show_stack+0x24/0x30
    [    0.020244] [<ffff000008c1ef20>] dump_stack+0xb8/0xf0
    [    0.020267] [<ffff0000081128c0>] ___might_sleep+0x1c8/0x1f8
    [    0.020291] [<ffff000008112948>] __might_sleep+0x58/0x90
    [    0.020313] [<ffff0000082171b8>] __alloc_pages_nodemask+0x1c0/0x12e8
    [    0.020338] [<ffff00000827a110>] alloc_page_interleave+0x38/0x88
    [    0.020363] [<ffff00000827a904>] alloc_pages_current+0xdc/0xf0
    [    0.020387] [<ffff000008211f38>] __get_free_pages+0x28/0x50
    [    0.020411] [<ffff0000086566a4>] evtchn_fifo_alloc_control_block+0x2c/0xa0
    [    0.020437] [<ffff0000091747b0>] xen_evtchn_fifo_init+0x38/0xb4
    [    0.020461] [<ffff0000091746c0>] xen_init_IRQ+0x44/0xc8
    [    0.020484] [<ffff000009128adc>] xen_guest_init+0x250/0x300
    [    0.020507] [<ffff000008083974>] do_one_initcall+0x44/0x130
    [    0.020531] [<ffff000009120df8>] kernel_init_freeable+0x120/0x288
    [    0.020556] [<ffff000008c31ca8>] kernel_init+0x18/0x110
    [    0.020578] [<ffff000008083710>] ret_from_fork+0x10/0x40
    [    0.020606] xen:events: Using FIFO-based ABI
    [    0.020658] Xen: initializing cpu0
    [    0.027727] Hierarchical SRCU implementation.
    [    0.036235] EFI services will not be available.
    [    0.043810] smp: Bringing up secondary CPUs ...
    
    This is because get_cpu() in xen_evtchn_fifo_init() will disable
    preemption, but __get_free_page() might sleep (GFP_ATOMIC is not set).
    
    xen_evtchn_fifo_init() will always be called before SMP is initialized,
    so {get,put}_cpu() could be replaced by a simple smp_processor_id().
    
    This also avoid to modify evtchn_fifo_alloc_control_block that will be
    called in other context.
    Signed-off-by: 's avatarJulien Grall <julien.grall@arm.com>
    Reported-by: 's avatarAndre Przywara <andre.przywara@arm.com>
    Reviewed-by: 's avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Fixes: 1fe56551 ("xen/events: use the FIFO-based ABI if available")
    Signed-off-by: 's avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    22f12f0d
Name
Last commit
Last update
..
events Loading commit data...
xen-pciback Loading commit data...
xenbus Loading commit data...
xenfs Loading commit data...
Kconfig Loading commit data...
Makefile Loading commit data...
acpi.c Loading commit data...
arm-device.c Loading commit data...
balloon.c Loading commit data...
biomerge.c Loading commit data...
cpu_hotplug.c Loading commit data...
dbgp.c Loading commit data...
efi.c Loading commit data...
evtchn.c Loading commit data...
fallback.c Loading commit data...
features.c Loading commit data...
gntalloc.c Loading commit data...
gntdev.c Loading commit data...
grant-table.c Loading commit data...
manage.c Loading commit data...
mcelog.c Loading commit data...
pci.c Loading commit data...
pcpu.c Loading commit data...
platform-pci.c Loading commit data...
preempt.c Loading commit data...
privcmd.c Loading commit data...
privcmd.h Loading commit data...
pvcalls-back.c Loading commit data...
swiotlb-xen.c Loading commit data...
sys-hypervisor.c Loading commit data...
time.c Loading commit data...
tmem.c Loading commit data...
xen-acpi-cpuhotplug.c Loading commit data...
xen-acpi-memhotplug.c Loading commit data...
xen-acpi-pad.c Loading commit data...
xen-acpi-processor.c Loading commit data...
xen-balloon.c Loading commit data...
xen-scsiback.c Loading commit data...
xen-selfballoon.c Loading commit data...
xen-stub.c Loading commit data...
xlate_mmu.c Loading commit data...