Re: [Xen-devel] [PATCH v4 08/10] xen/arm: Disable timers and release their interrupts on CPU hot-unplug
Hi, On 15/05/18 12:44, Mirela Simonovic wrote: When a CPU is hot-unplugged we need to disable timers and release their interrupts in order to free the memory that was allocated when interrupts were requested (using request_irq()). The request_irq() is called for each timer interrupt when the CPU gets hotplugged (start_secondary->init_timer_interrupt->request_irq). With this patch timers will be disabled and interrupts will be released when the newly added callback receives CPU_DYING event. Signed-off-by: Mirela Simonovic Acked-by: Julien Grall Cheers, --- CC: Stefano Stabellini CC: Julien Grall --- Changes in v3: -Trigger releasing of timer interrupts using notifiers Changes in v4: -Fix commit message to include disabling of timers -Disable timers prior to releasing interrupts -Add new line before the return in cpu_time_notifier_init() -Add includes alphabetically -Fix indentation in cpu_time_callback() definition --- xen/arch/arm/time.c | 45 + 1 file changed, 45 insertions(+) diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index c11fcfeadd..1635c8822d 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -312,6 +314,21 @@ void init_timer_interrupt(void) check_timer_irq_cfg(timer_irq[TIMER_PHYS_NONSECURE_PPI], "NS-physical"); } +/* + * Revert actions done in init_timer_interrupt that are required to properly + * disable this CPU. + */ +static void deinit_timer_interrupt(void) +{ +WRITE_SYSREG32(0, CNTP_CTL_EL0);/* Disable physical timer */ +WRITE_SYSREG32(0, CNTHP_CTL_EL2); /* Disable hypervisor's timer */ +isb(); + +release_irq(timer_irq[TIMER_HYP_PPI], NULL); +release_irq(timer_irq[TIMER_VIRT_PPI], NULL); +release_irq(timer_irq[TIMER_PHYS_NONSECURE_PPI], NULL); +} + /* Wait a set number of microseconds */ void udelay(unsigned long usecs) { @@ -340,6 +357,34 @@ void domain_set_time_offset(struct domain *d, int64_t time_offset_seconds) /* XXX update guest visible wallclock time */ } +static int cpu_time_callback(struct notifier_block *nfb, + unsigned long action, + void *hcpu) +{ +switch ( action ) +{ +case CPU_DYING: +deinit_timer_interrupt(); +break; +default: +break; +} + +return NOTIFY_DONE; +} + +static struct notifier_block cpu_time_nfb = { +.notifier_call = cpu_time_callback, +}; + +static int __init cpu_time_notifier_init(void) +{ +register_cpu_notifier(_time_nfb); + +return 0; +} +__initcall(cpu_time_notifier_init); + /* * Local variables: * mode: C -- Julien Grall ___ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
[Xen-devel] [PATCH v4 08/10] xen/arm: Disable timers and release their interrupts on CPU hot-unplug
When a CPU is hot-unplugged we need to disable timers and release their interrupts in order to free the memory that was allocated when interrupts were requested (using request_irq()). The request_irq() is called for each timer interrupt when the CPU gets hotplugged (start_secondary->init_timer_interrupt->request_irq). With this patch timers will be disabled and interrupts will be released when the newly added callback receives CPU_DYING event. Signed-off-by: Mirela Simonovic--- CC: Stefano Stabellini CC: Julien Grall --- Changes in v3: -Trigger releasing of timer interrupts using notifiers Changes in v4: -Fix commit message to include disabling of timers -Disable timers prior to releasing interrupts -Add new line before the return in cpu_time_notifier_init() -Add includes alphabetically -Fix indentation in cpu_time_callback() definition --- xen/arch/arm/time.c | 45 + 1 file changed, 45 insertions(+) diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index c11fcfeadd..1635c8822d 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -312,6 +314,21 @@ void init_timer_interrupt(void) check_timer_irq_cfg(timer_irq[TIMER_PHYS_NONSECURE_PPI], "NS-physical"); } +/* + * Revert actions done in init_timer_interrupt that are required to properly + * disable this CPU. + */ +static void deinit_timer_interrupt(void) +{ +WRITE_SYSREG32(0, CNTP_CTL_EL0);/* Disable physical timer */ +WRITE_SYSREG32(0, CNTHP_CTL_EL2); /* Disable hypervisor's timer */ +isb(); + +release_irq(timer_irq[TIMER_HYP_PPI], NULL); +release_irq(timer_irq[TIMER_VIRT_PPI], NULL); +release_irq(timer_irq[TIMER_PHYS_NONSECURE_PPI], NULL); +} + /* Wait a set number of microseconds */ void udelay(unsigned long usecs) { @@ -340,6 +357,34 @@ void domain_set_time_offset(struct domain *d, int64_t time_offset_seconds) /* XXX update guest visible wallclock time */ } +static int cpu_time_callback(struct notifier_block *nfb, + unsigned long action, + void *hcpu) +{ +switch ( action ) +{ +case CPU_DYING: +deinit_timer_interrupt(); +break; +default: +break; +} + +return NOTIFY_DONE; +} + +static struct notifier_block cpu_time_nfb = { +.notifier_call = cpu_time_callback, +}; + +static int __init cpu_time_notifier_init(void) +{ +register_cpu_notifier(_time_nfb); + +return 0; +} +__initcall(cpu_time_notifier_init); + /* * Local variables: * mode: C -- 2.13.0 ___ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel