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