diff options
author | alc <alc@FreeBSD.org> | 2010-05-30 18:48:41 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-05-30 18:48:41 +0000 |
commit | 0227397f4ac8049aaffc32139b100d54c3ab8dc6 (patch) | |
tree | b7d386f5f988eee1ee4802f248b7bf31b6360465 /sys/i386 | |
parent | e65f4ccf953ffadefbbd679eab31c34ae3a31a92 (diff) | |
download | FreeBSD-src-0227397f4ac8049aaffc32139b100d54c3ab8dc6.zip FreeBSD-src-0227397f4ac8049aaffc32139b100d54c3ab8dc6.tar.gz |
Simplify the inner loop of pmap_collect(): While iterating over the page's
pv list, there is no point in checking whether or not the pv list is empty.
Instead, wait until the loop completes.
Diffstat (limited to 'sys/i386')
-rw-r--r-- | sys/i386/i386/pmap.c | 9 | ||||
-rw-r--r-- | sys/i386/xen/pmap.c | 4 |
2 files changed, 5 insertions, 8 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index f2fce2d..9dbab4e 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2147,7 +2147,6 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_ac static void pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) { - struct md_page *pvh; pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; @@ -2184,15 +2183,13 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) 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); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); } + if (TAILQ_EMPTY(&m->md.pv_list) && + TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); } sched_unpin(); } diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c index ed3b0b0..67bbd27 100644 --- a/sys/i386/xen/pmap.c +++ b/sys/i386/xen/pmap.c @@ -2078,12 +2078,12 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) 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)) - vm_page_flag_clear(m, PG_WRITEABLE); free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); } + if (TAILQ_EMPTY(&m->md.pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); } sched_unpin(); } |