All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. R. Okajima" <hooanon05g@gmail.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: kbuild test robot <lkp@intel.com>,
	kbuild-all@01.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/3] lockdep: new annotation lock_downgrade()
Date: Fri, 03 Feb 2017 06:05:31 +0900	[thread overview]
Message-ID: <2978.1486069531@jrobl> (raw)
In-Reply-To: <20170202184540.GZ6515@twins.programming.kicks-ass.net>

Peter Zijlstra:
> > >> kernel/locking/rwsem.c:126:2: error: implicit declaration of functi=
on 'lock_downgrade' [-Werror=3Dimplicit-function-declaration]
> >      lock_downgrade(&sem->dep_map, _RET_IP_);
> >      ^~~~~~~~~~~~~~
	:::
> This is what you need !LOCKDEP stubs for ;-)

Ok, here is the update.
Just one line added.


J. R. Okajima


commit 6874cbfb3c4f757efecbeb800bfd4db1050698f6
Author: J. R. Okajima <hooanon05g@gmail.com>
Date:   Thu Feb 2 23:41:38 2017 +0900

    lockdep: new annotation lock_downgrade()
    =

    The commit
    	f831948 2016-11-30 locking/lockdep: Provide a type check for lock_is_=
held
    didn't fully support rwsem. Here downgrade_write() supports the added =
type.
    =

    Originally-written-by: Peter Zijlstra <peterz@infradead.org>
    See-also: http://marc.info/?l=3Dlinux-kernel&m=3D148581164003149&w=3D2
    Signed-off-by: J. R. Okajima <hooanon05g@gmail.com>

diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 0345cbf..ba75d06 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -361,6 +361,8 @@ static inline void lock_set_subclass(struct lockdep_ma=
p *lock,
 	lock_set_class(lock, lock->name, lock->key, subclass, ip);
 }
 =

+extern void lock_downgrade(struct lockdep_map *lock, unsigned long ip);
+
 extern void lockdep_set_current_reclaim_state(gfp_t gfp_mask);
 extern void lockdep_clear_current_reclaim_state(void);
 extern void lockdep_trace_alloc(gfp_t mask);
@@ -413,6 +415,7 @@ static inline void lockdep_on(void)
 =

 # define lock_acquire(l, s, t, r, c, n, i)	do { } while (0)
 # define lock_release(l, n, i)			do { } while (0)
+# define lock_downgrade(l, i)			do { } while (0)
 # define lock_set_class(l, n, k, s, i)		do { } while (0)
 # define lock_set_subclass(l, s, i)		do { } while (0)
 # define lockdep_set_current_reclaim_state(g)	do { } while (0)
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 7dc8f8e..6a4a740 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -3523,6 +3523,44 @@ __lock_set_class(struct lockdep_map *lock, const ch=
ar *name,
 	return 1;
 }
 =

+static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip)
+{
+	struct task_struct *curr =3D current;
+	struct held_lock *hlock;
+	unsigned int depth;
+	int i;
+
+	depth =3D curr->lockdep_depth;
+	/*
+	 * This function is about (re)setting the class of a held lock,
+	 * yet we're not actually holding any locks. Naughty user!
+	 */
+	if (DEBUG_LOCKS_WARN_ON(!depth))
+		return 0;
+
+	hlock =3D find_held_lock(curr, lock, depth, &i);
+	if (!hlock)
+		return print_unlock_imbalance_bug(curr, lock, ip);
+
+	curr->lockdep_depth =3D i;
+	curr->curr_chain_key =3D hlock->prev_chain_key;
+
+	WARN(hlock->read, "downgrading a read lock");
+	hlock->read =3D 1;
+	hlock->acquire_ip =3D ip;
+
+	if (validate_held_lock(curr, depth, i))
+		return 0;
+
+	/*
+	 * I took it apart and put it back together again, except now I have
+	 * these 'spare' parts.. where shall I put them.
+	 */
+	if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth !=3D depth))
+		return 0;
+	return 1;
+}
+
 /*
  * Remove the lock to the list of currently held locks - this gets
  * called on mutex_unlock()/spin_unlock*() (or on a failed
@@ -3749,6 +3787,23 @@ void lock_set_class(struct lockdep_map *lock, const=
 char *name,
 }
 EXPORT_SYMBOL_GPL(lock_set_class);
 =

+void lock_downgrade(struct lockdep_map *lock, unsigned long ip)
+{
+	unsigned long flags;
+
+	if (unlikely(current->lockdep_recursion))
+		return;
+
+	raw_local_irq_save(flags);
+	current->lockdep_recursion =3D 1;
+	check_flags(flags);
+	if (__lock_downgrade(lock, ip))
+		check_chain_key(current);
+	current->lockdep_recursion =3D 0;
+	raw_local_irq_restore(flags);
+}
+EXPORT_SYMBOL_GPL(lock_downgrade);
+
 /*
  * We are not always called with irqs disabled - do that here,
  * and also avoid lockdep recursion:
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
index 45ba475..31db3ef 100644
--- a/kernel/locking/rwsem.c
+++ b/kernel/locking/rwsem.c
@@ -123,10 +123,8 @@ EXPORT_SYMBOL(up_write);
  */
 void downgrade_write(struct rw_semaphore *sem)
 {
-	/*
-	 * lockdep: a downgraded write will live on as a write
-	 * dependency.
-	 */
+	lock_downgrade(&sem->dep_map, _RET_IP_);
+
 	rwsem_set_reader_owned(sem);
 	__downgrade_write(sem);
 }

  reply	other threads:[~2017-02-02 21:05 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-30 21:25 Q: lockdep_assert_held_read() after downgrade_write() J. R. Okajima
2017-01-30 21:30 ` Jens Axboe
2017-01-31 10:36   ` Peter Zijlstra
2017-01-31 11:25     ` Peter Zijlstra
2017-01-31 14:23       ` Waiman Long
2017-01-31 14:26         ` Peter Zijlstra
2017-01-31 15:40   ` J. R. Okajima
2017-01-31 16:32     ` Peter Zijlstra
2017-02-02 16:33       ` J. R. Okajima
2017-02-02 16:38       ` [PATCH 1/3] lockdep: consolidate by new find_held_lock() J. R. Okajima
2017-02-02 16:38         ` [PATCH 2/3] lockdep: consolidate by new validate_held_lock() J. R. Okajima
2017-02-14 12:09           ` Peter Zijlstra
2017-03-16 11:25           ` [tip:locking/core] locking/lockdep: Factor out the validate_held_lock() helper function tip-bot for J. R. Okajima
2017-02-02 16:38         ` [PATCH 3/3] lockdep: new annotation lock_downgrade() J. R. Okajima
2017-02-02 17:59           ` kbuild test robot
2017-02-02 18:45             ` Peter Zijlstra
2017-02-02 21:05               ` J. R. Okajima [this message]
2017-02-14 12:11                 ` Peter Zijlstra
2017-03-16 11:25           ` [tip:locking/core] locking/lockdep: Add new check to lock_downgrade() tip-bot for J. R. Okajima
2017-03-16 11:24         ` [tip:locking/core] locking/lockdep: Factor out the find_held_lock() helper function tip-bot for J. R. Okajima

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=2978.1486069531@jrobl \
    --to=hooanon05g@gmail.com \
    --cc=kbuild-all@01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lkp@intel.com \
    --cc=peterz@infradead.org \
    /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.