| /* SPDX-License-Identifier: MIT */ |
| /* |
| * Copyright © 2020 Intel Corporation |
| */ |
| #ifndef __I915_GEM_WW_H__ |
| #define __I915_GEM_WW_H__ |
| |
| #include <drm/drm_drv.h> |
| |
| struct i915_gem_ww_ctx { |
| struct ww_acquire_ctx ctx; |
| struct list_head obj_list; |
| struct drm_i915_gem_object *contended; |
| bool intr; |
| }; |
| |
| void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ctx, bool intr); |
| void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ctx); |
| int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ctx); |
| void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj); |
| |
| /* Internal function used by the inlines! Don't use. */ |
| static inline int __i915_gem_ww_fini(struct i915_gem_ww_ctx *ww, int err) |
| { |
| if (err == -EDEADLK) { |
| err = i915_gem_ww_ctx_backoff(ww); |
| if (!err) |
| err = -EDEADLK; |
| } |
| |
| if (err != -EDEADLK) |
| i915_gem_ww_ctx_fini(ww); |
| |
| return err; |
| } |
| |
| #define for_i915_gem_ww(_ww, _err, _intr) \ |
| for (i915_gem_ww_ctx_init(_ww, _intr), (_err) = -EDEADLK; \ |
| (_err) == -EDEADLK; \ |
| (_err) = __i915_gem_ww_fini(_ww, _err)) |
| #endif |