Mercurial > illumos > illumos-gate
changeset 13717:33bb96bf701a
Reviewed by: Theo Schlossnagle <jesus@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Eric Schrock <eric.schrock@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Garrett D'Amore <garrett@damore.org>
author | Bryan Cantrill <bryan@joyent.com> |
---|---|
date | Sat, 09 Jun 2012 17:31:14 -0700 |
parents | 3db0c1979163 |
children | eff5ad995241 |
files | usr/src/cmd/svc/configd/configd.c usr/src/cmd/svc/startd/restarter.c usr/src/cmd/svc/startd/startd.c usr/src/lib/librestart/common/librestart.c |
diffstat | 4 files changed, 71 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/svc/configd/configd.c Mon May 16 00:27:26 2011 +0100 +++ b/usr/src/cmd/svc/configd/configd.c Sat Jun 09 17:31:14 2012 -0700 @@ -23,7 +23,9 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + */ #include <assert.h> #include <door.h> @@ -109,6 +111,18 @@ #define CONFIGD_MAX_FDS 262144 +const char * +_umem_options_init(void) +{ + /* + * Like svc.startd, we set our UMEM_OPTIONS to indicate that we do not + * wish to have per-CPU magazines to reduce our memory footprint. And + * as with svc.startd, if svc.configd is so MT-hot that this becomes a + * scalability problem, there are deeper issues... + */ + return ("nomagazines"); /* UMEM_OPTIONS setting */ +} + /* * Thanks, Mike */
--- a/usr/src/cmd/svc/startd/restarter.c Mon May 16 00:27:26 2011 +0100 +++ b/usr/src/cmd/svc/startd/restarter.c Sat Jun 09 17:31:14 2012 -0700 @@ -373,9 +373,11 @@ if (inst->ri_logstem != NULL) startd_free(inst->ri_logstem, PATH_MAX); if (inst->ri_common_name != NULL) - startd_free(inst->ri_common_name, max_scf_value_size); + startd_free(inst->ri_common_name, + strlen(inst->ri_common_name) + 1); if (inst->ri_C_common_name != NULL) - startd_free(inst->ri_C_common_name, max_scf_value_size); + startd_free(inst->ri_C_common_name, + strlen(inst->ri_C_common_name) + 1); snap = NULL; inst->ri_logstem = NULL; inst->ri_common_name = NULL; @@ -529,8 +531,25 @@ abort(); } - switch (libscf_get_template_values(scf_inst, snap, - &inst->ri_common_name, &inst->ri_C_common_name)) { + r = libscf_get_template_values(scf_inst, snap, + &inst->ri_common_name, &inst->ri_C_common_name); + + /* + * Copy our names to smaller buffers to reduce our memory footprint. + */ + if (inst->ri_common_name != NULL) { + char *tmp = safe_strdup(inst->ri_common_name); + startd_free(inst->ri_common_name, max_scf_value_size); + inst->ri_common_name = tmp; + } + + if (inst->ri_C_common_name != NULL) { + char *tmp = safe_strdup(inst->ri_C_common_name); + startd_free(inst->ri_C_common_name, max_scf_value_size); + inst->ri_C_common_name = tmp; + } + + switch (r) { case 0: break; @@ -678,9 +697,11 @@ if (inst->ri_logstem != NULL) startd_free(inst->ri_logstem, PATH_MAX); if (inst->ri_common_name != NULL) - startd_free(inst->ri_common_name, max_scf_value_size); + startd_free(inst->ri_common_name, + strlen(inst->ri_common_name) + 1); if (inst->ri_C_common_name != NULL) - startd_free(inst->ri_C_common_name, max_scf_value_size); + startd_free(inst->ri_C_common_name, + strlen(inst->ri_C_common_name) + 1); startd_free(inst->ri_utmpx_prefix, max_scf_value_size); startd_free(inst, sizeof (restarter_inst_t)); return (ENOENT); @@ -740,9 +761,11 @@ startd_free((void *)ri->ri_i.i_fmri, strlen(ri->ri_i.i_fmri) + 1); startd_free(ri->ri_logstem, PATH_MAX); if (ri->ri_common_name != NULL) - startd_free(ri->ri_common_name, max_scf_value_size); + startd_free(ri->ri_common_name, + strlen(ri->ri_common_name) + 1); if (ri->ri_C_common_name != NULL) - startd_free(ri->ri_C_common_name, max_scf_value_size); + startd_free(ri->ri_C_common_name, + strlen(ri->ri_C_common_name) + 1); startd_free(ri->ri_utmpx_prefix, max_scf_value_size); (void) pthread_mutex_destroy(&ri->ri_lock); (void) pthread_mutex_destroy(&ri->ri_queue_lock); @@ -1841,6 +1864,7 @@ rip->ri_queue_thread = 0; MUTEX_UNLOCK(&rip->ri_queue_lock); + out: (void) scf_handle_unbind(h); scf_handle_destroy(h);
--- a/usr/src/cmd/svc/startd/startd.c Mon May 16 00:27:26 2011 +0100 +++ b/usr/src/cmd/svc/startd/startd.c Sat Jun 09 17:31:14 2012 -0700 @@ -21,6 +21,7 @@ /* * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ /* @@ -143,6 +144,7 @@ pthread_mutexattr_t mutex_attrs; +#ifdef DEBUG const char * _umem_debug_init(void) { @@ -154,6 +156,19 @@ { return ("fail,contents"); /* UMEM_LOGGING setting */ } +#endif + +const char * +_umem_options_init(void) +{ + /* + * To reduce our memory footprint, we set our UMEM_OPTIONS to indicate + * that we do not wish to have per-CPU magazines -- if svc.startd is so + * hot on CPU such that this becomes a scalability problem, there are + * likely deeper things amiss... + */ + return ("nomagazines"); /* UMEM_OPTIONS setting */ +} /* * startd_alloc_retry()
--- a/usr/src/lib/librestart/common/librestart.c Mon May 16 00:27:26 2011 +0100 +++ b/usr/src/lib/librestart/common/librestart.c Sat Jun 09 17:31:14 2012 -0700 @@ -21,6 +21,7 @@ /* * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ #include <libintl.h> @@ -3333,6 +3334,10 @@ * defaults that provide historic init behavior. */ if (mc_used == 0) { + free(cip->pwbuf); + free(cip->vbuf); + free(cip->working_dir); + (void) memset(cip, 0, sizeof (*cip)); cip->uid = 0; cip->gid = 0; @@ -3348,8 +3353,11 @@ scf_pg_destroy(instpg); scf_pg_destroy(methpg); - if (cip->pwbuf != NULL) + if (cip->pwbuf != NULL) { free(cip->pwbuf); + cip->pwbuf = NULL; + } + free(cip->vbuf); if (err->type != 0) {