Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp631551ybz; Wed, 29 Apr 2020 06:42:33 -0700 (PDT) X-Google-Smtp-Source: APiQypLkJvuvAd/5DoeMz8NR7dvAUwgpF395KMXuI9D1wbvKqHgpntWtKAKpRTRIEp3sPcMjsI/C X-Received: by 2002:aa7:cdd9:: with SMTP id h25mr2564940edw.17.1588167753679; Wed, 29 Apr 2020 06:42:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588167753; cv=none; d=google.com; s=arc-20160816; b=TGlPD60VPWoXHpU4uB6J6awq+jp/cKDLhhi66/+Li34YzkN5i/PTE3RMhGzp/mfRS4 8FKL9Wt95uEmHJGx8hawOKYTXPMPbz+u7DkE2Jnjt8Ec07lCQPWm+/hYYRjuTGSorINg 8LwB9brs0kN7qKshU2dCtvp1bJWbFdQYubgbvUrJT8UjTbbT673qq5n/5k7KRynnOIjO TXpF+VLW0zrh1XNhB+U0QR9nZN+U2/DTyM70VmF1pKPyhdGVLnPRDmPdpImYQMDXsq11 fIzBDDtL979l7NDhgFVFbdIUb27KZ5vDxwY4PmyXw/Ko08fa8teAYGRR1pN3U5pRvPjO rw0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=wlRNVwoTRRLxoAQTd4DaJNUSBClt9T6C/SDNUHah784=; b=eWJHvtnzfaLJ/StwUVB2b44e5jaaIOPvjapu7bTdTE73iaHHJLs2ygJCIt2wHX2lVX pGj6UdqRk0ogIrshyEwIZM/CuwjAYk/sPCbuYGcn24rzJ0TtEgf8c7yLnNwkCNZ1rL92 yCpXRZLdHw+0mD9EJVRDSQeiUhYcgokvJHRtxQibBbr3Fn+SdILP7Z/NiyblWEVYTGFC Aldzw/JEOhSmxcN486vZ5ec9VBj+CXjxD47/RjrUltBFxlsqw1exSZpVmHtpgLHUtd/g 7RxGQRwEe8yj3h93wmFR6QfxYX+T9/kCHaUtnnDcGF+l3eKSIl5ustHhHq4fqUtKAdGo 4CFg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a22si3462348edx.81.2020.04.29.06.42.10; Wed, 29 Apr 2020 06:42:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728451AbgD2NkA (ORCPT + 99 others); Wed, 29 Apr 2020 09:40:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727947AbgD2Nhq (ORCPT ); Wed, 29 Apr 2020 09:37:46 -0400 Received: from theia.8bytes.org (8bytes.org [IPv6:2a01:238:4383:600:38bc:a715:4b6d:a889]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 80E5DC03C1AD; Wed, 29 Apr 2020 06:37:45 -0700 (PDT) Received: by theia.8bytes.org (Postfix, from userid 1000) id 2A8C6CB4; Wed, 29 Apr 2020 15:37:37 +0200 (CEST) From: Joerg Roedel To: Joerg Roedel , Will Deacon , Robin Murphy , Marek Szyprowski , Kukjin Kim , Krzysztof Kozlowski , David Woodhouse , Lu Baolu , Andy Gross , Bjorn Andersson , Matthias Brugger , Rob Clark , Heiko Stuebner , Gerald Schaefer , Thierry Reding , Jonathan Hunter , Jean-Philippe Brucker Cc: Daniel Drake , jonathan.derrick@intel.com, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-s390@vger.kernel.org, linux-tegra@vger.kernel.org, virtualization@lists.linux-foundation.org, Joerg Roedel Subject: [PATCH v3 10/34] iommu: Move new probe_device path to separate function Date: Wed, 29 Apr 2020 15:36:48 +0200 Message-Id: <20200429133712.31431-11-joro@8bytes.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429133712.31431-1-joro@8bytes.org> References: <20200429133712.31431-1-joro@8bytes.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel This makes it easier to remove to old code-path when all drivers are converted. As a side effect that it also fixes the error cleanup path. Tested-by: Marek Szyprowski Acked-by: Marek Szyprowski Signed-off-by: Joerg Roedel --- drivers/iommu/iommu.c | 69 ++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 18eb3623bd00..8be047a4808f 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -218,12 +218,55 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list return ret; } +static int __iommu_probe_device_helper(struct device *dev) +{ + const struct iommu_ops *ops = dev->bus->iommu_ops; + struct iommu_group *group; + int ret; + + ret = __iommu_probe_device(dev, NULL); + if (ret) + goto err_out; + + /* + * Try to allocate a default domain - needs support from the + * IOMMU driver. There are still some drivers which don't + * support default domains, so the return value is not yet + * checked. + */ + iommu_alloc_default_domain(dev); + + group = iommu_group_get(dev); + if (!group) + goto err_release; + + if (group->default_domain) + ret = __iommu_attach_device(group->default_domain, dev); + + iommu_group_put(group); + + if (ret) + goto err_release; + + if (ops->probe_finalize) + ops->probe_finalize(dev); + + return 0; + +err_release: + iommu_release_device(dev); +err_out: + return ret; + +} + int iommu_probe_device(struct device *dev) { const struct iommu_ops *ops = dev->bus->iommu_ops; int ret; WARN_ON(dev->iommu_group); + if (!ops) return -EINVAL; @@ -235,30 +278,10 @@ int iommu_probe_device(struct device *dev) goto err_free_dev_param; } - if (ops->probe_device) { - struct iommu_group *group; - - ret = __iommu_probe_device(dev, NULL); - - /* - * Try to allocate a default domain - needs support from the - * IOMMU driver. There are still some drivers which don't - * support default domains, so the return value is not yet - * checked. - */ - if (!ret) - iommu_alloc_default_domain(dev); - - group = iommu_group_get(dev); - if (group && group->default_domain) { - ret = __iommu_attach_device(group->default_domain, dev); - iommu_group_put(group); - } - - } else { - ret = ops->add_device(dev); - } + if (ops->probe_device) + return __iommu_probe_device_helper(dev); + ret = ops->add_device(dev); if (ret) goto err_module_put; -- 2.17.1