summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2014-02-10 19:48:26 +0000
committerglebius <glebius@FreeBSD.org>2014-02-10 19:48:26 +0000
commit1861286fed0f4227d460832116dd1e0251b6c0af (patch)
tree85e8c06d869f615163e55afbccc47700d00de799 /sys/vm
parent855454fa070fd1aeeb5313cc541a7facc64be340 (diff)
downloadFreeBSD-src-1861286fed0f4227d460832116dd1e0251b6c0af.zip
FreeBSD-src-1861286fed0f4227d460832116dd1e0251b6c0af.tar.gz
Make M_ZERO flag work correctly on UMA_ZONE_PCPU zones.
Sponsored by: Nginx, Inc.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma_core.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index d5b43c0..40e2786 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)
{
OpenPOWER on IntegriCloud