2020-06-14 03:51:41

by Aditya Pakki

[permalink] [raw]
Subject: [PATCH] media: bdisp: fix reference count leaks due to pm_runtime_get_sync

On calling pm_runtime_get_sync() the reference count of the device
is incremented. In case of failure, decrement the
reference count before returning the error.

Signed-off-by: Aditya Pakki <[email protected]>
---
drivers/media/platform/sti/bdisp/bdisp-v4l2.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
index af2d5eb782ce..098914ca4f68 100644
--- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
+++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
@@ -512,6 +512,7 @@ static int bdisp_start_streaming(struct vb2_queue *q, unsigned int count)
v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
}

+ pm_runtime_put(ctx->bdisp_dev->dev);
return ret;
}

@@ -1371,7 +1372,7 @@ static int bdisp_probe(struct platform_device *pdev)
ret = pm_runtime_get_sync(dev);
if (ret < 0) {
dev_err(dev, "failed to set PM\n");
- goto err_dbg;
+ goto err_pm;
}

/* Filters */
--
2.25.1


2020-06-14 07:15:04

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] media: bdisp: fix reference count leaks due to pm_runtime_get_sync

Hi Aditya,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linuxtv-media/master]
[also build test WARNING on v5.7 next-20200614]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Aditya-Pakki/media-bdisp-fix-reference-count-leaks-due-to-pm_runtime_get_sync/20200614-115114
base: git://linuxtv.org/media_tree.git master
config: x86_64-allyesconfig (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project cb5072d1877b38c972f95092db2cedbcddb81da6)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>, old ones prefixed by <<):

>> drivers/media/platform/sti/bdisp/bdisp-v4l2.c:1403:1: warning: unused label 'err_dbg' [-Wunused-label]
err_dbg:
^~~~~~~~
1 warning generated.

vim +/err_dbg +1403 drivers/media/platform/sti/bdisp/bdisp-v4l2.c

28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1284
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1285 static int bdisp_probe(struct platform_device *pdev)
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1286 {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1287 struct bdisp_dev *bdisp;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1288 struct resource *res;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1289 struct device *dev = &pdev->dev;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1290 int ret;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1291
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1292 dev_dbg(dev, "%s\n", __func__);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1293
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1294 bdisp = devm_kzalloc(dev, sizeof(struct bdisp_dev), GFP_KERNEL);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1295 if (!bdisp)
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1296 return -ENOMEM;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1297
2732bb765f14eb Fabien Dessenne 2018-05-15 1298 ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
2732bb765f14eb Fabien Dessenne 2018-05-15 1299 if (ret)
2732bb765f14eb Fabien Dessenne 2018-05-15 1300 return ret;
2732bb765f14eb Fabien Dessenne 2018-05-15 1301
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1302 bdisp->pdev = pdev;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1303 bdisp->dev = dev;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1304 platform_set_drvdata(pdev, bdisp);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1305
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1306 if (dev->of_node)
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1307 bdisp->id = of_alias_get_id(pdev->dev.of_node, BDISP_NAME);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1308 else
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1309 bdisp->id = pdev->id;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1310
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1311 init_waitqueue_head(&bdisp->irq_queue);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1312 INIT_DELAYED_WORK(&bdisp->timeout_work, bdisp_irq_timeout);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1313 bdisp->work_queue = create_workqueue(BDISP_NAME);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1314
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1315 spin_lock_init(&bdisp->slock);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1316 mutex_init(&bdisp->lock);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1317
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1318 /* get resources */
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1319 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1320 bdisp->regs = devm_ioremap_resource(dev, res);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1321 if (IS_ERR(bdisp->regs)) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1322 dev_err(dev, "failed to get regs\n");
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1323 ret = PTR_ERR(bdisp->regs);
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1324 goto err_wq;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1325 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1326
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1327 bdisp->clock = devm_clk_get(dev, BDISP_NAME);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1328 if (IS_ERR(bdisp->clock)) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1329 dev_err(dev, "failed to get clock\n");
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1330 ret = PTR_ERR(bdisp->clock);
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1331 goto err_wq;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1332 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1333
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1334 ret = clk_prepare(bdisp->clock);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1335 if (ret < 0) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1336 dev_err(dev, "clock prepare failed\n");
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1337 bdisp->clock = ERR_PTR(-EINVAL);
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1338 goto err_wq;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1339 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1340
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1341 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1342 if (!res) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1343 dev_err(dev, "failed to get IRQ resource\n");
017f4fb7f2eaa1 Wei Yongjun 2016-09-21 1344 ret = -EINVAL;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1345 goto err_clk;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1346 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1347
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1348 ret = devm_request_threaded_irq(dev, res->start, bdisp_irq_handler,
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1349 bdisp_irq_thread, IRQF_ONESHOT,
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1350 pdev->name, bdisp);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1351 if (ret) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1352 dev_err(dev, "failed to install irq\n");
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1353 goto err_clk;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1354 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1355
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1356 /* v4l2 register */
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1357 ret = v4l2_device_register(dev, &bdisp->v4l2_dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1358 if (ret) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1359 dev_err(dev, "failed to register\n");
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1360 goto err_clk;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1361 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1362
34b6beb65beb7f Fabien Dessenne 2015-05-12 1363 /* Debug */
34b6beb65beb7f Fabien Dessenne 2015-05-12 1364 ret = bdisp_debugfs_create(bdisp);
34b6beb65beb7f Fabien Dessenne 2015-05-12 1365 if (ret) {
34b6beb65beb7f Fabien Dessenne 2015-05-12 1366 dev_err(dev, "failed to create debugfs\n");
34b6beb65beb7f Fabien Dessenne 2015-05-12 1367 goto err_v4l2;
34b6beb65beb7f Fabien Dessenne 2015-05-12 1368 }
34b6beb65beb7f Fabien Dessenne 2015-05-12 1369
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1370 /* Power management */
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1371 pm_runtime_enable(dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1372 ret = pm_runtime_get_sync(dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1373 if (ret < 0) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1374 dev_err(dev, "failed to set PM\n");
00406f27b7445c Aditya Pakki 2020-06-13 1375 goto err_pm;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1376 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1377
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1378 /* Filters */
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1379 if (bdisp_hw_alloc_filters(bdisp->dev)) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1380 dev_err(bdisp->dev, "no memory for filters\n");
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1381 ret = -ENOMEM;
dce57314b53760 Hans Verkuil 2016-02-15 1382 goto err_pm;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1383 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1384
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1385 /* Register */
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1386 ret = bdisp_register_device(bdisp);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1387 if (ret) {
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1388 dev_err(dev, "failed to register\n");
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1389 goto err_filter;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1390 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1391
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1392 dev_info(dev, "%s%d registered as /dev/video%d\n", BDISP_NAME,
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1393 bdisp->id, bdisp->vdev.num);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1394
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1395 pm_runtime_put(dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1396
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1397 return 0;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1398
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1399 err_filter:
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1400 bdisp_hw_free_filters(bdisp->dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1401 err_pm:
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1402 pm_runtime_put(dev);
34b6beb65beb7f Fabien Dessenne 2015-05-12 @1403 err_dbg:
34b6beb65beb7f Fabien Dessenne 2015-05-12 1404 bdisp_debugfs_remove(bdisp);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1405 err_v4l2:
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1406 v4l2_device_unregister(&bdisp->v4l2_dev);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1407 err_clk:
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1408 if (!IS_ERR(bdisp->clock))
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1409 clk_unprepare(bdisp->clock);
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1410 err_wq:
8ea1c5af489a76 Chuhong Yuan 2019-11-13 1411 destroy_workqueue(bdisp->work_queue);
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1412 return ret;
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1413 }
28ffeebbb7bdc0 Fabien Dessenne 2015-05-12 1414

:::::: The code at line 1403 was first introduced by commit
:::::: 34b6beb65beb7f7726baa771661c671310445265 [media] bdisp: add debug file system

:::::: TO: Fabien Dessenne <[email protected]>
:::::: CC: Mauro Carvalho Chehab <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (11.09 kB)
.config.gz (71.98 kB)
Download all attachments