diff options
Diffstat (limited to 'virt/kvm/arm/vgic.c')
| -rw-r--r-- | virt/kvm/arm/vgic.c | 39 |
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 | ||
| 2329 | static void vgic_init_maintenance_interrupt(void *info) | 2329 | static 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 | ||
| 2334 | static int vgic_cpu_notify(struct notifier_block *self, | 2335 | static 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 | ||
| 2351 | static struct notifier_block vgic_cpu_nb = { | ||
| 2352 | .notifier_call = vgic_cpu_notify, | ||
| 2353 | }; | ||
| 2354 | |||
| 2355 | static int kvm_vgic_probe(void) | 2341 | static 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 | |||
| 2405 | out_free_irq: | ||
| 2406 | free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus()); | ||
| 2407 | return ret; | ||
| 2408 | } | 2385 | } |
| 2409 | 2386 | ||
| 2410 | int kvm_irq_map_gsi(struct kvm *kvm, | 2387 | int kvm_irq_map_gsi(struct kvm *kvm, |
