drm/i915/selftests: Always free spinner on __sseu_prepare error
Prepare a nice little onion unwind to ensure that we always free the spinner if we __sseu_prepare fails. Fixes:c06ee6ff2c
("drm/i915/selftests: Context SSEU reconfiguration tests") Reported-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Radhakrishna Sripada <radhakrishna.sripada@intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190215195010.16637-1-chris@chris-wilson.co.uk Reviewed-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com> (cherry picked from commit2a4a275403
) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
7b1366b48c
commit
339cc6ae0f
|
@ -710,47 +710,45 @@ __sseu_prepare(struct drm_i915_private *i915,
|
|||
unsigned int flags,
|
||||
struct i915_gem_context *ctx,
|
||||
struct intel_engine_cs *engine,
|
||||
struct igt_spinner **spin_out)
|
||||
struct igt_spinner **spin)
|
||||
{
|
||||
int ret = 0;
|
||||
struct i915_request *rq;
|
||||
int ret;
|
||||
|
||||
if (flags & (TEST_BUSY | TEST_RESET)) {
|
||||
struct igt_spinner *spin;
|
||||
struct i915_request *rq;
|
||||
*spin = NULL;
|
||||
if (!(flags & (TEST_BUSY | TEST_RESET)))
|
||||
return 0;
|
||||
|
||||
spin = kzalloc(sizeof(*spin), GFP_KERNEL);
|
||||
if (!spin) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
*spin = kzalloc(sizeof(**spin), GFP_KERNEL);
|
||||
if (!*spin)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = igt_spinner_init(spin, i915);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = igt_spinner_init(*spin, i915);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
|
||||
rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);
|
||||
if (IS_ERR(rq)) {
|
||||
ret = PTR_ERR(rq);
|
||||
igt_spinner_fini(spin);
|
||||
kfree(spin);
|
||||
goto out;
|
||||
}
|
||||
|
||||
i915_request_add(rq);
|
||||
|
||||
if (!igt_wait_for_spinner(spin, rq)) {
|
||||
pr_err("%s: Spinner failed to start!\n", name);
|
||||
igt_spinner_end(spin);
|
||||
igt_spinner_fini(spin);
|
||||
kfree(spin);
|
||||
ret = -ETIMEDOUT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
*spin_out = spin;
|
||||
rq = igt_spinner_create_request(*spin, ctx, engine, MI_NOOP);
|
||||
if (IS_ERR(rq)) {
|
||||
ret = PTR_ERR(rq);
|
||||
goto err_fini;
|
||||
}
|
||||
|
||||
out:
|
||||
i915_request_add(rq);
|
||||
|
||||
if (!igt_wait_for_spinner(*spin, rq)) {
|
||||
pr_err("%s: Spinner failed to start!\n", name);
|
||||
ret = -ETIMEDOUT;
|
||||
goto err_end;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_end:
|
||||
igt_spinner_end(*spin);
|
||||
err_fini:
|
||||
igt_spinner_fini(*spin);
|
||||
err_free:
|
||||
kfree(fetch_and_zero(spin));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -897,22 +895,23 @@ __sseu_test(struct drm_i915_private *i915,
|
|||
|
||||
ret = __sseu_prepare(i915, name, flags, ctx, engine, &spin);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto out_context;
|
||||
|
||||
ret = __i915_gem_context_reconfigure_sseu(ctx, engine, sseu);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto out_spin;
|
||||
|
||||
ret = __sseu_finish(i915, name, flags, ctx, kctx, engine, obj,
|
||||
hweight32(sseu.slice_mask), spin);
|
||||
|
||||
out:
|
||||
out_spin:
|
||||
if (spin) {
|
||||
igt_spinner_end(spin);
|
||||
igt_spinner_fini(spin);
|
||||
kfree(spin);
|
||||
}
|
||||
|
||||
out_context:
|
||||
kernel_context_close(kctx);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue