]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/pf: Expose VF migration data size over debugfs
authorMichał Winiarski <michal.winiarski@intel.com>
Wed, 12 Nov 2025 13:22:05 +0000 (14:22 +0100)
committerMichał Winiarski <michal.winiarski@intel.com>
Thu, 13 Nov 2025 10:48:19 +0000 (11:48 +0100)
The size is normally used to make a decision on when to stop the device
(mainly when it's in a pre_copy state).

Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patch.msgid.link/20251112132220.516975-10-michal.winiarski@intel.com
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h
drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c
drivers/gpu/drm/xe/xe_sriov_pf_migration.c
drivers/gpu/drm/xe/xe_sriov_pf_migration.h

index 4e49022810ea5fb240396e2eb57fd06cc12907e7..0ffe64ee469fe2ccec3d6d2267f91db8773d06e7 100644 (file)
@@ -396,6 +396,27 @@ ssize_t xe_gt_sriov_pf_migration_write_guc_state(struct xe_gt *gt, unsigned int
 }
 #endif /* CONFIG_DEBUG_FS */
 
+/**
+ * xe_gt_sriov_pf_migration_size() - Total size of migration data from all components within a GT.
+ * @gt: the &xe_gt
+ * @vfid: the VF identifier (can't be 0)
+ *
+ * This function is for PF only.
+ *
+ * Return: total migration data size in bytes or a negative error code on failure.
+ */
+ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid)
+{
+       ssize_t total = 0;
+
+       xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+       xe_gt_assert(gt, vfid != PFID);
+       xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt)));
+
+       /* Nothing to query yet - will be updated once per-GT migration data types are added */
+       return total;
+}
+
 /**
  * xe_gt_sriov_pf_migration_ring_empty() - Check if a migration ring is empty.
  * @gt: the &xe_gt
index b4c7b5dc9e9142f7a080706ce0f2b4ef44a94643..3ad3c3609b41554883383b9d1536b2630920e477 100644 (file)
@@ -15,6 +15,8 @@ int xe_gt_sriov_pf_migration_init(struct xe_gt *gt);
 int xe_gt_sriov_pf_migration_save_guc_state(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_migration_restore_guc_state(struct xe_gt *gt, unsigned int vfid);
 
+ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid);
+
 bool xe_gt_sriov_pf_migration_ring_empty(struct xe_gt *gt, unsigned int vfid);
 bool xe_gt_sriov_pf_migration_ring_full(struct xe_gt *gt, unsigned int vfid);
 void xe_gt_sriov_pf_migration_ring_free(struct xe_gt *gt, unsigned int vfid);
index 5e5ffafc61a49415a19797431f3c5519d8e38beb..bad751217e1e529d15478a62da23cb58d1dd9c42 100644 (file)
@@ -284,6 +284,33 @@ static const struct file_operations data_vf_fops = {
        .llseek         = default_llseek,
 };
 
+static ssize_t size_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos)
+{
+       struct dentry *dent = file_dentry(file)->d_parent;
+       struct xe_device *xe = extract_xe(dent);
+       unsigned int vfid = extract_vfid(dent);
+       char buf[21];
+       ssize_t ret;
+       int len;
+
+       xe_pm_runtime_get(xe);
+       ret = xe_sriov_pf_migration_size(xe, vfid);
+       xe_pm_runtime_put(xe);
+       if (ret < 0)
+               return ret;
+
+       len = scnprintf(buf, sizeof(buf), "%zd\n", ret);
+
+       return simple_read_from_buffer(ubuf, count, ppos, buf, len);
+}
+
+static const struct file_operations size_vf_fops = {
+       .owner          = THIS_MODULE,
+       .open           = simple_open,
+       .read           = size_read,
+       .llseek         = default_llseek,
+};
+
 static void pf_populate_vf(struct xe_device *xe, struct dentry *vfdent)
 {
        debugfs_create_file("pause", 0200, vfdent, xe, &pause_vf_fops);
@@ -293,6 +320,7 @@ static void pf_populate_vf(struct xe_device *xe, struct dentry *vfdent)
        debugfs_create_file("save", 0600, vfdent, xe, &save_vf_fops);
        debugfs_create_file("restore", 0600, vfdent, xe, &restore_vf_fops);
        debugfs_create_file("migration_data", 0600, vfdent, xe, &data_vf_fops);
+       debugfs_create_file("migration_size", 0400, vfdent, xe, &size_vf_fops);
 }
 
 static void pf_populate_with_tiles(struct xe_device *xe, struct dentry *dent, unsigned int vfid)
index bbaf0caed05728d18b9bfd3cc77c115210f07892..21b06ce6830a4ab09a36696d8e0f2c92efd21329 100644 (file)
@@ -310,3 +310,33 @@ ssize_t xe_sriov_pf_migration_write(struct xe_device *xe, unsigned int vfid,
 
        return produced;
 }
+
+/**
+ * xe_sriov_pf_migration_size() - Total size of migration data from all components within a device
+ * @xe: the &xe_device
+ * @vfid: the VF identifier (can't be 0)
+ *
+ * This function is for PF only.
+ *
+ * Return: total migration data size in bytes or a negative error code on failure.
+ */
+ssize_t xe_sriov_pf_migration_size(struct xe_device *xe, unsigned int vfid)
+{
+       size_t size = 0;
+       struct xe_gt *gt;
+       ssize_t ret;
+       u8 gt_id;
+
+       xe_assert(xe, IS_SRIOV_PF(xe));
+       xe_assert(xe, vfid);
+
+       for_each_gt(gt, xe, gt_id) {
+               ret = xe_gt_sriov_pf_migration_size(gt, vfid);
+               if (ret < 0)
+                       return ret;
+
+               size += ret;
+       }
+
+       return size;
+}
index dbf8094900df8c23d024ef5df8a852f8ee46fcae..b806298a0bb62fd8687989a3d645d0454a480dfc 100644 (file)
@@ -18,6 +18,7 @@ int xe_sriov_pf_migration_restore_produce(struct xe_device *xe, unsigned int vfi
                                          struct xe_sriov_packet *data);
 struct xe_sriov_packet *
 xe_sriov_pf_migration_save_consume(struct xe_device *xe, unsigned int vfid);
+ssize_t xe_sriov_pf_migration_size(struct xe_device *xe, unsigned int vfid);
 wait_queue_head_t *xe_sriov_pf_migration_waitqueue(struct xe_device *xe, unsigned int vfid);
 
 ssize_t xe_sriov_pf_migration_read(struct xe_device *xe, unsigned int vfid,