kvm: fix MMIO/PIO collision misdetection
PATCH 1/1 kvm: fix MMIO/PIO collision misdetection
PIO and MMIO are separate address spaces, but ioeventfd registration code mistakenly detected two eventfds as duplicate if they use the same address, even if one is PIO and another one MMIO.
Signed-off-by Michael S. Tsirkin <[email protected]>
--- virt/kvm/eventfd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
virt/kvm/eventfd.c +6 -2
@@ -577,6 +577,7 @@ struct _ioeventfd {struct eventfd_ctx *eventfd;u64 datamatch;struct kvm_io_device dev; +u8 bus_idx;bool wildcard; };
@@ -669,7 +670,8 @@ ioeventfd_check_collision(struct kvm *kvm, struct _ioeventfd *p)struct _ioeventfd *_p;list_for_each_entry (_p, &kvm->ioeventfds, list) -if (_p->addr == p->addr && _p->length == p->length && +if (_p->bus_idx == p->bus_idx && + _p->addr == p->addr && _p->length == p->length && (_p->wildcard || p->wildcard || _p->datamatch == p->datamatch))return true;
@@ -717,6 +719,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)INIT_LIST_HEAD (&p->list); p->addr = args->addr; + p->bus_idx = bus_idx; p->length = args->len; p->eventfd = eventfd;
@@ -775,7 +778,8 @@ kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)list_for_each_entry_safe (p, tmp, &kvm->ioeventfds, list) {bool wildcard = !(args->flags &KVM_IOEVENTFD_FLAG_DATAMATCH ); -if (p->eventfd != eventfd || +if (p->bus_idx != bus_idx || + p->eventfd != eventfd || p->addr != args->addr || p->length != args->len || p->wildcard != wildcard)
Signature · 1 line
MST
Il 04/04/2013 12:27, Michael S. Tsirkin ha scritto:
Quoted 6 lines
PIO and MMIO are separate address spaces, but ioeventfd registration code mistakenly detected two eventfds as duplicate if they use the same address, even if one is PIO and another one MMIO.
Signed-off-by Michael S. Tsirkin <[email protected]>
Reviewed-by Paolo Bonzini <[email protected]>
Quoted 45 lines
--- virt/kvm/eventfd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)virt/kvm/eventfd.c +6
-2@@ -577,6 +577,7 @@ struct _ioeventfd {struct eventfd_ctx *eventfd;u64 datamatch;struct kvm_io_device dev; +u8 bus_idx;bool wildcard; };@@ -669,7 +670,8 @@ ioeventfd_check_collision(struct kvm *kvm, struct _ioeventfd *p)struct _ioeventfd *_p;list_for_each_entry (_p, &kvm->ioeventfds, list) -if (_p->addr == p->addr && _p->length == p->length && +if (_p->bus_idx == p->bus_idx && + _p->addr == p->addr && _p->length == p->length && (_p->wildcard || p->wildcard || _p->datamatch == p->datamatch))return true;@@ -717,6 +719,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)INIT_LIST_HEAD (&p->list); p->addr = args->addr; + p->bus_idx = bus_idx; p->length = args->len; p->eventfd = eventfd;@@ -775,7 +778,8 @@ kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)list_for_each_entry_safe (p, tmp, &kvm->ioeventfds, list) {bool wildcard = !(args->flags &KVM_IOEVENTFD_FLAG_DATAMATCH ); -if (p->eventfd != eventfd || +if (p->bus_idx != bus_idx || + p->eventfd != eventfd || p->addr != args->addr || p->length != args->len || p->wildcard != wildcard)
Gleb Natapov
AppliedQuoted 6 lines · Michael S. Tsirkin
PIO and MMIO are separate address spaces, but ioeventfd registration code mistakenly detected two eventfds as duplicate if they use the same address, even if one is PIO and another one MMIO.
Signed-off-by Michael S. Tsirkin <[email protected]>
Applied, thanks.
Quoted 46 lines
--- virt/kvm/eventfd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)virt/kvm/eventfd.c +6
-2@@ -577,6 +577,7 @@ struct _ioeventfd {struct eventfd_ctx *eventfd;u64 datamatch;struct kvm_io_device dev; +u8 bus_idx;bool wildcard; };@@ -669,7 +670,8 @@ ioeventfd_check_collision(struct kvm *kvm, struct _ioeventfd *p)struct _ioeventfd *_p;list_for_each_entry (_p, &kvm->ioeventfds, list) -if (_p->addr == p->addr && _p->length == p->length && +if (_p->bus_idx == p->bus_idx && + _p->addr == p->addr && _p->length == p->length && (_p->wildcard || p->wildcard || _p->datamatch == p->datamatch))return true;@@ -717,6 +719,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)INIT_LIST_HEAD (&p->list); p->addr = args->addr; + p->bus_idx = bus_idx; p->length = args->len; p->eventfd = eventfd;@@ -775,7 +778,8 @@ kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)list_for_each_entry_safe (p, tmp, &kvm->ioeventfds, list) {bool wildcard = !(args->flags &KVM_IOEVENTFD_FLAG_DATAMATCH ); -if (p->eventfd != eventfd || +if (p->bus_idx != bus_idx || + p->eventfd != eventfd || p->addr != args->addr || p->length != args->len || p->wildcard != wildcard)Signature · 1 line
MST
--
Gleb.