[PATCH] Fix kunmap_atomic's use of kpte_clear_flush()
kunmap_atomic() will call kpte_clear_flush with vaddr/ptep arguments which don't correspond if the vaddr is just a normal lowmem address (ie, not in the KMAP area). This patch makes sure that the pte is only cleared if kmap area was actually used for the mapping. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Zachary Amsden <zach@vmware.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
ad76fb6b5a
commit
3b17979bda
1 changed files with 8 additions and 10 deletions
|
@ -50,22 +50,20 @@ void kunmap_atomic(void *kvaddr, enum km_type type)
|
||||||
unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
|
unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
|
||||||
enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
|
enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
|
||||||
if (vaddr >= PAGE_OFFSET && vaddr < (unsigned long)high_memory) {
|
|
||||||
pagefault_enable();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx))
|
|
||||||
BUG();
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Force other mappings to Oops if they'll try to access this pte
|
* Force other mappings to Oops if they'll try to access this pte
|
||||||
* without first remap it. Keeping stale mappings around is a bad idea
|
* without first remap it. Keeping stale mappings around is a bad idea
|
||||||
* also, in case the page changes cacheability attributes or becomes
|
* also, in case the page changes cacheability attributes or becomes
|
||||||
* a protected page in a hypervisor.
|
* a protected page in a hypervisor.
|
||||||
*/
|
*/
|
||||||
kpte_clear_flush(kmap_pte-idx, vaddr);
|
if (vaddr == __fix_to_virt(FIX_KMAP_BEGIN+idx))
|
||||||
|
kpte_clear_flush(kmap_pte-idx, vaddr);
|
||||||
|
else {
|
||||||
|
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||||
|
BUG_ON(vaddr < PAGE_OFFSET);
|
||||||
|
BUG_ON(vaddr >= (unsigned long)high_memory);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
pagefault_enable();
|
pagefault_enable();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue