• Ard Biesheuvel's avatar
    ARM: implement THREAD_INFO_IN_TASK for uniprocessor systems · 9c46929e
    Ard Biesheuvel authored
    On UP systems, only a single task can be 'current' at the same time,
    which means we can use a global variable to track it. This means we can
    also enable THREAD_INFO_IN_TASK for those systems, as in that case,
    thread_info is accessed via current rather than the other way around,
    removing the need to store thread_info at the base of the task stack.
    This, in turn, permits us to enable IRQ stacks and vmap'ed stacks on UP
    systems as well.
    
    To partially mitigate the performance overhead of this arrangement, use
    a ADD/ADD/LDR sequence with the appropriate PC-relative group
    relocations to load the value of current when needed. This means that
    accessing current will still only require a single load as before,
    avoiding the need for a literal to carry the address of the global
    variable in each function. However, accessing thread_info will now
    require this load as well.
    Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Acked-by: default avatarNicolas Pitre <nico@fluxnic.net>
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Tested-by: default avatarMarc Zyngier <maz@kernel.org>
    Tested-by: Vladimir Murzin <vladimir.murzin@arm.com> # ARMv7M
    9c46929e
process.c 10.4 KB