Message ID | 1455204804-31830-2-git-send-email-julien.grall@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@arm.com> > > --- > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Christoffer Dall <christoffer.dall@linaro.org> > Cc: Marc Zyngier <marc.zyngier@arm.com> > Cc: Gleb Natapov <gleb@kernel.org> > Cc: Paolo Bonzini <pbonzini@redhat.com> > --- > 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello Wei, On 19/02/16 07:24, Wei Huang wrote: > On 02/11/2016 09:33 AM, Julien Grall wrote: [...] >> 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. [...] >> -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? This patch is removing arch_timer_get_timecounter. So it's normal to drop the stub in the #else area. Furthermore, as mentioned in the commit message, I didn't add a stub for the new function because KVM mandates the arch timer for both ARM64 and ARM32. Regards, -- Julien Grall IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 19/02/16 10:53, Julien Grall wrote: > -- > Julien Grall > IMPORTANT NOTICE: The contents of this email and any attachments are > confidential and may also be privileged. If you are not the intended > recipient, please notify the sender immediately and do not disclose the > contents to any other person, use it for any purpose, or store or copy > the information in any medium. Thank you. Apologies, this footer shouldn't have been there.
On 19/02/16 07:24, Wei Huang wrote: > > > 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@arm.com> >> >> --- >> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> >> Cc: Thomas Gleixner <tglx@linutronix.de> >> Cc: Christoffer Dall <christoffer.dall@linaro.org> >> Cc: Marc Zyngier <marc.zyngier@arm.com> >> Cc: Gleb Natapov <gleb@kernel.org> >> Cc: Paolo Bonzini <pbonzini@redhat.com> >> --- >> 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? On arm64, arch timers are not optional (see the "select ARM_ARCH_TIMER" in arch/arm64/Kconfig). On 32bit, we have "depends on ARM_VIRT_EXT && ARM_LPAE && ARM_ARCH_TIMER", which nails it as well. Thanks, M.
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; -} - #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) {
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@arm.com> --- Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Christoffer Dall <christoffer.dall@linaro.org> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Gleb Natapov <gleb@kernel.org> Cc: Paolo Bonzini <pbonzini@redhat.com> --- 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(-)