diff options
author | jc_gargma <jc_gargma@iserlohn-fortress.net> | 2023-01-12 06:31:58 -0800 |
---|---|---|
committer | jc_gargma <jc_gargma@iserlohn-fortress.net> | 2023-01-12 06:31:58 -0800 |
commit | 8ce98ab6b9ae935498c0679fdd62c241faa09b31 (patch) | |
tree | 97bcf1af1c3fb3f3fd25425c4924250467f418f5 | |
parent | Updated to 6.0.16 (diff) | |
download | linux-8ce98ab6b9ae935498c0679fdd62c241faa09b31.tar.xz |
Updated to 6.0.18
-rw-r--r-- | 0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch | 239 | ||||
-rw-r--r-- | PKGBUILD | 10 |
2 files changed, 3 insertions, 246 deletions
diff --git a/0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch b/0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch deleted file mode 100644 index fa7781c..0000000 --- a/0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch +++ /dev/null @@ -1,239 +0,0 @@ -From 47e6d679cc4bab574bf32da863afafca4aad11b0 Mon Sep 17 00:00:00 2001 -From: Matthew Auld <matthew.auld@intel.com> -Date: Thu, 1 Dec 2022 15:25:22 +0000 -Subject: [PATCH 5/6] drm/i915: improve the catch-all evict to handle lock - contention - -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 can deadlock the system, 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. - -Testcase: igt@igem_ppgtt@shrink-vs-evict-* -References: https://gitlab.freedesktop.org/drm/intel/-/issues/7570 -Signed-off-by: Matthew Auld <matthew.auld@intel.com> - -Revision 4 of https://patchwork.freedesktop.org/series/111271/ ---- - .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 25 +++++++++++-- - drivers/gpu/drm/i915/gem/i915_gem_mman.c | 2 +- - drivers/gpu/drm/i915/i915_gem_evict.c | 37 ++++++++++++++----- - drivers/gpu/drm/i915/i915_gem_evict.h | 4 +- - drivers/gpu/drm/i915/i915_vma.c | 2 +- - .../gpu/drm/i915/selftests/i915_gem_evict.c | 4 +- - 6 files changed, 56 insertions(+), 18 deletions(-) - -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -index cd75b0ca2555..885fe8855718 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -@@ -741,25 +741,44 @@ static int eb_reserve(struct i915_execbuffer *eb) - * - * Defragmenting is skipped if all objects are pinned at a fixed location. - */ -- for (pass = 0; pass <= 2; pass++) { -+ for (pass = 0; pass <= 3; pass++) { - int pin_flags = PIN_USER | PIN_VALIDATE; - - if (pass == 0) - pin_flags |= PIN_NONBLOCK; - - if (pass >= 1) -- unpinned = eb_unbind(eb, pass == 2); -+ unpinned = eb_unbind(eb, pass >= 2); - - if (pass == 2) { - err = mutex_lock_interruptible(&eb->context->vm->mutex); - if (!err) { -- err = i915_gem_evict_vm(eb->context->vm, &eb->ww); -+ err = i915_gem_evict_vm(eb->context->vm, &eb->ww, NULL); - mutex_unlock(&eb->context->vm->mutex); - } - if (err) - return err; - } - -+ if (pass == 3) { -+retry: -+ err = mutex_lock_interruptible(&eb->context->vm->mutex); -+ if (!err) { -+ struct drm_i915_gem_object *busy_bo = NULL; -+ -+ err = i915_gem_evict_vm(eb->context->vm, &eb->ww, &busy_bo); -+ mutex_unlock(&eb->context->vm->mutex); -+ if (err && busy_bo) { -+ err = i915_gem_object_lock(busy_bo, &eb->ww); -+ i915_gem_object_put(busy_bo); -+ if (!err) -+ goto retry; -+ } -+ } -+ if (err) -+ return err; -+ } -+ - list_for_each_entry(ev, &eb->unbound, bind_link) { - err = eb_reserve_vma(eb, ev, pin_flags); - if (err) -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c -index 0c5c43852e24..6f579cb8f2ff 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c -@@ -369,7 +369,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf) - if (vma == ERR_PTR(-ENOSPC)) { - ret = mutex_lock_interruptible(&ggtt->vm.mutex); - if (!ret) { -- ret = i915_gem_evict_vm(&ggtt->vm, &ww); -+ ret = i915_gem_evict_vm(&ggtt->vm, &ww, NULL); - mutex_unlock(&ggtt->vm.mutex); - } - if (ret) -diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c -index f025ee4fa526..a4b4d9b7d26c 100644 ---- a/drivers/gpu/drm/i915/i915_gem_evict.c -+++ b/drivers/gpu/drm/i915/i915_gem_evict.c -@@ -416,6 +416,11 @@ int i915_gem_evict_for_node(struct i915_address_space *vm, - * @vm: Address space to cleanse - * @ww: An optional struct i915_gem_ww_ctx. If not NULL, i915_gem_evict_vm - * will be able to evict vma's locked by the ww as well. -+ * @busy_bo: Optional pointer to struct drm_i915_gem_object. If not NULL, then -+ * in the event i915_gem_evict_vm() is unable to trylock an object for eviction, -+ * then @busy_bo will point to it. -EBUSY is also returned. The caller must drop -+ * the vm->mutex, before trying again to acquire the contended lock. The caller -+ * also owns a reference to the object. - * - * This function evicts all vmas from a vm. - * -@@ -425,7 +430,8 @@ int i915_gem_evict_for_node(struct i915_address_space *vm, - * To clarify: This is for freeing up virtual address space, not for freeing - * memory in e.g. the shrinker. - */ --int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww) -+int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww, -+ struct drm_i915_gem_object **busy_bo) - { - int ret = 0; - -@@ -457,15 +463,22 @@ int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww) - * the resv is shared among multiple objects, we still - * need the object ref. - */ -- if (dying_vma(vma) || -+ if (!i915_gem_object_get_rcu(vma->obj) || - (ww && (dma_resv_locking_ctx(vma->obj->base.resv) == &ww->ctx))) { - __i915_vma_pin(vma); - list_add(&vma->evict_link, &locked_eviction_list); - continue; - } - -- if (!i915_gem_object_trylock(vma->obj, ww)) -+ if (!i915_gem_object_trylock(vma->obj, ww)) { -+ if (busy_bo) { -+ *busy_bo = vma->obj; /* holds ref */ -+ ret = -EBUSY; -+ break; -+ } -+ i915_gem_object_put(vma->obj); - continue; -+ } - - __i915_vma_pin(vma); - list_add(&vma->evict_link, &eviction_list); -@@ -473,25 +486,29 @@ int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww) - if (list_empty(&eviction_list) && list_empty(&locked_eviction_list)) - break; - -- ret = 0; - /* Unbind locked objects first, before unlocking the eviction_list */ - list_for_each_entry_safe(vma, vn, &locked_eviction_list, evict_link) { - __i915_vma_unpin(vma); - -- if (ret == 0) -+ if (ret == 0) { - ret = __i915_vma_unbind(vma); -- if (ret != -EINTR) /* "Get me out of here!" */ -- ret = 0; -+ if (ret != -EINTR) /* "Get me out of here!" */ -+ ret = 0; -+ } -+ if (!dying_vma(vma)) -+ i915_gem_object_put(vma->obj); - } - - list_for_each_entry_safe(vma, vn, &eviction_list, evict_link) { - __i915_vma_unpin(vma); -- if (ret == 0) -+ if (ret == 0) { - ret = __i915_vma_unbind(vma); -- if (ret != -EINTR) /* "Get me out of here!" */ -- ret = 0; -+ if (ret != -EINTR) /* "Get me out of here!" */ -+ ret = 0; -+ } - - i915_gem_object_unlock(vma->obj); -+ i915_gem_object_put(vma->obj); - } - } while (ret == 0); - -diff --git a/drivers/gpu/drm/i915/i915_gem_evict.h b/drivers/gpu/drm/i915/i915_gem_evict.h -index e593c530f9bd..bf0ee0e4fe60 100644 ---- a/drivers/gpu/drm/i915/i915_gem_evict.h -+++ b/drivers/gpu/drm/i915/i915_gem_evict.h -@@ -11,6 +11,7 @@ - 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, -@@ -23,6 +24,7 @@ int __must_check i915_gem_evict_for_node(struct i915_address_space *vm, - 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 i915_gem_ww_ctx *ww, -+ struct drm_i915_gem_object **busy_bo); - - #endif /* __I915_GEM_EVICT_H__ */ -diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c -index 373582cfd8f3..240b7b8ed281 100644 ---- a/drivers/gpu/drm/i915/i915_vma.c -+++ b/drivers/gpu/drm/i915/i915_vma.c -@@ -1569,7 +1569,7 @@ static int __i915_ggtt_pin(struct i915_vma *vma, struct i915_gem_ww_ctx *ww, - * locked objects when called from execbuf when pinning - * is removed. This would probably regress badly. - */ -- i915_gem_evict_vm(vm, NULL); -+ i915_gem_evict_vm(vm, NULL, NULL); - mutex_unlock(&vm->mutex); - } - } while (1); -diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c -index 8c6517d29b8e..37068542aafe 100644 ---- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c -+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c -@@ -344,7 +344,7 @@ static int igt_evict_vm(void *arg) - - /* Everything is pinned, nothing should happen */ - mutex_lock(&ggtt->vm.mutex); -- err = i915_gem_evict_vm(&ggtt->vm, NULL); -+ err = i915_gem_evict_vm(&ggtt->vm, NULL, NULL); - mutex_unlock(&ggtt->vm.mutex); - if (err) { - pr_err("i915_gem_evict_vm on a full GGTT returned err=%d]\n", -@@ -356,7 +356,7 @@ static int igt_evict_vm(void *arg) - - for_i915_gem_ww(&ww, err, false) { - mutex_lock(&ggtt->vm.mutex); -- err = i915_gem_evict_vm(&ggtt->vm, &ww); -+ err = i915_gem_evict_vm(&ggtt->vm, &ww, NULL); - mutex_unlock(&ggtt->vm.mutex); - } - --- -2.38.1 - @@ -19,7 +19,7 @@ _custom=0 pkgbase=linux _supver=6 _majver=0 -_minver=16 +_minver=18 _gccpatchver='20221104' _gccpatchker='5.17+' if [ "$_minver" == "0" ]; then @@ -45,7 +45,6 @@ source=( 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch 0003-drm-sched-add-DRM_SCHED_FENCE_DONT_PIPELINE-flag.patch 0004-drm-amdgpu-use-DRM_SCHED_FENCE_DONT_PIPELINE-for-VM-.patch - 0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch kernel_compiler_patch-${_gccpatchver}.tar.gz::https://github.com/graysky2/kernel_compiler_patch/archive/${_gccpatchver}.tar.gz ath9k-regdom-hack.patch raid6-default-algo.patch @@ -55,23 +54,21 @@ validpgpkeys=( '647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman ) # https://www.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc -sha256sums=('842071bca611c1f080cbc39c7ab3a6b58d7951f4f41e553b3db4fbe3e0705ce4' +sha256sums=('9ab661699211518d8d32f6c7f646230549e8c5b424df6f685a323bc320949459' 'SKIP' 'e490737c0007da7bf9275e4d5f0162b64bb27d31169c9a24c2258c56c76fa43f' '2f4d03a8bb21357f88d694b62fc3299944fa1738652dfe888ac0320d5d21f351' '671c3852d1adf7095cf82fdecf197c65df4d3003c917b56cee2fc9845cd06883' '3d00e39c53c107c87925eaeade32fc7d78e916e588ab5d8e4dd84c33ae748a96' - '753576c6bc05bab969c5824fdb8dd8e6e1131d4c7f805dbaf5c529aafd2a1b6b' '3a8f397b89bad95c46f42c0f80ede7536a4a45a28621e00ed486918a55f905ed' 'e9e0d289170b7fb598b572d9c892ae8d1420952034aa415e8b3334f20a58edcc' '6ab863c8cfe6e0dd53a9d6455872fd4391508a8b97ab92e3f13558a6617b12a6') -b2sums=('9e7b042e1f8fefd5b84aa867a0dfc3d86da8e531fdbdf84aed81dfe987c01bf2b4d4df13fcad5ceca0fec206032268c5324ce1dfefc8611016e44c3ddb50584d' +b2sums=('4092c72e5605b04386355ef8e07ecfa70893af7d6d12da79955ebeac8303be785a329e6e4914238e9991dc314c6992c61c8f38c9fb10eefcb652fd98311e9471' 'SKIP' '02755ec326bde2703f0019d9fa214f6a7db52af43d47dde9ba87cd95bdc40fc4cc47f678a677640e4a472ec46790ba31ac36c37ded650740a1ef4f23b3f5e92b' '9d9dd78748f901b9be5876e1b34f4f13cae51384fbbfa653678924c6c8d90fdddf71b8c524aa2bc24548c6111adf160153753bd8a738866a2473459a338df6a0' 'd7b384645d39201c43871e3c6067012b8bb2b30bcce3217dbfdd6cc9437e1cf1ab7dbbbcd333cc5b9e04a986a6d1aefa9659cab73fdd308878621104285138b8' 'bc9d55712dbcb69a6220ffa98da46ac8ed78c2901e74aa65d4a5f35796a7cc17f2bd87d9d62924c18266f703bea67debf120d5ceff7a21963d1b35e022391252' - 'c819f6054da048c136d058e2925dcce4fab694917bd0608aee7f616a74c2464176b9c842764af49589bcbf298bb267528c7607f81137415cfccde2fa51b4beea' '05bddc2b57189d7e302f32041079bcf60a06938e9afcfd02a0085a1430255286a5b663eed7cdb7f857717c65e9e27af4d15625b17e0a36d1b4ce1cbda6baee2b' 'b6ef77035611139fa9a6d5b8d30570e2781bb4da483bb569884b0bd0129b62e0b82a5a6776fefe43fee801c70d39de1ea4d4c177f7cedd5ac135e3c64f7b895a' 'e94aa35d92cec92f4b0d487e0569790f3b712b9eaa5107f14a4200578e398ca740bf369f30f070c8beb56a72d1a6d0fc06beb650d798a64f44abe5e3af327728') @@ -96,7 +93,6 @@ prepare() { patch -p1 -i ../0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch patch -p1 -i ../0003-drm-sched-add-DRM_SCHED_FENCE_DONT_PIPELINE-flag.patch patch -p1 -i ../0004-drm-amdgpu-use-DRM_SCHED_FENCE_DONT_PIPELINE-for-VM-.patch - patch -p1 -i ../0005-drm-i915-improve-the-catch-all-evict-to-handle-lock-.patch # graysky gcc patch echo "Applying graysky gcc patch" |