• S
    efi: Use a work queue to invoke EFI Runtime Services · 3eb420e7
    Sai Praneeth 提交于
    Presently, when a user process requests the kernel to execute any
    UEFI runtime service, the kernel temporarily switches to a separate
    set of page tables that describe the virtual mapping of the UEFI
    runtime services regions in memory. Since UEFI runtime services are
    typically invoked with interrupts enabled, any code that may be called
    during this time, will have an incorrect view of the process's address
    space. Although it is unusual for code running in interrupt context to
    make assumptions about the process context it runs in, there are cases
    (such as the perf subsystem taking samples) where this causes problems.
    
    So let's set up a work queue for calling UEFI runtime services, so that
    the actual calls are made when the work queue items are dispatched by a
    work queue worker running in a separate kernel thread. Such threads are
    not expected to have userland mappings in the first place, and so the
    additional mappings created for the UEFI runtime services can never
    clash with any.
    
    The ResetSystem() runtime service is not covered by the work queue
    handling, since it is not expected to return, and may be called at a
    time when the kernel is torn down to the point where we cannot expect
    work queues to still be operational.
    
    The non-blocking variants of SetVariable() and QueryVariableInfo()
    are also excluded: these are intended to be used from atomic context,
    which obviously rules out waiting for a completion to be signalled by
    another thread. Note that these variants are currently only used for
    UEFI runtime services calls that occur very early in the boot, and
    for ones that occur in critical conditions, e.g., to flush kernel logs
    to UEFI variables via efi-pstore.
    Suggested-by: NAndy Lutomirski <luto@kernel.org>
    Signed-off-by: NSai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    [ardb: exclude ResetSystem() from the workqueue treatment
           merge from 2 separate patches and rewrite commit log]
    Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-efi@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180711094040.12506-4-ard.biesheuvel@linaro.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
    3eb420e7
efi.c 23.9 KB