Skip to content

Commit 95dc192

Browse files
Eric Dumazetdavem330
Eric Dumazet
authored andcommitted
pkt_sched: give visibility to mq slave qdiscs
Commit 6da7c8f ("qdisc: allow setting default queuing discipline") added the ability to change default qdisc from pfifo_fast to say fq But as most modern ethernet devices are multiqueue, we cant really see all the statistics from "tc -s qdisc show", as the default root qdisc is mq. This patch adds the calls to qdisc_list_add() to mq and mqprio Signed-off-by: Eric Dumazet <[email protected]> Cc: Stephen Hemminger <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fbec370 commit 95dc192

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

include/net/pkt_sched.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ int unregister_qdisc(struct Qdisc_ops *qops);
8888
void qdisc_get_default(char *id, size_t len);
8989
int qdisc_set_default(const char *id);
9090

91+
void qdisc_list_add(struct Qdisc *q);
9192
void qdisc_list_del(struct Qdisc *q);
9293
struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
9394
struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);

net/sched/sch_api.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,12 @@ static struct Qdisc *qdisc_match_from_root(struct Qdisc *root, u32 handle)
271271
return NULL;
272272
}
273273

274-
static void qdisc_list_add(struct Qdisc *q)
274+
void qdisc_list_add(struct Qdisc *q)
275275
{
276276
if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS))
277277
list_add_tail(&q->list, &qdisc_dev(q)->qdisc->list);
278278
}
279+
EXPORT_SYMBOL(qdisc_list_add);
279280

280281
void qdisc_list_del(struct Qdisc *q)
281282
{

net/sched/sch_mq.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,19 @@ static void mq_attach(struct Qdisc *sch)
7878
{
7979
struct net_device *dev = qdisc_dev(sch);
8080
struct mq_sched *priv = qdisc_priv(sch);
81-
struct Qdisc *qdisc;
81+
struct Qdisc *qdisc, *old;
8282
unsigned int ntx;
8383

8484
for (ntx = 0; ntx < dev->num_tx_queues; ntx++) {
8585
qdisc = priv->qdiscs[ntx];
86-
qdisc = dev_graft_qdisc(qdisc->dev_queue, qdisc);
87-
if (qdisc)
88-
qdisc_destroy(qdisc);
86+
old = dev_graft_qdisc(qdisc->dev_queue, qdisc);
87+
if (old)
88+
qdisc_destroy(old);
89+
#ifdef CONFIG_NET_SCHED
90+
if (ntx < dev->real_num_tx_queues)
91+
qdisc_list_add(qdisc);
92+
#endif
93+
8994
}
9095
kfree(priv->qdiscs);
9196
priv->qdiscs = NULL;

net/sched/sch_mqprio.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,17 @@ static void mqprio_attach(struct Qdisc *sch)
167167
{
168168
struct net_device *dev = qdisc_dev(sch);
169169
struct mqprio_sched *priv = qdisc_priv(sch);
170-
struct Qdisc *qdisc;
170+
struct Qdisc *qdisc, *old;
171171
unsigned int ntx;
172172

173173
/* Attach underlying qdisc */
174174
for (ntx = 0; ntx < dev->num_tx_queues; ntx++) {
175175
qdisc = priv->qdiscs[ntx];
176-
qdisc = dev_graft_qdisc(qdisc->dev_queue, qdisc);
177-
if (qdisc)
178-
qdisc_destroy(qdisc);
176+
old = dev_graft_qdisc(qdisc->dev_queue, qdisc);
177+
if (old)
178+
qdisc_destroy(old);
179+
if (ntx < dev->real_num_tx_queues)
180+
qdisc_list_add(qdisc);
179181
}
180182
kfree(priv->qdiscs);
181183
priv->qdiscs = NULL;

0 commit comments

Comments
 (0)