Patch "net/mlx4_en: fix overflow in mlx4_en_init_timestamp()" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
net/mlx4_en: fix overflow in mlx4_en_init_timestamp()
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-mlx4_en-fix-overflow-in-mlx4_en_init_timestamp.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Oct 19 15:04:02 CEST 2017
From: Eric Dumazet <[email protected]>
Date: Thu, 23 Feb 2017 15:22:43 -0800
Subject: net/mlx4_en: fix overflow in mlx4_en_init_timestamp()
From: Eric Dumazet <[email protected]>
[ Upstream commit 47d3a07528ecbbccf53bc4390d70b4e3d1c04fcf ]
The cited commit makes a great job of finding optimal shift/multiplier values assuming a 10 seconds wrap around, but forgot to change the overflow_period computation.
It overflows in cyclecounter_cyc2ns(), and the final result is 804 ms, which is silly.
Lets simply use 5 seconds, no need to recompute this, given how it is supposed to work.
Later, we will use a timer instead of a work queue, since the new RX allocation schem will no longer need mlx4_en_recover_from_oom() and the service_task firing every 250 ms.
--- drivers/net/ethernet/mellanox/mlx4/en_clock.c | 18 ++++++++---------- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - 2 files changed, 8 insertions(+), 11 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_clock.c +8 -10
@@ -88,10 +88,17 @@ void mlx4_en_remove_timestamp(struct mlx } } +#define MLX4_EN_WRAP_AROUND_SEC 10UL +/* By scheduling the overflow check every 5 seconds, we have a reasonably +* good chance we wont miss a wrap around. +* TOTO: Use a timer instead of a work queue to increase the guarantee. +*/ +#define MLX4_EN_OVERFLOW_PERIOD (MLX4_EN_WRAP_AROUND_SEC * HZ / 2) +void mlx4_en_ptp_overflow_check (struct mlx4_en_dev *mdev) {bool timeout =time_is_before_jiffies (mdev->last_overflow_check + - mdev->overflow_period); +MLX4_EN_OVERFLOW_PERIOD );unsigned long flags;if (timeout) {
@@ -236,7 +243,6 @@ static const struct ptp_clock_info mlx4_ .enable = mlx4_en_phc_enable, }; -#define MLX4_EN_WRAP_AROUND_SEC 10ULL/* This function calculates the max shift that enables the user range * of MLX4_EN_WRAP_AROUND_SEC values in the cycles register.
@@ -261,7 +267,6 @@ void mlx4_en_init_timestamp(struct mlx4_ {struct mlx4_dev *dev = mdev->dev;unsigned long flags; -u64 ns, zero =0 ;/* mlx4_en_init_timestamp is called for each netdev. * mdev->ptp_clock is common for all ports, skip initialization if
@@ -285,13 +290,6 @@ void mlx4_en_init_timestamp(struct mlx4_ ktime_to_ns(ktime_get_real()));write_unlock_irqrestore (&mdev->clock_lock, flags); -/* Calculate period in seconds to call the overflow watchdog - to make -* sure counter is checked at least once every wrap around. -*/ - ns =cyclecounter_cyc2ns (&mdev->cycles, mdev->cycles.mask, zero, &zero); -do_div (ns,NSEC_PER_SEC /2 /HZ ); - mdev->overflow_period = ns; -/* Configure the PHC */ mdev->ptp_clock_info = mlx4_en_ptp_clock_info;snprintf (mdev->ptp_clock_info.name,16 ,"mlx4 ptp" );
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +0 -1
@@ -419,7 +419,6 @@ struct mlx4_en_dev {struct cyclecounter cycles;struct timecounter clock;unsigned long last_overflow_check; -unsigned long overflow_period;struct ptp_clock *ptp_clock;struct ptp_clock_info ptp_clock_info;struct notifier_block nb;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-mlx4_en-fix-overflow-in-mlx4_en_init_timestamp.patch