[PATCH][NET] ifb: set separate lockdep classes for queue locks

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jarek Poplawski
Date: Wednesday, March 19, 2008 - 12:34 am

On Wed, Mar 19, 2008 at 02:46:08AM +0200, Denys Fedoryshchenko wrote:

Thanks for testing Denys,
Jarek P.

--------------------->

Subject: [NET] ifb: set separate lockdep classes for queue locks


lockdep warns of locking order while using ifb with sch_ingress and
act_mirred: ingress_lock, tcfc_lock, queue_lock (usually queue_lock
is at the beginning). This patch is only to tell lockdep that ifb is
a different device (e.g. from eth) and has its own pair of queue
locks. (This warning is a false-positive in common scenario of using
ifb; yet there are possible situations, when this order could be
dangerous; lockdep should warn in such a case.)


Reported-and-tested-by: Denys Fedoryshchenko <denys@visp.net.lb>
Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
Cc: Jamal Hadi Salim <hadi@cyberus.ca>

---

 drivers/net/ifb.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c
index 15949d3..c553b62 100644
--- a/drivers/net/ifb.c
+++ b/drivers/net/ifb.c
@@ -227,6 +227,27 @@ static struct rtnl_link_ops ifb_link_ops __read_mostly = {
 module_param(numifbs, int, 0);
 MODULE_PARM_DESC(numifbs, "Number of ifb devices");
 
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+/*
+ * dev_ifb->queue_lock is usually taken after dev->ingress_lock,
+ * reversely to e.g. qdisc_lock_tree(). It should be safe until
+ * ifb doesn't take dev->queue_lock with dev_ifb->ingress_lock.
+ * But lockdep should know that ifb has different locks from dev.
+ */
+static struct lock_class_key ifb_queue_lock_key;
+static struct lock_class_key ifb_ingress_lock_key;
+
+static inline void ifb_set_lock_classes(struct net_device *dev_ifb)
+{
+	lockdep_set_class(&dev_ifb->queue_lock, &ifb_queue_lock_key);
+	lockdep_set_class(&dev_ifb->ingress_lock, &ifb_ingress_lock_key);
+}
+#else
+static inline void ifb_set_lock_classes(struct net_device *dev_ifb)
+{
+}
+#endif	/* CONFIG_DEBUG_LOCK_ALLOC */
+
 static int __init ifb_init_one(int index)
 {
 	struct net_device *dev_ifb;
@@ -246,6 +267,9 @@ static int __init ifb_init_one(int index)
 	err = register_netdevice(dev_ifb);
 	if (err < 0)
 		goto err;
+
+	ifb_set_lock_classes(dev_ifb);
+
 	return 0;
 
 err:
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Sun Feb 24, 3:20 pm)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Mon Feb 25, 2:56 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Mon Feb 25, 3:48 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Mon Feb 25, 4:39 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Wed Mar 5, 3:45 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Thu Mar 6, 6:40 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Thu Mar 6, 6:57 am)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 6:59 am)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 7:27 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Thu Mar 6, 8:50 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Thu Mar 6, 10:56 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Thu Mar 6, 1:25 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 1:44 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 1:48 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 1:56 pm)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Thu Mar 6, 2:40 pm)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Thu Mar 6, 3:12 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 4:40 pm)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Thu Mar 6, 4:43 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 5:09 pm)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Thu Mar 6, 5:15 pm)
Re: circular locking, mirred, 2.6.24.2, jamal, (Thu Mar 6, 5:25 pm)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Fri Mar 7, 12:51 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Fri Mar 7, 1:32 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Fri Mar 7, 2:31 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Fri Mar 7, 3:19 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Fri Mar 7, 3:48 am)
Re: circular locking, mirred, 2.6.24.2, jamal, (Fri Mar 7, 6:53 am)
Re: circular locking, mirred, 2.6.24.2, jamal, (Fri Mar 7, 7:58 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Sat Mar 8, 1:46 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Sat Mar 8, 1:58 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Sat Mar 8, 2:56 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Sat Mar 8, 3:16 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Sat Mar 8, 3:43 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Sat Mar 8, 3:52 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Sat Mar 8, 4:09 am)
Re: circular locking, mirred, 2.6.24.2, Jarek Poplawski, (Sat Mar 8, 5:02 am)
Re: circular locking, mirred, 2.6.24.2, Denys Fedoryshchenko, (Tue Mar 18, 5:46 pm)
[PATCH][NET] ifb: set separate lockdep classes for queue locks, Jarek Poplawski, (Wed Mar 19, 12:34 am)