]> git.baikalelectronics.ru Git - kernel.git/commit
Revert "net: sched: fq_codel: remove redundant resource cleanup in fq_codel_init()"
authorZhengchao Shao <shaozhengchao@huawei.com>
Tue, 18 Oct 2022 06:32:00 +0000 (14:32 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Oct 2022 12:47:09 +0000 (13:47 +0100)
commitf2198556b0b1a89ce3e8eaa1ceeb7c476d67c7e8
tree656555e0d9a2b09063ebed6d79b9e2d90bc0a7d6
parent89ebf0372985dc0476a04df1ead7fb679f73352b
Revert "net: sched: fq_codel: remove redundant resource cleanup in fq_codel_init()"

This reverts commit 1f8f1bc789135099c7088a163e425cb54479f3df.

When the default qdisc is fq_codel, if the qdisc of dev_queue fails to be
inited during mqprio_init(), fq_codel_reset() is invoked to clear
resources. In this case, the flow is NULL, and it will cause gpf issue.

The process is as follows:
qdisc_create_dflt()
fq_codel_init()
...
q->flows_cnt = 1024;
...
q->flows = kvcalloc(...)      --->failed, q->flows is NULL
...
qdisc_put()
...
fq_codel_reset()
...
flow = q->flows + i   --->q->flows is NULL

The following is the Call Trace information:
general protection fault, probably for non-canonical address
0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
RIP: 0010:fq_codel_reset+0x14d/0x350
Call Trace:
<TASK>
qdisc_reset+0xed/0x6f0
qdisc_destroy+0x82/0x4c0
qdisc_put+0x9e/0xb0
qdisc_create_dflt+0x2c3/0x4a0
mqprio_init+0xa71/0x1760
qdisc_create+0x3eb/0x1000
tc_modify_qdisc+0x408/0x1720
rtnetlink_rcv_msg+0x38e/0xac0
netlink_rcv_skb+0x12d/0x3a0
netlink_unicast+0x4a2/0x740
netlink_sendmsg+0x826/0xcc0
sock_sendmsg+0xc5/0x100
____sys_sendmsg+0x583/0x690
___sys_sendmsg+0xe8/0x160
__sys_sendmsg+0xbf/0x160
do_syscall_64+0x35/0x80
entry_SYSCALL_64_after_hwframe+0x46/0xb0
RIP: 0033:0x7fd272b22d04
</TASK>

Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_fq_codel.c