Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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);
}