diff mbox series

[v2,net-next,4/4] time64.h: consolidate uses of PSEC_PER_NSEC

Message ID 20220628145238.3247853-5-vladimir.oltean@nxp.com (mailing list archive)
State Accepted
Commit 837ced3a1a5d8bb1a637dd584711f31ae6b54d93
Delegated to: Netdev Maintainers
Headers show
Series Prevent permanently closed tc-taprio gates from blocking a Felix DSA switch port | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 17565 this patch: 17565
netdev/cc_maintainers warning 4 maintainers not CCed: jiri@resnulli.us jhs@mojatatu.com xiyou.wangcong@gmail.com lukas.hannen@opensource.tttech-industrial.com
netdev/build_clang success Errors and warnings before: 3340 this patch: 3340
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 16741 this patch: 16741
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 55 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Vladimir Oltean June 28, 2022, 2:52 p.m. UTC
Time-sensitive networking code needs to work with PTP times expressed in
nanoseconds, and with packet transmission times expressed in
picoseconds, since those would be fractional at higher than gigabit
speed when expressed in nanoseconds.

Convert the existing uses in tc-taprio and the ocelot/felix DSA driver
to a PSEC_PER_NSEC macro. This macro is placed in include/linux/time64.h
as opposed to its relatives (PSEC_PER_SEC etc) from include/vdso/time64.h
because the vDSO library does not (yet) need/use it.

Cc: Andy Lutomirski <luto@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
v1->v2:
- move PSEC_PER_NSEC to include/linux/time64.h
- add missing include of linux/time.h

 drivers/net/dsa/ocelot/felix_vsc9959.c | 5 +++--
 include/linux/time64.h                 | 3 +++
 net/sched/sch_taprio.c                 | 5 +++--
 3 files changed, 9 insertions(+), 4 deletions(-)

Comments

Vincenzo Frascino June 28, 2022, 3:31 p.m. UTC | #1
On 6/28/22 15:52, Vladimir Oltean wrote:
> Time-sensitive networking code needs to work with PTP times expressed in
> nanoseconds, and with packet transmission times expressed in
> picoseconds, since those would be fractional at higher than gigabit
> speed when expressed in nanoseconds.
> 
> Convert the existing uses in tc-taprio and the ocelot/felix DSA driver
> to a PSEC_PER_NSEC macro. This macro is placed in include/linux/time64.h
> as opposed to its relatives (PSEC_PER_SEC etc) from include/vdso/time64.h
> because the vDSO library does not (yet) need/use it.
> 
> Cc: Andy Lutomirski <luto@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>

Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> # for the vDSO parts

> ---
> v1->v2:
> - move PSEC_PER_NSEC to include/linux/time64.h
> - add missing include of linux/time.h
> 
>  drivers/net/dsa/ocelot/felix_vsc9959.c | 5 +++--
>  include/linux/time64.h                 | 3 +++
>  net/sched/sch_taprio.c                 | 5 +++--
>  3 files changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c b/drivers/net/dsa/ocelot/felix_vsc9959.c
> index 27d8b56cc21c..28bd4892c30a 100644
> --- a/drivers/net/dsa/ocelot/felix_vsc9959.c
> +++ b/drivers/net/dsa/ocelot/felix_vsc9959.c
> @@ -16,6 +16,7 @@
>  #include <linux/iopoll.h>
>  #include <linux/mdio.h>
>  #include <linux/pci.h>
> +#include <linux/time.h>
>  #include "felix.h"
>  
>  #define VSC9959_NUM_PORTS		6
> @@ -1235,7 +1236,7 @@ static void vsc9959_tas_guard_bands_update(struct ocelot *ocelot, int port)
>  		u32 max_sdu;
>  
>  		if (min_gate_len[tc] == U64_MAX /* Gate always open */ ||
> -		    min_gate_len[tc] * 1000 > needed_bit_time_ps) {
> +		    min_gate_len[tc] * PSEC_PER_NSEC > needed_bit_time_ps) {
>  			/* Setting QMAXSDU_CFG to 0 disables oversized frame
>  			 * dropping.
>  			 */
> @@ -1249,7 +1250,7 @@ static void vsc9959_tas_guard_bands_update(struct ocelot *ocelot, int port)
>  			 * frame, make sure to enable oversize frame dropping
>  			 * for frames larger than the smallest that would fit.
>  			 */
> -			max_sdu = div_u64(min_gate_len[tc] * 1000,
> +			max_sdu = div_u64(min_gate_len[tc] * PSEC_PER_NSEC,
>  					  picos_per_byte);
>  			/* A TC gate may be completely closed, which is a
>  			 * special case where all packets are oversized.
> diff --git a/include/linux/time64.h b/include/linux/time64.h
> index 81b9686a2079..2fb8232cff1d 100644
> --- a/include/linux/time64.h
> +++ b/include/linux/time64.h
> @@ -20,6 +20,9 @@ struct itimerspec64 {
>  	struct timespec64 it_value;
>  };
>  
> +/* Parameters used to convert the timespec values: */
> +#define PSEC_PER_NSEC			1000L
> +
>  /* Located here for timespec[64]_valid_strict */
>  #define TIME64_MAX			((s64)~((u64)1 << 63))
>  #define TIME64_MIN			(-TIME64_MAX - 1)
> diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
> index b9c71a304d39..0b941dd63d26 100644
> --- a/net/sched/sch_taprio.c
> +++ b/net/sched/sch_taprio.c
> @@ -18,6 +18,7 @@
>  #include <linux/module.h>
>  #include <linux/spinlock.h>
>  #include <linux/rcupdate.h>
> +#include <linux/time.h>
>  #include <net/netlink.h>
>  #include <net/pkt_sched.h>
>  #include <net/pkt_cls.h>
> @@ -176,7 +177,7 @@ static ktime_t get_interval_end_time(struct sched_gate_list *sched,
>  
>  static int length_to_duration(struct taprio_sched *q, int len)
>  {
> -	return div_u64(len * atomic64_read(&q->picos_per_byte), 1000);
> +	return div_u64(len * atomic64_read(&q->picos_per_byte), PSEC_PER_NSEC);
>  }
>  
>  /* Returns the entry corresponding to next available interval. If
> @@ -551,7 +552,7 @@ static struct sk_buff *taprio_peek(struct Qdisc *sch)
>  static void taprio_set_budget(struct taprio_sched *q, struct sched_entry *entry)
>  {
>  	atomic_set(&entry->budget,
> -		   div64_u64((u64)entry->interval * 1000,
> +		   div64_u64((u64)entry->interval * PSEC_PER_NSEC,
>  			     atomic64_read(&q->picos_per_byte)));
>  }
>
diff mbox series

Patch

diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c b/drivers/net/dsa/ocelot/felix_vsc9959.c
index 27d8b56cc21c..28bd4892c30a 100644
--- a/drivers/net/dsa/ocelot/felix_vsc9959.c
+++ b/drivers/net/dsa/ocelot/felix_vsc9959.c
@@ -16,6 +16,7 @@ 
 #include <linux/iopoll.h>
 #include <linux/mdio.h>
 #include <linux/pci.h>
+#include <linux/time.h>
 #include "felix.h"
 
 #define VSC9959_NUM_PORTS		6
@@ -1235,7 +1236,7 @@  static void vsc9959_tas_guard_bands_update(struct ocelot *ocelot, int port)
 		u32 max_sdu;
 
 		if (min_gate_len[tc] == U64_MAX /* Gate always open */ ||
-		    min_gate_len[tc] * 1000 > needed_bit_time_ps) {
+		    min_gate_len[tc] * PSEC_PER_NSEC > needed_bit_time_ps) {
 			/* Setting QMAXSDU_CFG to 0 disables oversized frame
 			 * dropping.
 			 */
@@ -1249,7 +1250,7 @@  static void vsc9959_tas_guard_bands_update(struct ocelot *ocelot, int port)
 			 * frame, make sure to enable oversize frame dropping
 			 * for frames larger than the smallest that would fit.
 			 */
-			max_sdu = div_u64(min_gate_len[tc] * 1000,
+			max_sdu = div_u64(min_gate_len[tc] * PSEC_PER_NSEC,
 					  picos_per_byte);
 			/* A TC gate may be completely closed, which is a
 			 * special case where all packets are oversized.
diff --git a/include/linux/time64.h b/include/linux/time64.h
index 81b9686a2079..2fb8232cff1d 100644
--- a/include/linux/time64.h
+++ b/include/linux/time64.h
@@ -20,6 +20,9 @@  struct itimerspec64 {
 	struct timespec64 it_value;
 };
 
+/* Parameters used to convert the timespec values: */
+#define PSEC_PER_NSEC			1000L
+
 /* Located here for timespec[64]_valid_strict */
 #define TIME64_MAX			((s64)~((u64)1 << 63))
 #define TIME64_MIN			(-TIME64_MAX - 1)
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
index b9c71a304d39..0b941dd63d26 100644
--- a/net/sched/sch_taprio.c
+++ b/net/sched/sch_taprio.c
@@ -18,6 +18,7 @@ 
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <linux/rcupdate.h>
+#include <linux/time.h>
 #include <net/netlink.h>
 #include <net/pkt_sched.h>
 #include <net/pkt_cls.h>
@@ -176,7 +177,7 @@  static ktime_t get_interval_end_time(struct sched_gate_list *sched,
 
 static int length_to_duration(struct taprio_sched *q, int len)
 {
-	return div_u64(len * atomic64_read(&q->picos_per_byte), 1000);
+	return div_u64(len * atomic64_read(&q->picos_per_byte), PSEC_PER_NSEC);
 }
 
 /* Returns the entry corresponding to next available interval. If
@@ -551,7 +552,7 @@  static struct sk_buff *taprio_peek(struct Qdisc *sch)
 static void taprio_set_budget(struct taprio_sched *q, struct sched_entry *entry)
 {
 	atomic_set(&entry->budget,
-		   div64_u64((u64)entry->interval * 1000,
+		   div64_u64((u64)entry->interval * PSEC_PER_NSEC,
 			     atomic64_read(&q->picos_per_byte)));
 }