lkml.org 
[lkml]   [2017]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 089/164] arm64: SW PAN: Update saved ttbr0 value on enter_lazy_tlb
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Will Deacon <will.deacon@arm.com>

    commit d96cc49bff5a7735576cc6f6f111f875d101cec8 upstream.

    enter_lazy_tlb is called when a kernel thread rides on the back of
    another mm, due to a context switch or an explicit call to unuse_mm
    where a call to switch_mm is elided.

    In these cases, it's important to keep the saved ttbr value up to date
    with the active mm, otherwise we can end up with a stale value which
    points to a potentially freed page table.

    This patch implements enter_lazy_tlb for arm64, so that the saved ttbr0
    is kept up-to-date with the active mm for kernel threads.

    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Vinayak Menon <vinmenon@codeaurora.org>
    Fixes: 39bc88e5e38e9b21 ("arm64: Disable TTBR0_EL1 during normal kernel execution")
    Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: Mark Rutland <mark.rutland@arm.com>
    Reported-by: Vinayak Menon <vinmenon@codeaurora.org>
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/arm64/include/asm/mmu_context.h | 24 ++++++++++--------------
    1 file changed, 10 insertions(+), 14 deletions(-)

    --- a/arch/arm64/include/asm/mmu_context.h
    +++ b/arch/arm64/include/asm/mmu_context.h
    @@ -156,20 +156,6 @@ void check_and_switch_context(struct mm_

    #define init_new_context(tsk,mm) ({ atomic64_set(&(mm)->context.id, 0); 0; })

    -/*
    - * This is called when "tsk" is about to enter lazy TLB mode.
    - *
    - * mm: describes the currently active mm context
    - * tsk: task which is entering lazy tlb
    - * cpu: cpu number which is entering lazy tlb
    - *
    - * tsk->mm will be NULL
    - */
    -static inline void
    -enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
    -{
    -}
    -
    #ifdef CONFIG_ARM64_SW_TTBR0_PAN
    static inline void update_saved_ttbr0(struct task_struct *tsk,
    struct mm_struct *mm)
    @@ -193,6 +179,16 @@ static inline void update_saved_ttbr0(st
    }
    #endif

    +static inline void
    +enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
    +{
    + /*
    + * We don't actually care about the ttbr0 mapping, so point it at the
    + * zero page.
    + */
    + update_saved_ttbr0(tsk, &init_mm);
    +}
    +
    static inline void __switch_mm(struct mm_struct *next)
    {
    unsigned int cpu = smp_processor_id();

    \
     
     \ /
      Last update: 2017-12-12 14:53    [W:4.715 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site