Commit e9ea5069 authored by Jason Wang's avatar Jason Wang Committed by Paolo Bonzini

kvm: add capability for any-length ioeventfds

Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 931c33b1
...@@ -1604,7 +1604,7 @@ provided event instead of triggering an exit. ...@@ -1604,7 +1604,7 @@ provided event instead of triggering an exit.
struct kvm_ioeventfd { struct kvm_ioeventfd {
__u64 datamatch; __u64 datamatch;
__u64 addr; /* legal pio/mmio address */ __u64 addr; /* legal pio/mmio address */
__u32 len; /* 1, 2, 4, or 8 bytes */ __u32 len; /* 0, 1, 2, 4, or 8 bytes */
__s32 fd; __s32 fd;
__u32 flags; __u32 flags;
__u8 pad[36]; __u8 pad[36];
...@@ -1627,6 +1627,10 @@ to the registered address is equal to datamatch in struct kvm_ioeventfd. ...@@ -1627,6 +1627,10 @@ to the registered address is equal to datamatch in struct kvm_ioeventfd.
For virtio-ccw devices, addr contains the subchannel id and datamatch the For virtio-ccw devices, addr contains the subchannel id and datamatch the
virtqueue index. virtqueue index.
With KVM_CAP_IOEVENTFD_ANY_LENGTH, a zero length ioeventfd is allowed, and
the kernel will ignore the length of guest write and may get a faster vmexit.
The speedup may only apply to specific architectures, but the ioeventfd will
work anyway.
4.60 KVM_DIRTY_TLB 4.60 KVM_DIRTY_TLB
......
...@@ -830,6 +830,7 @@ struct kvm_ppc_smmu_info { ...@@ -830,6 +830,7 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_GUEST_DEBUG_HW_BPS 119 #define KVM_CAP_GUEST_DEBUG_HW_BPS 119
#define KVM_CAP_GUEST_DEBUG_HW_WPS 120 #define KVM_CAP_GUEST_DEBUG_HW_WPS 120
#define KVM_CAP_SPLIT_IRQCHIP 121 #define KVM_CAP_SPLIT_IRQCHIP 121
#define KVM_CAP_IOEVENTFD_ANY_LENGTH 122
#ifdef KVM_CAP_IRQ_ROUTING #ifdef KVM_CAP_IRQ_ROUTING
......
...@@ -914,9 +914,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) ...@@ -914,9 +914,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
return -EINVAL; return -EINVAL;
/* ioeventfd with no length can't be combined with DATAMATCH */ /* ioeventfd with no length can't be combined with DATAMATCH */
if (!args->len && if (!args->len && (args->flags & KVM_IOEVENTFD_FLAG_DATAMATCH))
args->flags & (KVM_IOEVENTFD_FLAG_PIO |
KVM_IOEVENTFD_FLAG_DATAMATCH))
return -EINVAL; return -EINVAL;
ret = kvm_assign_ioeventfd_idx(kvm, bus_idx, args); ret = kvm_assign_ioeventfd_idx(kvm, bus_idx, args);
......
...@@ -2718,6 +2718,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) ...@@ -2718,6 +2718,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
case KVM_CAP_IRQFD: case KVM_CAP_IRQFD:
case KVM_CAP_IRQFD_RESAMPLE: case KVM_CAP_IRQFD_RESAMPLE:
#endif #endif
case KVM_CAP_IOEVENTFD_ANY_LENGTH:
case KVM_CAP_CHECK_EXTENSION_VM: case KVM_CAP_CHECK_EXTENSION_VM:
return 1; return 1;
#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment