Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2174060imu; Thu, 29 Nov 2018 00:12:33 -0800 (PST) X-Google-Smtp-Source: AFSGD/VXVJqxgCT/KqDBNRDVdLS61igSwcfsH/FNvaQG0gBPsvdKyCnDXfCV5dvjz9lkR6aUma4U X-Received: by 2002:a63:c942:: with SMTP id y2mr397309pgg.331.1543479153462; Thu, 29 Nov 2018 00:12:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543479153; cv=none; d=google.com; s=arc-20160816; b=G1O1ymUrXD0RZN1/hoj7xHbeLbiQmI73T8+/DovsMqJF96iaQgG7I+mvEHx94QNkFB bHaKnwaZsaWXxxFVPFGr/swe8K/0O0g4/o9rF1MWaDAAgTt+ZWb+lLU5sEAImUUnLPsC bl+6BVytOnmS+LC28t2YlJ1md+Qr0ABIJA/BU35NIx68jeH4NZ+mvYswwAi5xBdRWYB0 56MXTF1HgWI0XTsAKweG2Qtwr4d9KHmButD68lD7hrdTzdrjJWHaHLHp+P2XVuKvASEk mPlvFbpvTXwO0/8MyrQrOGiut0IFUc96ElHXyVR/S2o0+bNfBY/fUXrlb9RpsiOCIkAk s/iw== 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=wm2vVAlQqvR81G/qmXqR4SNJkVD8CiBg+VP+BCHk/GM=; b=Ff/m9qFOGL4fA0kJuzVX/S/EjMOlAcNx5XtCiIe1GGMM+o7USIeYsJiqN58iFMPr5x VbNBGIwLdc8O2qGNz2dJGT87WbrkF/VfkkrLvcw1v/YqULomtO5Zhx3Atf4NfazG7ZRu OL7MJHRtb85FiepRyXo9Q6wJx2cf3zGaNH7ezUj1OGhWZxAdoDd7w5AIwLBWSf+BH1NB YZjirGPV9lPkWpsC9ym72g4zJI44F9ffrGVzMXZujMZ76DHxtEX3i7ya2l6Zc5+adW8j O4lViI+72sXmsqXRfcIIJoEX3Vf3MIdv926ng0LnuXOUqM9QEKZlyD0A85pfCP0d86xH poCg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z14si1114073pgj.73.2018.11.29.00.12.18; Thu, 29 Nov 2018 00:12:33 -0800 (PST) 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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728342AbeK2TPF (ORCPT + 99 others); Thu, 29 Nov 2018 14:15:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:56748 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727166AbeK2TPE (ORCPT ); Thu, 29 Nov 2018 14:15:04 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D8B7130C11FB; Thu, 29 Nov 2018 08:10:32 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-12-78.pek2.redhat.com [10.72.12.78]) by smtp.corp.redhat.com (Postfix) with ESMTP id 27F7E60CCF; Thu, 29 Nov 2018 08:10:20 +0000 (UTC) From: Lianbo Jiang To: linux-kernel@vger.kernel.org Cc: kexec@lists.infradead.org, x86@kernel.org, linux-ia64@vger.kernel.org, linux-efi@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, akpm@linux-foundation.org, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, ard.biesheuvel@linaro.org, tony.luck@intel.com, fenghua.yu@intel.com, dyoung@redhat.com, bhe@redhat.com Subject: [PATCH 1/2 v8] resource: add the new I/O resource descriptor 'IORES_DESC_RESERVED' Date: Thu, 29 Nov 2018 16:09:55 +0800 Message-Id: <20181129080956.20776-2-lijiang@redhat.com> In-Reply-To: <20181129080956.20776-1-lijiang@redhat.com> References: <20181129080956.20776-1-lijiang@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Thu, 29 Nov 2018 08:10:33 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When doing kexec_file_load, the first kernel needs to pass the e820 reserved ranges to the second kernel. But kernel can not exactly match the e820 reserved ranges when walking through the iomem resources with the descriptor 'IORES_DESC_NONE', because several e820 types( e.g. E820_TYPE_RESERVED_KERN/E820_TYPE_RAM/E820_TYPE_UNUSABLE/E820 _TYPE_RESERVED) are converted to the descriptor 'IORES_DESC_NONE'. It may pass these four types to the kdump kernel, that is not desired result. So, this patch adds a new I/O resource descriptor 'IORES_DESC_RESERVED' for the iomem resources search interfaces. It is helpful to exactly match the reserved resource ranges when walking through iomem resources. In addition, since the new descriptor 'IORES_DESC_RESERVED' is introduced, these code originally related to the descriptor 'IORES_DESC_NONE' need to be updated. Otherwise, it will be easily confused and also cause some errors. Because the 'E820_TYPE_RESERVED' type is converted to the new descriptor 'IORES_DESC_RESERVED' instead of 'IORES_DESC_NONE', it has been changed. Suggested-by: Dave Young Signed-off-by: Lianbo Jiang --- arch/ia64/kernel/efi.c | 4 ++++ arch/x86/kernel/e820.c | 2 +- arch/x86/mm/ioremap.c | 13 ++++++++++++- include/linux/ioport.h | 1 + kernel/resource.c | 6 +++--- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 8f106638913c..1841e9b4db30 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c @@ -1231,6 +1231,10 @@ efi_initialize_iomem_resources(struct resource *code_resource, break; case EFI_RESERVED_TYPE: + name = "reserved"; + desc = IORES_DESC_RESERVED; + break; + case EFI_RUNTIME_SERVICES_CODE: case EFI_RUNTIME_SERVICES_DATA: case EFI_ACPI_RECLAIM_MEMORY: diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 50895c2f937d..57fafdafb860 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -1048,10 +1048,10 @@ static unsigned long __init e820_type_to_iores_desc(struct e820_entry *entry) case E820_TYPE_NVS: return IORES_DESC_ACPI_NV_STORAGE; case E820_TYPE_PMEM: return IORES_DESC_PERSISTENT_MEMORY; case E820_TYPE_PRAM: return IORES_DESC_PERSISTENT_MEMORY_LEGACY; + case E820_TYPE_RESERVED: return IORES_DESC_RESERVED; case E820_TYPE_RESERVED_KERN: /* Fall-through: */ case E820_TYPE_RAM: /* Fall-through: */ case E820_TYPE_UNUSABLE: /* Fall-through: */ - case E820_TYPE_RESERVED: /* Fall-through: */ default: return IORES_DESC_NONE; } } diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 5378d10f1d31..fea2ef99415d 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -83,7 +83,18 @@ static bool __ioremap_check_ram(struct resource *res) static int __ioremap_check_desc_other(struct resource *res) { - return (res->desc != IORES_DESC_NONE); + /* + * But now, the 'E820_TYPE_RESERVED' type is converted to the new + * descriptor 'IORES_DESC_RESERVED' instead of 'IORES_DESC_NONE', + * it has been changed. And the value of 'mem_flags.desc_other' + * is equal to 'true' if we don't strengthen the condition in this + * function, that is wrong. Because originally it is equal to + * 'false' for the same reserved type. + * + * So, that would be nice to keep it the same as before. + */ + return ((res->desc != IORES_DESC_NONE) && + (res->desc != IORES_DESC_RESERVED)); } static int __ioremap_res_check(struct resource *res, void *arg) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..6ed59de48bd5 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -133,6 +133,7 @@ enum { IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, IORES_DESC_DEVICE_PUBLIC_MEMORY = 7, + IORES_DESC_RESERVED = 8, }; /* helpers to define resources */ diff --git a/kernel/resource.c b/kernel/resource.c index b0fbf685c77a..f34a632c4169 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -994,7 +994,7 @@ __reserve_region_with_split(struct resource *root, resource_size_t start, res->start = start; res->end = end; res->flags = type | IORESOURCE_BUSY; - res->desc = IORES_DESC_NONE; + res->desc = IORES_DESC_RESERVED; while (1) { @@ -1029,7 +1029,7 @@ __reserve_region_with_split(struct resource *root, resource_size_t start, next_res->start = conflict->end + 1; next_res->end = end; next_res->flags = type | IORESOURCE_BUSY; - next_res->desc = IORES_DESC_NONE; + next_res->desc = IORES_DESC_RESERVED; } } else { res->start = conflict->end + 1; @@ -1477,7 +1477,7 @@ static int __init reserve_setup(char *str) res->start = io_start; res->end = io_start + io_num - 1; res->flags |= IORESOURCE_BUSY; - res->desc = IORES_DESC_NONE; + res->desc = IORES_DESC_RESERVED; res->child = NULL; if (request_resource(parent, res) == 0) reserved = x+1; -- 2.17.1