Commit efb55222 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller
Browse files

taprio: Fix kernel panic in taprio_destroy

taprio_init may fail earlier than this line:

	list_add(&q->taprio_list, &taprio_list);

i.e. due to the net device not being multi queue.

Attempting to remove q from the global taprio_list when it is not part
of it will result in a kernel panic.

Fix it by matching list_add and list_del better to one another in the
order of operations. This way we can keep the deletion unconditional
and with lower complexity - O(1).

Cc: Leandro Dorileo <>
Fixes: 7b9eba7b

 ("net/sched: taprio: fix picos_per_byte miscalculation")
Signed-off-by: default avatarVladimir Oltean <>
Acked-by: default avatarVinicius Costa Gomes <>
Signed-off-by: default avatarDavid S. Miller <>
parent 5f81d545
......@@ -1249,6 +1249,10 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt,
q->clockid = -1;
list_add(&q->taprio_list, &taprio_list);
if (sch->parent != TC_H_ROOT)
......@@ -1266,10 +1270,6 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt,
if (!opt)
return -EINVAL;
list_add(&q->taprio_list, &taprio_list);
for (i = 0; i < dev->num_tx_queues; i++) {
struct netdev_queue *dev_queue;
struct Qdisc *qdisc;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment