• Huacai Chen's avatar
    MIPS: Remove BUG_ON(!is_fpu_owner()) in do_ade() · 08d874f5
    Huacai Chen authored
    commit 2e5767a2 upstream.
    
    In do_ade(), is_fpu_owner() isn't preempt-safe. For example, when an
    unaligned ldc1 is executed, do_cpu() is called and then FPU will be
    enabled (and TIF_USEDFPU will be set for the current process). Then,
    do_ade() is called because the access is unaligned.  If the current
    process is preempted at this time, TIF_USEDFPU will be cleard.  So when
    the process is scheduled again, BUG_ON(!is_fpu_owner()) is triggered.
    
    This small program can trigger this BUG in a preemptible kernel:
    
    int main (int argc, char *argv[])
    {
            double u64[2];
    
            while (1) {
                    asm volatile (
                            ".set push \n\t"
                            ".set noreorder \n\t"
                            "ldc1 $f3, 4(%0) \n\t"
                            ".set pop \n\t"
                            ::"r"(u64):
                    );
            }
    
            return 0;
    }
    
    V2: Remove the BUG_ON() unconditionally due to Paul's suggestion.
    Signed-off-by: default avatarHuacai Chen <chenhc@lemote.com>
    Signed-off-by: default avatarJie Chen <chenj@lemote.com>
    Signed-off-by: default avatarRui Wang <wangr@lemote.com>
    Cc: John Crispin <john@phrozen.org>
    Cc: Steven J. Hill <Steven.Hill@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Cc: Fuxin Zhang <zhangfx@lemote.com>
    Cc: Zhangjin Wu <wuzhangjin@gmail.com>
    Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    08d874f5
unaligned.c 42.3 KB