Re: [PATCH 15/16] ARM: KVM: timer: add cpu hotplug notifier

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On Thursday, December 6, 2012, Marc Zyngier wrote:
Register a CPU hotplug notifier that disables/enables the interrupt
as requested.

Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
---
 arch/arm/kvm/arch_timer.c | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/arch/arm/kvm/arch_timer.c b/arch/arm/kvm/arch_timer.c
index 8f5ed0e..3435915 100644
--- a/arch/arm/kvm/arch_timer.c
+++ b/arch/arm/kvm/arch_timer.c
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */

+#include <linux/cpu.h>
 #include <linux/of_irq.h>
 #include <linux/kvm.h>
 #include <linux/kvm_host.h>
@@ -152,11 +153,30 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu)

 static void kvm_timer_init_interrupt(void *info)
 {
-       unsigned int *irqp = info;
+       enable_percpu_irq(timer_irq.irq, 0);
+}
+
+
+static int kvm_timer_cpu_notify(struct notifier_block *self,
+                               unsigned long action, void *cpu)
+{
+       switch (action) {
+       case CPU_STARTING:
+       case CPU_STARTING_FROZEN:
+               kvm_timer_init_interrupt(NULL);
+               break;
+       case CPU_DYING:
+       case CPU_DYING_FROZEN:
+               disable_percpu_irq(timer_irq.irq);
+               break;
+       }

-       enable_percpu_irq(*irqp, 0);
+       return NOTIFY_OK;
 }

+static struct notifier_block kvm_timer_cpu_nb = {
+       .notifier_call = kvm_timer_cpu_notify,
+};

 static const struct of_device_id arch_timer_of_match[] = {
        { .compatible   = "arm,armv7-timer",    },
@@ -195,16 +215,25 @@ int kvm_timer_hyp_init(void)

        timer_irq.irq = ppi;

+       err = register_cpu_notifier(&kvm_timer_cpu_nb);
+       if (err) {
+               kvm_err("Cannot register timer CPU notifier\n");
+               goto out;
+       }
+
        wqueue = create_singlethread_workqueue("kvm_arch_timer");
        if (!wqueue) {
-               free_percpu_irq(ppi, kvm_get_running_vcpus());
-               return -ENOMEM;
+               err = -ENOMEM;
+               goto out;
        }

        kvm_info("%s IRQ%d\n", np->name, ppi);
-       on_each_cpu(kvm_timer_init_interrupt, &ppi, 1);
+       on_each_cpu(kvm_timer_init_interrupt, NULL, 1);

        return 0;
+out:
+       free_percpu_irq(ppi, kvm_get_running_vcpus());
+       return err;
 }

 void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu)
--
1.8.0.1

ack 
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm

[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux