Skip to content

Commit

Permalink
drm/i915/selftests: Restore to default heartbeat
Browse files Browse the repository at this point in the history
Since we temporarily disable the heartbeat and restore back to the
default value, we can use the stored defaults on the engine and avoid
using a local.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200519063123.20673-3-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed May 19, 2020
1 parent ad65868 commit 3a230a5
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 109 deletions.
25 changes: 10 additions & 15 deletions drivers/gpu/drm/i915/gt/selftest_hangcheck.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,22 +310,20 @@ static bool wait_until_running(struct hang *h, struct i915_request *rq)
1000));
}

static void engine_heartbeat_disable(struct intel_engine_cs *engine,
unsigned long *saved)
static void engine_heartbeat_disable(struct intel_engine_cs *engine)
{
*saved = engine->props.heartbeat_interval_ms;
engine->props.heartbeat_interval_ms = 0;

intel_engine_pm_get(engine);
intel_engine_park_heartbeat(engine);
}

static void engine_heartbeat_enable(struct intel_engine_cs *engine,
unsigned long saved)
static void engine_heartbeat_enable(struct intel_engine_cs *engine)
{
intel_engine_pm_put(engine);

engine->props.heartbeat_interval_ms = saved;
engine->props.heartbeat_interval_ms =
engine->defaults.heartbeat_interval_ms;
}

static int igt_hang_sanitycheck(void *arg)
Expand Down Expand Up @@ -473,7 +471,6 @@ static int igt_reset_nop_engine(void *arg)
for_each_engine(engine, gt, id) {
unsigned int reset_count, reset_engine_count, count;
struct intel_context *ce;
unsigned long heartbeat;
IGT_TIMEOUT(end_time);
int err;

Expand All @@ -485,7 +482,7 @@ static int igt_reset_nop_engine(void *arg)
reset_engine_count = i915_reset_engine_count(global, engine);
count = 0;

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);
set_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
do {
int i;
Expand Down Expand Up @@ -529,7 +526,7 @@ static int igt_reset_nop_engine(void *arg)
}
} while (time_before(jiffies, end_time));
clear_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);

pr_info("%s(%s): %d resets\n", __func__, engine->name, count);

Expand Down Expand Up @@ -564,7 +561,6 @@ static int __igt_reset_engine(struct intel_gt *gt, bool active)

for_each_engine(engine, gt, id) {
unsigned int reset_count, reset_engine_count;
unsigned long heartbeat;
IGT_TIMEOUT(end_time);

if (active && !intel_engine_can_store_dword(engine))
Expand All @@ -580,7 +576,7 @@ static int __igt_reset_engine(struct intel_gt *gt, bool active)
reset_count = i915_reset_count(global);
reset_engine_count = i915_reset_engine_count(global, engine);

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);
set_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
do {
if (active) {
Expand Down Expand Up @@ -632,7 +628,7 @@ static int __igt_reset_engine(struct intel_gt *gt, bool active)
}
} while (time_before(jiffies, end_time));
clear_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);

if (err)
break;
Expand Down Expand Up @@ -789,7 +785,6 @@ static int __igt_reset_engines(struct intel_gt *gt,
struct active_engine threads[I915_NUM_ENGINES] = {};
unsigned long device = i915_reset_count(global);
unsigned long count = 0, reported;
unsigned long heartbeat;
IGT_TIMEOUT(end_time);

if (flags & TEST_ACTIVE &&
Expand Down Expand Up @@ -832,7 +827,7 @@ static int __igt_reset_engines(struct intel_gt *gt,

yield(); /* start all threads before we begin */

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);
set_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
do {
struct i915_request *rq = NULL;
Expand Down Expand Up @@ -906,7 +901,7 @@ static int __igt_reset_engines(struct intel_gt *gt,
}
} while (time_before(jiffies, end_time));
clear_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);

pr_info("i915_reset_engine(%s:%s): %lu resets\n",
engine->name, test_name, count);
Expand Down
67 changes: 23 additions & 44 deletions drivers/gpu/drm/i915/gt/selftest_lrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,22 +51,20 @@ static struct i915_vma *create_scratch(struct intel_gt *gt)
return vma;
}

static void engine_heartbeat_disable(struct intel_engine_cs *engine,
unsigned long *saved)
static void engine_heartbeat_disable(struct intel_engine_cs *engine)
{
*saved = engine->props.heartbeat_interval_ms;
engine->props.heartbeat_interval_ms = 0;

intel_engine_pm_get(engine);
intel_engine_park_heartbeat(engine);
}

static void engine_heartbeat_enable(struct intel_engine_cs *engine,
unsigned long saved)
static void engine_heartbeat_enable(struct intel_engine_cs *engine)
{
intel_engine_pm_put(engine);

engine->props.heartbeat_interval_ms = saved;
engine->props.heartbeat_interval_ms =
engine->defaults.heartbeat_interval_ms;
}

static bool is_active(struct i915_request *rq)
Expand Down Expand Up @@ -224,7 +222,6 @@ static int live_unlite_restore(struct intel_gt *gt, int prio)
struct intel_context *ce[2] = {};
struct i915_request *rq[2];
struct igt_live_test t;
unsigned long saved;
int n;

if (prio && !intel_engine_has_preemption(engine))
Expand All @@ -237,7 +234,7 @@ static int live_unlite_restore(struct intel_gt *gt, int prio)
err = -EIO;
break;
}
engine_heartbeat_disable(engine, &saved);
engine_heartbeat_disable(engine);

for (n = 0; n < ARRAY_SIZE(ce); n++) {
struct intel_context *tmp;
Expand Down Expand Up @@ -345,7 +342,7 @@ static int live_unlite_restore(struct intel_gt *gt, int prio)
intel_context_put(ce[n]);
}

engine_heartbeat_enable(engine, saved);
engine_heartbeat_enable(engine);
if (igt_live_test_end(&t))
err = -EIO;
if (err)
Expand Down Expand Up @@ -466,7 +463,6 @@ static int live_hold_reset(void *arg)

for_each_engine(engine, gt, id) {
struct intel_context *ce;
unsigned long heartbeat;
struct i915_request *rq;

ce = intel_context_create(engine);
Expand All @@ -475,7 +471,7 @@ static int live_hold_reset(void *arg)
break;
}

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);

rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK);
if (IS_ERR(rq)) {
Expand Down Expand Up @@ -535,7 +531,7 @@ static int live_hold_reset(void *arg)
i915_request_put(rq);

out:
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);
intel_context_put(ce);
if (err)
break;
Expand Down Expand Up @@ -580,10 +576,9 @@ static int live_error_interrupt(void *arg)

for_each_engine(engine, gt, id) {
const struct error_phase *p;
unsigned long heartbeat;
int err = 0;

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);

for (p = phases; p->error[0] != GOOD; p++) {
struct i915_request *client[ARRAY_SIZE(phases->error)];
Expand Down Expand Up @@ -682,7 +677,7 @@ static int live_error_interrupt(void *arg)
}
}

engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);
if (err) {
intel_gt_set_wedged(gt);
return err;
Expand Down Expand Up @@ -895,16 +890,14 @@ static int live_timeslice_preempt(void *arg)
enum intel_engine_id id;

for_each_engine(engine, gt, id) {
unsigned long saved;

if (!intel_engine_has_preemption(engine))
continue;

memset(vaddr, 0, PAGE_SIZE);

engine_heartbeat_disable(engine, &saved);
engine_heartbeat_disable(engine);
err = slice_semaphore_queue(engine, vma, count);
engine_heartbeat_enable(engine, saved);
engine_heartbeat_enable(engine);
if (err)
goto err_pin;

Expand Down Expand Up @@ -1009,7 +1002,6 @@ static int live_timeslice_rewind(void *arg)
enum { X = 1, Z, Y };
struct i915_request *rq[3] = {};
struct intel_context *ce;
unsigned long heartbeat;
unsigned long timeslice;
int i, err = 0;
u32 *slot;
Expand All @@ -1028,7 +1020,7 @@ static int live_timeslice_rewind(void *arg)
* Expect execution/evaluation order XZY
*/

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);
timeslice = xchg(&engine->props.timeslice_duration_ms, 1);

slot = memset32(engine->status_page.addr + 1000, 0, 4);
Expand Down Expand Up @@ -1122,7 +1114,7 @@ static int live_timeslice_rewind(void *arg)
wmb();

engine->props.timeslice_duration_ms = timeslice;
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);
for (i = 0; i < 3; i++)
i915_request_put(rq[i]);
if (igt_flush_test(gt->i915))
Expand Down Expand Up @@ -1202,12 +1194,11 @@ static int live_timeslice_queue(void *arg)
.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX),
};
struct i915_request *rq, *nop;
unsigned long saved;

if (!intel_engine_has_preemption(engine))
continue;

engine_heartbeat_disable(engine, &saved);
engine_heartbeat_disable(engine);
memset(vaddr, 0, PAGE_SIZE);

/* ELSP[0]: semaphore wait */
Expand Down Expand Up @@ -1284,7 +1275,7 @@ static int live_timeslice_queue(void *arg)
err_rq:
i915_request_put(rq);
err_heartbeat:
engine_heartbeat_enable(engine, saved);
engine_heartbeat_enable(engine);
if (err)
break;
}
Expand Down Expand Up @@ -4145,7 +4136,6 @@ static int reset_virtual_engine(struct intel_gt *gt,
{
struct intel_engine_cs *engine;
struct intel_context *ve;
unsigned long *heartbeat;
struct igt_spinner spin;
struct i915_request *rq;
unsigned int n;
Expand All @@ -4157,23 +4147,17 @@ static int reset_virtual_engine(struct intel_gt *gt,
* descendents are not executed while the capture is in progress.
*/

heartbeat = kmalloc_array(nsibling, sizeof(*heartbeat), GFP_KERNEL);
if (!heartbeat)
if (igt_spinner_init(&spin, gt))
return -ENOMEM;

if (igt_spinner_init(&spin, gt)) {
err = -ENOMEM;
goto out_free;
}

ve = intel_execlists_create_virtual(siblings, nsibling);
if (IS_ERR(ve)) {
err = PTR_ERR(ve);
goto out_spin;
}

for (n = 0; n < nsibling; n++)
engine_heartbeat_disable(siblings[n], &heartbeat[n]);
engine_heartbeat_disable(siblings[n]);

rq = igt_spinner_create_request(&spin, ve, MI_ARB_CHECK);
if (IS_ERR(rq)) {
Expand Down Expand Up @@ -4244,13 +4228,11 @@ static int reset_virtual_engine(struct intel_gt *gt,
i915_request_put(rq);
out_heartbeat:
for (n = 0; n < nsibling; n++)
engine_heartbeat_enable(siblings[n], heartbeat[n]);
engine_heartbeat_enable(siblings[n]);

intel_context_put(ve);
out_spin:
igt_spinner_fini(&spin);
out_free:
kfree(heartbeat);
return err;
}

Expand Down Expand Up @@ -4918,9 +4900,7 @@ static int live_lrc_gpr(void *arg)
return PTR_ERR(scratch);

for_each_engine(engine, gt, id) {
unsigned long heartbeat;

engine_heartbeat_disable(engine, &heartbeat);
engine_heartbeat_disable(engine);

err = __live_lrc_gpr(engine, scratch, false);
if (err)
Expand All @@ -4931,7 +4911,7 @@ static int live_lrc_gpr(void *arg)
goto err;

err:
engine_heartbeat_enable(engine, heartbeat);
engine_heartbeat_enable(engine);
if (igt_flush_test(gt->i915))
err = -EIO;
if (err)
Expand Down Expand Up @@ -5078,10 +5058,9 @@ static int live_lrc_timestamp(void *arg)
*/

for_each_engine(data.engine, gt, id) {
unsigned long heartbeat;
int i, err = 0;

engine_heartbeat_disable(data.engine, &heartbeat);
engine_heartbeat_disable(data.engine);

for (i = 0; i < ARRAY_SIZE(data.ce); i++) {
struct intel_context *tmp;
Expand Down Expand Up @@ -5114,7 +5093,7 @@ static int live_lrc_timestamp(void *arg)
}

err:
engine_heartbeat_enable(data.engine, heartbeat);
engine_heartbeat_enable(data.engine);
for (i = 0; i < ARRAY_SIZE(data.ce); i++) {
if (!data.ce[i])
break;
Expand Down
Loading

0 comments on commit 3a230a5

Please sign in to comment.