From: Netanel Belgazal <netanel@annapurnalabs.com>
To: linux-kernel@vger.kernel.org, davem@davemloft.net,
netdev@vger.kernel.org
Cc: Netanel Belgazal <netanel@annapurnalabs.com>,
dwmw@amazon.com, zorik@annapurnalabs.com, alex@annapurnalabs.com,
saeed@annapurnalabs.com, msw@amazon.com, aliguori@amazon.com,
nafea@annapurnalabs.com
Subject: [PATCH net 07/18] net/ena: refactor ena_get_stats64 to be atomic context safe
Date: Sun, 20 Nov 2016 10:45:36 +0200 [thread overview]
Message-ID: <1479631547-29354-8-git-send-email-netanel@annapurnalabs.com> (raw)
In-Reply-To: <1479631547-29354-1-git-send-email-netanel@annapurnalabs.com>
ndo_get_stat64 can be called from atomic context.
However the current implementation sends an admin command to retrieve
the statistics from the device.
This admin commands uses sleep.
Refactor the implementation of ena_get_stats64 to take the
{rx,tx}bytes/cnt from the driver's inner counters
and to take the rx drops counter
from the asynchronous keep alive (heart bit) event.
Signed-off-by: Netanel Belgazal <netanel@annapurnalabs.com>
---
drivers/net/ethernet/amazon/ena/ena_admin_defs.h | 8 ++++
drivers/net/ethernet/amazon/ena/ena_netdev.c | 57 +++++++++++++++++-------
drivers/net/ethernet/amazon/ena/ena_netdev.h | 1 +
3 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index c78f0b2..35ae511 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -904,6 +904,14 @@ struct ena_admin_aenq_link_change_desc {
u32 flags;
};
+struct ena_admin_aenq_keep_alive_desc {
+ struct ena_admin_aenq_common_desc aenq_common_desc;
+
+ u32 rx_drops_low;
+
+ u32 rx_drops_high;
+};
+
struct ena_admin_ena_mmio_req_read_less_resp {
u16 req_id;
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e7dda8b..44dc298 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -2185,28 +2185,46 @@ static struct rtnl_link_stats64 *ena_get_stats64(struct net_device *netdev,
struct rtnl_link_stats64 *stats)
{
struct ena_adapter *adapter = netdev_priv(netdev);
- struct ena_admin_basic_stats ena_stats;
- int rc;
+ struct ena_ring *rx_ring, *tx_ring;
+ unsigned int start;
+ u64 rx_drops;
+ int i;
if (!test_bit(ENA_FLAG_DEV_UP, &adapter->flags))
return NULL;
- rc = ena_com_get_dev_basic_stats(adapter->ena_dev, &ena_stats);
- if (rc)
- return NULL;
+ for (i = 0; i < adapter->num_queues; i++) {
+ u64 bytes, packets;
+
+ tx_ring = &adapter->tx_ring[i];
+
+ do {
+ start = u64_stats_fetch_begin_irq(&tx_ring->syncp);
+ packets = tx_ring->tx_stats.cnt;
+ bytes = tx_ring->tx_stats.bytes;
+ } while (u64_stats_fetch_retry_irq(&tx_ring->syncp, start));
+
+ stats->tx_packets += packets;
+ stats->tx_bytes += bytes;
- stats->tx_bytes = ((u64)ena_stats.tx_bytes_high << 32) |
- ena_stats.tx_bytes_low;
- stats->rx_bytes = ((u64)ena_stats.rx_bytes_high << 32) |
- ena_stats.rx_bytes_low;
+ rx_ring = &adapter->rx_ring[i];
+
+ do {
+ start = u64_stats_fetch_begin_irq(&rx_ring->syncp);
+ packets = rx_ring->rx_stats.cnt;
+ bytes = rx_ring->rx_stats.bytes;
+ } while (u64_stats_fetch_retry_irq(&rx_ring->syncp, start));
- stats->rx_packets = ((u64)ena_stats.rx_pkts_high << 32) |
- ena_stats.rx_pkts_low;
- stats->tx_packets = ((u64)ena_stats.tx_pkts_high << 32) |
- ena_stats.tx_pkts_low;
+ stats->rx_packets += packets;
+ stats->rx_bytes += bytes;
+ }
+
+ do {
+ start = u64_stats_fetch_begin_irq(&rx_ring->syncp);
+ rx_drops = adapter->dev_stats.rx_drops;
+ } while (u64_stats_fetch_retry_irq(&rx_ring->syncp, start));
- stats->rx_dropped = ((u64)ena_stats.rx_drops_high << 32) |
- ena_stats.rx_drops_low;
+ stats->rx_dropped = rx_drops;
stats->multicast = 0;
stats->collisions = 0;
@@ -3272,8 +3290,17 @@ static void ena_keep_alive_wd(void *adapter_data,
struct ena_admin_aenq_entry *aenq_e)
{
struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
+ struct ena_admin_aenq_keep_alive_desc *desc;
+ u64 rx_drops;
+ desc = (struct ena_admin_aenq_keep_alive_desc *)aenq_e;
adapter->last_keep_alive_jiffies = jiffies;
+
+ rx_drops = ((u64)desc->rx_drops_high << 32) | desc->rx_drops_low;
+
+ u64_stats_update_begin(&adapter->syncp);
+ adapter->dev_stats.rx_drops = rx_drops;
+ u64_stats_update_end(&adapter->syncp);
}
static void ena_notification(void *adapter_data,
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index f8ef1f0..2897fab 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -251,6 +251,7 @@ struct ena_stats_dev {
u64 interface_up;
u64 interface_down;
u64 admin_q_pause;
+ u64 rx_drops;
};
enum ena_flags_t {
--
1.9.1
next prev parent reply other threads:[~2016-11-20 8:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-20 8:45 [PATCH net 00/18] Update ENA driver to version 1.1.2 Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 01/18] net/ena: remove RFS support from device feature list Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 02/18] net/ena: fix queues number calculation Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 03/18] net/ena: use napi_schedule_irqoff when possible Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 04/18] net/ena: reduce the severity of ena printouts Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 05/18] net/ena: add hardware hints capability to the driver Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 06/18] net/ena: fix ethtool RSS flow configuration Netanel Belgazal
2016-11-20 8:45 ` Netanel Belgazal [this message]
2016-11-20 10:09 ` [PATCH net 07/18] net/ena: refactor ena_get_stats64 to be atomic context safe kbuild test robot
2016-11-20 18:59 ` Netanel Belgazal
2016-11-21 16:23 ` kbuild test robot
2016-11-20 8:45 ` [PATCH net 08/18] net/ena: change sizeof() argument to be the type pointer Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 09/18] net/ena: change condition for host attribute configuration Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 10/18] net/ena: use READ_ONCE to access completion descriptors Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 11/18] net/ena: fix potential access to freed memory during device reset Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 12/18] net/ena: refactor skb allocation Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 13/18] net/ena: remove redundant logic in napi callback for busy poll mode Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 14/18] net/ena: add IPv6 extended protocols to ena_admin_flow_hash_proto Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 15/18] net/ena: remove affinity hint from the driver Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 16/18] net/ena: fix error handling when probe fails Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 17/18] net/ena: fix NULL dereference when removing the driver after device reset faild Netanel Belgazal
2016-11-20 8:45 ` [PATCH net 18/18] net/ena: change driver's default timeouts and increase driver version Netanel Belgazal
2016-11-20 15:24 ` [PATCH net 00/18] Update ENA driver to version 1.1.2 David Miller
2016-11-20 18:53 ` Netanel Belgazal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1479631547-29354-8-git-send-email-netanel@annapurnalabs.com \
--to=netanel@annapurnalabs.com \
--cc=alex@annapurnalabs.com \
--cc=aliguori@amazon.com \
--cc=davem@davemloft.net \
--cc=dwmw@amazon.com \
--cc=linux-kernel@vger.kernel.org \
--cc=msw@amazon.com \
--cc=nafea@annapurnalabs.com \
--cc=netdev@vger.kernel.org \
--cc=saeed@annapurnalabs.com \
--cc=zorik@annapurnalabs.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).