int __i915_subtests(const char *caller, const struct i915_subtest *st, unsigned int count, void *data) { int err; for (; count--; st++) { cond_resched(); if (signal_pending(current)) return -EINTR; pr_debug(DRIVER_NAME ": Running %s/%s\n", caller, st->name); GEM_TRACE("Running %s/%s\n", caller, st->name); err = st->func(data); if (err && err != -EINTR) { pr_err(DRIVER_NAME "/%s: %s failed with error %d\n", caller, st->name, err); return err; } } return 0; }
static int igt_atomic_reset(void *arg) { struct drm_i915_private *i915 = arg; const typeof(*igt_atomic_phases) *p; int err = 0; /* Check that the resets are usable from atomic context */ igt_global_reset_lock(i915); mutex_lock(&i915->drm.struct_mutex); /* Flush any requests before we get started and check basics */ if (!igt_force_reset(i915)) goto unlock; for (p = igt_atomic_phases; p->name; p++) { GEM_TRACE("intel_gpu_reset under %s\n", p->name); p->critical_section_begin(); reset_prepare(i915); err = intel_gpu_reset(i915, ALL_ENGINES); reset_finish(i915); p->critical_section_end(); if (err) { pr_err("intel_gpu_reset failed under %s\n", p->name); break; } } /* As we poke around the guts, do a full reset before continuing. */ igt_force_reset(i915); unlock: mutex_unlock(&i915->drm.struct_mutex); igt_global_reset_unlock(i915); return err; }