lkml.org 
[lkml]   [2017]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 37/42] ARM: 8613/1: Fix the uaccess crash on PB11MPCore
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

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

    From: Linus Walleij <linus.walleij@linaro.org>

    commit 90f92c631b210c1e97080b53a9d863783281a932 upstream.

    The following patch was sketched by Russell in response to my
    crashes on the PB11MPCore after the patch for software-based
    priviledged no access support for ARMv8.1. See this thread:
    http://marc.info/?l=linux-arm-kernel&m=144051749807214&w=2

    I am unsure what is going on, I suspect everyone involved in
    the discussion is. I just want to repost this to get the
    discussion restarted, as I still have to apply this patch
    with every kernel iteration to get my PB11MPCore Realview
    running.

    Testing by Neil Armstrong on the Oxnas NAS has revealed that
    this bug exist also on that widely deployed hardware, so
    we are probably currently regressing all ARM11MPCore systems.

    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Will Deacon <will.deacon@arm.com>
    Fixes: a5e090acbf54 ("ARM: software-based priviledged-no-access support")
    Tested-by: Neil Armstrong <narmstrong@baylibre.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/arm/kernel/smp_tlb.c | 7 +++++++
    1 file changed, 7 insertions(+)

    --- a/arch/arm/kernel/smp_tlb.c
    +++ b/arch/arm/kernel/smp_tlb.c
    @@ -9,6 +9,7 @@
    */
    #include <linux/preempt.h>
    #include <linux/smp.h>
    +#include <linux/uaccess.h>

    #include <asm/smp_plat.h>
    #include <asm/tlbflush.h>
    @@ -40,8 +41,11 @@ static inline void ipi_flush_tlb_mm(void
    static inline void ipi_flush_tlb_page(void *arg)
    {
    struct tlb_args *ta = (struct tlb_args *)arg;
    + unsigned int __ua_flags = uaccess_save_and_enable();

    local_flush_tlb_page(ta->ta_vma, ta->ta_start);
    +
    + uaccess_restore(__ua_flags);
    }

    static inline void ipi_flush_tlb_kernel_page(void *arg)
    @@ -54,8 +58,11 @@ static inline void ipi_flush_tlb_kernel_
    static inline void ipi_flush_tlb_range(void *arg)
    {
    struct tlb_args *ta = (struct tlb_args *)arg;
    + unsigned int __ua_flags = uaccess_save_and_enable();

    local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
    +
    + uaccess_restore(__ua_flags);
    }

    static inline void ipi_flush_tlb_kernel_range(void *arg)

    \
     
     \ /
      Last update: 2017-01-24 09:34    [W:4.371 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site