diff options
Diffstat (limited to 'sys/vm/uma_core.c')
-rw-r--r-- | sys/vm/uma_core.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 8418fed..2bb8f15 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -959,6 +959,7 @@ zone_ctor(void *mem, int size, void *udata) { struct uma_zctor_args *arg = udata; uma_zone_t zone = mem; + int privlc; int cplen; int cpu; @@ -992,6 +993,11 @@ zone_ctor(void *mem, int size, void *udata) else zone_small_init(zone); + if (arg->flags & UMA_ZONE_MTXCLASS) + privlc = 1; + else + privlc = 0; + /* We do this so that the per cpu lock name is unique for each zone */ memcpy(zone->uz_lname, "PCPU ", 5); cplen = min(strlen(zone->uz_name) + 1, LOCKNAME_LEN - 6); @@ -1053,7 +1059,7 @@ zone_ctor(void *mem, int size, void *udata) zone->uz_size, zone->uz_ipers, zone->uz_ppera, zone->uz_pgoff); #endif - ZONE_LOCK_INIT(zone); + ZONE_LOCK_INIT(zone, privlc); mtx_lock(&uma_mtx); LIST_INSERT_HEAD(&uma_zones, zone, uz_link); @@ -1073,7 +1079,7 @@ zone_ctor(void *mem, int size, void *udata) zone->uz_count = UMA_BUCKET_SIZE - 1; for (cpu = 0; cpu < maxcpu; cpu++) - CPU_LOCK_INIT(zone, cpu); + CPU_LOCK_INIT(zone, cpu, privlc); } /* @@ -1799,10 +1805,12 @@ uma_zone_set_max(uma_zone_t zone, int nitems) ZONE_LOCK(zone); if (zone->uz_ppera > 1) zone->uz_maxpages = nitems * zone->uz_ppera; - else + else zone->uz_maxpages = nitems / zone->uz_ipers; + if (zone->uz_maxpages * zone->uz_ipers < nitems) zone->uz_maxpages++; + ZONE_UNLOCK(zone); } |