From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vk1-f178.google.com (mail-vk1-f178.google.com [209.85.221.178]) (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 4C17E548EE for ; Sat, 18 Apr 2026 02:12:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776478361; cv=none; b=ufWts80ZcDvyXPjzxhcnNBTS2uRh0k5MVqwWRo/PQMS6XoXcHK7vySlGtjbYPD81NGPyuHgxBWgUS/Vw5G1wAkRgS51rVvyqNsvEOj5RCgxl9FwRio1wtok3CcJHrH+rhBcRf/0x0kiIm4frtcdeT55BZGyHHeVt2atGDiQh3L8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776478361; c=relaxed/simple; bh=rhiyBegILqA56v+BQgWvBziQDat7coaEwK1s5vvGJuE=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=MmS1lF2oa2q0lzAcqjlb6yNnmaQsmIhBUyDrLTOG/p3D0grYL07nlizGezA/m8510JAphwwCc4xTZrAW1/zN8y/KSamu04QlZyqQSxNAJF0wKqM7BBvOA1YEC4/tuVCfhys8InRv0nzTivwCcLmlWO6hFLpbmjXwVrhNRU30mZ4= 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=RNJ3/bl/; arc=none smtp.client-ip=209.85.221.178 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="RNJ3/bl/" Received: by mail-vk1-f178.google.com with SMTP id 71dfb90a1353d-56a86f0a23bso1321670e0c.0 for ; Fri, 17 Apr 2026 19:12:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776478359; x=1777083159; 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=qtENGTAsRspA6IxTYSLNva2FaUMU08Xqs7csgDMJzvc=; b=RNJ3/bl/FCAdkzi+WRMCbSbYAwURhtQ/eStF49wBcWARfXIDNYidqNrHlp5fviDFWe rDJKUbPdORNWKUp2jda635/yVWMQ7b0Q3Xr+azyf924GMxA9ztFajwsYwGanG9/qPByt aMZlbASpGOnL3dFF6IUnr4KSOFnkp+fytwZwahXq18GWwnyc6wgFPbi5C2RVumha6V6+ cYQdWpmCM+ZuGdf0dyC35V5urUSUmvCl5b3lZGsOrsEcppdn6kFOA5H0Oo96eYkl0Asn pkUP9xTi4NGEoZBHghKdGoRW+S2I1fttAX5W+mpqitoXaOIKcsnBnVbdfGiAyOf6gAUQ O7UA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776478359; x=1777083159; 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=qtENGTAsRspA6IxTYSLNva2FaUMU08Xqs7csgDMJzvc=; b=kHhYWgw4aX32hqkKOFSSsZQO8jUU8M/Lcv7WwQT5din47iGXBdpTuMXZfAkGpey9Xt MBsfGhmUTsup4KX0O8W24vLJsf/Gs+b7unk5FkMU80qRnx/kVVe1DQp+RAPBqmzZK1pY GxCSErgmhqM2UdblgJi0Qb3KHAgDrcyyuJztfYMPmnKUk2Y6eXw/i8I0Vkx/wET0DVdN 1hgBE7c2wE9Gz2XYdZzyuF0vGd6JLQ8P7TwGopP+f/lEXDqBnIP8JcLyuOCFn2cGQ1vL FxqM5GOkawQqdQtfnwEWG/tFC1ci7vLsDNxGdDX5RFMffXcXT/cN1knvynBoyW8THVmX m/gQ== X-Forwarded-Encrypted: i=1; AFNElJ/IByzN8REPlrtrUlPOIqpmyd1+lLsr7Jwup0F3YECqFiTg0lhRUiBNm4pjPOEc/J+7AT3T6OlMlNaSA3I=@vger.kernel.org X-Gm-Message-State: AOJu0YwCn2GkximvmxWDalQ+k+NNYCcmfs9cL5Sv2R6Wn39PsskwhCKb E2D7XqCypc7S8L6uQmTGZVTfw1gu5nEzWX36XCpois0aWuFL4wD1KOD6 X-Gm-Gg: AeBDiesDIiNJTOqSbGMd0dB43zkqCLri+/soV3WB5stOKbRzyBBQAyqlmau2rx6xHmH p1pf3WCNwqZbwwwBvKrJ3bWzfCle8XqyPcUfqO5qhkb4zO55NRZrg4Ztxs7UU1a9IWP5Lp0oo7u ntvJ0DPR/Y0ZiBEDWZ7kU7Hccp4q1x4idaRT1cksJ9wyyVUv7tIGcJ15xHHeJA+jwizv5wRFOr1 KgqoKo2KCOa64RXI1mQKefYmsVjXr6GhyFzg7ElgAFP7dccXQuNeo927hWJK9yvEDzhidvX/vz8 Yk6qBnFqvpvvpoWnrFj/5nkXfIBbxvyP2xJKEvY5VSi/GBN79zAOPInB+oap1gYXIFbTdyiAgYP XZqcEbMzMKg49r7dthlqOre9Xvl0jDh7JENlLOUqejGM2g2rSKulIkQYGzesozBAegX9WCRv0ls tJbP5zBggr5N8jbAcHwAHK7m12ye6PGIBf X-Received: by 2002:a05:6102:f9e:b0:609:4d86:77b with SMTP id ada2fe7eead31-616f73fb077mr2761601137.24.1776478359242; Fri, 17 Apr 2026 19:12:39 -0700 (PDT) Received: from nixos ([2804:d59:7f1c:1e00:868c:c43d:f565:df5b]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-95890bcbbc7sm1614597241.9.2026.04.17.19.12.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Apr 2026 19:12:38 -0700 (PDT) From: Gustavo Arantes To: Heiner Kallweit , nic_swsd@realtek.com Cc: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next] r8169: report per-queue statistics through netdev qstats Date: Fri, 17 Apr 2026 23:12:32 -0300 Message-ID: <20260418021232.5425-1-dev.gustavoa@gmail.com> X-Mailer: git-send-email 2.51.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit r8169 maintains synchronized per-CPU software counters for packet and byte accounting, but does not expose them through the netdev qstats interface. Add netdev_stat_ops callbacks and report the existing software counters through queue 0 for both Rx and Tx. Provide zero base stats so device-scope qstats report the packet and byte counters as supported and match the existing RTNL statistics. Signed-off-by: Gustavo Arantes --- drivers/net/ethernet/realtek/r8169_main.c | 70 +++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 791277e750ba..9d833b446383 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -5175,6 +5175,75 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) pm_runtime_put_noidle(&pdev->dev); } +static void rtl8169_fetch_sw_stats(struct net_device *dev, + struct netdev_queue_stats_rx *rx, + struct netdev_queue_stats_tx *tx) +{ + const struct pcpu_sw_netstats *stats; + unsigned int start; + int cpu; + + for_each_possible_cpu(cpu) { + u64 rx_packets, rx_bytes, tx_packets, tx_bytes; + + stats = per_cpu_ptr(dev->tstats, cpu); + do { + start = u64_stats_fetch_begin(&stats->syncp); + rx_packets = u64_stats_read(&stats->rx_packets); + rx_bytes = u64_stats_read(&stats->rx_bytes); + tx_packets = u64_stats_read(&stats->tx_packets); + tx_bytes = u64_stats_read(&stats->tx_bytes); + } while (u64_stats_fetch_retry(&stats->syncp, start)); + + rx->packets += rx_packets; + rx->bytes += rx_bytes; + tx->packets += tx_packets; + tx->bytes += tx_bytes; + } +} + +static void rtl8169_get_queue_stats_rx(struct net_device *dev, int idx, + struct netdev_queue_stats_rx *rx) +{ + struct netdev_queue_stats_tx tx = {}; + + if (idx) + return; + + rx->packets = 0; + rx->bytes = 0; + rtl8169_fetch_sw_stats(dev, rx, &tx); +} + +static void rtl8169_get_queue_stats_tx(struct net_device *dev, int idx, + struct netdev_queue_stats_tx *tx) +{ + struct netdev_queue_stats_rx rx = {}; + + if (idx) + return; + + tx->packets = 0; + tx->bytes = 0; + rtl8169_fetch_sw_stats(dev, &rx, tx); +} + +static void rtl8169_get_base_stats(struct net_device *dev, + struct netdev_queue_stats_rx *rx, + struct netdev_queue_stats_tx *tx) +{ + rx->packets = 0; + rx->bytes = 0; + tx->packets = 0; + tx->bytes = 0; +} + +static const struct netdev_stat_ops rtl8169_stat_ops = { + .get_queue_stats_rx = rtl8169_get_queue_stats_rx, + .get_queue_stats_tx = rtl8169_get_queue_stats_tx, + .get_base_stats = rtl8169_get_base_stats, +}; + static void rtl8169_net_suspend(struct rtl8169_private *tp) { netif_device_detach(tp->dev); @@ -5615,6 +5684,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) SET_NETDEV_DEV(dev, &pdev->dev); dev->netdev_ops = &rtl_netdev_ops; + dev->stat_ops = &rtl8169_stat_ops; tp = netdev_priv(dev); tp->dev = dev; tp->pci_dev = pdev; -- 2.51.2