vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
|
|
|
|
#ifndef VIRTIO_VFIO_COMMON_H
|
|
|
|
#define VIRTIO_VFIO_COMMON_H
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/virtio.h>
|
|
|
|
#include <linux/vfio_pci_core.h>
|
|
|
|
#include <linux/virtio_pci.h>
|
|
|
|
|
|
|
|
enum virtiovf_migf_state {
|
|
|
|
VIRTIOVF_MIGF_STATE_ERROR = 1,
|
2024-11-13 13:51:59 +02:00
|
|
|
VIRTIOVF_MIGF_STATE_PRECOPY = 2,
|
|
|
|
VIRTIOVF_MIGF_STATE_COMPLETE = 3,
|
vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
enum virtiovf_load_state {
|
|
|
|
VIRTIOVF_LOAD_STATE_READ_HEADER,
|
|
|
|
VIRTIOVF_LOAD_STATE_PREP_HEADER_DATA,
|
|
|
|
VIRTIOVF_LOAD_STATE_READ_HEADER_DATA,
|
|
|
|
VIRTIOVF_LOAD_STATE_PREP_CHUNK,
|
|
|
|
VIRTIOVF_LOAD_STATE_READ_CHUNK,
|
|
|
|
VIRTIOVF_LOAD_STATE_LOAD_CHUNK,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct virtiovf_data_buffer {
|
|
|
|
struct sg_append_table table;
|
|
|
|
loff_t start_pos;
|
|
|
|
u64 length;
|
|
|
|
u64 allocated_length;
|
|
|
|
struct list_head buf_elm;
|
|
|
|
u8 include_header_object:1;
|
|
|
|
struct virtiovf_migration_file *migf;
|
|
|
|
/* Optimize virtiovf_get_migration_page() for sequential access */
|
|
|
|
struct scatterlist *last_offset_sg;
|
|
|
|
unsigned int sg_last_entry;
|
|
|
|
unsigned long last_offset;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum virtiovf_migf_header_flags {
|
|
|
|
VIRTIOVF_MIGF_HEADER_FLAGS_TAG_MANDATORY = 0,
|
|
|
|
VIRTIOVF_MIGF_HEADER_FLAGS_TAG_OPTIONAL = 1 << 0,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum virtiovf_migf_header_tag {
|
|
|
|
VIRTIOVF_MIGF_HEADER_TAG_DEVICE_DATA = 0,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct virtiovf_migration_header {
|
|
|
|
__le64 record_size;
|
|
|
|
/* For future use in case we may need to change the kernel protocol */
|
|
|
|
__le32 flags; /* Use virtiovf_migf_header_flags */
|
|
|
|
__le32 tag; /* Use virtiovf_migf_header_tag */
|
|
|
|
__u8 data[]; /* Its size is given in the record_size */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct virtiovf_migration_file {
|
|
|
|
struct file *filp;
|
|
|
|
/* synchronize access to the file state */
|
|
|
|
struct mutex lock;
|
|
|
|
loff_t max_pos;
|
2024-11-13 13:51:59 +02:00
|
|
|
u64 pre_copy_initial_bytes;
|
|
|
|
struct ratelimit_state pre_copy_rl_state;
|
vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
u64 record_size;
|
|
|
|
u32 record_tag;
|
|
|
|
u8 has_obj_id:1;
|
|
|
|
u32 obj_id;
|
|
|
|
enum virtiovf_migf_state state;
|
|
|
|
enum virtiovf_load_state load_state;
|
|
|
|
/* synchronize access to the lists */
|
|
|
|
spinlock_t list_lock;
|
|
|
|
struct list_head buf_list;
|
|
|
|
struct list_head avail_list;
|
|
|
|
struct virtiovf_data_buffer *buf;
|
|
|
|
struct virtiovf_data_buffer *buf_header;
|
|
|
|
struct virtiovf_pci_core_device *virtvdev;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct virtiovf_pci_core_device {
|
|
|
|
struct vfio_pci_core_device core_device;
|
2024-11-13 13:52:00 +02:00
|
|
|
#ifdef CONFIG_VIRTIO_VFIO_PCI_ADMIN_LEGACY
|
vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
u8 *bar0_virtual_buf;
|
|
|
|
/* synchronize access to the virtual buf */
|
|
|
|
struct mutex bar_mutex;
|
|
|
|
void __iomem *notify_addr;
|
|
|
|
u64 notify_offset;
|
|
|
|
__le32 pci_base_addr_0;
|
|
|
|
__le16 pci_cmd;
|
|
|
|
u8 bar0_virtual_buf_size;
|
|
|
|
u8 notify_bar;
|
2024-11-13 13:52:00 +02:00
|
|
|
#endif
|
vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
|
|
|
|
/* LM related */
|
|
|
|
u8 migrate_cap:1;
|
|
|
|
u8 deferred_reset:1;
|
|
|
|
/* protect migration state */
|
|
|
|
struct mutex state_mutex;
|
|
|
|
enum vfio_device_mig_state mig_state;
|
|
|
|
/* protect the reset_done flow */
|
|
|
|
spinlock_t reset_lock;
|
|
|
|
struct virtiovf_migration_file *resuming_migf;
|
|
|
|
struct virtiovf_migration_file *saving_migf;
|
|
|
|
};
|
|
|
|
|
|
|
|
void virtiovf_set_migratable(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
void virtiovf_open_migration(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
void virtiovf_close_migration(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
void virtiovf_migration_reset_done(struct pci_dev *pdev);
|
|
|
|
|
2024-11-13 13:52:00 +02:00
|
|
|
#ifdef CONFIG_VIRTIO_VFIO_PCI_ADMIN_LEGACY
|
|
|
|
int virtiovf_open_legacy_io(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
long virtiovf_vfio_pci_core_ioctl(struct vfio_device *core_vdev,
|
|
|
|
unsigned int cmd, unsigned long arg);
|
|
|
|
int virtiovf_pci_ioctl_get_region_info(struct vfio_device *core_vdev,
|
|
|
|
unsigned int cmd, unsigned long arg);
|
|
|
|
ssize_t virtiovf_pci_core_write(struct vfio_device *core_vdev,
|
|
|
|
const char __user *buf, size_t count,
|
|
|
|
loff_t *ppos);
|
|
|
|
ssize_t virtiovf_pci_core_read(struct vfio_device *core_vdev, char __user *buf,
|
|
|
|
size_t count, loff_t *ppos);
|
|
|
|
bool virtiovf_support_legacy_io(struct pci_dev *pdev);
|
|
|
|
int virtiovf_init_legacy_io(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
void virtiovf_release_legacy_io(struct virtiovf_pci_core_device *virtvdev);
|
|
|
|
void virtiovf_legacy_io_reset_done(struct pci_dev *pdev);
|
|
|
|
#endif
|
|
|
|
|
vfio/virtio: Add support for the basic live migration functionality
Add support for basic live migration functionality in VFIO over
virtio-net devices, aligned with the virtio device specification 1.4.
This includes the following VFIO features:
VFIO_MIGRATION_STOP_COPY, VFIO_MIGRATION_P2P.
The implementation registers with the VFIO subsystem using vfio_pci_core
and then incorporates the virtio-specific logic for the migration
process.
The migration follows the definitions in uapi/vfio.h and leverages the
virtio VF-to-PF admin queue command channel for execution device parts
related commands.
Additional Notes:
-----------------
The kernel protocol between the source and target devices contains a
header with metadata, including record size, tag, and flags.
The record size allows the target to recognize and read a complete image
from the source before passing the device part data. This adheres to the
virtio device specification, which mandates that partial device parts
cannot be supplied.
The tag and flags serve as placeholders for future extensions of the
kernel protocol between the source and target, ensuring backward and
forward compatibility.
Both the source and target comply with the virtio device specification
by using a device part object with a unique ID as part of the migration
process. Since this resource is limited to a maximum of 255, its
lifecycle is confined to periods with an active live migration flow.
According to the virtio specification, a device has only two modes:
RUNNING and STOPPED. As a result, certain VFIO transitions (i.e.,
RUNNING_P2P->STOP, STOP->RUNNING_P2P) are treated as no-ops. When
transitioning to RUNNING_P2P, the device state is set to STOP, and it
will remain STOPPED until the transition out of RUNNING_P2P->RUNNING, at
which point it returns to RUNNING. During transition to STOP, the virtio
device only stops initiating outgoing requests(e.g. DMA, MSIx, etc.) but
still must accept incoming operations.
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20241113115200.209269-6-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
2024-11-13 13:51:58 +02:00
|
|
|
#endif /* VIRTIO_VFIO_COMMON_H */
|