diff options
author | alc <alc@FreeBSD.org> | 2003-02-08 05:41:41 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-02-08 05:41:41 +0000 |
commit | 387116adf4152b26904f62e82831b5a333d2b8fb (patch) | |
tree | 4cc62ac6268495ba3737bf3a2b2d66220ba37b29 | |
parent | f6f64762ea1ec1f1e406e129adfacabf344dfef0 (diff) | |
download | FreeBSD-src-387116adf4152b26904f62e82831b5a333d2b8fb.zip FreeBSD-src-387116adf4152b26904f62e82831b5a333d2b8fb.tar.gz |
MF alpha
- Synchronize access to the allpmaps list with a mutex.
-rw-r--r-- | sys/amd64/amd64/pmap.c | 12 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 12 |
2 files changed, 24 insertions, 0 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 801a9a8..8e73434 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -152,6 +152,7 @@ static int protection_codes[8]; struct pmap kernel_pmap_store; LIST_HEAD(pmaplist, pmap); static struct pmaplist allpmaps; +static struct mtx allpmaps_lock; vm_offset_t avail_start; /* PA of first available physical page */ vm_offset_t avail_end; /* PA of last available physical page */ @@ -313,7 +314,10 @@ pmap_bootstrap(firstaddr, loadaddr) kernel_pmap->pm_active = -1; /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvlist); LIST_INIT(&allpmaps); + mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN); + mtx_lock_spin(&allpmaps_lock); LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); nkpt = NKPT; /* @@ -1240,7 +1244,9 @@ pmap_pinit0(pmap) pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvlist); 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); } /* @@ -1281,7 +1287,9 @@ pmap_pinit(pmap) if ((ptdpg->flags & PG_ZERO) == 0) bzero(pmap->pm_pdir, PAGE_SIZE); + mtx_lock_spin(&allpmaps_lock); LIST_INSERT_HEAD(&allpmaps, pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); /* Wire in kernel global address entries. */ /* XXX copies current process, does not fill in MPPTDI */ bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * PTESIZE); @@ -1499,7 +1507,9 @@ pmap_release(pmap_t pmap) #endif ptdpg = NULL; + mtx_lock_spin(&allpmaps_lock); LIST_REMOVE(pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); retry: curgeneration = object->generation; for (p = TAILQ_FIRST(&object->memq); p != NULL; p = n) { @@ -1582,9 +1592,11 @@ pmap_growkernel(vm_offset_t addr) newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M); pdir_pde(PTD, kernel_vm_end) = newpdir; + mtx_lock_spin(&allpmaps_lock); LIST_FOREACH(pmap, &allpmaps, pm_list) { *pmap_pde(pmap, kernel_vm_end) = newpdir; } + mtx_unlock_spin(&allpmaps_lock); kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); } splx(s); diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 801a9a8..8e73434 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -152,6 +152,7 @@ static int protection_codes[8]; struct pmap kernel_pmap_store; LIST_HEAD(pmaplist, pmap); static struct pmaplist allpmaps; +static struct mtx allpmaps_lock; vm_offset_t avail_start; /* PA of first available physical page */ vm_offset_t avail_end; /* PA of last available physical page */ @@ -313,7 +314,10 @@ pmap_bootstrap(firstaddr, loadaddr) kernel_pmap->pm_active = -1; /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvlist); LIST_INIT(&allpmaps); + mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN); + mtx_lock_spin(&allpmaps_lock); LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); nkpt = NKPT; /* @@ -1240,7 +1244,9 @@ pmap_pinit0(pmap) pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvlist); 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); } /* @@ -1281,7 +1287,9 @@ pmap_pinit(pmap) if ((ptdpg->flags & PG_ZERO) == 0) bzero(pmap->pm_pdir, PAGE_SIZE); + mtx_lock_spin(&allpmaps_lock); LIST_INSERT_HEAD(&allpmaps, pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); /* Wire in kernel global address entries. */ /* XXX copies current process, does not fill in MPPTDI */ bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * PTESIZE); @@ -1499,7 +1507,9 @@ pmap_release(pmap_t pmap) #endif ptdpg = NULL; + mtx_lock_spin(&allpmaps_lock); LIST_REMOVE(pmap, pm_list); + mtx_unlock_spin(&allpmaps_lock); retry: curgeneration = object->generation; for (p = TAILQ_FIRST(&object->memq); p != NULL; p = n) { @@ -1582,9 +1592,11 @@ pmap_growkernel(vm_offset_t addr) newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M); pdir_pde(PTD, kernel_vm_end) = newpdir; + mtx_lock_spin(&allpmaps_lock); LIST_FOREACH(pmap, &allpmaps, pm_list) { *pmap_pde(pmap, kernel_vm_end) = newpdir; } + mtx_unlock_spin(&allpmaps_lock); kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); } splx(s); |