summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-08-22 18:12:24 +0000
committerkib <kib@FreeBSD.org>2013-08-22 18:12:24 +0000
commit05a9dff802e2ec3a2f8ab5836657ced5977fca68 (patch)
treeee8d62f2966140cf842124e46724b5ecf3d56ac8
parent076969f54a69e4b15a5489465a537f9eb246b869 (diff)
downloadFreeBSD-src-05a9dff802e2ec3a2f8ab5836657ced5977fca68.zip
FreeBSD-src-05a9dff802e2ec3a2f8ab5836657ced5977fca68.tar.gz
Revert r254501. Instead, reuse the type stability of the struct pmap
which is the part of struct vmspace, allocated from UMA_ZONE_NOFREE zone. Initialize the pmap lock in the vmspace zone init function, and remove pmap lock initialization and destruction from pmap_pinit() and pmap_release(). Suggested and reviewed by: alc (previous version) Tested by: pho Sponsored by: The FreeBSD Foundation
-rw-r--r--sys/amd64/amd64/pmap.c6
-rw-r--r--sys/arm/arm/pmap-v6.c2
-rw-r--r--sys/arm/arm/pmap.c2
-rw-r--r--sys/i386/i386/pmap.c3
-rw-r--r--sys/i386/xen/pmap.c3
-rw-r--r--sys/ia64/ia64/pmap.c4
-rw-r--r--sys/mips/mips/pmap.c3
-rw-r--r--sys/powerpc/aim/mmu_oea.c3
-rw-r--r--sys/powerpc/aim/mmu_oea64.c7
-rw-r--r--sys/powerpc/booke/pmap.c4
-rw-r--r--sys/sparc64/sparc64/pmap.c3
-rw-r--r--sys/vm/vm_map.c1
12 files changed, 8 insertions, 33 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 0c87c35..7fb1277 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -1687,8 +1687,6 @@ pmap_pinit(pmap_t pmap)
vm_page_t pml4pg;
int i;
- PMAP_LOCK_INIT(pmap);
-
/*
* allocate the page directory page
*/
@@ -1959,9 +1957,6 @@ pmap_release(pmap_t pmap)
KASSERT(vm_radix_is_empty(&pmap->pm_root),
("pmap_release: pmap has reserved page table page(s)"));
- rw_wlock(&pvh_global_lock);
- rw_wunlock(&pvh_global_lock);
-
m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME);
for (i = 0; i < NKPML4E; i++) /* KVA */
@@ -1973,7 +1968,6 @@ pmap_release(pmap_t pmap)
m->wire_count--;
atomic_subtract_int(&cnt.v_wire_count, 1);
vm_page_free_zero(m);
- PMAP_LOCK_DESTROY(pmap);
}
static int
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index cc7c2db..ae0be06 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -1814,7 +1814,6 @@ pmap_release(pmap_t pmap)
}
pmap_free_l1(pmap);
- PMAP_LOCK_DESTROY(pmap);
dprintf("pmap_release()\n");
}
@@ -3225,7 +3224,6 @@ pmap_pinit(pmap_t pmap)
{
PDEBUG(1, printf("pmap_pinit: pmap = %08x\n", (uint32_t) pmap));
- PMAP_LOCK_INIT(pmap);
pmap_alloc_l1(pmap);
bzero(pmap->pm_l2, sizeof(pmap->pm_l2));
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index 97d9842..f232b07 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -2479,7 +2479,6 @@ pmap_release(pmap_t pmap)
}
pmap_free_l1(pmap);
- PMAP_LOCK_DESTROY(pmap);
dprintf("pmap_release()\n");
}
@@ -3819,7 +3818,6 @@ pmap_pinit(pmap_t pmap)
{
PDEBUG(1, printf("pmap_pinit: pmap = %08x\n", (uint32_t) pmap));
- PMAP_LOCK_INIT(pmap);
pmap_alloc_l1(pmap);
bzero(pmap->pm_l2, sizeof(pmap->pm_l2));
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 6a987b6..8fa9026 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -1738,8 +1738,6 @@ pmap_pinit(pmap_t pmap)
vm_paddr_t pa;
int i;
- PMAP_LOCK_INIT(pmap);
-
/*
* No need to allocate page table space yet but we do need a valid
* page directory table.
@@ -2051,7 +2049,6 @@ pmap_release(pmap_t pmap)
atomic_subtract_int(&cnt.v_wire_count, 1);
vm_page_free_zero(m);
}
- PMAP_LOCK_DESTROY(pmap);
}
static int
diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c
index ba56915..c34fe29 100644
--- a/sys/i386/xen/pmap.c
+++ b/sys/i386/xen/pmap.c
@@ -1452,8 +1452,6 @@ pmap_pinit(pmap_t pmap)
mtx_lock(&createdelete_lock);
#endif
- PMAP_LOCK_INIT(pmap);
-
/*
* No need to allocate page table space yet but we do need a valid
* page directory table.
@@ -1821,7 +1819,6 @@ pmap_release(pmap_t pmap)
#ifdef PAE
pmap_qremove((vm_offset_t)pmap->pm_pdpt, 1);
#endif
- PMAP_LOCK_DESTROY(pmap);
#ifdef HAMFISTED_LOCKING
mtx_unlock(&createdelete_lock);
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index 03710a3..b23c77c 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -622,6 +622,8 @@ pmap_free_rid(uint32_t rid)
void
pmap_pinit0(struct pmap *pmap)
{
+
+ PMAP_LOCK_INIT(pmap);
/* kernel_pmap is the same as any other pmap. */
pmap_pinit(pmap);
}
@@ -635,7 +637,6 @@ pmap_pinit(struct pmap *pmap)
{
int i;
- PMAP_LOCK_INIT(pmap);
for (i = 0; i < IA64_VM_MINKERN_REGION; i++)
pmap->pm_rid[i] = pmap_allocate_rid();
TAILQ_INIT(&pmap->pm_pvchunk);
@@ -660,7 +661,6 @@ pmap_release(pmap_t pmap)
for (i = 0; i < IA64_VM_MINKERN_REGION; i++)
if (pmap->pm_rid[i])
pmap_free_rid(pmap->pm_rid[i]);
- PMAP_LOCK_DESTROY(pmap);
}
/*
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index 07d40f4..fb22a89 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -1070,8 +1070,6 @@ pmap_pinit(pmap_t pmap)
vm_page_t ptdpg;
int i;
- PMAP_LOCK_INIT(pmap);
-
/*
* allocate the page directory page
*/
@@ -1231,7 +1229,6 @@ pmap_release(pmap_t pmap)
ptdpg->wire_count--;
atomic_subtract_int(&cnt.v_wire_count, 1);
vm_page_free_zero(ptdpg);
- PMAP_LOCK_DESTROY(pmap);
}
/*
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index 38b25d0..f4e9d9b 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1655,7 +1655,6 @@ moea_pinit(mmu_t mmu, pmap_t pmap)
u_int entropy;
KASSERT((int)pmap < VM_MIN_KERNEL_ADDRESS, ("moea_pinit: virt pmap"));
- PMAP_LOCK_INIT(pmap);
RB_INIT(&pmap->pmap_pvo);
entropy = 0;
@@ -1719,6 +1718,7 @@ void
moea_pinit0(mmu_t mmu, pmap_t pm)
{
+ PMAP_LOCK_INIT(pm);
moea_pinit(mmu, pm);
bzero(&pm->pm_stats, sizeof(pm->pm_stats));
}
@@ -1824,7 +1824,6 @@ moea_release(mmu_t mmu, pmap_t pmap)
idx /= VSID_NBPW;
moea_vsid_bitmap[idx] &= ~mask;
mtx_unlock(&moea_vsid_mutex);
- PMAP_LOCK_DESTROY(pmap);
}
/*
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 2e3b98e..ba1da12 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -1879,7 +1879,7 @@ moea64_get_unique_vsid(void) {
void
moea64_pinit(mmu_t mmu, pmap_t pmap)
{
- PMAP_LOCK_INIT(pmap);
+
RB_INIT(&pmap->pmap_pvo);
pmap->pm_slb_tree_root = slb_alloc_tree();
@@ -1893,7 +1893,6 @@ moea64_pinit(mmu_t mmu, pmap_t pmap)
int i;
uint32_t hash;
- PMAP_LOCK_INIT(pmap);
RB_INIT(&pmap->pmap_pvo);
if (pmap_bootstrapped)
@@ -1920,6 +1919,8 @@ moea64_pinit(mmu_t mmu, pmap_t pmap)
void
moea64_pinit0(mmu_t mmu, pmap_t pm)
{
+
+ PMAP_LOCK_INIT(pm);
moea64_pinit(mmu, pm);
bzero(&pm->pm_stats, sizeof(pm->pm_stats));
}
@@ -2074,8 +2075,6 @@ moea64_release(mmu_t mmu, pmap_t pmap)
moea64_release_vsid(VSID_TO_HASH(pmap->pm_sr[0]));
#endif
-
- PMAP_LOCK_DESTROY(pmap);
}
/*
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index b2b958f..d5c64ed 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -1477,6 +1477,7 @@ static void
mmu_booke_pinit0(mmu_t mmu, pmap_t pmap)
{
+ PMAP_LOCK_INIT(pmap);
mmu_booke_pinit(mmu, pmap);
PCPU_SET(curpmap, pmap);
}
@@ -1495,7 +1496,6 @@ mmu_booke_pinit(mmu_t mmu, pmap_t pmap)
KASSERT((pmap != kernel_pmap), ("pmap_pinit: initializing kernel_pmap"));
- PMAP_LOCK_INIT(pmap);
for (i = 0; i < MAXCPU; i++)
pmap->pm_tid[i] = TID_NONE;
CPU_ZERO(&kernel_pmap->pm_active);
@@ -1516,8 +1516,6 @@ mmu_booke_release(mmu_t mmu, pmap_t pmap)
KASSERT(pmap->pm_stats.resident_count == 0,
("pmap_release: pmap resident count %ld != 0",
pmap->pm_stats.resident_count));
-
- PMAP_LOCK_DESTROY(pmap);
}
/*
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index eacc318..47f2c49 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -1204,8 +1204,6 @@ pmap_pinit(pmap_t pm)
vm_page_t m;
int i;
- PMAP_LOCK_INIT(pm);
-
/*
* Allocate KVA space for the TSB.
*/
@@ -1299,7 +1297,6 @@ pmap_release(pmap_t pm)
vm_page_free_zero(m);
}
VM_OBJECT_WUNLOCK(obj);
- PMAP_LOCK_DESTROY(pm);
}
/*
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 1a6146e..71c44ad 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -226,6 +226,7 @@ vmspace_zinit(void *mem, int size, int flags)
vm->vm_map.pmap = NULL;
(void)vm_map_zinit(&vm->vm_map, sizeof(vm->vm_map), flags);
+ PMAP_LOCK_INIT(vmspace_pmap(vm));
return (0);
}
OpenPOWER on IntegriCloud