On 02/11/2016 09:33 AM, Julien Grall wrote: > Introduce a structure which are filled up by the arch timer driver and > used by the virtual timer in KVM. > > The first member of this structure will be the timecounter. More members > will be added later. > > This is also dropping arch_timer_get_timecounter as it was only used by > the KVM code. Furthermore, a stub for the new helper hasn't been > introduced because KVM is requiring the arch timer for both ARM64 and > ARM32. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > --- > Cc: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Christoffer Dall <christoffer.dall@xxxxxxxxxx> > Cc: Marc Zyngier <marc.zyngier@xxxxxxx> > Cc: Gleb Natapov <gleb@xxxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > drivers/clocksource/arm_arch_timer.c | 9 +++++---- > include/clocksource/arm_arch_timer.h | 12 ++++++------ > virt/kvm/arm/arch_timer.c | 6 +++--- > 3 files changed, 14 insertions(+), 13 deletions(-) > > diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c > index c64d543..6eb2c5d 100644 > --- a/drivers/clocksource/arm_arch_timer.c > +++ b/drivers/clocksource/arm_arch_timer.c > @@ -447,11 +447,11 @@ static struct cyclecounter cyclecounter = { > .mask = CLOCKSOURCE_MASK(56), > }; > > -static struct timecounter timecounter; > +static struct arch_timer_kvm_info arch_timer_kvm_info; > > -struct timecounter *arch_timer_get_timecounter(void) > +struct arch_timer_kvm_info *arch_timer_get_kvm_info(void) > { > - return &timecounter; > + return &arch_timer_kvm_info; > } > > static void __init arch_counter_register(unsigned type) > @@ -479,7 +479,8 @@ static void __init arch_counter_register(unsigned type) > clocksource_register_hz(&clocksource_counter, arch_timer_rate); > cyclecounter.mult = clocksource_counter.mult; > cyclecounter.shift = clocksource_counter.shift; > - timecounter_init(&timecounter, &cyclecounter, start_count); > + timecounter_init(&arch_timer_kvm_info.timecounter, > + &cyclecounter, start_count); > > /* 56 bits minimum, so we assume worst case rollover */ > sched_clock_register(arch_timer_read_counter, 56, arch_timer_rate); > diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h > index 25d0914..4d487f8 100644 > --- a/include/clocksource/arm_arch_timer.h > +++ b/include/clocksource/arm_arch_timer.h > @@ -49,11 +49,16 @@ enum arch_timer_reg { > > #define ARCH_TIMER_EVT_STREAM_FREQ 10000 /* 100us */ > > +struct arch_timer_kvm_info { > + struct timecounter timecounter; > +}; > + > #ifdef CONFIG_ARM_ARCH_TIMER > > extern u32 arch_timer_get_rate(void); > extern u64 (*arch_timer_read_counter)(void); > -extern struct timecounter *arch_timer_get_timecounter(void); > + > +extern struct arch_timer_kvm_info *arch_timer_get_kvm_info(void); > > #else > > @@ -67,11 +72,6 @@ static inline u64 arch_timer_read_counter(void) > return 0; > } > > -static inline struct timecounter *arch_timer_get_timecounter(void) > -{ > - return NULL; > -} > - Most parts are OK. Regarding removing this function from the #else area, is there a possibility to have CONFIG_ARM_ARCH_TIMER=n and CONFIG_KVM=y. If so, will the compilation fails here? -Wei > #endif > > #endif > diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c > index 69bca18..a669c6a 100644 > --- a/virt/kvm/arm/arch_timer.c > +++ b/virt/kvm/arm/arch_timer.c > @@ -385,11 +385,11 @@ int kvm_timer_hyp_init(void) > { > struct device_node *np; > unsigned int ppi; > + struct arch_timer_kvm_info *info; > int err; > > - timecounter = arch_timer_get_timecounter(); > - if (!timecounter) > - return -ENODEV; > + info = arch_timer_get_kvm_info(); > + timecounter = &info->timecounter; > > np = of_find_matching_node(NULL, arch_timer_of_match); > if (!np) { > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html