Re: [PATCH 02/26] drm/xe: Move migration support to device-level struct

Michal Wajdeczko
2025-10-12T18:58:58Z

On 10/11/2025 9:38 PM, Michał Winiarski wrote:
> Upcoming changes will allow users to control VF state and obtain its
> migration data with a device-level granularity (not tile/gt).
> Change the data structures to reflect that and move the GT-level
> migration init to happen after device-level init.
>
> Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
> ---
> drivers/gpu/drm/xe/Makefile | 1 +
> drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 12 +-----
> .../drm/xe/xe_gt_sriov_pf_migration_types.h | 3 --
> drivers/gpu/drm/xe/xe_sriov_pf.c | 5 +++
> drivers/gpu/drm/xe/xe_sriov_pf_migration.c | 43 +++++++++++++++++++
> drivers/gpu/drm/xe/xe_sriov_pf_migration.h | 27 ++++++++++++
> .../gpu/drm/xe/xe_sriov_pf_migration_types.h | 0
> drivers/gpu/drm/xe/xe_sriov_pf_types.h | 5 +++
> 8 files changed, 83 insertions(+), 13 deletions(-)
> 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
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 84321fad32658..71f685a315dca 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -176,6 +176,7 @@ xe-$(CONFIG_PCI_IOV) += \
> xe_sriov_pf.o \
> xe_sriov_pf_control.o \
> xe_sriov_pf_debugfs.o \
> + xe_sriov_pf_migration.o \
> xe_sriov_pf_service.o \
> xe_tile_sriov_pf_debugfs.o
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> index a5bf327ef8889..ca28f45aaf481 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> @@ -13,6 +13,7 @@
> #include "xe_guc.h"
> #include "xe_guc_ct.h"
> #include "xe_sriov.h"
> +#include "xe_sriov_pf_migration.h"
>
> /* Return: number of dwords saved/restored/required or a negative error code on failure */
> static int guc_action_vf_save_restore(struct xe_guc *guc, u32 vfid, u32 opcode,
> @@ -115,8 +116,7 @@ static int pf_send_guc_restore_vf_state(struct xe_gt *gt, unsigned int vfid,
>
> static bool pf_migration_supported(struct xe_gt *gt)
> {
> - xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> - return gt->sriov.pf.migration.supported;
> + return xe_sriov_pf_migration_supported(gt_to_xe(gt));
> }
>
> static struct mutex *pf_migration_mutex(struct xe_gt *gt)
> @@ -382,12 +382,6 @@ ssize_t xe_gt_sriov_pf_migration_write_guc_state(struct xe_gt *gt, unsigned int
> }
> #endif /* CONFIG_DEBUG_FS */
>
> -static bool pf_check_migration_support(struct xe_gt *gt)
> -{
> - /* XXX: for now this is for feature enabling only */
> - return IS_ENABLED(CONFIG_DRM_XE_DEBUG);
> -}
> -
> /**
> * xe_gt_sriov_pf_migration_init() - Initialize support for VF migration.
> * @gt: the &xe_gt
> @@ -403,8 +397,6 @@ int xe_gt_sriov_pf_migration_init(struct xe_gt *gt)
>
> xe_gt_assert(gt, IS_SRIOV_PF(xe));
>
> - gt->sriov.pf.migration.supported = pf_check_migration_support(gt);
> -
> if (!pf_migration_supported(gt))
> return 0;
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> index 1f3110b6d44fa..9d672feac5f04 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> @@ -30,9 +30,6 @@ struct xe_gt_sriov_state_snapshot {
> * Used by the PF driver to maintain non-VF specific per-GT data.
> */
> struct xe_gt_sriov_pf_migration {
> - /** @supported: indicates whether the feature is supported */
> - bool supported;
> -
> /** @snapshot_lock: protects all VFs snapshots */
> struct mutex snapshot_lock;
> };
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf.c b/drivers/gpu/drm/xe/xe_sriov_pf.c
> index bc1ab9ee31d92..95743c7af8050 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_pf.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_pf.c
> @@ -15,6 +15,7 @@
> #include "xe_sriov.h"
> #include "xe_sriov_pf.h"
> #include "xe_sriov_pf_helpers.h"
> +#include "xe_sriov_pf_migration.h"
> #include "xe_sriov_pf_service.h"
> #include "xe_sriov_printk.h"
>
> @@ -101,6 +102,10 @@ int xe_sriov_pf_init_early(struct xe_device *xe)
> if (err)
> return err;
>
> + err = xe_sriov_pf_migration_init(xe);
> + if (err)
> + return err;
> +
> xe_sriov_pf_service_init(xe);
>
> return 0;
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_migration.c b/drivers/gpu/drm/xe/xe_sriov_pf_migration.c
> new file mode 100644
> index 0000000000000..cf6a210d5597a
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_sriov_pf_migration.c
> @@ -0,0 +1,43 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#include "xe_sriov.h"
> +#include "xe_sriov_pf_migration.h"
> +
> +/**
> + * xe_sriov_pf_migration_supported() - Check if SR-IOV VF migration is supported by the device
> + * @xe: the &struct xe_device

nit: this will render better:

@xe: the struct &xe_device

but in other places we just use:

@xe: the &xe_device

> + *
> + * Return: true if migration is supported, false otherwise
> + */
> +bool xe_sriov_pf_migration_supported(struct xe_device *xe)
> +{
> + xe_assert(xe, IS_SRIOV_PF(xe));
> +
> + return xe->sriov.pf.migration.supported;
> +}
> +
> +static bool pf_check_migration_support(struct xe_device *xe)
> +{
> + xe_assert(xe, IS_SRIOV_PF(xe));

we don't need this here for now

> +
> + /* XXX: for now this is for feature enabling only */
> + return IS_ENABLED(CONFIG_DRM_XE_DEBUG);
> +}
> +
> +/**
> + * xe_sriov_pf_migration_init() - Initialize support for SR-IOV VF migration.
> + * @xe: the &struct xe_device
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_sriov_pf_migration_init(struct xe_device *xe)
> +{
> + xe_assert(xe, IS_SRIOV_PF(xe));
> +
> + xe->sriov.pf.migration.supported = pf_check_migration_support(xe);
> +
> + return 0;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_migration.h b/drivers/gpu/drm/xe/xe_sriov_pf_migration.h
> new file mode 100644
> index 0000000000000..d3058b6682192
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_sriov_pf_migration.h
> @@ -0,0 +1,27 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _XE_SRIOV_PF_MIGRATION_H_
> +#define _XE_SRIOV_PF_MIGRATION_H_
> +
> +#include <linux/types.h>
> +
> +struct xe_device;
> +
> +#ifdef CONFIG_PCI_IOV
> +int xe_sriov_pf_migration_init(struct xe_device *xe);
> +bool xe_sriov_pf_migration_supported(struct xe_device *xe);
> +#else
> +static inline int xe_sriov_pf_migration_init(struct xe_device *xe)
> +{
> + return 0;
> +}
> +static inline bool xe_sriov_pf_migration_supported(struct xe_device *xe)
> +{
> + return false;
> +}
> +#endif
> +
> +#endif
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_migration_types.h b/drivers/gpu/drm/xe/xe_sriov_pf_migration_types.h
> new file mode 100644
> index 0000000000000..e69de29bb2d1d
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_types.h b/drivers/gpu/drm/xe/xe_sriov_pf_types.h
> index 956a88f9f213d..2d2fcc0a2f258 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_pf_types.h
> +++ b/drivers/gpu/drm/xe/xe_sriov_pf_types.h
> @@ -32,6 +32,11 @@ struct xe_device_pf {
> /** @driver_max_vfs: Maximum number of VFs supported by the driver. */
> u16 driver_max_vfs;
>

I guess you need to document @migration too to make it work

> + struct {
> + /** @migration.supported: indicates whether VF migration feature is supported */
> + bool supported;
> + } migration;

also can you move that closer to other sub-component "service" below ?

> +
> /** @master_lock: protects all VFs configurations across GTs */
> struct mutex master_lock;
>

but otherwise LGTM, so with above fixed,

Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>