linux/arch
David S. Miller f9384d41c0 sparc64: Fix MM refcount check in smp_flush_tlb_pending().
As explained by Benjamin Herrenschmidt:

> CPU 0 is running the context, task->mm == task->active_mm == your
> context. The CPU is in userspace happily churning things.
>
> CPU 1 used to run it, not anymore, it's now running fancyfsd which
> is a kernel thread, but current->active_mm still points to that
> same context.
>
> Because there's only one "real" user, mm_users is 1 (but mm_count is
> elevated, it's just that the presence on CPU 1 as active_mm has no
> effect on mm_count().
>
> At this point, fancyfsd decides to invalidate a mapping currently mapped
> by that context, for example because a networked file has changed
> remotely or something like that, using unmap_mapping_ranges().
>
> So CPU 1 goes into the zapping code, which eventually ends up calling
> flush_tlb_pending(). Your test will succeed, as current->active_mm is
> indeed the target mm for the flush, and mm_users is indeed 1. So you
> will -not- send an IPI to the other CPU, and CPU 0 will continue happily
> accessing the pages that should have been unmapped.

To fix this problem, check ->mm instead of ->active_mm, and this
means:

> So if you test current->mm, you effectively account for mm_users == 1,
> so the only way the mm can be active on another processor is as a lazy
> mm for a kernel thread. So your test should work properly as long
> as you don't have a HW that will do speculative TLB reloads into the
> TLB on that other CPU (and even if you do, you flush-on-switch-in should
> get rid of any crap here).

And therefore we should be OK.

Signed-off-by: David S. Miller <davem@davemloft.net>
2009-03-27 01:09:17 -07:00
..
alpha cpumask: Use cpu_*_mask accessors code: alpha 2009-02-16 17:32:00 +10:30
arm Merge master.kernel.org:/home/rmk/linux-2.6-arm 2009-03-15 13:34:56 -07:00
avr32 [ARM] 5400/1: Add support for inverted rdy_busy pin for Atmel nand device controller 2009-02-16 21:40:39 +00:00
blackfin Blackfin arch: SPI_MMC is now mainlined MMC_SPI 2009-03-06 00:27:57 +08:00
cris Merge branch 'syscalls' of git://git390.osdl.marist.edu/pub/scm/linux-2.6 2009-01-14 19:58:40 -08:00
frv FRV: in_interrupt() requires #inclusion of linux/hardirq.h not asm/hardirq.h now 2009-02-09 08:51:35 -08:00
h8300 Merge branch 'syscalls' of git://git390.osdl.marist.edu/pub/scm/linux-2.6 2009-01-14 19:58:40 -08:00
ia64 [IA64] fix PCI DMA flag propagation on SN (Altix) with PICs 2009-03-06 10:41:13 -08:00
m32r eeprom: More consistent symbol names 2009-01-26 21:19:57 +01:00
m68k m68k: merge the non-MMU and MMU versions of siginfo.h 2009-03-17 08:47:11 +10:00
m68knommu m68knommu: m528x build fix 2009-03-10 15:55:12 -07:00
mips MIPS: Mark Eins: Fix configuration. 2009-03-13 23:08:00 +01:00
mn10300 mn10300: fix typo && -> || in arch/mn10300/unit-asb2305/pci.c 2009-02-20 17:57:48 -08:00
parisc parisc: update defconfigs 2009-03-13 01:33:34 -04:00
powerpc powerpc/mm: Fix Respect _PAGE_COHERENT on classic ppc32 SW TLB load machines 2009-03-23 08:38:26 -05:00
s390 [S390] make page table upgrade work again 2009-03-18 13:28:13 +01:00
sh sh: Add media/soc_camera.h to board setup of Renesas AP325RXA 2009-03-10 15:20:54 +09:00
sparc sparc64: Fix MM refcount check in smp_flush_tlb_pending(). 2009-03-27 01:09:17 -07:00
um uml: fix WARNING: vmlinux: 'memcpy' exported twice 2009-03-12 16:20:23 -07:00
x86 prevent boosting kprobes on exception address 2009-03-17 09:11:48 -07:00
xtensa xtensa: fix compilation somewhat 2009-03-10 15:55:10 -07:00
.gitignore
Kconfig [CVE-2009-0029] System call wrapper infrastructure 2009-01-14 14:15:16 +01:00