Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: MIT
0002 /*
0003  * Copyright © 2020 Intel Corporation
0004  */
0005 #include <linux/dma-resv.h>
0006 #include "i915_gem_ww.h"
0007 #include "gem/i915_gem_object.h"
0008 
0009 void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ww, bool intr)
0010 {
0011     ww_acquire_init(&ww->ctx, &reservation_ww_class);
0012     INIT_LIST_HEAD(&ww->obj_list);
0013     ww->intr = intr;
0014     ww->contended = NULL;
0015 }
0016 
0017 static void i915_gem_ww_ctx_unlock_all(struct i915_gem_ww_ctx *ww)
0018 {
0019     struct drm_i915_gem_object *obj;
0020 
0021     while ((obj = list_first_entry_or_null(&ww->obj_list, struct drm_i915_gem_object, obj_link))) {
0022         list_del(&obj->obj_link);
0023         i915_gem_object_unlock(obj);
0024         i915_gem_object_put(obj);
0025     }
0026 }
0027 
0028 void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj)
0029 {
0030     list_del(&obj->obj_link);
0031     i915_gem_object_unlock(obj);
0032     i915_gem_object_put(obj);
0033 }
0034 
0035 void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ww)
0036 {
0037     i915_gem_ww_ctx_unlock_all(ww);
0038     WARN_ON(ww->contended);
0039     ww_acquire_fini(&ww->ctx);
0040 }
0041 
0042 int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ww)
0043 {
0044     int ret = 0;
0045 
0046     if (WARN_ON(!ww->contended))
0047         return -EINVAL;
0048 
0049     i915_gem_ww_ctx_unlock_all(ww);
0050     if (ww->intr)
0051         ret = dma_resv_lock_slow_interruptible(ww->contended->base.resv, &ww->ctx);
0052     else
0053         dma_resv_lock_slow(ww->contended->base.resv, &ww->ctx);
0054 
0055     if (!ret)
0056         list_add_tail(&ww->contended->obj_link, &ww->obj_list);
0057     else
0058         i915_gem_object_put(ww->contended);
0059 
0060     ww->contended = NULL;
0061 
0062     return ret;
0063 }