diff mbox series

[RFC,net-next,1/6] Revert "Merge branch 'net-sched-Add-txtime-assist-support-for-taprio'"

Message ID 20190707172921.17731-2-olteanv@gmail.com
State RFC
Delegated to: David Miller
Headers show
Series tc-taprio offload for SJA1105 DSA | expand

Commit Message

Vladimir Oltean July 7, 2019, 5:29 p.m. UTC
This reverts commit 0a7960c7922228ca975ca4c5595e5539fc8f8b79, reversing
changes made to 8747d82d3c32df488ea0fe9b86bdb53a8a04a7b8.

This returns the tc-taprio state to where it was when Voon Weifeng
<weifeng.voon@intel.com> had resent Vinicius Costa Gomes
<vinicius.gomes@intel.com>'s patch "taprio: Add support for hardware
offloading" (also resent by me in this series).

There are conflicts within the two that would otherwise propagate all
the way up to iproute2. I don't want to redefine yet a third userspace
interface, hence simply reverting the txtime-assist patches for review
purposes of taprio offload.

Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
---
 drivers/net/ethernet/intel/igb/igb_main.c |   1 -
 include/uapi/linux/pkt_sched.h            |   9 +-
 net/sched/sch_etf.c                       |  10 -
 net/sched/sch_taprio.c                    | 421 ++--------------------
 4 files changed, 36 insertions(+), 405 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index f66dae72fe37..fc925adbd9fa 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -5688,7 +5688,6 @@  static void igb_tx_ctxtdesc(struct igb_ring *tx_ring,
 	 */
 	if (tx_ring->launchtime_enable) {
 		ts = ns_to_timespec64(first->skb->tstamp);
-		first->skb->tstamp = 0;
 		context_desc->seqnum_seed = cpu_to_le32(ts.tv_nsec / 32);
 	} else {
 		context_desc->seqnum_seed = 0;
diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
index 390efb54b2e0..8b2f993cbb77 100644
--- a/include/uapi/linux/pkt_sched.h
+++ b/include/uapi/linux/pkt_sched.h
@@ -988,9 +988,8 @@  struct tc_etf_qopt {
 	__s32 delta;
 	__s32 clockid;
 	__u32 flags;
-#define TC_ETF_DEADLINE_MODE_ON	_BITUL(0)
-#define TC_ETF_OFFLOAD_ON	_BITUL(1)
-#define TC_ETF_SKIP_SOCK_CHECK	_BITUL(2)
+#define TC_ETF_DEADLINE_MODE_ON	BIT(0)
+#define TC_ETF_OFFLOAD_ON	BIT(1)
 };
 
 enum {
@@ -1159,8 +1158,6 @@  enum {
  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_INTERVAL]
  */
 
-#define TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST 0x1
-
 enum {
 	TCA_TAPRIO_ATTR_UNSPEC,
 	TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */
@@ -1172,8 +1169,6 @@  enum {
 	TCA_TAPRIO_ATTR_ADMIN_SCHED, /* The admin sched, only used in dump */
 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */
 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */
-	TCA_TAPRIO_ATTR_FLAGS, /* u32 */
-	TCA_TAPRIO_ATTR_TXTIME_DELAY, /* s32 */
 	__TCA_TAPRIO_ATTR_MAX,
 };
 
diff --git a/net/sched/sch_etf.c b/net/sched/sch_etf.c
index cebfb65d8556..db0c2ba1d156 100644
--- a/net/sched/sch_etf.c
+++ b/net/sched/sch_etf.c
@@ -22,12 +22,10 @@ 
 
 #define DEADLINE_MODE_IS_ON(x) ((x)->flags & TC_ETF_DEADLINE_MODE_ON)
 #define OFFLOAD_IS_ON(x) ((x)->flags & TC_ETF_OFFLOAD_ON)
-#define SKIP_SOCK_CHECK_IS_SET(x) ((x)->flags & TC_ETF_SKIP_SOCK_CHECK)
 
 struct etf_sched_data {
 	bool offload;
 	bool deadline_mode;
-	bool skip_sock_check;
 	int clockid;
 	int queue;
 	s32 delta; /* in ns */
@@ -79,9 +77,6 @@  static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb)
 	struct sock *sk = nskb->sk;
 	ktime_t now;
 
-	if (q->skip_sock_check)
-		goto skip;
-
 	if (!sk)
 		return false;
 
@@ -97,7 +92,6 @@  static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb)
 	if (sk->sk_txtime_deadline_mode != q->deadline_mode)
 		return false;
 
-skip:
 	now = q->get_time();
 	if (ktime_before(txtime, now) || ktime_before(txtime, q->last))
 		return false;
@@ -391,7 +385,6 @@  static int etf_init(struct Qdisc *sch, struct nlattr *opt,
 	q->clockid = qopt->clockid;
 	q->offload = OFFLOAD_IS_ON(qopt);
 	q->deadline_mode = DEADLINE_MODE_IS_ON(qopt);
-	q->skip_sock_check = SKIP_SOCK_CHECK_IS_SET(qopt);
 
 	switch (q->clockid) {
 	case CLOCK_REALTIME:
@@ -480,9 +473,6 @@  static int etf_dump(struct Qdisc *sch, struct sk_buff *skb)
 	if (q->deadline_mode)
 		opt.flags |= TC_ETF_DEADLINE_MODE_ON;
 
-	if (q->skip_sock_check)
-		opt.flags |= TC_ETF_SKIP_SOCK_CHECK;
-
 	if (nla_put(skb, TCA_ETF_PARMS, sizeof(opt), &opt))
 		goto nla_put_failure;
 
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
index 388750ddc57a..9ecfb8f5902a 100644
--- a/net/sched/sch_taprio.c
+++ b/net/sched/sch_taprio.c
@@ -21,17 +21,12 @@ 
 #include <net/pkt_sched.h>
 #include <net/pkt_cls.h>
 #include <net/sch_generic.h>
-#include <net/sock.h>
-#include <net/tcp.h>
 
 static LIST_HEAD(taprio_list);
 static DEFINE_SPINLOCK(taprio_list_lock);
 
 #define TAPRIO_ALL_GATES_OPEN -1
 
-#define FLAGS_VALID(flags) (!((flags) & ~TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST))
-#define TXTIME_ASSIST_IS_ENABLED(flags) ((flags) & TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST)
-
 struct sched_entry {
 	struct list_head list;
 
@@ -40,7 +35,6 @@  struct sched_entry {
 	 * packet leaves after this time.
 	 */
 	ktime_t close_time;
-	ktime_t next_txtime;
 	atomic_t budget;
 	int index;
 	u32 gate_mask;
@@ -61,8 +55,6 @@  struct sched_gate_list {
 struct taprio_sched {
 	struct Qdisc **qdiscs;
 	struct Qdisc *root;
-	u32 flags;
-	enum tk_offsets tk_offset;
 	int clockid;
 	atomic64_t picos_per_byte; /* Using picoseconds because for 10Gbps+
 				    * speeds it's sub-nanoseconds per byte
@@ -73,9 +65,9 @@  struct taprio_sched {
 	struct sched_entry __rcu *current_entry;
 	struct sched_gate_list __rcu *oper_sched;
 	struct sched_gate_list __rcu *admin_sched;
+	ktime_t (*get_time)(void);
 	struct hrtimer advance_timer;
 	struct list_head taprio_list;
-	int txtime_delay;
 };
 
 static ktime_t sched_base_time(const struct sched_gate_list *sched)
@@ -86,20 +78,6 @@  static ktime_t sched_base_time(const struct sched_gate_list *sched)
 	return ns_to_ktime(sched->base_time);
 }
 
-static ktime_t taprio_get_time(struct taprio_sched *q)
-{
-	ktime_t mono = ktime_get();
-
-	switch (q->tk_offset) {
-	case TK_OFFS_MAX:
-		return mono;
-	default:
-		return ktime_mono_to_any(mono, q->tk_offset);
-	}
-
-	return KTIME_MAX;
-}
-
 static void taprio_free_sched_cb(struct rcu_head *head)
 {
 	struct sched_gate_list *sched = container_of(head, struct sched_gate_list, rcu);
@@ -130,263 +108,20 @@  static void switch_schedules(struct taprio_sched *q,
 	*admin = NULL;
 }
 
-/* Get how much time has been already elapsed in the current cycle. */
-static s32 get_cycle_time_elapsed(struct sched_gate_list *sched, ktime_t time)
-{
-	ktime_t time_since_sched_start;
-	s32 time_elapsed;
-
-	time_since_sched_start = ktime_sub(time, sched->base_time);
-	div_s64_rem(time_since_sched_start, sched->cycle_time, &time_elapsed);
-
-	return time_elapsed;
-}
-
-static ktime_t get_interval_end_time(struct sched_gate_list *sched,
-				     struct sched_gate_list *admin,
-				     struct sched_entry *entry,
-				     ktime_t intv_start)
-{
-	s32 cycle_elapsed = get_cycle_time_elapsed(sched, intv_start);
-	ktime_t intv_end, cycle_ext_end, cycle_end;
-
-	cycle_end = ktime_add_ns(intv_start, sched->cycle_time - cycle_elapsed);
-	intv_end = ktime_add_ns(intv_start, entry->interval);
-	cycle_ext_end = ktime_add(cycle_end, sched->cycle_time_extension);
-
-	if (ktime_before(intv_end, cycle_end))
-		return intv_end;
-	else if (admin && admin != sched &&
-		 ktime_after(admin->base_time, cycle_end) &&
-		 ktime_before(admin->base_time, cycle_ext_end))
-		return admin->base_time;
-	else
-		return cycle_end;
-}
-
-static int length_to_duration(struct taprio_sched *q, int len)
-{
-	return div_u64(len * atomic64_read(&q->picos_per_byte), 1000);
-}
-
-/* Returns the entry corresponding to next available interval. If
- * validate_interval is set, it only validates whether the timestamp occurs
- * when the gate corresponding to the skb's traffic class is open.
- */
-static struct sched_entry *find_entry_to_transmit(struct sk_buff *skb,
-						  struct Qdisc *sch,
-						  struct sched_gate_list *sched,
-						  struct sched_gate_list *admin,
-						  ktime_t time,
-						  ktime_t *interval_start,
-						  ktime_t *interval_end,
-						  bool validate_interval)
-{
-	ktime_t curr_intv_start, curr_intv_end, cycle_end, packet_transmit_time;
-	ktime_t earliest_txtime = KTIME_MAX, txtime, cycle, transmit_end_time;
-	struct sched_entry *entry = NULL, *entry_found = NULL;
-	struct taprio_sched *q = qdisc_priv(sch);
-	struct net_device *dev = qdisc_dev(sch);
-	bool entry_available = false;
-	s32 cycle_elapsed;
-	int tc, n;
-
-	tc = netdev_get_prio_tc_map(dev, skb->priority);
-	packet_transmit_time = length_to_duration(q, qdisc_pkt_len(skb));
-
-	*interval_start = 0;
-	*interval_end = 0;
-
-	if (!sched)
-		return NULL;
-
-	cycle = sched->cycle_time;
-	cycle_elapsed = get_cycle_time_elapsed(sched, time);
-	curr_intv_end = ktime_sub_ns(time, cycle_elapsed);
-	cycle_end = ktime_add_ns(curr_intv_end, cycle);
-
-	list_for_each_entry(entry, &sched->entries, list) {
-		curr_intv_start = curr_intv_end;
-		curr_intv_end = get_interval_end_time(sched, admin, entry,
-						      curr_intv_start);
-
-		if (ktime_after(curr_intv_start, cycle_end))
-			break;
-
-		if (!(entry->gate_mask & BIT(tc)) ||
-		    packet_transmit_time > entry->interval)
-			continue;
-
-		txtime = entry->next_txtime;
-
-		if (ktime_before(txtime, time) || validate_interval) {
-			transmit_end_time = ktime_add_ns(time, packet_transmit_time);
-			if ((ktime_before(curr_intv_start, time) &&
-			     ktime_before(transmit_end_time, curr_intv_end)) ||
-			    (ktime_after(curr_intv_start, time) && !validate_interval)) {
-				entry_found = entry;
-				*interval_start = curr_intv_start;
-				*interval_end = curr_intv_end;
-				break;
-			} else if (!entry_available && !validate_interval) {
-				/* Here, we are just trying to find out the
-				 * first available interval in the next cycle.
-				 */
-				entry_available = 1;
-				entry_found = entry;
-				*interval_start = ktime_add_ns(curr_intv_start, cycle);
-				*interval_end = ktime_add_ns(curr_intv_end, cycle);
-			}
-		} else if (ktime_before(txtime, earliest_txtime) &&
-			   !entry_available) {
-			earliest_txtime = txtime;
-			entry_found = entry;
-			n = div_s64(ktime_sub(txtime, curr_intv_start), cycle);
-			*interval_start = ktime_add(curr_intv_start, n * cycle);
-			*interval_end = ktime_add(curr_intv_end, n * cycle);
-		}
-	}
-
-	return entry_found;
-}
-
-static bool is_valid_interval(struct sk_buff *skb, struct Qdisc *sch)
+static ktime_t get_cycle_time(struct sched_gate_list *sched)
 {
-	struct taprio_sched *q = qdisc_priv(sch);
-	struct sched_gate_list *sched, *admin;
-	ktime_t interval_start, interval_end;
 	struct sched_entry *entry;
+	ktime_t cycle = 0;
 
-	rcu_read_lock();
-	sched = rcu_dereference(q->oper_sched);
-	admin = rcu_dereference(q->admin_sched);
-
-	entry = find_entry_to_transmit(skb, sch, sched, admin, skb->tstamp,
-				       &interval_start, &interval_end, true);
-	rcu_read_unlock();
+	if (sched->cycle_time != 0)
+		return sched->cycle_time;
 
-	return entry;
-}
+	list_for_each_entry(entry, &sched->entries, list)
+		cycle = ktime_add_ns(cycle, entry->interval);
 
-/* This returns the tstamp value set by TCP in terms of the set clock. */
-static ktime_t get_tcp_tstamp(struct taprio_sched *q, struct sk_buff *skb)
-{
-	unsigned int offset = skb_network_offset(skb);
-	const struct ipv6hdr *ipv6h;
-	const struct iphdr *iph;
-	struct ipv6hdr _ipv6h;
+	sched->cycle_time = cycle;
 
-	ipv6h = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
-	if (!ipv6h)
-		return 0;
-
-	if (ipv6h->version == 4) {
-		iph = (struct iphdr *)ipv6h;
-		offset += iph->ihl * 4;
-
-		/* special-case 6in4 tunnelling, as that is a common way to get
-		 * v6 connectivity in the home
-		 */
-		if (iph->protocol == IPPROTO_IPV6) {
-			ipv6h = skb_header_pointer(skb, offset,
-						   sizeof(_ipv6h), &_ipv6h);
-
-			if (!ipv6h || ipv6h->nexthdr != IPPROTO_TCP)
-				return 0;
-		} else if (iph->protocol != IPPROTO_TCP) {
-			return 0;
-		}
-	} else if (ipv6h->version == 6 && ipv6h->nexthdr != IPPROTO_TCP) {
-		return 0;
-	}
-
-	return ktime_mono_to_any(skb->skb_mstamp_ns, q->tk_offset);
-}
-
-/* There are a few scenarios where we will have to modify the txtime from
- * what is read from next_txtime in sched_entry. They are:
- * 1. If txtime is in the past,
- *    a. The gate for the traffic class is currently open and packet can be
- *       transmitted before it closes, schedule the packet right away.
- *    b. If the gate corresponding to the traffic class is going to open later
- *       in the cycle, set the txtime of packet to the interval start.
- * 2. If txtime is in the future, there are packets corresponding to the
- *    current traffic class waiting to be transmitted. So, the following
- *    possibilities exist:
- *    a. We can transmit the packet before the window containing the txtime
- *       closes.
- *    b. The window might close before the transmission can be completed
- *       successfully. So, schedule the packet in the next open window.
- */
-static long get_packet_txtime(struct sk_buff *skb, struct Qdisc *sch)
-{
-	ktime_t transmit_end_time, interval_end, interval_start, tcp_tstamp;
-	struct taprio_sched *q = qdisc_priv(sch);
-	struct sched_gate_list *sched, *admin;
-	ktime_t minimum_time, now, txtime;
-	int len, packet_transmit_time;
-	struct sched_entry *entry;
-	bool sched_changed;
-
-	now = taprio_get_time(q);
-	minimum_time = ktime_add_ns(now, q->txtime_delay);
-
-	tcp_tstamp = get_tcp_tstamp(q, skb);
-	minimum_time = max_t(ktime_t, minimum_time, tcp_tstamp);
-
-	rcu_read_lock();
-	admin = rcu_dereference(q->admin_sched);
-	sched = rcu_dereference(q->oper_sched);
-	if (admin && ktime_after(minimum_time, admin->base_time))
-		switch_schedules(q, &admin, &sched);
-
-	/* Until the schedule starts, all the queues are open */
-	if (!sched || ktime_before(minimum_time, sched->base_time)) {
-		txtime = minimum_time;
-		goto done;
-	}
-
-	len = qdisc_pkt_len(skb);
-	packet_transmit_time = length_to_duration(q, len);
-
-	do {
-		sched_changed = 0;
-
-		entry = find_entry_to_transmit(skb, sch, sched, admin,
-					       minimum_time,
-					       &interval_start, &interval_end,
-					       false);
-		if (!entry) {
-			txtime = 0;
-			goto done;
-		}
-
-		txtime = entry->next_txtime;
-		txtime = max_t(ktime_t, txtime, minimum_time);
-		txtime = max_t(ktime_t, txtime, interval_start);
-
-		if (admin && admin != sched &&
-		    ktime_after(txtime, admin->base_time)) {
-			sched = admin;
-			sched_changed = 1;
-			continue;
-		}
-
-		transmit_end_time = ktime_add(txtime, packet_transmit_time);
-		minimum_time = transmit_end_time;
-
-		/* Update the txtime of current entry to the next time it's
-		 * interval starts.
-		 */
-		if (ktime_after(transmit_end_time, interval_end))
-			entry->next_txtime = ktime_add(interval_start, sched->cycle_time);
-	} while (sched_changed || ktime_after(transmit_end_time, interval_end));
-
-	entry->next_txtime = transmit_end_time;
-
-done:
-	rcu_read_unlock();
-	return txtime;
+	return cycle;
 }
 
 static int taprio_enqueue(struct sk_buff *skb, struct Qdisc *sch,
@@ -402,15 +137,6 @@  static int taprio_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 	if (unlikely(!child))
 		return qdisc_drop(skb, sch, to_free);
 
-	if (skb->sk && sock_flag(skb->sk, SOCK_TXTIME)) {
-		if (!is_valid_interval(skb, sch))
-			return qdisc_drop(skb, sch, to_free);
-	} else if (TXTIME_ASSIST_IS_ENABLED(q->flags)) {
-		skb->tstamp = get_packet_txtime(skb, sch);
-		if (!skb->tstamp)
-			return qdisc_drop(skb, sch, to_free);
-	}
-
 	qdisc_qstats_backlog_inc(sch, skb);
 	sch->q.qlen++;
 
@@ -446,9 +172,6 @@  static struct sk_buff *taprio_peek(struct Qdisc *sch)
 		if (!skb)
 			continue;
 
-		if (TXTIME_ASSIST_IS_ENABLED(q->flags))
-			return skb;
-
 		prio = skb->priority;
 		tc = netdev_get_prio_tc_map(dev, prio);
 
@@ -461,6 +184,11 @@  static struct sk_buff *taprio_peek(struct Qdisc *sch)
 	return NULL;
 }
 
+static inline int length_to_duration(struct taprio_sched *q, int len)
+{
+	return div_u64(len * atomic64_read(&q->picos_per_byte), 1000);
+}
+
 static void taprio_set_budget(struct taprio_sched *q, struct sched_entry *entry)
 {
 	atomic_set(&entry->budget,
@@ -504,13 +232,6 @@  static struct sk_buff *taprio_dequeue(struct Qdisc *sch)
 		if (unlikely(!child))
 			continue;
 
-		if (TXTIME_ASSIST_IS_ENABLED(q->flags)) {
-			skb = child->ops->dequeue(child);
-			if (!skb)
-				continue;
-			goto skb_found;
-		}
-
 		skb = child->ops->peek(child);
 		if (!skb)
 			continue;
@@ -522,7 +243,7 @@  static struct sk_buff *taprio_dequeue(struct Qdisc *sch)
 			continue;
 
 		len = qdisc_pkt_len(skb);
-		guard = ktime_add_ns(taprio_get_time(q),
+		guard = ktime_add_ns(q->get_time(),
 				     length_to_duration(q, len));
 
 		/* In the case that there's no gate entry, there's no
@@ -541,7 +262,6 @@  static struct sk_buff *taprio_dequeue(struct Qdisc *sch)
 		if (unlikely(!skb))
 			goto done;
 
-skb_found:
 		qdisc_bstats_update(sch, skb);
 		qdisc_qstats_backlog_dec(sch, skb);
 		sch->q.qlen--;
@@ -804,22 +524,12 @@  static int parse_taprio_schedule(struct nlattr **tb,
 	if (err < 0)
 		return err;
 
-	if (!new->cycle_time) {
-		struct sched_entry *entry;
-		ktime_t cycle = 0;
-
-		list_for_each_entry(entry, &new->entries, list)
-			cycle = ktime_add_ns(cycle, entry->interval);
-		new->cycle_time = cycle;
-	}
-
 	return 0;
 }
 
 static int taprio_parse_mqprio_opt(struct net_device *dev,
 				   struct tc_mqprio_qopt *qopt,
-				   struct netlink_ext_ack *extack,
-				   u32 taprio_flags)
+				   struct netlink_ext_ack *extack)
 {
 	int i, j;
 
@@ -867,9 +577,6 @@  static int taprio_parse_mqprio_opt(struct net_device *dev,
 			return -EINVAL;
 		}
 
-		if (TXTIME_ASSIST_IS_ENABLED(taprio_flags))
-			continue;
-
 		/* Verify that the offset and counts do not overlap */
 		for (j = i + 1; j < qopt->num_tc; j++) {
 			if (last > qopt->offset[j]) {
@@ -891,14 +598,14 @@  static int taprio_get_start_time(struct Qdisc *sch,
 	s64 n;
 
 	base = sched_base_time(sched);
-	now = taprio_get_time(q);
+	now = q->get_time();
 
 	if (ktime_after(base, now)) {
 		*start = base;
 		return 0;
 	}
 
-	cycle = sched->cycle_time;
+	cycle = get_cycle_time(sched);
 
 	/* The qdisc is expected to have at least one sched_entry.  Moreover,
 	 * any entry must have 'interval' > 0. Thus if the cycle time is zero,
@@ -925,7 +632,7 @@  static void setup_first_close_time(struct taprio_sched *q,
 	first = list_first_entry(&sched->entries,
 				 struct sched_entry, list);
 
-	cycle = sched->cycle_time;
+	cycle = get_cycle_time(sched);
 
 	/* FIXME: find a better place to do this */
 	sched->cycle_close_time = ktime_add_ns(base, cycle);
@@ -1000,18 +707,6 @@  static int taprio_dev_notifier(struct notifier_block *nb, unsigned long event,
 	return NOTIFY_DONE;
 }
 
-static void setup_txtime(struct taprio_sched *q,
-			 struct sched_gate_list *sched, ktime_t base)
-{
-	struct sched_entry *entry;
-	u32 interval = 0;
-
-	list_for_each_entry(entry, &sched->entries, list) {
-		entry->next_txtime = ktime_add_ns(base, interval);
-		interval += entry->interval;
-	}
-}
-
 static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 			 struct netlink_ext_ack *extack)
 {
@@ -1020,7 +715,6 @@  static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 	struct taprio_sched *q = qdisc_priv(sch);
 	struct net_device *dev = qdisc_dev(sch);
 	struct tc_mqprio_qopt *mqprio = NULL;
-	u32 taprio_flags = 0;
 	int i, err, clockid;
 	unsigned long flags;
 	ktime_t start;
@@ -1033,21 +727,7 @@  static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 	if (tb[TCA_TAPRIO_ATTR_PRIOMAP])
 		mqprio = nla_data(tb[TCA_TAPRIO_ATTR_PRIOMAP]);
 
-	if (tb[TCA_TAPRIO_ATTR_FLAGS]) {
-		taprio_flags = nla_get_u32(tb[TCA_TAPRIO_ATTR_FLAGS]);
-
-		if (q->flags != 0 && q->flags != taprio_flags) {
-			NL_SET_ERR_MSG_MOD(extack, "Changing 'flags' of a running schedule is not supported");
-			return -EOPNOTSUPP;
-		} else if (!FLAGS_VALID(taprio_flags)) {
-			NL_SET_ERR_MSG_MOD(extack, "Specified 'flags' are not valid");
-			return -EINVAL;
-		}
-
-		q->flags = taprio_flags;
-	}
-
-	err = taprio_parse_mqprio_opt(dev, mqprio, extack, taprio_flags);
+	err = taprio_parse_mqprio_opt(dev, mqprio, extack);
 	if (err < 0)
 		return err;
 
@@ -1106,18 +786,7 @@  static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 	/* Protects against enqueue()/dequeue() */
 	spin_lock_bh(qdisc_lock(sch));
 
-	if (tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]) {
-		if (!TXTIME_ASSIST_IS_ENABLED(q->flags)) {
-			NL_SET_ERR_MSG_MOD(extack, "txtime-delay can only be set when txtime-assist mode is enabled");
-			err = -EINVAL;
-			goto unlock;
-		}
-
-		q->txtime_delay = nla_get_s32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]);
-	}
-
-	if (!TXTIME_ASSIST_IS_ENABLED(taprio_flags) &&
-	    !hrtimer_active(&q->advance_timer)) {
+	if (!hrtimer_active(&q->advance_timer)) {
 		hrtimer_init(&q->advance_timer, q->clockid, HRTIMER_MODE_ABS);
 		q->advance_timer.function = advance_sched;
 	}
@@ -1137,16 +806,16 @@  static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 
 	switch (q->clockid) {
 	case CLOCK_REALTIME:
-		q->tk_offset = TK_OFFS_REAL;
+		q->get_time = ktime_get_real;
 		break;
 	case CLOCK_MONOTONIC:
-		q->tk_offset = TK_OFFS_MAX;
+		q->get_time = ktime_get;
 		break;
 	case CLOCK_BOOTTIME:
-		q->tk_offset = TK_OFFS_BOOT;
+		q->get_time = ktime_get_boottime;
 		break;
 	case CLOCK_TAI:
-		q->tk_offset = TK_OFFS_TAI;
+		q->get_time = ktime_get_clocktai;
 		break;
 	default:
 		NL_SET_ERR_MSG(extack, "Invalid 'clockid'");
@@ -1160,35 +829,20 @@  static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
 		goto unlock;
 	}
 
-	if (TXTIME_ASSIST_IS_ENABLED(taprio_flags)) {
-		setup_txtime(q, new_admin, start);
-
-		if (!oper) {
-			rcu_assign_pointer(q->oper_sched, new_admin);
-			err = 0;
-			new_admin = NULL;
-			goto unlock;
-		}
-
-		rcu_assign_pointer(q->admin_sched, new_admin);
-		if (admin)
-			call_rcu(&admin->rcu, taprio_free_sched_cb);
-	} else {
-		setup_first_close_time(q, new_admin, start);
+	setup_first_close_time(q, new_admin, start);
 
-		/* Protects against advance_sched() */
-		spin_lock_irqsave(&q->current_entry_lock, flags);
+	/* Protects against advance_sched() */
+	spin_lock_irqsave(&q->current_entry_lock, flags);
 
-		taprio_start_sched(sch, start, new_admin);
+	taprio_start_sched(sch, start, new_admin);
 
-		rcu_assign_pointer(q->admin_sched, new_admin);
-		if (admin)
-			call_rcu(&admin->rcu, taprio_free_sched_cb);
+	rcu_assign_pointer(q->admin_sched, new_admin);
+	if (admin)
+		call_rcu(&admin->rcu, taprio_free_sched_cb);
+	new_admin = NULL;
 
-		spin_unlock_irqrestore(&q->current_entry_lock, flags);
-	}
+	spin_unlock_irqrestore(&q->current_entry_lock, flags);
 
-	new_admin = NULL;
 	err = 0;
 
 unlock:
@@ -1426,13 +1080,6 @@  static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
 	if (nla_put_s32(skb, TCA_TAPRIO_ATTR_SCHED_CLOCKID, q->clockid))
 		goto options_error;
 
-	if (q->flags && nla_put_u32(skb, TCA_TAPRIO_ATTR_FLAGS, q->flags))
-		goto options_error;
-
-	if (q->txtime_delay &&
-	    nla_put_s32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay))
-		goto options_error;
-
 	if (oper && dump_schedule(skb, oper))
 		goto options_error;