It is a workaround of current KVM's KVM_UNREGISTER_COALESCED_MMIO
interface. The kernel interface only allows to unregister an mmio
device with exactly the zone size when registered, or any smaller zone
that is included in the device mmio zone. It does not support the
userspace to specify a very large zone to remove all the small mmio
devices within the zone covered.
Logically speaking it would be nicer to fix this from KVM side, though
in all cases we still need to coop with old kernels so let's do this.
This patch has nothing to do with 3ac7d43a6fbb5d4a3 because this is
probably broken from the very beginning when the
KVM_UNREGISTER_COALESCED_MMIO interface is introduced in kernel.
However to make the backport to stables easier, I'm still using the
commit 3ac7d43a6fbb5d4a3 to track this problem because this will
depend on that otherwise even additions of mmio devices won't work.
Fixes: 3ac7d43a6fbb5d4a3
Signed-off-by: Peter Xu <peterx@redhat.com>
---
memory.c | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/memory.c b/memory.c
index c53dcfc092..7684b423f8 100644
--- a/memory.c
+++ b/memory.c
@@ -857,6 +857,9 @@ static void address_space_update_ioeventfds(AddressSpace *as)
static void flat_range_coalesced_io_del(FlatRange *fr, AddressSpace *as)
{
+ CoalescedMemoryRange *cmr;
+ AddrRange tmp;
+
if (!fr->has_coalesced_range) {
return;
}
@@ -865,9 +868,30 @@ static void flat_range_coalesced_io_del(FlatRange *fr, AddressSpace *as)
return;
}
- MEMORY_LISTENER_UPDATE_REGION(fr, as, Reverse, coalesced_io_del,
- int128_get64(fr->addr.start),
- int128_get64(fr->addr.size));
+ /*
+ * We split the big region into smaller ones to satisfy KVM's
+ * KVM_UNREGISTER_COALESCED_MMIO interface, where it does not
+ * allow to specify a large region to unregister all the devices
+ * under that zone instead it only accepts exact zones or even a
+ * smaller zone of previously registered mmio device. Logically
+ * speaking we should better fix KVM to allow the userspace to
+ * unregister multiple mmio devices within a large requested zone,
+ * but in all cases we'll still need to live with old kernels. So
+ * let's simply break the zones into exactly the small pieces when
+ * we do coalesced_io_add().
+ */
+ QTAILQ_FOREACH(cmr, &fr->mr->coalesced, link) {
+ tmp = addrrange_shift(cmr->addr,
+ int128_sub(fr->addr.start,
+ int128_make64(fr->offset_in_region)));
+ if (!addrrange_intersects(tmp, fr->addr)) {
+ continue;
+ }
+ tmp = addrrange_intersection(tmp, fr->addr);
+ MEMORY_LISTENER_UPDATE_REGION(fr, as, Reverse, coalesced_io_del,
+ int128_get64(tmp.start),
+ int128_get64(tmp.size));
+ }
}
static void flat_range_coalesced_io_add(FlatRange *fr, AddressSpace *as)
--
2.21.0
On 20/08/19 07:16, Peter Xu wrote:
> It is a workaround of current KVM's KVM_UNREGISTER_COALESCED_MMIO
> interface. The kernel interface only allows to unregister an mmio
> device with exactly the zone size when registered, or any smaller zone
> that is included in the device mmio zone. It does not support the
> userspace to specify a very large zone to remove all the small mmio
> devices within the zone covered.
>
> Logically speaking it would be nicer to fix this from KVM side, though
> in all cases we still need to coop with old kernels so let's do this.
>
> This patch has nothing to do with 3ac7d43a6fbb5d4a3 because this is
> probably broken from the very beginning when the
> KVM_UNREGISTER_COALESCED_MMIO interface is introduced in kernel.
> However to make the backport to stables easier, I'm still using the
> commit 3ac7d43a6fbb5d4a3 to track this problem because this will
> depend on that otherwise even additions of mmio devices won't work.
>
> Fixes: 3ac7d43a6fbb5d4a3
> Signed-off-by: Peter Xu <peterx@redhat.com>
What about my comments to this patch? :)
Paolo
> ---
> memory.c | 30 +++++++++++++++++++++++++++---
> 1 file changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/memory.c b/memory.c
> index c53dcfc092..7684b423f8 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -857,6 +857,9 @@ static void address_space_update_ioeventfds(AddressSpace *as)
>
> static void flat_range_coalesced_io_del(FlatRange *fr, AddressSpace *as)
> {
> + CoalescedMemoryRange *cmr;
> + AddrRange tmp;
> +
> if (!fr->has_coalesced_range) {
> return;
> }
> @@ -865,9 +868,30 @@ static void flat_range_coalesced_io_del(FlatRange *fr, AddressSpace *as)
> return;
> }
>
> - MEMORY_LISTENER_UPDATE_REGION(fr, as, Reverse, coalesced_io_del,
> - int128_get64(fr->addr.start),
> - int128_get64(fr->addr.size));
> + /*
> + * We split the big region into smaller ones to satisfy KVM's
> + * KVM_UNREGISTER_COALESCED_MMIO interface, where it does not
> + * allow to specify a large region to unregister all the devices
> + * under that zone instead it only accepts exact zones or even a
> + * smaller zone of previously registered mmio device. Logically
> + * speaking we should better fix KVM to allow the userspace to
> + * unregister multiple mmio devices within a large requested zone,
> + * but in all cases we'll still need to live with old kernels. So
> + * let's simply break the zones into exactly the small pieces when
> + * we do coalesced_io_add().
> + */
> + QTAILQ_FOREACH(cmr, &fr->mr->coalesced, link) {
> + tmp = addrrange_shift(cmr->addr,
> + int128_sub(fr->addr.start,
> + int128_make64(fr->offset_in_region)));
> + if (!addrrange_intersects(tmp, fr->addr)) {
> + continue;
> + }
> + tmp = addrrange_intersection(tmp, fr->addr);
> + MEMORY_LISTENER_UPDATE_REGION(fr, as, Reverse, coalesced_io_del,
> + int128_get64(tmp.start),
> + int128_get64(tmp.size));
> + }
> }
>
> static void flat_range_coalesced_io_add(FlatRange *fr, AddressSpace *as)
>
On Tue, Aug 20, 2019 at 08:24:12AM +0200, Paolo Bonzini wrote: > On 20/08/19 07:16, Peter Xu wrote: > > It is a workaround of current KVM's KVM_UNREGISTER_COALESCED_MMIO > > interface. The kernel interface only allows to unregister an mmio > > device with exactly the zone size when registered, or any smaller zone > > that is included in the device mmio zone. It does not support the > > userspace to specify a very large zone to remove all the small mmio > > devices within the zone covered. > > > > Logically speaking it would be nicer to fix this from KVM side, though > > in all cases we still need to coop with old kernels so let's do this. > > > > This patch has nothing to do with 3ac7d43a6fbb5d4a3 because this is > > probably broken from the very beginning when the > > KVM_UNREGISTER_COALESCED_MMIO interface is introduced in kernel. > > However to make the backport to stables easier, I'm still using the > > commit 3ac7d43a6fbb5d4a3 to track this problem because this will > > depend on that otherwise even additions of mmio devices won't work. > > > > Fixes: 3ac7d43a6fbb5d4a3 > > Signed-off-by: Peter Xu <peterx@redhat.com> > > What about my comments to this patch? :) I thought that comment was for patch 1 but wrongly replied to this patch 2... :) Isn't that comment only valid if we still use the old patch 1? With your suggestion, is that still needed to keep mr->coalesced untouched? Regards, -- Peter Xu
On Tue, Aug 20, 2019 at 02:35:15PM +0800, Peter Xu wrote: > On Tue, Aug 20, 2019 at 08:24:12AM +0200, Paolo Bonzini wrote: > > On 20/08/19 07:16, Peter Xu wrote: > > > It is a workaround of current KVM's KVM_UNREGISTER_COALESCED_MMIO > > > interface. The kernel interface only allows to unregister an mmio > > > device with exactly the zone size when registered, or any smaller zone > > > that is included in the device mmio zone. It does not support the > > > userspace to specify a very large zone to remove all the small mmio > > > devices within the zone covered. > > > > > > Logically speaking it would be nicer to fix this from KVM side, though > > > in all cases we still need to coop with old kernels so let's do this. > > > > > > This patch has nothing to do with 3ac7d43a6fbb5d4a3 because this is > > > probably broken from the very beginning when the > > > KVM_UNREGISTER_COALESCED_MMIO interface is introduced in kernel. > > > However to make the backport to stables easier, I'm still using the > > > commit 3ac7d43a6fbb5d4a3 to track this problem because this will > > > depend on that otherwise even additions of mmio devices won't work. > > > > > > Fixes: 3ac7d43a6fbb5d4a3 > > > Signed-off-by: Peter Xu <peterx@redhat.com> > > > > What about my comments to this patch? :) > > I thought that comment was for patch 1 but wrongly replied to this > patch 2... :) > > Isn't that comment only valid if we still use the old patch 1? With > your suggestion, is that still needed to keep mr->coalesced untouched? Oops, ignore this reply... It's needed of course! So it also affecting this patch... I'll prepare a v3 soon. Regards, -- Peter Xu
© 2016 - 2025 Red Hat, Inc.