[POWERPC] Fix spu SLB invalidations
The SPU code doesn't properly invalidate SPUs SLBs when necessary, for example when changing a segment size from the hugetlbfs code. In addition, it saves and restores the SLB content on context switches which makes it harder to properly handle those invalidations. This patch removes the saving & restoring for now, something more efficient might be found later on. It also adds a spu_flush_all_slbs(mm) that can be used by the core mm code to flush the SLBs of all SPEs that are running a given mm at the time of the flush. In order to do that, it adds a spinlock to the list of all SPEs and move some bits & pieces from spufs to spu_base.c Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
committed by
Arnd Bergmann
parent
50b520d4ef
commit
94b2a4393c
@@ -24,6 +24,7 @@
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/spu.h>
|
||||
|
||||
#include <linux/sysctl.h>
|
||||
|
||||
@@ -513,6 +514,9 @@ int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff)
|
||||
if ((addr + len) > 0x100000000UL)
|
||||
err = open_high_hpage_areas(current->mm,
|
||||
HTLB_AREA_MASK(addr, len));
|
||||
#ifdef CONFIG_SPE_BASE
|
||||
spu_flush_all_slbs(current->mm);
|
||||
#endif
|
||||
if (err) {
|
||||
printk(KERN_DEBUG "prepare_hugepage_range(%lx, %lx)"
|
||||
" failed (lowmask: 0x%04hx, highmask: 0x%04hx)\n",
|
||||
|
Reference in New Issue
Block a user