Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp575711rdf; Tue, 21 Nov 2023 10:06:34 -0800 (PST) X-Google-Smtp-Source: AGHT+IEgl7xVK9tztEbOBhSHcEcimRBHrCCGho55b9hTLvxjX3smGF2vbv203nYgINDCMydC03hp X-Received: by 2002:a05:6830:a59:b0:6d7:db90:1f73 with SMTP id g25-20020a0568300a5900b006d7db901f73mr25352otu.28.1700589994591; Tue, 21 Nov 2023 10:06:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700589994; cv=none; d=google.com; s=arc-20160816; b=f9lpVx5bs0Tj5CGkiBQVyT6azqc7OyC1DseqY9Mc95LMA924qBwhh64eg7wRT5Bi18 1Onhu2DNJmbyGL7nkwKSKHL4wbxlx+4BIaonTkAo0SfQlokUOfVa1zdsgD3kdarKKIpe qHgvEE83SIneEUC1iQL1Q+bInvRH9NhOM68J0PP/Rj3QDCCCs7jgaERqCQpw3NPQHEkG wJB0GuK3q6bk27KkA6TRc19Emk4aMnrvxsT5fGRNWN+FidbeLCUONPb1HcdsRwy2oJWU eY2rSq7lChjqXxen/523XWbcielqnIh+QkhDjsol81Ju6r/z//pRwEoyWFi1iZDdGQEz iNjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=A0ivn4fIPBbYFd1IL9Dmha+h1lzzzjcTvXIj/pnTO/A=; fh=/LWf6GZq+5MWEfaJ8k2uZ3r5PX06byd5VRVQaY04470=; b=RG4MLWvbo3kQNuipFtywbRRiAGC9UsyRLV/Pd1sqWebcDYuCfP3YIB+c9QWrS6jL9W 9NM4kXWPYlohcE/f+mJlqygB0/esoQ0qVv4vJ5WJA89Bj/WvTD+06RsfVP/Ej+XM8z3D pDb4vAr8C4trhFz00khXwpgiLqxa04mrpP9RnbdLkJs3sNF7Gqkfvp5+rjOe3Rvol6P8 g6k3Exd4nXiqfr575J4yCNI/3c3lm1JVvKl3bcCNitw2/NUTHKlJ8tjAGO3CCNDFp6wj n2s5s57GvBoDz37oB7RQMJN15pK6yY16mWOvPHtnfh9jXoreMcXRlV2cwABK1o9gKjRY JMsA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id b6-20020a056830344600b006bcc963bb52si3991192otu.193.2023.11.21.10.06.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 10:06:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 6A2FA807528D; Tue, 21 Nov 2023 10:05:31 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234333AbjKUSE7 (ORCPT + 99 others); Tue, 21 Nov 2023 13:04:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234370AbjKUSEo (ORCPT ); Tue, 21 Nov 2023 13:04:44 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id B51F61716 for ; Tue, 21 Nov 2023 10:04:19 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5139A1AED; Tue, 21 Nov 2023 10:05:06 -0800 (PST) Received: from e121345-lin.cambridge.arm.com (e121345-lin.cambridge.arm.com [10.1.196.40]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 855FA3F6C4; Tue, 21 Nov 2023 10:04:18 -0800 (PST) From: Robin Murphy To: joro@8bytes.org, will@kernel.org Cc: iommu@lists.linux.dev, jgg@nvidia.com, baolu.lu@linux.intel.com, linux-kernel@vger.kernel.org, jsnitsel@redhat.com Subject: [PATCH v6 4/7] iommu: Decouple iommu_domain_alloc() from bus ops Date: Tue, 21 Nov 2023 18:04:00 +0000 Message-Id: <6c7313009aae0e39ae2855920990ebf85af4662f.1700589539.git.robin.murphy@arm.com> X-Mailer: git-send-email 2.39.2.101.g768bb238c484.dirty In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Tue, 21 Nov 2023 10:05:32 -0800 (PST) As the final remaining piece of bus-dependent API, iommu_domain_alloc() can now take responsibility for the "one iommu_ops per bus" rule for itself. It turns out we can't safely make the internal allocation call any more group-based or device-based yet - that will have to wait until the external callers can pass the right thing - but we can at least get as far as deriving "bus ops" based on which driver is actually managing devices on the given bus, rather than whichever driver won the race to register first. This will then leave us able to convert the last of the core internals over to the IOMMU-instance model, allow multiple drivers to register and actually coexist (modulo the above limitation for unmanaged domain users in the short term), and start trying to solve the long-standing iommu_probe_device() mess. Reviewed-by: Jason Gunthorpe Reviewed-by: Jerry Snitselaar Signed-off-by: Robin Murphy --- v5: Rewrite, de-scoping to just retrieve ops under the same assumptions as the existing code. --- drivers/iommu/iommu.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 8e4436c606d3..88aeae0acd9b 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2143,12 +2143,31 @@ __iommu_group_domain_alloc(struct iommu_group *group, unsigned int type) return __iommu_domain_alloc(dev_iommu_ops(dev), dev, type); } +static int __iommu_domain_alloc_dev(struct device *dev, void *data) +{ + const struct iommu_ops **ops = data; + + if (!dev_has_iommu(dev)) + return 0; + + if (WARN_ONCE(*ops && *ops != dev_iommu_ops(dev), + "Multiple IOMMU drivers present for bus %s, which the public IOMMU API can't fully support yet. You will still need to disable one or more for this to work, sorry!\n", + dev_bus_name(dev))) + return -EBUSY; + + *ops = dev_iommu_ops(dev); + return 0; +} + struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) { - if (bus == NULL || bus->iommu_ops == NULL) + const struct iommu_ops *ops = NULL; + int err = bus_for_each_dev(bus, NULL, &ops, __iommu_domain_alloc_dev); + + if (err || !ops) return NULL; - return __iommu_domain_alloc(bus->iommu_ops, NULL, - IOMMU_DOMAIN_UNMANAGED); + + return __iommu_domain_alloc(ops, NULL, IOMMU_DOMAIN_UNMANAGED); } EXPORT_SYMBOL_GPL(iommu_domain_alloc); -- 2.39.2.101.g768bb238c484.dirty