[PATCH v2 0/3] Enable FRED earlier

Xin Li (Intel) posted 3 patches 1 year, 5 months ago
arch/x86/include/asm/fred.h  |  2 ++
arch/x86/kernel/cpu/common.c |  9 ++++++---
arch/x86/kernel/fred.c       | 28 +++++++++++++++++++---------
arch/x86/kernel/setup.c      | 11 ++++++++++-
arch/x86/kernel/smpboot.c    |  6 ++++++
arch/x86/kernel/traps.c      | 30 ++++--------------------------
6 files changed, 47 insertions(+), 39 deletions(-)
[PATCH v2 0/3] Enable FRED earlier
Posted by Xin Li (Intel) 1 year, 5 months ago
Wenlong Hou from Ant group reported two problems during the FRED
initialization:
https://lore.kernel.org/lkml/cover.1718972598.git.houwenlong.hwl@antgroup.com/

The first problem is that spurious_interrupt() gets called on the
HYPERVISOR_CALLBACK_VECTOR vector.  Because kvm_guest_init(), being
executed way before trap_init() in which it is decided that whether
FRED will be enabled or not, calls sysvec_install() to install
HYPERVISOR_CALLBACK_VECTOR's interrupt handler into FRED system
vector dispatch table or IDT depending on whether FRED is enabled.

The other problem is that the #PF handler gets a wrong faulting
address from the stack instead of CR2 before FRED is enabled.
Because the #PF handler fetches its faulting addresss from the
stack or CR2 based on whether FRED is available rather than active.

This patchset fixes the 2 problems with suggestions from tglx:

  1) Parse cmdline param "fred=" in cpu_parse_early_param() to
     minimize the gap mentioned above, before kvm_guest_init().

  2) Enable FRED right after init_mem_mapping() to switch to FRED
     from early IDT ASAP, avoid intermediately using the IDT #PF
     handler.


Link to v1:
https://lore.kernel.org/lkml/20240703085426.274801-1-xin@zytor.com/

Changes since v1:
* Drop the patch that changes wrmsrl() to wrmsrns().
* Use strncmp() instead of strcmp().


Xin Li (Intel) (3):
  x86/fred: Parse cmdline param "fred=" in cpu_parse_early_param()
  x86/fred: Split FRED RSP initialization into a separate function
  x86/fred: Enable FRED right after init_mem_mapping()

 arch/x86/include/asm/fred.h  |  2 ++
 arch/x86/kernel/cpu/common.c |  9 ++++++---
 arch/x86/kernel/fred.c       | 28 +++++++++++++++++++---------
 arch/x86/kernel/setup.c      | 11 ++++++++++-
 arch/x86/kernel/smpboot.c    |  6 ++++++
 arch/x86/kernel/traps.c      | 30 ++++--------------------------
 6 files changed, 47 insertions(+), 39 deletions(-)


base-commit: aa9d8caba6e40b0b02a6f2b5f2bd9177cd76cacf
-- 
2.45.2
Re: [PATCH v2 0/3] Enable FRED earlier
Posted by Thomas Gleixner 1 year, 4 months ago
On Tue, Jul 09 2024 at 08:40, Xin Li wrote:
> Wenlong Hou from Ant group reported two problems during the FRED
> initialization:
> https://lore.kernel.org/lkml/cover.1718972598.git.houwenlong.hwl@antgroup.com/
>
> The first problem is that spurious_interrupt() gets called on the
> HYPERVISOR_CALLBACK_VECTOR vector.  Because kvm_guest_init(), being
> executed way before trap_init() in which it is decided that whether
> FRED will be enabled or not, calls sysvec_install() to install
> HYPERVISOR_CALLBACK_VECTOR's interrupt handler into FRED system
> vector dispatch table or IDT depending on whether FRED is enabled.
>
> The other problem is that the #PF handler gets a wrong faulting
> address from the stack instead of CR2 before FRED is enabled.
> Because the #PF handler fetches its faulting addresss from the
> stack or CR2 based on whether FRED is available rather than active.
>
> This patchset fixes the 2 problems with suggestions from tglx:
>
>   1) Parse cmdline param "fred=" in cpu_parse_early_param() to
>      minimize the gap mentioned above, before kvm_guest_init().
>
>   2) Enable FRED right after init_mem_mapping() to switch to FRED
>      from early IDT ASAP, avoid intermediately using the IDT #PF
>      handler.

I just noticed that there is another leftover regarding FRED:

arch/x86/kernel/cpu/cpuid-deps.c:86: { X86_FEATURE_FRED, X86_FEATURE_WRMSRNS },

We removed the dependency on X86_FEATURE_WRMSRNS, right? So this is
stale and should be removed too.

Thanks,

        tglx
Re: [PATCH v2 0/3] Enable FRED earlier
Posted by Xin Li 1 year, 4 months ago
> I just noticed that there is another leftover regarding FRED:
> 
> arch/x86/kernel/cpu/cpuid-deps.c:86: { X86_FEATURE_FRED, X86_FEATURE_WRMSRNS },
> 
> We removed the dependency on X86_FEATURE_WRMSRNS, right? So this is
> stale and should be removed too.

Right, I did plan to include such a change per your ask to remove the
comment in arch/x86/include/asm/switch_to.h:

https://lore.kernel.org/lkml/87ttfw18jy.ffs@tglx/

So it will be in the next iteration of that patch set.

Thanks!
    Xin
Re: [PATCH v2 0/3] Enable FRED earlier
Posted by Xin Li 1 year, 4 months ago
On 8/13/2024 8:58 AM, Xin Li wrote:
>> I just noticed that there is another leftover regarding FRED:
>>
>> arch/x86/kernel/cpu/cpuid-deps.c:86: { X86_FEATURE_FRED, 
>> X86_FEATURE_WRMSRNS },
>>
>> We removed the dependency on X86_FEATURE_WRMSRNS, right? So this is
>> stale and should be removed too.

Sorry, this dependency is not removed yet, but will be as mentioned in
my previous reply.

Thanks!
     Xin


> Right, I did plan to include such a change per your ask to remove the
> comment in arch/x86/include/asm/switch_to.h:
> 
> https://lore.kernel.org/lkml/87ttfw18jy.ffs@tglx/
> 
> So it will be in the next iteration of that patch set.