Commit 102396ae authored by Jarek Poplawski's avatar Jarek Poplawski Committed by David S. Miller
Browse files

pkt_sched: Fix locking of qdisc_root with qdisc_root_sleeping_lock()



Use qdisc_root_sleeping_lock() instead of qdisc_root_lock() where
appropriate. The only difference is while dev is deactivated, when
currently we can use a sleeping qdisc with the lock of noop_qdisc.
This shouldn't be dangerous since after deactivation root lock could
be used only by gen_estimator code, but looks wrong anyway.

Signed-off-by: default avatarJarek Poplawski <jarkao2@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3cc76caa
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -205,7 +205,7 @@ replay:
		}
		}
	}
	}


	root_lock = qdisc_root_lock(q);
	root_lock = qdisc_root_sleeping_lock(q);


	if (tp == NULL) {
	if (tp == NULL) {
		/* Proto-tcf does not exist, create new one */
		/* Proto-tcf does not exist, create new one */
+1 −1
Original line number Original line Diff line number Diff line
@@ -75,7 +75,7 @@ static __inline__ int route4_fastmap_hash(u32 id, int iif)
static inline
static inline
void route4_reset_fastmap(struct Qdisc *q, struct route4_head *head, u32 id)
void route4_reset_fastmap(struct Qdisc *q, struct route4_head *head, u32 id)
{
{
	spinlock_t *root_lock = qdisc_root_lock(q);
	spinlock_t *root_lock = qdisc_root_sleeping_lock(q);


	spin_lock_bh(root_lock);
	spin_lock_bh(root_lock);
	memset(head->fastmap, 0, sizeof(head->fastmap));
	memset(head->fastmap, 0, sizeof(head->fastmap));
+4 −4
Original line number Original line Diff line number Diff line
@@ -1169,8 +1169,8 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
	if (q->stab && qdisc_dump_stab(skb, q->stab) < 0)
	if (q->stab && qdisc_dump_stab(skb, q->stab) < 0)
		goto nla_put_failure;
		goto nla_put_failure;


	if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
	if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS,
					 TCA_XSTATS, qdisc_root_lock(q), &d) < 0)
					 qdisc_root_sleeping_lock(q), &d) < 0)
		goto nla_put_failure;
		goto nla_put_failure;


	if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0)
	if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0)
@@ -1461,8 +1461,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
	if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0)
	if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0)
		goto nla_put_failure;
		goto nla_put_failure;


	if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
	if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS,
					 TCA_XSTATS, qdisc_root_lock(q), &d) < 0)
					 qdisc_root_sleeping_lock(q), &d) < 0)
		goto nla_put_failure;
		goto nla_put_failure;


	if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0)
	if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0)
+1 −1
Original line number Original line Diff line number Diff line
@@ -1754,7 +1754,7 @@ static void cbq_put(struct Qdisc *sch, unsigned long arg)


	if (--cl->refcnt == 0) {
	if (--cl->refcnt == 0) {
#ifdef CONFIG_NET_CLS_ACT
#ifdef CONFIG_NET_CLS_ACT
		spinlock_t *root_lock = qdisc_root_lock(sch);
		spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
		struct cbq_sched_data *q = qdisc_priv(sch);
		struct cbq_sched_data *q = qdisc_priv(sch);


		spin_lock_bh(root_lock);
		spin_lock_bh(root_lock);
+2 −2
Original line number Original line Diff line number Diff line
@@ -1043,7 +1043,7 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt)


static int htb_dump(struct Qdisc *sch, struct sk_buff *skb)
static int htb_dump(struct Qdisc *sch, struct sk_buff *skb)
{
{
	spinlock_t *root_lock = qdisc_root_lock(sch);
	spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
	struct htb_sched *q = qdisc_priv(sch);
	struct htb_sched *q = qdisc_priv(sch);
	struct nlattr *nest;
	struct nlattr *nest;
	struct tc_htb_glob gopt;
	struct tc_htb_glob gopt;
@@ -1075,7 +1075,7 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
			  struct sk_buff *skb, struct tcmsg *tcm)
			  struct sk_buff *skb, struct tcmsg *tcm)
{
{
	struct htb_class *cl = (struct htb_class *)arg;
	struct htb_class *cl = (struct htb_class *)arg;
	spinlock_t *root_lock = qdisc_root_lock(sch);
	spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
	struct nlattr *nest;
	struct nlattr *nest;
	struct tc_htb_opt opt;
	struct tc_htb_opt opt;


Loading