From nobody Sat Feb 7 21:23:48 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96C1537F8AB for ; Thu, 22 Jan 2026 19:25:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769109952; cv=none; b=UhJcmxCVauWStZYOL4yYX++x/HhBgekQ+IsfnMRE1X3Vjp2sIZYoD5svCynAlpLnpReP1T7VDV+q8Wf1HD23WUBYqC+qwEBURcjqdJRLuLX8F5hMCphuxsQSEgZl3rtxSDuRDpt/gaoqpCwLxUqrkSQpXJLYOD7Qtifys26/fPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769109952; c=relaxed/simple; bh=jdgMcKVdSB39G4/lNBHFNetOkjR/zR601eO0BRbqET0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=QC2LCUlzNMi1qTy6z204npYGBHU09r8Xxl0ROcEpL5VsNSpwk6bgvuJxhVs4gKCOdFjv7StSAYqptgtl01KdQ1KgEJERSCniX0jtm8UOiJA7881zgsbzSETpWzmQHC3zFYFS29mtoXSJX01SWaU4kwi/YXWImPtRUgn4f6Qky2E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gKi1NJia; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gKi1NJia" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-7b22ffa2a88so884034b3a.1 for ; Thu, 22 Jan 2026 11:25:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769109936; x=1769714736; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Kg5uIQs2aqLLWSbVn9bFSM/HstapWJsX7MAzjUFagsQ=; b=gKi1NJiayPamZwYGHdnskX/JpQbPgb0NyuWsiiJmoQ5UNWGNiPG/+VAvBp6xNnRgy+ yBKTVZq4scUPCDhtG6wzZt9V+n39lfc0LOhSKwgYCHiMQlgIAQY+cXcSXwmawFA4oJRU Ky3TTUqgtRF5oAKhiC5qYdZ6AKtSggJlitPY6pLljrRFcnk2unHCBP5j+uupy3ORIprz OAk9bHMXQ//xXbbb7ca6Qzc/vOG9C+c+HLFtvAu+OcnXFJQINYHIWaq82TJLzWGQJ2JA XNZoAOEq7MQg7+fks8UGAz7Ri2718acDSY8RNqcM/KTTeUC9TvMvMBh8kA5V8hv2nXmk NtRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769109936; x=1769714736; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Kg5uIQs2aqLLWSbVn9bFSM/HstapWJsX7MAzjUFagsQ=; b=C6+STg4nLYPkt6K8YN95QV32Ta076gKW6xncW0BATbyijWpuPXykTo/HZ3y9nu2KQN 1jDhBuqPMlpNGKYc83oLBY//ZnZlt22j0oyolDoNxGJy1VOinweuJYVLd/AQIZf4Z6xN 1wkMLWziD0uH25WVPfQataeZtysBVa1CMq1vjhn605JTdFRgdb5JcH2Q+5SXCWLuPvmi OeQ1GIZpbnNV0I4LrTw+nEDZuUHrPkZ4CUWEUrFaZOOctgm+sXaZlvj6ZiJBEj2XAPFM Cjq5w9ozzAI2/9F6QfJkFKYo+gDyIP6tcNGtVK3aQ4BC8XK4MabHuX+jK0jhthAEnvM7 Rjbw== X-Forwarded-Encrypted: i=1; AJvYcCX70iru2i80jg3olAlHlBBnre5PjgAf5vgHNivCM63d1/peAY2UfX5Fjb204eAvRN+3MCoS1XYuiRuFtqA=@vger.kernel.org X-Gm-Message-State: AOJu0YwTxj+m5BJb2r2c30AJi+YnKlz9Gnwmltnb52jIv/nU8tHBq09y PhbmMIHvFsfR6SdzqQZW58gA0WI0YS2EBy6BaBs4wchYakIVpdoIOcsH X-Gm-Gg: AZuq6aJbKdH+gtm+X+fVgI9ICeYvuRaaSYxIlUHnShy+lv2EQJKdw9z3Fi4rqGRsTo8 pUuA0FAol4rLF7Pl+lzq1zE4JgHo2ROqCpOfbVLLqA2OBQhcoEps7EVRvkDuZpbLB+VQhC9Kovx on5ImDjNBC3u2mE8XqX7bLxk37s7QYcqJNQVe/3+bRAj4S1nIrcWeRDYkX1lXSIKmexbSXg9MkS b+/IuA8DO0CigEkHJz+W0ABJpHydAQiAOCZuH+AmDoa931mJTZtrZbTZbEXKRvq5XKdtOd92WWI 4jUeh9DbL8qtoVsdmSFHxEMNHGYOYuWbfTWKcJlmypbDmTjzt1mLyYaDBBLQPGU3zbsAuFV5lUV u21eKCdpddHy/ZjLoFLSdq8ErZAFekmEIoG5485hvcIoZd1AYsADEsh9JSMy9uLRkoP4Mu0apf3 nQ1a+850lTMRm4afIAOt79yXmphepv8A3JEfpc6ded0bRqudhX4+++eA== X-Received: by 2002:a05:6a00:3cd6:b0:823:8a5:297f with SMTP id d2e1a72fcca58-82317da469cmr337717b3a.16.1769109936001; Thu, 22 Jan 2026 11:25:36 -0800 (PST) Received: from d.home.mmyangfl.tk ([2001:19f0:8001:1644:5400:5ff:fe3e:12b1]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-8231873ec59sm136239b3a.53.2026.01.22.11.25.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jan 2026 11:25:35 -0800 (PST) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Shay Agroskin , Arthur Kiyanovski , David Arinzon , Saeed Bishara , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Amit Bernstein , Simon Horman , Bjorn Helgaas , Breno Leitao , Kohei Enju , Ahmed Zaki , Ingo Molnar , Thomas Gleixner , linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [RFC net-next] net: ena: Use u64_stats_t with u64_stats_sync properly Date: Fri, 23 Jan 2026 03:24:49 +0800 Message-ID: <20260122192513.2771569-1-mmyangfl@gmail.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On 64bit arches, struct u64_stats_sync is empty and provides no help against load/store tearing. Convert to u64_stats_t to ensure atomic operations. Signed-off-by: David Yang --- RFC Comment: The write side of u64_stats should ensure mutual exclusion, however I could= n't find the synchronization mechanism in use (for example, ena_up / ena_io_pol= l / ena_start_xmit). Should this be considered an issue? .../net/ethernet/amazon/ena/ena_admin_defs.h | 18 ++-- drivers/net/ethernet/amazon/ena/ena_ethtool.c | 27 +++--- drivers/net/ethernet/amazon/ena/ena_netdev.c | 50 ++++++---- drivers/net/ethernet/amazon/ena/ena_netdev.h | 92 +++++++++---------- drivers/net/ethernet/amazon/ena/ena_xdp.c | 2 +- drivers/net/ethernet/amazon/ena/ena_xdp.h | 2 +- 6 files changed, 101 insertions(+), 90 deletions(-) diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h b/drivers/net= /ethernet/amazon/ena/ena_admin_defs.h index 898ecd96b96a..d8a494e44f3b 100644 --- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h +++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h @@ -440,42 +440,42 @@ struct ena_admin_eni_stats { /* The number of packets shaped due to inbound aggregate BW * allowance being exceeded */ - u64 bw_in_allowance_exceeded; + u64_stats_t bw_in_allowance_exceeded; =20 /* The number of packets shaped due to outbound aggregate BW * allowance being exceeded */ - u64 bw_out_allowance_exceeded; + u64_stats_t bw_out_allowance_exceeded; =20 /* The number of packets shaped due to PPS allowance being exceeded */ - u64 pps_allowance_exceeded; + u64_stats_t pps_allowance_exceeded; =20 /* The number of packets shaped due to connection tracking * allowance being exceeded and leading to failure in establishment * of new connections */ - u64 conntrack_allowance_exceeded; + u64_stats_t conntrack_allowance_exceeded; =20 /* The number of packets shaped due to linklocal packet rate * allowance being exceeded */ - u64 linklocal_allowance_exceeded; + u64_stats_t linklocal_allowance_exceeded; }; =20 struct ena_admin_ena_srd_stats { /* Number of packets transmitted over ENA SRD */ - u64 ena_srd_tx_pkts; + u64_stats_t ena_srd_tx_pkts; =20 /* Number of packets transmitted or could have been * transmitted over ENA SRD */ - u64 ena_srd_eligible_tx_pkts; + u64_stats_t ena_srd_eligible_tx_pkts; =20 /* Number of packets received over ENA SRD */ - u64 ena_srd_rx_pkts; + u64_stats_t ena_srd_rx_pkts; =20 /* Percentage of the ENA SRD resources that is in use */ - u64 ena_srd_resource_utilization; + u64_stats_t ena_srd_resource_utilization; }; =20 /* ENA SRD Statistics Command */ diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/et= hernet/amazon/ena/ena_ethtool.c index 2455d6dddc26..ff26b99bfc2f 100644 --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c @@ -27,12 +27,12 @@ struct ena_hw_metrics { =20 #define ENA_STAT_ENTRY(stat, stat_type) { \ .name =3D #stat, \ - .stat_offset =3D offsetof(struct ena_stats_##stat_type, stat) / sizeof(u6= 4) \ + .stat_offset =3D offsetof(struct ena_stats_##stat_type, stat) / sizeof(u6= 4_stats_t) \ } =20 #define ENA_STAT_HW_ENTRY(stat, stat_type) { \ .name =3D #stat, \ - .stat_offset =3D offsetof(struct ena_admin_##stat_type, stat) / sizeof(u6= 4) \ + .stat_offset =3D offsetof(struct ena_admin_##stat_type, stat) / sizeof(u6= 4_stats_t) \ } =20 #define ENA_STAT_RX_ENTRY(stat) \ @@ -154,14 +154,14 @@ static const struct ena_stats ena_stats_ena_com_strin= gs[] =3D { #define ENA_STATS_ARRAY_ENA_SRD ARRAY_SIZE(ena_srd_info_strings) #define ENA_METRICS_ARRAY_ENI ARRAY_SIZE(ena_hw_stats_strings) =20 -static void ena_safe_update_stat(u64 *src, u64 *dst, +static void ena_safe_update_stat(u64_stats_t *src, u64 *dst, struct u64_stats_sync *syncp) { unsigned int start; =20 do { start =3D u64_stats_fetch_begin(syncp); - *(dst) =3D *src; + *dst =3D u64_stats_read(src); } while (u64_stats_fetch_retry(syncp, start)); } =20 @@ -169,7 +169,7 @@ static void ena_metrics_stats(struct ena_adapter *adapt= er, u64 **data) { struct ena_com_dev *dev =3D adapter->ena_dev; const struct ena_stats *ena_stats; - u64 *ptr; + u64_stats_t *ptr; int i; =20 if (ena_com_get_cap(dev, ENA_ADMIN_CUSTOMER_METRICS)) { @@ -191,7 +191,7 @@ static void ena_metrics_stats(struct ena_adapter *adapt= er, u64 **data) for (i =3D 0; i < ENA_STATS_ARRAY_ENI; i++) { ena_stats =3D &ena_stats_eni_strings[i]; =20 - ptr =3D (u64 *)&adapter->eni_stats + + ptr =3D (u64_stats_t *)&adapter->eni_stats + ena_stats->stat_offset; =20 ena_safe_update_stat(ptr, (*data)++, &adapter->syncp); @@ -201,14 +201,14 @@ static void ena_metrics_stats(struct ena_adapter *ada= pter, u64 **data) if (ena_com_get_cap(dev, ENA_ADMIN_ENA_SRD_INFO)) { ena_com_get_ena_srd_info(dev, &adapter->ena_srd_info); /* Get ENA SRD mode */ - ptr =3D (u64 *)&adapter->ena_srd_info; + ptr =3D (u64_stats_t *)&adapter->ena_srd_info; ena_safe_update_stat(ptr, (*data)++, &adapter->syncp); for (i =3D 1; i < ENA_STATS_ARRAY_ENA_SRD; i++) { ena_stats =3D &ena_srd_info_strings[i]; /* Wrapped within an outer struct - need to accommodate an * additional offset of the ENA SRD mode that was already processed */ - ptr =3D (u64 *)&adapter->ena_srd_info + + ptr =3D (u64_stats_t *)&adapter->ena_srd_info + ena_stats->stat_offset + 1; =20 ena_safe_update_stat(ptr, (*data)++, &adapter->syncp); @@ -221,7 +221,7 @@ static void ena_queue_stats(struct ena_adapter *adapter= , u64 **data) const struct ena_stats *ena_stats; struct ena_ring *ring; =20 - u64 *ptr; + u64_stats_t *ptr; int i, j; =20 for (i =3D 0; i < adapter->num_io_queues + adapter->xdp_num_queues; i++) { @@ -231,7 +231,8 @@ static void ena_queue_stats(struct ena_adapter *adapter= , u64 **data) for (j =3D 0; j < ENA_STATS_ARRAY_TX; j++) { ena_stats =3D &ena_stats_tx_strings[j]; =20 - ptr =3D (u64 *)&ring->tx_stats + ena_stats->stat_offset; + ptr =3D (u64_stats_t *)&ring->tx_stats + + ena_stats->stat_offset; =20 ena_safe_update_stat(ptr, (*data)++, &ring->syncp); } @@ -243,7 +244,7 @@ static void ena_queue_stats(struct ena_adapter *adapter= , u64 **data) for (j =3D 0; j < ENA_STATS_ARRAY_RX; j++) { ena_stats =3D &ena_stats_rx_strings[j]; =20 - ptr =3D (u64 *)&ring->rx_stats + + ptr =3D (u64_stats_t *)&ring->rx_stats + ena_stats->stat_offset; =20 ena_safe_update_stat(ptr, (*data)++, &ring->syncp); @@ -273,13 +274,13 @@ static void ena_get_stats(struct ena_adapter *adapter, bool hw_stats_needed) { const struct ena_stats *ena_stats; - u64 *ptr; + u64_stats_t *ptr; int i; =20 for (i =3D 0; i < ENA_STATS_ARRAY_GLOBAL; i++) { ena_stats =3D &ena_stats_global_strings[i]; =20 - ptr =3D (u64 *)&adapter->dev_stats + ena_stats->stat_offset; + ptr =3D (u64_stats_t *)&adapter->dev_stats + ena_stats->stat_offset; =20 ena_safe_update_stat(ptr, data++, &adapter->syncp); } diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/eth= ernet/amazon/ena/ena_netdev.c index 92d149d4f091..5f1ec7008c48 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c @@ -149,8 +149,8 @@ int ena_xmit_common(struct ena_adapter *adapter, } =20 u64_stats_update_begin(&ring->syncp); - ring->tx_stats.cnt++; - ring->tx_stats.bytes +=3D bytes; + u64_stats_inc(&ring->tx_stats.cnt); + u64_stats_add(&ring->tx_stats.bytes, bytes); u64_stats_update_end(&ring->syncp); =20 tx_info->tx_descs =3D nb_hw_desc; @@ -1294,9 +1294,9 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring,= struct napi_struct *napi, work_done =3D budget - res_budget; rx_ring->per_napi_packets +=3D work_done; u64_stats_update_begin(&rx_ring->syncp); - rx_ring->rx_stats.bytes +=3D total_len; - rx_ring->rx_stats.cnt +=3D work_done; - rx_ring->rx_stats.rx_copybreak_pkt +=3D rx_copybreak_pkt; + u64_stats_add(&rx_ring->rx_stats.bytes, total_len); + u64_stats_add(&rx_ring->rx_stats.cnt, work_done); + u64_stats_add(&rx_ring->rx_stats.rx_copybreak_pkt, rx_copybreak_pkt); u64_stats_update_end(&rx_ring->syncp); =20 rx_ring->next_to_clean =3D next_to_clean; @@ -1349,15 +1349,21 @@ static void ena_adjust_adaptive_rx_intr_moderation(= struct ena_napi *ena_napi) { struct dim_sample dim_sample; struct ena_ring *rx_ring =3D ena_napi->rx_ring; + u64 packets, bytes; + unsigned int start; =20 if (!rx_ring->per_napi_packets) return; =20 rx_ring->non_empty_napi_events++; =20 - dim_update_sample(rx_ring->non_empty_napi_events, - rx_ring->rx_stats.cnt, - rx_ring->rx_stats.bytes, + do { + start =3D u64_stats_fetch_begin(&rx_ring->syncp); + packets =3D u64_stats_read(&rx_ring->rx_stats.cnt); + bytes =3D u64_stats_read(&rx_ring->rx_stats.bytes); + } while (u64_stats_fetch_retry(&rx_ring->syncp, start)); + + dim_update_sample(rx_ring->non_empty_napi_events, packets, bytes, &dim_sample); =20 net_dim(&ena_napi->dim, &dim_sample); @@ -1496,8 +1502,8 @@ static int ena_io_poll(struct napi_struct *napi, int = budget) } =20 u64_stats_update_begin(&tx_ring->syncp); - tx_ring->tx_stats.napi_comp +=3D napi_comp_call; - tx_ring->tx_stats.tx_poll++; + u64_stats_add(&tx_ring->tx_stats.napi_comp, napi_comp_call); + u64_stats_inc(&tx_ring->tx_stats.tx_poll); u64_stats_update_end(&tx_ring->syncp); =20 tx_ring->tx_stats.last_napi_jiffies =3D jiffies; @@ -2824,8 +2830,8 @@ static void ena_get_stats64(struct net_device *netdev, =20 do { start =3D u64_stats_fetch_begin(&tx_ring->syncp); - packets =3D tx_ring->tx_stats.cnt; - bytes =3D tx_ring->tx_stats.bytes; + packets =3D u64_stats_read(&tx_ring->tx_stats.cnt); + bytes =3D u64_stats_read(&tx_ring->tx_stats.bytes); } while (u64_stats_fetch_retry(&tx_ring->syncp, start)); =20 stats->tx_packets +=3D packets; @@ -2839,9 +2845,9 @@ static void ena_get_stats64(struct net_device *netdev, =20 do { start =3D u64_stats_fetch_begin(&rx_ring->syncp); - packets =3D rx_ring->rx_stats.cnt; - bytes =3D rx_ring->rx_stats.bytes; - xdp_rx_drops =3D rx_ring->rx_stats.xdp_drop; + packets =3D u64_stats_read(&rx_ring->rx_stats.cnt); + bytes =3D u64_stats_read(&rx_ring->rx_stats.bytes); + xdp_rx_drops =3D u64_stats_read(&rx_ring->rx_stats.xdp_drop); } while (u64_stats_fetch_retry(&rx_ring->syncp, start)); =20 stats->rx_packets +=3D packets; @@ -2851,8 +2857,8 @@ static void ena_get_stats64(struct net_device *netdev, =20 do { start =3D u64_stats_fetch_begin(&adapter->syncp); - rx_drops =3D adapter->dev_stats.rx_drops; - tx_drops =3D adapter->dev_stats.tx_drops; + rx_drops =3D u64_stats_read(&adapter->dev_stats.rx_drops); + tx_drops =3D u64_stats_read(&adapter->dev_stats.tx_drops); } while (u64_stats_fetch_retry(&adapter->syncp, start)); =20 stats->rx_dropped =3D rx_drops + total_xdp_rx_drops; @@ -3380,7 +3386,11 @@ static void ena_fw_reset_device(struct work_struct *= work) if (likely(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags))) { rc |=3D ena_destroy_device(adapter, false); rc |=3D ena_restore_device(adapter); - adapter->dev_stats.reset_fail +=3D !!rc; + if (rc) { + u64_stats_update_begin(&adapter->syncp); + u64_stats_inc(&adapter->dev_stats.reset_fail); + u64_stats_update_end(&adapter->syncp); + } =20 dev_err(&adapter->pdev->dev, "Device reset completed successfully\n"); } @@ -4329,8 +4339,8 @@ static void ena_keep_alive_wd(void *adapter_data, /* These stats are accumulated by the device, so the counters indicate * all drops since last reset. */ - adapter->dev_stats.rx_drops =3D rx_drops; - adapter->dev_stats.tx_drops =3D tx_drops; + u64_stats_set(&adapter->dev_stats.rx_drops, rx_drops); + u64_stats_set(&adapter->dev_stats.tx_drops, tx_drops); u64_stats_update_end(&adapter->syncp); } =20 diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/eth= ernet/amazon/ena/ena_netdev.h index 006f9a3acea6..bf2e7c74d3eb 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.h +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h @@ -178,44 +178,44 @@ struct ena_rx_buffer { } ____cacheline_aligned; =20 struct ena_stats_tx { - u64 cnt; - u64 bytes; - u64 queue_stop; - u64 prepare_ctx_err; - u64 queue_wakeup; - u64 dma_mapping_err; - u64 linearize; - u64 linearize_failed; - u64 napi_comp; - u64 tx_poll; - u64 doorbells; - u64 bad_req_id; - u64 llq_buffer_copy; - u64 missed_tx; - u64 unmask_interrupt; + u64_stats_t cnt; + u64_stats_t bytes; + u64_stats_t queue_stop; + u64_stats_t prepare_ctx_err; + u64_stats_t queue_wakeup; + u64_stats_t dma_mapping_err; + u64_stats_t linearize; + u64_stats_t linearize_failed; + u64_stats_t napi_comp; + u64_stats_t tx_poll; + u64_stats_t doorbells; + u64_stats_t bad_req_id; + u64_stats_t llq_buffer_copy; + u64_stats_t missed_tx; + u64_stats_t unmask_interrupt; u64 last_napi_jiffies; }; =20 struct ena_stats_rx { - u64 cnt; - u64 bytes; - u64 rx_copybreak_pkt; - u64 csum_good; - u64 refil_partial; - u64 csum_bad; - u64 page_alloc_fail; - u64 skb_alloc_fail; - u64 dma_mapping_err; - u64 bad_desc_num; - u64 bad_req_id; - u64 empty_rx_ring; - u64 csum_unchecked; - u64 xdp_aborted; - u64 xdp_drop; - u64 xdp_pass; - u64 xdp_tx; - u64 xdp_invalid; - u64 xdp_redirect; + u64_stats_t cnt; + u64_stats_t bytes; + u64_stats_t rx_copybreak_pkt; + u64_stats_t csum_good; + u64_stats_t refil_partial; + u64_stats_t csum_bad; + u64_stats_t page_alloc_fail; + u64_stats_t skb_alloc_fail; + u64_stats_t dma_mapping_err; + u64_stats_t bad_desc_num; + u64_stats_t bad_req_id; + u64_stats_t empty_rx_ring; + u64_stats_t csum_unchecked; + u64_stats_t xdp_aborted; + u64_stats_t xdp_drop; + u64_stats_t xdp_pass; + u64_stats_t xdp_tx; + u64_stats_t xdp_invalid; + u64_stats_t xdp_redirect; }; =20 struct ena_ring { @@ -284,16 +284,16 @@ struct ena_ring { } ____cacheline_aligned; =20 struct ena_stats_dev { - u64 tx_timeout; - u64 suspend; - u64 resume; - u64 wd_expired; - u64 interface_up; - u64 interface_down; - u64 admin_q_pause; - u64 rx_drops; - u64 tx_drops; - u64 reset_fail; + u64_stats_t tx_timeout; + u64_stats_t suspend; + u64_stats_t resume; + u64_stats_t wd_expired; + u64_stats_t interface_up; + u64_stats_t interface_down; + u64_stats_t admin_q_pause; + u64_stats_t rx_drops; + u64_stats_t tx_drops; + u64_stats_t reset_fail; }; =20 enum ena_flags_t { @@ -430,11 +430,11 @@ int handle_invalid_req_id(struct ena_ring *ring, u16 = req_id, struct ena_tx_buffer *tx_info, bool is_xdp); =20 /* Increase a stat by cnt while holding syncp seqlock on 32bit machines */ -static inline void ena_increase_stat(u64 *statp, u64 cnt, +static inline void ena_increase_stat(u64_stats_t *statp, u64 cnt, struct u64_stats_sync *syncp) { u64_stats_update_begin(syncp); - (*statp) +=3D cnt; + u64_stats_add(statp, cnt); u64_stats_update_end(syncp); } =20 diff --git a/drivers/net/ethernet/amazon/ena/ena_xdp.c b/drivers/net/ethern= et/amazon/ena/ena_xdp.c index 5b175e7e92a1..9271d1deb96f 100644 --- a/drivers/net/ethernet/amazon/ena/ena_xdp.c +++ b/drivers/net/ethernet/amazon/ena/ena_xdp.c @@ -461,7 +461,7 @@ int ena_xdp_io_poll(struct napi_struct *napi, int budge= t) } =20 u64_stats_update_begin(&tx_ring->syncp); - tx_ring->tx_stats.tx_poll++; + u64_stats_inc(&tx_ring->tx_stats.tx_poll); u64_stats_update_end(&tx_ring->syncp); tx_ring->tx_stats.last_napi_jiffies =3D jiffies; =20 diff --git a/drivers/net/ethernet/amazon/ena/ena_xdp.h b/drivers/net/ethern= et/amazon/ena/ena_xdp.h index cfd82728486a..98756a065a39 100644 --- a/drivers/net/ethernet/amazon/ena/ena_xdp.h +++ b/drivers/net/ethernet/amazon/ena/ena_xdp.h @@ -85,7 +85,7 @@ static inline int ena_xdp_execute(struct ena_ring *rx_rin= g, struct xdp_buff *xdp struct bpf_prog *xdp_prog; struct ena_ring *xdp_ring; struct xdp_frame *xdpf; - u64 *xdp_stat; + u64_stats_t *xdp_stat; =20 xdp_prog =3D READ_ONCE(rx_ring->xdp_bpf_prog); =20 --=20 2.51.0