2023-01-06 06:31:59

by Sia Jee Heng

[permalink] [raw]
Subject: [PATCH 0/3] RISC-V Hibernation Support

This series adds RISC-V Hibernation/suspend to disk support.
Low level Arch functions were created to support hibernation.
swsusp_arch_suspend() relies code from __cpu_suspend_enter() to write
cpu state onto the stack, then calling swsusp_save() to save the memory
image.

arch_hibernation_header_restore() and arch_hibernation_header_save()
functions are implemented to prevent kernel crash when resume,
the kernel built version is saved into the hibernation image header
to making sure only the same kernel is restore when resume.

swsusp_arch_resume() creates a temporary page table that covering only
the linear map, copies the restore code to a 'safe' page, then start to
restore the memory image. Once completed, it restores the original
kernel's page table. It then calls into __hibernate_cpu_resume()
to restore the CPU context. Finally, it follows the normal hibernation
path back to the hibernation core.

To enable hibernation/suspend to disk into RISCV, the below config
need to be enabled:
- CONFIG_ARCH_HIBERNATION_HEADER
- CONFIG_ARCH_HIBERNATION_POSSIBLE


At high-level, this series includes the following changes:
1) Change suspend_save_csrs() and suspend_restore_csrs()
to public function as these functions are common to
suspend/hibernation. (patch 1)
2) Enhance kernel_page_present() function to support huge page. (patch 2)
3) Add arch/riscv low level functions to support
hibernation/suspend to disk. (patch 3)

The above patches are based on kernel v6.2-rc2 and are tested on
Starfive VF2 SBC board.

Sia Jee Heng (3):
RISC-V: Change suspend_save_csrs and suspend_restore_csrs to public
function
RISC-V: mm: Enable huge page support to kernel_page_present() function
RISC-V: Add arch functions to support hibernation/suspend-to-disk

arch/riscv/Kconfig | 7 +
arch/riscv/include/asm/suspend.h | 23 ++
arch/riscv/kernel/Makefile | 2 +-
arch/riscv/kernel/asm-offsets.c | 5 +
arch/riscv/kernel/hibernate-asm.S | 123 +++++++++++
arch/riscv/kernel/hibernate.c | 353 ++++++++++++++++++++++++++++++
arch/riscv/kernel/suspend.c | 4 +-
arch/riscv/mm/pageattr.c | 6 +
8 files changed, 520 insertions(+), 3 deletions(-)
create mode 100644 arch/riscv/kernel/hibernate-asm.S
create mode 100644 arch/riscv/kernel/hibernate.c


base-commit: 1f5abbd77e2c1787e74b7c2caffac97def78ba52
--
2.34.1


2023-01-06 09:59:35

by Conor Dooley

[permalink] [raw]
Subject: Re: [PATCH 0/3] RISC-V Hibernation Support

Hey folks,
Just passing on some issues that automation picked up.


On 6 January 2023 06:05:32 GMT, Sia Jee Heng <[email protected]> wrote:
>This series adds RISC-V Hibernation/suspend to disk support.
>Low level Arch functions were created to support hibernation.
>swsusp_arch_suspend() relies code from __cpu_suspend_enter() to write
>cpu state onto the stack, then calling swsusp_save() to save the memory
>image.
>
>arch_hibernation_header_restore() and arch_hibernation_header_save()
>functions are implemented to prevent kernel crash when resume,
>the kernel built version is saved into the hibernation image header
>to making sure only the same kernel is restore when resume.
>
>swsusp_arch_resume() creates a temporary page table that covering only
>the linear map, copies the restore code to a 'safe' page, then start to
>restore the memory image. Once completed, it restores the original
>kernel's page table. It then calls into __hibernate_cpu_resume()
>to restore the CPU context. Finally, it follows the normal hibernation
>path back to the hibernation core.
>
>To enable hibernation/suspend to disk into RISCV, the below config
>need to be enabled:
>- CONFIG_ARCH_HIBERNATION_HEADER
>- CONFIG_ARCH_HIBERNATION_POSSIBLE
>
>
>At high-level, this series includes the following changes:
>1) Change suspend_save_csrs() and suspend_restore_csrs()
> to public function as these functions are common to
> suspend/hibernation. (patch 1)
>2) Enhance kernel_page_present() function to support huge page. (patch 2)
>3) Add arch/riscv low level functions to support
> hibernation/suspend to disk. (patch 3)
>
>The above patches are based on kernel v6.2-rc2 and are tested on
>Starfive VF2 SBC board.
>
>Sia Jee Heng (3):
> RISC-V: Change suspend_save_csrs and suspend_restore_csrs to public
> function
> RISC-V: mm: Enable huge page support to kernel_page_present() function

Unfortunately this breaks rv32_defconfig
https://patchwork.kernel.org/project/linux-riscv/patch/[email protected]/

> RISC-V: Add arch functions to support hibernation/suspend-to-disk

This one then breaks rv64 allmodconfig too :/

https://patchwork.kernel.org/project/linux-riscv/patch/[email protected]/

Thanks,
Conor.

>
> arch/riscv/Kconfig | 7 +
> arch/riscv/include/asm/suspend.h | 23 ++
> arch/riscv/kernel/Makefile | 2 +-
> arch/riscv/kernel/asm-offsets.c | 5 +
> arch/riscv/kernel/hibernate-asm.S | 123 +++++++++++
> arch/riscv/kernel/hibernate.c | 353 ++++++++++++++++++++++++++++++
> arch/riscv/kernel/suspend.c | 4 +-
> arch/riscv/mm/pageattr.c | 6 +
> 8 files changed, 520 insertions(+), 3 deletions(-)
> create mode 100644 arch/riscv/kernel/hibernate-asm.S
> create mode 100644 arch/riscv/kernel/hibernate.c
>
>
>base-commit: 1f5abbd77e2c1787e74b7c2caffac97def78ba52

2023-01-07 09:19:17

by Sia Jee Heng

[permalink] [raw]
Subject: RE: [PATCH 0/3] RISC-V Hibernation Support



> -----Original Message-----
> From: Conor Dooley <[email protected]>
> Sent: Friday, 6 January, 2023 5:38 PM
> To: JeeHeng Sia <[email protected]>; [email protected];
> [email protected]; [email protected]
> Cc: [email protected]; [email protected]; JeeHeng Sia
> <[email protected]>; Leyfoon Tan
> <[email protected]>; Mason Huo
> <[email protected]>
> Subject: Re: [PATCH 0/3] RISC-V Hibernation Support
>
> Hey folks,
> Just passing on some issues that automation picked up.
Thanks. Will submit a new patches series to address the issues.
>
>
> On 6 January 2023 06:05:32 GMT, Sia Jee Heng
> <[email protected]> wrote:
> >This series adds RISC-V Hibernation/suspend to disk support.
> >Low level Arch functions were created to support hibernation.
> >swsusp_arch_suspend() relies code from __cpu_suspend_enter() to write
> >cpu state onto the stack, then calling swsusp_save() to save the memory
> >image.
> >
> >arch_hibernation_header_restore() and arch_hibernation_header_save()
> >functions are implemented to prevent kernel crash when resume,
> >the kernel built version is saved into the hibernation image header
> >to making sure only the same kernel is restore when resume.
> >
> >swsusp_arch_resume() creates a temporary page table that covering only
> >the linear map, copies the restore code to a 'safe' page, then start to
> >restore the memory image. Once completed, it restores the original
> >kernel's page table. It then calls into __hibernate_cpu_resume()
> >to restore the CPU context. Finally, it follows the normal hibernation
> >path back to the hibernation core.
> >
> >To enable hibernation/suspend to disk into RISCV, the below config
> >need to be enabled:
> >- CONFIG_ARCH_HIBERNATION_HEADER
> >- CONFIG_ARCH_HIBERNATION_POSSIBLE
> >
> >
> >At high-level, this series includes the following changes:
> >1) Change suspend_save_csrs() and suspend_restore_csrs()
> > to public function as these functions are common to
> > suspend/hibernation. (patch 1)
> >2) Enhance kernel_page_present() function to support huge page. (patch 2)
> >3) Add arch/riscv low level functions to support
> > hibernation/suspend to disk. (patch 3)
> >
> >The above patches are based on kernel v6.2-rc2 and are tested on
> >Starfive VF2 SBC board.
> >
> >Sia Jee Heng (3):
> > RISC-V: Change suspend_save_csrs and suspend_restore_csrs to public
> > function
> > RISC-V: mm: Enable huge page support to kernel_page_present() function
>
> Unfortunately this breaks rv32_defconfig
> https://patchwork.kernel.org/project/linux-
> riscv/patch/[email protected]/
>
> > RISC-V: Add arch functions to support hibernation/suspend-to-disk
>
> This one then breaks rv64 allmodconfig too :/
>
> https://patchwork.kernel.org/project/linux-
> riscv/patch/[email protected]/
>
> Thanks,
> Conor.
>
> >
> > arch/riscv/Kconfig | 7 +
> > arch/riscv/include/asm/suspend.h | 23 ++
> > arch/riscv/kernel/Makefile | 2 +-
> > arch/riscv/kernel/asm-offsets.c | 5 +
> > arch/riscv/kernel/hibernate-asm.S | 123 +++++++++++
> > arch/riscv/kernel/hibernate.c | 353 ++++++++++++++++++++++++++++++
> > arch/riscv/kernel/suspend.c | 4 +-
> > arch/riscv/mm/pageattr.c | 6 +
> > 8 files changed, 520 insertions(+), 3 deletions(-)
> > create mode 100644 arch/riscv/kernel/hibernate-asm.S
> > create mode 100644 arch/riscv/kernel/hibernate.c
> >
> >
> >base-commit: 1f5abbd77e2c1787e74b7c2caffac97def78ba52