From: "Michał Winiarski" <michal.winiarski@intel.com>
To: "Alex Williamson" <alex@shazbot.org>,
"Lucas De Marchi" <lucas.demarchi@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Jason Gunthorpe" <jgg@ziepe.ca>,
"Yishai Hadas" <yishaih@nvidia.com>,
"Kevin Tian" <kevin.tian@intel.com>,
"Shameer Kolothum" <skolothumtho@nvidia.com>,
intel-xe@lists.freedesktop.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, "Matthew Brost" <matthew.brost@intel.com>,
"Michal Wajdeczko" <michal.wajdeczko@intel.com>
Cc: dri-devel@lists.freedesktop.org,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Tvrtko Ursulin" <tursulin@ursulin.net>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Lukasz Laguna" <lukasz.laguna@intel.com>,
"Christoph Hellwig" <hch@infradead.org>,
"Michał Winiarski" <michal.winiarski@intel.com>
Subject: [PATCH v4 00/28] vfio/xe: Add driver variant for Xe VF migration
Date: Wed, 5 Nov 2025 16:09:58 +0100 [thread overview]
Message-ID: <20251105151027.540712-1-michal.winiarski@intel.com> (raw)
Hi,
This is a fourth round of patches introducing support for Xe SR-IOV VF
migration.
Thanks for all the review feedback.
The most impactful functional change in this revision is a small fix in
GGTT save/restore code, which fixes a regression introduced in v2.
Additionally, error handling is improved on data read/data write path.
On VFIO side, we're now using PCI_DRIVER_OVERRIDE_DEVICE_VFIO as a match
(not using PCI VGA class).
From lines-of-code changed perspective, renaming xe_sriov_migration_data
to xe_sriov_packet caused a bit of churn across multiple patches.
Full changelog can be found below.
Cover letter from the previous revision:
Xe is a DRM driver supporting Intel GPUs and for SR-IOV capable
devices, it enables the creation of SR-IOV VFs.
This series adds xe-vfio-pci driver variant that interacts with Xe
driver to control VF device state and read/write migration data,
allowing it to extend regular vfio-pci functionality with VFIO migration
capability.
The driver doesn't expose PRE_COPY support, as currently supported
hardware lacks the capability to track dirty pages.
While Xe driver already had the capability to manage VF device state,
management of migration data was something that needed to be implemented
and constitutes the majority of the series.
The migration data is processed asynchronously by the Xe driver, and is
organized into multiple migration data packet types representing the
hardware interfaces of the device (GGTT / MMIO / GuC FW / VRAM).
Since the VRAM can potentially be larger than available system memory,
it is copied in multiple chunks. The metadata needed for migration
compatibility decisions is added as part of descriptor packet (currently
limited to PCI device ID / revision).
Xe driver abstracts away the internals of packet processing and takes
care of tracking the position within individual packets.
The API exported to VFIO is similar to API exported by VFIO to
userspace, a simple .read()/.write().
Note that some of the VF resources are not virtualized (e.g. GGTT - the
GFX device global virtual address space). This means that the VF driver
needs to be aware that migration has occurred in order to properly
relocate (patching or reemiting data that contains references to GGTT
addresses) before resuming operation.
The code to handle that is already present in upstream Linux and in
production VF drivers for other OSes.
Links to previous revisions for reference.
v1:
https://lore.kernel.org/lkml/20251011193847.1836454-1-michal.winiarski@intel.com/
v2:
https://lore.kernel.org/lkml/20251021224133.577765-1-michal.winiarski@intel.com/
v3:
https://lore.kernel.org/lkml/20251030203135.337696-1-michal.winiarski@intel.com/
v3 -> v4:
* Add error handling on data_read / data_write path
* Don't match on PCI class, use PCI_DRIVER_OVERRIDE_DEVICE_VFIO helper
instead (Lucas De Marchi)
* Use proper node VMA size inside GGTT save / restore helper (Michał)
* Improve data tracking set_bit / clear_bit wrapper names (Michał)
* Improve packet dump helper (Michał)
* Use drmm for migration mutex init (Michał)
* Rename the pf_device access helper (Michał)
* Use non-interruptible sleep in VRAM copy (Matt)
* Rename xe_sriov_migration_data to xe_sriov_packet along with relevant
functions (Michał)
* Rename per-vf device-level data to xe_sriov_migration_state (Michał)
* Use struct name that matches component name instead of anonymous
struct (Michał)
* Don't add XE_GT_SRIOV_STATE_MAX to state enum, use a helper macro
instead (Michał)
* Kernel-doc fixes (Michał)
v2 -> v3:
* Bind xe-vfio-pci to specific devices instead of using vendor and
class (Christoph Hellwig / Jason Gunthorpe)
* Don't refer to the driver as "vendor specific" (Christoph)
* Use pci_iov_get_pf_drvdata and change the interface to take xe_device
(Jason)
* Update the RUNNING_P2P comment (Jason / Kevin Tian)
* Add state_mutex to protect device state transitions (Kevin)
* Implement .error_detected (Kevin)
* Drop redundant comments (Kevin)
* Explain 1-based indexing and wait_flr_done (Kevin)
* Add a missing get_file() (Kevin)
* Drop redundant state transitions when p2p is supported (Kevin)
* Update run/stop naming to match other drivers (Kevin)
* Fix error state handling (Kevin)
* Fix SAVE state diagram rendering (Michał Wajdeczko)
* Control state machine flipping PROCESS / WAIT logic (Michał Wajdeczko)
* Drop GUC / GGTT / MMIO / VRAM from SAVE control state machine
* Use devm instead of drmm for migration-related allocations (Michał)
* Use GGTT node for size calculations (Michał)
* Use mutex guards consistently (Michał)
* Fix build break on 32-bit (lkp)
* Kernel-doc updates (Michał)
* And other, more minor changes
v1 -> v2:
* Do not require debug flag to support migration on PTL/BMG
* Fix PCI class match on VFIO side
* Reorganized PF Control state machine (Michał Wajdeczko)
* Kerneldoc tidying (Michał Wajdeczko)
* Return NULL instead of -ENODATA for produce/consume (Michał Wajdeczko)
* guc_buf s/sync/sync_read (Matt Brost)
* Squash patch 03 (Matt Brost)
* Assert on PM ref instead of taking it (Matt Brost)
* Remove CCS completely (Matt Brost)
* Return ptr on guc_buf_sync_read (Michał Wajdeczko)
* Define default guc_buf size (Michał Wajdeczko)
* Drop CONFIG_PCI_IOV=n stubs where not needed (Michał Wajdeczko)
* And other, more minor changes
Lukasz Laguna (2):
drm/xe/pf: Add helper to retrieve VF's LMEM object
drm/xe/migrate: Add function to copy of VRAM data in chunks
Michał Winiarski (26):
drm/xe/pf: Remove GuC version check for migration support
drm/xe: Move migration support to device-level struct
drm/xe/pf: Convert control state to bitmap
drm/xe/pf: Add save/restore control state stubs and connect to debugfs
drm/xe/pf: Add data structures and handlers for migration rings
drm/xe/pf: Add helpers for migration data packet allocation / free
drm/xe/pf: Add support for encap/decap of bitstream to/from packet
drm/xe/pf: Add minimalistic migration descriptor
drm/xe/pf: Expose VF migration data size over debugfs
drm/xe: Add sa/guc_buf_cache sync interface
drm/xe: Allow the caller to pass guc_buf_cache size
drm/xe/pf: Increase PF GuC Buffer Cache size and use it for VF
migration
drm/xe/pf: Remove GuC migration data save/restore from GT debugfs
drm/xe/pf: Don't save GuC VF migration data on pause
drm/xe/pf: Switch VF migration GuC save/restore to struct migration
data
drm/xe/pf: Handle GuC migration data as part of PF control
drm/xe/pf: Add helpers for VF GGTT migration data handling
drm/xe/pf: Handle GGTT migration data as part of PF control
drm/xe/pf: Handle MMIO migration data as part of PF control
drm/xe/pf: Handle VRAM migration data as part of PF control
drm/xe/pf: Add wait helper for VF FLR
drm/xe/pf: Enable SR-IOV VF migration
drm/xe/pci: Introduce a helper to allow VF access to PF xe_device
drm/xe/pf: Export helpers for VFIO
drm/intel/bmg: Allow device ID usage with single-argument macros
vfio/xe: Add device specific vfio_pci driver variant for Intel
graphics
MAINTAINERS | 7 +
drivers/gpu/drm/xe/Makefile | 4 +
drivers/gpu/drm/xe/xe_ggtt.c | 104 ++
drivers/gpu/drm/xe/xe_ggtt.h | 4 +
drivers/gpu/drm/xe/xe_ggtt_types.h | 2 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 78 ++
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 6 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 648 ++++++++++-
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h | 10 +
.../gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 34 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c | 47 -
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 1001 +++++++++++++----
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h | 48 +-
.../drm/xe/xe_gt_sriov_pf_migration_types.h | 34 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h | 5 +-
drivers/gpu/drm/xe/xe_guc.c | 13 +-
drivers/gpu/drm/xe/xe_guc_buf.c | 57 +-
drivers/gpu/drm/xe/xe_guc_buf.h | 2 +
drivers/gpu/drm/xe/xe_migrate.c | 128 ++-
drivers/gpu/drm/xe/xe_migrate.h | 8 +
drivers/gpu/drm/xe/xe_pci.c | 17 +
drivers/gpu/drm/xe/xe_pci.h | 3 +
drivers/gpu/drm/xe/xe_sa.c | 21 +
drivers/gpu/drm/xe/xe_sa.h | 1 +
drivers/gpu/drm/xe/xe_sriov_packet.c | 510 +++++++++
drivers/gpu/drm/xe/xe_sriov_packet.h | 38 +
drivers/gpu/drm/xe/xe_sriov_pf.c | 5 +
drivers/gpu/drm/xe/xe_sriov_pf_control.c | 128 +++
drivers/gpu/drm/xe/xe_sriov_pf_control.h | 5 +
drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c | 101 ++
drivers/gpu/drm/xe/xe_sriov_pf_migration.c | 343 ++++++
drivers/gpu/drm/xe/xe_sriov_pf_migration.h | 29 +
.../gpu/drm/xe/xe_sriov_pf_migration_types.h | 75 ++
drivers/gpu/drm/xe/xe_sriov_pf_types.h | 6 +
drivers/gpu/drm/xe/xe_sriov_vfio.c | 247 ++++
drivers/vfio/pci/Kconfig | 2 +
drivers/vfio/pci/Makefile | 2 +
drivers/vfio/pci/xe/Kconfig | 12 +
drivers/vfio/pci/xe/Makefile | 3 +
drivers/vfio/pci/xe/main.c | 556 +++++++++
include/drm/intel/pciids.h | 2 +-
include/drm/intel/xe_sriov_vfio.h | 30 +
42 files changed, 4048 insertions(+), 328 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_sriov_packet.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_packet.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration_types.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vfio.c
create mode 100644 drivers/vfio/pci/xe/Kconfig
create mode 100644 drivers/vfio/pci/xe/Makefile
create mode 100644 drivers/vfio/pci/xe/main.c
create mode 100644 include/drm/intel/xe_sriov_vfio.h
--
2.51.2
next reply other threads:[~2025-11-05 15:10 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-05 15:09 Michał Winiarski [this message]
2025-11-05 15:09 ` [PATCH v4 01/28] drm/xe/pf: Remove GuC version check for migration support Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 02/28] drm/xe: Move migration support to device-level struct Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 03/28] drm/xe/pf: Convert control state to bitmap Michał Winiarski
2025-11-05 18:51 ` Michal Wajdeczko
2025-11-05 15:10 ` [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 05/28] drm/xe/pf: Add data structures and handlers for migration rings Michał Winiarski
2025-11-05 20:17 ` Michal Wajdeczko
2025-11-06 11:24 ` Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 06/28] drm/xe/pf: Add helpers for migration data packet allocation / free Michał Winiarski
2025-11-05 21:12 ` Michal Wajdeczko
2025-11-06 11:30 ` Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 07/28] drm/xe/pf: Add support for encap/decap of bitstream to/from packet Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 08/28] drm/xe/pf: Add minimalistic migration descriptor Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 09/28] drm/xe/pf: Expose VF migration data size over debugfs Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 10/28] drm/xe: Add sa/guc_buf_cache sync interface Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 11/28] drm/xe: Allow the caller to pass guc_buf_cache size Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 12/28] drm/xe/pf: Increase PF GuC Buffer Cache size and use it for VF migration Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 13/28] drm/xe/pf: Remove GuC migration data save/restore from GT debugfs Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 14/28] drm/xe/pf: Don't save GuC VF migration data on pause Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 15/28] drm/xe/pf: Switch VF migration GuC save/restore to struct migration data Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 16/28] drm/xe/pf: Handle GuC migration data as part of PF control Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 17/28] drm/xe/pf: Add helpers for VF GGTT migration data handling Michał Winiarski
2025-11-05 21:45 ` Michal Wajdeczko
2025-11-06 11:31 ` Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 18/28] drm/xe/pf: Handle GGTT migration data as part of PF control Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 19/28] drm/xe/pf: Handle MMIO " Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 20/28] drm/xe/pf: Add helper to retrieve VF's LMEM object Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 21/28] drm/xe/migrate: Add function to copy of VRAM data in chunks Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 22/28] drm/xe/pf: Handle VRAM migration data as part of PF control Michał Winiarski
2025-11-08 4:31 ` Matthew Brost
2025-11-05 15:10 ` [PATCH v4 23/28] drm/xe/pf: Add wait helper for VF FLR Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 24/28] drm/xe/pf: Enable SR-IOV VF migration Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 25/28] drm/xe/pci: Introduce a helper to allow VF access to PF xe_device Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 26/28] drm/xe/pf: Export helpers for VFIO Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 27/28] drm/intel/bmg: Allow device ID usage with single-argument macros Michał Winiarski
2025-11-07 14:51 ` Lucas De Marchi
2025-11-05 15:10 ` [PATCH v4 28/28] vfio/xe: Add device specific vfio_pci driver variant for Intel graphics Michał Winiarski
2025-11-06 8:20 ` Tian, Kevin
2025-11-06 10:55 ` Winiarski, Michal
2025-11-07 3:10 ` Tian, Kevin
2025-11-08 0:47 ` Jason Gunthorpe
2025-11-08 1:05 ` Tian, Kevin
2025-11-08 1:11 ` Jason Gunthorpe
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=20251105151027.540712-1-michal.winiarski@intel.com \
--to=michal.winiarski@intel.com \
--cc=airlied@gmail.com \
--cc=alex@shazbot.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=hch@infradead.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=jgg@ziepe.ca \
--cc=joonas.lahtinen@linux.intel.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lucas.demarchi@intel.com \
--cc=lukasz.laguna@intel.com \
--cc=matthew.brost@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=simona@ffwll.ch \
--cc=skolothumtho@nvidia.com \
--cc=thomas.hellstrom@linux.intel.com \
--cc=tursulin@ursulin.net \
--cc=yishaih@nvidia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).