• Andrew Jones's avatar
    arm64: paravirt: Initialize steal time when cpu is online · 75df529b
    Andrew Jones authored
    Steal time initialization requires mapping a memory region which
    invokes a memory allocation. Doing this at CPU starting time results
    in the following trace when CONFIG_DEBUG_ATOMIC_SLEEP is enabled:
    
    BUG: sleeping function called from invalid context at mm/slab.h:498
    in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 0, name: swapper/1
    CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.9.0-rc5+ #1
    Call trace:
     dump_backtrace+0x0/0x208
     show_stack+0x1c/0x28
     dump_stack+0xc4/0x11c
     ___might_sleep+0xf8/0x130
     __might_sleep+0x58/0x90
     slab_pre_alloc_hook.constprop.101+0xd0/0x118
     kmem_cache_alloc_node_trace+0x84/0x270
     __get_vm_area_node+0x88/0x210
     get_vm_area_caller+0x38/0x40
     __ioremap_caller+0x70/0xf8
     ioremap_cache+0x78/0xb0
     memremap+0x9c/0x1a8
     init_stolen_time_cpu+0x54/0xf0
     cpuhp_invoke_callback+0xa8/0x720
     notify_cpu_starting+0xc8/0xd8
     secondary_start_kernel+0x114/0x180
    CPU1: Booted secondary processor 0x0000000001 [0x431f0a11]
    
    However we don't need to initialize steal time at CPU starting time.
    We can simply wait until CPU online time, just sacrificing a bit of
    accuracy by returning zero for steal time until we know better.
    
    While at it, add __init to the functions that are only called by
    pv_time_init() which is __init.
    Signed-off-by: default avatarAndrew Jones <drjones@redhat.com>
    Fixes: e0685fa2 ("arm64: Retrieve stolen time as paravirtualized guest")
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarSteven Price <steven.price@arm.com>
    Link: https://lore.kernel.org/r/20200916154530.40809-1-drjones@redhat.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    75df529b
paravirt.c 3.41 KB