linux/arch/mips/kernel
James Hogan a05c392032 MIPS: SMP: Clear ASID without confusing has_valid_asid()
The SMP flush_tlb_*() functions may clear the memory map's ASIDs for
other CPUs if the mm has only a single user (the current CPU) in order
to avoid SMP calls. However this makes it appear to has_valid_asid(),
which is used by various cache flush functions, as if the CPUs have
never run in the mm, and therefore can't have cached any of its memory.

For flush_tlb_mm() this doesn't sound unreasonable.

flush_tlb_range() corresponds to flush_cache_range() which does do full
indexed cache flushes, but only on the icache if the specified mapping
is executable, otherwise it doesn't guarantee that there are no cache
contents left for the mm.

flush_tlb_page() corresponds to flush_cache_page(), which will perform
address based cache ops on the specified page only, and also only
touches the icache if the page is executable. It does not guarantee that
there are no cache contents left for the mm.

For example, this affects flush_cache_range() which uses the
has_valid_asid() optimisation. It is required to flush the icache when
mappings are made executable (e.g. using mprotect) so they are
immediately usable. If some code is changed to non executable in order
to be modified then it will not be flushed from the icache during that
time, but the ASID on other CPUs may still be cleared for TLB flushing.
When the code is changed back to executable, flush_cache_range() will
assume the code hasn't run on those other CPUs due to the zero ASID, and
won't invalidate the icache on them.

This is fixed by clearing the other CPUs ASIDs to 1 instead of 0 for the
above two flush_tlb_*() functions when the corresponding cache flushes
are likely to be incomplete (non executable range flush, or any page
flush). This ASID appears valid to has_valid_asid(), but still triggers
ASID regeneration due to the upper ASID version bits being 0, which is
less than the minimum ASID version of 1 and so always treated as stale.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Leonid Yegoshin <leonid.yegoshin@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13795/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2016-07-29 10:19:28 +02:00
..
.gitignore
8250-platform.c
Makefile MIPS: Kernel: Add relocate.c 2016-05-13 14:02:02 +02:00
asm-offsets.c MIPS: Support extended ASIDs 2016-05-13 14:02:20 +02:00
binfmt_elfn32.c MIPS: ELF: Unify ABI classification macros 2016-05-13 15:30:25 +02:00
binfmt_elfo32.c MIPS: ELF: Unify ABI classification macros 2016-05-13 15:30:25 +02:00
bmips_5xxx_init.S MIPS: BMIPS: Make whitespacely correct. 2016-05-09 12:00:01 +02:00
bmips_vec.S MIPS: BMIPS: Add Whirlwind (BMIPS5200) initialization code 2016-05-09 12:00:01 +02:00
branch.c MIPS: Spelling fix lets -> let's 2016-05-28 12:35:09 +02:00
cevt-bcm1480.c MIPS: cevt-bcm1480: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-ds1287.c MIPS: cevt-ds1287: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-gt641xx.c MIPS: cevt-gt641xx: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-r4k.c MIPS: cevt-r4k: Dynamically calculate min_delta_ns 2016-05-13 15:30:25 +02:00
cevt-sb1250.c MIPS: cevt-sb1250: Migrate to new 'set-state' interface 2015-09-03 12:07:52 +02:00
cevt-txx9.c MIPS: cevt-txx9: Migrate to new 'set-state' interface 2015-09-03 12:07:53 +02:00
cps-vec-ns16550.S MIPS: CPS: Early debug using an ns16550-compatible UART 2015-11-11 08:34:25 +01:00
cps-vec.S MIPS: CPS: Copy EVA configuration when starting secondary VPs. 2016-05-28 12:35:05 +02:00
cpu-bugs64.c MIPS: Use EXCCODE_ constants with set_except_vector() 2016-01-24 03:28:21 +01:00
cpu-probe.c MIPS: Fix incomplete separation of XPA CPU feature 2016-05-28 12:35:03 +02:00
crash.c MIPS: Fix crash registers on non-crashing CPUs 2016-05-09 12:00:00 +02:00
crash_dump.c mips: Convert pr_warning to pr_warn 2014-11-24 07:44:51 +01:00
csrc-bcm1480.c MIPS: csrc-bcm1480: Implement read_sched_clock 2015-04-01 17:21:27 +02:00
csrc-ioasic.c MIPS: csrc-ioasic: Implement read_sched_clock 2015-04-01 17:21:28 +02:00
csrc-r4k.c MIPS: VDSO: Add implementations of gettimeofday() and clock_gettime() 2015-11-11 08:36:41 +01:00
csrc-sb1250.c MIPS: csrc-sb1250: Implement read_sched_clock 2015-04-01 17:21:33 +02:00
early_printk.c early_printk: consolidate random copies of identical code 2013-04-29 18:28:13 -07:00
early_printk_8250.c MIPS: Add 8250/16550 serial early printk driver 2013-10-29 21:24:36 +01:00
elf.c MIPS: Spelling fix lets -> let's 2016-05-28 12:35:09 +02:00
entry.S MIPS: kernel: entry.S: Set correct ISA level for mips_ihb 2015-04-10 15:41:46 +02:00
ftrace.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2014-08-07 08:47:00 -07:00
genex.S MIPS: genex: Indent delay slots & clean whitespace 2016-05-13 14:02:20 +02:00
gpio_txx9.c MIPS: txx9: switch to gpiochip_add_data() 2016-02-19 09:51:44 +01:00
head.S MIPS: Remove redundant asm/pgtable-bits.h inclusions 2016-05-13 15:30:25 +02:00
i8253.c
idle.c MIPS: Loongson: Add Loongson-3A R2 basic support 2016-05-13 14:02:14 +02:00
irq-gt641xx.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
irq-msc01.c MIPS: MSC: Prevent out-of-bounds writes to MIPS SC ioremap'd region 2014-06-26 10:48:23 +01:00
irq-rm7000.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
irq.c MIPS: Clear Status IPL field when using EIC 2016-05-28 12:35:02 +02:00
irq_txx9.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
jump_label.c jump_label: Rename JUMP_LABEL_{EN,DIS}ABLE to JUMP_LABEL_{JMP,NOP} 2015-08-03 11:34:12 +02:00
kgdb.c MIPS: Get rid of 'kgdb_early_setup' cruft. 2015-06-21 21:54:10 +02:00
kprobes.c mips: Replace __get_cpu_var uses 2014-08-26 13:45:51 -04:00
linux32.c unify compat fanotify_mark(2), switch to COMPAT_SYSCALL_DEFINE 2013-05-09 13:46:38 -04:00
machine_kexec.c MIPS: kdump: Set correct value to kexec_indirection_page variable 2014-08-25 16:33:44 +02:00
mcount.S MIPS: mcount: Adjust stack pointer for static trace in MIPS32 2014-09-26 11:41:17 +02:00
mips-cm.c MIPS: Fix misspellings in comments. 2016-04-03 12:32:09 +02:00
mips-cpc.c MIPS: CM, CPC: Ensure core-other GCRs reflect the correct core 2015-11-11 08:35:18 +01:00
mips-mt-fpaff.c MIPS: Fix sched_getaffinity with MT FPAFF enabled 2015-08-03 09:25:02 +02:00
mips-mt.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
mips-r2-to-r6-emul.c MIPS: Spelling fix lets -> let's 2016-05-28 12:35:09 +02:00
mips_ksyms.c MIPS: uaccess: Take EVA into account in [__]clear_user 2015-12-22 11:58:43 +01:00
mips_machine.c MIPS: move mips_{set,get}_machine_name() to a more generic place 2013-05-08 01:19:07 +02:00
module-rela.c MIPS: module: fix incorrect IS_ERR_VALUE macro usages 2016-05-13 14:02:11 +02:00
module.c MIPS: module: fix incorrect IS_ERR_VALUE macro usages 2016-05-13 14:02:11 +02:00
octeon_switch.S MIPS: Fix octeon FP context switch handling 2015-10-02 19:16:06 +02:00
perf_event.c perf core: Add a 'nr' field to perf_event_callchain_context 2016-05-16 23:11:51 -03:00
perf_event_mipsxx.c MIPS: perf: Fix I6400 event numbers 2016-05-17 11:05:07 +02:00
pm-cps.c MIPS: pm-cps: Avoid offset overflow on MIPSr6 2016-05-13 14:01:48 +02:00
pm.c MIPS: Fix watchpoint restoration 2016-05-09 12:00:02 +02:00
proc.c MIPS: Detect DSP v3 support 2016-05-13 14:01:57 +02:00
process.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-05-28 16:41:39 -07:00
prom.c MIPS: Fix build with CONFIG_OF=y for non OF-enabled targets 2015-08-03 09:25:00 +02:00
ptrace.c MIPS: ptrace: Prevent writes to read-only FCSR bits 2016-05-13 15:30:25 +02:00
ptrace32.c MIPS: Remove asm/user.h 2014-08-02 00:06:37 +02:00
r4k_fpu.S MIPS: Use copy_s.fmt rather than copy_u.fmt 2016-05-09 12:00:04 +02:00
r4k_switch.S MIPS: Remove redundant asm/pgtable-bits.h inclusions 2016-05-13 15:30:25 +02:00
r2300_fpu.S MIPS: Avoid variant of .type unsupported by LLVM Assembler 2016-02-29 11:23:49 +01:00
r2300_switch.S MIPS: Fix R2300 FP context switch handling 2015-10-02 19:16:46 +02:00
r6000_fpu.S MIPS: Fix build with binutils 2.24.51+ 2014-11-07 15:07:36 +01:00
relocate.c MIPS: Kernel: Implement KASLR using CONFIG_RELOCATABLE 2016-05-13 14:02:03 +02:00
relocate_kernel.S MIPS: Replace add and sub instructions in relocate_kernel.S with addiu 2015-08-03 15:26:30 +02:00
reset.c MIPS: Provide fallback reboot/poweroff/halt implementations 2015-04-01 17:21:58 +02:00
rtlx-cmp.c MIPS: APRP: Fix an issue when device_create() fails. 2014-08-01 17:30:35 +02:00
rtlx-mt.c MIPS: APRP: Fix an issue when device_create() fails. 2014-08-01 17:30:35 +02:00
rtlx.c MIPS: rtlx: Remove KERN_DEBUG from pr_debug() arguments in rtlx.c 2014-11-24 07:44:04 +01:00
scall32-o32.S MIPS: scall: Handle seccomp filters which redirect syscalls 2016-05-13 14:02:00 +02:00
scall64-64.S MIPS: scall: Handle seccomp filters which redirect syscalls 2016-05-13 14:02:00 +02:00
scall64-n32.S KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace 2016-07-28 11:56:48 +02:00
scall64-o32.S KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace 2016-07-28 11:56:48 +02:00
segment.c MIPS: Print segment physical address when EU=1 2016-07-28 11:44:30 +02:00
setup.c MIPS: Octeon: detect and fix byte swapped initramfs 2016-05-13 15:30:25 +02:00
signal-common.h MIPS: Save MSA extended context around signals 2015-09-03 12:07:59 +02:00
signal.c MIPS: Fix sigreturn via VDSO on microMIPS kernel 2016-05-28 12:35:12 +02:00
signal32.c MIPS: Support sending SIG_SYS to 32bit userspace from 64bit kernel 2016-05-13 14:02:00 +02:00
signal_n32.c MIPS: Initial implementation of a VDSO 2015-11-11 08:36:36 +01:00
smp-bmips.c MIPS: BMIPS: Add early CPU initialization code 2016-05-13 14:01:55 +02:00
smp-cmp.c MIPS: Make smp CMP, CPS and MT use the new generic IPI functions 2016-02-25 10:56:58 +01:00
smp-cps.c MIPS: smp-cps: Add support for CPU hotplug of MIPSr6 processors 2016-07-24 12:19:57 +02:00
smp-gic.c MIPS: CM: make use of mips_cm_{lock,unlock}_other 2015-11-11 08:35:17 +01:00
smp-mt.c MIPS: Make smp CMP, CPS and MT use the new generic IPI functions 2016-02-25 10:56:58 +01:00
smp-up.c MIPS: SMP: Remove plat_smp_ops cpus_done method. 2014-05-27 11:06:42 +02:00
smp.c MIPS: SMP: Clear ASID without confusing has_valid_asid() 2016-07-29 10:19:28 +02:00
spinlock_test.c MIPS: Declare mips_debugfs_dir in a header 2015-10-26 09:49:42 +01:00
spram.c MIPS: Add P6600 cases to CPU switch statements 2016-05-13 14:01:52 +02:00
stacktrace.c MIPS: Add LATENCYTOP support 2015-11-11 08:36:46 +01:00
sync-r4k.c MIPS: sync-r4k: reduce skew while synchronization 2016-01-24 01:31:51 +01:00
syscall.c MIPS: kernel: syscall: Set the appropriate ISA level for MIPS R6 2015-02-17 15:37:29 +00:00
sysrq.c MIPS: Refactor dumping of TLB registers for r3k/r4k 2015-09-03 12:07:45 +02:00
time.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
topology.c
traps.c MIPS: MSA: Fix a link error on `_init_msa_upper' with older GCC 2016-05-17 11:02:45 +02:00
unaligned.c MIPS: Allow emulation for unaligned [LS]DXC1 instructions 2016-05-13 15:30:25 +02:00
uprobes.c MIPS: Add uprobes support. 2015-09-03 12:08:05 +02:00
vdso.c vdso: make arch_setup_additional_pages wait for mmap_sem for write killable 2016-05-23 17:04:14 -07:00
vmlinux.lds.S MIPS: Reserve space for relocation table 2016-05-13 14:02:02 +02:00
vpe-cmp.c MIPS: APRP: Add VPE loader support for CMP platforms. 2014-01-22 20:19:02 +01:00
vpe-mt.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
vpe.c module: use a structure to encapsulate layout. 2015-12-04 22:46:25 +01:00
watch.c MIPS: Add and use watch register field definitions 2016-05-13 14:02:13 +02:00