Re: [PATCH 2/2] mutex: use spin_[un]lock instead ofarch_spin_[un]lock

From: Andrew Morton
Date: Thu Jan 24 2013 - 19:14:05 EST


On Thu, 24 Jan 2013 17:22:45 +0800
Yuanhan Liu <yuanhan.liu@xxxxxxxxxxxxxxx> wrote:

> Use spin_[un]lock instead of arch_spin_[un]lock in mutex-debug.h so
> that we can collect the lock statistics of spin_lock_mutex from
> /proc/lock_stat.
>
> ...
>
> --- a/kernel/mutex-debug.h
> +++ b/kernel/mutex-debug.h
> @@ -43,13 +43,13 @@ static inline void mutex_clear_owner(struct mutex *lock)
> \
> DEBUG_LOCKS_WARN_ON(in_interrupt()); \
> local_irq_save(flags); \
> - arch_spin_lock(&(lock)->rlock.raw_lock);\
> + spin_lock(lock); \
> DEBUG_LOCKS_WARN_ON(l->magic != l); \
> } while (0)
>
> #define spin_unlock_mutex(lock, flags) \
> do { \
> - arch_spin_unlock(&(lock)->rlock.raw_lock); \
> + spin_unlock(lock); \
> local_irq_restore(flags); \
> preempt_check_resched(); \
> } while (0)

>From my reading of the c2f21ce2e3128 changelog, this patch might screw
up the -rt kernel:

locking: Implement new raw_spinlock

Now that the raw_spin name space is freed up, we can implement
raw_spinlock and the related functions which are used to annotate the
locks which are not converted to sleeping spinlocks in preempt-rt.

A side effect is that only such locks can be used with the low level
lock fsunctions which circumvent lockdep.

For !rt spin_* functions are mapped to the raw_spin* implementations.


Also, I believe your patch permits this cleanup:

--- a/kernel/mutex-debug.h~mutex-use-spin_lock-instead-of-arch_spin_lock-fix
+++ a/kernel/mutex-debug.h
@@ -42,14 +42,12 @@ static inline void mutex_clear_owner(str
struct mutex *l = container_of(lock, struct mutex, wait_lock); \
\
DEBUG_LOCKS_WARN_ON(in_interrupt()); \
- local_irq_save(flags); \
- spin_lock(lock); \
+ spin_lock_irqsave(lock, flags); \
DEBUG_LOCKS_WARN_ON(l->magic != l); \
} while (0)

#define spin_unlock_mutex(lock, flags) \
do { \
- spin_unlock(lock); \
- local_irq_restore(flags); \
+ spin_unlock_irqrestore(lock, flags); \
preempt_check_resched(); \
} while (0)

But we should hear from the -rt guys (at least!) before proceeding with
this, please.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/