[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/HPET: avoid an indirect call
When this code was written, indirect branches still weren't considered much of a problem (besides being a little slower). Instead of a function pointer, pass a boolean to _disable_pit_irq(), thus allowing to eliminate two ENDBR (one of them in .text). Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -563,7 +563,7 @@ static void cf_check handle_rtc_once(uin } } -void __init cf_check hpet_broadcast_init(void) +void __init hpet_broadcast_init(void) { u64 hpet_rate = hpet_setup(); u32 hpet_id, cfg; @@ -634,7 +634,7 @@ void __init cf_check hpet_broadcast_init hpet_events->flags = HPET_EVT_LEGACY; } -void cf_check hpet_broadcast_resume(void) +void hpet_broadcast_resume(void) { u32 cfg; unsigned int i, n; --- a/xen/arch/x86/include/asm/hpet.h +++ b/xen/arch/x86/include/asm/hpet.h @@ -89,8 +89,8 @@ void hpet_disable_legacy_replacement_mod * Temporarily use an HPET event counter for timer interrupt handling, * rather than using the LAPIC timer. Used for Cx state entry. */ -void cf_check hpet_broadcast_init(void); -void cf_check hpet_broadcast_resume(void); +void hpet_broadcast_init(void); +void hpet_broadcast_resume(void); void cf_check hpet_broadcast_enter(void); void cf_check hpet_broadcast_exit(void); int hpet_broadcast_is_available(void); --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -2427,7 +2427,7 @@ void __init early_time_init(void) } /* keep pit enabled for pit_broadcast working while cpuidle enabled */ -static int _disable_pit_irq(void(*hpet_broadcast_setup)(void)) +static int _disable_pit_irq(bool init) { int ret = 1; @@ -2442,13 +2442,13 @@ static int _disable_pit_irq(void(*hpet_b */ if ( cpuidle_using_deep_cstate() && !boot_cpu_has(X86_FEATURE_ARAT) ) { - hpet_broadcast_setup(); + init ? hpet_broadcast_init() : hpet_broadcast_resume(); if ( !hpet_broadcast_is_available() ) { if ( xen_cpuidle > 0 ) { - printk("%ps() failed, turning to PIT broadcast\n", - hpet_broadcast_setup); + printk("hpet_broadcast_%s() failed, turning to PIT broadcast\n", + init ? "init" : "resume"); return -1; } ret = 0; @@ -2465,7 +2465,7 @@ static int _disable_pit_irq(void(*hpet_b static int __init cf_check disable_pit_irq(void) { - if ( !_disable_pit_irq(hpet_broadcast_init) ) + if ( !_disable_pit_irq(true) ) { xen_cpuidle = 0; printk("CPUIDLE: disabled due to no HPET. " @@ -2526,7 +2526,7 @@ int time_resume(void) resume_platform_timer(); - if ( !_disable_pit_irq(hpet_broadcast_resume) ) + if ( !_disable_pit_irq(false) ) BUG(); init_percpu_time();
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |