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>
This commit is contained in:
parent
4cfd5779bd
commit
7ede7b0348
|
@ -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 {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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'");
|
||||||
|
|
Loading…
Reference in New Issue