Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp5352392ybi; Tue, 28 May 2019 11:32:57 -0700 (PDT) X-Google-Smtp-Source: APXvYqxXodRrcVzUsJ2cvuKyiDnTSeZI3U9SOuZa5TjejCb+A+VfmSz88rAxOHz+F5gjbbrTn+g/ X-Received: by 2002:a63:6f0b:: with SMTP id k11mr133179747pgc.342.1559068376999; Tue, 28 May 2019 11:32:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559068376; cv=none; d=google.com; s=arc-20160816; b=ylBpQkrpVbAFqgqApMTy1X0wpJ/52JM1GE0jV2PytlflxtzLHU6jivC3ayJIS9fzZo ycDppwu8Q8kD2wRa0hHl2PoT/kJYO8KMeZARfSFTDCQUQjpVORrpG8zVNspZQHfo+1wu Kva9MPEQyyQYFgXJvvgL/gwHCbkalVB0iugHGdaOA5tCLQfpVob0OjABMEvvvQ+yx6wU 4a54iSJKNZajmbig7K/dZd3OvpigUjGFKK/9vk34j6KEKx4tLEik38co6SjvnKsmr1Cx hRXsbhP1pik2R7m50awNryeaxTKFf/X6wPWAK4poa6+vKVjYTh5WgQXTsRzyVRJVi1t/ 7gOw== 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=r1eVY12yl6CS69hv1hn4KNT/KvLDnI0AG2W0rzhxRE3XYbB9PcnUNr2qQgOEC0CxrF hr1+UgRIy/6Cg6+pS+nwa3syvcrNmyWrW+6O/vSP5qQ4mKiH48fiHM9fxRkObH54JH/1 7WxlF+NQgsCu6HfsSYfjd371t+/nEKdbWunZHxzXak3gbqvGohIjS3CmtsWK4PdmsgG1 zJ148Xkg82P6L5QaM25cVryaJjia8jHRHREyIUSlHFNcfG38kqGN088/CrZRSs5yYkMq b3zCRpvRy7NaBypu8yGV+K8kdpNEs0yy+VbhhaTfSwhpmpdAMXRIgQD/b6BFToYaFaLO j22Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=Arista-A header.b="be/t+vff"; 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 s1si4288629pjb.23.2019.05.28.11.32.40; Tue, 28 May 2019 11:32:56 -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="be/t+vff"; 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 S1728191AbfE1SaG (ORCPT + 99 others); Tue, 28 May 2019 14:30:06 -0400 Received: from smtp.aristanetworks.com ([54.193.82.35]:38984 "EHLO uscaw2-clmxp01.aristanetworks.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728180AbfE1SaD (ORCPT ); Tue, 28 May 2019 14:30:03 -0400 Received: from uscaw2-clmxp01.aristanetworks.com (localhost [127.0.0.1]) by uscaw2-clmxp01.aristanetworks.com (Postfix) with ESMTP id 723F221459D6; Tue, 28 May 2019 11:30:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=Arista-A; t=1559068203; bh=OG5iz7Y2otWoE83PZVl2kJS3N6qNz01B8T1Adm2jXHQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=be/t+vffeui5H702naDf64viw7wYSRkAX3enYHSh0h3DCUNHfUoYP0Rjgh2s4QY4t I6Q96NmEyXjDFQZb2sHxP1IOAMuSYNU/PycHnluMgO728gPcP1FzjHhQ1yFci4GHav LxJC6BkStaU++vFGNuoASIrqCx0PMXUnSnC7PIS+hc1ZVxIavjrR/v0ZSQtCtiUxX8 4DTwduKeQeit5mUZyRD88mESQEnCRMtp6SKAtx8/gyxPV0k6ImFNu/VPrkzO6mYuP1 HDBMaEixxPP1zDuC697hkXkKxvQFTSW5rSo87mJroVursmhyKQhIVnb9NX4d77TTlV aF8DVcsZWst/g== Received: from chmeee (unknown [10.95.80.198]) by uscaw2-clmxp01.aristanetworks.com (Postfix) with ESMTP id 69A8F3134185; Tue, 28 May 2019 11:30:03 -0700 (PDT) Received: from kevmitch by chmeee with local (Exim 4.92) (envelope-from ) id 1hVgrK-0000xV-UI; Tue, 28 May 2019 11:30:02 -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: Tue, 28 May 2019 11:29:58 -0700 Message-Id: <20190528182958.3623-4-kevmitch@arista.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190528182958.3623-1-kevmitch@arista.com> References: <20190528182958.3623-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