amlogic: bt: Remove memory leak 73/252173/2
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 25 Jan 2021 06:48:02 +0000 (15:48 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 25 Jan 2021 06:56:31 +0000 (15:56 +0900)
The prdata is covered by pdata from bt_probe, so there is memory
leak for prdata. Remove the memory leak store prdata, and get
pdata from prdata.

This fixes following kmemleak issue:
   unreferenced object 0xffffffc00c39e300 (size 64):
   ...
     backtrace:
       [<ffffff90094318b8>] create_object+0x278/0x580
       [<ffffff900b06e90c>] kmemleak_alloc+0x74/0xa0
       [<ffffff9009409fa0>] kmem_cache_alloc_trace+0x328/0x5e8
       [<ffffff900a850b04>] bt_probe+0x20c/0x870
   ...

Change-Id: Ic3f2091d16806dba0855927d048747b40cb96f80
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
drivers/amlogic/bluetooth/bt_device.c

index 19f3bc9..b3bc97d 100644 (file)
@@ -242,20 +242,34 @@ static void bt_lateresume(struct early_suspend *h)
 static int bt_suspend(struct platform_device *pdev,
        pm_message_t state)
 {
-       struct bt_dev_data *pdata = platform_get_drvdata(pdev);
+       struct bt_dev_runtime_data *prdata =
+               platform_get_drvdata(pdev);
+       struct bt_dev_data *pdata;
 
        pr_info("bt suspend\n");
-       enable_irq(pdata->irqno_wakeup);
+
+       if (prdata) {
+               pdata = prdata->pdata;
+               if (pdata)
+                       enable_irq(pdata->irqno_wakeup);
+       }
 
        return 0;
 }
 
 static int bt_resume(struct platform_device *pdev)
 {
-       struct bt_dev_data *pdata = platform_get_drvdata(pdev);
+       struct bt_dev_runtime_data *prdata =
+               platform_get_drvdata(pdev);
+       struct bt_dev_data *pdata;
 
        pr_info("bt resume\n");
-       disable_irq(pdata->irqno_wakeup);
+
+       if (prdata) {
+               pdata = prdata->pdata;
+               if (pdata)
+                       disable_irq(pdata->irqno_wakeup);
+       }
 
        return 0;
 }
@@ -401,8 +415,6 @@ static int bt_probe(struct platform_device *pdev)
        register_early_suspend(&bt_early_suspend);
 #endif
 
-       platform_set_drvdata(pdev, pdata);
-
        /*1.Set BT_WAKE_HOST to the input state;*/
        /*2.Get interrupt number(irqno_wakeup).*/
        pdata->irqno_wakeup = gpio_to_irq(pdata->gpio_btwakeup);