|  | /* 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 |