From patchwork Tue Aug 8 17:27:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13346723 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0484C001DB for ; Tue, 8 Aug 2023 18:19:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235616AbjHHSTf (ORCPT ); Tue, 8 Aug 2023 14:19:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235634AbjHHSTM (ORCPT ); Tue, 8 Aug 2023 14:19:12 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2075.outbound.protection.outlook.com [40.107.243.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5226E86245 for ; Tue, 8 Aug 2023 10:27:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HiqjWxAYEfy04oKvswfkAdIt95JCTpAXoDS60EhxcniXtirPk8+H8aSngemLfbNWtlhZ92hgjunkSVdYN5q66mUp6Iyu5kt2reUhD49iZPgdRl8lRQynhtc+vPDpqGqaz55lP+BeoG8Gf6GvACu886M0JW1iMIqlc5AyjQQeikbjfrNLoNWlJWjXc4pj0pV/Jx22ZsRSga/V/ilw9Gp7A2VlnQw4NAj/HzulGZ0O9KPsOs8YPzULCS1YWp7ZIMgXC8N41ELDGWTL1AJeSN6SkgLWti/vzutHLxgM44i4v4jn+6ctA5r3/RwF/7RtQkZ+f6nYp8bvBJGUzc3XfWg/Vg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=cfgpzjJZZ6/Ui1wndcrkZRbSTYjZz4VLwaE9NiBJD9U=; b=dZY2F/xsKyA/Fa5LMG5iyqb3JIqLta3VNqWwYv1dbb8gInLRs8iHoOQGyv6I1PIgZTjMMQwH2xNdXcCBStWX6L+8a4xqjn0lf3is5/0oIE4PkehLluctKFuMxMbki0kIpg2kRIGSx/mIaFoRpFtgSIu3MaF22wrI9TEtug7v7vtjS5hkK5/9ijDb3/9ShWpYUwZH2SjrN/aJtkLbElD0A68Klk/1x3Xm0bkhdH9grX9KeZwgP1xM3WrJ81rA6QGeSFu6c+pgH8CJyUp7fbUFDQDPk7RMfz9VFl7erUAS4lOVkmhyDVCzHVfhGGXxiI5iFfgdIFxP75L50riJdtBtiA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cfgpzjJZZ6/Ui1wndcrkZRbSTYjZz4VLwaE9NiBJD9U=; b=K92QKo2Q2aW3ojyiREAr2ofRTAQPfkonj2ejfsdNUScLZimfxfSmi3o4R7k14fUCFTJn+kXfn1oN+wgyzuYuLHLku2M0Zt76Pm5H3Rc07JN+fhNrg/yAnSorsSMJ2zvy/gvHwBq32b4n2l+SP7AojxUYfIB9nPa5U6nCJzkLrP9TsdDU33dqlUMo3y9b/QVCEcy092Rhk/1q2uQRrsLgR8z6oPtvl45tYWBpwU0SoqB9Qww9/4j2JWL4ZZS1UbX4QHnrgnWv6SErrzw5HoKubcVEXPxdc7677XjngPz3Wh/EF1upfN6bc3Ev2XGLMENEGPalgPwdXuVkM2HjDr6+3Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DS0PR12MB8454.namprd12.prod.outlook.com (2603:10b6:8:15e::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.26; Tue, 8 Aug 2023 17:27:09 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1%6]) with mapi id 15.20.6652.026; Tue, 8 Aug 2023 17:27:09 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , Len Brown , linux-acpi@vger.kernel.org, "Rafael J. Wysocki" , Robin Murphy , Will Deacon Cc: Lu Baolu , Kevin Tian , Marek Szyprowski , Chen-Yu Tsai Subject: [PATCH 1/3] iommu: Provide iommu_probe_device_locked() Date: Tue, 8 Aug 2023 14:27:05 -0300 Message-ID: <1-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> In-Reply-To: <0-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0409.namprd13.prod.outlook.com (2603:10b6:208:2c2::24) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DS0PR12MB8454:EE_ X-MS-Office365-Filtering-Correlation-Id: 4fb43edd-eeea-45aa-fae5-08db9834b18e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Pk/qNwlDAxL3koeq5LCvbJ9jU4Xir0Zs+Aroc/dq//ViMmwUI1sR22SFe1BgbwP5WPXPBhOM69bTznODJntadICAKBDnwYvLSVU1l1A/P4afQIUN/S6yl7/XmQapHlNjFLTOn1SbtBqdLVrXMvji2SAZ5KaeNgX5fFfuTkZ7h0Mvly94GnqvNU24S0maZ6UFct8rm9F82a2YIBEE6fchaB4gd2Py5lGs/62y/QbYnXrdv3IKd/iZkFPCv4XPsypaUyk1eTS72DVEl+igYQiNTnsCvfp2DVWCpr7PtMijYX/FP3BPK1eiysqOvhPCvqB/CB++hWQmRPCoqYC1C5LHNIm3Kft7d2wMfIcgRskgoH/jrmbJoFItOL0Bb61xQDh1lUmdfPjAe89+sf7Df++UPTi+1mtXVHIHH2+qowvYcHjlQawm8rF/e/zO6/vyYyg4JXuN9ll4xzNWNYU7joGl7IAy/55TpANlCKcPd+TalxW5N0y+pniQRduthxaa+7WI+gdAVYGONoma6EgcC/etZxaGT8MAf7F5tQHf90ahJI2arCX9ATTyONzDMhzZeC7FrfQ7Q0Q3ukfhM89RflLZIS5fWMShpfhTrFpO/k5QhzmHO5PAvdMkrRzAIgVY8OG84ZRDckSGrgyUvnAE9rRCGQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(396003)(366004)(346002)(39860400002)(376002)(136003)(186006)(1800799003)(451199021)(83380400001)(2616005)(2906002)(110136005)(54906003)(4326008)(316002)(8936002)(5660300002)(7416002)(8676002)(38100700002)(66476007)(66556008)(66946007)(6512007)(478600001)(966005)(6666004)(6486002)(41300700001)(86362001)(26005)(36756003)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: riz/zgYugOtlMv0C/B4GNkuUSOHA+BNCzTprFJGZ76UoPqAstZerkADg3D48gb4YqGY2beVDFMittEdxXpuXurMLtYudqFA8pV/mFHu6TUX+dR8sr8GT+wNwG9whG24VVFmvyVLirEHgv+YJoSHbKWaCL4NLjM2XyvqfJzC7mi7A8X0ZIP5zzlh4DIJBKeQJlsQrAiMlfnMJ6kcGGlX7I3sTIEMUUniYHnqo/OODqSSVqkJjmMGS20A26sQg0REYCOjl8yRhbZ4CtmgLTbJYweKwtR4TAYOBO4PecdaFUFDPVeDH9anYL8MUY/3+A9JPHlZ12Fn+dJu4jO4uWcR7OpCg5M+c3UD7V8KcyeClIP8GUd73VlxRwQQbkdUV/V0hrbErjxx7/CpGEJrkhJWZrdnyupOlHt6pAl0oZY/oEbh9QuhArff9m2aj2VdYKVbo+IUhD58geSaH3vqlQ5uEAdmAXmy56uMo6ok1t8HPv+9qjbX1DmTae6qkWh/cK3yHLBpJp70eB+fbbcsX7WRJDlaCclJwq1md0qJQl/vbn7DuH7IO0RmTbLN9Y9k71l4oMf9fOjYNYAo70p6p/BlkwUzwM5XHgDB7fsAmn2a17/juFaLXxSusmwymVFT8nlk2vUB1o55gpStBS9zjrCaBi0h0SfAFlWWLVyEfdy1reZ/kZhohn2fDhhozDk41VOqxG0FGtbHfu+1sgEjDp3SQ3HvLABaB2t4ytSNuSfIuJ5uDGPIhvb0zHKQmpGAjQbpBaSCet7qhSIYZgr3mkG8Jjse8Ry0LAaYZ1G3Q2j2rNPEEIauVDqVSKD7jqzPEliuWQM7qkpxUcb6/gx0qeehoiFiDSU+ajIWeMSg3bcw278WJmLqeduT4QG2BFT6EjKc71Ld5NhmpKUuLRJEVP6y/SqL1JyE2mLBimq1HReyYV7+xTduZ0Q9CPC08WyPQbBWDJDxhEzJAtDAcRMcwpCIVYkcPd1dctFKSZDh3XUYtq6jXJiRNPJdDJN7JuA5xDYJCW83EBQchQgCzAbZ1eoOc4cjaQbBKrtOhwP5sGe1KEAur51vmZLNb9ZaezzvFNfD+VD+PNC3tuEy0uoNNYtNMaCtOO57ySPZREh2k0Kvz0/hlTEG7iqdsKvZT7Rqq+yCZVSrCufPjPR88wW9WW1V2Ls/JkLGiLEEM8Oa8XzQGmA0iyWd1YI+hUIbS0m0t8oF+I1FM5fwAJwaVdxLKB8tXdwxClR6ELcplHBbRVfk0uSQqeqlmP47IEALhtx7oNTcFUnInz3xYpUIirJuaLorprkq2AYwcc/Qvn8n4zDddV4Ne0n7fAF9p++2iC54auNwQUMAnxox3c1XdpFA0vh27JNr5Up5TfxU4N8xpblR/kNt/8QClcUruOlHsewvAzCX1NU8/SqZRaXxP/JlKGftKoeYmDJD8mvmEMjcJb+UkFtLzQDi3tUJz0BqpHb59fyyj2cvKn+sqgbyqiB+uyEagXzWwc9A+1IVYeDwdoKYOh8DI7urMQBiGzvtGIulWMgu85Yujjte+z4stvOEt1uKotcUuJjdHhgl3uioJAp3hhmQ6w3UCJcz4umSZfvO8HHOv X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4fb43edd-eeea-45aa-fae5-08db9834b18e X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Aug 2023 17:27:08.9078 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: h+XGFlFunQw543fwgQNl/B/i95V0HZsFRu8dvS1i4vnNY7bODVm2RwpfnLJuqz1l X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8454 Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org The two callers coming from bus_tye -> dma_configure() already have the device_lock held for the device being probed. Mark this in the API so that the core code doesn't attempt to re-acquire the same lock and deadlock. __iommu_probe_device from iommu_probe_device+0x10/0x40 iommu_probe_device from of_iommu_configure+0xf8/0x1c8 of_iommu_configure from of_dma_configure_id+0x188/0x450 of_dma_configure_id from platform_dma_configure+0x24/0x60 platform_dma_configure from really_probe+0xac/0x3d4 really_probe from __driver_probe_device+0xa0/0x1e8 __driver_probe_device from driver_probe_device+0x30/0xd0 driver_probe_device from __driver_attach+0x10c/0x190 __driver_attach from bus_for_each_dev+0x60/0xb4 bus_for_each_dev from bus_add_driver+0xe0/0x208 bus_add_driver from driver_register+0x7c/0x118 driver_register from exynos_drm_init+0xe0/0x14c exynos_drm_init from do_one_initcall+0x6c/0x318 do_one_initcall from kernel_init_freeable+0x1c4/0x214 kernel_init_freeable from kernel_init+0x18/0x12c kernel_init from ret_from_fork+0x14/0x2c Internally make __iommu_probe_device() require the caller to get the device_lock(). The three remaining callers of iommu_probe_device() don't seem to hold the device_lock(): powerpc/kernel/iommu.c: iommu_add_device() iommu/iommu.c: iommu_bus_notifier()/BUS_NOTIFY_ADD_DEVICE/ intel/iommu.c: probe_acpi_namespace_devices() Fixes: a2dde836050f ("iommu: Complete the locking for dev->iommu_group") Reported-by: Marek Szyprowski Closes: https://lore.kernel.org/linux-iommu/bc5d6aa8-e8ca-c896-2f39-af074d55e436@samsung.com Tested-by: Marek Szyprowski Signed-off-by: Jason Gunthorpe Reviewed-by: Kevin Tian --- drivers/acpi/scan.c | 5 +++-- drivers/iommu/iommu.c | 34 ++++++++++++++++++++++------------ drivers/iommu/of_iommu.c | 2 +- include/linux/iommu.h | 1 + 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index daa64dd687524b..3771164af60279 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -1579,10 +1579,11 @@ static const struct iommu_ops *acpi_iommu_configure_id(struct device *dev, /* * If we have reason to believe the IOMMU driver missed the initial - * iommu_probe_device() call for dev, replay it to get things in order. + * iommu_probe_device_locked() call for dev, replay it to get things in + * order. */ if (!err && dev->bus) - err = iommu_probe_device(dev); + err = iommu_probe_device_locked(dev); /* Ignore all other errors apart from EPROBE_DEFER */ if (err == -EPROBE_DEFER) { diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 25d7327e8013e7..ecf61bd3cfb076 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -452,24 +452,23 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list struct group_device *gdev; int ret; - if (!ops) - return -ENODEV; /* * Allow __iommu_probe_device() to be safely called in parallel, * both dev->iommu_group and the initial setup of dev->iommu are * protected this way. */ - device_lock(dev); + device_lock_assert(dev); + + if (!ops) + return -ENODEV; /* Device is probed already if in a group */ - if (dev->iommu_group) { - ret = 0; - goto out_unlock; - } + if (dev->iommu_group) + return 0; ret = iommu_init_device(dev, ops); if (ret) - goto out_unlock; + return ret; group = dev->iommu_group; gdev = iommu_group_alloc_device(group, dev); @@ -505,7 +504,6 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list list_add_tail(&group->entry, group_list); } mutex_unlock(&group->mutex); - device_unlock(dev); if (dev_is_pci(dev)) iommu_dma_set_pci_32bit_workaround(dev); @@ -519,16 +517,16 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list iommu_deinit_device(dev); mutex_unlock(&group->mutex); iommu_group_put(group); -out_unlock: - device_unlock(dev); return ret; } -int iommu_probe_device(struct device *dev) +int iommu_probe_device_locked(struct device *dev) { const struct iommu_ops *ops; int ret; + device_lock_assert(dev); + ret = __iommu_probe_device(dev, NULL); if (ret) return ret; @@ -540,6 +538,16 @@ int iommu_probe_device(struct device *dev) return 0; } +int iommu_probe_device(struct device *dev) +{ + int ret; + + device_lock(dev); + ret = iommu_probe_device_locked(dev); + device_unlock(dev); + return ret; +} + static void __iommu_group_free_device(struct iommu_group *group, struct group_device *grp_dev) { @@ -1789,7 +1797,9 @@ static int probe_iommu_group(struct device *dev, void *data) struct list_head *group_list = data; int ret; + device_lock(dev); ret = __iommu_probe_device(dev, group_list); + device_unlock(dev); if (ret == -ENODEV) ret = 0; diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c index 157b286e36bf3a..b5b7d4bd2cefb9 100644 --- a/drivers/iommu/of_iommu.c +++ b/drivers/iommu/of_iommu.c @@ -160,7 +160,7 @@ const struct iommu_ops *of_iommu_configure(struct device *dev, * probe for dev, replay it to get things in order. */ if (!err && dev->bus) - err = iommu_probe_device(dev); + err = iommu_probe_device_locked(dev); /* Ignore all other errors apart from EPROBE_DEFER */ if (err == -EPROBE_DEFER) { diff --git a/include/linux/iommu.h b/include/linux/iommu.h index f1e18e81fca78b..cb4fc518797039 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -709,6 +709,7 @@ static inline void dev_iommu_priv_set(struct device *dev, void *priv) } int iommu_probe_device(struct device *dev); +int iommu_probe_device_locked(struct device *dev); int iommu_dev_enable_feature(struct device *dev, enum iommu_dev_features f); int iommu_dev_disable_feature(struct device *dev, enum iommu_dev_features f); From patchwork Tue Aug 8 17:27:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13346724 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E8CC7C41513 for ; Tue, 8 Aug 2023 18:19:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235168AbjHHSTg (ORCPT ); Tue, 8 Aug 2023 14:19:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235183AbjHHSTO (ORCPT ); Tue, 8 Aug 2023 14:19:14 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2075.outbound.protection.outlook.com [40.107.243.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83DB120985 for ; Tue, 8 Aug 2023 10:27:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=U9W74M9kz9vE1t5PmxdLKkQcDCcAaGaEhkhkUxQ7+ynOaRh7b0o7zItkKxiU4lmyat0nf/6c2cHySbvnqVZezrrfr5Kvhm/oA+b17bqwYXRLxBaqhQ6g/AW2lxBczmCKRzeG4DIxJ9VAC5v4GliRiGTB8MD0azdHEp9evcpKJBIH6HcC3Fgmu9vCHQrxMMHem6MmCmMyuww7FwZ+4MudShZepdkhQHrn6tu7EQGkmtz6hjaMnk/pc4oq6EeYPlTO3nll6CpkfeAr4W5kZ6tYTLBgrS+sTHRNgGT1bmU/vIJnELauHsVR7wADQU0YlrftmgkIJFvu9R5F07fO/xN9rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=CLWSa1Fy2Et4vOyC1QAtF3m1NDrrbd6PByBqssQjnrw=; b=NiBnbEbdRUmPWLTFT6u1wGQEFB5mViWG+l0rbnOutI0JoRhFyEtY8xTJirzZ6gcw8Y7jZi+kBzNr4aUY6p1f95kOmDjVZx2knvhGVYb4r/5GBu5K8+5cCtI2VdpJoZUaKEnMwPiO03xpuYRaNiSuRDF8YM9dkhS7jF1WRtL33RdD/LiGaHTh+24fhmHSfVcDbbZkYngsc0yuU35qsR/DM0JltjbZNGsV68R4ap0iH9TfPxUjOHYh5ozCUMXxNFV5N9Om7yimT0C7IX0lOcvejqK5T152WtWZ7BrcKFYHcSzNbluFnjGqNX8x2rEcaiDXG5dL0JI533v7O75TR9VZzQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CLWSa1Fy2Et4vOyC1QAtF3m1NDrrbd6PByBqssQjnrw=; b=NihWRgb2JDEEYk/s3KqzIjKBvQuTsrrQzwtro25vgTR2rBDayAgYLQ9pirZATYzlg2+Gpfm5MHBEQbogn0Qc6e5uCEdlzuRKUy3BQP16Dc1XoCWYX+w80XgfNXYg53l5NYRTLtNidHdhZnblYDqbMiyPnwfvY9rAfgmMVQkbW180qwfdckETKkvQMw1CPGAB5V8QD/I8wywxrhWv8p35xSs8GSCeP9pTAxl8F4UrbK06qEsWiP+084CvYU87ZUg+FwtzTqACRUwnBQsEJXhvdxo2PIOoRPIc3C+DrEf4Edyo4VpWFWKCIYRx0M3fnvAWPS5ZFWTMFcRIUe/V8nXvOA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DS0PR12MB8454.namprd12.prod.outlook.com (2603:10b6:8:15e::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.26; Tue, 8 Aug 2023 17:27:10 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1%6]) with mapi id 15.20.6652.026; Tue, 8 Aug 2023 17:27:10 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , Len Brown , linux-acpi@vger.kernel.org, "Rafael J. Wysocki" , Robin Murphy , Will Deacon Cc: Lu Baolu , Kevin Tian , Marek Szyprowski , Chen-Yu Tsai Subject: [PATCH 2/3] iommu: Pass in the iommu_device to probe for in bus_iommu_probe() Date: Tue, 8 Aug 2023 14:27:06 -0300 Message-ID: <2-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> In-Reply-To: <0-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0402.namprd13.prod.outlook.com (2603:10b6:208:2c2::17) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DS0PR12MB8454:EE_ X-MS-Office365-Filtering-Correlation-Id: 88751fab-3764-49de-e61c-08db9834b19a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: oNXW+9nzyNDF2CbHcoejyi/KhD14dyOsDyLZAfpNY3rC0g/LTwXUw2rbnAzwk54AFqJttePTLEx2lVMBr359LvA5ltOjTzsicISIKs8hbQthKXRP2gmz8mZCKN4vPrWU9PdrgjUwLf8tdW4UpZTbYivmvbLxiE9x+PJTUsOx8fRGvGU+WBcVK+AEPKI0dwHLTwigRRM9yhx69Y9/sivJg7+gsdSvCUH0D6gd4joNckkCRbaphhJbPXEzosD9SCLeiaBdin3TzliJlQAF5dvOi909MdfylQCjQUcpnOfqVVO4mLPImhXBY7lv/Kzn5ky7kS0lfaebnl9egrX1XssZd2YoiJqbUrEDwQvZdX8luq6kuEbYvFW5nAV+vmaaDkeSXWgrTOTlGNE/k3PJVk9suD43xtWSasctnFZTrBLJ1iBJZS7kh+vrUxQTIfti5/ZNXSGuaI8FgpdWwCJGM0CarffdNXqFsqOxSmFeiZos1ywk8HixW25MkKG5Vze+MbJLcmTi4ui9rZ6V0iskGrKzIUBrcWE66Ep8V6hkOWoAunPVF14srNDU2M1xRvWKhee1Z4Gqe7bhjXkU34lIHxj0BN2o6AO3O0qGe8AxDwCiPIs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(396003)(366004)(346002)(39860400002)(376002)(136003)(186006)(1800799003)(451199021)(83380400001)(2616005)(2906002)(110136005)(54906003)(4326008)(316002)(8936002)(5660300002)(7416002)(8676002)(38100700002)(66476007)(66556008)(66946007)(6512007)(478600001)(6666004)(6486002)(41300700001)(86362001)(26005)(36756003)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: duaKhjSvS7gpaty/tODcb+nR8vf53ON3tTSD42JsMMsh5LHJ818LY4WpzTQUPhwNqjSCtA+HK2d0MEqwkoPjJfwzZex/9z5XaBMOv0goCpDAza+qhGUui3cSwaGCORLU9G33ZRFFWxKKqRpd17Xy799DeL1q1i/eoZPnEAZXxALK1QZ1eTS4VS076B1y4JFUTPVCt2BrRt7mxtBQSqR9gPejkkuimVxiXRPEJwaCVyJEj/Bc+4/whbydDB3n/D96bdYLQ9GgBNRi4sPwY99YTY512734dkOqTGg1+k9wPYmQJaJrr+tf/mIW0XdEVobTo3RT9j0sj1XMtn6+vk4bPDMwDW/kuND7icrG8S3VCP6MOcIAYLOULBuVfWP0+0Z/V/3uKajmqbNk0JjzRQtNKHYXwaCOZVqfjE/14HLoCvQeAsAz12nqYHuOkPUqeapdJDsJvxNn5AP7qOKfKkyvnD3sBNjZsr6WZmHWjDOm4IgNK8Aq1xc3orU6lg2hF5q6ERMnH9aCcQvPQrrn0DKfXMeeGRmQHkwKSUIofbuuBJH/kUofpHFiAoJ0RJ3ESEBSFZqCVGbUrR29G0m5WpoXa7lCoiippAVvR4/pRfTUXyhW5gjvh8kgF0W90SOIfyEjEbhxDJVL3SvM6ROqpkshlAZOSug5yJSCRvgNGreU7wt/87PDaRzvMubSOnRf2d+FID+Xrt07J2POEnVCb9ST90StQXaTBVpq39NVNUF7bfrG0GGifngVXZS4etCO+F+EOiAn2joEHBH8Pjby594nLQ8ftZEKzhtO+eBFTqMVv/ZnEYk9jFezFgQf+zQ33xQ26mG0W0368lz7vHgKMqKxZDpfOiFuJx4hOO28hBnn0VeRFhD849r4r4DEfZI0TGSePAFyLbR8OouW2l55nlDdAls6w8nizdcJ7z4v387d6PpF8K8f1pYTKqb/sI0fAySGIO5E7g4rrLH4XXSQjzUuiM0H2UsudUjiWiNjK12ah+iJ8RM7N4hjRRyLinXUY9vpdwWG6ObcsVdwIKQf3+UWQlTXwGZLNXp4mmFMj/ZkEvsl/bJOi3+H4TjlvtkZUvb5SwWUZ9M5yjgiwFC+Ew1EPtwMRBHHuS2jbdtXUUI/5lNaBNS4UivqPvYUbHI7YHt6W6TXcl6rEHuDae02EOA6rL7CeFFZ8UTq6lQPtE6WB9Icffx6vT4yTPG01j7hZadqzG+O+omlFHIqYzDKq1meLzvOY0fWZZ6VNYngDNAd4sd7gX+roLZMmP3fhQ4ZS8nFQPZ/WdNrnOVk/H+0PX54nFDD761er0dvYC7veFqtfTLv5BobgO8pBECB/C8fSCqIJe1ZkzZPttKJaJXfVXRkn8XOllLNhmm8mHQ5bFDeAPMwZ0tzksFk/SOHbAdtZ0Evzxtr31O31zMsuHPjpydg65CT8Ip7O5/yYweUlQ4ogpfwZ+KxCuDNh3mB7Nk6bP071TR9kKiD5uxs6fkFDDEOKQG15m9pLMgRKvdwlLDXILV+blOK9DezfDnhOkV/NCXzhhnyLlAvoMvxqAgRojTir7SfLll1JmohaD8Rq1inDOAT6zs3i5Kjb5xVtgMPe56g X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 88751fab-3764-49de-e61c-08db9834b19a X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Aug 2023 17:27:08.9678 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3bvBXO9kpiJhpS5GxlTxgH7Vz0MGAON55ahSKXHZfdycnmY73rpg06zqV01HeA6+ X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8454 Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org This is preparation for the next patch. Each iommu driver is associated with a 'struct iommu_device' handle. Pass in the iommu_device to bus_iommu_probe() and all the way through to probe_iommu_group(). omap is weird, it has a whole bunch of iommu devices that it creates a struct omap_iommu for, but it only registers some of then with the subsystem. In the case it doesn't register then it has to open code the call to bus_iommu_probe() as it's omap_iommu_probe_device() function is sensitive. Pass in the unregistered iommu_device struct and move this code into an else block since there is no sense in calling bus_iommu_probe() twice in a row. Signed-off-by: Jason Gunthorpe Reviewed-by: Kevin Tian --- drivers/iommu/iommu.c | 18 +++++++++++++----- drivers/iommu/omap-iommu.c | 11 ++++++++--- include/linux/iommu.h | 3 ++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index ecf61bd3cfb076..19fdb1a220240f 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -273,7 +273,7 @@ int iommu_device_register(struct iommu_device *iommu, for (int i = 0; i < ARRAY_SIZE(iommu_buses) && !err; i++) { iommu_buses[i]->iommu_ops = ops; - err = bus_iommu_probe(iommu_buses[i]); + err = bus_iommu_probe(iommu_buses[i], iommu); } if (err) iommu_device_unregister(iommu); @@ -1792,13 +1792,18 @@ struct iommu_domain *iommu_group_default_domain(struct iommu_group *group) return group->default_domain; } +struct probe_iommu_args { + struct list_head *group_list; + struct iommu_device *iommu; +}; + static int probe_iommu_group(struct device *dev, void *data) { - struct list_head *group_list = data; + struct probe_iommu_args *args = data; int ret; device_lock(dev); - ret = __iommu_probe_device(dev, group_list); + ret = __iommu_probe_device(dev, args->group_list); device_unlock(dev); if (ret == -ENODEV) ret = 0; @@ -1868,13 +1873,16 @@ static void iommu_group_do_probe_finalize(struct device *dev) ops->probe_finalize(dev); } -int bus_iommu_probe(const struct bus_type *bus) +int bus_iommu_probe(const struct bus_type *bus, struct iommu_device *iommu) { + struct probe_iommu_args args = {}; struct iommu_group *group, *next; LIST_HEAD(group_list); int ret; - ret = bus_for_each_dev(bus, NULL, &group_list, probe_iommu_group); + args.group_list = &group_list; + args.iommu = iommu; + ret = bus_for_each_dev(bus, NULL, &args, probe_iommu_group); if (ret) return ret; diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c index 97c45f50bf4332..1e4a90ec64322b 100644 --- a/drivers/iommu/omap-iommu.c +++ b/drivers/iommu/omap-iommu.c @@ -1234,6 +1234,14 @@ static int omap_iommu_probe(struct platform_device *pdev) if (err) goto out_sysfs; obj->has_iommu_driver = true; + } else { + /* + * omap_iommu_probe_device() requires all the iommus associated + * with a device to have been probed to succeed. We just created + * an iommu without registering it, so re-run probe again to try + * to match any devices that are waiting for this iommu. + */ + bus_iommu_probe(&platform_bus_type, &obj->iommu); } pm_runtime_enable(obj->dev); @@ -1242,9 +1250,6 @@ static int omap_iommu_probe(struct platform_device *pdev) dev_info(&pdev->dev, "%s registered\n", obj->name); - /* Re-probe bus to probe device attached to this IOMMU */ - bus_iommu_probe(&platform_bus_type); - return 0; out_sysfs: diff --git a/include/linux/iommu.h b/include/linux/iommu.h index cb4fc518797039..cc47e4086d69ec 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -465,7 +465,8 @@ static inline const struct iommu_ops *dev_iommu_ops(struct device *dev) return dev->iommu->iommu_dev->ops; } -extern int bus_iommu_probe(const struct bus_type *bus); +extern int bus_iommu_probe(const struct bus_type *bus, + struct iommu_device *iommu); extern bool iommu_present(const struct bus_type *bus); extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap); extern bool iommu_group_has_isolated_msi(struct iommu_group *group); From patchwork Tue Aug 8 17:27:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13346722 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97C81C04A94 for ; Tue, 8 Aug 2023 18:19:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234765AbjHHST1 (ORCPT ); Tue, 8 Aug 2023 14:19:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48780 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235112AbjHHSTJ (ORCPT ); Tue, 8 Aug 2023 14:19:09 -0400 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2084.outbound.protection.outlook.com [40.107.223.84]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 015F0852B1 for ; Tue, 8 Aug 2023 10:27:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bZa3Gtr9klBKF84zDDPFcBr2QCEy6A++bQaE7eizY04ukcWpP9VfTg9u/5KnFoL/Uo3nwhvtJZfnCdVTN1yl0Z206VsMAEJiWKqhIaoEIZQ8wNZFVuMfRGU61pQBQxt5z50vpcVZC0MTXok3AOeWR2XSXUblGEYO2aH9SPKD49ttDMQQpkIulKwxY15z4Z9Jjl5DUwxEZ7OIZGjrB6h06k9iT29oU1SnzdVChCTvJiNtrQIQrvyNOAQwgoaen46gJb6ESi8ZaaDc/GCMYEIeEK6cOA9nZzoPboLVmpGcOtBbeBky79K7QeqHooh6v+Yzf8Zkl++52a7b0BbWkSSXGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FLYcctTI3W8ECGsmDfLND4gLJA5z01Ug3vcDrYWTKLw=; b=iTK1on2CyoHYOMshIpD81lVriyvW3fQaoUTUTyXV8Yorjm0vKRKB3ARpvF5N/ls7DhlOCXltBoeJoW9esQFrHoxr35WZGQqEn7pOIoKkPmq7DJ/O5dnp7bxxU4DJQ39XU+Km2QRxlA1Mgu48piEVER+TQqPoJpHWteSQxmb8HZXoi4Tm/VxuUsbvIiTviO/dDbvsBNccmQtyVnoGCaHAHFEA9uwH7+kqUXSG03Cnori0PqDfuk3HlAi6Z+HjeAIABqeMrA6y8rHQzbKS99CZC0ivMtlN0yC8fbKqyGzhC7cY6s1GDbOMoYpeW65WC0U7VrG1oFXzmT1ukWl9sKECEA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FLYcctTI3W8ECGsmDfLND4gLJA5z01Ug3vcDrYWTKLw=; b=FuHFimSP3b6FdV5OB3KwLJyKlha/UGG3BGPSFQpa5oAP2XXn00RfzwptyczarNEzjrphMLRcttcnzvfEKIqo+92QeaoikNVxBgH3utg6Mf2YSKrYtsY2YKudXOWVcUC+06BEjnq635ZmLi3KiG/GNvMqDCYJSFM3lrw4DdTfvrN9sA1BYFwd618X1GvVWo+CAPVFsZkb/IpQBCajvKxYHwX3+6zmvSXrCxvvgmXgiKUrqPzsmVNoaZZrbkbrYu01aef8Ao8tzwy4+PJYtPgDHVZ3hCpK+n6FUHAvgOKK1lb8WAkeY/2NT2GPbqFHxi9Z2LRLVkWk6hAK08WzVJbz2A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by SJ1PR12MB6361.namprd12.prod.outlook.com (2603:10b6:a03:455::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.27; Tue, 8 Aug 2023 17:27:08 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::5111:16e8:5afe:1da1%6]) with mapi id 15.20.6652.026; Tue, 8 Aug 2023 17:27:08 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , Len Brown , linux-acpi@vger.kernel.org, "Rafael J. Wysocki" , Robin Murphy , Will Deacon Cc: Lu Baolu , Kevin Tian , Marek Szyprowski , Chen-Yu Tsai Subject: [PATCH 3/3] iommu: Do not attempt to re-lock the iommu device when probing Date: Tue, 8 Aug 2023 14:27:07 -0300 Message-ID: <3-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> In-Reply-To: <0-v1-8612b9ef48da+333-iommu_group_locking2_jgg@nvidia.com> References: X-ClientProxiedBy: BLAPR03CA0146.namprd03.prod.outlook.com (2603:10b6:208:32e::31) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|SJ1PR12MB6361:EE_ X-MS-Office365-Filtering-Correlation-Id: 91590f3b-8e48-4762-d9b3-08db9834b149 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: oSv73DoobQbvmg+d0uDLk1I6RdD0hN03w7dLmqbJDsP0KlH93oiGhnLyLiFVpy+oXIGIUoicE+BTcg69dLMVeOI9UsHJFteqgQ9LcwuOOwB/bYiE99wrMth4wJPShgfUn+dMXtWP37FFhJdul/CQ7ZLuBgpbA/FotZolDPPETAPw0x2JHYDMxiQpqhHCEFkgOMqgOmhZUZQXzUqLu3dfIsVN85cDw1tHzAyZEwhNSqFKWjeCR3vNj6F5eIgDL+cqjCPv7ZXvnX8zkSkhaqj8q/4UaXE/mf4sXrtsGcZk8J6qUK6tgNkSkzJtEKVIa57/2XgRtr9tgu61FYMEYPA1+sW8a4tnA2Zm8SQYvWIV42aospqJ32Aqg7l/6b+nVkpL/HqF7ZHQlv0qrgykkgzkFeGVBJCZmlAgqpG384loQXotEzwj7SlXHe0bPCB5QDr67Fz9HKcHIi2epDNvV7wFNxzGHz3psmUOkoYvMTcoaSsnXjbRaLGM2NO2qEbSXjjxgUJrCcRwJJnMtDJKjV+hQFiiNr6iENJCWQthv9datKOTmlXxISuhlR9mixDbEYZ1a6k4Rm3d/mRgMPkjOFpVTa7sk/6O3LYdostYn5c8YDrpZOQRmPg30uPzNKYWLTuwr17nvBgg0D1D53onOzPsAQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(366004)(396003)(136003)(39860400002)(346002)(376002)(451199021)(186006)(1800799003)(2616005)(36756003)(6512007)(966005)(4326008)(316002)(54906003)(86362001)(478600001)(38100700002)(110136005)(6486002)(66946007)(66556008)(66476007)(6506007)(26005)(8676002)(41300700001)(8936002)(2906002)(83380400001)(5660300002)(7416002)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: XZHIeeg/GkD3YsqvcGYze99VfHVuivJXCBkrz2zDfWz/m1C6abmnE39feM+hAFtkucRFUA8qjTKJUUA6trMj+IFUbpuEz7XGlznUW6NYUIyXmeQqZ2YxXdGvhgv05KUzOd2WSoGCrnfRnTfidY4d3wkbi3xwiq78ymn9OiZpnTVXxShw32YTLyELIalzp3OtZn3FB7t85RQTI4vNgOvupokKWSObdGSLP6YbIprnAgccwJSo8y9Y+/X/C+wsaT0r+AZL6w2Q1r+BjP85IVquYLiuICndgRzXG22fzQ64MBK6SgEWZ9+YnhRF5ZLmykGppJsBDd/4pX3bugIAoU8L2wSJCfUNeT3OOAph3jU26c0W6COjheNK1eD+Mlkv31kjTNgdMWQ9+Kp2fZ522wSbG1MnXHbHgBWxd8XIHaaVUb/MAkf5FaQjEag1/0htxGXIyAF2AewhJ8hSNDGeBk6clszDrrqHPTdi/W2jpOB5BMrG3I21zJlDxC+jgTpU883cnhtj9SiDBe+uQb5U/wd52GMx6hbxfbMizKNHjc7u4YnD1BMS+c1qo43s/Zhkk7AbH9MxZ8GLX6qXjERculn3piwJ3iAfrymzWyxkppmn3nNqlEkfr0tOdvh+hpVXQ3ERuv9Xn/b3X9Bl/eybSFaDGQbpYJo8ASwSxublcrDqsGkUqCWwK5wQ/sSoUhUHl07a/rov/gggK0dxovbtpe0/Q5mOM8YB4z5U9PgWQnqR8M9+PJfoswe7PNHSb27yYsSy7cRDuqGrMaIR0Zeeak/0vLKZX4pkTGsdJrydDiRJn6Wu6yOLKXf8Lwj9fSTO+xppryvItaxQFR8AmG4M2xzFPgpdcz7D3tAuC74tqfdEZsbDri2NTgqj6KT27lQQevD8g8Dix/MfeOYg7BLkK8iLIivikvpnQYSsdQBtUruyrD0FDmO2QPZnTkJPLGt3PVzwryWggYqVeTvNABfN+HyyCXR89IRKo7jXOIIJi0icb4bsK0cskUdhLuwtA9EP9kfwOHLGf843dstEZ0mnkWLBIjiTo3jJaa41HlFg44lt29TQVjBeMnQBuxZeR6z758LxWDRslHwq+SF5q5nPs4fJQHwTUMLIuqcF8o1iiPMdtetlrgKQ2AawzuT22gbmt1u5wl79/FujPXje4HFWpiOzh9is8Qp6NgLSgyO3wFrzErdKUebtaTEowC8uPlWlKU9bTeeuPwJuMpSGw9jt8X7mCcU+0qbyv47b/82pcJAvaQd0xzE/V9fHHPe6GTuWfNEK9iFbWazSeyk7JWXLIqtPJsFi9Ek50SqUFGRW93VNtJORZ0/OcRqPSyOqvt0nXjUGB6xRmR0WCoiVMhvebqxRZCsBu6sXFyCQ+E41IQPZHYuvFA6r40ZECdz1FVeYtmEo1+HfR06eWVaTwCfdTzqrwVEyseaJgChETyKyO5RiDQBqrOKPSioC8jx7GRB4ISRrIn+PNzN9jWp7sI+rS042W8LRZIBqkA3N/14drYDEqSTlTY/t4AskTgR5ks0qAf4MD5Q8iGRwSNk5BkzpKr2hLr2qHYmyrM+iljREfRj9pNzWdCoistgOdNANUG7xIrzZ X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91590f3b-8e48-4762-d9b3-08db9834b149 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Aug 2023 17:27:08.5323 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: m6UE0AyVOna9e7P6k555WdOqNPirp2c+guABW+l3280dbiNUEb3UqXtSbgD22twk X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6361 Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org When bus_iommu_probe() runs it can attempt to probe the iommu itself, for instance if the iommu is located on a platform_bus. This will cause the device_lock() to deadlock on itself as the device_driver probe() callback for the device calling iommu_device_register() already holds the device_lock(): probe_iommu_group+0x18/0x38 bus_for_each_dev+0xe4/0x168 bus_iommu_probe+0x8c/0x240 iommu_device_register+0x120/0x1b0 mtk_iommu_probe+0x494/0x7a0 platform_probe+0x94/0x100 really_probe+0x1e4/0x3e8 __driver_probe_device+0xc0/0x1a0 driver_probe_device+0x110/0x1f0 __device_attach_driver+0xf0/0x1b0 bus_for_each_drv+0xf0/0x170 __device_attach+0x120/0x240 device_initial_probe+0x1c/0x30 bus_probe_device+0xdc/0xe8 deferred_probe_work_func+0xf0/0x140 process_one_work+0x3b0/0x910 worker_thread+0x33c/0x610 kthread+0x1dc/0x1f0 ret_from_fork+0x10/0x20 Keep track of the iommu itself and do not attempt to relock the device while doing the probe_iommu_group scan. To accommodate omap's use of unregistered struct iommu_device's add a new 'hwdev' member to keep track of the hwdev in all cases. Normally this would be dev->parent, but since omap doesn't allocate that struct it won't exist for it. Fixes: a2dde836050f ("iommu: Complete the locking for dev->iommu_group") Reported-by: Chen-Yu Tsai Closes: https://lore.kernel.org/linux-iommu/CAGXv+5E-f9AteAYkmXYzVDZFSA_royc7-bS5LcrzzuHDnXccwA@mail.gmail.com Tested-by: Marek Szyprowski Signed-off-by: Jason Gunthorpe --- drivers/iommu/iommu.c | 12 ++++++++++-- drivers/iommu/omap-iommu.c | 1 + include/linux/iommu.h | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 19fdb1a220240f..8842f4975ec4a8 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -264,6 +264,7 @@ int iommu_device_register(struct iommu_device *iommu, return -EBUSY; iommu->ops = ops; + iommu->hwdev = hwdev; if (hwdev) iommu->fwnode = dev_fwnode(hwdev); @@ -1800,11 +1801,18 @@ struct probe_iommu_args { static int probe_iommu_group(struct device *dev, void *data) { struct probe_iommu_args *args = data; + bool need_lock; int ret; - device_lock(dev); + /* Probing the iommu itself is always done under the device_lock */ + need_lock = !args->iommu || args->iommu->hwdev != dev; + + if (need_lock) + device_lock(dev); ret = __iommu_probe_device(dev, args->group_list); - device_unlock(dev); + if (need_lock) + device_unlock(dev); + if (ret == -ENODEV) ret = 0; diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c index 1e4a90ec64322b..20fcc8ebab6ae3 100644 --- a/drivers/iommu/omap-iommu.c +++ b/drivers/iommu/omap-iommu.c @@ -1241,6 +1241,7 @@ static int omap_iommu_probe(struct platform_device *pdev) * an iommu without registering it, so re-run probe again to try * to match any devices that are waiting for this iommu. */ + obj->iommu.hwdev = &pdev->dev; bus_iommu_probe(&platform_bus_type, &obj->iommu); } diff --git a/include/linux/iommu.h b/include/linux/iommu.h index cc47e4086d69ec..96782bfb384462 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -361,6 +361,7 @@ struct iommu_domain_ops { * @list: Used by the iommu-core to keep a list of registered iommus * @ops: iommu-ops for talking to this iommu * @dev: struct device for sysfs handling + * @hwdev: The device HW that controls the iommu * @singleton_group: Used internally for drivers that have only one group * @max_pasids: number of supported PASIDs */ @@ -369,6 +370,7 @@ struct iommu_device { const struct iommu_ops *ops; struct fwnode_handle *fwnode; struct device *dev; + struct device *hwdev; struct iommu_group *singleton_group; u32 max_pasids; };