* [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR [not found] <20221119021124.1773699-1-sashal@kernel.org> @ 2022-11-19 2:10 ` Sasha Levin 2022-11-19 5:37 ` Michael Kelley (LINUX) 0 siblings, 1 reply; 4+ messages in thread From: Sasha Levin @ 2022-11-19 2:10 UTC (permalink / raw) To: linux-kernel, stable Cc: Anirudh Rayabharam, Michael Kelley, Wei Liu, Sasha Levin, kys, haiyangz, decui, daniel.lezcano, tglx, linux-hyperv, linux-arch From: Anirudh Rayabharam <anrayabh@linux.microsoft.com> [ Upstream commit 4ad1aa571214e8d6468a1806794d987b374b5a08 ] Add a data structure to represent the reference TSC MSR similar to other MSRs. This simplifies the code for updating the MSR. Signed-off-by: Anirudh Rayabharam <anrayabh@linux.microsoft.com> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/20221027095729.1676394-2-anrayabh@linux.microsoft.com Signed-off-by: Wei Liu <wei.liu@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org> --- drivers/clocksource/hyperv_timer.c | 29 +++++++++++++++-------------- include/asm-generic/hyperv-tlfs.h | 9 +++++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyperv_timer.c index bb47610bbd1c..18de1f439ffd 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -21,6 +21,7 @@ #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/acpi.h> +#include <linux/hyperv.h> #include <clocksource/hyperv_timer.h> #include <asm/hyperv-tlfs.h> #include <asm/mshyperv.h> @@ -395,25 +396,25 @@ static u64 notrace read_hv_sched_clock_tsc(void) static void suspend_hv_clock_tsc(struct clocksource *arg) { - u64 tsc_msr; + union hv_reference_tsc_msr tsc_msr; /* Disable the TSC page */ - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); - tsc_msr &= ~BIT_ULL(0); - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); + tsc_msr.enable = 0; + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); } static void resume_hv_clock_tsc(struct clocksource *arg) { phys_addr_t phys_addr = virt_to_phys(&tsc_pg); - u64 tsc_msr; + union hv_reference_tsc_msr tsc_msr; /* Re-enable the TSC page */ - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); - tsc_msr &= GENMASK_ULL(11, 0); - tsc_msr |= BIT_ULL(0) | (u64)phys_addr; - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); + tsc_msr.enable = 1; + tsc_msr.pfn = HVPFN_DOWN(phys_addr); + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); } #ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK @@ -495,7 +496,7 @@ static __always_inline void hv_setup_sched_clock(void *sched_clock) {} static bool __init hv_init_tsc_clocksource(void) { - u64 tsc_msr; + union hv_reference_tsc_msr tsc_msr; phys_addr_t phys_addr; if (!(ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE)) @@ -530,10 +531,10 @@ static bool __init hv_init_tsc_clocksource(void) * (which already has at least the low 12 bits set to zero since * it is page aligned). Also set the "enable" bit, which is bit 0. */ - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); - tsc_msr &= GENMASK_ULL(11, 0); - tsc_msr = tsc_msr | 0x1 | (u64)phys_addr; - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); + tsc_msr.enable = 1; + tsc_msr.pfn = HVPFN_DOWN(phys_addr); + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); clocksource_register_hz(&hyperv_cs_tsc, NSEC_PER_SEC/100); diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h index fdce7a4cfc6f..b17c6eeb9afa 100644 --- a/include/asm-generic/hyperv-tlfs.h +++ b/include/asm-generic/hyperv-tlfs.h @@ -102,6 +102,15 @@ struct ms_hyperv_tsc_page { volatile s64 tsc_offset; } __packed; +union hv_reference_tsc_msr { + u64 as_uint64; + struct { + u64 enable:1; + u64 reserved:11; + u64 pfn:52; + } __packed; +}; + /* * The guest OS needs to register the guest ID with the hypervisor. * The guest ID is a 64 bit entity and the structure of this ID is -- 2.35.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* RE: [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR 2022-11-19 2:10 ` [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR Sasha Levin @ 2022-11-19 5:37 ` Michael Kelley (LINUX) 2022-11-24 15:51 ` Sasha Levin 0 siblings, 1 reply; 4+ messages in thread From: Michael Kelley (LINUX) @ 2022-11-19 5:37 UTC (permalink / raw) To: Sasha Levin, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Anirudh Rayabharam, Wei Liu Cc: KY Srinivasan, Haiyang Zhang, Dexuan Cui, daniel.lezcano@linaro.org, tglx@linutronix.de, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org From: Sasha Levin <sashal@kernel.org> Sent: Friday, November 18, 2022 6:11 PM > > From: Anirudh Rayabharam <anrayabh@linux.microsoft.com> > > [ Upstream commit 4ad1aa571214e8d6468a1806794d987b374b5a08 ] > > Add a data structure to represent the reference TSC MSR similar to > other MSRs. This simplifies the code for updating the MSR. > > Signed-off-by: Anirudh Rayabharam <anrayabh@linux.microsoft.com> > Reviewed-by: Michael Kelley <mikelley@microsoft.com> > Link: https://lore.kernel.org/all/20221027095729.1676394-2-anrayabh@linux.microsoft.com/ > Signed-off-by: Wei Liu <wei.liu@kernel.org> > Signed-off-by: Sasha Levin <sashal@kernel.org> Sasha -- I don't think this patch needs to be backported to any stable versions. Anirudh or Wei Liu, can you confirm? The patch is more about enabling a new scenario than fixing a bug. Michael > --- > drivers/clocksource/hyperv_timer.c | 29 +++++++++++++++-------------- > include/asm-generic/hyperv-tlfs.h | 9 +++++++++ > 2 files changed, 24 insertions(+), 14 deletions(-) > > diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyperv_timer.c > index bb47610bbd1c..18de1f439ffd 100644 > --- a/drivers/clocksource/hyperv_timer.c > +++ b/drivers/clocksource/hyperv_timer.c > @@ -21,6 +21,7 @@ > #include <linux/interrupt.h> > #include <linux/irq.h> > #include <linux/acpi.h> > +#include <linux/hyperv.h> > #include <clocksource/hyperv_timer.h> > #include <asm/hyperv-tlfs.h> > #include <asm/mshyperv.h> > @@ -395,25 +396,25 @@ static u64 notrace read_hv_sched_clock_tsc(void) > > static void suspend_hv_clock_tsc(struct clocksource *arg) > { > - u64 tsc_msr; > + union hv_reference_tsc_msr tsc_msr; > > /* Disable the TSC page */ > - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); > - tsc_msr &= ~BIT_ULL(0); > - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); > + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); > + tsc_msr.enable = 0; > + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); > } > > > static void resume_hv_clock_tsc(struct clocksource *arg) > { > phys_addr_t phys_addr = virt_to_phys(&tsc_pg); > - u64 tsc_msr; > + union hv_reference_tsc_msr tsc_msr; > > /* Re-enable the TSC page */ > - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); > - tsc_msr &= GENMASK_ULL(11, 0); > - tsc_msr |= BIT_ULL(0) | (u64)phys_addr; > - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); > + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); > + tsc_msr.enable = 1; > + tsc_msr.pfn = HVPFN_DOWN(phys_addr); > + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); > } > > #ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK > @@ -495,7 +496,7 @@ static __always_inline void hv_setup_sched_clock(void > *sched_clock) {} > > static bool __init hv_init_tsc_clocksource(void) > { > - u64 tsc_msr; > + union hv_reference_tsc_msr tsc_msr; > phys_addr_t phys_addr; > > if (!(ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE)) > @@ -530,10 +531,10 @@ static bool __init hv_init_tsc_clocksource(void) > * (which already has at least the low 12 bits set to zero since > * it is page aligned). Also set the "enable" bit, which is bit 0. > */ > - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); > - tsc_msr &= GENMASK_ULL(11, 0); > - tsc_msr = tsc_msr | 0x1 | (u64)phys_addr; > - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); > + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); > + tsc_msr.enable = 1; > + tsc_msr.pfn = HVPFN_DOWN(phys_addr); > + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); > > clocksource_register_hz(&hyperv_cs_tsc, NSEC_PER_SEC/100); > > diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h > index fdce7a4cfc6f..b17c6eeb9afa 100644 > --- a/include/asm-generic/hyperv-tlfs.h > +++ b/include/asm-generic/hyperv-tlfs.h > @@ -102,6 +102,15 @@ struct ms_hyperv_tsc_page { > volatile s64 tsc_offset; > } __packed; > > +union hv_reference_tsc_msr { > + u64 as_uint64; > + struct { > + u64 enable:1; > + u64 reserved:11; > + u64 pfn:52; > + } __packed; > +}; > + > /* > * The guest OS needs to register the guest ID with the hypervisor. > * The guest ID is a 64 bit entity and the structure of this ID is > -- > 2.35.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR 2022-11-19 5:37 ` Michael Kelley (LINUX) @ 2022-11-24 15:51 ` Sasha Levin 2022-11-25 15:39 ` Wei Liu 0 siblings, 1 reply; 4+ messages in thread From: Sasha Levin @ 2022-11-24 15:51 UTC (permalink / raw) To: Michael Kelley (LINUX) Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org, Anirudh Rayabharam, Wei Liu, KY Srinivasan, Haiyang Zhang, Dexuan Cui, daniel.lezcano@linaro.org, tglx@linutronix.de, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org On Sat, Nov 19, 2022 at 05:37:16AM +0000, Michael Kelley (LINUX) wrote: >From: Sasha Levin <sashal@kernel.org> Sent: Friday, November 18, 2022 6:11 PM >> >> From: Anirudh Rayabharam <anrayabh@linux.microsoft.com> >> >> [ Upstream commit 4ad1aa571214e8d6468a1806794d987b374b5a08 ] >> >> Add a data structure to represent the reference TSC MSR similar to >> other MSRs. This simplifies the code for updating the MSR. >> >> Signed-off-by: Anirudh Rayabharam <anrayabh@linux.microsoft.com> >> Reviewed-by: Michael Kelley <mikelley@microsoft.com> >> Link: https://lore.kernel.org/all/20221027095729.1676394-2-anrayabh@linux.microsoft.com/ >> Signed-off-by: Wei Liu <wei.liu@kernel.org> >> Signed-off-by: Sasha Levin <sashal@kernel.org> > >Sasha -- I don't think this patch needs to be backported to any stable versions. Anirudh >or Wei Liu, can you confirm? The patch is more about enabling a new scenario than fixing a bug. Ack, I'll drop both of the patches you've pointed out. Thanks! -- Thanks, Sasha ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR 2022-11-24 15:51 ` Sasha Levin @ 2022-11-25 15:39 ` Wei Liu 0 siblings, 0 replies; 4+ messages in thread From: Wei Liu @ 2022-11-25 15:39 UTC (permalink / raw) To: Sasha Levin Cc: Michael Kelley (LINUX), linux-kernel@vger.kernel.org, stable@vger.kernel.org, Anirudh Rayabharam, Wei Liu, KY Srinivasan, Haiyang Zhang, Dexuan Cui, daniel.lezcano@linaro.org, tglx@linutronix.de, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org On Thu, Nov 24, 2022 at 10:51:06AM -0500, Sasha Levin wrote: > On Sat, Nov 19, 2022 at 05:37:16AM +0000, Michael Kelley (LINUX) wrote: > > From: Sasha Levin <sashal@kernel.org> Sent: Friday, November 18, 2022 6:11 PM > > > > > > From: Anirudh Rayabharam <anrayabh@linux.microsoft.com> > > > > > > [ Upstream commit 4ad1aa571214e8d6468a1806794d987b374b5a08 ] > > > > > > Add a data structure to represent the reference TSC MSR similar to > > > other MSRs. This simplifies the code for updating the MSR. > > > > > > Signed-off-by: Anirudh Rayabharam <anrayabh@linux.microsoft.com> > > > Reviewed-by: Michael Kelley <mikelley@microsoft.com> > > > Link: https://lore.kernel.org/all/20221027095729.1676394-2-anrayabh@linux.microsoft.com/ > > > Signed-off-by: Wei Liu <wei.liu@kernel.org> > > > Signed-off-by: Sasha Levin <sashal@kernel.org> > > > > Sasha -- I don't think this patch needs to be backported to any stable versions. Anirudh > > or Wei Liu, can you confirm? The patch is more about enabling a new scenario than fixing a bug. > > Ack, I'll drop both of the patches you've pointed out. Thanks! Sorry for the late reply -- I think you should keep this patch and the other one. The other patch fixes a real issue while kexec'ing in the Linux root partition. This patch is a prerequisite for that. Thanks, Wei. > > -- > Thanks, > Sasha ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-11-25 15:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20221119021124.1773699-1-sashal@kernel.org>
2022-11-19 2:10 ` [PATCH AUTOSEL 6.0 13/44] clocksource/drivers/hyperv: add data structure for reference TSC MSR Sasha Levin
2022-11-19 5:37 ` Michael Kelley (LINUX)
2022-11-24 15:51 ` Sasha Levin
2022-11-25 15:39 ` Wei Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox