aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnna-Maria Gleixner <anna-maria@linutronix.de>2016-07-13 13:17:02 -0400
committerIngo Molnar <mingo@kernel.org>2016-07-15 04:41:43 -0400
commit15d7e3d349a329ad48a29c3a818eacd1c3f7e3ef (patch)
treee2b291209ac06fd750a893882f846c809ab944a7
parent31487f8328f20fdb302430b020a5d6e8446c1971 (diff)
KVM/arm/arm64/vgic-new: Convert to hotplug state machine
Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Cc: Andre Przywara <andre.przywara@arm.com> Cc: Christoffer Dall <christoffer.dall@linaro.org> Cc: Eric Auger <eric.auger@linaro.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Radim Krcmar <rkrcmar@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: kvm@vger.kernel.org Cc: kvmarm@lists.cs.columbia.edu Cc: linux-arm-kernel@lists.infradead.org Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20160713153337.900484868@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--include/linux/cpuhotplug.h1
-rw-r--r--virt/kvm/arm/vgic/vgic-init.c31
2 files changed, 10 insertions, 22 deletions
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index b5cf01ace71b..544b5563720e 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -51,6 +51,7 @@ enum cpuhp_state {
51 CPUHP_AP_QCOM_TIMER_STARTING, 51 CPUHP_AP_QCOM_TIMER_STARTING,
52 CPUHP_AP_MIPS_GIC_TIMER_STARTING, 52 CPUHP_AP_MIPS_GIC_TIMER_STARTING,
53 CPUHP_AP_KVM_STARTING, 53 CPUHP_AP_KVM_STARTING,
54 CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING,
54 CPUHP_AP_KVM_ARM_VGIC_STARTING, 55 CPUHP_AP_KVM_ARM_VGIC_STARTING,
55 CPUHP_AP_KVM_ARM_TIMER_STARTING, 56 CPUHP_AP_KVM_ARM_TIMER_STARTING,
56 CPUHP_AP_ARM_XEN_STARTING, 57 CPUHP_AP_ARM_XEN_STARTING,
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c
index a1442f7c9c4d..2c7f0d5a62ea 100644
--- a/virt/kvm/arm/vgic/vgic-init.c
+++ b/virt/kvm/arm/vgic/vgic-init.c
@@ -353,32 +353,19 @@ out:
353 353
354/* GENERIC PROBE */ 354/* GENERIC PROBE */
355 355
356static void vgic_init_maintenance_interrupt(void *info) 356static int vgic_init_cpu_starting(unsigned int cpu)
357{ 357{
358 enable_percpu_irq(kvm_vgic_global_state.maint_irq, 0); 358 enable_percpu_irq(kvm_vgic_global_state.maint_irq, 0);
359 return 0;
359} 360}
360 361
361static int vgic_cpu_notify(struct notifier_block *self,
362 unsigned long action, void *cpu)
363{
364 switch (action) {
365 case CPU_STARTING:
366 case CPU_STARTING_FROZEN:
367 vgic_init_maintenance_interrupt(NULL);
368 break;
369 case CPU_DYING:
370 case CPU_DYING_FROZEN:
371 disable_percpu_irq(kvm_vgic_global_state.maint_irq);
372 break;
373 }
374 362
375 return NOTIFY_OK; 363static int vgic_init_cpu_dying(unsigned int cpu)
364{
365 disable_percpu_irq(kvm_vgic_global_state.maint_irq);
366 return 0;
376} 367}
377 368
378static struct notifier_block vgic_cpu_nb = {
379 .notifier_call = vgic_cpu_notify,
380};
381
382static irqreturn_t vgic_maintenance_handler(int irq, void *data) 369static irqreturn_t vgic_maintenance_handler(int irq, void *data)
383{ 370{
384 /* 371 /*
@@ -434,14 +421,14 @@ int kvm_vgic_hyp_init(void)
434 return ret; 421 return ret;
435 } 422 }
436 423
437 ret = __register_cpu_notifier(&vgic_cpu_nb); 424 ret = cpuhp_setup_state(CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING,
425 "AP_KVM_ARM_VGIC_INIT_STARTING",
426 vgic_init_cpu_starting, vgic_init_cpu_dying);
438 if (ret) { 427 if (ret) {
439 kvm_err("Cannot register vgic CPU notifier\n"); 428 kvm_err("Cannot register vgic CPU notifier\n");
440 goto out_free_irq; 429 goto out_free_irq;
441 } 430 }
442 431
443 on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
444
445 kvm_info("vgic interrupt IRQ%d\n", kvm_vgic_global_state.maint_irq); 432 kvm_info("vgic interrupt IRQ%d\n", kvm_vgic_global_state.maint_irq);
446 return 0; 433 return 0;
447 434