summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2014-01-20 18:37:35 +0000
committermarcel <marcel@FreeBSD.org>2014-01-20 18:37:35 +0000
commit2c365a2165422815b2998b71d45d37f242928d96 (patch)
treefae1d802d7b05e696bc87d1fac29f0a58507ea80
parent875e23de1fa47e9bee345d3bfe18237970db0b83 (diff)
downloadFreeBSD-src-2c365a2165422815b2998b71d45d37f242928d96.zip
FreeBSD-src-2c365a2165422815b2998b71d45d37f242928d96.tar.gz
In pmap_set_pte(), make sure to enforce ordering by inserting a memory
fence. Under system load, the CPU has been found to change the order by which the stores are made visible. When the tag is made visible before the other TLB values, other CPUs may use the invalid TLB values and do bad things. While here (i.e. not a fix) don't return errors from pmap_remove_vhpt() to callers of pmap_remove_pte(). Those callers don't check the return value and as such don't do what is needed to keep a consistent state. More importantly, pmap_remove_vhpt() can't really have an error without it indicating something unintended. Using KASSERT is therefore better. PR: 182999, 183227
-rw-r--r--sys/ia64/ia64/pmap.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index dbddb5f..038725f 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -1303,6 +1303,8 @@ pmap_set_pte(struct ia64_lpte *pte, vm_offset_t va, vm_offset_t pa,
pte->itir = PAGE_SHIFT << 2;
+ ia64_mf();
+
pte->tag = ia64_ttag(va);
}
@@ -1321,8 +1323,8 @@ pmap_remove_pte(pmap_t pmap, struct ia64_lpte *pte, vm_offset_t va,
* First remove from the VHPT.
*/
error = pmap_remove_vhpt(va);
- if (error)
- return (error);
+ KASSERT(error == 0, ("%s: pmap_remove_vhpt returned %d",
+ __func__, error));
pmap_invalidate_page(va);
OpenPOWER on IntegriCloud