[TCA_MQPRIO_MAX_RATE64] = { .type = NLA_NESTED },
 };
 
-static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
-                     const struct nla_policy *policy, int len)
-{
-       int nested_len = nla_len(nla) - NLA_ALIGN(len);
-
-       if (nested_len >= nla_attr_size(0))
-               return nla_parse_deprecated(tb, maxtype,
-                                           nla_data(nla) + NLA_ALIGN(len),
-                                           nested_len, policy, NULL);
-
-       memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
-       return 0;
-}
-
+/* Parse the other netlink attributes that represent the payload of
+ * TCA_OPTIONS, which are appended right after struct tc_mqprio_qopt.
+ */
 static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt,
                               struct nlattr *opt)
 {
+       struct nlattr *nlattr_opt = nla_data(opt) + NLA_ALIGN(sizeof(*qopt));
+       int nlattr_opt_len = nla_len(opt) - NLA_ALIGN(sizeof(*qopt));
        struct mqprio_sched *priv = qdisc_priv(sch);
-       struct nlattr *tb[TCA_MQPRIO_MAX + 1];
+       struct nlattr *tb[TCA_MQPRIO_MAX + 1] = {};
        struct nlattr *attr;
        int i, rem, err;
 
-       err = parse_attr(tb, TCA_MQPRIO_MAX, opt, mqprio_policy,
-                        sizeof(*qopt));
-       if (err < 0)
-               return err;
+       if (nlattr_opt_len >= nla_attr_size(0)) {
+               err = nla_parse_deprecated(tb, TCA_MQPRIO_MAX, nlattr_opt,
+                                          nlattr_opt_len, mqprio_policy,
+                                          NULL);
+               if (err < 0)
+                       return err;
+       }
 
        if (!qopt->hw)
                return -EINVAL;