| 1 | /* SPDX-License-Identifier: MIT */ | 
|---|---|
| 2 | /* | 
| 3 | * Copyright © 2020 Intel Corporation | 
| 4 | */ | 
| 5 | #ifndef __I915_GEM_WW_H__ | 
| 6 | #define __I915_GEM_WW_H__ | 
| 7 | |
| 8 | #include <drm/drm_drv.h> | 
| 9 | |
| 10 | struct i915_gem_ww_ctx { | 
| 11 | struct ww_acquire_ctx ctx; | 
| 12 | struct list_head obj_list; | 
| 13 | struct drm_i915_gem_object *contended; | 
| 14 | bool intr; | 
| 15 | }; | 
| 16 | |
| 17 | void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ctx, bool intr); | 
| 18 | void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ctx); | 
| 19 | int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ctx); | 
| 20 | void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj); | 
| 21 | |
| 22 | /* Internal function used by the inlines! Don't use. */ | 
| 23 | static inline int __i915_gem_ww_fini(struct i915_gem_ww_ctx *ww, int err) | 
| 24 | { | 
| 25 | if (err == -EDEADLK) { | 
| 26 | err = i915_gem_ww_ctx_backoff(ctx: ww); | 
| 27 | if (!err) | 
| 28 | err = -EDEADLK; | 
| 29 | } | 
| 30 | |
| 31 | if (err != -EDEADLK) | 
| 32 | i915_gem_ww_ctx_fini(ctx: ww); | 
| 33 | |
| 34 | return err; | 
| 35 | } | 
| 36 | |
| 37 | #define for_i915_gem_ww(_ww, _err, _intr) \ | 
| 38 | for (i915_gem_ww_ctx_init(_ww, _intr), (_err) = -EDEADLK; \ | 
| 39 | (_err) == -EDEADLK; \ | 
| 40 | (_err) = __i915_gem_ww_fini(_ww, _err)) | 
| 41 | #endif | 
| 42 | 
