Thomas Hellstrom wrote:
Most likely the spin_is_locked() function is not working on non - SMP systems (well how could it?). An oversight from my side.
You are right. I found a description in Documentation/scsi/ChangeLog.megaraid .
there are several checks present in the kernel where somebody does a variation on the following:
BUG_ON(!spin_is_locked(&some_lock));
so what's wrong about that? nothing, unless you compile the code with CONFIG_DEBUG_SPINLOCK but without CONFIG_SMP ... in which case the BUG() will kill your kernel ...
We should change the BUG_ON line to a lockdep_assert_held().
static __always_inline int spin_is_locked(spinlock_t *lock) { return raw_spin_is_locked(&lock->rlock); }
#define raw_spin_is_locked(lock) arch_spin_is_locked(&(lock)->raw_lock)
include/linux/spinlock_up.h: /* !DEBUG_SPINLOCK */ #define arch_spin_is_locked(lock) ((void)(lock), 0)
So, BUG_ON(!spin_is_locked(&man->lock)) was BUG_ON(!0) in my config, and below change fixed this problem.
Regards.
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c index 6377e81..4d26de4 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c @@ -247,7 +247,7 @@ static void __vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header) { struct vmw_cmdbuf_man *man = header->man;
- BUG_ON(!spin_is_locked(&man->lock)); + lockdep_assert_held(&man->lock);
if (header->inline_space) { vmw_cmdbuf_header_inline_free(header);