Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp7142952ybi; Thu, 13 Jun 2019 10:16:28 -0700 (PDT) X-Google-Smtp-Source: APXvYqyyiZRIRNdGxbIz/cYHrLTRztxPcDR3Dnrvd0XeidebcW7yQ7Gd5zD+mNS5GRQxn9mkjdhj X-Received: by 2002:a17:902:ac82:: with SMTP id h2mr18893500plr.303.1560446188465; Thu, 13 Jun 2019 10:16:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560446188; cv=none; d=google.com; s=arc-20160816; b=EiNTML6vcameunz+HT076b/pc9YMOCyKLZ+Re0w9raQT7eMug4tYn9IBCuCG5Dqxuz xDbJVZrfOKlGG4gtjaRcdq5tK4njZcQ2fXlRSdLYCorofiUiirpBZ8Xh1c/KzsMncMit kxp/sBpdryQl/nfGhS5fm/pHdqYP8YwwzeD1Nnqa50cGQccDffrPHy18qMUxV6kAgU1j yg1vl2AURfQcG5+SK8+slOeC/WwOxz+qE8IhY6OxxvF2xKkZmfjCqSA1tp18xy+Iblqn iIzUAXO91QiK1zS20s5J9J/68a7dHE73eAn9Pw/DNtGB2/7nulIXmWh+cKLD9sxSpMLS 0Esg== 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=OG5iz7Y2otWoE83PZVl2kJS3N6qNz01B8T1Adm2jXHQ=; b=xT2bzqjer7+jJr68O8rVLFiTH1q68g/KzdTPxWPfPbaCPdV0r8grRCXU84QTRbqfqH HzhRCAVdLfOyQxa5LCjpFHjjsFdetWINUNr4UEfJgtThe8Lw7LbWgk5gEWbufnyKe1Y4 w2Y2FVznBcUAn0msyknVysb9b1YoA/1aif5Lg3McmCtptFmmO10t2dKuJVk3NWo5tETY hemaoQYtKIGbzfQvLO4D1cen5CW4L+9XAJGDO//38H0YpmdkgasNKjij/Uu7S2NlcX3u cbzCKica68IfxeJ2bM8rx53KR7q5gpeYEryiHXS1O2Lk/RbhU3GcHc5uJpxW2dxLW7WL wOlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=Arista-A header.b="Eyr/wAeo"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v14si97424pff.28.2019.06.13.10.16.13; Thu, 13 Jun 2019 10:16:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@arista.com header.s=Arista-A header.b="Eyr/wAeo"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731570AbfFMROp (ORCPT + 99 others); Thu, 13 Jun 2019 13:14:45 -0400 Received: from smtp.aristanetworks.com ([54.193.82.35]:49808 "EHLO smtp.aristanetworks.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728807AbfFLVwe (ORCPT ); Wed, 12 Jun 2019 17:52:34 -0400 Received: from smtp.aristanetworks.com (localhost [127.0.0.1]) by smtp.aristanetworks.com (Postfix) with ESMTP id E69DE214A72B; Wed, 12 Jun 2019 14:52:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=Arista-A; t=1560376353; bh=OG5iz7Y2otWoE83PZVl2kJS3N6qNz01B8T1Adm2jXHQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Eyr/wAeoK9oS57pbm2+3BOtbbq9ZcYEq8NTwlBHmtxp5kR2Xw1yyWgIjpwFekfqy1 i54LicM69uDC64/MWOpSEnv/RHnKekQm4l6Ff02U1vo7M/T3AhkclLHgfgkMI+96mw LQShjlhxZHbZ285shI3c13IJN/ecd/zRcpqUXhHyhpiHnfy6eXMc4jtBQJUzAZLOMp A9f1EIH98pZ8wnwl53Uy+MS4+mA+VGknSGO7NZBd4CB7qsOXiF500JKoZtCfjoe35r H0m651wXd86K5jlr4NnqnynU9L8HgiWSBXsO7RgVJe55q/m3damBbMrA01i9aINeNp Iys9ZOYrnSRzA== Received: from chmeee (unknown [10.80.4.152]) by smtp.aristanetworks.com (Postfix) with ESMTP id DD5203180B64; Wed, 12 Jun 2019 14:52:33 -0700 (PDT) Received: from kevmitch by chmeee with local (Exim 4.92) (envelope-from ) id 1hbBAX-0003KL-OA; Wed, 12 Jun 2019 14:52:33 -0700 From: Kevin Mitchell To: Joerg Roedel Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Kevin Mitchell Subject: [PATCH 3/3] iommu/amd: only free resources once on init error Date: Wed, 12 Jun 2019 14:52:05 -0700 Message-Id: <20190612215203.12711-4-kevmitch@arista.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190612215203.12711-1-kevmitch@arista.com> References: <20190612215203.12711-1-kevmitch@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When amd_iommu=off was specified on the command line, free_X_resources functions were called immediately after early_amd_iommu_init. They were then called again when amd_iommu_init also failed (as expected). Instead, call them only once: at the end of state_next() whenever there's an error. These functions should be safe to call any time and any number of times. However, since state_next is never called again in an error state, the cleanup will only ever be run once. This also ensures that cleanup code is run as soon as possible after an error is detected rather than waiting for amd_iommu_init() to be called. Signed-off-by: Kevin Mitchell --- drivers/iommu/amd_iommu_init.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 5f3df5ae6ba8..24fc060fe596 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -2638,8 +2638,6 @@ static int __init state_next(void) init_state = ret ? IOMMU_INIT_ERROR : IOMMU_ACPI_FINISHED; if (init_state == IOMMU_ACPI_FINISHED && amd_iommu_disabled) { pr_info("AMD IOMMU disabled on kernel command-line\n"); - free_dma_resources(); - free_iommu_resources(); init_state = IOMMU_CMDLINE_DISABLED; ret = -EINVAL; } @@ -2680,6 +2678,19 @@ static int __init state_next(void) BUG(); } + if (ret) { + free_dma_resources(); + if (!irq_remapping_enabled) { + disable_iommus(); + free_iommu_resources(); + } else { + struct amd_iommu *iommu; + + uninit_device_table_dma(); + for_each_iommu(iommu) + iommu_flush_all_caches(iommu); + } + } return ret; } @@ -2753,18 +2764,6 @@ static int __init amd_iommu_init(void) int ret; ret = iommu_go_to_state(IOMMU_INITIALIZED); - if (ret) { - free_dma_resources(); - if (!irq_remapping_enabled) { - disable_iommus(); - free_iommu_resources(); - } else { - uninit_device_table_dma(); - for_each_iommu(iommu) - iommu_flush_all_caches(iommu); - } - } - #ifdef CONFIG_GART_IOMMU if (ret && list_empty(&amd_iommu_list)) { /* -- 2.20.1