Message ID | 1458231136-13457-4-git-send-email-joao.m.martins@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 17/03/16 16:12, Joao Martins wrote: > And use to initialize platform time solely for clocksource=tsc, > as opposed to initializing platform overflow timer, which would > only fire in ~180 years (on 2.2 Ghz Broadwell processor). > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Again, just style corrections. Reviewed-by Andrew Cooper <andrew.cooper3@citrix.com> > diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c > index 1311c58..5af8902 100644 > --- a/xen/arch/x86/time.c > +++ b/xen/arch/x86/time.c > @@ -434,6 +434,7 @@ uint64_t ns_to_acpi_pm_tick(uint64_t ns) > /************************************************************ > * PLATFORM TIMER 4: TSC > */ > +static bool_t clocksource_is_tsc = 0; No need to explicitly initialise to 0. > static u64 tsc_freq; > static unsigned long tsc_max_warp; > static void tsc_check_reliability(void); > @@ -466,7 +467,7 @@ static int __init init_tsctimer(struct platform_timesource *pts) > } > > pts->frequency = tsc_freq; > - return tsc_reliable; > + return ( clocksource_is_tsc = tsc_reliable ); While this does work, please avoid mixing an assignment and a return. Something like pts->frequency = tsc_freq; clocksource_is_tsc = tsc_reliable; return tsc_reliable; is fine and easier logic to read. > @@ -633,11 +648,22 @@ static void __init init_platform_timer(void) > > set_time_scale(&plt_scale, pts->frequency); > > - plt_overflow_period = scale_delta( > - 1ull << (pts->counter_bits-1), &plt_scale); > - init_timer(&plt_overflow_timer, plt_overflow, NULL, 0); > plt_src = *pts; > - plt_overflow(NULL); > + > + if ( clocksource_is_tsc ) > + { > + plt_init(); > + } > + else > + { > + plt_overflow_period = scale_delta( > + 1ull << (pts->counter_bits-1), &plt_scale); As you are moving this codeblock, please fix the style to (pts->counter_bits - 1) ~Andrew
On 03/18/2016 08:32 PM, Andrew Cooper wrote: > On 17/03/16 16:12, Joao Martins wrote: >> And use to initialize platform time solely for clocksource=tsc, >> as opposed to initializing platform overflow timer, which would >> only fire in ~180 years (on 2.2 Ghz Broadwell processor). >> >> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > > Again, just style corrections. > > Reviewed-by Andrew Cooper <andrew.cooper3@citrix.com> > I've fixed all these comments in v2, too. Thanks! >> diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c >> index 1311c58..5af8902 100644 >> --- a/xen/arch/x86/time.c >> +++ b/xen/arch/x86/time.c >> @@ -434,6 +434,7 @@ uint64_t ns_to_acpi_pm_tick(uint64_t ns) >> /************************************************************ >> * PLATFORM TIMER 4: TSC >> */ >> +static bool_t clocksource_is_tsc = 0; > > No need to explicitly initialise to 0. > >> static u64 tsc_freq; >> static unsigned long tsc_max_warp; >> static void tsc_check_reliability(void); >> @@ -466,7 +467,7 @@ static int __init init_tsctimer(struct platform_timesource *pts) >> } >> >> pts->frequency = tsc_freq; >> - return tsc_reliable; >> + return ( clocksource_is_tsc = tsc_reliable ); > > While this does work, please avoid mixing an assignment and a return. > > Something like > > pts->frequency = tsc_freq; > clocksource_is_tsc = tsc_reliable; > > return tsc_reliable; > > is fine and easier logic to read. > >> @@ -633,11 +648,22 @@ static void __init init_platform_timer(void) >> >> set_time_scale(&plt_scale, pts->frequency); >> >> - plt_overflow_period = scale_delta( >> - 1ull << (pts->counter_bits-1), &plt_scale); >> - init_timer(&plt_overflow_timer, plt_overflow, NULL, 0); >> plt_src = *pts; >> - plt_overflow(NULL); >> + >> + if ( clocksource_is_tsc ) >> + { >> + plt_init(); >> + } >> + else >> + { >> + plt_overflow_period = scale_delta( >> + 1ull << (pts->counter_bits-1), &plt_scale); > > As you are moving this codeblock, please fix the style to > (pts->counter_bits - 1) > > ~Andrew >
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 1311c58..5af8902 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -434,6 +434,7 @@ uint64_t ns_to_acpi_pm_tick(uint64_t ns) /************************************************************ * PLATFORM TIMER 4: TSC */ +static bool_t clocksource_is_tsc = 0; static u64 tsc_freq; static unsigned long tsc_max_warp; static void tsc_check_reliability(void); @@ -466,7 +467,7 @@ static int __init init_tsctimer(struct platform_timesource *pts) } pts->frequency = tsc_freq; - return tsc_reliable; + return ( clocksource_is_tsc = tsc_reliable ); } static u64 read_tsc(void) @@ -516,17 +517,31 @@ static s_time_t __read_platform_stime(u64 platform_time) return (stime_platform_stamp + scale_delta(diff, &plt_scale)); } +static void __plt_init(void) +{ + u64 count; + + ASSERT(spin_is_locked(&platform_timer_lock)); + count = plt_src.read_counter(); + plt_stamp64 += (count - plt_stamp) & plt_mask; + plt_stamp = count; +} + +static void plt_init(void) +{ + spin_lock_irq(&platform_timer_lock); + __plt_init(); + spin_unlock_irq(&platform_timer_lock); +} + static void plt_overflow(void *unused) { int i; - u64 count; s_time_t now, plt_now, plt_wrap; spin_lock_irq(&platform_timer_lock); - count = plt_src.read_counter(); - plt_stamp64 += (count - plt_stamp) & plt_mask; - plt_stamp = count; + __plt_init(); now = NOW(); plt_wrap = __read_platform_stime(plt_stamp64); @@ -633,11 +648,22 @@ static void __init init_platform_timer(void) set_time_scale(&plt_scale, pts->frequency); - plt_overflow_period = scale_delta( - 1ull << (pts->counter_bits-1), &plt_scale); - init_timer(&plt_overflow_timer, plt_overflow, NULL, 0); plt_src = *pts; - plt_overflow(NULL); + + if ( clocksource_is_tsc ) + { + plt_init(); + } + else + { + plt_overflow_period = scale_delta( + 1ull << (pts->counter_bits-1), &plt_scale); + init_timer(&plt_overflow_timer, plt_overflow, NULL, 0); + plt_overflow(NULL); + + printk("Platform timer overflow period is %lu secs\n", + plt_overflow_period/SECONDS(1)); + } platform_timer_stamp = plt_stamp64; stime_platform_stamp = NOW();
And use to initialize platform time solely for clocksource=tsc, as opposed to initializing platform overflow timer, which would only fire in ~180 years (on 2.2 Ghz Broadwell processor). Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- Cc: Keir Fraser <keir@xen.org> Cc: Jan Beulich <jbeulich@suse.com> Cc: Andrew Cooper <andrew.cooper3@citrix.com> Changes since RFC: - Move clocksource_is_tsc variable to this patch. - s/1000000000/SECONDS(1) --- xen/arch/x86/time.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-)