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: Jarek Poplawski <jarkao2@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3cc76caa98
commit
102396ae65
|
@ -205,7 +205,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
root_lock = qdisc_root_lock(q);
|
||||
root_lock = qdisc_root_sleeping_lock(q);
|
||||
|
||||
if (tp == NULL) {
|
||||
/* Proto-tcf does not exist, create new one */
|
||||
|
|
|
@ -75,7 +75,7 @@ static __inline__ int route4_fastmap_hash(u32 id, int iif)
|
|||
static inline
|
||||
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);
|
||||
memset(head->fastmap, 0, sizeof(head->fastmap));
|
||||
|
|
|
@ -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)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
|
||||
TCA_XSTATS, qdisc_root_lock(q), &d) < 0)
|
||||
if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS,
|
||||
qdisc_root_sleeping_lock(q), &d) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
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)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
|
||||
TCA_XSTATS, qdisc_root_lock(q), &d) < 0)
|
||||
if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS,
|
||||
qdisc_root_sleeping_lock(q), &d) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0)
|
||||
|
|
|
@ -1754,7 +1754,7 @@ static void cbq_put(struct Qdisc *sch, unsigned long arg)
|
|||
|
||||
if (--cl->refcnt == 0) {
|
||||
#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);
|
||||
|
||||
spin_lock_bh(root_lock);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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 nlattr *nest;
|
||||
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 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 tc_htb_opt opt;
|
||||
|
||||
|
|
|
@ -341,7 +341,7 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr)
|
|||
for (i = 0; i < n; i++)
|
||||
d->table[i] = data[i];
|
||||
|
||||
root_lock = qdisc_root_lock(sch);
|
||||
root_lock = qdisc_root_sleeping_lock(sch);
|
||||
|
||||
spin_lock_bh(root_lock);
|
||||
d = xchg(&q->delay_dist, d);
|
||||
|
|
|
@ -161,7 +161,7 @@ teql_destroy(struct Qdisc* sch)
|
|||
txq = netdev_get_tx_queue(master->dev, 0);
|
||||
master->slaves = NULL;
|
||||
|
||||
root_lock = qdisc_root_lock(txq->qdisc);
|
||||
root_lock = qdisc_root_sleeping_lock(txq->qdisc);
|
||||
spin_lock_bh(root_lock);
|
||||
qdisc_reset(txq->qdisc);
|
||||
spin_unlock_bh(root_lock);
|
||||
|
|
Loading…
Reference in New Issue
Block a user