Date: Fri, 26 Jun 2009 00:03:11 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r195016 - user/kmacy/releng_7_2_fcs/sys/amd64/amd64 Message-ID: <200906260003.n5Q03BM0068458@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Fri Jun 26 00:03:10 2009 New Revision: 195016 URL: http://svn.freebsd.org/changeset/base/195016 Log: add passing of free list to additional places - free_pv_entry is called with the pmap lock held Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Thu Jun 25 23:59:23 2009 (r195015) +++ user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Fri Jun 26 00:03:10 2009 (r195016) @@ -239,12 +239,14 @@ struct msgbuf *msgbufp = 0; */ static caddr_t crashdumpmap; -static void free_pv_entry(pmap_t pmap, pv_entry_t pv); +static void free_pv_entry(pmap_t pmap, pv_entry_t pv, vm_page_t *free); static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); -static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); -static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); +static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + vm_page_t *free); +static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va, + vm_page_t *free); static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va); @@ -256,7 +258,8 @@ static vm_page_t pmap_enter_quick_locked static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); static boolean_t pmap_is_modified_pvh(struct md_page *pvh); static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); -static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, + vm_page_t *free); static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot); static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, @@ -267,7 +270,7 @@ static void pmap_remove_pt_page(pmap_t p static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free); static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, - vm_offset_t va); + vm_offset_t va, vm_page_t *free); static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); @@ -1981,16 +1984,16 @@ pmap_collect(pmap_t locked_pmap, struct free = NULL; pmap_unuse_pt(pmap, va, *pde, &free); pmap_invalidate_page(pmap, va); - pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) vm_page_flag_clear(m, PG_WRITEABLE); } - free_pv_entry(pmap, pv); + free_pv_entry(pmap, pv, &free); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); + pmap_free_zero_pages(free); } vm_page_unlock(m); } @@ -2002,7 +2005,7 @@ pmap_collect(pmap_t locked_pmap, struct * free the pv_entry back to the free list */ static void -free_pv_entry(pmap_t pmap, pv_entry_t pv) +free_pv_entry(pmap_t pmap, pv_entry_t pv, vm_page_t *free) { vm_page_t m; struct pv_chunk *pc; @@ -2036,7 +2039,7 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv KASSERT(m->wire_count == 1, ("wire_count == %d", m->wire_count)); m->wire_count = 0; atomic_subtract_int(&cnt.v_wire_count, 1); - vm_page_free(m); + pmap_add_delayed_free_list(m, free, FALSE); } /* @@ -2195,7 +2198,8 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse * for the 2MB page mapping. */ static void -pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + vm_page_t *free) { struct md_page *pvh; pv_entry_t pv; @@ -2224,7 +2228,7 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs do { m++; va += PAGE_SIZE; - pmap_pvh_free(&m->md, pmap, va); + pmap_pvh_free(&m->md, pmap, va, free); } while (va < va_last); } @@ -2234,22 +2238,22 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs * page mappings. */ static void -pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va, vm_page_t *free) { pv_entry_t pv; pv = pmap_pvh_remove(pvh, pmap, va); KASSERT(pv != NULL, ("pmap_pvh_free: pv not found")); - free_pv_entry(pmap, pv); + free_pv_entry(pmap, pv, free); } static void -pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va, vm_page_t *free) { struct md_page *pvh; vm_page_lock_assert(m, MA_OWNED); - pmap_pvh_free(&m->md, pmap, va); + pmap_pvh_free(&m->md, pmap, va, free); if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) @@ -2425,7 +2429,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t if (oldpde & PG_MANAGED) { PA_LOCK_ASSERT(oldpde & PG_PS_FRAME, MA_OWNED); pvh = pa_to_pvh(oldpde & PG_PS_FRAME); - pmap_pvh_free(pvh, pmap, sva); + pmap_pvh_free(pvh, pmap, sva, free); eva = sva + NBPDR; for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); va < eva; va += PAGE_SIZE, m++) { @@ -2495,7 +2499,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t vm_page_dirty(m); if (oldpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); - pmap_remove_entry(pmap, m, va); + pmap_remove_entry(pmap, m, va, free); vm_page_unlock(m); } return (ret); @@ -2727,7 +2731,7 @@ pmap_remove_all(vm_page_t m) pmap_unuse_pt(pmap, pv->pv_va, *pde, &free); pmap_invalidate_page(pmap, pv->pv_va); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - free_pv_entry(pmap, pv); + free_pv_entry(pmap, pv, &free); PMAP_UNLOCK(pmap); } vm_page_flag_clear(m, PG_WRITEABLE); @@ -2924,7 +2928,8 @@ retry: * identical characteristics. */ static void -pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, + vm_page_t *free) { pd_entry_t newpde; pt_entry_t *firstpte, oldpte, pa, *pte; @@ -3011,7 +3016,7 @@ setpte: * Promote the pv entries. */ if ((newpde & PG_MANAGED) != 0) - pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME); + pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME, free); /* * Propagate the PAT index to its proper position. @@ -3128,7 +3133,7 @@ restart: if (origpte & PG_MANAGED) { om = PHYS_TO_VM_PAGE(opa); vm_page_lock_assert(om, MA_OWNED); - pmap_remove_entry(pmap, om, va); + pmap_remove_entry(pmap, om, va, &free); if (origpte & PG_A) vm_page_flag_set(om, PG_REFERENCED); if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) @@ -3221,7 +3226,7 @@ validate: */ if ((mpte == NULL || mpte->wire_count == NPTEPG) && pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0) - pmap_promote_pde(pmap, pde, va); + pmap_promote_pde(pmap, pde, va, &free); PA_UNLOCK(pa); PMAP_UNLOCK(pmap);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906260003.n5Q03BM0068458>