From ca64d5d7268aca9e62bbc533097dd1b396325684 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Thu, 9 Sep 2021 11:32:18 +0200 Subject: [PATCH] kernel/locking: Add context to ww_mutex_trylock() i915 will soon gain an eviction path that trylock a whole lot of locks for eviction, getting dmesg failures like below: BUG: MAX_LOCK_DEPTH too low! turning off the locking correctness validator. depth: 48 max: 48! 48 locks held by i915_selftest/5776: #0: ffff888101a79240 (&dev->mutex){....}-{3:3}, at: __driver_attach+0x88/0x160 #1: ffffc900009778c0 (reservation_ww_class_acquire){+.+.}-{0:0}, at: i915_vma_pin.constprop.63+0x39/0x1b0 [i915] #2: ffff88800cf74de8 (reservation_ww_class_mutex){+.+.}-{3:3}, at: i915_vma_pin.constprop.63+0x5f/0x1b0 [i915] #3: ffff88810c7f9e38 (&vm->mutex/1){+.+.}-{3:3}, at: i915_vma_pin_ww+0x1c4/0x9d0 [i915] #4: ffff88810bad5768 (reservation_ww_class_mutex){+.+.}-{3:3}, at: i915_gem_evict_something+0x110/0x860 [i915] #5: ffff88810bad60e8 (reservation_ww_class_mutex){+.+.}-{3:3}, at: i915_gem_evict_something+0x110/0x860 [i915] ... #46: ffff88811964d768 (reservation_ww_class_mutex){+.+.}-{3:3}, at: i915_gem_evict_something+0x110/0x860 [i915] #47: ffff88811964e0e8 (reservation_ww_class_mutex){+.+.}-{3:3}, at: i915_gem_evict_something+0x110/0x860 [i915] INFO: lockdep is turned off. Fixing eviction to nest into ww_class_acquire is a high priority, but it requires a rework of the entire driver, which can only be done one step at a time. As an intermediate solution, add an acquire context to ww_mutex_trylock, which allows us to do proper nesting annotations on the trylocks, making the above lockdep splat disappear. This is also useful in regulator_lock_nested, which may avoid dropping regulator_nesting_mutex in the uncontended path, so use it there. TTM may be another user for this, where we could lock a buffer in a fastpath with list locks held, without dropping all locks we hold. [peterz: rework actual ww_mutex_trylock() implementations] Signed-off-by: Maarten Lankhorst Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/YUBGPdDDjKlxAuXJ@hirez.programming.kicks-ass.net --- amd/amdgpu/Makefile | 2 +- dmabuf/Makefile | 2 +- drivers/gpu/drm/drm_modeset_lock.c | 2 +- drm/Makefile | 2 +- i915/Makefile | 2 +- linuxkpi/Makefile | 2 +- linuxkpi/gplv2/include/linux/dma-resv.h | 2 +- radeon/Makefile | 2 +- ttm/Makefile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/amd/amdgpu/Makefile b/amd/amdgpu/Makefile index a11a8cc0b96..016e4880090 100644 --- a/amd/amdgpu/Makefile +++ b/amd/amdgpu/Makefile @@ -783,7 +783,7 @@ CFLAGS+= -I${SRCDIR}/pm/swsmu/smu13 CFLAGS+= -I${DRM}/scheduler CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=amdgpu_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=amdgpu_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} SRCS+= device_if.h vnode_if.h bus_if.h pci_if.h pci_iov_if.h device_if.h iicbus_if.h opt_drm.h \ diff --git a/dmabuf/Makefile b/dmabuf/Makefile index 674ae183b03..7873a8bb64e 100644 --- a/dmabuf/Makefile +++ b/dmabuf/Makefile @@ -26,7 +26,7 @@ CFLAGS+= -I${.CURDIR:H}/linuxkpi/dummy/include # fallback to dummy CFLAGS+= -I${SYSDIR}/compat/linuxkpi/dummy/include CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= -DLINUXKPI_VERSION=51501 +CFLAGS+= -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} CWARNFLAGS.dma-buf.c+= -Wno-pointer-arith diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c index a33e613a963..29ef0152d86 100644 --- a/drivers/gpu/drm/drm_modeset_lock.c +++ b/drivers/gpu/drm/drm_modeset_lock.c @@ -280,7 +280,7 @@ static inline int modeset_lock(struct drm_modeset_lock *lock, if (ctx->trylock_only) { lockdep_assert_held(&ctx->ww_ctx); - if (!ww_mutex_trylock(&lock->mutex)) + if (!ww_mutex_trylock(&lock->mutex, NULL)) return -EBUSY; else return 0; diff --git a/drm/Makefile b/drm/Makefile index cd59d173a65..2620b56b9f0 100644 --- a/drm/Makefile +++ b/drm/Makefile @@ -123,7 +123,7 @@ CFLAGS+= -I${.CURDIR:H}/include/uapi CFLAGS+= -I${SRCDIR:H} CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=drm_' -DDRM_SYSCTL_PARAM_PREFIX=_dri -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=drm_' -DDRM_SYSCTL_PARAM_PREFIX=_dri -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} SRCS+= device_if.h \ diff --git a/i915/Makefile b/i915/Makefile index 3918aa499c9..d2f5e12dc32 100644 --- a/i915/Makefile +++ b/i915/Makefile @@ -264,7 +264,7 @@ CFLAGS+= -I${.CURDIR:H}/include/uapi CFLAGS+= -I${SRCDIR:H:H} -I${SRCDIR} -I${SRCDIR}/display CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=i915_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=i915_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} SRCS += \ diff --git a/linuxkpi/Makefile b/linuxkpi/Makefile index da3398c3176..1fb5654ba5b 100644 --- a/linuxkpi/Makefile +++ b/linuxkpi/Makefile @@ -23,7 +23,7 @@ CFLAGS+= -I${.CURDIR}/dummy/include CFLAGS+= -I${.CURDIR}/gplv2/include CFLAGS+= -I${.CURDIR}/bsd/include CFLAGS+= -I${SYSDIR}/compat/linuxkpi/common/include -CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} CFLAGS.gcc+= -Wno-cast-qual CFLAGS.linux_hdmi.c= -Wno-cast-qual diff --git a/linuxkpi/gplv2/include/linux/dma-resv.h b/linuxkpi/gplv2/include/linux/dma-resv.h index dcf1cb68e5f..12ba4d198bb 100644 --- a/linuxkpi/gplv2/include/linux/dma-resv.h +++ b/linuxkpi/gplv2/include/linux/dma-resv.h @@ -183,7 +183,7 @@ static inline int dma_resv_lock_slow_interruptible(struct dma_resv *obj, */ static inline bool __must_check dma_resv_trylock(struct dma_resv *obj) { - return ww_mutex_trylock(&obj->lock); + return ww_mutex_trylock(&obj->lock, NULL); } /** diff --git a/radeon/Makefile b/radeon/Makefile index 50ac2cb328d..25876e60cde 100644 --- a/radeon/Makefile +++ b/radeon/Makefile @@ -133,7 +133,7 @@ CFLAGS+= -I${SRCDIR:H:H} CFLAGS+= -I${SRCDIR:H}/amd/include CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=radeon_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=radeon_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} CFLAGS.gcc+= -Wno-redundant-decls -Wno-cast-qual -Wno-unused-but-set-variable \ diff --git a/ttm/Makefile b/ttm/Makefile index 6047bab4498..00774b65a10 100644 --- a/ttm/Makefile +++ b/ttm/Makefile @@ -38,7 +38,7 @@ CFLAGS+= -I${.CURDIR:H}/include/uapi CFLAGS+= -I${SRCDIR:H:H} CFLAGS+= '-DKBUILD_MODNAME="${KMOD}"' -CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=ttm_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51501 +CFLAGS+= '-DLINUXKPI_PARAM_PREFIX=ttm_' -DDRM_SYSCTL_PARAM_PREFIX=_${KMOD} -DLINUXKPI_VERSION=51600 CFLAGS+= ${KCONFIG:C/(.*)/-DCONFIG_\1/} SRCS+= device_if.h \