@@ -817,25 +817,13 @@ static int kvm_assign_ioeventfd_idx(struct kvm *kvm,
817
817
if (ret < 0 )
818
818
goto unlock_fail ;
819
819
820
- /* When length is ignored, MMIO is also put on a separate bus, for
821
- * faster lookups.
822
- */
823
- if (!args -> len && bus_idx == KVM_MMIO_BUS ) {
824
- ret = kvm_io_bus_register_dev (kvm , KVM_FAST_MMIO_BUS ,
825
- p -> addr , 0 , & p -> dev );
826
- if (ret < 0 )
827
- goto register_fail ;
828
- }
829
-
830
820
kvm -> buses [bus_idx ]-> ioeventfd_count ++ ;
831
821
list_add_tail (& p -> list , & kvm -> ioeventfds );
832
822
833
823
mutex_unlock (& kvm -> slots_lock );
834
824
835
825
return 0 ;
836
826
837
- register_fail :
838
- kvm_io_bus_unregister_dev (kvm , bus_idx , & p -> dev );
839
827
unlock_fail :
840
828
mutex_unlock (& kvm -> slots_lock );
841
829
@@ -874,10 +862,6 @@ kvm_deassign_ioeventfd_idx(struct kvm *kvm, enum kvm_bus bus_idx,
874
862
continue ;
875
863
876
864
kvm_io_bus_unregister_dev (kvm , bus_idx , & p -> dev );
877
- if (!p -> length && p -> bus_idx == KVM_MMIO_BUS ) {
878
- kvm_io_bus_unregister_dev (kvm , KVM_FAST_MMIO_BUS ,
879
- & p -> dev );
880
- }
881
865
kvm -> buses [bus_idx ]-> ioeventfd_count -- ;
882
866
ioeventfd_release (p );
883
867
ret = 0 ;
@@ -894,14 +878,19 @@ kvm_deassign_ioeventfd_idx(struct kvm *kvm, enum kvm_bus bus_idx,
894
878
static int kvm_deassign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
895
879
{
896
880
enum kvm_bus bus_idx = ioeventfd_bus_from_flags (args -> flags );
881
+ int ret = kvm_deassign_ioeventfd_idx (kvm , bus_idx , args );
882
+
883
+ if (!args -> len && bus_idx == KVM_MMIO_BUS )
884
+ kvm_deassign_ioeventfd_idx (kvm , KVM_FAST_MMIO_BUS , args );
897
885
898
- return kvm_deassign_ioeventfd_idx ( kvm , bus_idx , args ) ;
886
+ return ret ;
899
887
}
900
888
901
889
static int
902
890
kvm_assign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
903
891
{
904
892
enum kvm_bus bus_idx ;
893
+ int ret ;
905
894
906
895
bus_idx = ioeventfd_bus_from_flags (args -> flags );
907
896
/* must be natural-word sized, or 0 to ignore length */
@@ -930,7 +919,25 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
930
919
KVM_IOEVENTFD_FLAG_DATAMATCH ))
931
920
return - EINVAL ;
932
921
933
- return kvm_assign_ioeventfd_idx (kvm , bus_idx , args );
922
+ ret = kvm_assign_ioeventfd_idx (kvm , bus_idx , args );
923
+ if (ret )
924
+ goto fail ;
925
+
926
+ /* When length is ignored, MMIO is also put on a separate bus, for
927
+ * faster lookups.
928
+ */
929
+ if (!args -> len && bus_idx == KVM_MMIO_BUS ) {
930
+ ret = kvm_assign_ioeventfd_idx (kvm , KVM_FAST_MMIO_BUS , args );
931
+ if (ret < 0 )
932
+ goto fast_fail ;
933
+ }
934
+
935
+ return 0 ;
936
+
937
+ fast_fail :
938
+ kvm_deassign_ioeventfd_idx (kvm , bus_idx , args );
939
+ fail :
940
+ return ret ;
934
941
}
935
942
936
943
int
0 commit comments