From: Matthew Brost <matthew.brost@intel.com>
To: intel-xe@lists.freedesktop.org
Subject: [PATCH 13/28] drm/xe/vf: Remove memory allocations from VF post migration recovery
Date: Tue, 16 Sep 2025 20:46:00 -0700 [thread overview]
Message-ID: <20250917034615.3977603-14-matthew.brost@intel.com> (raw)
In-Reply-To: <20250917034615.3977603-1-matthew.brost@intel.com>
VF post migration recovery is the path of dma-fence signaling / reclaim,
avoid memory allocations in this path.
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 29 ++++++++++++++---------
drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +-
drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 ++
drivers/gpu/drm/xe/xe_sriov.c | 8 +++++--
drivers/gpu/drm/xe/xe_sriov_vf.c | 14 ++++++++---
drivers/gpu/drm/xe/xe_sriov_vf.h | 2 +-
6 files changed, 39 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index 9134dd28444f..6c158e753cdd 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -1223,17 +1223,13 @@ static size_t post_migration_scratch_size(struct xe_device *xe)
static int vf_post_migration_fixups(struct xe_gt *gt)
{
+ void *buf = gt->sriov.vf.migration.lrc_wa_bb;
s64 shift;
- void *buf;
int err;
- buf = kmalloc(post_migration_scratch_size(gt_to_xe(gt)), GFP_ATOMIC);
- if (!buf)
- return -ENOMEM;
-
err = xe_gt_sriov_vf_query_config(gt);
if (err)
- goto out;
+ return err;
shift = xe_gt_sriov_vf_ggtt_shift(gt);
if (shift) {
@@ -1241,12 +1237,10 @@ static int vf_post_migration_fixups(struct xe_gt *gt)
xe_gt_sriov_vf_default_lrcs_hwsp_rebase(gt);
err = xe_guc_contexts_hwsp_rebase(>->uc.guc, buf);
if (err)
- goto out;
+ return err;
}
-out:
- kfree(buf);
- return err;
+ return 0;
}
static void vf_post_migration_kickstart(struct xe_gt *gt)
@@ -1323,15 +1317,28 @@ static void migration_worker_func(struct work_struct *w)
/**
* xe_gt_sriov_vf_migration_init_early() - VF post migration init early
* @gt: the &xe_gt
+ *
+ * Return 0 on success, errno on failure
*/
-void xe_gt_sriov_vf_migration_init_early(struct xe_gt *gt)
+int xe_gt_sriov_vf_migration_init_early(struct xe_gt *gt)
{
+ void *buf;
+
+ buf = drmm_kmalloc(>_to_xe(gt)->drm,
+ post_migration_scratch_size(gt_to_xe(gt)),
+ GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ gt->sriov.vf.migration.lrc_wa_bb = buf;
init_rwsem(>->sriov.vf.self_config.lock);
spin_lock_init(>->sriov.vf.migration.lock);
INIT_WORK(>->sriov.vf.migration.worker, migration_worker_func);
if (!vf_migration_supported())
xe_gt_sriov_info(gt, "migration not supported by this module version\n");
+
+ return 0;
}
/**
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
index 2ac6775b52f0..195dbebe941e 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
@@ -23,7 +23,7 @@ int xe_gt_sriov_vf_connect(struct xe_gt *gt);
int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
-void xe_gt_sriov_vf_migration_init_early(struct xe_gt *gt);
+int xe_gt_sriov_vf_migration_init_early(struct xe_gt *gt);
bool xe_gt_sriov_vf_recovery_inprogress(struct xe_gt *gt);
u32 xe_gt_sriov_vf_gmdid(struct xe_gt *gt);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
index 53680a2f188a..496b657119de 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
@@ -58,6 +58,8 @@ struct xe_gt_sriov_vf_migration {
struct work_struct worker;
/** @lock: Protects recovery_queued */
spinlock_t lock;
+ /** @lrc_wa_bb: Scratch memory for LRC WA BB in recovery */
+ void *lrc_wa_bb;
/** @recovery_queued: VF post migration recovery in queued */
bool recovery_queued;
/** @recovery_inprogress: VF post migration recovery in progress */
diff --git a/drivers/gpu/drm/xe/xe_sriov.c b/drivers/gpu/drm/xe/xe_sriov.c
index 7d2d6de2aabf..358a35c80d5a 100644
--- a/drivers/gpu/drm/xe/xe_sriov.c
+++ b/drivers/gpu/drm/xe/xe_sriov.c
@@ -116,8 +116,12 @@ int xe_sriov_init(struct xe_device *xe)
return err;
}
- if (IS_SRIOV_VF(xe))
- xe_sriov_vf_init_early(xe);
+ if (IS_SRIOV_VF(xe)) {
+ int err = xe_sriov_vf_init_early(xe);
+
+ if (err)
+ return err;
+ }
xe_assert(xe, !xe->sriov.wq);
xe->sriov.wq = alloc_workqueue("xe-sriov-wq", 0, 0);
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index 7d91553c4acc..e622a7c562c4 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -180,16 +180,24 @@ static void vf_migration_init_early(struct xe_device *xe)
/**
* xe_sriov_vf_init_early - Initialize SR-IOV VF specific data.
* @xe: the &xe_device to initialize
+ *
+ * Return: 0 on success or a negative error code on failure.
*/
-void xe_sriov_vf_init_early(struct xe_device *xe)
+int xe_sriov_vf_init_early(struct xe_device *xe)
{
struct xe_gt *gt;
unsigned int id;
+ int err;
- for_each_gt(gt, xe, id)
- xe_gt_sriov_vf_migration_init_early(gt);
+ for_each_gt(gt, xe, id) {
+ err = xe_gt_sriov_vf_migration_init_early(gt);
+ if (err)
+ return err;
+ }
vf_migration_init_early(xe);
+
+ return 0;
}
/**
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.h b/drivers/gpu/drm/xe/xe_sriov_vf.h
index 4df95266b261..13969c6910ce 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.h
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.h
@@ -11,7 +11,7 @@
struct dentry;
struct xe_device;
-void xe_sriov_vf_init_early(struct xe_device *xe);
+int xe_sriov_vf_init_early(struct xe_device *xe);
int xe_sriov_vf_init_late(struct xe_device *xe);
bool xe_sriov_vf_migration_supported(struct xe_device *xe);
void xe_sriov_vf_debugfs_register(struct xe_device *xe, struct dentry *root);
--
2.34.1
next prev parent reply other threads:[~2025-09-17 3:46 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-17 3:45 [PATCH 00/28] VF migration redesign Matthew Brost
2025-09-17 3:45 ` [PATCH 01/28] drm/xe/vf: Lock querying GGTT config during driver init Matthew Brost
2025-09-17 3:45 ` [PATCH 02/28] Revert "drm/xe/vf: Rebase exec queue parallel commands during migration recovery" Matthew Brost
2025-09-17 3:45 ` [PATCH 03/28] Revert "drm/xe/vf: Post migration, repopulate ring area for pending request" Matthew Brost
2025-09-17 3:45 ` [PATCH 04/28] Revert "drm/xe/vf: Fixup CTB send buffer messages after migration" Matthew Brost
2025-09-17 3:45 ` [PATCH 05/28] drm/xe: Save off position in ring in which a job was programmed Matthew Brost
2025-09-17 3:45 ` [PATCH 06/28] drm/xe/guc: Track pending-enable source in submission state Matthew Brost
2025-09-17 3:45 ` [PATCH 07/28] drm/xe: Track LR jobs in DRM scheduler pending list Matthew Brost
2025-09-17 3:45 ` [PATCH 08/28] drm/xe: Don't change LRC ring head on job resubmission Matthew Brost
2025-09-17 3:45 ` [PATCH 09/28] drm/xe/guc: Document GuC submission backend Matthew Brost
2025-09-17 3:45 ` [PATCH 10/28] drm/xe/vf: Add xe_gt_sriov_vf_recovery_inprogress helper Matthew Brost
2025-09-17 3:45 ` [PATCH 11/28] drm/xe/vf: Make VF recovery run on per-GT worker Matthew Brost
2025-09-17 3:45 ` [PATCH 12/28] drm/xe/vf: Abort H2G sends during VF post-migration recovery Matthew Brost
2025-09-17 3:46 ` Matthew Brost [this message]
2025-09-17 3:46 ` [PATCH 14/28] drm/xe/vf: Close multi-GT GGTT shift race Matthew Brost
2025-09-17 3:46 ` [PATCH 15/28] drm/xe/vf: Teardown VF post migration worker on driver unload Matthew Brost
2025-09-17 3:46 ` [PATCH 16/28] drm/xe/vf: Don't allow GT reset to be queued during VF post migration recovery Matthew Brost
2025-09-17 3:46 ` [PATCH 17/28] drm/xe/vf: Wakeup in GuC backend on " Matthew Brost
2025-09-17 3:46 ` [PATCH 18/28] drm/xe/vf: Extra debug on GGTT shift Matthew Brost
2025-09-17 3:46 ` [PATCH 19/28] drm/xe/vf: Use GUC_HXG_TYPE_EVENT for GuC context register Matthew Brost
2025-09-17 3:46 ` [PATCH 20/28] drm/xe/vf: Stop and flush CTs in VF post migration recovery Matthew Brost
2025-09-17 3:46 ` [PATCH 21/28] drm/xe/vf: Reset TLB invalidations during " Matthew Brost
2025-09-17 3:46 ` [PATCH 22/28] drm/xe/vf: Kickstart after resfix in " Matthew Brost
2025-09-17 3:46 ` [PATCH 23/28] drm/xe/vf: Start CTs before resfix " Matthew Brost
2025-09-17 3:46 ` [PATCH 24/28] drm/xe/vf: Abort VF post migration recovery on failure Matthew Brost
2025-09-17 3:46 ` [PATCH 25/28] drm/xe/vf: Replay GuC submission state on pause / unpause Matthew Brost
2025-09-17 3:46 ` [PATCH 26/28] drm/xe: Move queue init before LRC creation Matthew Brost
2025-09-17 3:46 ` [PATCH 27/28] drm/xe/vf: Add debug prints for GuC replaying state during VF recovery Matthew Brost
2025-09-17 3:46 ` [PATCH 28/28] drm/xe/vf: Workaround for race condition in GuC firmware during VF pause Matthew Brost
2025-09-17 3:55 ` ✗ CI.checkpatch: warning for VF migration redesign Patchwork
2025-09-17 3:56 ` ✓ CI.KUnit: success " Patchwork
2025-09-17 4:39 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-09-17 6:38 ` ✗ Xe.CI.Full: " Patchwork
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=20250917034615.3977603-14-matthew.brost@intel.com \
--to=matthew.brost@intel.com \
--cc=intel-xe@lists.freedesktop.org \
/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