]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/sched/sch_taprio.c
Merge branch 'imm.timestamp' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux.git] / net / sched / sch_taprio.c
index 7cd68628c637d6ac9e0dc00ce450ea945e5320bc..c609373c8661816fea3fd242ce8680dfb306f83f 100644 (file)
@@ -922,7 +922,7 @@ static int taprio_parse_mqprio_opt(struct net_device *dev,
        }
 
        /* Verify priority mapping uses valid tcs */
-       for (i = 0; i < TC_BITMASK + 1; i++) {
+       for (i = 0; i <= TC_BITMASK; i++) {
                if (qopt->prio_tc_map[i] >= qopt->num_tc) {
                        NL_SET_ERR_MSG(extack, "Invalid traffic class in priority to traffic class mapping");
                        return -EINVAL;
@@ -1347,6 +1347,26 @@ static int taprio_parse_clockid(struct Qdisc *sch, struct nlattr **tb,
        return err;
 }
 
+static int taprio_mqprio_cmp(const struct net_device *dev,
+                            const struct tc_mqprio_qopt *mqprio)
+{
+       int i;
+
+       if (!mqprio || mqprio->num_tc != dev->num_tc)
+               return -1;
+
+       for (i = 0; i < mqprio->num_tc; i++)
+               if (dev->tc_to_txq[i].count != mqprio->count[i] ||
+                   dev->tc_to_txq[i].offset != mqprio->offset[i])
+                       return -1;
+
+       for (i = 0; i <= TC_BITMASK; i++)
+               if (dev->prio_tc_map[i] != mqprio->prio_tc_map[i])
+                       return -1;
+
+       return 0;
+}
+
 static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
                         struct netlink_ext_ack *extack)
 {
@@ -1398,6 +1418,10 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
        admin = rcu_dereference(q->admin_sched);
        rcu_read_unlock();
 
+       /* no changes - no new mqprio settings */
+       if (!taprio_mqprio_cmp(dev, mqprio))
+               mqprio = NULL;
+
        if (mqprio && (oper || admin)) {
                NL_SET_ERR_MSG(extack, "Changing the traffic mapping of a running schedule is not supported");
                err = -ENOTSUPP;
@@ -1455,7 +1479,7 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
                                            mqprio->offset[i]);
 
                /* Always use supplied priority mappings */
-               for (i = 0; i < TC_BITMASK + 1; i++)
+               for (i = 0; i <= TC_BITMASK; i++)
                        netdev_set_prio_tc_map(dev, i,
                                               mqprio->prio_tc_map[i]);
        }