Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/alpha The kernel pmap can be accessed (and locked!)...



details:   https://anonhg.NetBSD.org/src/rev/f71eacaaffce
branches:  trunk
changeset: 473198:f71eacaaffce
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Mon May 24 20:11:58 1999 +0000

description:
The kernel pmap can be accessed (and locked!) while in an interrupt
context, so we must block interrupts which may cause memory allocation
before asserting the kernel pmap's lock.  Put this all in PMAP_LOCK()
and PMAP_UNLOCK() macros to make it easier.

diffstat:

 sys/arch/alpha/alpha/pmap.c   |  102 +++++++++++++++++++++++++----------------
 sys/arch/alpha/include/pmap.h |   28 +++++++++++-
 2 files changed, 89 insertions(+), 41 deletions(-)

diffs (truncated from 431 to 300 lines):

diff -r a2bb32deb3e4 -r f71eacaaffce sys/arch/alpha/alpha/pmap.c
--- a/sys/arch/alpha/alpha/pmap.c       Mon May 24 20:10:30 1999 +0000
+++ b/sys/arch/alpha/alpha/pmap.c       Mon May 24 20:11:58 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.99 1999/05/24 01:35:54 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.100 1999/05/24 20:11:58 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
@@ -155,7 +155,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.99 1999/05/24 01:35:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.100 1999/05/24 20:11:58 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -379,7 +379,10 @@
  *     * pm_slock (per-pmap) - This lock protects all of the members
  *       of the pmap structure itself.  This lock will be asserted
  *       in pmap_activate() and pmap_deactivate() from a critical
- *       section of cpu_switch(), and must never sleep.
+ *       section of cpu_switch(), and must never sleep.  Note that
+ *       in the case of the kernel pmap, interrupts which cause
+ *       memory allocation *must* be blocked while this lock is
+ *       asserted.
  *
  *     * pvh_slock (per-pv_head) - This lock protects the PV list
  *       for a specified managed page.
@@ -1174,7 +1177,7 @@
 pmap_destroy(pmap)
        pmap_t pmap;
 {
-       int refs;
+       int ps, refs;
 
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
@@ -1183,9 +1186,9 @@
        if (pmap == NULL)
                return;
 
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
        refs = --pmap->pm_count;
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
 
        if (refs > 0)
                return;
@@ -1230,14 +1233,16 @@
 pmap_reference(pmap)
        pmap_t  pmap;
 {
+       int ps;
+
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
                printf("pmap_reference(%p)\n", pmap);
 #endif
        if (pmap != NULL) {
-               simple_lock(&pmap->pm_slock);
+               PMAP_LOCK(pmap, ps);
                pmap->pm_count++;
-               simple_unlock(&pmap->pm_slock);
+               PMAP_UNLOCK(pmap, ps);
        }
 }
 
@@ -1260,6 +1265,7 @@
        pt_entry_t *l1pte, *l2pte, *l3pte;
        boolean_t needisync = FALSE;
        long cpu_id = alpha_pal_whami();
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & (PDB_FOLLOW|PDB_REMOVE|PDB_PROTECT))
@@ -1285,7 +1291,7 @@
 #endif
 
        PMAP_MAP_TO_HEAD_LOCK();
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        while (sva < eva) {
                /*
@@ -1319,7 +1325,7 @@
        if (needisync)
                alpha_pal_imb();
 
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
        PMAP_MAP_TO_HEAD_UNLOCK();
 }
 
@@ -1343,7 +1349,7 @@
 {
        struct pv_head *pvh;
        pv_entry_t pv, nextpv;
-       int s;
+       int s, ps;
        boolean_t needisync = FALSE;
        long cpu_id = alpha_pal_whami();
 #if defined(PMAP_NEW)
@@ -1401,7 +1407,7 @@
        for (pv = LIST_FIRST(&pvh->pvh_list); pv != NULL; pv = nextpv) {
                nextpv = LIST_NEXT(pv, pv_list);
 
-               simple_lock(&pv->pv_pmap->pm_slock);
+               PMAP_LOCK(pv->pv_pmap, ps);
 #ifdef DEBUG
                if (pmap_pte_v(pmap_l2pte(pv->pv_pmap, pv->pv_va, NULL)) == 0 ||
                    pmap_pte_pa(pv->pv_pte) != pa)
@@ -1420,7 +1426,7 @@
                        }
                }
 #endif
-               simple_unlock(&pv->pv_pmap->pm_slock);
+               PMAP_UNLOCK(pv->pv_pmap, ps);
        }
        splx(s);
 
@@ -1448,6 +1454,7 @@
        boolean_t hadasm;
        vaddr_t l1eva, l2eva;
        long cpu_id = alpha_pal_whami();
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & (PDB_FOLLOW|PDB_PROTECT))
@@ -1466,7 +1473,7 @@
        if (prot & VM_PROT_WRITE)
                return;
 
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        bits = pte_prot(pmap, prot);
        isactive = PMAP_ISACTIVE(pmap);
@@ -1518,7 +1525,7 @@
 #endif
        }
 
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
 }
 
 /*
@@ -1552,6 +1559,7 @@
        boolean_t needisync;
        boolean_t isactive;
        long cpu_id = alpha_pal_whami();
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & (PDB_FOLLOW|PDB_ENTER))
@@ -1566,7 +1574,7 @@
        needisync = isactive && (prot & VM_PROT_EXECUTE) != 0;
 
        PMAP_MAP_TO_HEAD_LOCK();
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        if (pmap == pmap_kernel()) {
 #ifdef DIAGNOSTIC
@@ -1801,7 +1809,7 @@
 #endif
        }
 
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
        PMAP_MAP_TO_HEAD_UNLOCK();
 }
 
@@ -1823,7 +1831,8 @@
        pt_entry_t *pte, npte;
        long cpu_id = alpha_pal_whami();
        boolean_t needisync = FALSE;
-       int s;
+       pmap_t pmap = pmap_kernel();
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & (PDB_FOLLOW|PDB_ENTER))
@@ -1844,16 +1853,14 @@
        /*
         * Update stats; must lock the kernel pmap to do this.
         */
-       s = splimp();
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        if (pmap_pte_v(pte) == 0)
-               pmap_kernel()->pm_stats.resident_count++;
+               pmap->pm_stats.resident_count++;
        if (pmap_pte_w(pte) == 0)
-               pmap_kernel()->pm_stats.wired_count++;
-
-       simple_unlock(&pmap->pm_slock);
-       splx(s);
+               pmap->pm_stats.wired_count++;
+
+       PMAP_UNLOCK(pmap, ps);
 
        if ((prot & VM_PROT_EXECUTE) != 0 || pmap_pte_exec(pte))
                needisync = TRUE;
@@ -1931,6 +1938,7 @@
        pt_entry_t *pte;
        boolean_t needisync = FALSE;
        long cpu_id = alpha_pal_whami();
+       pmap_t pmap = pmap_kernel();
        int s;
 
 #ifdef DEBUG
@@ -1944,21 +1952,26 @@
                panic("pmap_kremove: user address");
 #endif
 
+       /*
+        * XXX WE MUST FIND AND FIX WHY WE ARE CALLED TO REMOVE MAPPINGS
+        * XXX WITH PG_PVENT SET!
+        */
+
        s = splimp();
        PMAP_MAP_TO_HEAD_LOCK();
-       simple_lock(&pmap_kernel()->pm_slock);
+       simple_lock(&pmap->pm_slock);
 
        for (; size != 0; size -= PAGE_SIZE, va += PAGE_SIZE) {
                pte = PMAP_KERNEL_PTE(va);
                if (pmap_pte_v(pte))
-                       needisync |= pmap_remove_mapping(pmap_kernel(), va,
-                           pte, TRUE, cpu_id, NULL);
+                       needisync |= pmap_remove_mapping(pmap, va, pte,
+                           TRUE, cpu_id, NULL);
        }
 
        if (needisync)
                alpha_pal_imb();
 
-       simple_unlock(&pmap_kernel()->pm_slock);
+       simple_unlock(&pmap->pm_slock);
        PMAP_MAP_TO_HEAD_UNLOCK();
        splx(s);
 }
@@ -1977,6 +1990,7 @@
        boolean_t       wired;
 {
        pt_entry_t *pte;
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
@@ -1985,7 +1999,7 @@
        if (pmap == NULL)
                return;
 
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        pte = pmap_l3pte(pmap, va, NULL);
 #ifdef DEBUG
@@ -2021,7 +2035,7 @@
                        pmap->pm_stats.wired_count--;
        }
 
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
 }
 
 /*
@@ -2037,6 +2051,7 @@
 {
        pt_entry_t *l1pte, *l2pte, *l3pte;
        paddr_t pa;
+       int ps;
 
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
@@ -2044,7 +2059,7 @@
 #endif
        pa = 0;
 
-       simple_lock(&pmap->pm_slock);
+       PMAP_LOCK(pmap, ps);
 
        l1pte = pmap_l1pte(pmap, va);
        if (pmap_pte_v(l1pte) == 0)
@@ -2061,7 +2076,7 @@
        pa = pmap_pte_pa(l3pte) | (va & PGOFSET);
 
  out:
-       simple_unlock(&pmap->pm_slock);
+       PMAP_UNLOCK(pmap, ps);
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
                printf("0x%lx\n", pa);
@@ -2159,6 +2174,7 @@
 {



Home | Main Index | Thread Index | Old Index