|
@@ -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);
|
|
|
}
|
|
|
|