From patchwork Fri May 11 19:06:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean-Philippe Brucker X-Patchwork-Id: 10395025 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 787E160348 for ; Fri, 11 May 2018 19:10:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6759A28F8B for ; Fri, 11 May 2018 19:10:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5BAB428F95; Fri, 11 May 2018 19:10:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D96C228F8B for ; Fri, 11 May 2018 19:10:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 448FC6B06BC; Fri, 11 May 2018 15:10:25 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 3D1936B06BE; Fri, 11 May 2018 15:10:25 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2722D6B06BF; Fri, 11 May 2018 15:10:25 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot0-f199.google.com (mail-ot0-f199.google.com [74.125.82.199]) by kanga.kvack.org (Postfix) with ESMTP id EA5406B06BC for ; Fri, 11 May 2018 15:10:24 -0400 (EDT) Received: by mail-ot0-f199.google.com with SMTP id q4-v6so4307598ote.6 for ; Fri, 11 May 2018 12:10:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=T2SdYicBAqQ7Xy+7aZhfVu3vjJoGrXzEMV8CrhQn1RI=; b=mWxR+AmiIm9aTOI97jAM5dzi2Qi/MZKX7OMM6aiKNxfQoazJsqK6az9CVQOcz5ReuY QzeO+fFT4kyEQWjwLRCG2aLBFJutlZdZE4MmhJEDQOUoNT1kvclsVa41Cj/xOrzL0oV9 duKMbT7Z45RMnxn96Ff+1FsmYcHzkFrA2CXmF8iISp3geJr5RlNjMyj0qWYH9nw53QO+ NRlUnq/QI5KFZezUMzexpFY890GdBXr3u9dTrQWdry+IdYk1Jec0Qr0PhWQUEtoZCqti Zj+1n9xFadK2XS5bwqzlMF2xO9uF7G7HSooEvy4an89rpv6E9j9Nplrq5fheS0HGkEmn YrHA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of jean-philippe.brucker@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=jean-philippe.brucker@arm.com X-Gm-Message-State: ALKqPwdFtoTJJ5Yj4oBTnPa0Ih3A8C5onkXkGkteozoZKoNbhgK28g7d bbIBRuSJd/RNYNujpsKCqKMgxlC/SqDR3jiL5bR0WgXvRvD1Glmv+5O2LurwE8kOlkmVVzkcauK lY0ftqQqj6N9ob/JX0XZOJmp72TRsbAGXmVinfV+Q6/rG0Q4HYcIkaL9uqijRQpideg== X-Received: by 2002:a9d:29f3:: with SMTP id g48-v6mr4637229otd.315.1526065824741; Fri, 11 May 2018 12:10:24 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpgtnOASO4HmsJOZh7uobgC3ZdKgd8KAwjf+KoQ5+8pUe6TtZW7H2ihoboZ8fdd3eW7TYCn X-Received: by 2002:a9d:29f3:: with SMTP id g48-v6mr4637204otd.315.1526065824034; Fri, 11 May 2018 12:10:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526065823; cv=none; d=google.com; s=arc-20160816; b=Jpao+R+UZT1LcWJi8c3rUoadSM7DvPraVAvq/MsmkQeB/fdGN83RE2qsvVV0syJBgZ yhmC0qw495Y3m+AgsSaT9PYaW6D6sc61A7nA80JXIZW7ybB8pmoe//zvnvdYeRcFVCj/ YSNYc3HDXxZbMXAVDHkHR/8bWq9PBairDYIIQRE8gzx4OnD4YO/zYMTbbHCWvrYttaH7 8XCKhUdnVvGprtTtnrkWFgFjDbNwQ/oh8qTHdxOiFi3vluGKODFtJaPc2iPGTSY8C9Ip OeWb2N2SFylnjbIOaEMPdVhSKt54fTL7tHI2vWgTBAsLhDDx6Bdsuwc9meUJ1U9u4fbW Woxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=T2SdYicBAqQ7Xy+7aZhfVu3vjJoGrXzEMV8CrhQn1RI=; b=Enhwid4/TfDnjlfz8dWqD4q91AFsVGE2i6tYtyU5xXhpUmNoE7hbRlUPioLmdNp1Mm PM3m4TUXD4JxWg1FMro4KpUZLvJxTY3ahaHXyFiD/NN5TK11iZwh+2zTqOGdNM0RLKnc 88RR1znCKd4agpjzd9Hw7i20NUBcusYPsIDLAMOD1ziPQWvx1lgl7+Wac/ayPOeNFkvv Hp+rwQipZ+3vuE3yx7nBdQk+2EZFEYYi9VfUhJlLMy29d7Ptb6VZVCZMrQm7FwVzygkr V79QZSHC2S/JSsv0p+lcst+WFFlvb/l+OxKo7YY06wL/mq41vgM8UWNmnaD3zXk/8i3K 5eFQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of jean-philippe.brucker@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=jean-philippe.brucker@arm.com Received: from foss.arm.com (foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id e8-v6si1207391oig.238.2018.05.11.12.10.23 for ; Fri, 11 May 2018 12:10:23 -0700 (PDT) Received-SPF: pass (google.com: domain of jean-philippe.brucker@arm.com designates 217.140.101.70 as permitted sender) client-ip=217.140.101.70; Authentication-Results: mx.google.com; spf=pass (google.com: domain of jean-philippe.brucker@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=jean-philippe.brucker@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9493919BF; Fri, 11 May 2018 12:10:23 -0700 (PDT) Received: from ostrya.cambridge.arm.com (ostrya.cambridge.arm.com [10.1.210.33]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 573B73F23C; Fri, 11 May 2018 12:10:18 -0700 (PDT) From: Jean-Philippe Brucker To: linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, linux-acpi@vger.kernel.org, devicetree@vger.kernel.org, iommu@lists.linux-foundation.org, kvm@vger.kernel.org, linux-mm@kvack.org Cc: joro@8bytes.org, will.deacon@arm.com, robin.murphy@arm.com, alex.williamson@redhat.com, tn@semihalf.com, liubo95@huawei.com, thunder.leizhen@huawei.com, xieyisheng1@huawei.com, xuzaibo@huawei.com, ilias.apalodimas@linaro.org, jonathan.cameron@huawei.com, liudongdong3@huawei.com, shunyong.yang@hxt-semitech.com, nwatters@codeaurora.org, okaya@codeaurora.org, jcrouse@codeaurora.org, rfranz@cavium.com, dwmw2@infradead.org, jacob.jun.pan@linux.intel.com, yi.l.liu@intel.com, ashok.raj@intel.com, kevin.tian@intel.com, baolu.lu@linux.intel.com, robdclark@gmail.com, christian.koenig@amd.com, bharatku@xilinx.com, rgummal@xilinx.com Subject: [PATCH v2 31/40] iommu/arm-smmu-v3: Improve add_device error handling Date: Fri, 11 May 2018 20:06:32 +0100 Message-Id: <20180511190641.23008-32-jean-philippe.brucker@arm.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180511190641.23008-1-jean-philippe.brucker@arm.com> References: <20180511190641.23008-1-jean-philippe.brucker@arm.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP As add_device becomes more likely to fail when adding new features, let it clean up behind 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. Signed-off-by: Jean-Philippe Brucker --- v1->v2: new --- drivers/iommu/arm-smmu-v3.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 5d57f41f79b4..d5f3875abfb9 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -2123,26 +2123,43 @@ static int arm_smmu_add_device(struct device *dev) for (i = 0; i < fwspec->num_ids; i++) { u32 sid = fwspec->ids[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; } } master->ssid_bits = min(smmu->ssid_bits, fwspec->num_pasid_bits); + 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) @@ -2155,9 +2172,12 @@ static void arm_smmu_remove_device(struct device *dev) return; master = fwspec->iommu_priv; + if (!master) + return; + smmu = master->smmu; iopf_queue_remove_device(dev); - if (master && master->ste.assigned) + if (master->ste.assigned) arm_smmu_detach_dev(dev); iommu_group_remove_device(dev); iommu_device_unlink(&smmu->iommu, dev);