From patchwork Fri Nov 8 15:25:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean-Philippe Brucker X-Patchwork-Id: 178917 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp2860814ilf; Fri, 8 Nov 2019 07:26:58 -0800 (PST) X-Google-Smtp-Source: APXvYqzS2Ipj2kg5xB5WINyhqzYFi6LuVgDF8ciGdrfCVx9NByBXIppsHsIHVFLwihY0bMgJhzZF X-Received: by 2002:a17:906:27cc:: with SMTP id k12mr9252937ejc.181.1573226818106; Fri, 08 Nov 2019 07:26:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573226818; cv=none; d=google.com; s=arc-20160816; b=ROrIJ85QnMdQ7HySqG7EDm+FjAvci6Ihcwzo3nLCtW2dqzBGzTZiAOumPKAetO7Fz0 HYlwX2O/mQxhnSr4tXhYcULJDNhewdU9KUOPyOKkOyzFxXYjgBubDYZRvBDmX8RPhRHy q/6n7RbAoDGEt9D10im3cowpDfuKUjocY5jzC9I7Y5JFWCQntY6EDUxIFo2Kzd0AHERp u01HRGPOMfwgK9aF8gsWqXCe0u9quofVtCRvRY6stAs/HG7mR7LnMB7kkK3qEFDcBEGk WHcPXvk2el47N228qkhpKAwg2DBOYf66p3oxpb0ONV22keWf+b4QI5fjtE0k8COkZ/iw l/kQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=XcF4FI/xEJT2ddBZxLwsH4kwVBtXhLcA/n4y2uy3gfU=; b=rX2bwfeqEQMbskFYSgk6450WC4NxEqHZzeRV20FNClrBB5epr54Ka6NBhSc8xbB0bs nrGsyerj5ndnztp1s+SNlHgTGDLoyEPTrWKhpDo34Tv5xpTtJGb4kC8hLzYPlJ4x6bSs V1USumYlqmmQrRpGFiuwBrvw3afPqg0tKzXduX9g8751okFI5PeDWA5CdEZhS7kk8VJr KXEIGgFH9EUCXpqRlSPpNgBwpgK/n4m9OchE2B7HJ3YxmAoExYJhL29RQoJUj/d50bcG 8DIHvhAwMfqNP/Gg2+uTfgLAo0DRsFtrBDkJLra5lTNFeMayv7N5ykBQ7x/2rxTIWYC8 tSVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BDQ7ZeC9; spf=pass (google.com: best guess record for domain of linux-acpi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-acpi-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y31si4384892edb.47.2019.11.08.07.26.57; Fri, 08 Nov 2019 07:26:58 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-acpi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BDQ7ZeC9; spf=pass (google.com: best guess record for domain of linux-acpi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-acpi-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726101AbfKHP05 (ORCPT + 7 others); Fri, 8 Nov 2019 10:26:57 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:37728 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726845AbfKHP05 (ORCPT ); Fri, 8 Nov 2019 10:26:57 -0500 Received: by mail-wm1-f66.google.com with SMTP id q130so6641378wme.2 for ; Fri, 08 Nov 2019 07:26:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XcF4FI/xEJT2ddBZxLwsH4kwVBtXhLcA/n4y2uy3gfU=; b=BDQ7ZeC9LB/2Lh6DQj16J8t0f6umU/jbny0nZwuikklVbgDi7dCWTbWMm0aRjLi005 V9skokHIp4EKef66gOqo4I/nTxWGvc+9S6EKjBlJxyLdKbQSqZqWvqeY+Z77HTqkfX16 4JkmEuH7gjM/RdLJO9BN/Vyp34vnY9Hjxh0xTuSOc2pbbXcqJvbeKLT8KPs3B6zuGeSk oQeEJyv8qFljGOOQ55RrjTk0fCjjESA+CfjKaY7SQ8SZ3HRmaDrfbgz8Gb5nIqgT00q+ AA1hFm+CnyswDokicO8N1z95D2kGm5pzZtaKebbBgrFl7rKhfqfepJE34J7LhtfZSbFY G1Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XcF4FI/xEJT2ddBZxLwsH4kwVBtXhLcA/n4y2uy3gfU=; b=DUvGcVhRbM508nKdqzBAy/1aDTFInhNiwrrNQNi0c4bCBwRz3WQSttJlxoz7TR7yOr YA1Hbizv1NIQ5Iyg9KE2BE+Wk4TcOGv/yo6iYrnGErd9P3zDq0QR7/MwbeoRXDVykU47 d2iT2q5HmXbCU1wO4nphNs8JzkvU/efyt04CtDZgsWU4Xukd6P/1NnOWDfmRW0tkk0Cz ZnzkE2w7a1QrE0xWvZnfDYy4xJlxX5I6bXOygYXNW6AewhHAiR+3BTeJkvx3ISTDPtOH YZRQ8kkLCrjCFsIk61RAsKTEPYPEEAE72Fhcwjb+C9++jAjbudodGl171mZWeyqN0Alg Xvgw== X-Gm-Message-State: APjAAAV1Ot7Wi42uiUpu1MB32prOfhBUQ25iBo0PIRHwpP6+OjX8ExvI q4/2jtJiWXeODWmhgX+eS9FYNQ== X-Received: by 2002:a1c:9917:: with SMTP id b23mr8603435wme.42.1573226815904; Fri, 08 Nov 2019 07:26:55 -0800 (PST) Received: from localhost.localdomain ([85.195.192.192]) by smtp.gmail.com with ESMTPSA id w18sm6579232wrp.31.2019.11.08.07.26.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Nov 2019 07:26:55 -0800 (PST) From: Jean-Philippe Brucker To: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: joro@8bytes.org, robh+dt@kernel.org, mark.rutland@arm.com, lorenzo.pieralisi@arm.com, guohanjun@huawei.com, sudeep.holla@arm.com, rjw@rjwysocki.net, lenb@kernel.org, will@kernel.org, robin.murphy@arm.com, zhangfei.gao@linaro.org, eric.auger@redhat.com, jonathan.cameron@huawei.com Subject: [PATCH v2 7/8] iommu/arm-smmu-v3: Improve add_device() error handling Date: Fri, 8 Nov 2019 16:25:07 +0100 Message-Id: <20191108152508.4039168-8-jean-philippe@linaro.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191108152508.4039168-1-jean-philippe@linaro.org> References: <20191108152508.4039168-1-jean-philippe@linaro.org> MIME-Version: 1.0 Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org Let add_device() clean up after itself. The iommu_bus_init() function does call remove_device() on error, but other sites (e.g. of_iommu) do not. Don't free level-2 stream tables because we'd have to track if we allocated each of them or if they are used by other endpoints. It's not worth the hassle since they are managed resources. Reviewed-by: Eric Auger Signed-off-by: Jean-Philippe Brucker --- drivers/iommu/arm-smmu-v3.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) -- 2.23.0 diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 82eac89ee187..88ec0bf33492 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -2826,14 +2826,16 @@ static int arm_smmu_add_device(struct device *dev) for (i = 0; i < master->num_sids; i++) { u32 sid = master->sids[i]; - if (!arm_smmu_sid_in_range(smmu, sid)) - return -ERANGE; + if (!arm_smmu_sid_in_range(smmu, sid)) { + ret = -ERANGE; + goto err_free_master; + } /* Ensure l2 strtab is initialised */ if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) { ret = arm_smmu_init_l2_strtab(smmu, sid); if (ret) - return ret; + goto err_free_master; } } @@ -2843,13 +2845,25 @@ static int arm_smmu_add_device(struct device *dev) master->ssid_bits = min_t(u8, master->ssid_bits, CTXDESC_LINEAR_CDMAX); + ret = iommu_device_link(&smmu->iommu, dev); + if (ret) + goto err_free_master; + group = iommu_group_get_for_dev(dev); - if (!IS_ERR(group)) { - iommu_group_put(group); - iommu_device_link(&smmu->iommu, dev); + if (IS_ERR(group)) { + ret = PTR_ERR(group); + goto err_unlink; } - return PTR_ERR_OR_ZERO(group); + iommu_group_put(group); + return 0; + +err_unlink: + iommu_device_unlink(&smmu->iommu, dev); +err_free_master: + kfree(master); + fwspec->iommu_priv = NULL; + return ret; } static void arm_smmu_remove_device(struct device *dev)