Skip to content

Commit 611160b

Browse files
committed
drm/xe/pf: Release all VFs configs on device removal
If we try to manually provision VFs using debugfs and then we try to unload the driver, we will see complains like: [ ] Memory manager not clean during takedown. [ ] RIP: 0010:drm_mm_takedown+0x3f/0x100 [ ] [drm:drm_mm_takedown] *ERROR* node [fedff000 + 00001000]: inserted at drm_mm_insert_node_in_range+0x2bd/0x520 xe_ggtt_node_insert+0x52/0x90 [xe] pf_provision_vf_ggtt+0x1fa/0xac0 [xe] xe_gt_sriov_pf_config_set_ggtt+0x79/0x7a0 [xe] ggtt_set+0x53/0x80 [xe] simple_attr_write_xsigned.isra.0+0xd2/0x150 simple_attr_write+0x14/0x30 debugfs_attr_write+0x4e/0x80 [ ] xe 0000:00:02.0: [drm] *ERROR* GT0: GUC ID manager unclean (1/65535) [ ] xe 0000:00:02.0: [drm] GT0: total 65535 [ ] xe 0000:00:02.0: [drm] GT0: used 1 [ ] xe 0000:00:02.0: [drm] GT0: range 65534..65534 (1) [ ] xe 0000:00:02.0: [drm] *ERROR* GT0: GuC doorbells manager unclean (1/256) [ ] xe 0000:00:02.0: [drm] GT0: count: 256 [ ] xe 0000:00:02.0: [drm] GT0: available range: 1..255 (255) [ ] xe 0000:00:02.0: [drm] GT0: available total: 255 [ ] xe 0000:00:02.0: [drm] GT0: reserved range: 0..0 (1) [ ] xe 0000:00:02.0: [drm] GT0: reserved total: 1 This could be easily fixed by adding config release action. Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Cc: Piotr Piórkowski <piotr.piorkowski@intel.com> Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250211155034.1028-1-michal.wajdeczko@intel.com
1 parent 62fbc75 commit 611160b

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

drivers/gpu/drm/xe/xe_gt_sriov_pf.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ int xe_gt_sriov_pf_init_early(struct xe_gt *gt)
8989
*/
9090
int xe_gt_sriov_pf_init(struct xe_gt *gt)
9191
{
92+
int err;
93+
94+
err = xe_gt_sriov_pf_config_init(gt);
95+
if (err)
96+
return err;
97+
9298
return xe_gt_sriov_pf_migration_init(gt);
9399
}
94100

drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,6 +2356,35 @@ int xe_gt_sriov_pf_config_restore(struct xe_gt *gt, unsigned int vfid,
23562356
return err;
23572357
}
23582358

2359+
static void fini_config(void *arg)
2360+
{
2361+
struct xe_gt *gt = arg;
2362+
struct xe_device *xe = gt_to_xe(gt);
2363+
unsigned int n, total_vfs = xe_sriov_pf_get_totalvfs(xe);
2364+
2365+
mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
2366+
for (n = 1; n <= total_vfs; n++)
2367+
pf_release_vf_config(gt, n);
2368+
mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
2369+
}
2370+
2371+
/**
2372+
* xe_gt_sriov_pf_config_init - Initialize SR-IOV configuration data.
2373+
* @gt: the &xe_gt
2374+
*
2375+
* This function can only be called on PF.
2376+
*
2377+
* Return: 0 on success or a negative error code on failure.
2378+
*/
2379+
int xe_gt_sriov_pf_config_init(struct xe_gt *gt)
2380+
{
2381+
struct xe_device *xe = gt_to_xe(gt);
2382+
2383+
xe_gt_assert(gt, IS_SRIOV_PF(xe));
2384+
2385+
return devm_add_action_or_reset(xe->drm.dev, fini_config, gt);
2386+
}
2387+
23592388
/**
23602389
* xe_gt_sriov_pf_config_restart - Restart SR-IOV configurations after a GT reset.
23612390
* @gt: the &xe_gt

drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ int xe_gt_sriov_pf_config_restore(struct xe_gt *gt, unsigned int vfid,
6363

6464
bool xe_gt_sriov_pf_config_is_empty(struct xe_gt *gt, unsigned int vfid);
6565

66+
int xe_gt_sriov_pf_config_init(struct xe_gt *gt);
6667
void xe_gt_sriov_pf_config_restart(struct xe_gt *gt);
6768

6869
int xe_gt_sriov_pf_config_print_ggtt(struct xe_gt *gt, struct drm_printer *p);

0 commit comments

Comments
 (0)