Skip to content

Commit 7ede7b0

Browse files
vedangpatel1davem330
authored andcommitted
taprio: make clock reference conversions easier
Later in this series we will need to transform from CLOCK_MONOTONIC (used in TCP) to the clock reference used in TAPRIO. Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Signed-off-by: Vedang Patel <vedang.patel@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4cfd577 commit 7ede7b0

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

net/sched/sch_taprio.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct taprio_sched {
6161
struct Qdisc **qdiscs;
6262
struct Qdisc *root;
6363
u32 flags;
64+
enum tk_offsets tk_offset;
6465
int clockid;
6566
atomic64_t picos_per_byte; /* Using picoseconds because for 10Gbps+
6667
* speeds it's sub-nanoseconds per byte
@@ -71,7 +72,6 @@ struct taprio_sched {
7172
struct sched_entry __rcu *current_entry;
7273
struct sched_gate_list __rcu *oper_sched;
7374
struct sched_gate_list __rcu *admin_sched;
74-
ktime_t (*get_time)(void);
7575
struct hrtimer advance_timer;
7676
struct list_head taprio_list;
7777
int txtime_delay;
@@ -85,6 +85,20 @@ static ktime_t sched_base_time(const struct sched_gate_list *sched)
8585
return ns_to_ktime(sched->base_time);
8686
}
8787

88+
static ktime_t taprio_get_time(struct taprio_sched *q)
89+
{
90+
ktime_t mono = ktime_get();
91+
92+
switch (q->tk_offset) {
93+
case TK_OFFS_MAX:
94+
return mono;
95+
default:
96+
return ktime_mono_to_any(mono, q->tk_offset);
97+
}
98+
99+
return KTIME_MAX;
100+
}
101+
88102
static void taprio_free_sched_cb(struct rcu_head *head)
89103
{
90104
struct sched_gate_list *sched = container_of(head, struct sched_gate_list, rcu);
@@ -278,7 +292,7 @@ static long get_packet_txtime(struct sk_buff *skb, struct Qdisc *sch)
278292
struct sched_entry *entry;
279293
bool sched_changed;
280294

281-
now = q->get_time();
295+
now = taprio_get_time(q);
282296
minimum_time = ktime_add_ns(now, q->txtime_delay);
283297

284298
rcu_read_lock();
@@ -469,7 +483,7 @@ static struct sk_buff *taprio_dequeue(struct Qdisc *sch)
469483
continue;
470484

471485
len = qdisc_pkt_len(skb);
472-
guard = ktime_add_ns(q->get_time(),
486+
guard = ktime_add_ns(taprio_get_time(q),
473487
length_to_duration(q, len));
474488

475489
/* In the case that there's no gate entry, there's no
@@ -838,7 +852,7 @@ static int taprio_get_start_time(struct Qdisc *sch,
838852
s64 n;
839853

840854
base = sched_base_time(sched);
841-
now = q->get_time();
855+
now = taprio_get_time(q);
842856

843857
if (ktime_after(base, now)) {
844858
*start = base;
@@ -1084,16 +1098,16 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
10841098

10851099
switch (q->clockid) {
10861100
case CLOCK_REALTIME:
1087-
q->get_time = ktime_get_real;
1101+
q->tk_offset = TK_OFFS_REAL;
10881102
break;
10891103
case CLOCK_MONOTONIC:
1090-
q->get_time = ktime_get;
1104+
q->tk_offset = TK_OFFS_MAX;
10911105
break;
10921106
case CLOCK_BOOTTIME:
1093-
q->get_time = ktime_get_boottime;
1107+
q->tk_offset = TK_OFFS_BOOT;
10941108
break;
10951109
case CLOCK_TAI:
1096-
q->get_time = ktime_get_clocktai;
1110+
q->tk_offset = TK_OFFS_TAI;
10971111
break;
10981112
default:
10991113
NL_SET_ERR_MSG(extack, "Invalid 'clockid'");

0 commit comments

Comments
 (0)