]> err.no Git - linux-2.6/commitdiff
pkt_sched: Make sure RTNL is held in qdisc_root_lock().
authorDavid S. Miller <davem@davemloft.net>
Sun, 3 Aug 2008 06:27:37 +0000 (23:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 3 Aug 2008 06:27:37 +0000 (23:27 -0700)
It is the only legal environment in which this can be
used.

Add some commentary explaining the situation.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sch_generic.h

index b5f40d7ef724f344be5df5c3648609d5ef282f5d..c5bb130650518b49249463cf518b8a8a6c813a8c 100644 (file)
@@ -193,10 +193,22 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc)
        return qdisc->dev_queue->qdisc;
 }
 
+/* The qdisc root lock is a mechanism by which to top level
+ * of a qdisc tree can be locked from any qdisc node in the
+ * forest.  This allows changing the configuration of some
+ * aspect of the qdisc tree while blocking out asynchronous
+ * qdisc access in the packet processing paths.
+ *
+ * It is only legal to do this when the root will not change
+ * on us.  Otherwise we'll potentially lock the wrong qdisc
+ * root.  This is enforced by holding the RTNL semaphore, which
+ * all users of this lock accessor must do.
+ */
 static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc)
 {
        struct Qdisc *root = qdisc_root(qdisc);
 
+       ASSERT_RTNL();
        return qdisc_lock(root);
 }