[00/13] x86/tdx: Add kexec support

Message ID 20231005131402.14611-1-kirill.shutemov@linux.intel.com
Headers
Series x86/tdx: Add kexec support |

Message

Kirill A. Shutemov Oct. 5, 2023, 1:13 p.m. UTC
  The patchset adds bits and pieces to get kexec (and crashkernel) work on
TDX guest.

They bring kexec support to the point when we can start the new kernel,
but it will only be able to use single CPU. It should be enough to cover
the most common case: crashkernel.

The last patch implements CPU offlining according to the approved ACPI
spec change poposal[1]. It unlocks kexec with all CPUs visible in the target
kernel.

Please review. I would be glad for any feedback.

[1] https://lore.kernel.org/all/13356251.uLZWGnKmhe@kreacher

Kirill A. Shutemov (13):
  x86/acpi: Extract ACPI MADT wakeup code into a separate file
  kernel/cpu: Add support for declaring CPU hotplug not supported
  cpu/hotplug, x86/acpi: Disable CPU hotplug for ACPI MADT wakeup
  x86/kvm: Do not try to disable kvmclock if it was not enabled
  x86/kexec: Keep CR4.MCE set during kexec for TDX guest
  x86/mm: Make x86_platform.guest.enc_status_change_*() return errno
  x86/mm: Return correct level from lookup_address() if pte is none
  KVM: x86: Add config option to gate emergency virt callback support
  x86/tdx: Account shared memory
  x86/tdx: Convert shared memory back to private on kexec
  x86/mm: Make e820_end_ram_pfn() cover E820_TYPE_ACPI ranges
  x86/acpi: Do not attempt to bring up secondary CPUs in kexec case
  x86/acpi: Add support for CPU offlining for ACPI MADT wakeup method

 arch/x86/Kconfig                     |   8 +
 arch/x86/coco/core.c                 |   1 -
 arch/x86/coco/tdx/kexec.c            |   0
 arch/x86/coco/tdx/tdx.c              | 220 +++++++++++++++++++++-
 arch/x86/hyperv/ivm.c                |   9 +-
 arch/x86/include/asm/acpi.h          |   5 +
 arch/x86/include/asm/pgtable_types.h |   1 +
 arch/x86/include/asm/reboot.h        |   4 +-
 arch/x86/include/asm/x86_init.h      |   4 +-
 arch/x86/kernel/acpi/Makefile        |  11 +-
 arch/x86/kernel/acpi/boot.c          |  88 +--------
 arch/x86/kernel/acpi/madt.S          |  28 +++
 arch/x86/kernel/acpi/madt_wakeup.c   | 262 +++++++++++++++++++++++++++
 arch/x86/kernel/e820.c               |   9 +-
 arch/x86/kernel/kvmclock.c           |   9 +-
 arch/x86/kernel/reboot.c             |   4 +-
 arch/x86/kernel/relocate_kernel_64.S |   5 +
 arch/x86/kernel/x86_init.c           |   4 +-
 arch/x86/kvm/Kconfig                 |   5 +
 arch/x86/mm/mem_encrypt_amd.c        |   8 +-
 arch/x86/mm/pat/set_memory.c         |  17 +-
 include/acpi/actbl2.h                |  19 +-
 include/linux/cc_platform.h          |  10 -
 include/linux/cpu.h                  |   2 +
 kernel/cpu.c                         |  17 +-
 25 files changed, 604 insertions(+), 146 deletions(-)
 create mode 100644 arch/x86/coco/tdx/kexec.c
 create mode 100644 arch/x86/kernel/acpi/madt.S
 create mode 100644 arch/x86/kernel/acpi/madt_wakeup.c
  

Comments

Baoquan He Oct. 8, 2023, 11:49 p.m. UTC | #1
On 10/05/23 at 04:13pm, Kirill A. Shutemov wrote:
> The patchset adds bits and pieces to get kexec (and crashkernel) work on
> TDX guest.
> 
> They bring kexec support to the point when we can start the new kernel,
> but it will only be able to use single CPU. It should be enough to cover
> the most common case: crashkernel.

Not sure if this question has been raised and answered in the past. Please
forgive my bad memory if it has. The one cpu is fine to kdump kernel most
of time, while we enable all CPUs by default when kexec rebooting. And kdump
kernel with multiple cpu is allowed too. Wondering if there's plan to
support the multiple cpu on TDX in the future.

Thanks
Baoquan

> 
> The last patch implements CPU offlining according to the approved ACPI
> spec change poposal[1]. It unlocks kexec with all CPUs visible in the target
> kernel.
> 
> Please review. I would be glad for any feedback.
> 
> [1] https://lore.kernel.org/all/13356251.uLZWGnKmhe@kreacher
> 
> Kirill A. Shutemov (13):
>   x86/acpi: Extract ACPI MADT wakeup code into a separate file
>   kernel/cpu: Add support for declaring CPU hotplug not supported
>   cpu/hotplug, x86/acpi: Disable CPU hotplug for ACPI MADT wakeup
>   x86/kvm: Do not try to disable kvmclock if it was not enabled
>   x86/kexec: Keep CR4.MCE set during kexec for TDX guest
>   x86/mm: Make x86_platform.guest.enc_status_change_*() return errno
>   x86/mm: Return correct level from lookup_address() if pte is none
>   KVM: x86: Add config option to gate emergency virt callback support
>   x86/tdx: Account shared memory
>   x86/tdx: Convert shared memory back to private on kexec
>   x86/mm: Make e820_end_ram_pfn() cover E820_TYPE_ACPI ranges
>   x86/acpi: Do not attempt to bring up secondary CPUs in kexec case
>   x86/acpi: Add support for CPU offlining for ACPI MADT wakeup method
> 
>  arch/x86/Kconfig                     |   8 +
>  arch/x86/coco/core.c                 |   1 -
>  arch/x86/coco/tdx/kexec.c            |   0
>  arch/x86/coco/tdx/tdx.c              | 220 +++++++++++++++++++++-
>  arch/x86/hyperv/ivm.c                |   9 +-
>  arch/x86/include/asm/acpi.h          |   5 +
>  arch/x86/include/asm/pgtable_types.h |   1 +
>  arch/x86/include/asm/reboot.h        |   4 +-
>  arch/x86/include/asm/x86_init.h      |   4 +-
>  arch/x86/kernel/acpi/Makefile        |  11 +-
>  arch/x86/kernel/acpi/boot.c          |  88 +--------
>  arch/x86/kernel/acpi/madt.S          |  28 +++
>  arch/x86/kernel/acpi/madt_wakeup.c   | 262 +++++++++++++++++++++++++++
>  arch/x86/kernel/e820.c               |   9 +-
>  arch/x86/kernel/kvmclock.c           |   9 +-
>  arch/x86/kernel/reboot.c             |   4 +-
>  arch/x86/kernel/relocate_kernel_64.S |   5 +
>  arch/x86/kernel/x86_init.c           |   4 +-
>  arch/x86/kvm/Kconfig                 |   5 +
>  arch/x86/mm/mem_encrypt_amd.c        |   8 +-
>  arch/x86/mm/pat/set_memory.c         |  17 +-
>  include/acpi/actbl2.h                |  19 +-
>  include/linux/cc_platform.h          |  10 -
>  include/linux/cpu.h                  |   2 +
>  kernel/cpu.c                         |  17 +-
>  25 files changed, 604 insertions(+), 146 deletions(-)
>  create mode 100644 arch/x86/coco/tdx/kexec.c
>  create mode 100644 arch/x86/kernel/acpi/madt.S
>  create mode 100644 arch/x86/kernel/acpi/madt_wakeup.c
> 
> -- 
> 2.41.0
> 
> 
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
>
  
Kirill A. Shutemov Oct. 9, 2023, 1:36 p.m. UTC | #2
On Mon, Oct 09, 2023 at 07:49:35AM +0800, Baoquan He wrote:
> On 10/05/23 at 04:13pm, Kirill A. Shutemov wrote:
> > The patchset adds bits and pieces to get kexec (and crashkernel) work on
> > TDX guest.
> > 
> > They bring kexec support to the point when we can start the new kernel,
> > but it will only be able to use single CPU. It should be enough to cover
> > the most common case: crashkernel.
> 
> Not sure if this question has been raised and answered in the past. Please
> forgive my bad memory if it has. The one cpu is fine to kdump kernel most
> of time, while we enable all CPUs by default when kexec rebooting. And kdump
> kernel with multiple cpu is allowed too. Wondering if there's plan to
> support the multiple cpu on TDX in the future.

Sorry, I didn't update this part of cover letter properly, but the last
patch of the patchset makes possible to kexec with multiple CPUs and the
2nd kernel will see them all. It requires support on BIOS side, otherwise
we fallback to single CPU kexec.
  
Baoquan He Oct. 9, 2023, 2:13 p.m. UTC | #3
On 10/09/23 at 04:36pm, Kirill A. Shutemov wrote:
> On Mon, Oct 09, 2023 at 07:49:35AM +0800, Baoquan He wrote:
> > On 10/05/23 at 04:13pm, Kirill A. Shutemov wrote:
> > > The patchset adds bits and pieces to get kexec (and crashkernel) work on
> > > TDX guest.
> > > 
> > > They bring kexec support to the point when we can start the new kernel,
> > > but it will only be able to use single CPU. It should be enough to cover
> > > the most common case: crashkernel.
> > 
> > Not sure if this question has been raised and answered in the past. Please
> > forgive my bad memory if it has. The one cpu is fine to kdump kernel most
> > of time, while we enable all CPUs by default when kexec rebooting. And kdump
> > kernel with multiple cpu is allowed too. Wondering if there's plan to
> > support the multiple cpu on TDX in the future.
> 
> Sorry, I didn't update this part of cover letter properly, but the last
> patch of the patchset makes possible to kexec with multiple CPUs and the
> 2nd kernel will see them all. It requires support on BIOS side, otherwise
> we fallback to single CPU kexec.

Oops, I didn't read them carefully. You have mentioned that in the last
paragraph of cover letter. That's a great news, thanks.