linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] kvm: fix MMIO/PIO collision misdetection
@ 2013-04-04 10:27 Michael S. Tsirkin
  2013-04-05  7:58 ` Paolo Bonzini
  2013-04-07 11:54 ` Gleb Natapov
  0 siblings, 2 replies; 3+ messages in thread
From: Michael S. Tsirkin @ 2013-04-04 10:27 UTC (permalink / raw)
  To: Marcelo Tosatti, Gleb Natapov
  Cc: Alex Williamson, Sasha Levin, kvm, linux-kernel

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 <mst@redhat.com>
---
 virt/kvm/eventfd.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index adb17f2..93e5b05 100644
--- a/virt/kvm/eventfd.c
+++ b/virt/kvm/eventfd.c
@@ -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)
-- 
MST

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] kvm: fix MMIO/PIO collision misdetection
  2013-04-04 10:27 [PATCH] kvm: fix MMIO/PIO collision misdetection Michael S. Tsirkin
@ 2013-04-05  7:58 ` Paolo Bonzini
  2013-04-07 11:54 ` Gleb Natapov
  1 sibling, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2013-04-05  7:58 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Marcelo Tosatti, Gleb Natapov, Alex Williamson, Sasha Levin, kvm,
	linux-kernel

Il 04/04/2013 12:27, Michael S. Tsirkin ha scritto:
> 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 <mst@redhat.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

> ---
>  virt/kvm/eventfd.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
> index adb17f2..93e5b05 100644
> --- a/virt/kvm/eventfd.c
> +++ b/virt/kvm/eventfd.c
> @@ -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)
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] kvm: fix MMIO/PIO collision misdetection
  2013-04-04 10:27 [PATCH] kvm: fix MMIO/PIO collision misdetection Michael S. Tsirkin
  2013-04-05  7:58 ` Paolo Bonzini
@ 2013-04-07 11:54 ` Gleb Natapov
  1 sibling, 0 replies; 3+ messages in thread
From: Gleb Natapov @ 2013-04-07 11:54 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Marcelo Tosatti, Alex Williamson, Sasha Levin, kvm, linux-kernel

On Thu, Apr 04, 2013 at 01:27:21PM +0300, Michael S. Tsirkin wrote:
> 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 <mst@redhat.com>
Applied, thanks.

> ---
>  virt/kvm/eventfd.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
> index adb17f2..93e5b05 100644
> --- a/virt/kvm/eventfd.c
> +++ b/virt/kvm/eventfd.c
> @@ -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)
> -- 
> MST

--
			Gleb.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-04-07 11:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-04 10:27 [PATCH] kvm: fix MMIO/PIO collision misdetection Michael S. Tsirkin
2013-04-05  7:58 ` Paolo Bonzini
2013-04-07 11:54 ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).