Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iommu/mediatek-v1: fix device leaks on probe()

Make sure to drop the references taken to the larb devices during
probe on probe failure (e.g. probe deferral) and on driver unbind.

Fixes: b17336c55d89 ("iommu/mediatek: add support for mtk iommu generation one HW")
Cc: stable@vger.kernel.org # 4.8
Cc: Honghui Zhang <honghui.zhang@mediatek.com>
Acked-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>

authored by

Johan Hovold and committed by
Joerg Roedel
46207625 c77ad28b

+18 -5
+18 -5
drivers/iommu/mtk_iommu_v1.c
··· 651 651 struct platform_device *plarbdev; 652 652 653 653 larbnode = of_parse_phandle(dev->of_node, "mediatek,larbs", i); 654 - if (!larbnode) 655 - return -EINVAL; 654 + if (!larbnode) { 655 + ret = -EINVAL; 656 + goto out_put_larbs; 657 + } 656 658 657 659 if (!of_device_is_available(larbnode)) { 658 660 of_node_put(larbnode); ··· 664 662 plarbdev = of_find_device_by_node(larbnode); 665 663 if (!plarbdev) { 666 664 of_node_put(larbnode); 667 - return -ENODEV; 665 + ret = -ENODEV; 666 + goto out_put_larbs; 668 667 } 669 668 if (!plarbdev->dev.driver) { 670 669 of_node_put(larbnode); 671 - return -EPROBE_DEFER; 670 + put_device(&plarbdev->dev); 671 + ret = -EPROBE_DEFER; 672 + goto out_put_larbs; 672 673 } 673 674 data->larb_imu[i].dev = &plarbdev->dev; 674 675 ··· 683 678 684 679 ret = mtk_iommu_v1_hw_init(data); 685 680 if (ret) 686 - return ret; 681 + goto out_put_larbs; 687 682 688 683 ret = iommu_device_sysfs_add(&data->iommu, &pdev->dev, NULL, 689 684 dev_name(&pdev->dev)); ··· 705 700 iommu_device_sysfs_remove(&data->iommu); 706 701 out_clk_unprepare: 707 702 clk_disable_unprepare(data->bclk); 703 + out_put_larbs: 704 + for (i = 0; i < MTK_LARB_NR_MAX; i++) 705 + put_device(data->larb_imu[i].dev); 706 + 708 707 return ret; 709 708 } 710 709 711 710 static void mtk_iommu_v1_remove(struct platform_device *pdev) 712 711 { 713 712 struct mtk_iommu_v1_data *data = platform_get_drvdata(pdev); 713 + int i; 714 714 715 715 iommu_device_sysfs_remove(&data->iommu); 716 716 iommu_device_unregister(&data->iommu); ··· 723 713 clk_disable_unprepare(data->bclk); 724 714 devm_free_irq(&pdev->dev, data->irq, data); 725 715 component_master_del(&pdev->dev, &mtk_iommu_v1_com_ops); 716 + 717 + for (i = 0; i < MTK_LARB_NR_MAX; i++) 718 + put_device(data->larb_imu[i].dev); 726 719 } 727 720 728 721 static int __maybe_unused mtk_iommu_v1_suspend(struct device *dev)