* [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space
@ 2022-11-18 13:57 Matthew Auld
2022-11-18 13:57 ` [Intel-gfx] [PATCH v2 2/2] drm/i915/selftests: exercise emit_pte() with nearly full ring Matthew Auld
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Matthew Auld @ 2022-11-18 13:57 UTC (permalink / raw)
To: intel-gfx; +Cc: stable, Andrzej Hajda, Chris Wilson, Nirmoy Das
From: Chris Wilson <chris.p.wilson@intel.com>
If the ring is nearly full when calling into emit_pte(), we might
incorrectly trample the reserved_space when constructing the packet to
emit the PTEs. This then triggers the GEM_BUG_ON(rq->reserved_space >
ring->space) when later submitting the request, since the request itself
doesn't have enough space left in the ring to emit things like
workarounds, breadcrumbs etc.
Testcase: igt@i915_selftests@live_emit_pte_full_ring
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/7535
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6889
Fixes: cf586021642d ("drm/i915/gt: Pipelined page migration")
Signed-off-by: Chris Wilson <chris.p.wilson@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Nirmoy Das <nirmoy.das@intel.com>
Cc: <stable@vger.kernel.org> # v5.15+
---
drivers/gpu/drm/i915/gt/intel_migrate.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c
index b405a04135ca..48c3b5168558 100644
--- a/drivers/gpu/drm/i915/gt/intel_migrate.c
+++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
@@ -342,6 +342,16 @@ static int emit_no_arbitration(struct i915_request *rq)
return 0;
}
+static int max_pte_pkt_size(struct i915_request *rq, int pkt)
+{
+ struct intel_ring *ring = rq->ring;
+
+ pkt = min_t(int, pkt, (ring->space - rq->reserved_space) / sizeof(u32) + 5);
+ pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5);
+
+ return pkt;
+}
+
static int emit_pte(struct i915_request *rq,
struct sgt_dma *it,
enum i915_cache_level cache_level,
@@ -388,8 +398,7 @@ static int emit_pte(struct i915_request *rq,
return PTR_ERR(cs);
/* Pack as many PTE updates as possible into a single MI command */
- pkt = min_t(int, dword_length, ring->space / sizeof(u32) + 5);
- pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5);
+ pkt = max_pte_pkt_size(rq, dword_length);
hdr = cs;
*cs++ = MI_STORE_DATA_IMM | REG_BIT(21); /* as qword elements */
@@ -422,8 +431,7 @@ static int emit_pte(struct i915_request *rq,
}
}
- pkt = min_t(int, dword_rem, ring->space / sizeof(u32) + 5);
- pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5);
+ pkt = max_pte_pkt_size(rq, dword_rem);
hdr = cs;
*cs++ = MI_STORE_DATA_IMM | REG_BIT(21);
--
2.38.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [Intel-gfx] [PATCH v2 2/2] drm/i915/selftests: exercise emit_pte() with nearly full ring 2022-11-18 13:57 [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space Matthew Auld @ 2022-11-18 13:57 ` Matthew Auld 2022-11-18 14:33 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space Patchwork ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Matthew Auld @ 2022-11-18 13:57 UTC (permalink / raw) To: intel-gfx; +Cc: Andrzej Hajda, Chris Wilson, Nirmoy Das Simple regression test to check that we don't trample the rq->reserved_space when returning from emit_pte(), if the ring is nearly full. v2: make spinner_kill() static References: https://gitlab.freedesktop.org/drm/intel/-/issues/7535 References: https://gitlab.freedesktop.org/drm/intel/-/issues/6889 Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Chris Wilson <chris.p.wilson@intel.com> Cc: Andrzej Hajda <andrzej.hajda@intel.com> Cc: Nirmoy Das <nirmoy.das@intel.com> --- drivers/gpu/drm/i915/gt/intel_migrate.c | 6 +- drivers/gpu/drm/i915/gt/selftest_migrate.c | 152 +++++++++++++++++++++ 2 files changed, 156 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c index 48c3b5168558..6df728b82a73 100644 --- a/drivers/gpu/drm/i915/gt/intel_migrate.c +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c @@ -352,6 +352,8 @@ static int max_pte_pkt_size(struct i915_request *rq, int pkt) return pkt; } +#define I915_EMIT_PTE_NUM_DWORDS 6 + static int emit_pte(struct i915_request *rq, struct sgt_dma *it, enum i915_cache_level cache_level, @@ -393,7 +395,7 @@ static int emit_pte(struct i915_request *rq, offset += (u64)rq->engine->instance << 32; - cs = intel_ring_begin(rq, 6); + cs = intel_ring_begin(rq, I915_EMIT_PTE_NUM_DWORDS); if (IS_ERR(cs)) return PTR_ERR(cs); @@ -416,7 +418,7 @@ static int emit_pte(struct i915_request *rq, intel_ring_advance(rq, cs); intel_ring_update_space(ring); - cs = intel_ring_begin(rq, 6); + cs = intel_ring_begin(rq, I915_EMIT_PTE_NUM_DWORDS); if (IS_ERR(cs)) return PTR_ERR(cs); diff --git a/drivers/gpu/drm/i915/gt/selftest_migrate.c b/drivers/gpu/drm/i915/gt/selftest_migrate.c index 0dc5309c90a4..edac9e4dec55 100644 --- a/drivers/gpu/drm/i915/gt/selftest_migrate.c +++ b/drivers/gpu/drm/i915/gt/selftest_migrate.c @@ -8,6 +8,7 @@ #include "gem/i915_gem_internal.h" #include "gem/i915_gem_lmem.h" +#include "selftests/igt_spinner.h" #include "selftests/i915_random.h" static const unsigned int sizes[] = { @@ -527,6 +528,156 @@ static int live_migrate_clear(void *arg) return 0; } +static int spinner_kill(void *arg) +{ + struct igt_spinner *spin = arg; + + msleep(2000); /* Should be plenty */ + igt_spinner_end(spin); + return 0; +} + +static int live_emit_pte_full_ring(void *arg) +{ + struct intel_migrate *migrate = arg; + struct drm_i915_private *i915 = migrate->context->engine->i915; + struct drm_i915_gem_object *obj; + struct intel_context *ce; + struct i915_request *rq, *prev; + struct igt_spinner spin; + struct task_struct *tsk = NULL; + struct sgt_dma it; + int len, sz, err; + int status; + u32 *cs; + + /* + * Simple regression test to check that we don't trample the + * rq->reserved_space when returning from emit_pte(), if the ring is + * nearly full. + */ + + if (igt_spinner_init(&spin, to_gt(i915))) + return -ENOMEM; + + obj = i915_gem_object_create_internal(i915, 2 * PAGE_SIZE); + if (IS_ERR(obj)) { + err = PTR_ERR(obj); + goto out_spinner; + } + + err = i915_gem_object_pin_pages_unlocked(obj); + if (err) + goto out_obj; + + ce = intel_migrate_create_context(migrate); + if (IS_ERR(ce)) { + err = PTR_ERR(ce); + goto out_obj; + } + + ce->ring_size = SZ_4K; /* Not too big */ + + err = intel_context_pin(ce); + if (err) + goto out_put; + + rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK); + if (IS_ERR(rq)) { + err = PTR_ERR(rq); + goto out_unpin; + } + + i915_request_add(rq); + if (!igt_wait_for_spinner(&spin, rq)) { + err = -EIO; + goto out_unpin; + } + + /* + * Fill the ring leaving I915_EMIT_PTE_NUM_DWORDS + ring->reserved_space + * at the end. To actually emit the PTEs we require slightly more than + * I915_EMIT_PTE_NUM_DWORDS, since our object size is greater than + * PAGE_SIZE. The correct behaviour is to wait for more ring space in + * emit_pte(), otherwise we trample on the reserved_space resulting in + * crashes when later submitting the rq. + */ + + prev = NULL; + do { + if (prev) + i915_request_add(rq); + + rq = i915_request_create(ce); + if (IS_ERR(rq)) { + err = PTR_ERR(rq); + goto out_unpin; + } + + sz = (rq->ring->space - rq->reserved_space) / sizeof(u32) - + I915_EMIT_PTE_NUM_DWORDS; + sz = min_t(u32, sz, SZ_1K / sizeof(u32)); + cs = intel_ring_begin(rq, sz); + if (IS_ERR(cs)) { + err = PTR_ERR(cs); + goto out_rq; + } + + memset32(cs, MI_NOOP, sz); + cs += sz; + intel_ring_advance(rq, cs); + + prev = rq; + } while (rq->ring->space > (rq->reserved_space + + I915_EMIT_PTE_NUM_DWORDS * sizeof(u32))); + + it = sg_sgt(obj->mm.pages->sgl); + + tsk = kthread_run(spinner_kill, &spin, "igt-kill-spinner"); + if (IS_ERR(tsk)) { + err = PTR_ERR(tsk); + goto out_rq; + } + + get_task_struct(tsk); + + msleep(10); /* start all threads before we kthread_stop() */ + + /* + * This should wait for the spinner to be killed, otherwise we should go + * down in flames when doing i915_request_add(). + */ + len = emit_pte(rq, &it, obj->cache_level, false, 0, CHUNK_SZ); + if (!len) { + err = -EINVAL; + goto out_rq; + } + if (len < 0) { + err = len; + goto out_rq; + } + +out_rq: + i915_request_add(rq); /* GEM_BUG_ON(rq->reserved_space > ring->space)? */ + + if (!IS_ERR_OR_NULL(tsk)) { + status = kthread_stop(tsk); + if (status && !err) + err = status; + + put_task_struct(tsk); + } +out_unpin: + intel_context_unpin(ce); +out_put: + intel_context_put(ce); +out_obj: + i915_gem_object_put(obj); +out_spinner: + igt_spinner_fini(&spin); + return err; +} + struct threaded_migrate { struct intel_migrate *migrate; struct task_struct *tsk; @@ -637,6 +788,7 @@ int intel_migrate_live_selftests(struct drm_i915_private *i915) static const struct i915_subtest tests[] = { SUBTEST(live_migrate_copy), SUBTEST(live_migrate_clear), + SUBTEST(live_emit_pte_full_ring), SUBTEST(thread_migrate_copy), SUBTEST(thread_migrate_clear), SUBTEST(thread_global_copy), -- 2.38.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space 2022-11-18 13:57 [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space Matthew Auld 2022-11-18 13:57 ` [Intel-gfx] [PATCH v2 2/2] drm/i915/selftests: exercise emit_pte() with nearly full ring Matthew Auld @ 2022-11-18 14:33 ` Patchwork 2022-11-18 14:58 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork 2022-12-06 12:46 ` [Intel-gfx] [PATCH v2 1/2] " Andrzej Hajda 3 siblings, 0 replies; 5+ messages in thread From: Patchwork @ 2022-11-18 14:33 UTC (permalink / raw) To: Matthew Auld; +Cc: intel-gfx == Series Details == Series: series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space URL : https://patchwork.freedesktop.org/series/111076/ State : warning == Summary == Error: dim checkpatch failed 4cce983fec4a drm/i915/migrate: Account for the reserved_space -:33: WARNING:LEADING_SPACE: please, no spaces at the start of a line #33: FILE: drivers/gpu/drm/i915/gt/intel_migrate.c:347: + struct intel_ring *ring = rq->ring;$ -:35: WARNING:LEADING_SPACE: please, no spaces at the start of a line #35: FILE: drivers/gpu/drm/i915/gt/intel_migrate.c:349: + pkt = min_t(int, pkt, (ring->space - rq->reserved_space) / sizeof(u32) + 5);$ -:36: WARNING:LEADING_SPACE: please, no spaces at the start of a line #36: FILE: drivers/gpu/drm/i915/gt/intel_migrate.c:350: + pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5);$ -:38: WARNING:LEADING_SPACE: please, no spaces at the start of a line #38: FILE: drivers/gpu/drm/i915/gt/intel_migrate.c:352: + return pkt;$ total: 0 errors, 4 warnings, 0 checks, 34 lines checked 28ff1746d334 drm/i915/selftests: exercise emit_pte() with nearly full ring -:179: WARNING:MSLEEP: msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst #179: FILE: drivers/gpu/drm/i915/gt/selftest_migrate.c:644: + msleep(10); /* start all threads before we kthread_stop() */ total: 0 errors, 1 warnings, 0 checks, 194 lines checked ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Intel-gfx] ✗ Fi.CI.BAT: failure for series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space 2022-11-18 13:57 [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space Matthew Auld 2022-11-18 13:57 ` [Intel-gfx] [PATCH v2 2/2] drm/i915/selftests: exercise emit_pte() with nearly full ring Matthew Auld 2022-11-18 14:33 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space Patchwork @ 2022-11-18 14:58 ` Patchwork 2022-12-06 12:46 ` [Intel-gfx] [PATCH v2 1/2] " Andrzej Hajda 3 siblings, 0 replies; 5+ messages in thread From: Patchwork @ 2022-11-18 14:58 UTC (permalink / raw) To: Matthew Auld; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 8392 bytes --] == Series Details == Series: series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space URL : https://patchwork.freedesktop.org/series/111076/ State : failure == Summary == CI Bug Log - changes from CI_DRM_12398 -> Patchwork_111076v1 ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with Patchwork_111076v1 absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in Patchwork_111076v1, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/index.html Participating hosts (41 -> 27) ------------------------------ Additional (1): fi-rkl-11600 Missing (15): fi-ilk-m540 bat-dg1-7 fi-bdw-samus bat-dg1-6 bat-dg2-8 bat-adlm-1 bat-dg2-9 bat-adlp-6 bat-adlp-4 fi-ctg-p8600 bat-adln-1 bat-rplp-1 bat-rpls-2 bat-dg2-11 bat-jsl-1 Possible new issues ------------------- Here are the unknown changes that may have been introduced in Patchwork_111076v1: ### IGT changes ### #### Possible regressions #### * igt@i915_selftest@live@migrate: - fi-bsw-nick: [PASS][1] -> [TIMEOUT][2] [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12398/fi-bsw-nick/igt@i915_selftest@live@migrate.html [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-bsw-nick/igt@i915_selftest@live@migrate.html - fi-bsw-kefka: [PASS][3] -> [TIMEOUT][4] [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12398/fi-bsw-kefka/igt@i915_selftest@live@migrate.html [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-bsw-kefka/igt@i915_selftest@live@migrate.html Known issues ------------ Here are the changes found in Patchwork_111076v1 that come from known issues: ### IGT changes ### #### Issues hit #### * igt@debugfs_test@basic-hwmon: - fi-rkl-11600: NOTRUN -> [SKIP][5] ([i915#7456]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@debugfs_test@basic-hwmon.html * igt@gem_huc_copy@huc-copy: - fi-rkl-11600: NOTRUN -> [SKIP][6] ([i915#2190]) [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@gem_huc_copy@huc-copy.html * igt@gem_lmem_swapping@basic: - fi-apl-guc: NOTRUN -> [SKIP][7] ([fdo#109271] / [i915#4613]) +3 similar issues [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-apl-guc/igt@gem_lmem_swapping@basic.html * igt@gem_lmem_swapping@parallel-random-engines: - fi-rkl-11600: NOTRUN -> [SKIP][8] ([i915#4613]) +3 similar issues [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@gem_lmem_swapping@parallel-random-engines.html * igt@gem_tiled_pread_basic: - fi-rkl-11600: NOTRUN -> [SKIP][9] ([i915#3282]) [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@gem_tiled_pread_basic.html * igt@i915_pm_backlight@basic-brightness: - fi-rkl-11600: NOTRUN -> [SKIP][10] ([i915#7561]) [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@i915_pm_backlight@basic-brightness.html * igt@i915_suspend@basic-s3-without-i915: - fi-rkl-11600: NOTRUN -> [INCOMPLETE][11] ([i915#4817]) [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html * igt@kms_chamelium@common-hpd-after-suspend: - fi-apl-guc: NOTRUN -> [SKIP][12] ([fdo#109271] / [fdo#111827]) [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-apl-guc/igt@kms_chamelium@common-hpd-after-suspend.html * igt@kms_chamelium@hdmi-hpd-fast: - fi-rkl-11600: NOTRUN -> [SKIP][13] ([fdo#111827]) +7 similar issues [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@kms_chamelium@hdmi-hpd-fast.html * igt@kms_cursor_legacy@basic-busy-flip-before-cursor: - fi-rkl-11600: NOTRUN -> [SKIP][14] ([i915#4103]) [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@kms_cursor_legacy@basic-busy-flip-before-cursor.html * igt@kms_force_connector_basic@force-load-detect: - fi-rkl-11600: NOTRUN -> [SKIP][15] ([fdo#109285] / [i915#4098]) [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@kms_force_connector_basic@force-load-detect.html * igt@kms_psr@sprite_plane_onoff: - fi-rkl-11600: NOTRUN -> [SKIP][16] ([i915#1072]) +3 similar issues [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@kms_psr@sprite_plane_onoff.html * igt@kms_setmode@basic-clone-single-crtc: - fi-rkl-11600: NOTRUN -> [SKIP][17] ([i915#3555] / [i915#4098]) [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@kms_setmode@basic-clone-single-crtc.html * igt@prime_vgem@basic-read: - fi-rkl-11600: NOTRUN -> [SKIP][18] ([fdo#109295] / [i915#3291] / [i915#3708]) +2 similar issues [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@prime_vgem@basic-read.html * igt@prime_vgem@basic-userptr: - fi-rkl-11600: NOTRUN -> [SKIP][19] ([fdo#109295] / [i915#3301] / [i915#3708]) [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-rkl-11600/igt@prime_vgem@basic-userptr.html #### Possible fixes #### * igt@core_hotunplug@unbind-rebind: - fi-apl-guc: [INCOMPLETE][20] ([i915#7073]) -> [PASS][21] [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12398/fi-apl-guc/igt@core_hotunplug@unbind-rebind.html [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-apl-guc/igt@core_hotunplug@unbind-rebind.html * igt@kms_cursor_legacy@basic-busy-flip-before-cursor@atomic-transitions-varying-size: - fi-bsw-kefka: [FAIL][22] ([i915#6298]) -> [PASS][23] [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12398/fi-bsw-kefka/igt@kms_cursor_legacy@basic-busy-flip-before-cursor@atomic-transitions-varying-size.html [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/fi-bsw-kefka/igt@kms_cursor_legacy@basic-busy-flip-before-cursor@atomic-transitions-varying-size.html [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285 [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295 [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827 [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072 [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190 [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282 [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291 [i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301 [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708 [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098 [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103 [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613 [i915#4817]: https://gitlab.freedesktop.org/drm/intel/issues/4817 [i915#6298]: https://gitlab.freedesktop.org/drm/intel/issues/6298 [i915#7073]: https://gitlab.freedesktop.org/drm/intel/issues/7073 [i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456 [i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561 Build changes ------------- * Linux: CI_DRM_12398 -> Patchwork_111076v1 CI-20190529: 20190529 CI_DRM_12398: 6ff9396457d55a1915566b11121e8fe6f9068b1c @ git://anongit.freedesktop.org/gfx-ci/linux IGT_7068: 5c0ec905b6bbecfb8df8b8f3315d0470539e6ae3 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_111076v1: 6ff9396457d55a1915566b11121e8fe6f9068b1c @ git://anongit.freedesktop.org/gfx-ci/linux ### Linux commits 3fa5606931da drm/i915/selftests: exercise emit_pte() with nearly full ring 2577f09dabf1 drm/i915/migrate: Account for the reserved_space == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111076v1/index.html [-- Attachment #2: Type: text/html, Size: 9888 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space 2022-11-18 13:57 [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space Matthew Auld ` (2 preceding siblings ...) 2022-11-18 14:58 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork @ 2022-12-06 12:46 ` Andrzej Hajda 3 siblings, 0 replies; 5+ messages in thread From: Andrzej Hajda @ 2022-12-06 12:46 UTC (permalink / raw) To: Matthew Auld, intel-gfx; +Cc: Chris Wilson, stable, Nirmoy Das On 18.11.2022 14:57, Matthew Auld wrote: > From: Chris Wilson <chris.p.wilson@intel.com> > > If the ring is nearly full when calling into emit_pte(), we might > incorrectly trample the reserved_space when constructing the packet to > emit the PTEs. This then triggers the GEM_BUG_ON(rq->reserved_space > > ring->space) when later submitting the request, since the request itself > doesn't have enough space left in the ring to emit things like > workarounds, breadcrumbs etc. > > Testcase: igt@i915_selftests@live_emit_pte_full_ring > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/7535 > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6889 > Fixes: cf586021642d ("drm/i915/gt: Pipelined page migration") > Signed-off-by: Chris Wilson <chris.p.wilson@intel.com> > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > Cc: Andrzej Hajda <andrzej.hajda@intel.com> > Cc: Nirmoy Das <nirmoy.das@intel.com> > Cc: <stable@vger.kernel.org> # v5.15+ > --- > drivers/gpu/drm/i915/gt/intel_migrate.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c > index b405a04135ca..48c3b5168558 100644 > --- a/drivers/gpu/drm/i915/gt/intel_migrate.c > +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c > @@ -342,6 +342,16 @@ static int emit_no_arbitration(struct i915_request *rq) > return 0; > } > > +static int max_pte_pkt_size(struct i915_request *rq, int pkt) > +{ > + struct intel_ring *ring = rq->ring; > + > + pkt = min_t(int, pkt, (ring->space - rq->reserved_space) / sizeof(u32) + 5); > + pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5); > + > + return pkt; > +} > + I guess, the assumption that subtractions of u32 values do not overflows, is valid. Then I guess more natural would be use u32 for all vars involved, this way we can use min instead of min_t, minor nit. Anyway: Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> Regards Andrzej > static int emit_pte(struct i915_request *rq, > struct sgt_dma *it, > enum i915_cache_level cache_level, > @@ -388,8 +398,7 @@ static int emit_pte(struct i915_request *rq, > return PTR_ERR(cs); > > /* Pack as many PTE updates as possible into a single MI command */ > - pkt = min_t(int, dword_length, ring->space / sizeof(u32) + 5); > - pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5); > + pkt = max_pte_pkt_size(rq, dword_length); > > hdr = cs; > *cs++ = MI_STORE_DATA_IMM | REG_BIT(21); /* as qword elements */ > @@ -422,8 +431,7 @@ static int emit_pte(struct i915_request *rq, > } > } > > - pkt = min_t(int, dword_rem, ring->space / sizeof(u32) + 5); > - pkt = min_t(int, pkt, (ring->size - ring->emit) / sizeof(u32) + 5); > + pkt = max_pte_pkt_size(rq, dword_rem); > > hdr = cs; > *cs++ = MI_STORE_DATA_IMM | REG_BIT(21); ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-12-06 12:46 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-11-18 13:57 [Intel-gfx] [PATCH v2 1/2] drm/i915/migrate: Account for the reserved_space Matthew Auld 2022-11-18 13:57 ` [Intel-gfx] [PATCH v2 2/2] drm/i915/selftests: exercise emit_pte() with nearly full ring Matthew Auld 2022-11-18 14:33 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/2] drm/i915/migrate: Account for the reserved_space Patchwork 2022-11-18 14:58 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork 2022-12-06 12:46 ` [Intel-gfx] [PATCH v2 1/2] " Andrzej Hajda
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox