svn commit: r214938 - head/sys/i386/i386
Alan Cox
alc at FreeBSD.org
Sun Nov 7 18:42:38 UTC 2010
Author: alc
Date: Sun Nov 7 18:42:37 2010
New Revision: 214938
URL: http://svn.freebsd.org/changeset/base/214938
Log:
Eliminate a possible race between pmap_pinit() and pmap_kenter_pde() on
superpage promotion or demotion.
Micro-optimize pmap_kenter_pde().
Reviewed by: kib, jhb (an earlier version)
MFC after: 1 week
Modified:
head/sys/i386/i386/pmap.c
Modified: head/sys/i386/i386/pmap.c
==============================================================================
--- head/sys/i386/i386/pmap.c Sun Nov 7 18:25:42 2010 (r214937)
+++ head/sys/i386/i386/pmap.c Sun Nov 7 18:42:37 2010 (r214938)
@@ -1678,11 +1678,19 @@ pmap_unuse_pt(pmap_t pmap, vm_offset_t v
return (pmap_unwire_pte_hold(pmap, mpte, free));
}
+/*
+ * Initialize the pmap for the swapper process.
+ */
void
pmap_pinit0(pmap_t pmap)
{
PMAP_LOCK_INIT(pmap);
+ /*
+ * Since the page table directory is shared with the kernel pmap,
+ * which is already included in the list "allpmaps", this pmap does
+ * not need to be inserted into that list.
+ */
pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
#ifdef PAE
pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
@@ -1692,9 +1700,6 @@ pmap_pinit0(pmap_t pmap)
PCPU_SET(curpmap, pmap);
TAILQ_INIT(&pmap->pm_pvchunk);
bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
- mtx_lock_spin(&allpmaps_lock);
- LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
- mtx_unlock_spin(&allpmaps_lock);
}
/*
@@ -1759,9 +1764,9 @@ pmap_pinit(pmap_t pmap)
mtx_lock_spin(&allpmaps_lock);
LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
- mtx_unlock_spin(&allpmaps_lock);
- /* Wire in kernel global address entries. */
+ /* Copy the kernel page table directory entries. */
bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t));
+ mtx_unlock_spin(&allpmaps_lock);
/* install self-referential address mapping entry(s) */
for (i = 0; i < NPGPTD; i++) {
More information about the svn-src-head
mailing list