diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2014-02-10 19:48:26 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2014-02-10 19:48:26 +0000 |
commit | 48343a2f34e3c93f72471154bec4681c08066816 (patch) | |
tree | 85e8c06d869f615163e55afbccc47700d00de799 /sys | |
parent | 9188e408cc9fd503e23dd1c7ed5d797c8bc57abd (diff) | |
download | src-48343a2f34e3c93f72471154bec4681c08066816.tar.gz src-48343a2f34e3c93f72471154bec4681c08066816.zip |
Make M_ZERO flag work correctly on UMA_ZONE_PCPU zones.
Sponsored by: Nginx, Inc.
Notes
Notes:
svn path=/head/; revision=261723
Diffstat (limited to 'sys')
-rw-r--r-- | sys/vm/uma_core.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index d5b43c08fb9d..40e2786f3952 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -267,6 +267,7 @@ static uma_keg_t uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini, int align, uint32_t flags); static int zone_import(uma_zone_t zone, void **bucket, int max, int flags); static void zone_release(uma_zone_t zone, void **bucket, int cnt); +static void uma_zero_item(void *item, uma_zone_t zone); void uma_print_zone(uma_zone_t); void uma_print_stats(void); @@ -2170,7 +2171,7 @@ zalloc_start: uma_dbg_alloc(zone, NULL, item); #endif if (flags & M_ZERO) - bzero(item, zone->uz_size); + uma_zero_item(item, zone); return (item); } @@ -2620,7 +2621,7 @@ zone_alloc_item(uma_zone_t zone, void *udata, int flags) uma_dbg_alloc(zone, NULL, item); #endif if (flags & M_ZERO) - bzero(item, zone->uz_size); + uma_zero_item(item, zone); return (item); @@ -3237,6 +3238,17 @@ uma_large_free(uma_slab_t slab) zone_free_item(slabzone, slab, NULL, SKIP_NONE); } +static void +uma_zero_item(void *item, uma_zone_t zone) +{ + + if (zone->uz_flags & UMA_ZONE_PCPU) { + for (int i = 0; i < mp_ncpus; i++) + bzero(zpcpu_get_cpu(item, i), zone->uz_size); + } else + bzero(item, zone->uz_size); +} + void uma_print_stats(void) { |