Module Name: src
Committed By: ad
Date: Sun Dec 8 20:42:49 UTC 2019
Modified Files:
src/sys/arch/x86/include: pmap.h
src/sys/arch/x86/x86: pmap.c svs.c
src/sys/arch/xen/x86: xen_pmap.c
Log Message:
Merge x86 pmap changes from yamt-pagecache:
- Deal better with the multi-level pmap object locking kludge.
- Handle uvm_pagealloc() being able to block.
To generate a diff of this commit:
cvs rdiff -u -r1.105 -r1.106 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.342 -r1.343 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/x86/x86/svs.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/xen/x86/xen_pmap.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/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.105 src/sys/arch/x86/include/pmap.h:1.106
--- src/sys/arch/x86/include/pmap.h:1.105 Thu Nov 14 16:23:52 2019
+++ src/sys/arch/x86/include/pmap.h Sun Dec 8 20:42:48 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.105 2019/11/14 16:23:52 maxv Exp $ */
+/* $NetBSD: pmap.h,v 1.106 2019/12/08 20:42:48 ad Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -249,8 +249,7 @@ extern struct pool_cache pmap_pdp_cache;
struct pmap {
struct uvm_object pm_obj[PTP_LEVELS-1]; /* objects for lvl >= 1) */
-#define pm_lock pm_obj[0].vmobjlock
- kmutex_t pm_obj_lock[PTP_LEVELS-1]; /* locks for pm_objs */
+ kmutex_t pm_lock; /* locks for pm_objs */
LIST_ENTRY(pmap) pm_list; /* list (lck by pm_list lock) */
pd_entry_t *pm_pdir; /* VA of PD (lck by object lock) */
paddr_t pm_pdirpa[PDP_SIZE]; /* PA of PDs (read-only after create) */
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.342 src/sys/arch/x86/x86/pmap.c:1.343
--- src/sys/arch/x86/x86/pmap.c:1.342 Tue Dec 3 15:20:59 2019
+++ src/sys/arch/x86/x86/pmap.c Sun Dec 8 20:42:48 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: pmap.c,v 1.342 2019/12/03 15:20:59 riastradh Exp $ */
+/* $NetBSD: pmap.c,v 1.343 2019/12/08 20:42:48 ad Exp $ */
/*
- * Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
+ * Copyright (c) 2008, 2010, 2016, 2017, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -130,7 +130,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.342 2019/12/03 15:20:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.343 2019/12/08 20:42:48 ad Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -261,24 +261,6 @@ struct pcpu_area *pcpuarea __read_mostly
static vaddr_t pmap_maxkvaddr;
/*
- * XXX kludge: dummy locking to make KASSERTs in uvm_page.c comfortable.
- * actual locking is done by pm_lock.
- */
-#if defined(DIAGNOSTIC)
-#define PMAP_SUBOBJ_LOCK(pm, idx) \
- KASSERT(mutex_owned((pm)->pm_lock)); \
- if ((idx) != 0) \
- mutex_enter((pm)->pm_obj[(idx)].vmobjlock)
-#define PMAP_SUBOBJ_UNLOCK(pm, idx) \
- KASSERT(mutex_owned((pm)->pm_lock)); \
- if ((idx) != 0) \
- mutex_exit((pm)->pm_obj[(idx)].vmobjlock)
-#else /* defined(DIAGNOSTIC) */
-#define PMAP_SUBOBJ_LOCK(pm, idx) /* nothing */
-#define PMAP_SUBOBJ_UNLOCK(pm, idx) /* nothing */
-#endif /* defined(DIAGNOSTIC) */
-
-/*
* Misc. event counters.
*/
struct evcnt pmap_iobmp_evcnt;
@@ -475,8 +457,8 @@ static void pmap_init_lapic(void);
static void pmap_remap_largepages(void);
#endif
-static struct vm_page *pmap_get_ptp(struct pmap *, vaddr_t,
- pd_entry_t * const *, int);
+static int pmap_get_ptp(struct pmap *, vaddr_t,
+ pd_entry_t * const *, int, struct vm_page **);
static struct vm_page *pmap_find_ptp(struct pmap *, vaddr_t, paddr_t, int);
static void pmap_freepage(struct pmap *, struct vm_page *, int);
static void pmap_free_ptp(struct pmap *, struct vm_page *, vaddr_t,
@@ -502,7 +484,7 @@ pmap_stats_update(struct pmap *pmap, int
atomic_add_long(&pmap->pm_stats.resident_count, resid_diff);
atomic_add_long(&pmap->pm_stats.wired_count, wired_diff);
} else {
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
pmap->pm_stats.resident_count += resid_diff;
pmap->pm_stats.wired_count += wired_diff;
}
@@ -640,13 +622,13 @@ pmap_map_ptes(struct pmap *pmap, struct
l = curlwp;
retry:
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
ci = curcpu();
curpmap = ci->ci_pmap;
if (vm_map_pmap(&l->l_proc->p_vmspace->vm_map) == pmap) {
/* Our own pmap so just load it: easy. */
if (__predict_false(ci->ci_want_pmapload)) {
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
pmap_load();
goto retry;
}
@@ -670,6 +652,7 @@ pmap_map_ptes(struct pmap *pmap, struct
kcpuset_atomic_clear(curpmap->pm_kernel_cpus, cid);
ci->ci_pmap = pmap;
ci->ci_tlbstate = TLBSTATE_VALID;
+ ci->ci_want_pmapload = 0;
kcpuset_atomic_set(pmap->pm_cpus, cid);
kcpuset_atomic_set(pmap->pm_kernel_cpus, cid);
cpu_load_pmap(pmap, curpmap);
@@ -717,7 +700,7 @@ pmap_unmap_ptes(struct pmap *pmap, struc
KASSERT(pmap->pm_ncsw == curlwp->l_ncsw);
mypmap = vm_map_pmap(&curproc->p_vmspace->vm_map);
if (pmap == mypmap) {
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
return;
}
@@ -725,9 +708,15 @@ pmap_unmap_ptes(struct pmap *pmap, struc
* Mark whatever's on the CPU now as lazy and unlock.
* If the pmap was already installed, we are done.
*/
- ci->ci_tlbstate = TLBSTATE_LAZY;
- ci->ci_want_pmapload = (mypmap != pmap_kernel());
- mutex_exit(pmap->pm_lock);
+ if (ci->ci_tlbstate == TLBSTATE_VALID) {
+ ci->ci_tlbstate = TLBSTATE_LAZY;
+ ci->ci_want_pmapload = (mypmap != pmap_kernel());
+ } else {
+ /*
+ * This can happen when undoing after pmap_get_ptp blocked.
+ */
+ }
+ mutex_exit(&pmap->pm_lock);
if (pmap == pmap2) {
return;
}
@@ -1089,10 +1078,10 @@ pmap_bootstrap(vaddr_t kva_start)
* tables (fast user-level vtophys?). This may or may not be useful.
*/
kpm = pmap_kernel();
+ mutex_init(&kpm->pm_lock, MUTEX_DEFAULT, IPL_NONE);
for (i = 0; i < PTP_LEVELS - 1; i++) {
- mutex_init(&kpm->pm_obj_lock[i], MUTEX_DEFAULT, IPL_NONE);
uvm_obj_init(&kpm->pm_obj[i], NULL, false, 1);
- uvm_obj_setlock(&kpm->pm_obj[i], &kpm->pm_obj_lock[i]);
+ uvm_obj_setlock(&kpm->pm_obj[i], &kpm->pm_lock);
kpm->pm_ptphint[i] = NULL;
}
memset(&kpm->pm_list, 0, sizeof(kpm->pm_list)); /* pm_list not used */
@@ -1992,15 +1981,13 @@ pmap_find_ptp(struct pmap *pmap, vaddr_t
int lidx = level - 1;
struct vm_page *pg;
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
if (pa != (paddr_t)-1 && pmap->pm_ptphint[lidx] &&
pa == VM_PAGE_TO_PHYS(pmap->pm_ptphint[lidx])) {
return (pmap->pm_ptphint[lidx]);
}
- PMAP_SUBOBJ_LOCK(pmap, lidx);
pg = uvm_pagelookup(&pmap->pm_obj[lidx], ptp_va2o(va, level));
- PMAP_SUBOBJ_UNLOCK(pmap, lidx);
KASSERT(pg == NULL || pg->wire_count >= 1);
return pg;
@@ -2019,8 +2006,6 @@ pmap_freepage(struct pmap *pmap, struct
obj = &pmap->pm_obj[lidx];
pmap_stats_update(pmap, -1, 0);
- if (lidx != 0)
- mutex_enter(obj->vmobjlock);
if (pmap->pm_ptphint[lidx] == ptp)
pmap->pm_ptphint[lidx] = TAILQ_FIRST(&obj->memq);
ptp->wire_count = 0;
@@ -2029,8 +2014,6 @@ pmap_freepage(struct pmap *pmap, struct
KASSERT((l->l_pflag & LP_INTR) == 0);
VM_PAGE_TO_PP(ptp)->pp_link = l->l_md.md_gc_ptp;
l->l_md.md_gc_ptp = ptp;
- if (lidx != 0)
- mutex_exit(obj->vmobjlock);
}
static void
@@ -2043,7 +2026,7 @@ pmap_free_ptp(struct pmap *pmap, struct
pd_entry_t opde;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
level = 1;
@@ -2092,23 +2075,26 @@ pmap_free_ptp(struct pmap *pmap, struct
* => pmap should be locked
* => preemption should be disabled
*/
-static struct vm_page *
-pmap_get_ptp(struct pmap *pmap, vaddr_t va, pd_entry_t * const *pdes, int flags)
+static int
+pmap_get_ptp(struct pmap *pmap, vaddr_t va, pd_entry_t * const *pdes, int flags,
+ struct vm_page **resultp)
{
struct vm_page *ptp;
struct {
struct vm_page *pg;
bool new;
} pt[PTP_LEVELS + 1];
- int i, aflags;
+ int i, aflags, error;
unsigned long index;
pd_entry_t *pva;
paddr_t pa;
struct uvm_object *obj;
voff_t off;
+ lwp_t *l;
+ uint64_t ncsw;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
/*
@@ -2122,16 +2108,24 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t
obj = &pmap->pm_obj[i - 2];
off = ptp_va2o(va, i - 1);
- PMAP_SUBOBJ_LOCK(pmap, i - 2);
pt[i].pg = uvm_pagelookup(obj, off);
if (pt[i].pg == NULL) {
+ l = curlwp;
+ ncsw = l->l_ncsw;
pt[i].pg = uvm_pagealloc(obj, off, NULL, aflags);
pt[i].new = true;
+ if (__predict_false(ncsw != l->l_ncsw)) {
+ /* uvm_pagealloc can block. */
+ /* XXX silence assertion in pmap_unmap_ptes */
+ pmap->pm_ncsw = l->l_ncsw;
+ error = EAGAIN;
+ goto fail;
+ }
}
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
-
- if (pt[i].pg == NULL)
+ if (pt[i].pg == NULL) {
+ error = ENOMEM;
goto fail;
+ }
}
/*
@@ -2183,7 +2177,8 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t
ptp = pt[2].pg;
KASSERT(ptp != NULL);
pmap->pm_ptphint[0] = ptp;
- return ptp;
+ *resultp = ptp;
+ return 0;
/*
* Allocation of a PTP failed, free any others that we just allocated.
@@ -2197,11 +2192,9 @@ fail:
continue;
}
obj = &pmap->pm_obj[i - 2];
- PMAP_SUBOBJ_LOCK(pmap, i - 2);
uvm_pagefree(pt[i].pg);
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
}
- return NULL;
+ return error;
}
/*
@@ -2384,10 +2377,10 @@ pmap_create(void)
pmap = pool_cache_get(&pmap_cache, PR_WAITOK);
/* init uvm_object */
+ mutex_init(&pmap->pm_lock, MUTEX_DEFAULT, IPL_NONE);
for (i = 0; i < PTP_LEVELS - 1; i++) {
- mutex_init(&pmap->pm_obj_lock[i], MUTEX_DEFAULT, IPL_NONE);
uvm_obj_init(&pmap->pm_obj[i], NULL, false, 1);
- uvm_obj_setlock(&pmap->pm_obj[i], &pmap->pm_obj_lock[i]);
+ uvm_obj_setlock(&pmap->pm_obj[i], &pmap->pm_lock);
pmap->pm_ptphint[i] = NULL;
}
pmap->pm_stats.wired_count = 0;
@@ -2585,8 +2578,8 @@ pmap_destroy(struct pmap *pmap)
for (i = 0; i < PTP_LEVELS - 1; i++) {
uvm_obj_destroy(&pmap->pm_obj[i], false);
- mutex_destroy(&pmap->pm_obj_lock[i]);
}
+ mutex_destroy(&pmap->pm_lock);
kcpuset_destroy(pmap->pm_cpus);
kcpuset_destroy(pmap->pm_kernel_cpus);
#ifdef XENPV
@@ -3418,7 +3411,7 @@ pmap_remove_ptes(struct pmap *pmap, stru
{
pt_entry_t *pte = (pt_entry_t *)ptpva;
- KASSERT(pmap == pmap_kernel() || mutex_owned(pmap->pm_lock));
+ KASSERT(pmap == pmap_kernel() || mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
/*
@@ -3480,7 +3473,7 @@ pmap_remove_pte(struct pmap *pmap, struc
struct pmap_page *pp;
pt_entry_t opte;
- KASSERT(pmap == pmap_kernel() || mutex_owned(pmap->pm_lock));
+ KASSERT(pmap == pmap_kernel() || mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
if (!pmap_valid_entry(*pte)) {
@@ -4257,15 +4250,18 @@ pmap_enter_ma(struct pmap *pmap, vaddr_t
}
kpreempt_disable();
+ retry:
pmap_map_ptes(pmap, &pmap2, &ptes, &pdes); /* locks pmap */
- if (pmap == pmap_kernel()) {
- ptp = NULL;
- } else {
- ptp = pmap_get_ptp(pmap, va, pdes, flags);
- if (ptp == NULL) {
+ ptp = NULL;
+ if (pmap != pmap_kernel()) {
+ error = pmap_get_ptp(pmap, va, pdes, flags, &ptp);
+ if (error == EAGAIN) {
+ pmap_unmap_ptes(pmap, pmap2);
+ goto retry;
+ }
+ if (error == ENOMEM) {
pmap_unmap_ptes(pmap, pmap2);
if (flags & PMAP_CANFAIL) {
- error = ENOMEM;
goto out;
}
panic("%s: get ptp failed", __func__);
@@ -4540,10 +4536,10 @@ pmap_growkernel(vaddr_t maxkvaddr)
bool invalidate = false;
s = splvm(); /* to be safe */
- mutex_enter(kpm->pm_lock);
+ mutex_enter(&kpm->pm_lock);
if (maxkvaddr <= pmap_maxkvaddr) {
- mutex_exit(kpm->pm_lock);
+ mutex_exit(&kpm->pm_lock);
splx(s);
return pmap_maxkvaddr;
}
@@ -4632,7 +4628,7 @@ pmap_growkernel(vaddr_t maxkvaddr)
invalidate = true;
}
pmap_maxkvaddr = maxkvaddr;
- mutex_exit(kpm->pm_lock);
+ mutex_exit(&kpm->pm_lock);
splx(s);
if (invalidate && pmap_initialized) {
@@ -4999,7 +4995,7 @@ pmap_ept_free_ptp(struct pmap *pmap, str
int level;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
pmap_ept_get_tree(pmap, va, tree);
@@ -5036,7 +5032,7 @@ pmap_ept_get_ptp(struct pmap *pmap, vadd
voff_t off;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
memset(pt, 0, sizeof(pt));
@@ -5051,13 +5047,11 @@ pmap_ept_get_ptp(struct pmap *pmap, vadd
obj = &pmap->pm_obj[i - 2];
off = ptp_va2o(va, i - 1);
- PMAP_SUBOBJ_LOCK(pmap, i - 2);
pt[i].pg = uvm_pagelookup(obj, off);
if (pt[i].pg == NULL) {
pt[i].pg = uvm_pagealloc(obj, off, NULL, aflags);
pt[i].new = true;
}
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
if (pt[i].pg == NULL)
goto fail;
@@ -5113,9 +5107,7 @@ fail:
continue;
}
obj = &pmap->pm_obj[i - 2];
- PMAP_SUBOBJ_LOCK(pmap, i - 2);
uvm_pagefree(pt[i].pg);
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
}
return NULL;
}
@@ -5181,11 +5173,11 @@ pmap_ept_enter(struct pmap *pmap, vaddr_
}
kpreempt_disable();
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
ptp = pmap_ept_get_ptp(pmap, va, flags);
if (ptp == NULL) {
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
if (flags & PMAP_CANFAIL) {
error = ENOMEM;
goto out;
@@ -5207,7 +5199,7 @@ pmap_ept_enter(struct pmap *pmap, vaddr_
if (needpves && (!have_oldpa || oldpa != pa) &&
(new_pve == NULL || new_sparepve == NULL)) {
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
if (flags & PMAP_CANFAIL) {
error = ENOMEM;
goto out;
@@ -5272,7 +5264,7 @@ pmap_ept_enter(struct pmap *pmap, vaddr_
}
same_pa:
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
if (pmap_ept_has_ad) {
accessed = (~opte & (EPT_R | EPT_A)) == 0;
@@ -5307,7 +5299,7 @@ pmap_ept_pdes_invalid(struct pmap *pmap,
paddr_t ptepa;
int i, index;
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
ptepa = pmap->pm_pdirpa[0];
for (i = PTP_LEVELS; i > 1; i--) {
@@ -5345,7 +5337,7 @@ pmap_ept_extract(struct pmap *pmap, vadd
pa = 0;
kpreempt_disable();
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
if (!pmap_ept_pdes_invalid(pmap, va, &pde)) {
ptppa = pmap_pte2pa(pde);
@@ -5357,7 +5349,7 @@ pmap_ept_extract(struct pmap *pmap, vadd
}
}
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
kpreempt_enable();
if (pap != NULL) {
@@ -5377,7 +5369,7 @@ pmap_ept_remove_pte(struct pmap *pmap, s
bool accessed;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
if (!pmap_ept_valid_entry(*pte)) {
@@ -5451,7 +5443,7 @@ pmap_ept_remove_ptes(struct pmap *pmap,
pt_entry_t *pte = (pt_entry_t *)ptpva;
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
/*
@@ -5480,7 +5472,7 @@ pmap_ept_remove(struct pmap *pmap, vaddr
struct vm_page *ptp;
kpreempt_disable();
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
for (/* null */ ; va < eva ; va = blkendva) {
int lvl;
@@ -5515,7 +5507,7 @@ pmap_ept_remove(struct pmap *pmap, vaddr
}
}
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
kpreempt_enable();
/* Now we free unused PVs */
@@ -5613,13 +5605,13 @@ static void
pmap_ept_pp_remove_ent(struct pmap *pmap, struct vm_page *ptp, pt_entry_t opte,
vaddr_t va)
{
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
pmap_ept_stats_update_bypte(pmap, 0, opte);
ptp->wire_count--;
if (ptp->wire_count <= 1) {
pmap_ept_free_ptp(pmap, ptp, va);
}
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
}
static void
@@ -5643,7 +5635,7 @@ pmap_ept_write_protect(struct pmap *pmap
/* Acquire pmap. */
kpreempt_disable();
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
for (va = sva; va < eva; va += PAGE_SIZE) {
if (pmap_ept_pdes_invalid(pmap, va, &pde)) {
@@ -5675,7 +5667,7 @@ pmap_ept_write_protect(struct pmap *pmap
next:;
}
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
kpreempt_enable();
}
@@ -5688,7 +5680,7 @@ pmap_ept_unwire(struct pmap *pmap, vaddr
/* Acquire pmap. */
kpreempt_disable();
- mutex_enter(pmap->pm_lock);
+ mutex_enter(&pmap->pm_lock);
if (pmap_ept_pdes_invalid(pmap, va, &pde)) {
panic("%s: invalid PDE va=%#" PRIxVADDR, __func__, va);
@@ -5711,7 +5703,7 @@ pmap_ept_unwire(struct pmap *pmap, vaddr
}
/* Release pmap. */
- mutex_exit(pmap->pm_lock);
+ mutex_exit(&pmap->pm_lock);
kpreempt_enable();
}
Index: src/sys/arch/x86/x86/svs.c
diff -u src/sys/arch/x86/x86/svs.c:1.30 src/sys/arch/x86/x86/svs.c:1.31
--- src/sys/arch/x86/x86/svs.c:1.30 Wed Aug 7 06:23:48 2019
+++ src/sys/arch/x86/x86/svs.c Sun Dec 8 20:42:48 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: svs.c,v 1.30 2019/08/07 06:23:48 maxv Exp $ */
+/* $NetBSD: svs.c,v 1.31 2019/12/08 20:42:48 ad Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svs.c,v 1.30 2019/08/07 06:23:48 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svs.c,v 1.31 2019/12/08 20:42:48 ad Exp $");
#include "opt_svs.h"
#include "opt_user_ldt.h"
@@ -488,7 +488,7 @@ svs_pmap_sync(struct pmap *pmap, int ind
KASSERT(pmap != NULL);
KASSERT(pmap != pmap_kernel());
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(kpreempt_disabled());
KASSERT(index < PDIR_SLOT_USERLIM);
Index: src/sys/arch/xen/x86/xen_pmap.c
diff -u src/sys/arch/xen/x86/xen_pmap.c:1.32 src/sys/arch/xen/x86/xen_pmap.c:1.33
--- src/sys/arch/xen/x86/xen_pmap.c:1.32 Wed Oct 30 07:40:06 2019
+++ src/sys/arch/xen/x86/xen_pmap.c Sun Dec 8 20:42:49 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: xen_pmap.c,v 1.32 2019/10/30 07:40:06 maxv Exp $ */
+/* $NetBSD: xen_pmap.c,v 1.33 2019/12/08 20:42:49 ad Exp $ */
/*
* Copyright (c) 2007 Manuel Bouyer.
@@ -101,7 +101,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.32 2019/10/30 07:40:06 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.33 2019/12/08 20:42:49 ad Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -327,7 +327,7 @@ pmap_unmap_recursive_entries(void)
static __inline void
pmap_kpm_setpte(struct cpu_info *ci, struct pmap *pmap, int index)
{
- KASSERT(mutex_owned(pmap->pm_lock));
+ KASSERT(mutex_owned(&pmap->pm_lock));
KASSERT(mutex_owned(&ci->ci_kpm_mtx));
if (pmap == pmap_kernel()) {
KASSERT(index >= PDIR_SLOT_KERN);