From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: cohuck@redhat.com, cjia@nvidia.com, aik@ozlabs.ru,
Zhengxiao.zx@alibaba-inc.com, shuangtai.tst@alibaba-inc.com,
qemu-devel@nongnu.org, peterx@redhat.com,
Kirti Wankhede <kwankhede@nvidia.com>,
eauger@redhat.com, yi.l.liu@intel.com, quintela@redhat.com,
ziye.yang@intel.com, armbru@redhat.com, mlevitsk@redhat.com,
pasic@linux.ibm.com, felipe@nutanix.com, zhi.a.wang@intel.com,
kevin.tian@intel.com, yan.y.zhao@intel.com,
changpeng.liu@intel.com, eskultet@redhat.com, Ken.Xue@amd.com,
jonathan.davies@nutanix.com, pbonzini@redhat.com
Subject: Re: [PATCH QEMU v25 15/17] vfio: Add ioctl to get dirty pages bitmap during dma unmap.
Date: Fri, 26 Jun 2020 15:15:28 +0100 [thread overview]
Message-ID: <20200626141528.GI3087@work-vm> (raw)
In-Reply-To: <20200625131843.1a511078@x1.home>
* Alex Williamson (alex.williamson@redhat.com) wrote:
> On Thu, 25 Jun 2020 20:31:12 +0530
> Kirti Wankhede <kwankhede@nvidia.com> wrote:
>
> > On 6/25/2020 12:26 AM, Alex Williamson wrote:
> > > On Sun, 21 Jun 2020 01:51:24 +0530
> > > Kirti Wankhede <kwankhede@nvidia.com> wrote:
> > >
> > >> With vIOMMU, IO virtual address range can get unmapped while in pre-copy
> > >> phase of migration. In that case, unmap ioctl should return pages pinned
> > >> in that range and QEMU should find its correcponding guest physical
> > >> addresses and report those dirty.
> > >>
> > >> Suggested-by: Alex Williamson <alex.williamson@redhat.com>
> > >> Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com>
> > >> Reviewed-by: Neo Jia <cjia@nvidia.com>
> > >> ---
> > >> hw/vfio/common.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
> > >> 1 file changed, 81 insertions(+), 4 deletions(-)
> > >>
> > >> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> > >> index 0518cf228ed5..a06b8f2f66e2 100644
> > >> --- a/hw/vfio/common.c
> > >> +++ b/hw/vfio/common.c
> > >> @@ -311,11 +311,83 @@ static bool vfio_devices_are_stopped_and_saving(void)
> > >> return true;
> > >> }
> > >>
> > >> +static bool vfio_devices_are_running_and_saving(void)
> > >> +{
> > >> + VFIOGroup *group;
> > >> + VFIODevice *vbasedev;
> > >> +
> > >> + QLIST_FOREACH(group, &vfio_group_list, next) {
> > >
> > > Same as previous, I'm curious if we should instead be looking at
> > > container granularity. It especially seems to make sense here where
> > > we're unmapping from a container, so iterating every device in every
> > > group seems excessive.
> > >
> >
> > changing it with container argument.
> >
> > >> + QLIST_FOREACH(vbasedev, &group->device_list, next) {
> > >> + if ((vbasedev->device_state & VFIO_DEVICE_STATE_SAVING) &&
> > >> + (vbasedev->device_state & VFIO_DEVICE_STATE_RUNNING)) {
> > >> + continue;
> > >> + } else {
> > >> + return false;
> > >> + }
> > >
> > > I'm also not sure about the polarity of this function, should it be if
> > > any device is _SAVING we should report the dirty bitmap? For example,
> > > what if we have a set of paried failover NICs where we intend to unplug
> > > one just prior to stopping the devices, aren't we going to lose dirtied
> > > pages with this logic that they all must be running and saving? Thanks,
> > >
> >
> > If migration is initiated, is device unplug allowed? Ideally it
> > shouldn't. If it is, then how QEMU handles data stream of device which
> > doesn't exist at destination?
>
> include/hw/qdev-core.h
> struct DeviceState {
> ...
> bool allow_unplug_during_migration;
>
> AIUI, the failover_pair_id device is likely to be a vfio-pci NIC,
> otherwise they'd simply migrate the primary NIC, so there's a very good
> chance that a user would configure a VM with a migratable mdev device
> and an failover NIC so that they have high speed networking on either
> end of the migration.
My understanding for that failover code is that happens right at the
beginning of migration while we're still in MIGRATION_STATUS_SETUP;
whether there's anything that enforces that is a different matter.
But, in that case, I don't think you'd be interested in that dirtying.
Dave
> > _SAVING flag is set during pre-copy and stop-and-copy phase. Here we
> > only want to track pages which are unmapped during pre-copy phase, i.e.
> > when vCPU are running. In case of VM suspend /saveVM, there is no
> > pre-copy phase, but ideally we shouldn't see unmaps when vCPUs are
> > stopped, right? But still for safer side, since we know exact phase, I
> > would prefer to check for _SAVING and _RUNNING flags.
>
> We can't have unmaps while vCPUs are stopped, but I think the failover
> code allows that we can be in the pre-copy phase where not all devices
> support migration. As coded here, it appears that dirty tracking of any
> unmap while in that phase is lost. Thanks,
>
> Alex
>
>
> > >> + }
> > >> + }
> > >> + return true;
> > >> +}
> > >> +
> > >> +static int vfio_dma_unmap_bitmap(VFIOContainer *container,
> > >> + hwaddr iova, ram_addr_t size,
> > >> + IOMMUTLBEntry *iotlb)
> > >> +{
> > >> + struct vfio_iommu_type1_dma_unmap *unmap;
> > >> + struct vfio_bitmap *bitmap;
> > >> + uint64_t pages = TARGET_PAGE_ALIGN(size) >> TARGET_PAGE_BITS;
> > >> + int ret;
> > >> +
> > >> + unmap = g_malloc0(sizeof(*unmap) + sizeof(*bitmap));
> > >> +
> > >> + unmap->argsz = sizeof(*unmap) + sizeof(*bitmap);
> > >> + unmap->iova = iova;
> > >> + unmap->size = size;
> > >> + unmap->flags |= VFIO_DMA_UNMAP_FLAG_GET_DIRTY_BITMAP;
> > >> + bitmap = (struct vfio_bitmap *)&unmap->data;
> > >> +
> > >> + /*
> > >> + * cpu_physical_memory_set_dirty_lebitmap() expects pages in bitmap of
> > >> + * TARGET_PAGE_SIZE to mark those dirty. Hence set bitmap_pgsize to
> > >> + * TARGET_PAGE_SIZE.
> > >> + */
> > >> +
> > >> + bitmap->pgsize = TARGET_PAGE_SIZE;
> > >> + bitmap->size = ROUND_UP(pages, sizeof(__u64) * BITS_PER_BYTE) /
> > >> + BITS_PER_BYTE;
> > >> +
> > >> + if (bitmap->size > container->max_dirty_bitmap_size) {
> > >> + error_report("UNMAP: Size of bitmap too big 0x%llx", bitmap->size);
> > >> + ret = -E2BIG;
> > >> + goto unmap_exit;
> > >> + }
> > >> +
> > >> + bitmap->data = g_try_malloc0(bitmap->size);
> > >> + if (!bitmap->data) {
> > >> + ret = -ENOMEM;
> > >> + goto unmap_exit;
> > >> + }
> > >> +
> > >> + ret = ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, unmap);
> > >> + if (!ret) {
> > >> + cpu_physical_memory_set_dirty_lebitmap((uint64_t *)bitmap->data,
> > >> + iotlb->translated_addr, pages);
> > >> + } else {
> > >> + error_report("VFIO_UNMAP_DMA with DIRTY_BITMAP : %m");
> > >> + }
> > >> +
> > >> + g_free(bitmap->data);
> > >> +unmap_exit:
> > >> + g_free(unmap);
> > >> + return ret;
> > >> +}
> > >> +
> > >> /*
> > >> * DMA - Mapping and unmapping for the "type1" IOMMU interface used on x86
> > >> */
> > >> static int vfio_dma_unmap(VFIOContainer *container,
> > >> - hwaddr iova, ram_addr_t size)
> > >> + hwaddr iova, ram_addr_t size,
> > >> + IOMMUTLBEntry *iotlb)
> > >> {
> > >> struct vfio_iommu_type1_dma_unmap unmap = {
> > >> .argsz = sizeof(unmap),
> > >> @@ -324,6 +396,11 @@ static int vfio_dma_unmap(VFIOContainer *container,
> > >> .size = size,
> > >> };
> > >>
> > >> + if (iotlb && container->dirty_pages_supported &&
> > >> + vfio_devices_are_running_and_saving()) {
> > >> + return vfio_dma_unmap_bitmap(container, iova, size, iotlb);
> > >> + }
> > >> +
> > >> while (ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, &unmap)) {
> > >> /*
> > >> * The type1 backend has an off-by-one bug in the kernel (71a7d3d78e3c
> > >> @@ -371,7 +448,7 @@ static int vfio_dma_map(VFIOContainer *container, hwaddr iova,
> > >> * the VGA ROM space.
> > >> */
> > >> if (ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map) == 0 ||
> > >> - (errno == EBUSY && vfio_dma_unmap(container, iova, size) == 0 &&
> > >> + (errno == EBUSY && vfio_dma_unmap(container, iova, size, NULL) == 0 &&
> > >> ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map) == 0)) {
> > >> return 0;
> > >> }
> > >> @@ -542,7 +619,7 @@ static void vfio_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
> > >> }
> > >> }
> > >>
> > >> - ret = vfio_dma_unmap(container, iova, iotlb->addr_mask + 1);
> > >> + ret = vfio_dma_unmap(container, iova, iotlb->addr_mask + 1, iotlb);
> > >> if (ret) {
> > >> error_report("vfio_dma_unmap(%p, 0x%"HWADDR_PRIx", "
> > >> "0x%"HWADDR_PRIx") = %d (%m)",
> > >> @@ -853,7 +930,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
> > >> }
> > >>
> > >> if (try_unmap) {
> > >> - ret = vfio_dma_unmap(container, iova, int128_get64(llsize));
> > >> + ret = vfio_dma_unmap(container, iova, int128_get64(llsize), NULL);
> > >> if (ret) {
> > >> error_report("vfio_dma_unmap(%p, 0x%"HWADDR_PRIx", "
> > >> "0x%"HWADDR_PRIx") = %d (%m)",
> > >
> >
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-06-26 14:17 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-20 20:21 [PATCH QEMU v25 00/17] Add migration support for VFIO devices Kirti Wankhede
2020-06-20 20:21 ` [PATCH QEMU v25 01/17] vfio: Add function to unmap VFIO region Kirti Wankhede
2020-06-20 20:21 ` [PATCH QEMU v25 02/17] vfio: Add vfio_get_object callback to VFIODeviceOps Kirti Wankhede
2020-06-20 20:21 ` [PATCH QEMU v25 03/17] vfio: Add save and load functions for VFIO PCI devices Kirti Wankhede
2020-06-22 20:28 ` Alex Williamson
2020-06-24 14:29 ` Kirti Wankhede
2020-06-24 19:49 ` Alex Williamson
2020-06-26 12:16 ` Dr. David Alan Gilbert
2020-06-26 22:44 ` Alex Williamson
2020-06-29 9:59 ` Dr. David Alan Gilbert
2020-06-20 20:21 ` [PATCH QEMU v25 04/17] vfio: Add migration region initialization and finalize function Kirti Wankhede
2020-06-23 7:54 ` Cornelia Huck
2020-06-20 20:21 ` [PATCH QEMU v25 05/17] vfio: Add VM state change handler to know state of VM Kirti Wankhede
2020-06-22 22:50 ` Alex Williamson
2020-06-23 18:55 ` Kirti Wankhede
2020-06-26 14:51 ` Dr. David Alan Gilbert
2020-06-23 8:07 ` Cornelia Huck
2020-06-20 20:21 ` [PATCH QEMU v25 06/17] vfio: Add migration state change notifier Kirti Wankhede
2020-06-23 8:10 ` Cornelia Huck
2020-06-20 20:21 ` [PATCH QEMU v25 07/17] vfio: Register SaveVMHandlers for VFIO device Kirti Wankhede
2020-06-22 22:50 ` Alex Williamson
2020-06-23 19:21 ` Kirti Wankhede
2020-06-23 19:50 ` Alex Williamson
2020-06-26 14:22 ` Dr. David Alan Gilbert
2020-06-26 14:31 ` Dr. David Alan Gilbert
2020-06-20 20:21 ` [PATCH QEMU v25 08/17] vfio: Add save state functions to SaveVMHandlers Kirti Wankhede
2020-06-22 22:50 ` Alex Williamson
2020-06-23 20:34 ` Kirti Wankhede
2020-06-23 20:40 ` Alex Williamson
2020-06-20 20:21 ` [PATCH QEMU v25 09/17] vfio: Add load " Kirti Wankhede
2020-06-24 18:54 ` Alex Williamson
2020-06-25 14:16 ` Kirti Wankhede
2020-06-25 14:57 ` Alex Williamson
2020-06-26 14:54 ` Dr. David Alan Gilbert
2020-06-20 20:21 ` [PATCH QEMU v25 10/17] memory: Set DIRTY_MEMORY_MIGRATION when IOMMU is enabled Kirti Wankhede
2020-06-20 20:21 ` [PATCH QEMU v25 11/17] vfio: Get migration capability flags for container Kirti Wankhede
2020-06-24 8:43 ` Cornelia Huck
2020-06-24 18:55 ` Alex Williamson
2020-06-25 14:09 ` Kirti Wankhede
2020-06-25 14:56 ` Alex Williamson
2020-06-20 20:21 ` [PATCH QEMU v25 12/17] vfio: Add function to start and stop dirty pages tracking Kirti Wankhede
2020-06-23 10:32 ` Cornelia Huck
2020-06-23 11:01 ` Dr. David Alan Gilbert
2020-06-23 11:06 ` Cornelia Huck
2020-06-24 18:55 ` Alex Williamson
2020-06-20 20:21 ` [PATCH QEMU v25 13/17] vfio: create mapped iova list when vIOMMU is enabled Kirti Wankhede
2020-06-24 18:55 ` Alex Williamson
2020-06-25 14:34 ` Kirti Wankhede
2020-06-25 17:40 ` Alex Williamson
2020-06-26 14:43 ` Peter Xu
2020-06-20 20:21 ` [PATCH QEMU v25 14/17] vfio: Add vfio_listener_log_sync to mark dirty pages Kirti Wankhede
2020-06-24 18:55 ` Alex Williamson
2020-06-25 14:43 ` Kirti Wankhede
2020-06-25 17:57 ` Alex Williamson
2020-06-20 20:21 ` [PATCH QEMU v25 15/17] vfio: Add ioctl to get dirty pages bitmap during dma unmap Kirti Wankhede
2020-06-23 8:25 ` Cornelia Huck
2020-06-24 18:56 ` Alex Williamson
2020-06-25 15:01 ` Kirti Wankhede
2020-06-25 19:18 ` Alex Williamson
2020-06-26 14:15 ` Dr. David Alan Gilbert [this message]
2020-06-20 20:21 ` [PATCH QEMU v25 16/17] vfio: Make vfio-pci device migration capable Kirti Wankhede
2020-06-22 16:51 ` Cornelia Huck
2020-06-20 20:21 ` [PATCH QEMU v25 17/17] qapi: Add VFIO devices migration stats in Migration stats Kirti Wankhede
2020-06-23 7:21 ` Markus Armbruster
2020-06-23 21:16 ` Kirti Wankhede
2020-06-25 5:51 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200626141528.GI3087@work-vm \
--to=dgilbert@redhat.com \
--cc=Ken.Xue@amd.com \
--cc=Zhengxiao.zx@alibaba-inc.com \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=changpeng.liu@intel.com \
--cc=cjia@nvidia.com \
--cc=cohuck@redhat.com \
--cc=eauger@redhat.com \
--cc=eskultet@redhat.com \
--cc=felipe@nutanix.com \
--cc=jonathan.davies@nutanix.com \
--cc=kevin.tian@intel.com \
--cc=kwankhede@nvidia.com \
--cc=mlevitsk@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=shuangtai.tst@alibaba-inc.com \
--cc=yan.y.zhao@intel.com \
--cc=yi.l.liu@intel.com \
--cc=zhi.a.wang@intel.com \
--cc=ziye.yang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.