• Frederic Weisbecker's avatar
    context_tracking: Don't implement exception_enter/exit() on CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK · 179a9cf7
    Frederic Weisbecker authored
    The typical steps with context tracking are:
    
    1) Task runs in userspace
    2) Task enters the kernel (syscall/exception/IRQ)
    3) Task switches from context tracking state CONTEXT_USER to
       CONTEXT_KERNEL (user_exit())
    4) Task does stuff in kernel
    5) Task switches from context tracking state CONTEXT_KERNEL to
       CONTEXT_USER (user_enter())
    6) Task exits the kernel
    
    If an exception fires between 5) and 6), the pt_regs and the context
    tracking disagree on the context of the faulted/trapped instruction.
    CONTEXT_KERNEL must be set before the exception handler, that's
    unconditional for those handlers that want to be able to call into
    schedule(), but CONTEXT_USER must be restored when the exception exits
    whereas pt_regs tells that we are resuming to kernel space.
    
    This can't be fixed with storing the context tracking state in a per-cpu
    or per-task variable since another exception may fire onto the current
    one and overwrite the saved state. Also the task can schedule. So it
    has to be stored in a per task stack.
    
    This is how exception_enter()/exception_exit() paper over the problem:
    
    5) Task switches from context tracking state CONTEXT_KERNEL to
       CONTEXT_USER (user_enter())
    5.1) Exception fires
    5.2) prev_state = exception_enter() // save CONTEXT_USER to prev_state
                                        // and set CONTEXT_KERNEL
    5.3) Exception handler
    5.4) exception_enter(prev_state) // restore CONTEXT_USER
    5.5) Exception resumes
    6) Task exits the kernel
    
    The condition to live without exception_enter()/exception_exit() is to
    forbid exceptions and IRQs between 2) and 3) and between 5) and 6), or if
    any is allowed to trigger, it won't call into context tracking, eg: NMIs,
    and it won't schedule. These requirements are met by architectures
    supporting CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK and those can
    therefore afford not to implement this hack.
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20201117151637.259084-3-frederic@kernel.org
    179a9cf7
context_tracking.h 4.74 KB