Commit 7ede7b03 authored by Vedang Patel's avatar Vedang Patel Committed by David S. Miller

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: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
Signed-off-by: default avatarVedang Patel <vedang.patel@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4cfd5779
...@@ -61,6 +61,7 @@ struct taprio_sched { ...@@ -61,6 +61,7 @@ struct taprio_sched {
struct Qdisc **qdiscs; struct Qdisc **qdiscs;
struct Qdisc *root; struct Qdisc *root;
u32 flags; u32 flags;
enum tk_offsets tk_offset;
int clockid; int clockid;
atomic64_t picos_per_byte; /* Using picoseconds because for 10Gbps+ atomic64_t picos_per_byte; /* Using picoseconds because for 10Gbps+
* speeds it's sub-nanoseconds per byte * speeds it's sub-nanoseconds per byte
...@@ -71,7 +72,6 @@ struct taprio_sched { ...@@ -71,7 +72,6 @@ struct taprio_sched {
struct sched_entry __rcu *current_entry; struct sched_entry __rcu *current_entry;
struct sched_gate_list __rcu *oper_sched; struct sched_gate_list __rcu *oper_sched;
struct sched_gate_list __rcu *admin_sched; struct sched_gate_list __rcu *admin_sched;
ktime_t (*get_time)(void);
struct hrtimer advance_timer; struct hrtimer advance_timer;
struct list_head taprio_list; struct list_head taprio_list;
int txtime_delay; int txtime_delay;
...@@ -85,6 +85,20 @@ static ktime_t sched_base_time(const struct sched_gate_list *sched) ...@@ -85,6 +85,20 @@ static ktime_t sched_base_time(const struct sched_gate_list *sched)
return ns_to_ktime(sched->base_time); 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) static void taprio_free_sched_cb(struct rcu_head *head)
{ {
struct sched_gate_list *sched = container_of(head, struct sched_gate_list, rcu); 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) ...@@ -278,7 +292,7 @@ static long get_packet_txtime(struct sk_buff *skb, struct Qdisc *sch)
struct sched_entry *entry; struct sched_entry *entry;
bool sched_changed; bool sched_changed;
now = q->get_time(); now = taprio_get_time(q);
minimum_time = ktime_add_ns(now, q->txtime_delay); minimum_time = ktime_add_ns(now, q->txtime_delay);
rcu_read_lock(); rcu_read_lock();
...@@ -469,7 +483,7 @@ static struct sk_buff *taprio_dequeue(struct Qdisc *sch) ...@@ -469,7 +483,7 @@ static struct sk_buff *taprio_dequeue(struct Qdisc *sch)
continue; continue;
len = qdisc_pkt_len(skb); len = qdisc_pkt_len(skb);
guard = ktime_add_ns(q->get_time(), guard = ktime_add_ns(taprio_get_time(q),
length_to_duration(q, len)); length_to_duration(q, len));
/* In the case that there's no gate entry, there's no /* 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, ...@@ -838,7 +852,7 @@ static int taprio_get_start_time(struct Qdisc *sch,
s64 n; s64 n;
base = sched_base_time(sched); base = sched_base_time(sched);
now = q->get_time(); now = taprio_get_time(q);
if (ktime_after(base, now)) { if (ktime_after(base, now)) {
*start = base; *start = base;
...@@ -1084,16 +1098,16 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, ...@@ -1084,16 +1098,16 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
switch (q->clockid) { switch (q->clockid) {
case CLOCK_REALTIME: case CLOCK_REALTIME:
q->get_time = ktime_get_real; q->tk_offset = TK_OFFS_REAL;
break; break;
case CLOCK_MONOTONIC: case CLOCK_MONOTONIC:
q->get_time = ktime_get; q->tk_offset = TK_OFFS_MAX;
break; break;
case CLOCK_BOOTTIME: case CLOCK_BOOTTIME:
q->get_time = ktime_get_boottime; q->tk_offset = TK_OFFS_BOOT;
break; break;
case CLOCK_TAI: case CLOCK_TAI:
q->get_time = ktime_get_clocktai; q->tk_offset = TK_OFFS_TAI;
break; break;
default: default:
NL_SET_ERR_MSG(extack, "Invalid 'clockid'"); NL_SET_ERR_MSG(extack, "Invalid 'clockid'");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment