Module Name: src
Committed By: riastradh
Date: Mon Dec 9 04:39:58 UTC 2019
Modified Files:
src/sys/uvm/pmap: pmap_pvt.c
Log Message:
Convert pmap_pvt to atomic_load/store.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/uvm/pmap/pmap_pvt.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/uvm/pmap/pmap_pvt.c
diff -u src/sys/uvm/pmap/pmap_pvt.c:1.4 src/sys/uvm/pmap/pmap_pvt.c:1.5
--- src/sys/uvm/pmap/pmap_pvt.c:1.4 Sat Dec 7 17:56:08 2019
+++ src/sys/uvm/pmap/pmap_pvt.c Mon Dec 9 04:39:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_pvt.c,v 1.4 2019/12/07 17:56:08 jmcneill Exp $ */
+/* $NetBSD: pmap_pvt.c,v 1.5 2019/12/09 04:39:58 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pmap_pvt.c,v 1.4 2019/12/07 17:56:08 jmcneill Exp $");
+__RCSID("$NetBSD: pmap_pvt.c,v 1.5 2019/12/09 04:39:58 riastradh Exp $");
#include <sys/kmem.h>
#include <sys/pserialize.h>
@@ -92,8 +92,7 @@ pmap_pv_track(paddr_t start, psize_t siz
mutex_enter(&pv_unmanaged.lock);
pvt->pvt_next = pv_unmanaged.list;
- membar_producer();
- pv_unmanaged.list = pvt;
+ atomic_store_release(&pv_unmanaged.list, pvt);
mutex_exit(&pv_unmanaged.lock);
}
@@ -119,9 +118,21 @@ pmap_pv_untrack(paddr_t start, psize_t s
panic("pmap_pv_untrack: pv-tracking at 0x%"PRIxPADDR
": 0x%"PRIxPSIZE" bytes, not 0x%"PRIxPSIZE" bytes",
pvt->pvt_start, pvt->pvt_size, size);
- *pvtp = pvt->pvt_next;
+
+ /*
+ * Remove from list. Readers can safely see the old
+ * and new states of the list.
+ */
+ atomic_store_relaxed(pvtp, pvt->pvt_next);
+
+ /* Wait for readers who can see the old state to finish. */
pserialize_perform(pv_unmanaged.psz);
- pvt->pvt_next = NULL;
+
+ /*
+ * We now have exclusive access to pvt and can destroy
+ * it. Poison it to catch bugs.
+ */
+ explicit_memset(&pvt->pvt_next, 0x1a, sizeof pvt->pvt_next);
goto out;
}
panic("pmap_pv_untrack: pages not pv-tracked at 0x%"PRIxPADDR
@@ -143,8 +154,9 @@ pmap_pv_tracked(paddr_t pa)
KASSERT(pa == trunc_page(pa));
s = pserialize_read_enter();
- for (pvt = pv_unmanaged.list; pvt != NULL; pvt = pvt->pvt_next) {
- membar_datadep_consumer();
+ for (pvt = atomic_load_consume(&pv_unmanaged.list);
+ pvt != NULL;
+ pvt = pvt->pvt_next) {
if ((pvt->pvt_start <= pa) &&
((pa - pvt->pvt_start) < pvt->pvt_size))
break;