summaryrefslogtreecommitdiff
path: root/usr/src/lib/libumem/common
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libumem/common')
-rw-r--r--usr/src/lib/libumem/common/envvar.c9
-rw-r--r--usr/src/lib/libumem/common/mapfile-vers4
-rw-r--r--usr/src/lib/libumem/common/umem.c20
-rw-r--r--usr/src/lib/libumem/common/umem_base.h4
-rw-r--r--usr/src/lib/libumem/common/vmem.c7
5 files changed, 32 insertions, 12 deletions
diff --git a/usr/src/lib/libumem/common/envvar.c b/usr/src/lib/libumem/common/envvar.c
index 6c57d9553e..25758aa2e7 100644
--- a/usr/src/lib/libumem/common/envvar.c
+++ b/usr/src/lib/libumem/common/envvar.c
@@ -25,7 +25,7 @@
*/
/*
- * Copyright (c) 2012 Joyent, Inc. All rights reserved.
+ * Copyright (c) 2019 Joyent, Inc.
* Copyright (c) 2015 by Delphix. All rights reserved.
*/
@@ -539,6 +539,13 @@ process_item(const umem_env_item_t *item, const char *item_arg)
case ITEM_SIZE:
arg_required = 1;
break;
+
+ default:
+ /*
+ * These are flags that aren't supported, so they'll error out
+ * below.
+ */
+ break;
}
switch (item->item_type) {
diff --git a/usr/src/lib/libumem/common/mapfile-vers b/usr/src/lib/libumem/common/mapfile-vers
index 888a1570f2..e95e666885 100644
--- a/usr/src/lib/libumem/common/mapfile-vers
+++ b/usr/src/lib/libumem/common/mapfile-vers
@@ -20,7 +20,7 @@
#
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
+# Copyright (c) 2019, Joyent, Inc.
#
#
@@ -41,7 +41,7 @@ $mapfile_version 2
$if _x86
LOAD_SEGMENT umem {
- FLAGS = READ WRITE EXECUTE;
+ FLAGS = READ EXECUTE;
ASSIGN_SECTION {
IS_NAME = .text;
FILE_BASENAME = asm_subr.o
diff --git a/usr/src/lib/libumem/common/umem.c b/usr/src/lib/libumem/common/umem.c
index dbc738a049..7f31529852 100644
--- a/usr/src/lib/libumem/common/umem.c
+++ b/usr/src/lib/libumem/common/umem.c
@@ -25,7 +25,7 @@
*/
/*
- * Copyright (c) 2014 Joyent, Inc. All rights reserved.
+ * Copyright (c) 2019 Joyent, Inc.
* Copyright (c) 2015 by Delphix. All rights reserved.
*/
@@ -1338,12 +1338,13 @@ static void *
umem_log_enter(umem_log_header_t *lhp, void *data, size_t size)
{
void *logspace;
- umem_cpu_log_header_t *clhp =
- &lhp->lh_cpu[CPU(umem_cpu_mask)->cpu_number];
+ umem_cpu_log_header_t *clhp;
if (lhp == NULL || umem_logging == 0)
return (NULL);
+ clhp = &lhp->lh_cpu[CPU(umem_cpu_mask)->cpu_number];
+
(void) mutex_lock(&clhp->clh_lock);
clhp->clh_hits++;
if (size > clhp->clh_avail) {
@@ -2843,8 +2844,9 @@ umem_cache_create(
}
ASSERT(!(cp->cache_flags & UMF_AUDIT));
} else {
- size_t chunks, bestfit, waste, slabsize;
+ size_t chunks, waste, slabsize;
size_t minwaste = LONG_MAX;
+ size_t bestfit = SIZE_MAX;
for (chunks = 1; chunks <= UMEM_VOID_FRACTION; chunks++) {
slabsize = P2ROUNDUP(chunksize * chunks,
@@ -2865,6 +2867,10 @@ umem_cache_create(
}
if (cflags & UMC_QCACHE)
bestfit = MAX(1 << highbit(3 * vmp->vm_qcache_max), 64);
+ if (bestfit == SIZE_MAX) {
+ errno = ENOMEM;
+ goto fail;
+ }
cp->cache_slabsize = bestfit;
cp->cache_mincolor = 0;
cp->cache_maxcolor = bestfit % chunksize;
@@ -3215,12 +3221,16 @@ umem_cache_init(void)
umem_tmem_off = _tmem_get_base();
_tmem_set_cleanup(umem_cache_tmem_cleanup);
+#ifndef UMEM_STANDALONE
if (umem_genasm_supported && !(umem_flags & UMF_DEBUG) &&
!(umem_flags & UMF_NOMAGAZINE) &&
umem_ptc_size > 0) {
umem_ptc_enabled = umem_genasm(umem_alloc_sizes,
- umem_alloc_caches, i) == 0 ? 1 : 0;
+ umem_alloc_caches, i) ? 1 : 0;
}
+#else
+ umem_ptc_enabled = 0;
+#endif
/*
* Initialization cannot fail at this point. Make the caches
diff --git a/usr/src/lib/libumem/common/umem_base.h b/usr/src/lib/libumem/common/umem_base.h
index c845331fbc..d8f6f4fd4a 100644
--- a/usr/src/lib/libumem/common/umem_base.h
+++ b/usr/src/lib/libumem/common/umem_base.h
@@ -23,7 +23,7 @@
* Use is subject to license terms.
*/
/*
- * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright (c) 2019, Joyent, Inc.
*/
#ifndef _UMEM_BASE_H
@@ -147,7 +147,7 @@ void umem_process_envvars(void);
* umem_genasm.c: private interfaces
*/
extern const int umem_genasm_supported;
-extern int umem_genasm(int *, umem_cache_t **, int);
+extern boolean_t umem_genasm(int *, umem_cache_t **, int);
/*
* malloc.c: traditional malloc/free interface for genasm
diff --git a/usr/src/lib/libumem/common/vmem.c b/usr/src/lib/libumem/common/vmem.c
index f66cccc698..a04a538e69 100644
--- a/usr/src/lib/libumem/common/vmem.c
+++ b/usr/src/lib/libumem/common/vmem.c
@@ -22,7 +22,7 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
- * Copyright 2012 Joyent, Inc. All rights reserved.
+ * Copyright 2019, Joyent, Inc.
* Copyright (c) 2017 by Delphix. All rights reserved.
*/
@@ -819,7 +819,7 @@ vmem_xalloc(vmem_t *vmp, size_t size, size_t align, size_t phase,
{
vmem_seg_t *vsp;
vmem_seg_t *vbest = NULL;
- uintptr_t addr, taddr, start, end;
+ uintptr_t addr = 0, taddr, start, end;
void *vaddr;
int hb, flist, resv;
uint32_t mtbf;
@@ -981,6 +981,9 @@ vmem_xalloc(vmem_t *vmp, size_t size, size_t align, size_t phase,
(void) pthread_setcancelstate(cancel_state, NULL);
}
if (vbest != NULL) {
+ if (addr == 0) {
+ umem_panic("vmem_xalloc(): addr == 0");
+ }
ASSERT(vbest->vs_type == VMEM_FREE);
ASSERT(vbest->vs_knext != vbest);
(void) vmem_seg_alloc(vmp, vbest, addr, size);