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);