From: Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
To: Vladimir Oltean <vladimir.oltean@nxp.com>,
Vinicius Costa Gomes <vinicius.gomes@intel.com>,
Jamal Hadi Salim <jhs@mojatatu.com>,
Cong Wang <xiyou.wangcong@gmail.com>,
Jiri Pirko <jiri@resnulli.us>,
"David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2 net 7/7] net/sched: taprio: enable cycle time adjustment for current entry
Date: Tue, 7 Nov 2023 06:20:23 -0500 [thread overview]
Message-ID: <20231107112023.676016-8-faizal.abdul.rahim@linux.intel.com> (raw)
In-Reply-To: <20231107112023.676016-1-faizal.abdul.rahim@linux.intel.com>
Handles cycle time adjustments for the current active entry
when new admin base time occurs quickly, either within the
current entry or the next one.
Changes covers:
1. Negative cycle correction or truncation
Occurs when the new admin base time falls before the expiry of the
current running entry.
2. Positive cycle correction or extension
Occurs when the new admin base time falls within the next entry,
and the current entry is the cycle's last entry. In this case, the
changes in taprio_start_sched() extends the schedule, preventing
old oper schedule from resuming and getting truncated in the next
advance_sched() call.
3. A new API, update_gate_close_time(), has been created to update
the gate_close_time of the current entry in the event of cycle
correction.
Signed-off-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
---
net/sched/sch_taprio.c | 72 +++++++++++++++++++++++++++++++-----------
1 file changed, 53 insertions(+), 19 deletions(-)
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
index c60e9e7ac193..56743754d42e 100644
--- a/net/sched/sch_taprio.c
+++ b/net/sched/sch_taprio.c
@@ -1379,41 +1379,75 @@ static void setup_first_end_time(struct taprio_sched *q,
rcu_assign_pointer(q->current_entry, NULL);
}
+static void update_gate_close_time(struct sched_entry *current_entry,
+ ktime_t new_end_time,
+ int num_tc)
+{
+ int tc;
+
+ for (tc = 0; tc < num_tc; tc++) {
+ if (current_entry->gate_mask & BIT(tc))
+ current_entry->gate_close_time[tc] = new_end_time;
+ }
+}
+
static void taprio_start_sched(struct Qdisc *sch,
ktime_t new_base_time,
- struct sched_gate_list *new)
+ struct sched_gate_list *admin)
{
struct taprio_sched *q = qdisc_priv(sch);
+ ktime_t expires = hrtimer_get_expires(&q->advance_timer);
+ struct net_device *dev = qdisc_dev(q->root);
+ struct sched_entry *curr_entry = NULL;
struct sched_gate_list *oper = NULL;
- ktime_t expires, start;
if (FULL_OFFLOAD_IS_ENABLED(q->flags))
return;
oper = rcu_dereference_protected(q->oper_sched,
lockdep_is_held(&q->current_entry_lock));
+ curr_entry = rcu_dereference_protected(q->current_entry,
+ lockdep_is_held(&q->current_entry_lock));
- expires = hrtimer_get_expires(&q->advance_timer);
- if (expires == 0)
- expires = KTIME_MAX;
+ if (hrtimer_active(&q->advance_timer)) {
+ oper->cycle_time_correction =
+ get_cycle_time_correction(oper, new_base_time,
+ curr_entry->end_time,
+ curr_entry);
- /* If the new schedule starts before the next expiration, we
- * reprogram it to the earliest one, so we change the admin
- * schedule to the operational one at the right time.
- */
- start = min_t(ktime_t, new_base_time, expires);
-
- if (expires != KTIME_MAX &&
- ktime_compare(start, new_base_time) == 0) {
- /* Since timer was changed to align to the new admin schedule,
- * setting the variable below to a non-initialized value will
- * indicate to advance_sched() to call switch_schedules() after
- * this timer expires.
+ if (cycle_corr_active(oper->cycle_time_correction)) {
+ /* This is the last entry we are running from oper,
+ * subsequent entry will take from the new admin.
+ */
+ ktime_t now = taprio_get_time(q);
+ u64 gate_duration_left = ktime_sub(new_base_time, now);
+ struct qdisc_size_table *stab =
+ rtnl_dereference(q->root->stab);
+ int num_tc = netdev_get_num_tc(dev);
+
+ oper->cycle_end_time = new_base_time;
+ curr_entry->end_time = new_base_time;
+ curr_entry->correction_active = true;
+
+ update_open_gate_duration(curr_entry, oper, num_tc,
+ gate_duration_left);
+ update_gate_close_time(curr_entry, new_base_time, num_tc);
+ taprio_update_queue_max_sdu(q, oper, stab);
+ taprio_set_budgets(q, oper, curr_entry);
+ }
+ }
+
+ if (!hrtimer_active(&q->advance_timer) ||
+ cycle_corr_active(oper->cycle_time_correction)) {
+ /* Use new admin base time if :
+ * 1. there's no active oper
+ * 2. there's active oper and we will change to the new admin
+ * schedule after the current entry from oper ends
*/
- oper->cycle_time_correction = 0;
+ expires = new_base_time;
}
- hrtimer_start(&q->advance_timer, start, HRTIMER_MODE_ABS);
+ hrtimer_start(&q->advance_timer, expires, HRTIMER_MODE_ABS);
}
static void taprio_set_picos_per_byte(struct net_device *dev,
--
2.25.1
next prev parent reply other threads:[~2023-11-07 11:22 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-07 11:20 [PATCH v2 net 0/7] qbv cycle time extension/truncation Faizal Rahim
2023-11-07 11:20 ` [PATCH v2 net 1/7] net/sched: taprio: fix too early schedules switching Faizal Rahim
2023-11-08 22:27 ` Vladimir Oltean
2023-11-15 11:54 ` Abdul Rahim, Faizal
2023-11-12 10:31 ` Simon Horman
2023-11-16 5:59 ` Abdul Rahim, Faizal
2023-11-07 11:20 ` [PATCH v2 net 2/7] net/sched: taprio: fix cycle time adjustment for next entry Faizal Rahim
2023-11-08 23:20 ` Vladimir Oltean
2023-11-15 11:55 ` Abdul Rahim, Faizal
2023-11-07 11:20 ` [PATCH v2 net 3/7] net/sched: taprio: update impacted fields during cycle time adjustment Faizal Rahim
2023-11-08 23:41 ` Vladimir Oltean
2023-11-15 11:55 ` Abdul Rahim, Faizal
2023-11-07 11:20 ` [PATCH v2 net 4/7] net/sched: taprio: get corrected value of cycle_time and interval Faizal Rahim
2023-11-07 22:45 ` kernel test robot
2023-11-09 11:11 ` Vladimir Oltean
2023-11-15 11:55 ` Abdul Rahim, Faizal
2023-11-17 2:36 ` Vinicius Costa Gomes
2023-11-09 12:01 ` Vladimir Oltean
2023-11-10 19:15 ` kernel test robot
2023-11-07 11:20 ` [PATCH v2 net 5/7] net/sched: taprio: fix delayed switching to new schedule after timer expiry Faizal Rahim
2023-11-09 11:50 ` Vladimir Oltean
2023-11-15 11:56 ` Abdul Rahim, Faizal
2023-11-09 12:24 ` Vladimir Oltean
2023-11-07 11:20 ` [PATCH v2 net 6/7] net/sched: taprio: fix q->current_entry is NULL before its expiry Faizal Rahim
2023-11-09 11:55 ` Vladimir Oltean
2023-11-15 11:56 ` Abdul Rahim, Faizal
2023-11-07 11:20 ` Faizal Rahim [this message]
2023-11-09 13:18 ` [PATCH v2 net 7/7] net/sched: taprio: enable cycle time adjustment for current entry Vladimir Oltean
2023-11-15 11:57 ` Abdul Rahim, Faizal
2023-11-08 15:51 ` [PATCH v2 net 0/7] qbv cycle time extension/truncation Vladimir Oltean
2023-11-10 11:06 ` Abdul Rahim, Faizal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231107112023.676016-8-faizal.abdul.rahim@linux.intel.com \
--to=faizal.abdul.rahim@linux.intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=vinicius.gomes@intel.com \
--cc=vladimir.oltean@nxp.com \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox