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 9303d2a..48ed87b 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 e782b41..c58a533 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 353787a..63f725a 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 888a29e..6b3cecb 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)