summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2010-05-30 18:48:41 +0000
committeralc <alc@FreeBSD.org>2010-05-30 18:48:41 +0000
commit0227397f4ac8049aaffc32139b100d54c3ab8dc6 (patch)
treeb7d386f5f988eee1ee4802f248b7bf31b6360465 /sys/i386
parente65f4ccf953ffadefbbd679eab31c34ae3a31a92 (diff)
downloadFreeBSD-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.c9
-rw-r--r--sys/i386/xen/pmap.c4
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();
}
OpenPOWER on IntegriCloud