diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-08-09 16:28:09 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-08-09 16:28:09 -0700 |
| commit | 5d44f4b3484e85c8d4527ecaca5e536da774ae21 (patch) | |
| tree | 5c699fd097844ecdf30ef9b47444064d713ac410 /arch/mips/include/asm/pgtable.h | |
| parent | 4816693286d4ff9219b1cc72c2ab9c589448ebcb (diff) | |
| parent | f7644cbfcdf03528f0f450f3940c4985b2291f49 (diff) | |
| download | linux-5d44f4b3484e85c8d4527ecaca5e536da774ae21.tar.gz linux-5d44f4b3484e85c8d4527ecaca5e536da774ae21.tar.bz2 linux-5d44f4b3484e85c8d4527ecaca5e536da774ae21.zip | |
Merge 4.2-rc6 into char-misc-next
We want the fixes in Linus's tree in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/mips/include/asm/pgtable.h')
| -rw-r--r-- | arch/mips/include/asm/pgtable.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index 9d8106758142..ae8569475264 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h @@ -182,8 +182,39 @@ static inline void set_pte(pte_t *ptep, pte_t pteval) * Make sure the buddy is global too (if it's !none, * it better already be global) */ +#ifdef CONFIG_SMP + /* + * For SMP, multiple CPUs can race, so we need to do + * this atomically. + */ +#ifdef CONFIG_64BIT +#define LL_INSN "lld" +#define SC_INSN "scd" +#else /* CONFIG_32BIT */ +#define LL_INSN "ll" +#define SC_INSN "sc" +#endif + unsigned long page_global = _PAGE_GLOBAL; + unsigned long tmp; + + __asm__ __volatile__ ( + " .set push\n" + " .set noreorder\n" + "1: " LL_INSN " %[tmp], %[buddy]\n" + " bnez %[tmp], 2f\n" + " or %[tmp], %[tmp], %[global]\n" + " " SC_INSN " %[tmp], %[buddy]\n" + " beqz %[tmp], 1b\n" + " nop\n" + "2:\n" + " .set pop" + : [buddy] "+m" (buddy->pte), + [tmp] "=&r" (tmp) + : [global] "r" (page_global)); +#else /* !CONFIG_SMP */ if (pte_none(*buddy)) pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL; +#endif /* CONFIG_SMP */ } #endif } |
