arm: mach-omap2: smartreflex: fix another memory leak
authorAaro Koskinen <aaro.koskinen@nokia.com>
Mon, 7 Feb 2011 14:08:04 +0000 (16:08 +0200)
committerKevin Hilman <khilman@ti.com>
Wed, 2 Mar 2011 16:04:46 +0000 (08:04 -0800)
Temporary strings with volt_* file names should be released after the
debugfs entries are created. While at it, also simplify the string
allocation, and use just snprintf() to create the name.

The patch eliminates kmemleak reports with the following stack trace
(multiple objects depending on HW):

unreferenced object 0xcedbc5a0 (size 64):
  comm "swapper", pid 1, jiffies 4294929375 (age 423.734s)
  hex dump (first 32 bytes):
    76 6f 6c 74 5f 39 37 35 30 30 30 00 00 00 00 00  volt_975000.....
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  backtrace:
    [<c012fee0>] create_object+0x104/0x208
    [<c012dbc8>] kmem_cache_alloc_trace+0xf0/0x17c
    [<c0013f64>] omap_sr_probe+0x314/0x420
    [<c02a1724>] platform_drv_probe+0x18/0x1c
    [<c02a088c>] driver_probe_device+0xc8/0x188
    [<c02a09b4>] __driver_attach+0x68/0x8c
    [<c02a00ac>] bus_for_each_dev+0x44/0x74
    [<c029f9e0>] bus_add_driver+0xa0/0x228
    [<c02a0cac>] driver_register+0xa8/0x130
    [<c02a1b2c>] platform_driver_probe+0x18/0x8c
    [<c0013c1c>] sr_init+0x40/0x74
    [<c005a554>] do_one_initcall+0xc8/0x1a0
    [<c00084f4>] kernel_init+0x150/0x218
    [<c0065d64>] kernel_thread_exit+0x0/0x8
    [<ffffffff>] 0xffffffff

Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/smartreflex.c

index 95ac336fe3f753677e7af83c842fc3a9336d7686..5a849c981733afe6dd3316b2b2f608b349c3c7d4 100644 (file)
@@ -926,19 +926,10 @@ static int __init omap_sr_probe(struct platform_device *pdev)
        }
 
        for (i = 0; i < sr_info->nvalue_count; i++) {
-               char *name;
-               char volt_name[32];
-
-               name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL);
-               if (!name) {
-                       dev_err(&pdev->dev, "%s: Unable to allocate memory"
-                               " for n-value directory name\n",  __func__);
-                       return -ENOMEM;
-               }
+               char name[NVALUE_NAME_LEN + 1];
 
-               strcpy(name, "volt_");
-               sprintf(volt_name, "%d", volt_data[i].volt_nominal);
-               strcat(name, volt_name);
+               snprintf(name, sizeof(name), "volt_%d",
+                        volt_data[i].volt_nominal);
                (void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,
                                &(sr_info->nvalue_table[i].nvalue));
        }