From: Sobin Thomas <sobin.thomas@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: zbigniew.kempczynski@intel.com, kamil.konieczny@intel.com,
Sobin Thomas <sobin.thomas@intel.com>
Subject: [PATCH v3 i-g-t 1/1] tests/intel/xe_compute_preempt: Compute preemption check
Date: Wed, 10 Sep 2025 17:19:59 +0000 [thread overview]
Message-ID: <20250910171959.1852534-2-sobin.thomas@intel.com> (raw)
In-Reply-To: <20250910171959.1852534-1-sobin.thomas@intel.com>
On platforms like PVC that lack walker mid-thread preemption, running
tests in forked threads can cause inconsistent states due to mid-
execution igt_skip calls. This patch adds a kernel preemption check
at the start of each subtest to ensure consistent behavior. If the
GPU lacks required preemption, the test is skipped gracefully.
v2: Moved compatibility check to igt_fixture per review.
v3: - Added thread group preemption and WMTP checks;
- Introduced enum flags for preemption types. [Zbigniew]
Signed-off-by: Sobin Thomas <sobin.thomas@intel.com>
---
lib/intel_compute.c | 22 ++++++++++++++++++++++
lib/intel_compute.h | 7 +++++++
tests/intel/xe_compute_preempt.c | 6 ++++++
3 files changed, 35 insertions(+)
diff --git a/lib/intel_compute.c b/lib/intel_compute.c
index 147dd2916..7538c4b42 100644
--- a/lib/intel_compute.c
+++ b/lib/intel_compute.c
@@ -2193,21 +2193,25 @@ static const struct {
bool threadgroup_preemption,
enum execenv_alloc_prefs alloc_prefs);
uint32_t compat;
+ enum xe_compute_preempt_type preempt_type;
} intel_compute_preempt_batches[] = {
{
.ip_ver = IP_VER(20, 01),
.compute_exec = xe2lpg_compute_preempt_exec,
.compat = COMPAT_DRIVER_XE,
+ .preempt_type = PREEMPT_WMTP | PREEMPT_TGP,
},
{
.ip_ver = IP_VER(20, 04),
.compute_exec = xe2lpg_compute_preempt_exec,
.compat = COMPAT_DRIVER_XE,
+ .preempt_type = PREEMPT_WMTP | PREEMPT_TGP,
},
{
.ip_ver = IP_VER(30, 00),
.compute_exec = xe2lpg_compute_preempt_exec,
.compat = COMPAT_DRIVER_XE,
+ .preempt_type = PREEMPT_WMTP | PREEMPT_TGP,
},
};
@@ -2260,6 +2264,24 @@ static bool __run_intel_compute_kernel_preempt(int fd,
return true;
}
+
+bool check_kernel_preempt(int fd, enum xe_compute_preempt_type required_preempt)
+{
+ unsigned int ip_ver = intel_graphics_ver(intel_get_drm_devid(fd));
+ unsigned int batch;
+
+ for (batch = 0; batch < ARRAY_SIZE(intel_compute_preempt_batches); batch++)
+ if (ip_ver == intel_compute_preempt_batches[batch].ip_ver)
+ break;
+
+ if (required_preempt &&
+ !(intel_compute_preempt_batches[batch].preempt_type & required_preempt)) {
+ igt_info("Preemption type not supported %x", required_preempt);
+ return false;
+ }
+ return true;
+}
+
/**
* run_intel_compute_kernel_preempt - runs compute kernels to
* exercise preemption scenario.
diff --git a/lib/intel_compute.h b/lib/intel_compute.h
index 412791d07..b70cd7185 100644
--- a/lib/intel_compute.h
+++ b/lib/intel_compute.h
@@ -71,6 +71,11 @@ enum execenv_alloc_prefs {
EXECENV_PREF_VRAM_IF_POSSIBLE,
};
+enum xe_compute_preempt_type {
+ PREEMPT_TGP = 1 << 0, /* ThreadGroup Preemption */
+ PREEMPT_WMTP = 1 << 1, /* Walker Mid Thread Preemption */
+};
+
extern const struct intel_compute_kernels intel_compute_square_kernels[];
bool run_intel_compute_kernel(int fd, struct user_execenv *user,
@@ -81,4 +86,6 @@ bool xe_run_intel_compute_kernel_on_engine(int fd, struct drm_xe_engine_class_in
bool run_intel_compute_kernel_preempt(int fd, struct drm_xe_engine_class_instance *eci,
bool threadgroup_preemption,
enum execenv_alloc_prefs alloc_prefs);
+
+bool check_kernel_preempt(int fd, enum xe_compute_preempt_type required_preempt);
#endif /* INTEL_COMPUTE_H */
diff --git a/tests/intel/xe_compute_preempt.c b/tests/intel/xe_compute_preempt.c
index c9b194869..a4c0bc59b 100644
--- a/tests/intel/xe_compute_preempt.c
+++ b/tests/intel/xe_compute_preempt.c
@@ -76,6 +76,7 @@ igt_main
}
igt_subtest_with_dynamic("compute-preempt") {
+ igt_require(check_kernel_preempt(xe, PREEMPT_WMTP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
@@ -86,6 +87,7 @@ igt_main
}
igt_subtest_with_dynamic("compute-preempt-many") {
+ igt_require(check_kernel_preempt(xe, PREEMPT_WMTP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
@@ -112,6 +114,7 @@ igt_main
igt_subtest_with_dynamic("compute-preempt-many-all-ram") {
igt_require(swap_mb > CONTEXT_MB * 10);
+ igt_require(check_kernel_preempt(xe, PREEMPT_WMTP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
@@ -138,6 +141,7 @@ igt_main
igt_subtest_with_dynamic("compute-preempt-many-vram") {
igt_require(xe_has_vram(xe));
+ igt_require(check_kernel_preempt(xe, PREEMPT_WMTP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
@@ -164,6 +168,7 @@ igt_main
igt_subtest_with_dynamic("compute-preempt-many-vram-evict") {
igt_require(xe_has_vram(xe));
+ igt_require(check_kernel_preempt(xe, PREEMPT_WMTP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
@@ -188,6 +193,7 @@ igt_main
}
igt_subtest_with_dynamic("compute-threadgroup-preempt") {
+ igt_require(check_kernel_preempt(xe, PREEMPT_TGP));
xe_for_each_engine(xe, hwe) {
if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
continue;
--
2.34.1
next prev parent reply other threads:[~2025-09-10 17:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-10 17:19 [PATCH v3 i-g-t 0/1] tests/intel/xe_compute_preempt: Compute preemption check Sobin Thomas
2025-09-10 17:19 ` Sobin Thomas [this message]
2025-09-11 6:49 ` [PATCH v3 i-g-t 1/1] " Dandamudi, Priyanka
2025-09-11 11:58 ` Thomas, Sobin
2025-09-11 7:16 ` Zbigniew Kempczyński
2025-09-10 18:08 ` ✓ Xe.CI.BAT: success for " Patchwork
2025-09-10 18:09 ` ✓ i915.CI.BAT: " Patchwork
2025-09-11 0:57 ` ✗ Xe.CI.Full: failure " Patchwork
2025-09-11 15:05 ` ✓ i915.CI.Full: success " 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=20250910171959.1852534-2-sobin.thomas@intel.com \
--to=sobin.thomas@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=kamil.konieczny@intel.com \
--cc=zbigniew.kempczynski@intel.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