]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: fix dtrace_helptrace_buffer memory leak
authorKris Van Hees <kris.van.hees@oracle.com>
Tue, 10 Feb 2015 17:31:14 +0000 (12:31 -0500)
committerKris Van Hees <kris.van.hees@oracle.com>
Mon, 20 Apr 2015 08:09:25 +0000 (04:09 -0400)
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 <kris.van.hees@oracle.com>
Acked-by: Nick Alcock <nick.alcock@oracle.com>
dtrace/dtrace_dev.c
dtrace/dtrace_dof.c

index c7be698ad500fd208edfac5f650e36aba4f4ad4f..7c0317a3ec0fffccbf4fb4bc4c86ec7e2503b7ba 100644 (file)
 #include "dtrace_dev.h"
 #include <linux/dtrace/ioctl_debug.h>
 
-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);
 
index 8b9094103f0337fcba44c0f57f902701c14ea453..f287f8a6f22f563c9120d57c7ad507f741a8433c 100644 (file)
@@ -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)
 {