All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Sistare <steven.sistare@oracle.com>
To: "Cédric Le Goater" <clg@redhat.com>, qemu-devel@nongnu.org
Cc: Alex Williamson <alex.williamson@redhat.com>,
	Yi Liu <yi.l.liu@intel.com>, Eric Auger <eric.auger@redhat.com>,
	Zhenzhong Duan <zhenzhong.duan@intel.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>
Subject: Re: [PATCH V3 10/42] vfio/container: restore DMA vaddr
Date: Thu, 22 May 2025 10:00:41 -0400	[thread overview]
Message-ID: <49029a24-e4e5-475a-abb1-bc0d373f11b5@oracle.com> (raw)
In-Reply-To: <b6ef4b4b-6f10-4640-8668-77976ed0076e@redhat.com>

On 5/22/2025 2:37 AM, Cédric Le Goater wrote:
> On 5/12/25 17:32, Steve Sistare wrote:
>> In new QEMU, do not register the memory listener at device creation time.
>> Register it later, in the container post_load handler, after all vmstate
>> that may affect regions and mapping boundaries has been loaded.  The
>> post_load registration will cause the listener to invoke its callback on
>> each flat section, and the calls will match the mappings remembered by the
>> kernel.
>>
>> The listener calls a special dma_map handler that passes the new VA of each
>> section to the kernel using VFIO_DMA_MAP_FLAG_VADDR.  Restore the normal
>> handler at the end.
>>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> ---
>>   hw/vfio/container.c  | 15 +++++++++++++--
>>   hw/vfio/cpr-legacy.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 61 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>> index a554683..0e02726 100644
>> --- a/hw/vfio/container.c
>> +++ b/hw/vfio/container.c
>> @@ -137,6 +137,8 @@ static int vfio_legacy_dma_unmap_one(const VFIOContainerBase *bcontainer,
>>       int ret;
>>       Error *local_err = NULL;
>> +    assert(!container->cpr.reused);
> 
> assert -> g_assert

will do.

> this can be called at runtime, which would mean crashing QEMU in case
> of error. Doing an error_report() call is more friendly.

It is an internal error if this assertion is hit, so the state of the system
cannot be trusted.  Hence assert rather than error_report and attempt to recover.

- Steve

>> +
>>       if (iotlb && vfio_container_dirty_tracking_is_started(bcontainer)) {
>>           if (!vfio_container_devices_dirty_tracking_is_supported(bcontainer) &&
>>               bcontainer->dirty_pages_supported) {
>> @@ -691,8 +693,17 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as,
>>       }
>>       group_was_added = true;
>> -    if (!vfio_listener_register(bcontainer, errp)) {
>> -        goto fail;
>> +    /*
>> +     * If reused, register the listener later, after all state that may
>> +     * affect regions and mapping boundaries has been cpr load'ed.  Later,
>> +     * the listener will invoke its callback on each flat section and call
>> +     * dma_map to supply the new vaddr, and the calls will match the mappings
>> +     * remembered by the kernel.
>> +     */
>> +    if (!cpr_reused) {
>> +        if (!vfio_listener_register(bcontainer, errp)) {
>> +            goto fail;
>> +        }
>>       }
>>       bcontainer->initialized = true;
>> diff --git a/hw/vfio/cpr-legacy.c b/hw/vfio/cpr-legacy.c
>> index 519d772..bbcf71e 100644
>> --- a/hw/vfio/cpr-legacy.c
>> +++ b/hw/vfio/cpr-legacy.c
>> @@ -11,11 +11,13 @@
>>   #include "hw/vfio/vfio-container.h"
>>   #include "hw/vfio/vfio-cpr.h"
>>   #include "hw/vfio/vfio-device.h"
>> +#include "hw/vfio/vfio-listener.h"
>>   #include "migration/blocker.h"
>>   #include "migration/cpr.h"
>>   #include "migration/migration.h"
>>   #include "migration/vmstate.h"
>>   #include "qapi/error.h"
>> +#include "qemu/error-report.h"
>>   static bool vfio_dma_unmap_vaddr_all(VFIOContainer *container, Error **errp)
>>   {
>> @@ -32,6 +34,34 @@ static bool vfio_dma_unmap_vaddr_all(VFIOContainer *container, Error **errp)
>>       return true;
>>   }
>> +/*
>> + * Set the new @vaddr for any mappings registered during cpr load.
>> + * Reused is cleared thereafter.
>> + */
>> +static int vfio_legacy_cpr_dma_map(const VFIOContainerBase *bcontainer,
>> +                                   hwaddr iova, ram_addr_t size, void *vaddr,
>> +                                   bool readonly)
>> +{
>> +    const VFIOContainer *container = container_of(bcontainer, VFIOContainer,
>> +                                                  bcontainer);
>> +    struct vfio_iommu_type1_dma_map map = {
>> +        .argsz = sizeof(map),
>> +        .flags = VFIO_DMA_MAP_FLAG_VADDR,
>> +        .vaddr = (__u64)(uintptr_t)vaddr,
>> +        .iova = iova,
>> +        .size = size,
>> +    };
>> +
>> +    assert(container->cpr.reused);
>> +> +    if (ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map)) {
>> +        error_report("vfio_legacy_cpr_dma_map (iova %lu, size %ld, va %p): %s",
>> +                     iova, size, vaddr, strerror(errno));
>> +        return -errno;
>> +    }
>> +
>> +    return 0;
>> +}
>>   static bool vfio_cpr_supported(VFIOContainer *container, Error **errp)
>>   {
>> @@ -63,12 +93,24 @@ static int vfio_container_pre_save(void *opaque)
>>   static int vfio_container_post_load(void *opaque, int version_id)
>>   {
>>       VFIOContainer *container = opaque;
>> +    VFIOContainerBase *bcontainer = &container->bcontainer;
>>       VFIOGroup *group;
>>       VFIODevice *vbasedev;
>> +    Error *err = NULL;
>> +
>> +    if (!vfio_listener_register(bcontainer, &err)) {
>> +        error_report_err(err);
>> +        return -1;
>> +    }
>>       container->cpr.reused = false;
>>       QLIST_FOREACH(group, &container->group_list, container_next) {
>> +        VFIOIOMMUClass *vioc = VFIO_IOMMU_GET_CLASS(bcontainer);
>> +
>> +        /* Restore original dma_map function */
>> +        vioc->dma_map = vfio_legacy_dma_map;
>> +
>>           QLIST_FOREACH(vbasedev, &group->device_list, next) {
>>               vbasedev->cpr.reused = false;
>>           }
>> @@ -80,6 +122,7 @@ static const VMStateDescription vfio_container_vmstate = {
>>       .name = "vfio-container",
>>       .version_id = 0,
>>       .minimum_version_id = 0,
>> +    .priority = MIG_PRI_LOW,  /* Must happen after devices and groups */
>>       .pre_save = vfio_container_pre_save,
>>       .post_load = vfio_container_post_load,
>>       .needed = cpr_needed_for_reuse,
>> @@ -104,6 +147,11 @@ bool vfio_legacy_cpr_register_container(VFIOContainer *container, Error **errp)
>>       vmstate_register(NULL, -1, &vfio_container_vmstate, container);
>> +    /* During incoming CPR, divert calls to dma_map. */
>> +    if (container->cpr.reused) {
>> +        VFIOIOMMUClass *vioc = VFIO_IOMMU_GET_CLASS(bcontainer);
>> +        vioc->dma_map = vfio_legacy_cpr_dma_map;
>> +    }
>>       return true;
>>   }
> 



  reply	other threads:[~2025-05-22 14:01 UTC|newest]

Thread overview: 157+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-12 15:32 [PATCH V3 00/42] Live update: vfio and iommufd Steve Sistare
2025-05-12 15:32 ` [PATCH V3 01/42] MAINTAINERS: Add reviewer for CPR Steve Sistare
2025-05-15  7:36   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 02/42] migration: cpr helpers Steve Sistare
2025-05-15  7:43   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 03/42] migration: lower handler priority Steve Sistare
2025-05-12 15:32 ` [PATCH V3 04/42] vfio: vfio_find_ram_discard_listener Steve Sistare
2025-05-12 15:32 ` [PATCH V3 05/42] vfio: move vfio-cpr.h Steve Sistare
2025-05-15  7:46   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 06/42] vfio/container: register container for cpr Steve Sistare
2025-05-15  7:54   ` Cédric Le Goater
2025-05-15 19:06     ` Steven Sistare
2025-05-16 16:20       ` Cédric Le Goater
2025-05-16 17:21         ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 07/42] vfio/container: preserve descriptors Steve Sistare
2025-05-15 12:59   ` Cédric Le Goater
2025-05-15 19:08     ` Steven Sistare
2025-05-19 13:20       ` Cédric Le Goater
2025-05-19 16:21         ` Steven Sistare
2025-05-22 13:51   ` Cédric Le Goater
2025-05-22 13:56     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 08/42] vfio/container: export vfio_legacy_dma_map Steve Sistare
2025-05-15 13:42   ` Cédric Le Goater
2025-05-15 19:08     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 09/42] vfio/container: discard old DMA vaddr Steve Sistare
2025-05-15 13:30   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 10/42] vfio/container: restore " Steve Sistare
2025-05-15 13:42   ` Cédric Le Goater
2025-05-15 19:08     ` Steven Sistare
2025-05-19 13:32       ` Cédric Le Goater
2025-05-19 16:33         ` Steven Sistare
2025-05-22  6:37   ` Cédric Le Goater
2025-05-22 14:00     ` Steven Sistare [this message]
2025-05-12 15:32 ` [PATCH V3 11/42] vfio/container: mdev cpr blocker Steve Sistare
2025-05-16  8:16   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 12/42] vfio/container: recover from unmap-all-vaddr failure Steve Sistare
2025-05-20  6:29   ` Cédric Le Goater
2025-05-20 13:39     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 13/42] pci: export msix_is_pending Steve Sistare
2025-05-12 15:32 ` [PATCH V3 14/42] pci: skip reset during cpr Steve Sistare
2025-05-16  8:19   ` Cédric Le Goater
2025-05-16 17:58     ` Steven Sistare
2025-05-24  9:34     ` Michael S. Tsirkin
2025-05-27 20:42       ` Steven Sistare
2025-05-27 21:03         ` Michael S. Tsirkin
2025-05-28 16:11           ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 15/42] vfio-pci: " Steve Sistare
2025-05-20  6:48   ` Cédric Le Goater
2025-05-20 13:44     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 16/42] vfio/pci: vfio_vector_init Steve Sistare
2025-05-16  8:32   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 17/42] vfio/pci: vfio_notifier_init Steve Sistare
2025-05-16  8:29   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 18/42] vfio/pci: pass vector to virq functions Steve Sistare
2025-05-16  8:28   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 19/42] vfio/pci: vfio_notifier_init cpr parameters Steve Sistare
2025-05-16  8:29   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 20/42] vfio/pci: vfio_notifier_cleanup Steve Sistare
2025-05-16  8:30   ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 21/42] vfio/pci: export MSI functions Steve Sistare
2025-05-16  8:31   ` Cédric Le Goater
2025-05-16 17:58     ` Steven Sistare
2025-05-20  5:52       ` Cédric Le Goater
2025-05-20 14:56         ` Steven Sistare
2025-05-20 15:10           ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 22/42] vfio-pci: preserve MSI Steve Sistare
2025-05-28 17:44   ` Steven Sistare
2025-06-01 17:28     ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 23/42] vfio-pci: preserve INTx Steve Sistare
2025-05-12 15:32 ` [PATCH V3 24/42] migration: close kvm after cpr Steve Sistare
2025-05-16  8:35   ` Cédric Le Goater
2025-05-16 17:14     ` Peter Xu
2025-05-16 19:17       ` Steven Sistare
2025-05-16 18:18     ` Steven Sistare
2025-05-19  8:51       ` Cédric Le Goater
2025-05-19 19:07         ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 25/42] migration: cpr_get_fd_param helper Steve Sistare
2025-05-19 21:22   ` Fabiano Rosas
2025-05-12 15:32 ` [PATCH V3 26/42] vfio: return mr from vfio_get_xlat_addr Steve Sistare
2025-05-12 20:51   ` John Levon
2025-05-14 17:03     ` Cédric Le Goater
2025-05-15  8:22       ` David Hildenbrand
2025-05-15 19:13         ` Steven Sistare
2025-05-15 17:24     ` Steven Sistare
2025-05-13 11:12   ` Mark Cave-Ayland
2025-05-15 19:40     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 27/42] vfio: pass ramblock to vfio_container_dma_map Steve Sistare
2025-05-16  8:26   ` Duan, Zhenzhong
2025-05-12 15:32 ` [PATCH V3 28/42] backends/iommufd: iommufd_backend_map_file_dma Steve Sistare
2025-05-16  8:26   ` Duan, Zhenzhong
2025-05-19 15:51     ` Steven Sistare
2025-05-20 19:32       ` Steven Sistare
2025-05-21  2:48         ` Duan, Zhenzhong
2025-05-12 15:32 ` [PATCH V3 29/42] backends/iommufd: change process ioctl Steve Sistare
2025-05-16  8:42   ` Duan, Zhenzhong
2025-05-19 15:51     ` Steven Sistare
2025-05-20 19:34       ` Steven Sistare
2025-05-21  3:11         ` Duan, Zhenzhong
2025-05-21 13:01           ` Steven Sistare
2025-05-22  3:19             ` Duan, Zhenzhong
2025-05-22 21:11               ` Steven Sistare
2025-05-23  8:56                 ` Duan, Zhenzhong
2025-05-23 14:56                   ` Steven Sistare
2025-05-23 19:19                     ` Steven Sistare
2025-05-26  2:31                       ` Duan, Zhenzhong
2025-05-28 13:31                         ` Steven Sistare
2025-05-30  9:56                           ` Duan, Zhenzhong
2025-05-12 15:32 ` [PATCH V3 30/42] physmem: qemu_ram_get_fd_offset Steve Sistare
2025-05-16  8:40   ` Duan, Zhenzhong
2025-05-12 15:32 ` [PATCH V3 31/42] vfio/iommufd: use IOMMU_IOAS_MAP_FILE Steve Sistare
2025-05-16  8:48   ` Duan, Zhenzhong
2025-05-19 15:52     ` Steven Sistare
2025-05-20 19:39       ` Steven Sistare
2025-05-21  3:13         ` Duan, Zhenzhong
2025-05-20 12:27   ` Cédric Le Goater
2025-05-20 13:58     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 32/42] vfio/iommufd: export iommufd_cdev_get_info_iova_range Steve Sistare
2025-05-21 18:35   ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 33/42] vfio/iommufd: define hwpt constructors Steve Sistare
2025-05-16  8:55   ` Duan, Zhenzhong
2025-05-19 15:55     ` Steven Sistare
2025-05-23 17:47       ` Steven Sistare
2025-05-20 12:34     ` Cédric Le Goater
2025-05-21  2:48       ` Duan, Zhenzhong
2025-05-21  8:19         ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 34/42] vfio/iommufd: invariant device name Steve Sistare
2025-05-16  9:29   ` Duan, Zhenzhong
2025-05-19 15:52     ` Steven Sistare
2025-05-20 13:55   ` Cédric Le Goater
2025-05-20 21:00     ` Steven Sistare
2025-05-21  8:20       ` Cédric Le Goater
2025-05-12 15:32 ` [PATCH V3 35/42] vfio/iommufd: register container for cpr Steve Sistare
2025-05-16 10:23   ` Duan, Zhenzhong
2025-05-19 15:52     ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 36/42] vfio/iommufd: preserve descriptors Steve Sistare
2025-05-16 10:06   ` Duan, Zhenzhong
2025-05-19 15:53     ` Steven Sistare
2025-05-20  9:15       ` Duan, Zhenzhong
2025-05-12 15:32 ` [PATCH V3 37/42] vfio/iommufd: reconstruct device Steve Sistare
2025-05-16 10:22   ` Duan, Zhenzhong
2025-05-19 15:53     ` Steven Sistare
2025-05-20  9:14       ` Duan, Zhenzhong
2025-05-21 18:38   ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 38/42] vfio/iommufd: reconstruct hw_caps Steve Sistare
2025-05-21 19:59   ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 39/42] vfio/iommufd: reconstruct hwpt Steve Sistare
2025-05-19  3:25   ` Duan, Zhenzhong
2025-05-19 15:53     ` Steven Sistare
2025-05-20  9:16       ` Duan, Zhenzhong
2025-05-21 17:40         ` Steven Sistare
2025-05-12 15:32 ` [PATCH V3 40/42] vfio/iommufd: change process Steve Sistare
2025-05-12 15:32 ` [PATCH V3 41/42] iommufd: preserve DMA mappings Steve Sistare
2025-05-12 15:32 ` [PATCH V3 42/42] vfio/container: delete old cpr register Steve Sistare
2025-05-16 16:37 ` [PATCH V3 00/42] Live update: vfio and iommufd Cédric Le Goater
2025-05-16 17:17   ` Steven Sistare
2025-05-16 19:48     ` Steven Sistare
2025-05-19  8:54       ` Cédric Le Goater

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=49029a24-e4e5-475a-abb1-bc0d373f11b5@oracle.com \
    --to=steven.sistare@oracle.com \
    --cc=alex.williamson@redhat.com \
    --cc=clg@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=farosas@suse.de \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yi.l.liu@intel.com \
    --cc=zhenzhong.duan@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.