aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/arm/vgic.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/arm/vgic.c')
-rw-r--r--virt/kvm/arm/vgic.c39
1 files changed, 8 insertions, 31 deletions
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index c3bfbb981e73..67cb5e948be2 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -2326,32 +2326,18 @@ int vgic_has_attr_regs(const struct vgic_io_range *ranges, phys_addr_t offset)
2326 return -ENXIO; 2326 return -ENXIO;
2327} 2327}
2328 2328
2329static void vgic_init_maintenance_interrupt(void *info) 2329static int vgic_starting_cpu(unsigned int cpu)
2330{ 2330{
2331 enable_percpu_irq(vgic->maint_irq, 0); 2331 enable_percpu_irq(vgic->maint_irq, 0);
2332 return 0;
2332} 2333}
2333 2334
2334static int vgic_cpu_notify(struct notifier_block *self, 2335static int vgic_dying_cpu(unsigned int cpu)
2335 unsigned long action, void *cpu)
2336{ 2336{
2337 switch (action) { 2337 disable_percpu_irq(vgic->maint_irq);
2338 case CPU_STARTING: 2338 return 0;
2339 case CPU_STARTING_FROZEN:
2340 vgic_init_maintenance_interrupt(NULL);
2341 break;
2342 case CPU_DYING:
2343 case CPU_DYING_FROZEN:
2344 disable_percpu_irq(vgic->maint_irq);
2345 break;
2346 }
2347
2348 return NOTIFY_OK;
2349} 2339}
2350 2340
2351static struct notifier_block vgic_cpu_nb = {
2352 .notifier_call = vgic_cpu_notify,
2353};
2354
2355static int kvm_vgic_probe(void) 2341static int kvm_vgic_probe(void)
2356{ 2342{
2357 const struct gic_kvm_info *gic_kvm_info; 2343 const struct gic_kvm_info *gic_kvm_info;
@@ -2392,19 +2378,10 @@ int kvm_vgic_hyp_init(void)
2392 return ret; 2378 return ret;
2393 } 2379 }
2394 2380
2395 ret = __register_cpu_notifier(&vgic_cpu_nb); 2381 cpuhp_setup_state(CPUHP_AP_KVM_ARM_VGIC_STARTING,
2396 if (ret) { 2382 "AP_KVM_ARM_VGIC_STARTING", vgic_starting_cpu,
2397 kvm_err("Cannot register vgic CPU notifier\n"); 2383 vgic_dying_cpu);
2398 goto out_free_irq;
2399 }
2400
2401 on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
2402
2403 return 0; 2384 return 0;
2404
2405out_free_irq:
2406 free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus());
2407 return ret;
2408} 2385}
2409 2386
2410int kvm_irq_map_gsi(struct kvm *kvm, 2387int kvm_irq_map_gsi(struct kvm *kvm,