Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp16075071ybl; Tue, 31 Dec 2019 21:07:45 -0800 (PST) X-Google-Smtp-Source: APXvYqwTtYwArW45YqnnazAUBt3ZdLe+UbPSAYcYY4pzc0Hryr88H59H3Dqlsu0/BhmIkDhFvdsJ X-Received: by 2002:a05:6402:355:: with SMTP id r21mr80422598edw.60.1577855265054; Tue, 31 Dec 2019 21:07:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577855265; cv=none; d=google.com; s=arc-20160816; b=TV2iD6PFsJ9dv5+AZ2AafotkPu+WoDTxhzmL0h6osEJRANxqArCsvcOPeZkhl0hnag gzMK0h+SABpWbvjSmn4byXdy8netp3A4ReChzae/Rk2YX4RK8B/Gsows3f/LjI3UD5Pu czHu8PZ0eu/Z6dchQGwjqfvke272zxRWtJZ6Jyuv2TO7PCwG8F8nzsz+0CML67mBwkMz H9HMvE8K1Jhec0dP/elBCRIYSan8PtE1DQFgOnuHu4OPkBxgtUUDGUgiXi/uMgGiCs/h SK8CsU8b2TWHXTajHv+Gzp2KaVFAyImKIp/TqGXYkoZSnO7Wka5XAZebr1MF9PTrDSuk P/Aw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=eOPNXB6Xk/9bMW2uOkkU+s8IZY30ZYawh5JZf1y2MIo=; b=EdWw+GEifahdW+ihnnED6cf4CsghSpWDFX9HRK/WoW7FiopjyMvYtYcYtoM5aEDLMq fzt+uDWCNsTFDFIlfNLJvdORRQR750Swuga521FPzYoNn2DzdgVK2qi2g9JbWrgbg860 m/ijf50I8a7DTf9LOoZh9yNT1uD2XEiKOFPDjlqROY4RYzcZaLXuld4ND0B+2nJQYjWt 1pDsGlnbSZpyqfvPlAp0NQGC8WJSHnzuDu4P5xBEeMBwQ8VW2dh+rgjNdI8ahTl9JvE4 bWoodsFrxVXsDwfarN6Ao8t8z1c4SIj0wpjudjuTG+osDHNiAEfqeAR/gR5hHn0CBOvr eLSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel-com.20150623.gappssmtp.com header.s=20150623 header.b=JOVHi6tq; 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m23si30135719edp.211.2019.12.31.21.07.08; Tue, 31 Dec 2019 21:07:45 -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; dkim=pass header.i=@intel-com.20150623.gappssmtp.com header.s=20150623 header.b=JOVHi6tq; 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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725876AbgAAFFA (ORCPT + 99 others); Wed, 1 Jan 2020 00:05:00 -0500 Received: from mail-oi1-f193.google.com ([209.85.167.193]:39788 "EHLO mail-oi1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725765AbgAAFFA (ORCPT ); Wed, 1 Jan 2020 00:05:00 -0500 Received: by mail-oi1-f193.google.com with SMTP id a67so12375506oib.6 for ; Tue, 31 Dec 2019 21:05:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=eOPNXB6Xk/9bMW2uOkkU+s8IZY30ZYawh5JZf1y2MIo=; b=JOVHi6tqb1rlBNhPbFm9/EEa5MJto3/i/WyNI0+4nYE4wpjHIhXajOPXthUsvX6/f1 D9pPf1QaZczjBgWkBb9l7MlflvcqQ3838uhdJ6JDfCKLsnqRaW8taEBmgQkxy4uoHr9M 9pm1AtwOrFLpdpqv0U+zWStXwlwGsArzSI76T51MGHBYYmIEcuqLXN5bCTvynMPRA/qr roAAOKM4f5zkT+6GoPGxqivOq8pFBT9V1lJ/DfauIb79aW5xsM41GGBAVUDRoIUlRFnb MEOBNtwCkBl9oPw6qyMEJYBkIPE30rKP7m63syzGlcGTQszVvmgunv73cTfrVCZFCUxp ibpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=eOPNXB6Xk/9bMW2uOkkU+s8IZY30ZYawh5JZf1y2MIo=; b=GO3/PVUif/ndSG2+gONVLbO5MwVskX1xcP5Ryuct9Y+DklR1REQU/OOQa5Gx9mAcYo XjLtANAe6wrLmbUKEwPrszDsrZgWamglCzTeeq/0ZmyslXFgaSmeQ9RxMGXeaDzMqaBJ dbQ7199Dgkb4ktkrR6qwVaAvAXLLbMEHbIW44lR+T1KAq/Nn1nteTNhQzIom0NOfHEZN Qf/Wae+WDytaXSm8+drQ5UC7DLnd65I7KRFrWB/2HwEGFNnskM94EGaF/226Gun5F1X/ LyQP4Ha87IrMZU631KM6/H5H7QFD/Kj0BCHszjyzHgTsxGEfsdQpfkGWoh1aNC4GAqrC iFDQ== X-Gm-Message-State: APjAAAVUDW+p6f7jxoyRdAKRC0wIlb21Pv5mJDIf1agIW77TWGGU7jdx 2XEZfTGOkmac+mNph2KXnvRt7quoBt4AGgib4lTh3w== X-Received: by 2002:a05:6808:a83:: with SMTP id q3mr1870737oij.0.1577855099505; Tue, 31 Dec 2019 21:04:59 -0800 (PST) MIME-Version: 1.0 References: <157782985777.367056.14741265874314204783.stgit@dwillia2-desk3.amr.corp.intel.com> <157782987865.367056.15199592105978588123.stgit@dwillia2-desk3.amr.corp.intel.com> <20200101045141.GA15155@dhcp-128-65.nay.redhat.com> In-Reply-To: <20200101045141.GA15155@dhcp-128-65.nay.redhat.com> From: Dan Williams Date: Tue, 31 Dec 2019 21:04:48 -0800 Message-ID: Subject: Re: [PATCH v2 4/4] efi: Fix handling of multiple efi_fake_mem= entries To: Dave Young Cc: Ingo Molnar , Taku Izumi , Michael Weiser , Ard Biesheuvel , Thomas Gleixner , Ingo Molnar , Linux Kernel Mailing List , linux-efi , kexec@lists.infradead.org, X86 ML Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Dec 31, 2019 at 8:52 PM Dave Young wrote: > > Hi Dan, > On 12/31/19 at 02:04pm, Dan Williams wrote: > > Dave noticed that when specifying multiple efi_fake_mem= entries only > > the last entry was successfully being reflected in the efi memory map. > > This is due to the fact that the efi_memmap_insert() is being called > > multiple times, but on successive invocations the insertion should be > > applied to the last new memmap rather than the original map at > > efi_fake_memmap() entry. > > > > Rework efi_fake_memmap() to install the new memory map after each > > efi_fake_mem= entry is parsed. > > > > This also fixes an issue in efi_fake_memmap() that caused it to litter > > emtpy entries into the end of the efi memory map. The empty entry causes > > efi_memmap_insert() to attempt more memmap splits / copies than > > efi_memmap_split_count() accounted for when sizing the new map. > > > > BUG: unable to handle page fault for address: ffffffffff281000 > > [..] > > RIP: 0010:efi_memmap_insert+0x11d/0x191 > > [..] > > Call Trace: > > ? bgrt_init+0xbe/0xbe > > ? efi_arch_mem_reserve+0x1cb/0x228 > > ? acpi_parse_bgrt+0xa/0xd > > ? acpi_table_parse+0x86/0xb8 > > ? acpi_boot_init+0x494/0x4e3 > > ? acpi_parse_x2apic+0x87/0x87 > > ? setup_acpi_sci+0xa2/0xa2 > > ? setup_arch+0x8db/0x9e1 > > ? start_kernel+0x6a/0x547 > > ? secondary_startup_64+0xb6/0xc0 > > > > Commit af1648984828 "x86/efi: Update e820 with reserved EFI boot > > services data to fix kexec breakage" is listed in Fixes: since it > > introduces more occurrences where efi_memmap_insert() is invoked after > > an efi_fake_mem= configuration has been parsed. Previously the side > > effects of vestigial empty entries were benign, but with commit > > af1648984828 that follow-on efi_memmap_insert() invocation triggers the > > above crash signature. > > > > Fixes: 0f96a99dab36 ("efi: Add 'efi_fake_mem' boot option") > > Fixes: af1648984828 ("x86/efi: Update e820 with reserved EFI boot services...") > > Link: https://lore.kernel.org/r/20191231014630.GA24942@dhcp-128-65.nay.redhat.com > > Reported-by: Dave Young > > Cc: Taku Izumi > > Cc: Michael Weiser > > Cc: Ard Biesheuvel > > Cc: Thomas Gleixner > > Cc: Ingo Molnar > > Signed-off-by: Dan Williams > > --- > > drivers/firmware/efi/fake_mem.c | 32 +++++++++++++++++--------------- > > drivers/firmware/efi/memmap.c | 2 +- > > include/linux/efi.h | 2 ++ > > 3 files changed, 20 insertions(+), 16 deletions(-) > > > > diff --git a/drivers/firmware/efi/fake_mem.c b/drivers/firmware/efi/fake_mem.c > > index 7e53e5520548..68d752d8af21 100644 > > --- a/drivers/firmware/efi/fake_mem.c > > +++ b/drivers/firmware/efi/fake_mem.c > > @@ -34,26 +34,17 @@ static int __init cmp_fake_mem(const void *x1, const void *x2) > > return 0; > > } > > > > -void __init efi_fake_memmap(void) > > +static void __init efi_fake_range(struct efi_mem_range *efi_range) > > { > > int new_nr_map = efi.memmap.nr_map; > > efi_memory_desc_t *md; > > phys_addr_t new_memmap_phy; > > unsigned long flags = 0; > > void *new_memmap; > > - int i; > > - > > - if (!efi_enabled(EFI_MEMMAP) || !nr_fake_mem) > > - return; > > > > /* count up the number of EFI memory descriptor */ > > - for (i = 0; i < nr_fake_mem; i++) { > > - for_each_efi_memory_desc(md) { > > - struct range *r = &efi_fake_mems[i].range; > > - > > - new_nr_map += efi_memmap_split_count(md, r); > > - } > > - } > > + for_each_efi_memory_desc(md) > > + new_nr_map += efi_memmap_split_count(md, &efi_range->range); > > I have another concern here :( > > THe efi_memmap_split_count mean to only split for a specific md, and you > can see arch/x86/platform/efi/quirks.c about the use: > if (addr + size > md.phys_addr + (md.num_pages << EFI_PAGE_SHIFT)) { > pr_err("Region spans EFI memory descriptors, %pa\n", &addr); > return; > } > > Any memory region to be inserted but spans different md will be > rejected. So the memmap insert logic seems does not support the > spanned ranges. I did not find a case two contiguous same type ranges > eg. two "Conventional memory", if have they should have been merged. > > So maybe just use same way as the quirks.c here to find the valid md first > then get the split count? I don't immediately see why it would be a problem to just let the md loop that efi_fake_memmap() performs try to split multiple entries. It may end up with more splits than necessary in which case we'll need that piece from my original patch to clean those up. Thanks for the heads up, I'll give it a try and see what shakes out. Are you seeing any misbehavior on your end? > > Otherwise I tested the series bootup test passed. > > BTW, another issue about fakemem, currently it only works with normal > physical boot, in case of kexec reboot the kernel only aware of EFI > runtime memory ranges, we do not pass other types in memmap. But maybe > we can live with it considering fake mem is only for debugging purpose. Does kexec preserve iomem? I.e. as long as the initial translation of efi entries to e820, and resulting resource tree, is preserved by successive kexec cycles then I think we're ok.