@@ -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+
88102static 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