projects
/
platform
/
kernel
/
linux-rpi.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
d6ec2f7
)
net: sched: tbf: don't call qdisc_put() while holding tree lock
author
Zhengchao Shao
<shaozhengchao@huawei.com>
Fri, 26 Aug 2022 01:39:30 +0000
(09:39 +0800)
committer
Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Thu, 8 Sep 2022 10:28:02 +0000
(12:28 +0200)
[ Upstream commit
b05972f01e7d30419987a1f221b5593668fd6448
]
The issue is the same to commit
c2999f7fb05b
("net: sched: multiq: don't
call qdisc_put() while holding tree lock"). Qdiscs call qdisc_put() while
holding sch tree spinlock, which results sleeping-while-atomic BUG.
Fixes:
c266f64dbfa2
("net: sched: protect block state with mutex")
Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
Link:
https://lore.kernel.org/r/20220826013930.340121-1-shaozhengchao@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/sched/sch_tbf.c
patch
|
blob
|
history
diff --git
a/net/sched/sch_tbf.c
b/net/sched/sch_tbf.c
index
78e7902
..
6eb1700
100644
(file)
--- a/
net/sched/sch_tbf.c
+++ b/
net/sched/sch_tbf.c
@@
-342,6
+342,7
@@
static int tbf_change(struct Qdisc *sch, struct nlattr *opt,
struct nlattr *tb[TCA_TBF_MAX + 1];
struct tc_tbf_qopt *qopt;
struct Qdisc *child = NULL;
+ struct Qdisc *old = NULL;
struct psched_ratecfg rate;
struct psched_ratecfg peak;
u64 max_size;
@@
-433,7
+434,7
@@
static int tbf_change(struct Qdisc *sch, struct nlattr *opt,
sch_tree_lock(sch);
if (child) {
qdisc_tree_flush_backlog(q->qdisc);
-
qdisc_put(q->qdisc)
;
+
old = q->qdisc
;
q->qdisc = child;
}
q->limit = qopt->limit;
@@
-453,6
+454,7
@@
static int tbf_change(struct Qdisc *sch, struct nlattr *opt,
memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
sch_tree_unlock(sch);
+ qdisc_put(old);
err = 0;
tbf_offload_change(sch);