svn commit: r206115 - user/kmacy/head_page_lock/sys/amd64/amd64
Kip Macy
kmacy at FreeBSD.org
Fri Apr 2 21:35:10 UTC 2010
Author: kmacy
Date: Fri Apr 2 21:35:10 2010
New Revision: 206115
URL: http://svn.freebsd.org/changeset/base/206115
Log:
-remove pv list lock
- spare pv entries are protected by the pmap lock and the md_page
pv_list is protected by the page lock
Modified:
user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c
Modified: user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c Fri Apr 2 21:15:42 2010 (r206114)
+++ user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c Fri Apr 2 21:35:10 2010 (r206115)
@@ -184,7 +184,6 @@ struct vp_lock {
#define PA_LOCK_COUNT 256
-struct mtx pv_lock __aligned(CACHE_LINE_SIZE);
struct vp_lock pa_lock[PA_LOCK_COUNT] __aligned(CACHE_LINE_SIZE);
@@ -720,7 +719,6 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
for (i = 0; i < PA_LOCK_COUNT; i++)
mtx_init(&pa_lock[i].vp_lock, "page lock", NULL,
MTX_DEF | MTX_RECURSE | MTX_DUPOK);
- mtx_init(&pv_lock, "pv list lock", NULL, MTX_DEF);
}
@@ -2131,7 +2129,6 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
atomic_add_int(&pv_entry_count, -1);
PV_STAT(pv_entry_frees++);
PV_STAT(pv_entry_spare++);
- mtx_lock(&pv_lock);
pc = pv_to_chunk(pv);
idx = pv - &pc->pc_pventry[0];
field = idx / 64;
@@ -2142,7 +2139,6 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
pc->pc_map[2] != PC_FREE2) {
TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
- mtx_unlock(&pv_lock);
return;
}
PV_STAT(pv_entry_spare -= _NPCPV);
@@ -2151,7 +2147,6 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
/* entire chunk is free, return it */
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
dump_drop_page(m->phys_addr);
- mtx_unlock(&pv_lock);
KASSERT(m->wire_count == 1, ("wire_count == %d", m->wire_count));
m->wire_count--;
atomic_subtract_int(&cnt.v_wire_count, 1);
@@ -2178,7 +2173,6 @@ get_pv_entry(pmap_t pmap)
atomic_add_int(&pv_entry_count, 1);
PV_STAT(pv_entry_allocs++);
- mtx_lock(&pv_lock);
if (pv_entry_count > pv_entry_high_water)
if (ratecheck(&lastprint, &printinterval))
printf("Approaching the limit on PV entries, consider "
@@ -2202,7 +2196,6 @@ get_pv_entry(pmap_t pmap)
TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
}
- mtx_unlock(&pv_lock);
PV_STAT(pv_entry_spare--);
return (pv);
}
@@ -2212,7 +2205,6 @@ get_pv_entry(pmap_t pmap)
VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ |
VM_ALLOC_WIRED);
if (m == NULL) {
- mtx_unlock(&pv_lock);
PV_STAT(pc_chunk_tryfail++);
atomic_add_int(&pv_entry_count, -1);
return (NULL);
@@ -2230,7 +2222,6 @@ get_pv_entry(pmap_t pmap)
TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
PV_STAT(pv_entry_spare += _NPCPV - 1);
- mtx_unlock(&pv_lock);
return (pv);
}
@@ -4410,14 +4401,12 @@ restart:
}
}
if (allfree) {
- mtx_lock(&pv_lock);
PV_STAT(pv_entry_spare -= _NPCPV);
PV_STAT(pc_chunk_count--);
PV_STAT(pc_chunk_frees++);
TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
dump_drop_page(m->phys_addr);
- mtx_unlock(&pv_lock);
KASSERT(m->wire_count == 1,
("wire_count == %d", m->wire_count));
m->wire_count = 0;
More information about the svn-src-user
mailing list