public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] LoongArch: Save and restore CSR.CNTC for hibernation
@ 2025-05-14 14:46 Huacai Chen
  2025-05-15  1:30 ` Yanteng Si
  0 siblings, 1 reply; 2+ messages in thread
From: Huacai Chen @ 2025-05-14 14:46 UTC (permalink / raw)
  To: Huacai Chen
  Cc: loongarch, Xuefeng Li, Guo Ren, Xuerui Wang, Jiaxun Yang,
	linux-kernel, Huacai Chen, stable, Xianglai Li

Save and restore CSR.CNTC for hibernation which is similar to suspend.

For host this is unnecessary because sched clock is ensured continuous,
but for kvm guest sched clock isn't enough because rdtime.d should also
be continuous.

Host::rdtime.d = Host::CSR.CNTC + counter
Guest::rdtime.d = Host::CSR.CNTC + Host::CSR.GCNTC + Guest::CSR.CNTC + counter

so,

Guest::rdtime.d = Host::rdtime.d + Host::CSR.GCNTC + Guest::CSR.CNTC

To ensure Guest::rdtime.d continuous, Host::rdtime.d should be at first
continuous, while Host::CSR.GCNTC / Guest::CSR.CNTC is maintained by KVM.

Cc: stable@vger.kernel.org
Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 arch/loongarch/kernel/time.c     | 2 +-
 arch/loongarch/power/hibernate.c | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/loongarch/kernel/time.c b/arch/loongarch/kernel/time.c
index e2d3bfeb6366..bc75a3a69fc8 100644
--- a/arch/loongarch/kernel/time.c
+++ b/arch/loongarch/kernel/time.c
@@ -111,7 +111,7 @@ static unsigned long __init get_loops_per_jiffy(void)
 	return lpj;
 }
 
-static long init_offset __nosavedata;
+static long init_offset;
 
 void save_counter(void)
 {
diff --git a/arch/loongarch/power/hibernate.c b/arch/loongarch/power/hibernate.c
index 1e0590542f98..e7b7346592cb 100644
--- a/arch/loongarch/power/hibernate.c
+++ b/arch/loongarch/power/hibernate.c
@@ -2,6 +2,7 @@
 #include <asm/fpu.h>
 #include <asm/loongson.h>
 #include <asm/sections.h>
+#include <asm/time.h>
 #include <asm/tlbflush.h>
 #include <linux/suspend.h>
 
@@ -14,6 +15,7 @@ struct pt_regs saved_regs;
 
 void save_processor_state(void)
 {
+	save_counter();
 	saved_crmd = csr_read32(LOONGARCH_CSR_CRMD);
 	saved_prmd = csr_read32(LOONGARCH_CSR_PRMD);
 	saved_euen = csr_read32(LOONGARCH_CSR_EUEN);
@@ -26,6 +28,7 @@ void save_processor_state(void)
 
 void restore_processor_state(void)
 {
+	sync_counter();
 	csr_write32(saved_crmd, LOONGARCH_CSR_CRMD);
 	csr_write32(saved_prmd, LOONGARCH_CSR_PRMD);
 	csr_write32(saved_euen, LOONGARCH_CSR_EUEN);
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] LoongArch: Save and restore CSR.CNTC for hibernation
  2025-05-14 14:46 [PATCH] LoongArch: Save and restore CSR.CNTC for hibernation Huacai Chen
@ 2025-05-15  1:30 ` Yanteng Si
  0 siblings, 0 replies; 2+ messages in thread
From: Yanteng Si @ 2025-05-15  1:30 UTC (permalink / raw)
  To: Huacai Chen, Huacai Chen
  Cc: loongarch, Xuefeng Li, Guo Ren, Xuerui Wang, Jiaxun Yang,
	linux-kernel, stable, Xianglai Li

在 5/14/25 10:46 PM, Huacai Chen 写道:
> Save and restore CSR.CNTC for hibernation which is similar to suspend.
> 
> For host this is unnecessary because sched clock is ensured continuous,
> but for kvm guest sched clock isn't enough because rdtime.d should also
> be continuous.
> 
> Host::rdtime.d = Host::CSR.CNTC + counter
> Guest::rdtime.d = Host::CSR.CNTC + Host::CSR.GCNTC + Guest::CSR.CNTC + counter
> 
> so,
> 
> Guest::rdtime.d = Host::rdtime.d + Host::CSR.GCNTC + Guest::CSR.CNTC
> 
> To ensure Guest::rdtime.d continuous, Host::rdtime.d should be at first
> continuous, while Host::CSR.GCNTC / Guest::CSR.CNTC is maintained by KVM.
> 
> Cc: stable@vger.kernel.org
> Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Reviewed-by: Yanteng Si <si.yanteng@linux.dev>

Thanks,
Yanteng
> ---
>   arch/loongarch/kernel/time.c     | 2 +-
>   arch/loongarch/power/hibernate.c | 3 +++
>   2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/loongarch/kernel/time.c b/arch/loongarch/kernel/time.c
> index e2d3bfeb6366..bc75a3a69fc8 100644
> --- a/arch/loongarch/kernel/time.c
> +++ b/arch/loongarch/kernel/time.c
> @@ -111,7 +111,7 @@ static unsigned long __init get_loops_per_jiffy(void)
>   	return lpj;
>   }
>   
> -static long init_offset __nosavedata;
> +static long init_offset;
>   
>   void save_counter(void)
>   {
> diff --git a/arch/loongarch/power/hibernate.c b/arch/loongarch/power/hibernate.c
> index 1e0590542f98..e7b7346592cb 100644
> --- a/arch/loongarch/power/hibernate.c
> +++ b/arch/loongarch/power/hibernate.c
> @@ -2,6 +2,7 @@
>   #include <asm/fpu.h>
>   #include <asm/loongson.h>
>   #include <asm/sections.h>
> +#include <asm/time.h>
>   #include <asm/tlbflush.h>
>   #include <linux/suspend.h>
>   
> @@ -14,6 +15,7 @@ struct pt_regs saved_regs;
>   
>   void save_processor_state(void)
>   {
> +	save_counter();
>   	saved_crmd = csr_read32(LOONGARCH_CSR_CRMD);
>   	saved_prmd = csr_read32(LOONGARCH_CSR_PRMD);
>   	saved_euen = csr_read32(LOONGARCH_CSR_EUEN);
> @@ -26,6 +28,7 @@ void save_processor_state(void)
>   
>   void restore_processor_state(void)
>   {
> +	sync_counter();
>   	csr_write32(saved_crmd, LOONGARCH_CSR_CRMD);
>   	csr_write32(saved_prmd, LOONGARCH_CSR_PRMD);
>   	csr_write32(saved_euen, LOONGARCH_CSR_EUEN);


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-05-15  1:30 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-14 14:46 [PATCH] LoongArch: Save and restore CSR.CNTC for hibernation Huacai Chen
2025-05-15  1:30 ` Yanteng Si

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox