mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
![Matthew Auld](/assets/img/avatar_default.png)
The catch-all evict can fail due to object lock contention, since it only goes as far as trylocking the object, due to us already holding the vm->mutex. Doing a full object lock here can deadlock, since the vm->mutex is always our inner lock. Add another execbuf pass which drops the vm->mutex and then tries to grab the object will the full lock, before then retrying the eviction. This should be good enough for now to fix the immediate regression with userspace seeing -ENOSPC from execbuf due to contended object locks during GTT eviction. v2 (Mani) - Also revamp the docs for the different passes. Testcase: igt@gem_ppgtt@shrink-vs-evict-* Fixes:7e00897be8
("drm/i915: Add object locking to i915_gem_evict_for_node and i915_gem_evict_something, v2.") References: https://gitlab.freedesktop.org/drm/intel/-/issues/7627 References: https://gitlab.freedesktop.org/drm/intel/-/issues/7570 References: https://bugzilla.mozilla.org/show_bug.cgi?id=1779558 Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> Cc: Andrzej Hajda <andrzej.hajda@intel.com> Cc: Mani Milani <mani@chromium.org> Cc: <stable@vger.kernel.org> # v5.18+ Reviewed-by: Mani Milani <mani@chromium.org> Tested-by: Mani Milani <mani@chromium.org> Link: https://patchwork.freedesktop.org/patch/msgid/20221216113456.414183-1-matthew.auld@intel.com (cherry picked from commit801fa7a81f
) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
30 lines
826 B
C
30 lines
826 B
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2021 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __I915_GEM_EVICT_H__
|
|
#define __I915_GEM_EVICT_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct drm_mm_node;
|
|
struct i915_address_space;
|
|
struct i915_gem_ww_ctx;
|
|
struct drm_i915_gem_object;
|
|
|
|
int __must_check i915_gem_evict_something(struct i915_address_space *vm,
|
|
struct i915_gem_ww_ctx *ww,
|
|
u64 min_size, u64 alignment,
|
|
unsigned long color,
|
|
u64 start, u64 end,
|
|
unsigned flags);
|
|
int __must_check i915_gem_evict_for_node(struct i915_address_space *vm,
|
|
struct i915_gem_ww_ctx *ww,
|
|
struct drm_mm_node *node,
|
|
unsigned int flags);
|
|
int i915_gem_evict_vm(struct i915_address_space *vm,
|
|
struct i915_gem_ww_ctx *ww,
|
|
struct drm_i915_gem_object **busy_bo);
|
|
|
|
#endif /* __I915_GEM_EVICT_H__ */
|