From f5eb9e079b1464c0df60ec0578ea12619e447a4d Mon Sep 17 00:00:00 2001 From: Kris Van Hees Date: Tue, 10 Feb 2015 12:31:14 -0500 Subject: [PATCH] dtrace: fix dtrace_helptrace_buffer memory leak When the help tracing facility is enabled in DTrace, upon loading the DTrace core module, a buffer was being allocated using vmalloc(), yet is was never freed upon unloading of the dtrace module. This caused a leak of (by default) 64K with every load of the dtrace module. This commit ensures that the memory is freed. The commit also fixes the problem that the help tracing facility variables in DTrace were defined in two places. Orabug: 20514336 Signed-off-by: Kris Van Hees Acked-by: Nick Alcock --- dtrace/dtrace_dev.c | 21 ++++++++++----------- dtrace/dtrace_dof.c | 8 ++++---- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/dtrace/dtrace_dev.c b/dtrace/dtrace_dev.c index c7be698ad500..7c0317a3ec0f 100644 --- a/dtrace/dtrace_dev.c +++ b/dtrace/dtrace_dev.c @@ -41,16 +41,9 @@ #include "dtrace_dev.h" #include -uint32_t dtrace_helptrace_next = 0; -uint32_t dtrace_helptrace_nlocals; -char *dtrace_helptrace_buffer; -int dtrace_helptrace_bufsize = 512 * 1024; - -#ifdef CONFIG_DT_DEBUG -int dtrace_helptrace_enabled = 1; -#else -int dtrace_helptrace_enabled = 0; -#endif +extern char *dtrace_helptrace_buffer; +extern int dtrace_helptrace_bufsize; +extern int dtrace_helptrace_enabled; int dtrace_opens; int dtrace_err_verbose; @@ -1529,7 +1522,6 @@ int dtrace_dev_init(void) ASSERT(dtrace_helptrace_buffer == NULL); dtrace_helptrace_buffer = vzalloc(dtrace_helptrace_bufsize); - dtrace_helptrace_next = 0; if (dtrace_helptrace_buffer == NULL) { pr_warn("Cannot allocate helptrace buffer; " @@ -1607,6 +1599,13 @@ void dtrace_dev_exit(void) */ dtrace_for_each_module(module_del_pdata, NULL); + /* + * If DTrace helper tracing is enabled, we need to free the trace + * buffer. + */ + if (dtrace_helptrace_enabled || dtrace_helptrace_buffer) + vfree(dtrace_helptrace_buffer); + kmem_cache_destroy(dtrace_state_cachep); kmem_cache_destroy(dtrace_pdata_cachep); diff --git a/dtrace/dtrace_dof.c b/dtrace/dtrace_dof.c index 8b9094103f03..f287f8a6f22f 100644 --- a/dtrace/dtrace_dof.c +++ b/dtrace/dtrace_dof.c @@ -42,14 +42,14 @@ static int dtrace_helpers; static uint32_t dtrace_helptrace_next = 0; static uint32_t dtrace_helptrace_nlocals; -static char *dtrace_helptrace_buffer; -static int dtrace_helptrace_bufsize = 512 * 1024; #ifdef CONFIG_DT_DEBUG -static int dtrace_helptrace_enabled = 1; +int dtrace_helptrace_enabled = 1; #else -static int dtrace_helptrace_enabled = 0; +int dtrace_helptrace_enabled = 0; #endif +int dtrace_helptrace_bufsize = 512 * 1024; +char *dtrace_helptrace_buffer; void dtrace_dof_error(dof_hdr_t *dof, const char *str) { -- 2.50.1