From: Steven Sistare <steven.sistare@oracle.com>
To: "Peter Xu" <peterx@redhat.com>, "Cédric Le Goater" <clg@redhat.com>
Cc: qemu-devel@nongnu.org,
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>,
Fabiano Rosas <farosas@suse.de>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH V3 24/42] migration: close kvm after cpr
Date: Fri, 16 May 2025 15:17:47 -0400 [thread overview]
Message-ID: <562fd2b5-44dc-4e90-a4cf-b2425baebad7@oracle.com> (raw)
In-Reply-To: <aCdyeKdIZaTqaEzY@x1.local>
On 5/16/2025 1:14 PM, Peter Xu wrote:
> On Fri, May 16, 2025 at 10:35:44AM +0200, Cédric Le Goater wrote:
>> On 5/12/25 17:32, Steve Sistare wrote:
>>> cpr-transfer breaks vfio network connectivity to and from the guest, and
>>> the host system log shows:
>>> irq bypass consumer (token 00000000a03c32e5) registration fails: -16
>>> which is EBUSY. This occurs because KVM descriptors are still open in
>>> the old QEMU process. Close them.
>>>
>
> [1]
>
>>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>>
>> This patch doesn't build.
>>
>> /usr/bin/ld: libcommon.a.p/migration_cpr.c.o: in function `cpr_kvm_close':
>> ./build/../migration/cpr.c:260: undefined reference to `kvm_close'
>
> And it'll be also good if this patch can keep copying the kvm maintainer
> (Paolo).. I have Paolo copied. So this patch is more of a kvm change not
> migration, afaict. Maybe we should split this into two patches.
>
> Steve, you could attach a cc line in this patch to make sure it won't be
> forgotten when you repost (at [1] above, I think git-send-email would
> remember that then):
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
Righto. My intention was to cc him on this specific patch and not the whole
series, which I did in V2 but forgot in V3. Thanks for the tip on embedding
cc in the patch.
> Some other questions below.
>
>>> ---
>>> accel/kvm/kvm-all.c | 28 ++++++++++++++++++++++++++++
>>> hw/vfio/helpers.c | 10 ++++++++++
>>> include/hw/vfio/vfio-device.h | 2 ++
>>> include/migration/cpr.h | 2 ++
>>> include/qemu/vfio-helpers.h | 1 -
>>> include/system/kvm.h | 1 +
>>> migration/cpr-transfer.c | 18 ++++++++++++++++++
>>> migration/cpr.c | 8 ++++++++
>>> migration/migration.c | 1 +
>>> 9 files changed, 70 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
>>> index 278a506..d619448 100644
>>> --- a/accel/kvm/kvm-all.c
>>> +++ b/accel/kvm/kvm-all.c
>>> @@ -512,16 +512,23 @@ static int do_kvm_destroy_vcpu(CPUState *cpu)
>>> goto err;
>>> }
>>> + /* If I am the CPU that created coalesced_mmio_ring, then discard it */
>
> Are these "reset to NULL" below required or cleanup? It's not yet clear to
> me when coalesced_mmio_ring isn't owned by the current CPU state. Maybe
> also better to split this chunk with some commit message?
The pointers are not valid after this point. Setting to NULL is cleanup, but
a best practice IMO. The vcpus are paused, so nothing should be touching
coalesced_mmio_ring, and it does not matter in which order we destroy vcpus.
- Steve
>>> + if (s->coalesced_mmio_ring == (void *)cpu->kvm_run + PAGE_SIZE) {
>>> + s->coalesced_mmio_ring = NULL;
>>> + }
>>> +
>>> ret = munmap(cpu->kvm_run, mmap_size);
>>> if (ret < 0) {
>>> goto err;
>>> }
>>> + cpu->kvm_run = NULL;
>>> if (cpu->kvm_dirty_gfns) {
>>> ret = munmap(cpu->kvm_dirty_gfns, s->kvm_dirty_ring_bytes);
>>> if (ret < 0) {
>>> goto err;
>>> }
>>> + cpu->kvm_dirty_gfns = NULL;
>>> }
>>> kvm_park_vcpu(cpu);
>>> @@ -600,6 +607,27 @@ err:
>>> return ret;
>>> }
>>> +void kvm_close(void)
>>> +{
>>> + CPUState *cpu;
>>> +
>>> + CPU_FOREACH(cpu) {
>>> + cpu_remove_sync(cpu);
>>> + close(cpu->kvm_fd);
>>> + cpu->kvm_fd = -1;
>>> + close(cpu->kvm_vcpu_stats_fd);
>>> + cpu->kvm_vcpu_stats_fd = -1;
>>> + }
>>> +
>>> + if (kvm_state && kvm_state->fd != -1) {
>>> + close(kvm_state->vmfd);
>>> + kvm_state->vmfd = -1;
>>> + close(kvm_state->fd);
>>> + kvm_state->fd = -1;
>>> + }
>>> + kvm_state = NULL;
>>> +}
>>> +
>>> /*
>>> * dirty pages logging control
>>> */
>>> diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c
>>> index d0dbab1..af1db2f 100644
>>> --- a/hw/vfio/helpers.c
>>> +++ b/hw/vfio/helpers.c
>>> @@ -117,6 +117,16 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
>>> int vfio_kvm_device_fd = -1;
>>> #endif
>>> +void vfio_kvm_device_close(void)
>>> +{
>>> +#ifdef CONFIG_KVM
>>> + if (vfio_kvm_device_fd != -1) {
>>> + close(vfio_kvm_device_fd);
>>> + vfio_kvm_device_fd = -1;
>>> + }
>>> +#endif
>>> +}
>>> +
>>> int vfio_kvm_device_add_fd(int fd, Error **errp)
>>> {
>>> #ifdef CONFIG_KVM
>>> diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h
>>> index 4e4d0b6..6eb6f21 100644
>>> --- a/include/hw/vfio/vfio-device.h
>>> +++ b/include/hw/vfio/vfio-device.h
>>> @@ -231,4 +231,6 @@ void vfio_device_set_fd(VFIODevice *vbasedev, const char *str, Error **errp);
>>> void vfio_device_init(VFIODevice *vbasedev, int type, VFIODeviceOps *ops,
>>> DeviceState *dev, bool ram_discard);
>>> int vfio_device_get_aw_bits(VFIODevice *vdev);
>>> +
>>> +void vfio_kvm_device_close(void);
>>> #endif /* HW_VFIO_VFIO_COMMON_H */
>>> diff --git a/include/migration/cpr.h b/include/migration/cpr.h
>>> index fc6aa33..5f1ff10 100644
>>> --- a/include/migration/cpr.h
>>> +++ b/include/migration/cpr.h
>>> @@ -31,7 +31,9 @@ void cpr_state_close(void);
>>> struct QIOChannel *cpr_state_ioc(void);
>>> bool cpr_needed_for_reuse(void *opaque);
>>> +void cpr_kvm_close(void);
>>> +void cpr_transfer_init(void);
>>> QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp);
>>> QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp);
>>> diff --git a/include/qemu/vfio-helpers.h b/include/qemu/vfio-helpers.h
>>> index bde9495..a029036 100644
>>> --- a/include/qemu/vfio-helpers.h
>>> +++ b/include/qemu/vfio-helpers.h
>>> @@ -28,5 +28,4 @@ void qemu_vfio_pci_unmap_bar(QEMUVFIOState *s, int index, void *bar,
>>> uint64_t offset, uint64_t size);
>>> int qemu_vfio_pci_init_irq(QEMUVFIOState *s, EventNotifier *e,
>>> int irq_type, Error **errp);
>>> -
>>> #endif
>>> diff --git a/include/system/kvm.h b/include/system/kvm.h
>>> index b690dda..cfaa94c 100644
>>> --- a/include/system/kvm.h
>>> +++ b/include/system/kvm.h
>>> @@ -194,6 +194,7 @@ bool kvm_has_sync_mmu(void);
>>> int kvm_has_vcpu_events(void);
>>> int kvm_max_nested_state_length(void);
>>> int kvm_has_gsi_routing(void);
>>> +void kvm_close(void);
>>> /**
>>> * kvm_arm_supports_user_irq
>>> diff --git a/migration/cpr-transfer.c b/migration/cpr-transfer.c
>>> index e1f1403..396558f 100644
>>> --- a/migration/cpr-transfer.c
>>> +++ b/migration/cpr-transfer.c
>>> @@ -17,6 +17,24 @@
>>> #include "migration/vmstate.h"
>>> #include "trace.h"
>>> +static int cpr_transfer_notifier(NotifierWithReturn *notifier,
>>> + MigrationEvent *e,
>>> + Error **errp)
>>> +{
>>> + if (e->type == MIG_EVENT_PRECOPY_DONE) {
>>> + cpr_kvm_close();
>>> + }
>>> + return 0;
>>> +}
>>> +
>>> +void cpr_transfer_init(void)
>>> +{
>>> + static NotifierWithReturn notifier;
>>> +
>>> + migration_add_notifier_mode(¬ifier, cpr_transfer_notifier,
>>> + MIG_MODE_CPR_TRANSFER);
>>> +}
>>> +
>>> QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp)
>>> {
>>> MigrationAddress *addr = channel->addr;
>>> diff --git a/migration/cpr.c b/migration/cpr.c
>>> index 0b01e25..6102d04 100644
>>> --- a/migration/cpr.c
>>> +++ b/migration/cpr.c
>>> @@ -7,12 +7,14 @@
>>> #include "qemu/osdep.h"
>>> #include "qapi/error.h"
>>> +#include "hw/vfio/vfio-device.h"
>>> #include "migration/cpr.h"
>>> #include "migration/misc.h"
>>> #include "migration/options.h"
>>> #include "migration/qemu-file.h"
>>> #include "migration/savevm.h"
>>> #include "migration/vmstate.h"
>>> +#include "system/kvm.h"
>>> #include "system/runstate.h"
>>> #include "trace.h"
>>> @@ -252,3 +254,9 @@ bool cpr_needed_for_reuse(void *opaque)
>>> MigMode mode = migrate_mode();
>>> return mode == MIG_MODE_CPR_TRANSFER;
>>> }
>>> +
>>> +void cpr_kvm_close(void)
>>> +{
>>> + kvm_close();
>>> + vfio_kvm_device_close();
>>> +}
>>> diff --git a/migration/migration.c b/migration/migration.c
>>> index 4697732..89e2026 100644
>>> --- a/migration/migration.c
>>> +++ b/migration/migration.c
>>> @@ -337,6 +337,7 @@ void migration_object_init(void)
>>> ram_mig_init();
>>> dirty_bitmap_mig_init();
>>> + cpr_transfer_init();
>>> /* Initialize cpu throttle timers */
>>> cpu_throttle_init();
>>
>
next prev parent reply other threads:[~2025-05-16 19:19 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
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 [this message]
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=562fd2b5-44dc-4e90-a4cf-b2425baebad7@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=pbonzini@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.