diff mbox

[RESEND] ACPI/Kconfig: Make ACPI_NFIT depend on EFI_STUB on X86

Message ID 1450198746-14161-1-git-send-email-toshi.kani@hpe.com (mailing list archive)
State Superseded
Headers show

Commit Message

Kani, Toshi Dec. 15, 2015, 4:59 p.m. UTC
ACPI 6.0 defines NFIT table and new persistent memory types for
EFI memory table (EFI_PERSISTENT_MEMORY) and e820 table (E820_PMEM).

setup_e820() enabled by EFI_STUB converts EFI_PERSISTENT_MEMORY to
E820_PMEM for the e820_map table on x86 EFI platforms.  When EFI_STUB
is disabled, x86 kernels rely on the bootloader to perform this
conversion.

It was found that the upstream grub bootloader since 2012 has a bug
that converts EFI_PERSISTENT_MEMORY (or any new type) to E820_RAM,
which causes the kernel to use persistent memory ranges as regular
memory and corrupts the data in NVDIMM.

Therefore, this patch sets ACPI_NFIT to depend on EFI_STUB on x86.
This assures that ACPI_NFIT kernels are self-contained and are
protected from the upstream grub bug on x86.

Note, X86_PMEM_LEGACY allows the kernel to use the pmem driver on
pre-ACPI 6.0 platforms, and does not require ACPI_NFIT enabled.

References: http://www.mail-archive.com/grub-devel@gnu.org/msg23961.html
Reported-by: Robert Elliott <elliott@hpe.com>
Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Dan Williams <dan.j.williams@intel.com>
---
 drivers/acpi/Kconfig |    1 +
 1 file changed, 1 insertion(+)

Comments

Dan Williams Dec. 15, 2015, 5:21 p.m. UTC | #1
On Tue, Dec 15, 2015 at 8:59 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> ACPI 6.0 defines NFIT table and new persistent memory types for
> EFI memory table (EFI_PERSISTENT_MEMORY) and e820 table (E820_PMEM).
>
> setup_e820() enabled by EFI_STUB converts EFI_PERSISTENT_MEMORY to
> E820_PMEM for the e820_map table on x86 EFI platforms.  When EFI_STUB
> is disabled, x86 kernels rely on the bootloader to perform this
> conversion.
>
> It was found that the upstream grub bootloader since 2012 has a bug
> that converts EFI_PERSISTENT_MEMORY (or any new type) to E820_RAM,
> which causes the kernel to use persistent memory ranges as regular
> memory and corrupts the data in NVDIMM.
>
> Therefore, this patch sets ACPI_NFIT to depend on EFI_STUB on x86.
> This assures that ACPI_NFIT kernels are self-contained and are
> protected from the upstream grub bug on x86.
>
> Note, X86_PMEM_LEGACY allows the kernel to use the pmem driver on
> pre-ACPI 6.0 platforms, and does not require ACPI_NFIT enabled.
>
> References: http://www.mail-archive.com/grub-devel@gnu.org/msg23961.html
> Reported-by: Robert Elliott <elliott@hpe.com>
> Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> Cc: Dan Williams <dan.j.williams@intel.com>
> ---
>  drivers/acpi/Kconfig |    1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> index 5eef4cb..5368baa 100644
> --- a/drivers/acpi/Kconfig
> +++ b/drivers/acpi/Kconfig
> @@ -441,6 +441,7 @@ config ACPI_NFIT
>         depends on PHYS_ADDR_T_64BIT
>         depends on BLK_DEV
>         depends on ARCH_HAS_MMIO_FLUSH
> +       depends on !X86 || (X86 && EFI_STUB)
>         select LIBNVDIMM
>         help
>           Infrastructure to probe ACPI 6 compliant platforms for

This seems wrong to me.

In general Kconfig "depends on" are only about compile-time code
dependency, not about working around random bugs in external projects.
Kani, Toshi Dec. 15, 2015, 5:49 p.m. UTC | #2
On Tue, 2015-12-15 at 09:21 -0800, Dan Williams wrote:
> On Tue, Dec 15, 2015 at 8:59 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> > ACPI 6.0 defines NFIT table and new persistent memory types for
> > EFI memory table (EFI_PERSISTENT_MEMORY) and e820 table (E820_PMEM).
> > 
> > setup_e820() enabled by EFI_STUB converts EFI_PERSISTENT_MEMORY to
> > E820_PMEM for the e820_map table on x86 EFI platforms.  When EFI_STUB
> > is disabled, x86 kernels rely on the bootloader to perform this
> > conversion.
> > 
> > It was found that the upstream grub bootloader since 2012 has a bug
> > that converts EFI_PERSISTENT_MEMORY (or any new type) to E820_RAM,
> > which causes the kernel to use persistent memory ranges as regular
> > memory and corrupts the data in NVDIMM.
> > 
> > Therefore, this patch sets ACPI_NFIT to depend on EFI_STUB on x86.
> > This assures that ACPI_NFIT kernels are self-contained and are
> > protected from the upstream grub bug on x86.
> > 
> > Note, X86_PMEM_LEGACY allows the kernel to use the pmem driver on
> > pre-ACPI 6.0 platforms, and does not require ACPI_NFIT enabled.
> > 
> > References: 
> > http://www.mail-archive.com/grub-devel@gnu.org/msg23961.html
> > Reported-by: Robert Elliott <elliott@hpe.com>
> > Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
> > Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> > Cc: Dan Williams <dan.j.williams@intel.com>
> > ---
> >  drivers/acpi/Kconfig |    1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> > index 5eef4cb..5368baa 100644
> > --- a/drivers/acpi/Kconfig
> > +++ b/drivers/acpi/Kconfig
> > @@ -441,6 +441,7 @@ config ACPI_NFIT
> >         depends on PHYS_ADDR_T_64BIT
> >         depends on BLK_DEV
> >         depends on ARCH_HAS_MMIO_FLUSH
> > +       depends on !X86 || (X86 && EFI_STUB)
> >         select LIBNVDIMM
> >         help
> >           Infrastructure to probe ACPI 6 compliant platforms for
> 
> This seems wrong to me.
> 
> In general Kconfig "depends on" are only about compile-time code
> dependency, not about working around random bugs in external projects.

I agree that they do not have a compile dependency, and it looks rather
odd.  On the other hand, proper support of the ACPI NFIT extensions has a
functional dependency to setup_e820() as this is the only code that can
handle the EFI_PERSISTENT_MEMORY type today.

Thanks,
-Toshi
Dan Williams Dec. 15, 2015, 5:53 p.m. UTC | #3
On Tue, Dec 15, 2015 at 9:49 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> On Tue, 2015-12-15 at 09:21 -0800, Dan Williams wrote:
>> On Tue, Dec 15, 2015 at 8:59 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
>> > ACPI 6.0 defines NFIT table and new persistent memory types for
>> > EFI memory table (EFI_PERSISTENT_MEMORY) and e820 table (E820_PMEM).
>> >
>> > setup_e820() enabled by EFI_STUB converts EFI_PERSISTENT_MEMORY to
>> > E820_PMEM for the e820_map table on x86 EFI platforms.  When EFI_STUB
>> > is disabled, x86 kernels rely on the bootloader to perform this
>> > conversion.
>> >
>> > It was found that the upstream grub bootloader since 2012 has a bug
>> > that converts EFI_PERSISTENT_MEMORY (or any new type) to E820_RAM,
>> > which causes the kernel to use persistent memory ranges as regular
>> > memory and corrupts the data in NVDIMM.
>> >
>> > Therefore, this patch sets ACPI_NFIT to depend on EFI_STUB on x86.
>> > This assures that ACPI_NFIT kernels are self-contained and are
>> > protected from the upstream grub bug on x86.
>> >
>> > Note, X86_PMEM_LEGACY allows the kernel to use the pmem driver on
>> > pre-ACPI 6.0 platforms, and does not require ACPI_NFIT enabled.
>> >
>> > References:
>> > http://www.mail-archive.com/grub-devel@gnu.org/msg23961.html
>> > Reported-by: Robert Elliott <elliott@hpe.com>
>> > Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
>> > Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
>> > Cc: Dan Williams <dan.j.williams@intel.com>
>> > ---
>> >  drivers/acpi/Kconfig |    1 +
>> >  1 file changed, 1 insertion(+)
>> >
>> > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
>> > index 5eef4cb..5368baa 100644
>> > --- a/drivers/acpi/Kconfig
>> > +++ b/drivers/acpi/Kconfig
>> > @@ -441,6 +441,7 @@ config ACPI_NFIT
>> >         depends on PHYS_ADDR_T_64BIT
>> >         depends on BLK_DEV
>> >         depends on ARCH_HAS_MMIO_FLUSH
>> > +       depends on !X86 || (X86 && EFI_STUB)
>> >         select LIBNVDIMM
>> >         help
>> >           Infrastructure to probe ACPI 6 compliant platforms for
>>
>> This seems wrong to me.
>>
>> In general Kconfig "depends on" are only about compile-time code
>> dependency, not about working around random bugs in external projects.
>
> I agree that they do not have a compile dependency, and it looks rather
> odd.  On the other hand, proper support of the ACPI NFIT extensions has a
> functional dependency to setup_e820() as this is the only code that can
> handle the EFI_PERSISTENT_MEMORY type today.

What about non-EFI/legeacy-boot systems that only emit e820-type-7?
We lose support for them with this patch, right?
Kani, Toshi Dec. 15, 2015, 5:56 p.m. UTC | #4
On Tue, 2015-12-15 at 09:53 -0800, Dan Williams wrote:
> On Tue, Dec 15, 2015 at 9:49 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> > On Tue, 2015-12-15 at 09:21 -0800, Dan Williams wrote:
> > > On Tue, Dec 15, 2015 at 8:59 AM, Toshi Kani <toshi.kani@hpe.com>
> > > wrote:
> > > > ACPI 6.0 defines NFIT table and new persistent memory types for
> > > > EFI memory table (EFI_PERSISTENT_MEMORY) and e820 table
> > > > (E820_PMEM).
> > > > 
> > > > setup_e820() enabled by EFI_STUB converts EFI_PERSISTENT_MEMORY to
> > > > E820_PMEM for the e820_map table on x86 EFI platforms.  When
> > > > EFI_STUB
> > > > is disabled, x86 kernels rely on the bootloader to perform this
> > > > conversion.
> > > > 
> > > > It was found that the upstream grub bootloader since 2012 has a bug
> > > > that converts EFI_PERSISTENT_MEMORY (or any new type) to E820_RAM,
> > > > which causes the kernel to use persistent memory ranges as regular
> > > > memory and corrupts the data in NVDIMM.
> > > > 
> > > > Therefore, this patch sets ACPI_NFIT to depend on EFI_STUB on x86.
> > > > This assures that ACPI_NFIT kernels are self-contained and are
> > > > protected from the upstream grub bug on x86.
> > > > 
> > > > Note, X86_PMEM_LEGACY allows the kernel to use the pmem driver on
> > > > pre-ACPI 6.0 platforms, and does not require ACPI_NFIT enabled.
> > > > 
> > > > References:
> > > > http://www.mail-archive.com/grub-devel@gnu.org/msg23961.html
> > > > Reported-by: Robert Elliott <elliott@hpe.com>
> > > > Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
> > > > Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> > > > Cc: Dan Williams <dan.j.williams@intel.com>
> > > > ---
> > > >  drivers/acpi/Kconfig |    1 +
> > > >  1 file changed, 1 insertion(+)
> > > > 
> > > > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> > > > index 5eef4cb..5368baa 100644
> > > > --- a/drivers/acpi/Kconfig
> > > > +++ b/drivers/acpi/Kconfig
> > > > @@ -441,6 +441,7 @@ config ACPI_NFIT
> > > >         depends on PHYS_ADDR_T_64BIT
> > > >         depends on BLK_DEV
> > > >         depends on ARCH_HAS_MMIO_FLUSH
> > > > +       depends on !X86 || (X86 && EFI_STUB)
> > > >         select LIBNVDIMM
> > > >         help
> > > >           Infrastructure to probe ACPI 6 compliant platforms for
> > > 
> > > This seems wrong to me.
> > > 
> > > In general Kconfig "depends on" are only about compile-time code
> > > dependency, not about working around random bugs in external
> > > projects.
> > 
> > I agree that they do not have a compile dependency, and it looks rather
> > odd.  On the other hand, proper support of the ACPI NFIT extensions has
> > a
> > functional dependency to setup_e820() as this is the only code that can
> > handle the EFI_PERSISTENT_MEMORY type today.
> 
> What about non-EFI/legeacy-boot systems that only emit e820-type-7?
> We lose support for them with this patch, right?

No, having EFI_STUB does not break the legacy BIOS boot.

Thanks,
-Toshi
Dan Williams Dec. 15, 2015, 6:05 p.m. UTC | #5
On Tue, Dec 15, 2015 at 9:56 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> On Tue, 2015-12-15 at 09:53 -0800, Dan Williams wrote:
[..]
>> > > > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
>> > > > index 5eef4cb..5368baa 100644
>> > > > --- a/drivers/acpi/Kconfig
>> > > > +++ b/drivers/acpi/Kconfig
>> > > > @@ -441,6 +441,7 @@ config ACPI_NFIT
>> > > >         depends on PHYS_ADDR_T_64BIT
>> > > >         depends on BLK_DEV
>> > > >         depends on ARCH_HAS_MMIO_FLUSH
>> > > > +       depends on !X86 || (X86 && EFI_STUB)
>> > > >         select LIBNVDIMM
>> > > >         help
>> > > >           Infrastructure to probe ACPI 6 compliant platforms for
>> > >
>> > > This seems wrong to me.
>> > >
>> > > In general Kconfig "depends on" are only about compile-time code
>> > > dependency, not about working around random bugs in external
>> > > projects.
>> >
>> > I agree that they do not have a compile dependency, and it looks rather
>> > odd.  On the other hand, proper support of the ACPI NFIT extensions has
>> > a
>> > functional dependency to setup_e820() as this is the only code that can
>> > handle the EFI_PERSISTENT_MEMORY type today.
>>
>> What about non-EFI/legeacy-boot systems that only emit e820-type-7?
>> We lose support for them with this patch, right?
>
> No, having EFI_STUB does not break the legacy BIOS boot.
>

Sorry let me clarify.  A kernel compiled without EFI_STUB loses NFIT
support.  Non-EFI and legacy-boot systems don't have this grub bug to
worry about, so the dependency is overly restrictive, "breaks", those
environments.
Kani, Toshi Dec. 15, 2015, 8:04 p.m. UTC | #6
On Tue, 2015-12-15 at 10:05 -0800, Dan Williams wrote:
> On Tue, Dec 15, 2015 at 9:56 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> > On Tue, 2015-12-15 at 09:53 -0800, Dan Williams wrote:
> [..]
> > > > > > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> > > > > > index 5eef4cb..5368baa 100644
> > > > > > --- a/drivers/acpi/Kconfig
> > > > > > +++ b/drivers/acpi/Kconfig
> > > > > > @@ -441,6 +441,7 @@ config ACPI_NFIT
> > > > > >         depends on PHYS_ADDR_T_64BIT
> > > > > >         depends on BLK_DEV
> > > > > >         depends on ARCH_HAS_MMIO_FLUSH
> > > > > > +       depends on !X86 || (X86 && EFI_STUB)
> > > > > >         select LIBNVDIMM
> > > > > >         help
> > > > > >           Infrastructure to probe ACPI 6 compliant platforms
> > > > > > for
> > > > > 
> > > > > This seems wrong to me.
> > > > > 
> > > > > In general Kconfig "depends on" are only about compile-time code
> > > > > dependency, not about working around random bugs in external
> > > > > projects.
> > > > 
> > > > I agree that they do not have a compile dependency, and it looks 
> > > > rather odd.  On the other hand, proper support of the ACPI NFIT 
> > > > extensions has a functional dependency to setup_e820() as this is 
> > > > the only code that can handle the EFI_PERSISTENT_MEMORY type today.
> > > 
> > > What about non-EFI/legeacy-boot systems that only emit e820-type-7?
> > > We lose support for them with this patch, right?
> > 
> > No, having EFI_STUB does not break the legacy BIOS boot.
> > 
> 
> Sorry let me clarify.  A kernel compiled without EFI_STUB loses NFIT
> support.  

I think it is the other way around.  When NFIT is needed, one will enable
all dependent options.  So, an NFIT kernel will have to have EFI code as a
result, even though it runs on the legacy BIOS.  I believe distributed
kernels enable EFI already so that they run on both legacy and EFI
platforms.  Of course, one may wish to build a smallest kernel specific to
NFIT & legacy BIOS platforms and want to disable EFI code, but that seems
to be a special case to me.

> Non-EFI and legacy-boot systems don't have this grub bug to
> worry about, so the dependency is overly restrictive, "breaks", those
> environments.

Yes, we do not have the grub bug on legacy BIOS (although PMEM ranges will
show up as Reserved in the iomem table).  I do not think NFIT being
dependent on EFI is overly restrictive, but I may be wrong and I agree to
drop this patch if that is indeed the case.

Thanks,
-Toshi
diff mbox

Patch

diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 5eef4cb..5368baa 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -441,6 +441,7 @@  config ACPI_NFIT
 	depends on PHYS_ADDR_T_64BIT
 	depends on BLK_DEV
 	depends on ARCH_HAS_MMIO_FLUSH
+	depends on !X86 || (X86 && EFI_STUB)
 	select LIBNVDIMM
 	help
 	  Infrastructure to probe ACPI 6 compliant platforms for