Skip to content

Commit 85da11c

Browse files
jasowangbonzini
authored andcommitted
kvm: factor out core eventfd assign/deassign logic
This patch factors out core eventfd assign/deassign logic and leaves the argument checking and bus index selection to callers. Cc: [email protected] Cc: Gleb Natapov <[email protected]> Cc: Paolo Bonzini <[email protected]> Signed-off-by: Jason Wang <[email protected]> Reviewed-by: Cornelia Huck <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 8453fec commit 85da11c

File tree

1 file changed

+50
-35
lines changed

1 file changed

+50
-35
lines changed

virt/kvm/eventfd.c

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

875849
static 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+
921936
int
922937
kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
923938
{

0 commit comments

Comments
 (0)