summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2014-03-04 14:46:30 +0000
committerglebius <glebius@FreeBSD.org>2014-03-04 14:46:30 +0000
commit8a9528c4d0ec97d5f0c55b27a51613851b619e04 (patch)
tree256bb459a422081d6ab540f11d785e1f0efa5449 /sys/vm
parentd06eb27738c9003bba69ae1f38b8b5addeb568dd (diff)
downloadFreeBSD-src-8a9528c4d0ec97d5f0c55b27a51613851b619e04.zip
FreeBSD-src-8a9528c4d0ec97d5f0c55b27a51613851b619e04.tar.gz
Merge r261722, r261723, r261724, r261725 from head:
several minor improvements for UMA_ZPCPU_ZONE zones.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma.h12
-rw-r--r--sys/vm/uma_core.c16
2 files changed, 23 insertions, 5 deletions
diff --git a/sys/vm/uma.h b/sys/vm/uma.h
index b4fb4e8..5012d98 100644
--- a/sys/vm/uma.h
+++ b/sys/vm/uma.h
@@ -33,8 +33,8 @@
*
*/
-#ifndef VM_UMA_H
-#define VM_UMA_H
+#ifndef _VM_UMA_H_
+#define _VM_UMA_H_
#include <sys/param.h> /* For NULL */
#include <sys/malloc.h> /* For M_* */
@@ -636,6 +636,12 @@ int uma_zone_exhausted(uma_zone_t zone);
int uma_zone_exhausted_nolock(uma_zone_t zone);
/*
+ * Common UMA_ZONE_PCPU zones.
+ */
+extern uma_zone_t pcpu_zone_64;
+extern uma_zone_t pcpu_zone_ptr;
+
+/*
* Exported statistics structures to be used by user space monitoring tools.
* Statistics stream consists of a uma_stream_header, followed by a series of
* alternative uma_type_header and uma_type_stat structures.
@@ -683,4 +689,4 @@ struct uma_percpu_stat {
uint64_t _ups_reserved[5]; /* Reserved. */
};
-#endif
+#endif /* _VM_UMA_H_ */
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 5bfbb72..3350356 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -264,6 +264,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);
@@ -2167,7 +2168,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);
}
@@ -2617,7 +2618,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);
@@ -3234,6 +3235,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