[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 08/10] xen/arm: Release timer interrupts when CPU is hot-unplugged
When a CPU is hot-unplugged timer interrupts have to be released in order to free the memory that was allocated when the 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 the timer interrupts will be released when the newly added callback receives CPU_DYING event. Signed-off-by: Mirela Simonovic <mirela.simonovic@xxxxxxxxxx> --- CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Julien Grall <julien.grall@xxxxxxx> --- Changes in v3: -Trigger releasing of timer interrupts using notifiers --- xen/arch/arm/time.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index c11fcfeadd..c7317e4639 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -29,6 +29,8 @@ #include <xen/sched.h> #include <xen/event.h> #include <xen/acpi.h> +#include <xen/notifier.h> +#include <xen/cpu.h> #include <asm/system.h> #include <asm/time.h> #include <asm/vgic.h> @@ -312,6 +314,17 @@ 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) +{ + 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 +353,32 @@ 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(&cpu_time_nfb); + return 0; +} +__initcall(cpu_time_notifier_init); + /* * Local variables: * mode: C -- 2.13.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |