? arch/hp700/compile/DEBUG ? arch/hp700/compile/GENERIC ? arch/hp700/compile/MP ? arch/hp700/compile/MULTIPROCESSOR ? arch/hp700/conf/DEBUG ? arch/hp700/conf/MP ? arch/hp700/conf/MULTIPROCESSOR Index: arch/hppa/hppa/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/hppa/hppa/pmap.c,v retrieving revision 1.71.2.4 diff -u -p -u -r1.71.2.4 pmap.c --- arch/hppa/hppa/pmap.c 5 Mar 2011 20:50:36 -0000 1.71.2.4 +++ arch/hppa/hppa/pmap.c 9 Mar 2011 14:45:58 -0000 @@ -504,13 +504,11 @@ pmap_dump_pv(paddr_t pa) pg = PHYS_TO_VM_PAGE(pa); md = VM_PAGE_TO_MD(pg); - mutex_enter(&md->pvh_lock); db_printf("pg %p attr 0x%08x aliases %d\n", pg, md->pvh_attrs, md->pvh_aliases); for (pve = md->pvh_list; pve; pve = pve->pv_next) db_printf("%x:%lx\n", pve->pv_pmap->pm_space, pve->pv_va & PV_VAMASK); - mutex_exit(&md->pvh_lock); } #endif @@ -576,7 +574,7 @@ pmap_pv_enter(struct vm_page *pg, struct DPRINTF(PDB_FOLLOW|PDB_PV, ("%s(%p, %p, %p, 0x%lx, %p, 0x%x)\n", __func__, pg, pve, pm, va, pdep, flags)); - KASSERT(mutex_owned(&md->pvh_lock)); + KASSERT(pm == pmap_kernel() || uvm_page_locked_p(pg)); pve->pv_pmap = pm; pve->pv_va = va | flags; @@ -591,7 +589,7 @@ pmap_pv_remove(struct vm_page *pg, pmap_ struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry **pve, *pv; - KASSERT(mutex_owned(&md->pvh_lock)); + KASSERT(pmap == pmap_kernel() || uvm_page_locked_p(pg)); for (pv = *(pve = &md->pvh_list); pv; pv = *(pve = &(*pve)->pv_next)) @@ -681,7 +679,7 @@ pmap_bootstrap(vaddr_t vstart) kpm = pmap_kernel(); memset(kpm, 0, sizeof(*kpm)); - uvm_obj_init(&kpm->pm_obj, NULL, &kpm->pm_obj_lock, 1); + uvm_obj_init(&kpm->pm_obj, NULL, &kpm->pm_objlock, 1); kpm->pm_space = HPPA_SID_KERNEL; kpm->pm_pid = HPPA_PID_KERNEL; kpm->pm_pdir_pg = NULL; @@ -1041,7 +1039,7 @@ pmap_create(void) DPRINTF(PDB_FOLLOW|PDB_PMAP, ("%s: pmap = %p\n", __func__, pmap)); - uvm_obj_init(&pmap->pm_obj, NULL, &pmap->pm_obj_lock, 1); + uvm_obj_init(&pmap->pm_obj, NULL, &pmap->pm_objlock, 1); mutex_enter(&pmaps_lock); @@ -1144,7 +1142,7 @@ pmap_destroy(pmap_t pmap) pmap_pagefree(pmap->pm_pdir_pg); mutex_exit(pmap->pm_lock); - uvm_obj_destroy(&pmap->pm_obj, &pmap->pm_obj_lock); + uvm_obj_destroy(&pmap->pm_obj, &pmap->pm_objlock); pmap->pm_pdir_pg = NULL; pool_put(&pmap_pool, pmap); } @@ -1216,11 +1214,10 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd } pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); - struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - mutex_enter(&md->pvh_lock); pve = pmap_pv_remove(pg, pmap, va); + + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); md->pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&md->pvh_lock); } else { DPRINTF(PDB_ENTER, ("%s: new mapping 0x%lx -> 0x%lx\n", __func__, va, pa)); @@ -1234,22 +1231,18 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd } if (pmap_initialized && (pg = PHYS_TO_VM_PAGE(pa))) { - struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - if (!pve && !(pve = pmap_pv_alloc())) { if (flags & PMAP_CANFAIL) { - mutex_exit(&md->pvh_lock); PMAP_UNLOCK(pmap); return (ENOMEM); } panic("%s: no pv entries available", __func__); } pte |= PTE_PROT(pmap_prot(pmap, prot)); - mutex_enter(&md->pvh_lock); if (pmap_check_alias(pg, va, pte)) - pmap_page_remove_locked(pg); + pmap_page_remove(pg); pmap_pv_enter(pg, pve, pmap, va, ptp, 0); - mutex_exit(&md->pvh_lock); + } else if (pve) { pmap_pv_free(pve); } @@ -1318,13 +1311,10 @@ pmap_remove(pmap_t pmap, vaddr_t sva, va (pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)))) { struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - mutex_enter(&md->pvh_lock); pve = pmap_pv_remove(pg, pmap, sva); md->pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&md->pvh_lock); - if (pve != NULL) pmap_pv_free(pve); } @@ -1374,9 +1364,7 @@ pmap_write_protect(pmap_t pmap, vaddr_t pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - mutex_enter(&md->pvh_lock); md->pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&md->pvh_lock); pmap_pte_flush(pmap, sva, pte); pte &= ~PTE_PROT(TLB_AR_MASK); @@ -1392,16 +1380,6 @@ void pmap_page_remove(struct vm_page *pg) { struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - - mutex_enter(&md->pvh_lock); - pmap_page_remove_locked(pg); - mutex_exit(&md->pvh_lock); -} - -void -pmap_page_remove_locked(struct vm_page *pg) -{ - struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry *pve, *npve, **pvp; DPRINTF(PDB_FOLLOW|PDB_PV, ("%s(%p)\n", __func__, pg)); @@ -1496,8 +1474,6 @@ pmap_changebit(struct vm_page *pg, u_int KASSERT((set & ~(PVF_REF|PVF_UNCACHEABLE)) == 0); KASSERT((clear & ~(PVF_MOD|PVF_WRITE|PVF_UNCACHEABLE)) == 0); - mutex_enter(&md->pvh_lock); - /* preserve other bits */ res = md->pvh_attrs & (set | clear); md->pvh_attrs ^= res; @@ -1532,7 +1508,6 @@ pmap_changebit(struct vm_page *pg, u_int } } } - mutex_exit(&md->pvh_lock); return ((res & (clear | set)) != 0); } @@ -1547,8 +1522,6 @@ pmap_testbit(struct vm_page *pg, u_int b DPRINTF(PDB_FOLLOW|PDB_BITS, ("%s(%p, %x)\n", __func__, pg, bit)); - mutex_enter(&md->pvh_lock); - for (pve = md->pvh_list; !(md->pvh_attrs & bit) && pve; pve = pve->pv_next) { pmap_t pm = pve->pv_pmap; @@ -1560,7 +1533,6 @@ pmap_testbit(struct vm_page *pg, u_int b md->pvh_attrs |= pmap_pvh_attrs(pte); } ret = ((md->pvh_attrs & bit) != 0); - mutex_exit(&md->pvh_lock); return ret; } @@ -1736,8 +1708,6 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); if (pg != NULL) { - struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - KASSERT(pa < HPPA_IOBEGIN); struct pv_entry *pve; @@ -1750,12 +1720,10 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v ("%s(%lx, %lx, %x) TLB_KENTER\n", __func__, va, pa, pte)); - mutex_enter(&md->pvh_lock); if (pmap_check_alias(pg, va, pte)) - pmap_page_remove_locked(pg); + pmap_page_remove(pg); pmap_pv_enter(pg, pve, pmap_kernel(), va, NULL, PV_KENTER); - mutex_exit(&md->pvh_lock); } } pmap_pte_set(pde, va, pte); @@ -1824,13 +1792,8 @@ pmap_kremove(vaddr_t va, vsize_t size) pmap_pte_flush(pmap, va, pte); pmap_pte_set(pde, va, 0); if (pmap_initialized && (pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)))) { - struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - - mutex_enter(&md->pvh_lock); - pve = pmap_pv_remove(pg, pmap, va); - mutex_exit(&md->pvh_lock); if (pve != NULL) pmap_pv_free(pve); } Index: arch/hppa/include/pmap.h =================================================================== RCS file: /cvsroot/src/sys/arch/hppa/include/pmap.h,v retrieving revision 1.25.2.4 diff -u -p -u -r1.25.2.4 pmap.h --- arch/hppa/include/pmap.h 5 Mar 2011 20:50:37 -0000 1.25.2.4 +++ arch/hppa/include/pmap.h 9 Mar 2011 14:45:58 -0000 @@ -49,9 +49,9 @@ #ifdef _KERNEL struct pmap { - struct uvm_object pm_obj; /* object (lck by object lock) */ + struct uvm_object pm_obj; /* object (lock by object lock) */ #define pm_lock pm_obj.vmobjlock - kmutex_t pm_obj_lock; /* lock for pm_obj */ + kmutex_t pm_objlock; /* lock for pm_obj */ struct vm_page *pm_ptphint; struct vm_page *pm_pdir_pg; /* vm_page for pdir */ volatile uint32_t *pm_pdir; /* page dir (read-only after create) */ @@ -198,7 +198,6 @@ pmap_protect(struct pmap *pmap, vaddr_t struct pv_entry; struct vm_page_md { - struct kmutex pvh_lock; /* locks every pv on this list */ struct pv_entry *pvh_list; /* head of list (locked by pvh_lock) */ u_int pvh_attrs; /* to preserve ref/mod */ int pvh_aliases; /* alias counting */ @@ -206,7 +205,6 @@ struct vm_page_md { #define VM_MDPAGE_INIT(pg) \ do { \ - mutex_init(&(pg)->mdpage.pvh_lock, MUTEX_NODEBUG, IPL_VM); \ (pg)->mdpage.pvh_list = NULL; \ (pg)->mdpage.pvh_attrs = 0; \ (pg)->mdpage.pvh_aliases = 0; \