Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/mips/mips remove remaining spl calls, they're not n...



details:   https://anonhg.NetBSD.org/src/rev/57beaca9a200
branches:  trunk
changeset: 513576:57beaca9a200
user:      chs <chs%NetBSD.org@localhost>
date:      Sat Aug 04 04:25:37 2001 +0000

description:
remove remaining spl calls, they're not needed.
remove some checks for impossible conditions.
in pmap_enter(), only call pmap_remove() to remove an existing mapping
if there actually is an existing mapping.

in pmap_remove_pv(), don't flush the MIPS1 cache when removing the last mapping.
this was added in rev 1.97, to avoid stale data being left in the cache
when the page is zeroed bypassing the cache in pmap_zero_page_uncached().
we've since found that bypassing the cache for idle-loop page zeroing
doesn't work very well anyway, so we don't do that anymore.
so now we can remove the extra cache-flush.
remove pmap_zero_page_uncached() while I'm thinking of it.

various other cleanup.

diffstat:

 sys/arch/mips/mips/pmap.c |  250 +++++++++------------------------------------
 1 files changed, 50 insertions(+), 200 deletions(-)

diffs (truncated from 627 to 300 lines):

diff -r fae51d65a75c -r 57beaca9a200 sys/arch/mips/mips/pmap.c
--- a/sys/arch/mips/mips/pmap.c Sat Aug 04 04:06:29 2001 +0000
+++ b/sys/arch/mips/mips/pmap.c Sat Aug 04 04:25:37 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.129 2001/07/31 05:29:24 chs Exp $   */
+/*     $NetBSD: pmap.c,v 1.130 2001/08/04 04:25:37 chs Exp $   */
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.129 2001/07/31 05:29:24 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.130 2001/08/04 04:25:37 chs Exp $");
 
 /*
  *     Manages physical address maps.
@@ -240,13 +240,6 @@
 /*
  * Misc. functions.
  */
-boolean_t pmap_physpage_alloc(int, paddr_t *);
-void   pmap_physpage_free(paddr_t);
-
-/* Metadata page usage. */
-#define        PGU_PVENT               0
-#define        PGU_L1PT                1
-#define        PGU_L2PT                2
 
 #ifdef MIPS3
 void mips_dump_segtab __P((struct proc *));
@@ -521,7 +514,7 @@
 pmap_create()
 {
        pmap_t pmap;
-       int i, s;
+       int i;
 
 #ifdef DEBUG
        if (pmapdebug & (PDB_FOLLOW|PDB_CREATE))
@@ -534,11 +527,9 @@
        simple_lock_init(&pmap->pm_lock);
        pmap->pm_count = 1;
        if (free_segtab) {
-               s = splvm();
                pmap->pm_segtab = free_segtab;
                free_segtab = *(struct segtab **)free_segtab;
                pmap->pm_segtab->seg_tab[0] = NULL;
-               splx(s);
        } else {
                struct segtab *stp;
                struct vm_page *mem;
@@ -558,13 +549,11 @@
                pmap->pm_segtab = stp = (struct segtab *)
                        MIPS_PHYS_TO_KSEG0(VM_PAGE_TO_PHYS(mem));
                i = NBPG / sizeof(struct segtab);
-               s = splvm();
                while (--i != 0) {
                        stp++;
                        *(struct segtab **)stp = free_segtab;
                        free_segtab = stp;
                }
-               splx(s);
        }
 #ifdef PARANOIADIAG
        for (i = 0; i < PMAP_SEGTABSIZE; i++)
@@ -592,9 +581,6 @@
        if (pmapdebug & (PDB_FOLLOW|PDB_CREATE))
                printf("pmap_destroy(%p)\n", pmap);
 #endif
-       if (pmap == NULL)
-               return;
-
        simple_lock(&pmap->pm_lock);
        count = --pmap->pm_count;
        simple_unlock(&pmap->pm_lock);
@@ -605,7 +591,6 @@
        if (pmap->pm_segtab) {
                pt_entry_t *pte;
                int i;
-               int s;
 #ifdef PARANOIADIAG
                int j;
 #endif
@@ -638,10 +623,8 @@
 
                        pmap->pm_segtab->seg_tab[i] = NULL;
                }
-               s = splvm();
                *(struct segtab **)pmap->pm_segtab = free_segtab;
                free_segtab = pmap->pm_segtab;
-               splx(s);
                pmap->pm_segtab = NULL;
        }
 
@@ -715,9 +698,6 @@
                printf("pmap_remove(%p, %lx, %lx)\n", pmap, sva, eva);
        remove_stats.calls++;
 #endif
-       if (pmap == NULL)
-               return;
-
        if (pmap == pmap_kernel()) {
                pt_entry_t *pte;
 
@@ -826,9 +806,6 @@
            (prot == VM_PROT_NONE && (pmapdebug & PDB_REMOVE)))
                printf("pmap_page_protect(%lx, %x)\n", pa, prot);
 #endif
-       if (!PAGE_IS_MANAGED(pa))
-               return;
-
        switch (prot) {
        case VM_PROT_READ|VM_PROT_WRITE:
        case VM_PROT_ALL:
@@ -844,12 +821,6 @@
                if (pv->pv_pmap != NULL) {
                        for (; pv; pv = pv->pv_next) {
                                va = pv->pv_va;
-
-                               /*
-                                * XXX don't write protect pager mappings
-                                */
-                               if (va >= uvm.pager_sva && va < uvm.pager_eva)
-                                       continue;
                                pmap_protect(pv->pv_pmap, va, va + PAGE_SIZE,
                                        prot);
                                pmap_update();
@@ -889,9 +860,6 @@
                printf("pmap_protect(%p, %lx, %lx, %x)\n",
                    pmap, sva, eva, prot);
 #endif
-       if (pmap == NULL)
-               return;
-
        if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
                pmap_remove(pmap, sva, eva);
                return;
@@ -1035,7 +1003,7 @@
 /*
  *     pmap_page_cache:
  *
- *     Change all mappings of a page to cached/uncached.
+ *     Change all mappings of a managed page to cached/uncached.
  */
 static void
 pmap_page_cache(paddr_t pa, int mode)
@@ -1050,9 +1018,6 @@
        if (pmapdebug & (PDB_FOLLOW|PDB_ENTER))
                printf("pmap_page_uncache(%lx)\n", pa);
 #endif
-       if (!PAGE_IS_MANAGED(pa))
-               return;
-
        newmode = mode & PV_UNCACHED ? MIPS3_PG_UNCACHED : MIPS3_PG_CACHED;
        pv = pa_to_pvh(pa);
        asid = pv->pv_pmap->pm_asid;
@@ -1123,10 +1088,6 @@
                printf("pmap_enter(%p, %lx, %lx, %x, %x)\n",
                    pmap, va, pa, prot, wired);
 #endif
-#ifdef PARANOIADIAG
-       if (!pmap)
-               panic("pmap_enter: pmap");
-#endif
 #if defined(DEBUG) || defined(DIAGNOSTIC) || defined(PARANOIADIAG)
        if (pmap == pmap_kernel()) {
 #ifdef DEBUG
@@ -1235,7 +1196,8 @@
                if (mips_pg_wired(pte->pt_entry))
                        panic("pmap_enter: kernel wired");
 #endif
-               if (mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
+               if (mips_pg_v(pte->pt_entry) &&
+                   mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
                        pmap_remove(pmap, va, va + NBPG);
 #ifdef DEBUG
                        enter_stats.mchange++;
@@ -1243,11 +1205,12 @@
                }
                if (!mips_pg_v(pte->pt_entry))
                        pmap->pm_stats.resident_count++;
+               pte->pt_entry = npte;
 
-               pte->pt_entry = npte;
                /*
                 * Update the same virtual address entry.
                 */
+
                MachTLBUpdate(va, npte);
                return 0;
        }
@@ -1284,6 +1247,7 @@
         * Assume uniform modified and referenced status for all
         * MIPS pages in a MACH page.
         */
+
        if (CPUISMIPS3)
                npte |= mips_paddr_to_tlbpfn(pa);
        else
@@ -1316,7 +1280,8 @@
 #endif
 
        asid = pmap->pm_asid << MIPS_TLB_PID_SHIFT;
-       if (mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
+       if (mips_pg_v(pte->pt_entry) &&
+           mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
                pmap_remove(pmap, va, va + NBPG);
 #ifdef DEBUG
                enter_stats.mchange++;
@@ -1370,9 +1335,7 @@
                npte |= MIPS1_PG_V | MIPS1_PG_G;
        }
        pte = kvtopte(va);
-#if 0 /* XXXJRT */
        KASSERT(!mips_pg_v(pte->pt_entry));
-#endif
        pte->pt_entry = npte;
        MachTLBUpdate(va, npte);
 }
@@ -1433,9 +1396,6 @@
        if (pmapdebug & (PDB_FOLLOW|PDB_WIRING))
                printf("pmap_unwire(%p, %lx)\n", pmap, va);
 #endif
-       if (pmap == NULL)
-               return;
-
        /*
         * Don't need to flush the TLB since PG_WIRED is only in software.
         */
@@ -1596,28 +1556,6 @@
 }
 
 /*
- *     pmap_zero_page_uncached zeros the specified page
- *     using uncached accesses.  Returns TRUE if the page
- *     was zero'd, FALSE if we aborted.
- */
-boolean_t
-pmap_zero_page_uncached(phys)
-       paddr_t phys;
-{
-#ifdef DEBUG
-       if (pmapdebug & PDB_FOLLOW)
-               printf("pmap_zero_page_uncached(%lx)\n", phys);
-#endif
-#ifdef PARANOIADIAG
-       if (! (phys < MIPS_MAX_MEM_ADDR))
-               printf("pmap_zero_page_uncached(%lx) nonphys\n", phys);
-#endif
-       mips_pagezero((caddr_t)MIPS_PHYS_TO_KSEG1(phys));
-
-       return (TRUE);
-}
-
-/*
  *     pmap_copy_page copies the specified page.
  */
 void
@@ -1694,11 +1632,8 @@
        if (pmapdebug & PDB_FOLLOW)
                printf("pmap_clear_reference(%lx)\n", pa);
 #endif
-       rv = FALSE;
-       if (PAGE_IS_MANAGED(pa)) {
-               rv = *pa_to_attribute(pa) & PV_REFERENCED;
-               *pa_to_attribute(pa) &= ~PV_REFERENCED;
-       }
+       rv = *pa_to_attribute(pa) & PV_REFERENCED;
+       *pa_to_attribute(pa) &= ~PV_REFERENCED;
        return rv;
 }
 
@@ -1714,13 +1649,7 @@
 {
        paddr_t pa = VM_PAGE_TO_PHYS(pg);
 
-       if (PAGE_IS_MANAGED(pa))
-               return (*pa_to_attribute(pa) & PV_REFERENCED);
-#ifdef DEBUG
-       else
-               printf("pmap_is_referenced: pa %lx\n", pa);
-#endif
-       return (FALSE);
+       return (*pa_to_attribute(pa) & PV_REFERENCED);
 }
 
 /*
@@ -1737,11 +1666,8 @@
        if (pmapdebug & PDB_FOLLOW)
                printf("pmap_clear_modify(%lx)\n", pa);
 #endif
-       rv = FALSE;
-       if (PAGE_IS_MANAGED(pa)) {
-               rv = *pa_to_attribute(pa) & PV_MODIFIED;
-               *pa_to_attribute(pa) &= ~PV_MODIFIED;
-       }
+       rv = *pa_to_attribute(pa) & PV_MODIFIED;
+       *pa_to_attribute(pa) &= ~PV_MODIFIED;



Home | Main Index | Thread Index | Old Index