mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
pkt_sched: Add BH protection for qdisc_stab_lock.
Since qdisc_stab_lock is used in qdisc_put_stab(), which is called in BH context from __qdisc_destroy() RCU callback, softirq safe locking is needed. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0a37c10ed4
commit
1cfa26661a
1 changed files with 7 additions and 7 deletions
|
@ -331,7 +331,7 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
|
||||||
if (!s || tsize != s->tsize || (!tab && tsize > 0))
|
if (!s || tsize != s->tsize || (!tab && tsize > 0))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
spin_lock(&qdisc_stab_lock);
|
spin_lock_bh(&qdisc_stab_lock);
|
||||||
|
|
||||||
list_for_each_entry(stab, &qdisc_stab_list, list) {
|
list_for_each_entry(stab, &qdisc_stab_list, list) {
|
||||||
if (memcmp(&stab->szopts, s, sizeof(*s)))
|
if (memcmp(&stab->szopts, s, sizeof(*s)))
|
||||||
|
@ -339,11 +339,11 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
|
||||||
if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16)))
|
if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16)))
|
||||||
continue;
|
continue;
|
||||||
stab->refcnt++;
|
stab->refcnt++;
|
||||||
spin_unlock(&qdisc_stab_lock);
|
spin_unlock_bh(&qdisc_stab_lock);
|
||||||
return stab;
|
return stab;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&qdisc_stab_lock);
|
spin_unlock_bh(&qdisc_stab_lock);
|
||||||
|
|
||||||
stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL);
|
stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL);
|
||||||
if (!stab)
|
if (!stab)
|
||||||
|
@ -354,9 +354,9 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
|
||||||
if (tsize > 0)
|
if (tsize > 0)
|
||||||
memcpy(stab->data, tab, tsize * sizeof(u16));
|
memcpy(stab->data, tab, tsize * sizeof(u16));
|
||||||
|
|
||||||
spin_lock(&qdisc_stab_lock);
|
spin_lock_bh(&qdisc_stab_lock);
|
||||||
list_add_tail(&stab->list, &qdisc_stab_list);
|
list_add_tail(&stab->list, &qdisc_stab_list);
|
||||||
spin_unlock(&qdisc_stab_lock);
|
spin_unlock_bh(&qdisc_stab_lock);
|
||||||
|
|
||||||
return stab;
|
return stab;
|
||||||
}
|
}
|
||||||
|
@ -366,14 +366,14 @@ void qdisc_put_stab(struct qdisc_size_table *tab)
|
||||||
if (!tab)
|
if (!tab)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spin_lock(&qdisc_stab_lock);
|
spin_lock_bh(&qdisc_stab_lock);
|
||||||
|
|
||||||
if (--tab->refcnt == 0) {
|
if (--tab->refcnt == 0) {
|
||||||
list_del(&tab->list);
|
list_del(&tab->list);
|
||||||
kfree(tab);
|
kfree(tab);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&qdisc_stab_lock);
|
spin_unlock_bh(&qdisc_stab_lock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(qdisc_put_stab);
|
EXPORT_SYMBOL(qdisc_put_stab);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue