Commit c25402c5 authored by Lance Hartmann's avatar Lance Hartmann Committed by Jim Harris
Browse files

lib: Return instead of exit in trace



Modifies behavior of spdk_trace_init() such that it returns
on failure instead of terminating with exit().

Change-Id: I0ba321cddd233008a4b19bc592728230d89a11b2
Signed-off-by: default avatarLance Hartmann <lance.hartmann@oracle.com>
Reviewed-on: https://review.gerrithub.io/403357


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent f1bf28de
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -190,8 +190,9 @@ void spdk_trace_set_tpoint_group_mask(uint64_t tpoint_group_mask);
 * human-readable format.
 *
 * \param shm_name Name of shared memory.
 * \return 0 on success, else non-zero indicates a failure.
 */
void spdk_trace_init(const char *shm_name);
int spdk_trace_init(const char *shm_name);

/**
 * Unmap global trace memory structs.
+30 −18
Original line number Diff line number Diff line
@@ -277,7 +277,7 @@ int
spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,
	       void *arg1, void *arg2)
{
	struct spdk_conf		*config;
	struct spdk_conf		*config = NULL;
	struct spdk_conf_section	*sp;
	char			shm_name[64];
	int			rc;
@@ -318,13 +318,11 @@ spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,
		rc = spdk_conf_read(config, opts->config_file);
		if (rc != 0) {
			SPDK_ERRLOG("Could not read config file %s\n", opts->config_file);
			spdk_conf_free(config);
			return 1;
			goto app_start_conf_free_err;
		}
		if (spdk_conf_first_section(config) == NULL) {
			SPDK_ERRLOG("Invalid config file %s\n", opts->config_file);
			spdk_conf_free(config);
			return 1;
			goto app_start_conf_free_err;
		}
	}
	spdk_conf_set_as_default(config);
@@ -369,9 +367,7 @@ spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,

	if (spdk_env_init(&env_opts) < 0) {
		SPDK_ERRLOG("Unable to initialize SPDK env\n");
		spdk_log_close();
		spdk_conf_free(g_spdk_app.config);
		return 1;
		goto app_start_log_close_err;
	}

	SPDK_NOTICELOG("Total cores available: %d\n", spdk_env_get_core_count());
@@ -383,24 +379,25 @@ spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,
	 */
	if ((rc = spdk_reactors_init(opts->max_delay_us)) != 0) {
		SPDK_ERRLOG("Invalid reactor mask.\n");
		spdk_log_close();
		spdk_conf_free(g_spdk_app.config);
		return 1;
	}

	if ((rc = spdk_app_setup_signal_handlers(opts)) != 0) {
		spdk_conf_free(g_spdk_app.config);
		spdk_log_close();
		return 1;
		goto app_start_log_close_err;
	}

	/*
	 * Note the call to spdk_trace_init() is located here
	 * ahead of spdk_app_setup_signal_handlers().
	 * That's because there is not an easy/direct clean
	 * way of unwinding alloc'd resources that can occur
	 * in spdk_app_setup_signal_handlers().
	 */
	if (opts->shm_id >= 0) {
		snprintf(shm_name, sizeof(shm_name), "/%s_trace.%d", opts->name, opts->shm_id);
	} else {
		snprintf(shm_name, sizeof(shm_name), "/%s_trace.pid%d", opts->name, (int)getpid());
	}

	spdk_trace_init(shm_name);
	if (spdk_trace_init(shm_name) != 0) {
		goto app_start_log_close_err;
	}

	if (opts->tpoint_group_mask == NULL) {
		sp = spdk_conf_find_section(g_spdk_app.config, "Global");
@@ -424,6 +421,10 @@ spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,
		}
	}

	if ((rc = spdk_app_setup_signal_handlers(opts)) != 0) {
		goto app_start_trace_cleanup_err;
	}

	g_spdk_app.rc = 0;
	g_init_lcore = spdk_env_get_current_core();
	g_app_start_fn = start_fn;
@@ -437,6 +438,17 @@ spdk_app_start(struct spdk_app_opts *opts, spdk_event_fn start_fn,
	spdk_reactors_start();

	return g_spdk_app.rc;

app_start_trace_cleanup_err:
	spdk_trace_cleanup();

app_start_log_close_err:
	spdk_log_close();

app_start_conf_free_err:
	spdk_conf_free(config);

	return 1;
}

void
+20 −9
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include "spdk/string.h"
#include "spdk/trace.h"

static int g_trace_fd = -1;
static char g_shm_name[64];

static struct spdk_trace_histories *g_trace_histories;
@@ -84,31 +85,30 @@ spdk_trace_record(uint16_t tpoint_id, uint16_t poller_id, uint32_t size,
	}
}

void
int
spdk_trace_init(const char *shm_name)
{
	int trace_fd;
	int i = 0;

	snprintf(g_shm_name, sizeof(g_shm_name), "%s", shm_name);

	trace_fd = shm_open(shm_name, O_RDWR | O_CREAT, 0600);
	if (trace_fd == -1) {
	g_trace_fd = shm_open(shm_name, O_RDWR | O_CREAT, 0600);
	if (g_trace_fd == -1) {
		fprintf(stderr, "could not shm_open spdk_trace\n");
		fprintf(stderr, "errno=%d %s\n", errno, spdk_strerror(errno));
		exit(EXIT_FAILURE);
		return 1;
	}

	if (ftruncate(trace_fd, sizeof(*g_trace_histories)) != 0) {
	if (ftruncate(g_trace_fd, sizeof(*g_trace_histories)) != 0) {
		fprintf(stderr, "could not truncate shm\n");
		exit(EXIT_FAILURE);
		goto trace_init_err;
	}

	g_trace_histories = mmap(NULL, sizeof(*g_trace_histories), PROT_READ | PROT_WRITE,
				 MAP_SHARED, trace_fd, 0);
				 MAP_SHARED, g_trace_fd, 0);
	if (g_trace_histories == NULL) {
		fprintf(stderr, "could not mmap shm\n");
		exit(EXIT_FAILURE);
		goto trace_init_err;
	}

	memset(g_trace_histories, 0, sizeof(*g_trace_histories));
@@ -122,6 +122,16 @@ spdk_trace_init(const char *shm_name)
	}

	spdk_trace_flags_init();

	return 0;

trace_init_err:
	close(g_trace_fd);
	g_trace_fd = -1;
	shm_unlink(shm_name);

	return 1;

}

void
@@ -130,6 +140,7 @@ spdk_trace_cleanup(void)
	if (g_trace_histories) {
		munmap(g_trace_histories, sizeof(struct spdk_trace_histories));
		g_trace_histories = NULL;
		close(g_trace_fd);
	}
	shm_unlink(g_shm_name);
}