From: Lai Jiangshan <laijs@cn.fujitsu.com>
To: Michel Lespinasse <walken@google.com>
Cc: linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Oleg Nesterov <oleg@redhat.com>,
"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
paulmck@linux.vnet.ibm.com, Rusty Russell <rusty@rustcorp.com.au>,
rostedt@goodmis.org, tglx@linutronix.de,
Andrew Morton <akpm@linux-foundation.org>,
Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 1/2] lockdep: introduce lock_acquire_exclusive/shared helper macros
Date: Tue, 05 Mar 2013 23:19:24 +0800 [thread overview]
Message-ID: <51360CFC.7040807@cn.fujitsu.com> (raw)
In-Reply-To: <1362449845-7492-2-git-send-email-walken@google.com>
On 05/03/13 10:17, Michel Lespinasse wrote:
> In lockdep.h, the spinlock/mutex/rwsem/rwlock/lock_map acquire macros
> have different definitions based on the value of CONFIG_PROVE_LOCKING.
> We have separate ifdefs for each of these definitions, which seems
> redundant.
>
> Introduce lock_acquire_{exclusive,shared,shared_recursive} helpers
> which will have different definitions based on CONFIG_PROVE_LOCKING.
> Then all other helper macros can be defined based on the above ones,
> which reduces the amount of ifdefined code.
>
> Signed-off-by: Michel Lespinasse <walken@google.com>
>
> ---
> include/linux/lockdep.h | 92 +++++++++++++------------------------------------
> 1 file changed, 23 insertions(+), 69 deletions(-)
>
> diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
> index f1e877b79ed8..cfc2f119779a 100644
> --- a/include/linux/lockdep.h
> +++ b/include/linux/lockdep.h
> @@ -365,7 +365,7 @@ extern void lockdep_trace_alloc(gfp_t mask);
>
> #define lockdep_recursing(tsk) ((tsk)->lockdep_recursion)
>
> -#else /* !LOCKDEP */
> +#else /* !CONFIG_LOCKDEP */
>
> static inline void lockdep_off(void)
> {
> @@ -479,82 +479,36 @@ static inline void print_irqtrace_events(struct task_struct *curr)
> * on the per lock-class debug mode:
> */
>
> -#ifdef CONFIG_DEBUG_LOCK_ALLOC
> -# ifdef CONFIG_PROVE_LOCKING
> -# define spin_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i)
> -# define spin_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i)
> -# else
> -# define spin_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i)
> -# define spin_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, NULL, i)
> -# endif
> -# define spin_release(l, n, i) lock_release(l, n, i)
> +#ifdef CONFIG_PROVE_LOCKING
> + #define lock_acquire_exclusive(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i)
> + #define lock_acquire_shared(l, s, t, n, i) lock_acquire(l, s, t, 1, 2, n, i)
> + #define lock_acquire_shared_recursive(l, s, t, n, i) lock_acquire(l, s, t, 2, 2, n, i)
Hi, Michel
I don't like the name lock_acquire_shared_recursive().
(I mean the name is wrong, ......)
In the lockdep design, lock_acquire(l, s, t, 2, 2, n, i) is used for
read-preference locks(rwlock) and all types of RCU. not for "recursive"
read-preference implies "recursive".
But the name lock_acquire_shared_recursive() don't tell us it is
read-preference.
Example if we do have a lock which is write-preference but allow read_lock recursive,
it will be still deadlock in this way, "recursive" does not help:
cpu0: spin_lock(a); recursiveable_read_lock(b)
cpu1: recursiveable_read_lock(b); spin_lock(a);
cpu2: write_lock(b);
I also noticed the lockdep annotations problem of lglock. and patch2 is good,
so for patch2: Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Thanks,
Lai
> #else
> -# define spin_acquire(l, s, t, i) do { } while (0)
> -# define spin_release(l, n, i) do { } while (0)
> + #define lock_acquire_exclusive(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
> + #define lock_acquire_shared(l, s, t, n, i) lock_acquire(l, s, t, 1, 1, n, i)
> + #define lock_acquire_shared_recursive(l, s, t, n, i) lock_acquire(l, s, t, 2, 1, n, i)
> #endif
>
> -#ifdef CONFIG_DEBUG_LOCK_ALLOC
> -# ifdef CONFIG_PROVE_LOCKING
> -# define rwlock_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i)
> -# define rwlock_acquire_read(l, s, t, i) lock_acquire(l, s, t, 2, 2, NULL, i)
> -# else
> -# define rwlock_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i)
> -# define rwlock_acquire_read(l, s, t, i) lock_acquire(l, s, t, 2, 1, NULL, i)
> -# endif
> -# define rwlock_release(l, n, i) lock_release(l, n, i)
> -#else
> -# define rwlock_acquire(l, s, t, i) do { } while (0)
> -# define rwlock_acquire_read(l, s, t, i) do { } while (0)
> -# define rwlock_release(l, n, i) do { } while (0)
> -#endif
> +#define spin_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i)
> +#define spin_acquire_nest(l, s, t, n, i) lock_acquire_exclusive(l, s, t, n, i)
> +#define spin_release(l, n, i) lock_release(l, n, i)
>
> -#ifdef CONFIG_DEBUG_LOCK_ALLOC
> -# ifdef CONFIG_PROVE_LOCKING
> -# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i)
> -# define mutex_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i)
> -# else
> -# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i)
> -# define mutex_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
> -# endif
> -# define mutex_release(l, n, i) lock_release(l, n, i)
> -#else
> -# define mutex_acquire(l, s, t, i) do { } while (0)
> -# define mutex_acquire_nest(l, s, t, n, i) do { } while (0)
> -# define mutex_release(l, n, i) do { } while (0)
> -#endif
> +#define rwlock_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i)
> +#define rwlock_acquire_read(l, s, t, i) lock_acquire_shared_recursive(l, s, t, NULL, i)
> +#define rwlock_release(l, n, i) lock_release(l, n, i)
>
> -#ifdef CONFIG_DEBUG_LOCK_ALLOC
> -# ifdef CONFIG_PROVE_LOCKING
> -# define rwsem_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i)
> -# define rwsem_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i)
> -# define rwsem_acquire_read(l, s, t, i) lock_acquire(l, s, t, 1, 2, NULL, i)
> -# else
> -# define rwsem_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i)
> -# define rwsem_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
> -# define rwsem_acquire_read(l, s, t, i) lock_acquire(l, s, t, 1, 1, NULL, i)
> -# endif
> +#define mutex_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i)
> +#define mutex_acquire_nest(l, s, t, n, i) lock_acquire_exclusive(l, s, t, n, i)
> +#define mutex_release(l, n, i) lock_release(l, n, i)
> +
> +#define rwsem_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i)
> +#define rwsem_acquire_nest(l, s, t, n, i) lock_acquire_exclusive(l, s, t, n, i)
> +#define rwsem_acquire_read(l, s, t, i) lock_acquire_shared(l, s, t, NULL, i)
> # define rwsem_release(l, n, i) lock_release(l, n, i)
> -#else
> -# define rwsem_acquire(l, s, t, i) do { } while (0)
> -# define rwsem_acquire_nest(l, s, t, n, i) do { } while (0)
> -# define rwsem_acquire_read(l, s, t, i) do { } while (0)
> -# define rwsem_release(l, n, i) do { } while (0)
> -#endif
>
> -#ifdef CONFIG_DEBUG_LOCK_ALLOC
> -# ifdef CONFIG_PROVE_LOCKING
> -# define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 2, NULL, _THIS_IP_)
> -# define lock_map_acquire_read(l) lock_acquire(l, 0, 0, 2, 2, NULL, _THIS_IP_)
> -# else
> -# define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 1, NULL, _THIS_IP_)
> -# define lock_map_acquire_read(l) lock_acquire(l, 0, 0, 2, 1, NULL, _THIS_IP_)
> -# endif
> +#define lock_map_acquire(l) lock_acquire_exclusive(l, 0, 0, NULL, _THIS_IP_)
> +#define lock_map_acquire_read(l) lock_acquire_shared_recursive(l, 0, 0, NULL, _THIS_IP_)
> # define lock_map_release(l) lock_release(l, 1, _THIS_IP_)
> -#else
> -# define lock_map_acquire(l) do { } while (0)
> -# define lock_map_acquire_read(l) do { } while (0)
> -# define lock_map_release(l) do { } while (0)
> -#endif
>
> #ifdef CONFIG_PROVE_LOCKING
> # define might_lock(lock) \
next prev parent reply other threads:[~2013-03-05 15:17 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-05 2:17 [PATCH 0/2] tighten lglock lockdep annotations Michel Lespinasse
2013-03-05 2:17 ` [PATCH 1/2] lockdep: introduce lock_acquire_exclusive/shared helper macros Michel Lespinasse
2013-03-05 15:19 ` Lai Jiangshan [this message]
2013-03-05 15:40 ` Michel Lespinasse
2013-03-05 17:06 ` Oleg Nesterov
2013-03-05 2:17 ` [PATCH 2/2] lglock: update lockdep annotations to report recursive local locks Michel Lespinasse
2013-03-05 17:42 ` Oleg Nesterov
2013-03-05 18:24 ` Michel Lespinasse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51360CFC.7040807@cn.fujitsu.com \
--to=laijs@cn.fujitsu.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=rusty@rustcorp.com.au \
--cc=srivatsa.bhat@linux.vnet.ibm.com \
--cc=tglx@linutronix.de \
--cc=walken@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.