From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [Intel-gfx] [PATCH v3 62/63] drm/i915: Idea to implement eviction locking
Date: Thu, 15 Oct 2020 13:26:26 +0200 [thread overview]
Message-ID: <20201015112627.1142745-63-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <20201015112627.1142745-1-maarten.lankhorst@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
drivers/gpu/drm/i915/gem/i915_gem_object.h | 39 +++++++++++++++++++-
drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 10 ++++-
drivers/gpu/drm/i915/i915_gem.c | 29 ++++++++++++++-
drivers/gpu/drm/i915/i915_gem.h | 5 ++-
4 files changed, 78 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index f6ccd05010df..3cafe8985034 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -126,12 +126,43 @@ static inline void assert_object_held_shared(struct drm_i915_gem_object *obj)
assert_object_held(obj);
}
+static inline int
+i915_gem_object_lock_to_evict(struct drm_i915_gem_object *obj,
+ struct i915_gem_ww_ctx *ww)
+{
+ int ret;
+
+ if (ww->intr)
+ ret = dma_resv_lock_interruptible(obj->base.resv, &ww->ctx);
+ else
+ ret = dma_resv_lock(obj->base.resv, &ww->ctx);
+
+ if (!ret) {
+ list_add_tail(&obj->obj_link, &ww->eviction_list);
+ i915_gem_object_get(obj);
+ }
+
+ if (ret == -EALREADY &&
+ obj == list_first_entry(&ww->eviction_list, struct drm_i915_gem_object, obj_link))
+ ret = 0;
+
+ ww->evicting = true;
+
+ if (ret == -EDEADLK)
+ ww->contended = i915_gem_object_get(obj);
+
+ return ret;
+}
+
static inline int __i915_gem_object_lock(struct drm_i915_gem_object *obj,
struct i915_gem_ww_ctx *ww,
bool intr)
{
int ret;
+ if (ww && GEM_WARN_ON(ww->evicting))
+ ww->evicting = false;
+
if (intr)
ret = dma_resv_lock_interruptible(obj->base.resv, ww ? &ww->ctx : NULL);
else
@@ -139,8 +170,14 @@ static inline int __i915_gem_object_lock(struct drm_i915_gem_object *obj,
if (!ret && ww)
list_add_tail(&obj->obj_link, &ww->obj_list);
- if (ret == -EALREADY)
+ if (ret == -EALREADY) {
ret = 0;
+ if (obj == list_first_entry(&ww->eviction_list, struct drm_i915_gem_object, obj_link)) {
+ i915_gem_object_put(obj);
+ list_del(&obj->obj_link);
+ list_add_tail(&obj->obj_link, &ww->obj_list);
+ }
+ }
if (ret == -EDEADLK)
ww->contended = obj;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
index e42192834c88..075cdd7718c4 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
@@ -99,6 +99,7 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
unsigned long *nr_scanned,
unsigned int shrink)
{
+ struct drm_i915_gem_object *obj;
const struct {
struct list_head *list;
unsigned int bit;
@@ -163,7 +164,6 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
*/
for (phase = phases; phase->list; phase++) {
struct list_head still_in_list;
- struct drm_i915_gem_object *obj;
unsigned long flags;
if ((shrink & phase->bit) == 0)
@@ -208,7 +208,11 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
if (!i915_gem_object_trylock(obj))
goto skip;
} else {
- err = i915_gem_object_lock(obj, ww);
+ err = i915_gem_object_lock_to_evict(obj, ww);
+ if (err == -EALREADY) {
+ err = 0;
+ goto skip;
+ }
if (err)
goto skip;
}
@@ -234,6 +238,8 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
if (err)
return err;
}
+ if (ww)
+ i915_gem_ww_ctx_unlock_evictions(ww);
if (shrink & I915_SHRINK_BOUND)
intel_runtime_pm_put(&i915->runtime_pm, wakeref);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 5a497576614c..4f6fcdae1457 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1370,10 +1370,25 @@ 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);
+ INIT_LIST_HEAD(&ww->eviction_list);
ww->intr = intr;
+ ww->evicting = false;
ww->contended = NULL;
}
+void i915_gem_ww_ctx_unlock_evictions(struct i915_gem_ww_ctx *ww)
+{
+ struct drm_i915_gem_object *obj;
+
+ while ((obj = list_first_entry_or_null(&ww->eviction_list, struct drm_i915_gem_object, obj_link))) {
+ list_del(&obj->obj_link);
+ i915_gem_object_unlock(obj);
+ i915_gem_object_put(obj);
+ }
+
+ ww->evicting = false;
+}
+
static void i915_gem_ww_ctx_unlock_all(struct i915_gem_ww_ctx *ww)
{
struct drm_i915_gem_object *obj;
@@ -1382,6 +1397,12 @@ static void i915_gem_ww_ctx_unlock_all(struct i915_gem_ww_ctx *ww)
list_del(&obj->obj_link);
i915_gem_object_unlock(obj);
}
+
+ while ((obj = list_first_entry_or_null(&ww->eviction_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)
@@ -1411,9 +1432,15 @@ int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ww)
dma_resv_lock_slow(ww->contended->base.resv, &ww->ctx);
if (!ret)
- list_add_tail(&ww->contended->obj_link, &ww->obj_list);
+ list_add_tail(&ww->contended->obj_link,
+ ww->evicting ? &ww->eviction_list :
+ &ww->obj_list);
+ else if (ret && ww->evicting) {
+ i915_gem_object_put(ww->contended);
+ }
ww->contended = NULL;
+ ww->evicting = false;
return ret;
}
diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
index a4cad3f154ca..52b19ebffab1 100644
--- a/drivers/gpu/drm/i915/i915_gem.h
+++ b/drivers/gpu/drm/i915/i915_gem.h
@@ -119,7 +119,8 @@ static inline bool __tasklet_is_scheduled(struct tasklet_struct *t)
struct i915_gem_ww_ctx {
struct ww_acquire_ctx ctx;
struct list_head obj_list;
- bool intr;
+ struct list_head eviction_list;
+ bool intr, evicting;
struct drm_i915_gem_object *contended;
};
@@ -128,4 +129,6 @@ 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);
+void i915_gem_ww_ctx_unlock_evictions(struct i915_gem_ww_ctx *ww);
+
#endif /* __I915_GEM_H__ */
--
2.28.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2020-10-15 11:27 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-15 11:25 [Intel-gfx] [PATCH v3 00/63] drm/i915: Remove obj->mm.lock! Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 01/63] drm/i915: Move cmd parser pinning to execbuffer Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 02/63] drm/i915: Add missing -EDEADLK handling to execbuf pinning Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 03/63] drm/i915: Do not share hwsp across contexts any more, v3 Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 04/63] drm/i915: Pin timeline map after first timeline pin, v3 Maarten Lankhorst
2020-10-27 11:03 ` Thomas Hellström (Intel)
2020-10-27 14:31 ` Maarten Lankhorst
2020-10-27 16:25 ` Thomas Hellström (Intel)
2020-10-27 18:10 ` Thomas Hellström (Intel)
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 05/63] drm/i915: Ensure we hold the object mutex in pin correctly Maarten Lankhorst
2020-10-27 11:07 ` Thomas Hellström (Intel)
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 06/63] drm/i915: Add gem object locking to madvise Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 07/63] drm/i915: Move HAS_STRUCT_PAGE to obj->flags Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 08/63] drm/i915: Rework struct phys attachment handling Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 09/63] drm/i915: Convert i915_gem_object_attach_phys() to ww locking Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 10/63] drm/i915: make lockdep slightly happier about execbuf Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 11/63] drm/i915: Disable userptr pread/pwrite support Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 12/63] drm/i915: No longer allow exporting userptr through dma-buf Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 13/63] drm/i915: Reject more ioctls for userptr Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 14/63] drm/i915: Reject UNSYNCHRONIZED " Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 15/63] drm/i915: Fix userptr so we do not have to worry about obj->mm.lock, v3 Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 16/63] drm/i915: Flatten obj->mm.lock Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 17/63] drm/i915: Populate logical context during first pin Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 18/63] drm/i915: Make ring submission compatible with obj->mm.lock removal, v2 Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 19/63] drm/i915: Handle ww locking in init_status_page Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 20/63] drm/i915: Rework clflush to work correctly without obj->mm.lock Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 21/63] drm/i915: Pass ww ctx to intel_pin_to_display_plane Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 22/63] drm/i915: Add object locking to vm_fault_cpu Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 23/63] drm/i915: Move pinning to inside engine_wa_list_verify() Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 24/63] drm/i915: Take reservation lock around i915_vma_pin Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 25/63] drm/i915: Make intel_init_workaround_bb more compatible with ww locking Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 26/63] drm/i915: Make __engine_unpark() " Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 27/63] drm/i915: Take obj lock around set_domain ioctl Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 28/63] drm/i915: Defer pin calls in buffer pool until first use by caller Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 29/63] drm/i915: Fix pread/pwrite to work with new locking rules Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 30/63] drm/i915: Fix workarounds selftest, part 1 Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 31/63] drm/i915: Prepare for obj->mm.lock removal Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 32/63] drm/i915: Add igt_spinner_pin() to allow for ww locking around spinner Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 33/63] drm/i915: Add ww locking around vm_access() Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 34/63] drm/i915: Increase ww locking for perf Maarten Lankhorst
2020-10-15 11:25 ` [Intel-gfx] [PATCH v3 35/63] drm/i915: Lock ww in ucode objects correctly Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 36/63] drm/i915: Add ww locking to dma-buf ops Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 37/63] drm/i915: Add missing ww lock in intel_dsb_prepare Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 38/63] drm/i915: Fix ww locking in shmem_create_from_object Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 39/63] drm/i915: Use a single page table lock for each gtt Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 40/63] drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock removal Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 41/63] drm/i915/selftests: Prepare client blit " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 42/63] drm/i915/selftests: Prepare coherency tests " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 43/63] drm/i915/selftests: Prepare context " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 44/63] drm/i915/selftests: Prepare dma-buf " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 45/63] drm/i915/selftests: Prepare execbuf " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 46/63] drm/i915/selftests: Prepare mman testcases " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 47/63] drm/i915/selftests: Prepare object tests " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 48/63] drm/i915/selftests: Prepare object blit " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 49/63] drm/i915/selftests: Prepare igt_gem_utils " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 50/63] drm/i915/selftests: Prepare context selftest " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 51/63] drm/i915/selftests: Prepare hangcheck " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 52/63] drm/i915/selftests: Prepare execlists " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 53/63] drm/i915/selftests: Prepare mocs tests " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 54/63] drm/i915/selftests: Prepare ring submission " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 55/63] drm/i915/selftests: Prepare timeline tests " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 56/63] drm/i915/selftests: Prepare i915_request " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 57/63] drm/i915/selftests: Prepare memory region " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 58/63] drm/i915/selftests: Prepare cs engine " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 59/63] drm/i915/selftests: Prepare gtt " Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 60/63] drm/i915: Finally remove obj->mm.lock Maarten Lankhorst
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 61/63] drm/i915: Keep userpointer bindings if seqcount is unchanged, v2 Maarten Lankhorst
2020-10-15 11:26 ` Maarten Lankhorst [this message]
2020-10-15 11:26 ` [Intel-gfx] [PATCH v3 63/63] drm/i915: Keep lazy reference to userptr pages Maarten Lankhorst
2020-10-15 13:23 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Remove obj->mm.lock! (rev3) Patchwork
2020-10-15 13:24 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-10-15 13:27 ` [Intel-gfx] ✗ Fi.CI.DOCS: " Patchwork
2020-10-15 13:37 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-10-15 17:10 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201015112627.1142745-63-maarten.lankhorst@linux.intel.com \
--to=maarten.lankhorst@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox