From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-118.freemail.mail.aliyun.com (out30-118.freemail.mail.aliyun.com [115.124.30.118]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 68425389443 for ; Wed, 8 Apr 2026 12:20:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.118 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775650845; cv=none; b=BST24v3L3dQzMEHEm8nbVQ/QeiGakeM+Mge9+yV7v6hxFgxUDMIkxjPtLygAiGmp7XVy0Rwt2c/m38f8VZ9TyCWevA3vb+zqHLpCyaoHVEmOCFMbvThhXF718CP431qJvrHacWjkYfEKrfS1HPrCBhTodNCHspy4YjYv6fvYF9k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775650845; c=relaxed/simple; bh=preg1nBeFv0V7tlnHRWJgHmGbM4QarcGgQ6VmP3dW3w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=EyKLZZeWmRMPnGNZMr92bNXX6SNt1sOVcnddyQ2ROCqiFsL9npir0EqQxtXe/KETZxThbwp4MrmPypMCViVj6DKxDjQJH8t0hywhVh48C3NwtcmqeTBTB9f9dGbMLqSMGYcaUe/fPoN3FAFO6vne6tUChuCWbAh4vuvYBwphe+U= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=OCPA/e2S; arc=none smtp.client-ip=115.124.30.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="OCPA/e2S" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1775650836; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=B3+kITK++rACwH/xYvZye7OE9Xr33JaR1i7/s5eAia4=; b=OCPA/e2SRzdHfVLx3eQ0qs30ftr8qmBxSIkdL/KU7JYwXwSbJUoBHdw5n5ZjftdWAHbLQWtidZSZuiwn1Pg7qX4Hf9LTmztNjgLsL5Ne7lUAqYHw7HzLupOnsj9wDt7rJZY8LfiFQgV5q4khqOu+Vgoh7J3VAwGC2Fl+k21rN70= X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R581e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=maildocker-contentspam011083073210;MF=xuanzhuo@linux.alibaba.com;NM=1;PH=DS;RN=14;SR=0;TI=SMTPD_---0X0epEJj_1775650834; Received: from localhost(mailfrom:xuanzhuo@linux.alibaba.com fp:SMTPD_---0X0epEJj_1775650834 cluster:ay36) by smtp.aliyun-inc.com; Wed, 08 Apr 2026 20:20:34 +0800 From: Xuan Zhuo To: netdev@vger.kernel.org Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Xuan Zhuo , Wen Gu , Philo Lu , Vadim Fedorenko , Dong Yibo , Jes Sorensen , Heiner Kallweit , Dust Li Subject: [PATCH net-next v39 8/8] eea: introduce callback for ndo_get_stats64 Date: Wed, 8 Apr 2026 20:20:27 +0800 Message-Id: <20260408122027.80303-9-xuanzhuo@linux.alibaba.com> X-Mailer: git-send-email 2.32.0.3.g01195cf9f In-Reply-To: <20260408122027.80303-1-xuanzhuo@linux.alibaba.com> References: <20260408122027.80303-1-xuanzhuo@linux.alibaba.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Git-Hash: 07172ad8de0c Content-Transfer-Encoding: 8bit This commit introduces ndo_get_stats64 support. Reviewed-by: Dust Li Reviewed-by: Philo Lu Signed-off-by: Wen Gu Signed-off-by: Xuan Zhuo --- drivers/net/ethernet/alibaba/eea/eea_net.c | 63 ++++++++++++++++++++++ drivers/net/ethernet/alibaba/eea/eea_net.h | 5 ++ 2 files changed, 68 insertions(+) diff --git a/drivers/net/ethernet/alibaba/eea/eea_net.c b/drivers/net/ethernet/alibaba/eea/eea_net.c index c70c0be7b1ea..8335131b8753 100644 --- a/drivers/net/ethernet/alibaba/eea/eea_net.c +++ b/drivers/net/ethernet/alibaba/eea/eea_net.c @@ -114,6 +114,11 @@ static void eea_bind_q_and_cfg(struct eea_net *enet, struct eea_net_tx *tx; int i; + /* Since 'ndo_get_stats64' is not called in softirq context, there is no + * need to use 'spin_lock_bh'. + */ + spin_lock(&enet->stats_lock); + enet->cfg = ctx->cfg; enet->rx = ctx->rx; enet->tx = ctx->tx; @@ -133,6 +138,8 @@ static void eea_bind_q_and_cfg(struct eea_net *enet, blk->rx = rx; } + + spin_unlock(&enet->stats_lock); } static void eea_unbind_q_and_cfg(struct eea_net *enet, @@ -142,6 +149,8 @@ static void eea_unbind_q_and_cfg(struct eea_net *enet, struct eea_net_rx *rx; int i; + spin_lock(&enet->stats_lock); + ctx->cfg = enet->cfg; ctx->rx = enet->rx; ctx->tx = enet->tx; @@ -158,6 +167,8 @@ static void eea_unbind_q_and_cfg(struct eea_net *enet, blk->rx = NULL; } + + spin_unlock(&enet->stats_lock); } static void eea_free_rxtx_q_mem(struct eea_net_init_ctx *ctx) @@ -343,6 +354,53 @@ static int eea_netdev_open(struct net_device *netdev) return err; } +/* Statistics may be reset to zero upon device reset. This is expected behavior + * for now and will be addressed in the future. + */ +static void eea_stats(struct net_device *netdev, struct rtnl_link_stats64 *tot) +{ + struct eea_net *enet = netdev_priv(netdev); + u64 packets, bytes; + u32 start; + int i; + + spin_lock(&enet->stats_lock); + + if (enet->rx) { + for (i = 0; i < enet->cfg.rx_ring_num; i++) { + struct eea_net_rx *rx = enet->rx[i]; + + do { + start = u64_stats_fetch_begin(&rx->stats.syncp); + packets = u64_stats_read(&rx->stats.packets); + bytes = u64_stats_read(&rx->stats.bytes); + } while (u64_stats_fetch_retry(&rx->stats.syncp, + start)); + + tot->rx_packets += packets; + tot->rx_bytes += bytes; + } + } + + if (enet->tx) { + for (i = 0; i < enet->cfg.tx_ring_num; i++) { + struct eea_net_tx *tx = &enet->tx[i]; + + do { + start = u64_stats_fetch_begin(&tx->stats.syncp); + packets = u64_stats_read(&tx->stats.packets); + bytes = u64_stats_read(&tx->stats.bytes); + } while (u64_stats_fetch_retry(&tx->stats.syncp, + start)); + + tot->tx_packets += packets; + tot->tx_bytes += bytes; + } + } + + spin_unlock(&enet->stats_lock); +} + /* resources: ring, buffers, irq */ int eea_reset_hw_resources(struct eea_net *enet, struct eea_net_init_ctx *ctx) { @@ -350,7 +408,9 @@ int eea_reset_hw_resources(struct eea_net *enet, struct eea_net_init_ctx *ctx) int err, error; if (!netif_running(enet->netdev) || !enet->started) { + spin_lock(&enet->stats_lock); enet->cfg = ctx->cfg; + spin_unlock(&enet->stats_lock); return 0; } @@ -600,6 +660,7 @@ static const struct net_device_ops eea_netdev = { .ndo_stop = eea_netdev_stop, .ndo_start_xmit = eea_tx_xmit, .ndo_validate_addr = eth_validate_addr, + .ndo_get_stats64 = eea_stats, .ndo_features_check = passthru_features_check, }; @@ -633,6 +694,8 @@ static struct eea_net *eea_netdev_alloc(struct eea_device *edev, u32 pairs) return NULL; } + spin_lock_init(&enet->stats_lock); + return enet; } diff --git a/drivers/net/ethernet/alibaba/eea/eea_net.h b/drivers/net/ethernet/alibaba/eea/eea_net.h index 5124d112a046..6aeaad0193da 100644 --- a/drivers/net/ethernet/alibaba/eea/eea_net.h +++ b/drivers/net/ethernet/alibaba/eea/eea_net.h @@ -165,6 +165,11 @@ struct eea_net { u32 speed; u64 hw_ts_offset; + + /* Protect the tx and rx of struct eea_net, when eea_stats accesses the + * stats from rx and tx queues. + */ + spinlock_t stats_lock; }; int eea_net_probe(struct eea_device *edev); -- 2.32.0.3.g01195cf9f