Commit 7e43f112 authored by David S. Miller's avatar David S. Miller

pkt_sched: Make sure RTNL is held in qdisc_root_lock().

It is the only legal environment in which this can be
used.

Add some commentary explaining the situation.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 35ed4e75
...@@ -193,10 +193,22 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc) ...@@ -193,10 +193,22 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc)
return qdisc->dev_queue->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) static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc)
{ {
struct Qdisc *root = qdisc_root(qdisc); struct Qdisc *root = qdisc_root(qdisc);
ASSERT_RTNL();
return qdisc_lock(root); return qdisc_lock(root);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment