From 8b6826536cb89deb1ec4268767627d83fbd05295 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Fri, 31 Aug 2018 15:16:39 -0700 Subject: [PATCH] trace: do not shm_unlink if tracepoints were specified This allows us to use the tracepoints as forensics when a crash occurs - basically a high-powered trace buffer. Signed-off-by: Jim Harris Change-Id: I27f6c7a196501b4100cfc19c0354f2c6095ff3bb Reviewed-on: https://review.gerrithub.io/424282 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker --- lib/trace/trace.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/trace/trace.c b/lib/trace/trace.c index 26636eda8..c470844b0 100644 --- a/lib/trace/trace.c +++ b/lib/trace/trace.c @@ -128,10 +128,23 @@ trace_init_err: void 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); + bool unlink; + + if (g_trace_histories == NULL) { + return; + } + + /* + * Only unlink the shm if there were no tracepoints enabled. This ensures the file + * can be used after this process exits/crashes for debugging. + * Note that we have to calculate this value before g_trace_histories gets unmapped. + */ + unlink = spdk_mem_all_zero(g_trace_flags->tpoint_mask, sizeof(g_trace_flags->tpoint_mask)); + munmap(g_trace_histories, sizeof(struct spdk_trace_histories)); + g_trace_histories = NULL; + close(g_trace_fd); + + if (unlink) { + shm_unlink(g_shm_name); } - shm_unlink(g_shm_name); }