net/sched: refactor mqprio qopt reconstruction to a library function
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sat, 4 Feb 2023 13:53:02 +0000 (15:53 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 Feb 2023 10:06:44 +0000 (10:06 +0000)
The taprio qdisc will need to reconstruct a struct tc_mqprio_qopt from
netdev settings once more in a future patch, but this code was already
written twice, once in taprio and once in mqprio.

Refactor the code to a helper in the common mqprio library.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_mqprio.c
net/sched/sch_mqprio_lib.c
net/sched/sch_mqprio_lib.h
net/sched/sch_taprio.c

index 9303d2a1e84037ebc0bc0c946c936adc5a43ec5d..48ed87b91086e5aa28d99c2504b06c660df06382 100644 (file)
@@ -406,7 +406,7 @@ static int mqprio_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct nlattr *nla = (struct nlattr *)skb_tail_pointer(skb);
        struct tc_mqprio_qopt opt = { 0 };
        struct Qdisc *qdisc;
-       unsigned int ntx, tc;
+       unsigned int ntx;
 
        sch->q.qlen = 0;
        gnet_stats_basic_sync_init(&sch->bstats);
@@ -430,15 +430,9 @@ static int mqprio_dump(struct Qdisc *sch, struct sk_buff *skb)
                spin_unlock_bh(qdisc_lock(qdisc));
        }
 
-       opt.num_tc = netdev_get_num_tc(dev);
-       memcpy(opt.prio_tc_map, dev->prio_tc_map, sizeof(opt.prio_tc_map));
+       mqprio_qopt_reconstruct(dev, &opt);
        opt.hw = priv->hw_offload;
 
-       for (tc = 0; tc < netdev_get_num_tc(dev); tc++) {
-               opt.count[tc] = dev->tc_to_txq[tc].count;
-               opt.offset[tc] = dev->tc_to_txq[tc].offset;
-       }
-
        if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt))
                goto nla_put_failure;
 
index e782b412a00079f043099d520f8d03f31f62e30b..c58a533b8ec588d42474a8f9a0102a8a1d7688d1 100644 (file)
@@ -100,4 +100,18 @@ int mqprio_validate_qopt(struct net_device *dev, struct tc_mqprio_qopt *qopt,
 }
 EXPORT_SYMBOL_GPL(mqprio_validate_qopt);
 
+void mqprio_qopt_reconstruct(struct net_device *dev, struct tc_mqprio_qopt *qopt)
+{
+       int tc, num_tc = netdev_get_num_tc(dev);
+
+       qopt->num_tc = num_tc;
+       memcpy(qopt->prio_tc_map, dev->prio_tc_map, sizeof(qopt->prio_tc_map));
+
+       for (tc = 0; tc < num_tc; tc++) {
+               qopt->count[tc] = dev->tc_to_txq[tc].count;
+               qopt->offset[tc] = dev->tc_to_txq[tc].offset;
+       }
+}
+EXPORT_SYMBOL_GPL(mqprio_qopt_reconstruct);
+
 MODULE_LICENSE("GPL");
index 353787a25648a5766e2d247b6a5893ee455db4c0..63f725ab8761639fc0ab169fb71b3267fb6ac1ec 100644 (file)
@@ -12,5 +12,7 @@ int mqprio_validate_qopt(struct net_device *dev, struct tc_mqprio_qopt *qopt,
                         bool validate_queue_counts,
                         bool allow_overlapping_txqs,
                         struct netlink_ext_ack *extack);
+void mqprio_qopt_reconstruct(struct net_device *dev,
+                            struct tc_mqprio_qopt *qopt);
 
 #endif
index 888a29ee1da6a5e226619122ec247ed85fbe1fca..6b3cecbe9f1f4c7dc5d71b9c62769fa04dd8e8a2 100644 (file)
@@ -1948,18 +1948,11 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct sched_gate_list *oper, *admin;
        struct tc_mqprio_qopt opt = { 0 };
        struct nlattr *nest, *sched_nest;
-       unsigned int i;
 
        oper = rtnl_dereference(q->oper_sched);
        admin = rtnl_dereference(q->admin_sched);
 
-       opt.num_tc = netdev_get_num_tc(dev);
-       memcpy(opt.prio_tc_map, dev->prio_tc_map, sizeof(opt.prio_tc_map));
-
-       for (i = 0; i < netdev_get_num_tc(dev); i++) {
-               opt.count[i] = dev->tc_to_txq[i].count;
-               opt.offset[i] = dev->tc_to_txq[i].offset;
-       }
+       mqprio_qopt_reconstruct(dev, &opt);
 
        nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
        if (!nest)