diff options
Diffstat (limited to 'usr/src/lib/libumem/common')
-rw-r--r-- | usr/src/lib/libumem/common/envvar.c | 9 | ||||
-rw-r--r-- | usr/src/lib/libumem/common/mapfile-vers | 4 | ||||
-rw-r--r-- | usr/src/lib/libumem/common/umem.c | 20 | ||||
-rw-r--r-- | usr/src/lib/libumem/common/umem_base.h | 4 | ||||
-rw-r--r-- | usr/src/lib/libumem/common/vmem.c | 7 |
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); |