summaryrefslogtreecommitdiffstats
path: root/arch/x86/mm
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2008-08-01 03:15:21 +0200
committerIngo Molnar <mingo@elte.hu>2008-08-15 17:22:57 +0200
commit5843d9a4d0ba89719916c8f07fc9c57b7126be6d (patch)
tree3c55d6f17ce32ec3f53a324ce8fc90e291b44d79 /arch/x86/mm
parent466ae837424dcc538b1af2a0eaf53be32edcdbe7 (diff)
downloadkernel-crypto-5843d9a4d0ba89719916c8f07fc9c57b7126be6d.tar.gz
kernel-crypto-5843d9a4d0ba89719916c8f07fc9c57b7126be6d.tar.xz
kernel-crypto-5843d9a4d0ba89719916c8f07fc9c57b7126be6d.zip
x86, pat: avoid highmem cache attribute aliasing
Highmem code can leave ptes and tlb entries around for a given page even after kunmap, and after it has been freed. >From what I can gather, the PAT code may change the cache attributes of arbitrary physical addresses (ie. including highmem pages), which would result in aliases in the case that it operates on one of these lazy tlb highmem pages. Flushing kmaps should solve the problem. I've also just added code for conditional flushing if we haven't got any dangling highmem aliases -- this should help performance if we change page attributes frequently or systems that aren't using much highmem pages (eg. if < 4G RAM). Should be turned into 2 patches, but just for RFC... Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm')
-rw-r--r--arch/x86/mm/pageattr.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 2c5c18c2464..4adb33628de 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -777,6 +777,9 @@ static int do_change_page_attr_set_clr(unsigned long addr, int numpages,
WARN_ON_ONCE(1);
}
+ /* Must avoid aliasing mappings in the highmem code */
+ kmap_flush_unused();
+
cpa.vaddr = addr;
cpa.numpages = numpages;
cpa.mask_set = mask_set;