From: Laszlo Ersek <lersek@redhat.com>
To: Matt Fleming <matt@console-pimps.org>
Cc: jerry.hoemann@hp.com, Andrew Fish <afish@apple.com>,
edk2-devel@lists.sourceforge.net, linux-efi@vger.kernel.org,
Gleb Natapov <gleb@redhat.com>,
lkml <linux-kernel@vger.kernel.org>,
David Woodhouse <dwmw2@infradead.org>,
Matthew Garrett <mjg59@srcf.ucam.org>,
Brian Richardson <brian.richardson@intel.com>,
Colin Ian King <colin.king@canonical.com>,
Randy Wright <rwright@hp.com>,
Linn Crosetto <linn.crosetto@hp.com>,
terry.lee@hp.com, samer.el-haj-mahmoud@hp.com,
randy.pawell@hp.com, chrisp@hp.com, linda.knippers@hp.com,
dong.wei@hp.com, "H. Peter Anvin" <hpa@zytor.com>,
Borislav Petkov <bp@alien8.de>,
Josh Triplett <josh@joshtriplett.org>,
Chao Zhang <chao.b.zhang@intel.com>,
Yao Jiewen <jiewen.yao@intel.com>
Subject: Re: [edk2] Corrupted EFI region
Date: Mon, 16 Sep 2013 13:50:46 +0200 [thread overview]
Message-ID: <5236F096.8040702@redhat.com> (raw)
In-Reply-To: <20130916105920.GB2697@console-pimps.org>
On 09/16/13 12:59, Matt Fleming wrote:
> On Fri, 13 Sep, at 02:38:12PM, jerry.hoemann@hp.com wrote:
>> Matt,
>>
>> We have hit an issue on our new platform in development related to the
>> call of efi_reserve_boot_services() from setup_arch().
>>
>> The reservation can interfere with allocation of the crash kernel.
>
> Jerry, thanks for bringing this up.
>
>> In pre 3.9(?) kernels, the crash kernel is required to be allocated from
>> physically contiguous memory below 896 MB.
>>
>> Our new platforms are large in both the amount of memory and the amount
>> of IO. This requires large crash kernels for kdump to work. This is even
>> after the work done for makedumpfile v 1.5 to allow it to work with a
>> smaller foot print.
>>
>>
>> One of the problems is that drivers will allocate memory as boot code and/or
>> data in the region < 896 that effectively fragments this memory.
>> With the reservation, we can't reuse the memory when needed for the
>> crash kernels. If we remove the reservation and allow the kernel
>> to reuse the memory, we the reservation of the crash kernel succeeds.
>>
>> This is definitely a problem for distros that are pre 3.9. Probably less
>> so for top of tree, but i haven't been focused there.
>>
>> So we are definitely interested in finding a mechanism to not
>> do this reservation on platforms that don't have the issues described
>> earlier in this thread.
>
> OK, in an ideal world we'd move the crash kernel reservation after
> efi_free_boot_services(), because at that point the boot regions are
> available again. But it seems that we reserve the boot regions really
> early during startup and release them relatively late. The reason is
> that the Boot Graphics Resource Table (BGRT) data, if present, is
> located in the Boot Services Data regions but we can't extract the
> address of the region from the ACPI tables until we've setup the ACPI
> subsystem, which happens quite late.
Why is BGRT allocated as Boot Services Data?
In file
"MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.c":
InstallBootGraphicsResourceTable()
BgrtAllocateBsDataMemoryBelow4G()
gBS->AllocatePages(... EfiBootServicesData ...)
>From Table 25. Memory Type Usage before ExitBootServices():
EfiBootServicesData -- The data portions of a loaded Boot Services
Driver, and the default data allocation type
used by a Boot Services Driver to allocate
pool memory.
EfiACPIReclaimMemory -- Memory that holds the ACPI tables.
>From Table 26. Memory Type Usage after ExitBootServices():
EfiBootServicesData -- Memory available for general use.
EfiACPIReclaimMemory -- This memory is to be preserved by the loader
and OS until ACPI is enabled. Once ACPI is
enabled, the memory in this range is available
for general use.
I thought that anything referenced by a pointer in any ACPI table was
EfiACPIReclaimMemory or stricter. Specifically, the RSDT or XSDT points
to BGRT, so BGRT is EfiACPIReclaimMemory. BGRT points to the image data
(with its Image Address field), hence the image data should be
EfiACPIReclaimMemory too.
Otherwise, the pointer (BGRT.ImageAddress) can outlive the pointed-to
storage (the image data).
The image data sounds to me like textbook example for
EfiACPIReclaimMemory. This way the kernel could free Boot Services Data
early, perform the crash kernel reservation right after, and safely
access BGRT whenever the ACPI subsystem is brought up later.
The edk2 commit that flipped the memory type underneath the image data
from EfiReservedMemoryType to EfiBootServicesData is:
https://github.com/tianocore/edk2/commit/4c58575e
I think this commit is wrong. It's fine for OSPM to release the image
data at some point, but not right after ExitBootServices(), because
referencing pointers in ACPI tables survive strictly longer.
... Actually, the commit does follow the ACPI spec 5.0:
5.2.22.4 Image Address
The Image Address contains the location in memory where an
in-memory copy of the boot image can be found. The image should be
stored in EfiBootServicesData, allowing the system to reclaim
the memory when the image is no longer needed.
The ACPI spec 5.0 should recommend EfiACPIReclaimMemory here IMO. (I
take the current wording ("should be stored") as a recommendation only.)
If that's in fact a recommendation (and not a hard requirement), then it
should be easy to change BgrtAllocateBsDataMemoryBelow4G() again.
Thanks,
Laszlo
next prev parent reply other threads:[~2013-09-16 11:49 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-31 20:54 Corrupted EFI region Borislav Petkov
2013-07-31 20:58 ` Matthew Garrett
2013-07-31 21:51 ` Borislav Petkov
2013-07-31 21:54 ` Matthew Garrett
2013-08-01 16:51 ` Borislav Petkov
2013-07-31 21:55 ` David Woodhouse
2013-08-01 16:49 ` Borislav Petkov
2013-08-05 11:27 ` [edk2] " Laszlo Ersek
2013-08-05 13:02 ` Borislav Petkov
2013-08-05 13:39 ` Laszlo Ersek
2013-08-05 14:03 ` Borislav Petkov
2013-08-05 14:27 ` Laszlo Ersek
2013-08-05 14:40 ` Borislav Petkov
2013-08-05 15:15 ` Laszlo Ersek
2013-08-05 15:34 ` James Bottomley
2013-08-05 16:27 ` Laszlo Ersek
2013-08-05 16:12 ` Borislav Petkov
2013-08-05 16:41 ` Laszlo Ersek
2013-08-05 16:47 ` Borislav Petkov
2013-08-05 17:00 ` Kinney, Michael D
2013-08-05 17:09 ` Laszlo Ersek
2013-08-05 21:26 ` Laszlo Ersek
2013-08-05 22:08 ` Borislav Petkov
2013-08-06 14:10 ` Borislav Petkov
2013-08-06 15:31 ` Laszlo Ersek
2013-08-07 15:19 ` Borislav Petkov
2013-08-07 17:23 ` Andrew Fish
2013-08-07 20:19 ` Matt Fleming
2013-08-07 20:24 ` Matt Fleming
2013-08-07 21:10 ` Andrew Fish
2013-08-07 21:23 ` Matthew Garrett
2013-08-08 10:17 ` Matt Fleming
2013-08-08 13:46 ` Andrew Fish
2013-09-02 8:19 ` Matt Fleming
2013-09-13 20:38 ` jerry.hoemann
2013-09-16 10:59 ` Matt Fleming
2013-09-16 11:50 ` Laszlo Ersek [this message]
2013-09-16 15:57 ` Josh Triplett
2013-09-16 16:25 ` Laszlo Ersek
2013-09-16 16:27 ` Matthew Garrett
2013-09-16 16:29 ` Josh Triplett
2013-09-18 19:24 ` jerry.hoemann
2013-09-20 9:06 ` Matt Fleming
2013-08-07 17:49 ` Laszlo Ersek
2013-08-08 15:02 ` Borislav Petkov
2013-08-08 21:45 ` Brian J. Johnson
2013-08-18 7:33 ` Jordan Justen
2013-08-05 15:50 ` Andrew Fish
2013-08-05 18:12 ` Borislav Petkov
2013-08-05 21:37 ` H. Peter Anvin
2013-08-05 21:41 ` Borislav Petkov
2013-08-05 21:49 ` H. Peter Anvin
2013-08-05 21:55 ` Laszlo Ersek
2013-08-05 22:52 ` James Bottomley
2013-08-06 7:26 ` Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5236F096.8040702@redhat.com \
--to=lersek@redhat.com \
--cc=afish@apple.com \
--cc=bp@alien8.de \
--cc=brian.richardson@intel.com \
--cc=chao.b.zhang@intel.com \
--cc=chrisp@hp.com \
--cc=colin.king@canonical.com \
--cc=dong.wei@hp.com \
--cc=dwmw2@infradead.org \
--cc=edk2-devel@lists.sourceforge.net \
--cc=gleb@redhat.com \
--cc=hpa@zytor.com \
--cc=jerry.hoemann@hp.com \
--cc=jiewen.yao@intel.com \
--cc=josh@joshtriplett.org \
--cc=linda.knippers@hp.com \
--cc=linn.crosetto@hp.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@console-pimps.org \
--cc=mjg59@srcf.ucam.org \
--cc=randy.pawell@hp.com \
--cc=rwright@hp.com \
--cc=samer.el-haj-mahmoud@hp.com \
--cc=terry.lee@hp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox