aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2023-02-20 08:46:59 +0100
committerPaolo Abeni <pabeni@redhat.com>2023-02-20 08:46:59 +0100
commitb148d400f820637bcc95f6aca64c8763a2db858f (patch)
tree25a035e2be7cb279ca8ac7d20c00ed95b9218baf
parentc078381856230f1e8e13738661d83c2b4b433819 (diff)
parent64cb6aad12328015202af5b2a9623c6bcc021855 (diff)
downloadwpan-next-b148d400f820637bcc95f6aca64c8763a2db858f.tar.gz
Merge branch 'taprio-queuemaxsdu-fixes'
Vladimir Oltean says: ==================== taprio queueMaxSDU fixes This fixes 3 issues noticed while attempting to reoffload the dynamically calculated queueMaxSDU values. These are: - Dynamic queueMaxSDU is not calculated correctly due to a lost patch - Dynamically calculated queueMaxSDU needs to be clamped on the low end - Dynamically calculated queueMaxSDU needs to be clamped on the high end ==================== Link: https://lore.kernel.org/r/20230215224632.2532685-1-vladimir.oltean@nxp.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r--net/sched/sch_taprio.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
index 9781b47962bbde..1f469861eae327 100644
--- a/net/sched/sch_taprio.c
+++ b/net/sched/sch_taprio.c
@@ -279,9 +279,17 @@ static void taprio_update_queue_max_sdu(struct taprio_sched *q,
u32 max_frm_len;
max_frm_len = duration_to_length(q, sched->max_open_gate_duration[tc]);
- if (stab)
+ /* Compensate for L1 overhead from size table,
+ * but don't let the frame size go negative
+ */
+ if (stab) {
max_frm_len -= stab->szopts.overhead;
+ max_frm_len = max_t(int, max_frm_len,
+ dev->hard_header_len + 1);
+ }
max_sdu_dynamic = max_frm_len - dev->hard_header_len;
+ if (max_sdu_dynamic > dev->max_mtu)
+ max_sdu_dynamic = U32_MAX;
}
max_sdu = min(max_sdu_dynamic, max_sdu_from_user);
@@ -1833,23 +1841,6 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
goto free_sched;
}
- err = parse_taprio_schedule(q, tb, new_admin, extack);
- if (err < 0)
- goto free_sched;
-
- if (new_admin->num_entries == 0) {
- NL_SET_ERR_MSG(extack, "There should be at least one entry in the schedule");
- err = -EINVAL;
- goto free_sched;
- }
-
- err = taprio_parse_clockid(sch, tb, extack);
- if (err < 0)
- goto free_sched;
-
- taprio_set_picos_per_byte(dev, q);
- taprio_update_queue_max_sdu(q, new_admin, stab);
-
if (mqprio) {
err = netdev_set_num_tc(dev, mqprio->num_tc);
if (err)
@@ -1867,6 +1858,23 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
mqprio->prio_tc_map[i]);
}
+ err = parse_taprio_schedule(q, tb, new_admin, extack);
+ if (err < 0)
+ goto free_sched;
+
+ if (new_admin->num_entries == 0) {
+ NL_SET_ERR_MSG(extack, "There should be at least one entry in the schedule");
+ err = -EINVAL;
+ goto free_sched;
+ }
+
+ err = taprio_parse_clockid(sch, tb, extack);
+ if (err < 0)
+ goto free_sched;
+
+ taprio_set_picos_per_byte(dev, q);
+ taprio_update_queue_max_sdu(q, new_admin, stab);
+
if (FULL_OFFLOAD_IS_ENABLED(q->flags))
err = taprio_enable_offload(dev, q, new_admin, extack);
else