* [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates
@ 2016-10-18 12:47 Alex Thorlton
2016-10-19 11:32 ` Matt Fleming
0 siblings, 1 reply; 4+ messages in thread
From: Alex Thorlton @ 2016-10-18 12:47 UTC (permalink / raw)
To: linux-kernel
Cc: Alex Thorlton, Mike Travis, Russ Anderson, Dimitri Sivanich,
Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Matt Fleming,
Masahiro Yamada, x86
Some time ago, we brought our UV BIOS callback code up to speed with the
new EFI memory mapping scheme, in commit:
d1be84a232e3 ("x86/uv: Update uv_bios_call() to use efi_call_virt_pointer()")
By leveraging some changes that I made to a few of the EFI runtime
callback mechanisms, in commit:
80e75596079f ("efi: Convert efi_call_virt() to efi_call_virt_pointer()")
This got everything running smoothly on UV, with the new EFI mapping
code. However, this left one, small loose end, in that EFI_OLD_MEMMAP
(a.k.a. efi=old_map) will no longer work on UV, on kernels that include
the aforementioned changes.
At the time this was not a major issue (in fact, it still really isn't),
but there's no reason that EFI_OLD_MEMMAP *shouldn't* work on our
systems. This commit adds a check into uv_bios_call, to see if we have
the EFI_OLD_MEMMAP bit set in efi.flags. If it is set, we fall back to
using our old callback method, which uses efi_call directly on the __va
of our function pointer.
Signed-off-by: Alex Thorlton <athorlton@sgi.com>
Cc: Mike Travis <travis@sgi.com>
Cc: Russ Anderson <rja@sgi.com>
Cc: Dimitri Sivanich <sivanich@sgi.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: x86@kernel.org
---
arch/x86/platform/uv/bios_uv.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
index b4d5e95..12b6e52 100644
--- a/arch/x86/platform/uv/bios_uv.c
+++ b/arch/x86/platform/uv/bios_uv.c
@@ -40,7 +40,15 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
*/
return BIOS_STATUS_UNIMPLEMENTED;
- ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
+ /*
+ * If EFI_OLD_MEMMAP is set, we need to fall back to using our old EFI
+ * callback method, which uses efi_call directly, with the kernel page tables.
+ */
+ if (!test_bit(EFI_OLD_MEMMAP, &efi.flags))
+ ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
+ else
+ ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
+
return ret;
}
EXPORT_SYMBOL_GPL(uv_bios_call);
--
1.8.5.6
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates
2016-10-18 12:47 [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates Alex Thorlton
@ 2016-10-19 11:32 ` Matt Fleming
2016-10-19 12:56 ` Ingo Molnar
2016-10-19 12:57 ` Alex Thorlton
0 siblings, 2 replies; 4+ messages in thread
From: Matt Fleming @ 2016-10-19 11:32 UTC (permalink / raw)
To: Alex Thorlton
Cc: linux-kernel, Mike Travis, Russ Anderson, Dimitri Sivanich,
Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Masahiro Yamada,
x86, Ard Biesheuvel
On Tue, 18 Oct, at 07:47:38AM, Alex Thorlton wrote:
> Some time ago, we brought our UV BIOS callback code up to speed with the
> new EFI memory mapping scheme, in commit:
>
> d1be84a232e3 ("x86/uv: Update uv_bios_call() to use efi_call_virt_pointer()")
>
> By leveraging some changes that I made to a few of the EFI runtime
> callback mechanisms, in commit:
>
> 80e75596079f ("efi: Convert efi_call_virt() to efi_call_virt_pointer()")
>
> This got everything running smoothly on UV, with the new EFI mapping
> code. However, this left one, small loose end, in that EFI_OLD_MEMMAP
> (a.k.a. efi=old_map) will no longer work on UV, on kernels that include
> the aforementioned changes.
>
> At the time this was not a major issue (in fact, it still really isn't),
> but there's no reason that EFI_OLD_MEMMAP *shouldn't* work on our
> systems. This commit adds a check into uv_bios_call, to see if we have
> the EFI_OLD_MEMMAP bit set in efi.flags. If it is set, we fall back to
> using our old callback method, which uses efi_call directly on the __va
> of our function pointer.
>
> Signed-off-by: Alex Thorlton <athorlton@sgi.com>
> Cc: Mike Travis <travis@sgi.com>
> Cc: Russ Anderson <rja@sgi.com>
> Cc: Dimitri Sivanich <sivanich@sgi.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Matt Fleming <matt@codeblueprint.co.uk>
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: x86@kernel.org
> ---
> arch/x86/platform/uv/bios_uv.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
> index b4d5e95..12b6e52 100644
> --- a/arch/x86/platform/uv/bios_uv.c
> +++ b/arch/x86/platform/uv/bios_uv.c
> @@ -40,7 +40,15 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
> */
> return BIOS_STATUS_UNIMPLEMENTED;
>
> - ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
> + /*
> + * If EFI_OLD_MEMMAP is set, we need to fall back to using our old EFI
> + * callback method, which uses efi_call directly, with the kernel page tables.
> + */
> + if (!test_bit(EFI_OLD_MEMMAP, &efi.flags))
> + ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
> + else
> + ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
> +
> return ret;
> }
> EXPORT_SYMBOL_GPL(uv_bios_call);
Could you please invert the conditional? I had to read it 3 times to
make sure it was correct given the comment that precedes it. E.g. this
is preferable,
if (efi_enabled(EFI_OLD_MEMMAP))
ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
else
ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates
2016-10-19 11:32 ` Matt Fleming
@ 2016-10-19 12:56 ` Ingo Molnar
2016-10-19 12:57 ` Alex Thorlton
1 sibling, 0 replies; 4+ messages in thread
From: Ingo Molnar @ 2016-10-19 12:56 UTC (permalink / raw)
To: Matt Fleming
Cc: Alex Thorlton, linux-kernel, Mike Travis, Russ Anderson,
Dimitri Sivanich, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
Masahiro Yamada, x86, Ard Biesheuvel
* Matt Fleming <matt@codeblueprint.co.uk> wrote:
> On Tue, 18 Oct, at 07:47:38AM, Alex Thorlton wrote:
> > Some time ago, we brought our UV BIOS callback code up to speed with the
> > new EFI memory mapping scheme, in commit:
> >
> > d1be84a232e3 ("x86/uv: Update uv_bios_call() to use efi_call_virt_pointer()")
> >
> > By leveraging some changes that I made to a few of the EFI runtime
> > callback mechanisms, in commit:
> >
> > 80e75596079f ("efi: Convert efi_call_virt() to efi_call_virt_pointer()")
> >
> > This got everything running smoothly on UV, with the new EFI mapping
> > code. However, this left one, small loose end, in that EFI_OLD_MEMMAP
> > (a.k.a. efi=old_map) will no longer work on UV, on kernels that include
> > the aforementioned changes.
> >
> > At the time this was not a major issue (in fact, it still really isn't),
> > but there's no reason that EFI_OLD_MEMMAP *shouldn't* work on our
> > systems. This commit adds a check into uv_bios_call, to see if we have
> > the EFI_OLD_MEMMAP bit set in efi.flags. If it is set, we fall back to
> > using our old callback method, which uses efi_call directly on the __va
> > of our function pointer.
> >
> > Signed-off-by: Alex Thorlton <athorlton@sgi.com>
> > Cc: Mike Travis <travis@sgi.com>
> > Cc: Russ Anderson <rja@sgi.com>
> > Cc: Dimitri Sivanich <sivanich@sgi.com>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Cc: "H. Peter Anvin" <hpa@zytor.com>
> > Cc: Matt Fleming <matt@codeblueprint.co.uk>
> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> > Cc: x86@kernel.org
> > ---
> > arch/x86/platform/uv/bios_uv.c | 10 +++++++++-
> > 1 file changed, 9 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
> > index b4d5e95..12b6e52 100644
> > --- a/arch/x86/platform/uv/bios_uv.c
> > +++ b/arch/x86/platform/uv/bios_uv.c
> > @@ -40,7 +40,15 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
> > */
> > return BIOS_STATUS_UNIMPLEMENTED;
> >
> > - ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
> > + /*
> > + * If EFI_OLD_MEMMAP is set, we need to fall back to using our old EFI
> > + * callback method, which uses efi_call directly, with the kernel page tables.
> > + */
> > + if (!test_bit(EFI_OLD_MEMMAP, &efi.flags))
> > + ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
> > + else
> > + ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
> > +
> > return ret;
> > }
> > EXPORT_SYMBOL_GPL(uv_bios_call);
>
> Could you please invert the conditional? I had to read it 3 times to
> make sure it was correct given the comment that precedes it. E.g. this
> is preferable,
>
> if (efi_enabled(EFI_OLD_MEMMAP))
> ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
> else
> ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
Also, does 'which' have to be explicitly type-cast to u64? Doesn't the compiler DTRT?
Thanks,
Ingo
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates
2016-10-19 11:32 ` Matt Fleming
2016-10-19 12:56 ` Ingo Molnar
@ 2016-10-19 12:57 ` Alex Thorlton
1 sibling, 0 replies; 4+ messages in thread
From: Alex Thorlton @ 2016-10-19 12:57 UTC (permalink / raw)
To: Matt Fleming
Cc: Alex Thorlton, linux-kernel, Mike Travis, Russ Anderson,
Dimitri Sivanich, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
Masahiro Yamada, x86, Ard Biesheuvel
On Wed, Oct 19, 2016 at 12:32:00PM +0100, Matt Fleming wrote:
> Could you please invert the conditional? I had to read it 3 times to
> make sure it was correct given the comment that precedes it. E.g. this
> is preferable,
>
> if (efi_enabled(EFI_OLD_MEMMAP))
> ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5);
> else
> ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5);
Sure, no problem! I generally default to checking for the more common
condition first, but I definitely see how that makes the code kind of
hard to read, in this case.
I'll send another version shortly.
Thanks, Matt!
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-10-19 14:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-18 12:47 [PATCH] x86/platform/UV: Fix support for EFI_OLD_MEMMAP after BIOS callback updates Alex Thorlton
2016-10-19 11:32 ` Matt Fleming
2016-10-19 12:56 ` Ingo Molnar
2016-10-19 12:57 ` Alex Thorlton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).