| From a32289d652caef82aa0c5960e3699a0783aa9cc6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 Feb 2020 15:17:41 +0000 |
| Subject: net: ena: fix uses of round_jiffies() |
| |
| From: Arthur Kiyanovski <akiyano@amazon.com> |
| |
| [ Upstream commit 2a6e5fa2f4c25b66c763428a3e65363214946931 ] |
| |
| >From the documentation of round_jiffies(): |
| "Rounds a time delta in the future (in jiffies) up or down to |
| (approximately) full seconds. This is useful for timers for which |
| the exact time they fire does not matter too much, as long as |
| they fire approximately every X seconds. |
| By rounding these timers to whole seconds, all such timers will fire |
| at the same time, rather than at various times spread out. The goal |
| of this is to have the CPU wake up less, which saves power." |
| |
| There are 2 parts to this patch: |
| ================================ |
| Part 1: |
| ------- |
| In our case we need timer_service to be called approximately every |
| X=1 seconds, and the exact time does not matter, so using round_jiffies() |
| is the right way to go. |
| |
| Therefore we add round_jiffies() to the mod_timer() in ena_timer_service(). |
| |
| Part 2: |
| ------- |
| round_jiffies() is used in check_for_missing_keep_alive() when |
| getting the jiffies of the expiration of the keep_alive timeout. Here it |
| is actually a mistake to use round_jiffies() because we want the exact |
| time when keep_alive should expire and not an approximate rounded time, |
| which can cause early, false positive, timeouts. |
| |
| Therefore we remove round_jiffies() in the calculation of |
| keep_alive_expired() in check_for_missing_keep_alive(). |
| |
| Fixes: 82ef30f13be0 ("net: ena: add hardware hints capability to the driver") |
| Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") |
| Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/amazon/ena/ena_netdev.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c |
| index 948583fdcc286..1c1a41bd11daa 100644 |
| --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c |
| +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c |
| @@ -3049,8 +3049,8 @@ static void check_for_missing_keep_alive(struct ena_adapter *adapter) |
| if (adapter->keep_alive_timeout == ENA_HW_HINTS_NO_TIMEOUT) |
| return; |
| |
| - keep_alive_expired = round_jiffies(adapter->last_keep_alive_jiffies + |
| - adapter->keep_alive_timeout); |
| + keep_alive_expired = adapter->last_keep_alive_jiffies + |
| + adapter->keep_alive_timeout; |
| if (unlikely(time_is_before_jiffies(keep_alive_expired))) { |
| netif_err(adapter, drv, adapter->netdev, |
| "Keep alive watchdog timeout.\n"); |
| @@ -3152,7 +3152,7 @@ static void ena_timer_service(struct timer_list *t) |
| } |
| |
| /* Reset the timer */ |
| - mod_timer(&adapter->timer_service, jiffies + HZ); |
| + mod_timer(&adapter->timer_service, round_jiffies(jiffies + HZ)); |
| } |
| |
| static int ena_calc_max_io_queue_num(struct pci_dev *pdev, |
| -- |
| 2.20.1 |
| |