Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/alpha Keep track of a pmap's PV entries with a list...
details: https://anonhg.NetBSD.org/src/rev/eb941c21a185
branches: trunk
changeset: 1021440:eb941c21a185
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun May 30 13:34:21 2021 +0000
description:
Keep track of a pmap's PV entries with a list hanging off the pmap.
diffstat:
sys/arch/alpha/alpha/pmap.c | 14 ++++++++++++--
sys/arch/alpha/include/pmap.h | 7 ++++---
2 files changed, 16 insertions(+), 5 deletions(-)
diffs (86 lines):
diff -r a19e5b92b961 -r eb941c21a185 sys/arch/alpha/alpha/pmap.c
--- a/sys/arch/alpha/alpha/pmap.c Sun May 30 13:20:01 2021 +0000
+++ b/sys/arch/alpha/alpha/pmap.c Sun May 30 13:34:21 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.287 2021/05/30 06:41:19 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.288 2021/05/30 13:34:21 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008, 2020
@@ -135,7 +135,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.287 2021/05/30 06:41:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.288 2021/05/30 13:34:21 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1384,6 +1384,7 @@
*/
memset(pmap_kernel(), 0, sizeof(struct pmap));
LIST_INIT(&pmap_kernel()->pm_ptpages);
+ LIST_INIT(&pmap_kernel()->pm_pvents);
atomic_store_relaxed(&pmap_kernel()->pm_count, 1);
/* Kernel pmap does not have per-CPU info. */
TAILQ_INSERT_TAIL(&pmap_all_pmaps, pmap_kernel(), pm_list);
@@ -1568,6 +1569,7 @@
pmap = pool_cache_get(&pmap_pmap_cache, PR_WAITOK);
memset(pmap, 0, sizeof(*pmap));
LIST_INIT(&pmap->pm_ptpages);
+ LIST_INIT(&pmap->pm_pvents);
atomic_store_relaxed(&pmap->pm_count, 1);
@@ -3278,6 +3280,7 @@
uintptr_t const attrs = md->pvh_listx & PGA_ATTRS;
newpv->pv_next = (struct pv_entry *)(md->pvh_listx & ~PGA_ATTRS);
md->pvh_listx = (uintptr_t)newpv | attrs;
+ LIST_INSERT_HEAD(&pmap->pm_pvents, newpv, pv_link);
if (dolock) {
mutex_exit(lock);
@@ -3316,8 +3319,15 @@
KASSERT(pv != NULL);
+ /*
+ * The page attributes are in the lower 2 bits of the first
+ * PV entry pointer. Rather than comparing the pointer address
+ * and branching, we just always preserve what might be there
+ * (either attribute bits or zero bits).
+ */
*pvp = (pv_entry_t)((uintptr_t)pv->pv_next |
(((uintptr_t)*pvp) & PGA_ATTRS));
+ LIST_REMOVE(pv, pv_link);
if (dolock) {
mutex_exit(lock);
diff -r a19e5b92b961 -r eb941c21a185 sys/arch/alpha/include/pmap.h
--- a/sys/arch/alpha/include/pmap.h Sun May 30 13:20:01 2021 +0000
+++ b/sys/arch/alpha/include/pmap.h Sun May 30 13:34:21 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.93 2021/05/30 06:41:19 thorpej Exp $ */
+/* $NetBSD: pmap.h,v 1.94 2021/05/30 13:34:21 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2001, 2007 The NetBSD Foundation, Inc.
@@ -151,7 +151,7 @@
unsigned int pm_count; /* [24] reference count */
unsigned int __pm_spare0; /* [28] spare field */
struct pmap_pagelist pm_ptpages; /* [32] list of PT pages */
- unsigned long __pm_spare1; /* [40] spare field */
+ LIST_HEAD(, pv_entry) pm_pvents; /* [40] list of PV entries */
TAILQ_ENTRY(pmap) pm_list; /* [48] list of all pmaps */
/* -- COHERENCY_UNIT boundary -- */
struct pmap_percpu pm_percpu[]; /* [64] per-CPU data */
@@ -171,7 +171,8 @@
* mappings of that page. An entry is a pv_entry_t, the list is pv_table.
*/
typedef struct pv_entry {
- struct pv_entry *pv_next; /* next pv_entry on list */
+ struct pv_entry *pv_next; /* next pv_entry on page list */
+ LIST_ENTRY(pv_entry) pv_link; /* link on owning pmap's list */
struct pmap *pv_pmap; /* pmap where mapping lies */
vaddr_t pv_va; /* virtual address for mapping */
pt_entry_t *pv_pte; /* PTE that maps the VA */
Home |
Main Index |
Thread Index |
Old Index