@@ -771,40 +771,14 @@ static enum kvm_bus ioeventfd_bus_from_flags(__u32 flags)
771771 return KVM_MMIO_BUS ;
772772}
773773
774- static int
775- kvm_assign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
774+ static int kvm_assign_ioeventfd_idx (struct kvm * kvm ,
775+ enum kvm_bus bus_idx ,
776+ struct kvm_ioeventfd * args )
776777{
777- enum kvm_bus bus_idx ;
778- struct _ioeventfd * p ;
779- struct eventfd_ctx * eventfd ;
780- int ret ;
781-
782- bus_idx = ioeventfd_bus_from_flags (args -> flags );
783- /* must be natural-word sized, or 0 to ignore length */
784- switch (args -> len ) {
785- case 0 :
786- case 1 :
787- case 2 :
788- case 4 :
789- case 8 :
790- break ;
791- default :
792- return - EINVAL ;
793- }
794-
795- /* check for range overflow */
796- if (args -> addr + args -> len < args -> addr )
797- return - EINVAL ;
798778
799- /* check for extra flags that we don't understand */
800- if (args -> flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK )
801- return - EINVAL ;
802-
803- /* ioeventfd with no length can't be combined with DATAMATCH */
804- if (!args -> len &&
805- args -> flags & (KVM_IOEVENTFD_FLAG_PIO |
806- KVM_IOEVENTFD_FLAG_DATAMATCH ))
807- return - EINVAL ;
779+ struct eventfd_ctx * eventfd ;
780+ struct _ioeventfd * p ;
781+ int ret ;
808782
809783 eventfd = eventfd_ctx_fdget (args -> fd );
810784 if (IS_ERR (eventfd ))
@@ -873,14 +847,13 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
873847}
874848
875849static int
876- kvm_deassign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
850+ kvm_deassign_ioeventfd_idx (struct kvm * kvm , enum kvm_bus bus_idx ,
851+ struct kvm_ioeventfd * args )
877852{
878- enum kvm_bus bus_idx ;
879853 struct _ioeventfd * p , * tmp ;
880854 struct eventfd_ctx * eventfd ;
881855 int ret = - ENOENT ;
882856
883- bus_idx = ioeventfd_bus_from_flags (args -> flags );
884857 eventfd = eventfd_ctx_fdget (args -> fd );
885858 if (IS_ERR (eventfd ))
886859 return PTR_ERR (eventfd );
@@ -918,6 +891,48 @@ kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
918891 return ret ;
919892}
920893
894+ static int kvm_deassign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
895+ {
896+ enum kvm_bus bus_idx = ioeventfd_bus_from_flags (args -> flags );
897+
898+ return kvm_deassign_ioeventfd_idx (kvm , bus_idx , args );
899+ }
900+
901+ static int
902+ kvm_assign_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
903+ {
904+ enum kvm_bus bus_idx ;
905+
906+ bus_idx = ioeventfd_bus_from_flags (args -> flags );
907+ /* must be natural-word sized, or 0 to ignore length */
908+ switch (args -> len ) {
909+ case 0 :
910+ case 1 :
911+ case 2 :
912+ case 4 :
913+ case 8 :
914+ break ;
915+ default :
916+ return - EINVAL ;
917+ }
918+
919+ /* check for range overflow */
920+ if (args -> addr + args -> len < args -> addr )
921+ return - EINVAL ;
922+
923+ /* check for extra flags that we don't understand */
924+ if (args -> flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK )
925+ return - EINVAL ;
926+
927+ /* ioeventfd with no length can't be combined with DATAMATCH */
928+ if (!args -> len &&
929+ args -> flags & (KVM_IOEVENTFD_FLAG_PIO |
930+ KVM_IOEVENTFD_FLAG_DATAMATCH ))
931+ return - EINVAL ;
932+
933+ return kvm_assign_ioeventfd_idx (kvm , bus_idx , args );
934+ }
935+
921936int
922937kvm_ioeventfd (struct kvm * kvm , struct kvm_ioeventfd * args )
923938{
0 commit comments