From owner-p4-projects@FreeBSD.ORG Sun May 18 13:49:04 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 78D4037B405; Sun, 18 May 2003 13:49:03 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C6DEE37B409 for ; Sun, 18 May 2003 13:49:02 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 59C0743FBD for ; Sun, 18 May 2003 13:49:01 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h4IKn00U012114 for ; Sun, 18 May 2003 13:49:00 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h4IKn0Uh012107 for perforce@freebsd.org; Sun, 18 May 2003 13:49:00 -0700 (PDT) Date: Sun, 18 May 2003 13:49:00 -0700 (PDT) Message-Id: <200305182049.h4IKn0Uh012107@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 31442 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 18 May 2003 20:49:04 -0000 http://perforce.freebsd.org/chv.cgi?CH=31442 Change 31442 by marcel@marcel_nfs on 2003/05/18 13:48:17 Remove the PMAP tweaks from this branch. The branch is now officially dead and identical to it's parent (the ia64 branch). Affected files ... .. //depot/projects/ia64_epc/sys/ia64/ia64/pmap.c#17 edit Differences ... ==== //depot/projects/ia64_epc/sys/ia64/ia64/pmap.c#17 (text+ko) ==== @@ -249,16 +249,16 @@ * VHPT instrumentation. */ static int pmap_vhpt_inserts; -static int pmap_vhpt_removals; -static int pmap_vhpt_updates; +static int pmap_vhpt_collisions; +static int pmap_vhpt_resident; SYSCTL_DECL(_vm_stats); SYSCTL_NODE(_vm_stats, OID_AUTO, vhpt, CTLFLAG_RD, 0, ""); SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, inserts, CTLFLAG_RD, - &pmap_vhpt_inserts, 0, "VHPT insertion counter"); -SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, removals, CTLFLAG_RD, - &pmap_vhpt_removals, 0, "VHPT removal counter"); -SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, updates, CTLFLAG_RD, - &pmap_vhpt_updates, 0, "VHPT update counter"); + &pmap_vhpt_inserts, 0, ""); +SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, collisions, CTLFLAG_RD, + &pmap_vhpt_collisions, 0, ""); +SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, resident, CTLFLAG_RD, + &pmap_vhpt_resident, 0, ""); static PMAP_INLINE void free_pv_entry(pv_entry_t pv); static pv_entry_t get_pv_entry(void); @@ -968,8 +968,12 @@ struct ia64_lpte *vhpte; pmap_vhpt_inserts++; + pmap_vhpt_resident++; - vhpte = (struct ia64_lpte *)ia64_thash(va); + vhpte = (struct ia64_lpte *) ia64_thash(va); + + if (vhpte->pte_chain) + pmap_vhpt_collisions++; pte->pte_chain = vhpte->pte_chain; vhpte->pte_chain = ia64_tpa((vm_offset_t) pte); @@ -988,14 +992,11 @@ { struct ia64_lpte *vhpte; - pmap_vhpt_updates++; + vhpte = (struct ia64_lpte *) ia64_thash(va); - vhpte = (struct ia64_lpte *)ia64_thash(va); - - if ((!vhpte->pte_p || vhpte->pte_tag == pte->pte_tag) && pte->pte_p) + if ((!vhpte->pte_p || vhpte->pte_tag == pte->pte_tag) + && pte->pte_p) pmap_install_pte(vhpte, pte); - - ia64_ptc_g(va, pte->pte_ps << 2); } /* @@ -1036,15 +1037,11 @@ } } - pmap_vhpt_removals++; - - /* Snip this pv_entry out of the collision chain. */ + /* + * Snip this pv_entry out of the collision chain. + */ lpte->pte_chain = pte->pte_chain; - /* Invalidate the entry and purge the TLB. */ - pte->pte_p = 0; - ia64_ptc_g(va, pte->pte_ps << 2); - /* * If the VHPTE matches as well, change it to map the first * element from the chain if there is one. @@ -1060,6 +1057,7 @@ } } + pmap_vhpt_resident--; error = 0; done: return error; @@ -1188,9 +1186,9 @@ pmap_find_kpte(vm_offset_t va) { KASSERT((va >> 61) == 5, - ("kernel mapping 0x%lx not in region 5", va)); + ("kernel mapping 0x%lx not in region 5", va)); KASSERT(IA64_RR_MASK(va) < (nkpt * PAGE_SIZE * NKPTEPG), - ("kernel mapping 0x%lx out of range", va)); + ("kernel mapping 0x%lx out of range", va)); return (&ia64_kptdir[KPTE_DIR_INDEX(va)][KPTE_PTE_INDEX(va)]); } @@ -1268,6 +1266,19 @@ } /* + * If a pte contains a valid mapping, clear it and update the VHPT. + */ +static void +pmap_clear_pte(struct ia64_lpte *pte, vm_offset_t va) +{ + if (pte->pte_p) { + pmap_remove_vhpt(va); + ia64_ptc_g(va, PAGE_SHIFT << 2); + pte->pte_p = 0; + } +} + +/* * Remove the (possibly managed) mapping represented by pte from the * given pmap. */ @@ -1288,6 +1299,11 @@ if (error) return error; + /* + * Make sure pmap_set_pte() knows it isn't in the VHPT. + */ + pte->pte_p = 0; + if (pte->pte_ig & PTE_IG_WIRED) pmap->pm_stats.wired_count -= 1; @@ -1357,9 +1373,13 @@ for (i = 0; i < count; i++) { vm_offset_t tva = va + i * PAGE_SIZE; + int wasvalid; pte = pmap_find_kpte(tva); - pmap_set_pte(pte, tva, VM_PAGE_TO_PHYS(m[i]), 0, PTE_PL_KERN, - PTE_AR_RWX); + wasvalid = pte->pte_p; + pmap_set_pte(pte, tva, VM_PAGE_TO_PHYS(m[i]), + 0, PTE_PL_KERN, PTE_AR_RWX); + if (wasvalid) + ia64_ptc_g(tva, PAGE_SHIFT << 2); } } @@ -1375,9 +1395,8 @@ for (i = 0; i < count; i++) { pte = pmap_find_kpte(va); - if (pte->pte_p) - pmap_remove_vhpt(va); - va += PAGE_SIZE; + pmap_clear_pte(pte, va); + va += PAGE_SIZE; } } @@ -1388,9 +1407,13 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa) { struct ia64_lpte *pte; + int wasvalid; pte = pmap_find_kpte(va); + wasvalid = pte->pte_p; pmap_set_pte(pte, va, pa, 0, PTE_PL_KERN, PTE_AR_RWX); + if (wasvalid) + ia64_ptc_g(va, PAGE_SHIFT << 2); } /* @@ -1402,8 +1425,7 @@ struct ia64_lpte *pte; pte = pmap_find_kpte(va); - if (pte->pte_p) - pmap_remove_vhpt(va); + pmap_clear_pte(pte, va); } /* @@ -1609,6 +1631,7 @@ } pmap_pte_set_prot(pte, newprot); pmap_update_vhpt(pte, sva); + pmap_invalidate_page(pmap, sva); } sva += PAGE_SIZE; @@ -1729,7 +1752,7 @@ * adds the pte to the VHPT if necessary. */ pmap_set_pte(pte, va, pa, managed | (wired ? PTE_IG_WIRED : 0), - pte_prot_pl(pmap, prot), pte_prot_ar(pmap, prot)); + pte_prot_pl(pmap, prot), pte_prot_ar(pmap, prot)); /* * if the mapping or permission bits are different, we need @@ -1777,8 +1800,9 @@ /* * Initialise PTE with read-only protection and enter into VHPT. */ - pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), PTE_IG_MANAGED, PTE_PL_USER, - PTE_AR_R); + pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), + PTE_IG_MANAGED, + PTE_PL_USER, PTE_AR_R); pmap_install(oldpmap); } @@ -2223,6 +2247,7 @@ pte = pmap_find_vhpt(pv->pv_va); pmap_pte_set_prot(pte, newprot); pmap_update_vhpt(pte, pv->pv_va); + pmap_invalidate_page(pv->pv_pmap, pv->pv_va); pmap_install(oldpmap); } vm_page_flag_clear(m, PG_WRITEABLE); @@ -2260,6 +2285,7 @@ count++; pte->pte_a = 0; pmap_update_vhpt(pte, pv->pv_va); + pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } pmap_install(oldpmap); } @@ -2336,6 +2362,7 @@ if (pte->pte_d) { pte->pte_d = 0; pmap_update_vhpt(pte, pv->pv_va); + pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } pmap_install(oldpmap); } @@ -2360,6 +2387,7 @@ if (pte->pte_a) { pte->pte_a = 0; pmap_update_vhpt(pte, pv->pv_va); + pmap_invalidate_page(pv->pv_pmap, pv->pv_va); } pmap_install(oldpmap); }