@@ -368,7 +368,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)
368368 vgic_v4_teardown (kvm );
369369}
370370
371- void kvm_vgic_vcpu_destroy (struct kvm_vcpu * vcpu )
371+ static void __kvm_vgic_vcpu_destroy (struct kvm_vcpu * vcpu )
372372{
373373 struct vgic_cpu * vgic_cpu = & vcpu -> arch .vgic_cpu ;
374374
@@ -379,29 +379,39 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
379379 vgic_flush_pending_lpis (vcpu );
380380
381381 INIT_LIST_HEAD (& vgic_cpu -> ap_list_head );
382- vgic_cpu -> rd_iodev .base_addr = VGIC_ADDR_UNDEF ;
382+ if (vcpu -> kvm -> arch .vgic .vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3 ) {
383+ vgic_unregister_redist_iodev (vcpu );
384+ vgic_cpu -> rd_iodev .base_addr = VGIC_ADDR_UNDEF ;
385+ }
383386}
384387
385- static void __kvm_vgic_destroy (struct kvm * kvm )
388+ void kvm_vgic_vcpu_destroy (struct kvm_vcpu * vcpu )
389+ {
390+ struct kvm * kvm = vcpu -> kvm ;
391+
392+ mutex_lock (& kvm -> slots_lock );
393+ __kvm_vgic_vcpu_destroy (vcpu );
394+ mutex_unlock (& kvm -> slots_lock );
395+ }
396+
397+ void kvm_vgic_destroy (struct kvm * kvm )
386398{
387399 struct kvm_vcpu * vcpu ;
388400 unsigned long i ;
389401
390- lockdep_assert_held (& kvm -> arch . config_lock );
402+ mutex_lock (& kvm -> slots_lock );
391403
392404 vgic_debug_destroy (kvm );
393405
394406 kvm_for_each_vcpu (i , vcpu , kvm )
395- kvm_vgic_vcpu_destroy (vcpu );
407+ __kvm_vgic_vcpu_destroy (vcpu );
408+
409+ mutex_lock (& kvm -> arch .config_lock );
396410
397411 kvm_vgic_dist_destroy (kvm );
398- }
399412
400- void kvm_vgic_destroy (struct kvm * kvm )
401- {
402- mutex_lock (& kvm -> arch .config_lock );
403- __kvm_vgic_destroy (kvm );
404413 mutex_unlock (& kvm -> arch .config_lock );
414+ mutex_unlock (& kvm -> slots_lock );
405415}
406416
407417/**
@@ -469,25 +479,26 @@ int kvm_vgic_map_resources(struct kvm *kvm)
469479 type = VGIC_V3 ;
470480 }
471481
472- if (ret ) {
473- __kvm_vgic_destroy (kvm );
482+ if (ret )
474483 goto out ;
475- }
484+
476485 dist -> ready = true;
477486 dist_base = dist -> vgic_dist_base ;
478487 mutex_unlock (& kvm -> arch .config_lock );
479488
480489 ret = vgic_register_dist_iodev (kvm , dist_base , type );
481- if (ret ) {
490+ if (ret )
482491 kvm_err ("Unable to register VGIC dist MMIO regions\n" );
483- kvm_vgic_destroy (kvm );
484- }
485- mutex_unlock (& kvm -> slots_lock );
486- return ret ;
487492
493+ goto out_slots ;
488494out :
489495 mutex_unlock (& kvm -> arch .config_lock );
496+ out_slots :
490497 mutex_unlock (& kvm -> slots_lock );
498+
499+ if (ret )
500+ kvm_vgic_destroy (kvm );
501+
491502 return ret ;
492503}
493504
0 commit comments