@@ -368,7 +368,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)
368
368
vgic_v4_teardown (kvm );
369
369
}
370
370
371
- void kvm_vgic_vcpu_destroy (struct kvm_vcpu * vcpu )
371
+ static void __kvm_vgic_vcpu_destroy (struct kvm_vcpu * vcpu )
372
372
{
373
373
struct vgic_cpu * vgic_cpu = & vcpu -> arch .vgic_cpu ;
374
374
@@ -379,29 +379,39 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
379
379
vgic_flush_pending_lpis (vcpu );
380
380
381
381
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
+ }
383
386
}
384
387
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 )
386
398
{
387
399
struct kvm_vcpu * vcpu ;
388
400
unsigned long i ;
389
401
390
- lockdep_assert_held (& kvm -> arch . config_lock );
402
+ mutex_lock (& kvm -> slots_lock );
391
403
392
404
vgic_debug_destroy (kvm );
393
405
394
406
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 );
396
410
397
411
kvm_vgic_dist_destroy (kvm );
398
- }
399
412
400
- void kvm_vgic_destroy (struct kvm * kvm )
401
- {
402
- mutex_lock (& kvm -> arch .config_lock );
403
- __kvm_vgic_destroy (kvm );
404
413
mutex_unlock (& kvm -> arch .config_lock );
414
+ mutex_unlock (& kvm -> slots_lock );
405
415
}
406
416
407
417
/**
@@ -469,25 +479,26 @@ int kvm_vgic_map_resources(struct kvm *kvm)
469
479
type = VGIC_V3 ;
470
480
}
471
481
472
- if (ret ) {
473
- __kvm_vgic_destroy (kvm );
482
+ if (ret )
474
483
goto out ;
475
- }
484
+
476
485
dist -> ready = true;
477
486
dist_base = dist -> vgic_dist_base ;
478
487
mutex_unlock (& kvm -> arch .config_lock );
479
488
480
489
ret = vgic_register_dist_iodev (kvm , dist_base , type );
481
- if (ret ) {
490
+ if (ret )
482
491
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 ;
487
492
493
+ goto out_slots ;
488
494
out :
489
495
mutex_unlock (& kvm -> arch .config_lock );
496
+ out_slots :
490
497
mutex_unlock (& kvm -> slots_lock );
498
+
499
+ if (ret )
500
+ kvm_vgic_destroy (kvm );
501
+
491
502
return ret ;
492
503
}
493
504
0 commit comments