From 326ee33b0b1d2d64ce7f7820c6bd0b96a49f3603 Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Mon, 25 Jan 2021 15:48:02 +0900 Subject: [PATCH] amlogic: bt: Remove memory leak 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: [] create_object+0x278/0x580 [] kmemleak_alloc+0x74/0xa0 [] kmem_cache_alloc_trace+0x328/0x5e8 [] bt_probe+0x20c/0x870 ... Change-Id: Ic3f2091d16806dba0855927d048747b40cb96f80 Signed-off-by: Seung-Woo Kim --- drivers/amlogic/bluetooth/bt_device.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/amlogic/bluetooth/bt_device.c b/drivers/amlogic/bluetooth/bt_device.c index 19f3bc9b26bb..b3bc97d21fef 100644 --- a/drivers/amlogic/bluetooth/bt_device.c +++ b/drivers/amlogic/bluetooth/bt_device.c @@ -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); -- 2.34.1