drm/i915: Break out dma_resv ww locking utilities to separate files
As we're about to add more ww-related functionality, break out the dma_resv ww locking utilities to their own files Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210617063018.92802-3-thomas.hellstrom@linux.intel.com
This commit is contained in:
parent
1c4dbe056d
commit
5c43ec5d53
|
@ -166,6 +166,7 @@ i915-y += \
|
||||||
i915_cmd_parser.o \
|
i915_cmd_parser.o \
|
||||||
i915_gem_evict.o \
|
i915_gem_evict.o \
|
||||||
i915_gem_gtt.o \
|
i915_gem_gtt.o \
|
||||||
|
i915_gem_ww.o \
|
||||||
i915_gem.o \
|
i915_gem.o \
|
||||||
i915_globals.o \
|
i915_globals.o \
|
||||||
i915_query.o \
|
i915_query.o \
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "display/intel_frontbuffer.h"
|
#include "display/intel_frontbuffer.h"
|
||||||
#include "i915_gem_object_types.h"
|
#include "i915_gem_object_types.h"
|
||||||
#include "i915_gem_gtt.h"
|
#include "i915_gem_gtt.h"
|
||||||
|
#include "i915_gem_ww.h"
|
||||||
#include "i915_vma_types.h"
|
#include "i915_vma_types.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include "i915_gem.h"
|
#include "i915_gem.h"
|
||||||
|
#include "i915_gem_ww.h"
|
||||||
|
|
||||||
struct i915_request;
|
struct i915_request;
|
||||||
struct intel_context;
|
struct intel_context;
|
||||||
|
|
|
@ -1201,62 +1201,6 @@ 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);
|
|
||||||
i915_gem_object_put(obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj)
|
|
||||||
{
|
|
||||||
list_del(&obj->obj_link);
|
|
||||||
i915_gem_object_unlock(obj);
|
|
||||||
i915_gem_object_put(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);
|
|
||||||
else
|
|
||||||
i915_gem_object_put(ww->contended);
|
|
||||||
|
|
||||||
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"
|
||||||
|
|
|
@ -123,16 +123,4 @@ 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);
|
|
||||||
void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj);
|
|
||||||
|
|
||||||
#endif /* __I915_GEM_H__ */
|
#endif /* __I915_GEM_H__ */
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/*
|
||||||
|
* Copyright © 2020 Intel Corporation
|
||||||
|
*/
|
||||||
|
#include <linux/dma-resv.h>
|
||||||
|
#include "i915_gem_ww.h"
|
||||||
|
#include "gem/i915_gem_object.h"
|
||||||
|
|
||||||
|
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);
|
||||||
|
i915_gem_object_put(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj)
|
||||||
|
{
|
||||||
|
list_del(&obj->obj_link);
|
||||||
|
i915_gem_object_unlock(obj);
|
||||||
|
i915_gem_object_put(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);
|
||||||
|
else
|
||||||
|
i915_gem_object_put(ww->contended);
|
||||||
|
|
||||||
|
ww->contended = NULL;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* 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);
|
||||||
|
#endif
|
Loading…
Reference in New Issue