On Fri, Dec 06, 2019 at 07:55:15AM +0800, Alex Williamson wrote:
On Wed, 4 Dec 2019 22:26:38 -0500
Yan Zhao <yan.y.zhao(a)intel.com> wrote:
> Vendor driver specifies when to support a migration region through cap
> VFIO_PCI_DEVICE_CAP_MIGRATION in vfio_pci_mediate_ops->open().
>
> If vfio-pci detects this cap, it creates a default migration region on
> behalf of vendor driver with region len=0 and region->ops=null.
> Vendor driver should override this region's len, flags, rw, mmap in
> its vfio_pci_mediate_ops.
>
> This migration region definition is aligned to QEMU vfio migration code v8:
> (
https://lists.gnu.org/archive/html/qemu-devel/2019-08/msg05542.html)
>
> Cc: Kevin Tian <kevin.tian(a)intel.com>
>
> Signed-off-by: Yan Zhao <yan.y.zhao(a)intel.com>
> ---
> drivers/vfio/pci/vfio_pci.c | 15 ++++
> include/linux/vfio.h | 1 +
> include/uapi/linux/vfio.h | 149 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 165 insertions(+)
>
> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
> index f3730252ee82..059660328be2 100644
> --- a/drivers/vfio/pci/vfio_pci.c
> +++ b/drivers/vfio/pci/vfio_pci.c
> @@ -115,6 +115,18 @@ static inline bool vfio_pci_is_vga(struct pci_dev *pdev)
> return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA;
> }
>
> +/**
> + * init a region to hold migration ctl & data
> + */
> +void init_migration_region(struct vfio_pci_device *vdev)
> +{
> + vfio_pci_register_dev_region(vdev, VFIO_REGION_TYPE_MIGRATION,
> + VFIO_REGION_SUBTYPE_MIGRATION,
> + NULL, 0,
> + VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE,
> + NULL);
> +}
> +
> static void vfio_pci_probe_mmaps(struct vfio_pci_device *vdev)
> {
> struct resource *res;
> @@ -523,6 +535,9 @@ static int vfio_pci_open(void *device_data)
> vdev->mediate_ops = mentry->ops;
> vdev->mediate_handle = handle;
>
> + if (caps & VFIO_PCI_DEVICE_CAP_MIGRATION)
> + init_migration_region(vdev);
No. We're not going to add a cap flag for every region the mediation
driver wants to add. The mediation driver should have the ability to
add regions and irqs to the device itself. Thanks,
Alex
ok. got it. will do it.
Thanks
Yan
> +
> pr_info("vfio pci found mediate_ops %s, caps=%llx, handle=%x for
%x:%x\n",
> vdev->mediate_ops->name, caps,
> handle, vdev->pdev->vendor,