Hi,
On 27/04/18 18:12, Mirela Simonovic wrote:
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.simono...@aggios.com>
---
CC: Stefano Stabellini <sstabell...@kernel.org>
CC: Julien Grall <julien.gr...@arm.com>
---
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)
+{
Any reason to not disable the timer here? But I think we need to finish
the discussion on the previous series regarding the purpose of the
mdelay before going further with that patch. See patch v2 7/10. I would
also appreciate answer to my question there.
+ 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
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel