Quoting [email protected] (2017-08-28 20:25:30)
> From: Jeff McGee <[email protected]>
> 
> If someone else is resetting the engine we should clear our own bit as
> part of skipping that engine. Otherwise we will later believe that it
> has not been reset successfully and then trigger full gpu reset. If the
> other guy's reset actually fails, he will trigger the full gpu reset.

The reason we did continue on to the global reset was to serialise
i915_handle_error() with the other thread. Not a huge issue, but a
reasonable property to keep -- and we definitely want a to explain why
only one reset at a time is important.

bool intel_engine_lock_reset() {
        if (!test_and_set_bit(I915_RESET_ENGINE + engine->id,
                              &engine->i915->gpu_error.flags))
                return true;

        intel_engine_wait_for_reset(engine);
        return false; /* somebody else beat us to the reset */
}

void intel_engine_wait_for_reset() {
        while (test_and_set_bit(I915_RESET_ENGINE + engine->id,
                                &engine->i915->gpu_error.flags))
                wait_on_bit(&engine->i915->gpu_error.flags, I915_RESET_ENGINE + 
engine->id,
                            TASK_UNINTERRUPTIBLE);
}

It can also be used by selftests/intel_hangcheck.c, so let's refactor
before we have 3 copies.
-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to