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);

Reply via email to