Module Name:    src
Committed By:   skrll
Date:           Thu Oct 27 06:49:51 UTC 2022

Modified Files:
        src/sys/uvm/pmap: pmap_segtab.c

Log Message:
In pmap_pte_reserve ensure we're atomically swapping out an invalid entry
otherwise concurrent updates might both think they've updated the entry.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/uvm/pmap/pmap_segtab.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_segtab.c
diff -u src/sys/uvm/pmap/pmap_segtab.c:1.29 src/sys/uvm/pmap/pmap_segtab.c:1.30
--- src/sys/uvm/pmap/pmap_segtab.c:1.29	Wed Oct 26 07:35:20 2022
+++ src/sys/uvm/pmap/pmap_segtab.c	Thu Oct 27 06:49:51 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_segtab.c,v 1.29 2022/10/26 07:35:20 skrll Exp $	*/
+/*	$NetBSD: pmap_segtab.c,v 1.30 2022/10/27 06:49:51 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.29 2022/10/26 07:35:20 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.30 2022/10/27 06:49:51 skrll Exp $");
 
 /*
  *	Manages physical address maps.
@@ -1161,8 +1161,7 @@ pmap_pte_reserve(pmap_t pmap, vaddr_t va
 		pd_entry_t npde = pte_pde_ptpage(pa, pmap == pmap_kernel());
 #endif
 #if defined(PMAP_HWPAGEWALKER) && defined(PMAP_MAP_PDETABPAGE)
-		pd_entry_t opde = *pde_p;
-		opde = pte_pde_cas(pde_p, opde, npde);
+		pd_entry_t opde = pte_pde_cas(pde_p, pte_invalid_pde(), npde);
 		if (__predict_false(pte_pde_valid_p(opde))) {
 			pmap_ptpage_free(pmap, ppg, __func__);
 			ppg = pmap_pde_to_ptpage(opde);

Reply via email to