drm/i915: Add an implementation for i915_gem_ww_ctx locking, v2.

i915_gem_ww_ctx is used to lock all gem bo's for pinning and memory
eviction. We don't use it yet, but lets start adding the definition
first.

To use it, we have to pass a non-NULL ww to gem_object_lock, and don't
unlock directly. It is done in i915_gem_ww_ctx_fini.

Changes since v1:
- Change ww_ctx and obj order in locking functions (Jonas Lahtinen)

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200819140904.1708856-6-maarten.lankhorst@linux.intel.com
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
This commit is contained in:
Maarten Lankhorst 2020-08-19 16:08:45 +02:00 коммит произвёл Joonas Lahtinen
Родитель 8ae275c288
Коммит 80f0b679d6
22 изменённых файлов: 171 добавлений и 40 удалений

Просмотреть файл

@ -2311,7 +2311,7 @@ err:
void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags) void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
{ {
i915_gem_object_lock(vma->obj); i915_gem_object_lock(vma->obj, NULL);
if (flags & PLANE_HAS_FENCE) if (flags & PLANE_HAS_FENCE)
i915_vma_unpin_fence(vma); i915_vma_unpin_fence(vma);
i915_gem_object_unpin_from_display_plane(vma); i915_gem_object_unpin_from_display_plane(vma);
@ -17194,7 +17194,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
if (!intel_fb->frontbuffer) if (!intel_fb->frontbuffer)
return -ENOMEM; return -ENOMEM;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
tiling = i915_gem_object_get_tiling(obj); tiling = i915_gem_object_get_tiling(obj);
stride = i915_gem_object_get_stride(obj); stride = i915_gem_object_get_stride(obj);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);

Просмотреть файл

@ -288,7 +288,7 @@ int i915_gem_schedule_fill_pages_blt(struct drm_i915_gem_object *obj,
dma_fence_init(&work->dma, &clear_pages_work_ops, &fence_lock, 0, 0); dma_fence_init(&work->dma, &clear_pages_work_ops, &fence_lock, 0, 0);
i915_sw_fence_init(&work->wait, clear_pages_work_notify); i915_sw_fence_init(&work->wait, clear_pages_work_notify);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_sw_fence_await_reservation(&work->wait, err = i915_sw_fence_await_reservation(&work->wait,
obj->base.resv, NULL, true, 0, obj->base.resv, NULL, true, 0,
I915_FENCE_GFP); I915_FENCE_GFP);

Просмотреть файл

@ -128,7 +128,7 @@ static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_dire
if (err) if (err)
return err; return err;
err = i915_gem_object_lock_interruptible(obj); err = i915_gem_object_lock_interruptible(obj, NULL);
if (err) if (err)
goto out; goto out;
@ -149,7 +149,7 @@ static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direct
if (err) if (err)
return err; return err;
err = i915_gem_object_lock_interruptible(obj); err = i915_gem_object_lock_interruptible(obj, NULL);
if (err) if (err)
goto out; goto out;

Просмотреть файл

@ -32,7 +32,7 @@ void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj)
if (!i915_gem_object_is_framebuffer(obj)) if (!i915_gem_object_is_framebuffer(obj))
return; return;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
__i915_gem_object_flush_for_display(obj); __i915_gem_object_flush_for_display(obj);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
} }
@ -197,7 +197,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
if (ret) if (ret)
return ret; return ret;
ret = i915_gem_object_lock_interruptible(obj); ret = i915_gem_object_lock_interruptible(obj, NULL);
if (ret) if (ret)
return ret; return ret;
@ -536,7 +536,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
if (err) if (err)
goto out; goto out;
err = i915_gem_object_lock_interruptible(obj); err = i915_gem_object_lock_interruptible(obj, NULL);
if (err) if (err)
goto out_unpin; goto out_unpin;
@ -576,7 +576,7 @@ int i915_gem_object_prepare_read(struct drm_i915_gem_object *obj,
if (!i915_gem_object_has_struct_page(obj)) if (!i915_gem_object_has_struct_page(obj))
return -ENODEV; return -ENODEV;
ret = i915_gem_object_lock_interruptible(obj); ret = i915_gem_object_lock_interruptible(obj, NULL);
if (ret) if (ret)
return ret; return ret;
@ -630,7 +630,7 @@ int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj,
if (!i915_gem_object_has_struct_page(obj)) if (!i915_gem_object_has_struct_page(obj))
return -ENODEV; return -ENODEV;
ret = i915_gem_object_lock_interruptible(obj); ret = i915_gem_object_lock_interruptible(obj, NULL);
if (ret) if (ret)
return ret; return ret;

Просмотреть файл

@ -1076,7 +1076,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
if (use_cpu_reloc(cache, obj)) if (use_cpu_reloc(cache, obj))
return NULL; return NULL;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, true); err = i915_gem_object_set_to_gtt_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)

Просмотреть файл

@ -110,9 +110,39 @@ i915_gem_object_put(struct drm_i915_gem_object *obj)
#define assert_object_held(obj) dma_resv_assert_held((obj)->base.resv) #define assert_object_held(obj) dma_resv_assert_held((obj)->base.resv)
static inline void i915_gem_object_lock(struct drm_i915_gem_object *obj) static inline int __i915_gem_object_lock(struct drm_i915_gem_object *obj,
struct i915_gem_ww_ctx *ww,
bool intr)
{ {
dma_resv_lock(obj->base.resv, NULL); int ret;
if (intr)
ret = dma_resv_lock_interruptible(obj->base.resv, ww ? &ww->ctx : NULL);
else
ret = dma_resv_lock(obj->base.resv, ww ? &ww->ctx : NULL);
if (!ret && ww)
list_add_tail(&obj->obj_link, &ww->obj_list);
if (ret == -EALREADY)
ret = 0;
if (ret == -EDEADLK)
ww->contended = obj;
return ret;
}
static inline int i915_gem_object_lock(struct drm_i915_gem_object *obj,
struct i915_gem_ww_ctx *ww)
{
return __i915_gem_object_lock(obj, ww, ww && ww->intr);
}
static inline int i915_gem_object_lock_interruptible(struct drm_i915_gem_object *obj,
struct i915_gem_ww_ctx *ww)
{
WARN_ON(ww && !ww->intr);
return __i915_gem_object_lock(obj, ww, true);
} }
static inline bool i915_gem_object_trylock(struct drm_i915_gem_object *obj) static inline bool i915_gem_object_trylock(struct drm_i915_gem_object *obj)
@ -120,12 +150,6 @@ static inline bool i915_gem_object_trylock(struct drm_i915_gem_object *obj)
return dma_resv_trylock(obj->base.resv); return dma_resv_trylock(obj->base.resv);
} }
static inline int
i915_gem_object_lock_interruptible(struct drm_i915_gem_object *obj)
{
return dma_resv_lock_interruptible(obj->base.resv, NULL);
}
static inline void i915_gem_object_unlock(struct drm_i915_gem_object *obj) static inline void i915_gem_object_unlock(struct drm_i915_gem_object *obj)
{ {
dma_resv_unlock(obj->base.resv); dma_resv_unlock(obj->base.resv);

Просмотреть файл

@ -123,6 +123,15 @@ struct drm_i915_gem_object {
struct list_head lut_list; struct list_head lut_list;
spinlock_t lut_lock; /* guards lut_list */ spinlock_t lut_lock; /* guards lut_list */
/**
* @obj_link: Link into @i915_gem_ww_ctx.obj_list
*
* When we lock this object through i915_gem_object_lock() with a
* context, we add it to the list to ensure we can unlock everything
* when i915_gem_ww_ctx_backoff() or i915_gem_ww_ctx_fini() are called.
*/
struct list_head obj_link;
/** Stolen memory for this object, instead of being backed by shmem. */ /** Stolen memory for this object, instead of being backed by shmem. */
struct drm_mm_node *stolen; struct drm_mm_node *stolen;
union { union {

Просмотреть файл

@ -84,7 +84,7 @@ void i915_gem_suspend_late(struct drm_i915_private *i915)
spin_unlock_irqrestore(&i915->mm.obj_lock, flags); spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
drm_WARN_ON(&i915->drm, drm_WARN_ON(&i915->drm,
i915_gem_object_set_to_gtt_domain(obj, false)); i915_gem_object_set_to_gtt_domain(obj, false));
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);

Просмотреть файл

@ -249,7 +249,7 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
* whilst executing a fenced command for an untiled object. * whilst executing a fenced command for an untiled object.
*/ */
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
if (i915_gem_object_is_framebuffer(obj)) { if (i915_gem_object_is_framebuffer(obj)) {
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
return -EBUSY; return -EBUSY;

Просмотреть файл

@ -947,7 +947,7 @@ static int gpu_write(struct intel_context *ce,
{ {
int err; int err;
i915_gem_object_lock(vma->obj); i915_gem_object_lock(vma->obj, NULL);
err = i915_gem_object_set_to_gtt_domain(vma->obj, true); err = i915_gem_object_set_to_gtt_domain(vma->obj, true);
i915_gem_object_unlock(vma->obj); i915_gem_object_unlock(vma->obj);
if (err) if (err)

Просмотреть файл

@ -75,7 +75,7 @@ static int __igt_client_fill(struct intel_engine_cs *engine)
if (err) if (err)
goto err_unpin; goto err_unpin;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_cpu_domain(obj, false); err = i915_gem_object_set_to_cpu_domain(obj, false);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)

Просмотреть файл

@ -82,7 +82,7 @@ static int gtt_set(struct context *ctx, unsigned long offset, u32 v)
u32 __iomem *map; u32 __iomem *map;
int err = 0; int err = 0;
i915_gem_object_lock(ctx->obj); i915_gem_object_lock(ctx->obj, NULL);
err = i915_gem_object_set_to_gtt_domain(ctx->obj, true); err = i915_gem_object_set_to_gtt_domain(ctx->obj, true);
i915_gem_object_unlock(ctx->obj); i915_gem_object_unlock(ctx->obj);
if (err) if (err)
@ -115,7 +115,7 @@ static int gtt_get(struct context *ctx, unsigned long offset, u32 *v)
u32 __iomem *map; u32 __iomem *map;
int err = 0; int err = 0;
i915_gem_object_lock(ctx->obj); i915_gem_object_lock(ctx->obj, NULL);
err = i915_gem_object_set_to_gtt_domain(ctx->obj, false); err = i915_gem_object_set_to_gtt_domain(ctx->obj, false);
i915_gem_object_unlock(ctx->obj); i915_gem_object_unlock(ctx->obj);
if (err) if (err)
@ -147,7 +147,7 @@ static int wc_set(struct context *ctx, unsigned long offset, u32 v)
u32 *map; u32 *map;
int err; int err;
i915_gem_object_lock(ctx->obj); i915_gem_object_lock(ctx->obj, NULL);
err = i915_gem_object_set_to_wc_domain(ctx->obj, true); err = i915_gem_object_set_to_wc_domain(ctx->obj, true);
i915_gem_object_unlock(ctx->obj); i915_gem_object_unlock(ctx->obj);
if (err) if (err)
@ -170,7 +170,7 @@ static int wc_get(struct context *ctx, unsigned long offset, u32 *v)
u32 *map; u32 *map;
int err; int err;
i915_gem_object_lock(ctx->obj); i915_gem_object_lock(ctx->obj, NULL);
err = i915_gem_object_set_to_wc_domain(ctx->obj, false); err = i915_gem_object_set_to_wc_domain(ctx->obj, false);
i915_gem_object_unlock(ctx->obj); i915_gem_object_unlock(ctx->obj);
if (err) if (err)
@ -193,7 +193,7 @@ static int gpu_set(struct context *ctx, unsigned long offset, u32 v)
u32 *cs; u32 *cs;
int err; int err;
i915_gem_object_lock(ctx->obj); i915_gem_object_lock(ctx->obj, NULL);
err = i915_gem_object_set_to_gtt_domain(ctx->obj, true); err = i915_gem_object_set_to_gtt_domain(ctx->obj, true);
i915_gem_object_unlock(ctx->obj); i915_gem_object_unlock(ctx->obj);
if (err) if (err)

Просмотреть файл

@ -950,7 +950,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
if (IS_ERR(vma)) if (IS_ERR(vma))
return PTR_ERR(vma); return PTR_ERR(vma);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, false); err = i915_gem_object_set_to_gtt_domain(obj, false);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)
@ -1709,7 +1709,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
i915_request_add(rq); i915_request_add(rq);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_cpu_domain(obj, false); err = i915_gem_object_set_to_cpu_domain(obj, false);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)

Просмотреть файл

@ -103,7 +103,7 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj,
GEM_BUG_ON(i915_gem_object_get_tiling(obj) != tile->tiling); GEM_BUG_ON(i915_gem_object_get_tiling(obj) != tile->tiling);
GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride); GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, true); err = i915_gem_object_set_to_gtt_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) { if (err) {
@ -188,7 +188,7 @@ static int check_partial_mappings(struct drm_i915_gem_object *obj,
GEM_BUG_ON(i915_gem_object_get_tiling(obj) != tile->tiling); GEM_BUG_ON(i915_gem_object_get_tiling(obj) != tile->tiling);
GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride); GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride);
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, true); err = i915_gem_object_set_to_gtt_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) { if (err) {

Просмотреть файл

@ -44,7 +44,7 @@ static int mock_phys_object(void *arg)
} }
/* Make the object dirty so that put_pages must do copy back the data */ /* Make the object dirty so that put_pages must do copy back the data */
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, true); err = i915_gem_object_set_to_gtt_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) { if (err) {

Просмотреть файл

@ -214,7 +214,7 @@ static int check_whitelist(struct i915_gem_context *ctx,
return PTR_ERR(results); return PTR_ERR(results);
err = 0; err = 0;
i915_gem_object_lock(results); i915_gem_object_lock(results, NULL);
intel_wedge_on_timeout(&wedge, engine->gt, HZ / 5) /* safety net! */ intel_wedge_on_timeout(&wedge, engine->gt, HZ / 5) /* safety net! */
err = i915_gem_object_set_to_cpu_domain(results, false); err = i915_gem_object_set_to_cpu_domain(results, false);
i915_gem_object_unlock(results); i915_gem_object_unlock(results);

Просмотреть файл

@ -2982,7 +2982,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
goto put_obj; goto put_obj;
} }
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
ret = i915_gem_object_set_to_cpu_domain(obj, false); ret = i915_gem_object_set_to_cpu_domain(obj, false);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (ret) { if (ret) {

Просмотреть файл

@ -420,7 +420,7 @@ i915_gem_gtt_pread(struct drm_i915_gem_object *obj,
GEM_BUG_ON(!drm_mm_node_allocated(&node)); GEM_BUG_ON(!drm_mm_node_allocated(&node));
} }
ret = i915_gem_object_lock_interruptible(obj); ret = i915_gem_object_lock_interruptible(obj, NULL);
if (ret) if (ret)
goto out_unpin; goto out_unpin;
@ -619,7 +619,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
GEM_BUG_ON(!drm_mm_node_allocated(&node)); GEM_BUG_ON(!drm_mm_node_allocated(&node));
} }
ret = i915_gem_object_lock_interruptible(obj); ret = i915_gem_object_lock_interruptible(obj, NULL);
if (ret) if (ret)
goto out_unpin; goto out_unpin;
@ -1290,7 +1290,7 @@ int i915_gem_freeze_late(struct drm_i915_private *i915)
i915_gem_drain_freed_objects(i915); i915_gem_drain_freed_objects(i915);
list_for_each_entry(obj, &i915->mm.shrink_list, mm.link) { list_for_each_entry(obj, &i915->mm.shrink_list, mm.link) {
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
drm_WARN_ON(&i915->drm, drm_WARN_ON(&i915->drm,
i915_gem_object_set_to_cpu_domain(obj, true)); i915_gem_object_set_to_cpu_domain(obj, true));
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
@ -1326,6 +1326,52 @@ int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
return ret; return ret;
} }
void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ww, bool intr)
{
ww_acquire_init(&ww->ctx, &reservation_ww_class);
INIT_LIST_HEAD(&ww->obj_list);
ww->intr = intr;
ww->contended = NULL;
}
static void i915_gem_ww_ctx_unlock_all(struct i915_gem_ww_ctx *ww)
{
struct drm_i915_gem_object *obj;
while ((obj = list_first_entry_or_null(&ww->obj_list, struct drm_i915_gem_object, obj_link))) {
list_del(&obj->obj_link);
i915_gem_object_unlock(obj);
}
}
void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ww)
{
i915_gem_ww_ctx_unlock_all(ww);
WARN_ON(ww->contended);
ww_acquire_fini(&ww->ctx);
}
int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ww)
{
int ret = 0;
if (WARN_ON(!ww->contended))
return -EINVAL;
i915_gem_ww_ctx_unlock_all(ww);
if (ww->intr)
ret = dma_resv_lock_slow_interruptible(ww->contended->base.resv, &ww->ctx);
else
dma_resv_lock_slow(ww->contended->base.resv, &ww->ctx);
if (!ret)
list_add_tail(&ww->contended->obj_link, &ww->obj_list);
ww->contended = NULL;
return ret;
}
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/mock_gem_device.c" #include "selftests/mock_gem_device.c"
#include "selftests/i915_gem.c" #include "selftests/i915_gem.c"

Просмотреть файл

@ -116,4 +116,15 @@ static inline bool __tasklet_is_scheduled(struct tasklet_struct *t)
return test_bit(TASKLET_STATE_SCHED, &t->state); return test_bit(TASKLET_STATE_SCHED, &t->state);
} }
struct i915_gem_ww_ctx {
struct ww_acquire_ctx ctx;
struct list_head obj_list;
bool intr;
struct drm_i915_gem_object *contended;
};
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);
#endif /* __I915_GEM_H__ */ #endif /* __I915_GEM_H__ */

Просмотреть файл

@ -199,11 +199,52 @@ out:
return err; return err;
} }
static int igt_gem_ww_ctx(void *arg)
{
struct drm_i915_private *i915 = arg;
struct drm_i915_gem_object *obj, *obj2;
struct i915_gem_ww_ctx ww;
int err = 0;
obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
if (IS_ERR(obj))
return PTR_ERR(obj);
obj2 = i915_gem_object_create_internal(i915, PAGE_SIZE);
if (IS_ERR(obj)) {
err = PTR_ERR(obj);
goto put1;
}
i915_gem_ww_ctx_init(&ww, true);
retry:
/* Lock the objects, twice for good measure (-EALREADY handling) */
err = i915_gem_object_lock(obj, &ww);
if (!err)
err = i915_gem_object_lock_interruptible(obj, &ww);
if (!err)
err = i915_gem_object_lock_interruptible(obj2, &ww);
if (!err)
err = i915_gem_object_lock(obj2, &ww);
if (err == -EDEADLK) {
err = i915_gem_ww_ctx_backoff(&ww);
if (!err)
goto retry;
}
i915_gem_ww_ctx_fini(&ww);
i915_gem_object_put(obj2);
put1:
i915_gem_object_put(obj);
return err;
}
int i915_gem_live_selftests(struct drm_i915_private *i915) int i915_gem_live_selftests(struct drm_i915_private *i915)
{ {
static const struct i915_subtest tests[] = { static const struct i915_subtest tests[] = {
SUBTEST(igt_gem_suspend), SUBTEST(igt_gem_suspend),
SUBTEST(igt_gem_hibernate), SUBTEST(igt_gem_hibernate),
SUBTEST(igt_gem_ww_ctx),
}; };
if (intel_gt_is_wedged(&i915->gt)) if (intel_gt_is_wedged(&i915->gt))

Просмотреть файл

@ -892,7 +892,7 @@ static int igt_vma_remapped_gtt(void *arg)
unsigned int x, y; unsigned int x, y;
int err; int err;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_gtt_domain(obj, true); err = i915_gem_object_set_to_gtt_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)

Просмотреть файл

@ -509,7 +509,7 @@ static int igt_lmem_write_cpu(void *arg)
if (err) if (err)
goto out_unpin; goto out_unpin;
i915_gem_object_lock(obj); i915_gem_object_lock(obj, NULL);
err = i915_gem_object_set_to_wc_domain(obj, true); err = i915_gem_object_set_to_wc_domain(obj, true);
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (err) if (err)