From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C01A2F99352 for ; Thu, 23 Apr 2026 08:31:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:From:References:Cc:To:Subject:MIME-Version:Date: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=gLQ2QJLY+AQR6FFwHQfI1wULr2cHcwHy9LUPLxUKoMQ=; b=znmt1eBCXU2LqC470kbLZxZWQt otj7/kKlZ1/RPg8/VyH7YHztPPcxwNr0I5fI8FCXgu9Wo6q4ABnDhW1ZwsQj46z8VHyg1D2EnQ9EK 8KC+3Mcky3HZEfhEcfutqSSFOMA5jqOEi1E5c53SXEtCsj0uKmoJN8d1iIKd3ZvDxGUJafM+9uHDd DFN2RjU6npolBaioS7BO/8Ag430EkRY6Znc84UdggaBTRpdQ3PUP9Ouh/XJjVUgndyffqrH14J79C 7xeDj+GrtzFCSTcimzBPcHznwPpqSy7LhA3r/YZjYMBxpHPAGZ8ztMV/JBGet9xSOZKt8aTV9OB9S cgLEWLzw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1wFpSq-0000000BFv0-0YIo; Thu, 23 Apr 2026 08:31:12 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wFpSg-0000000BFtM-0won for linux-arm-kernel@lists.infradead.org; Thu, 23 Apr 2026 08:31:11 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776933046; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gLQ2QJLY+AQR6FFwHQfI1wULr2cHcwHy9LUPLxUKoMQ=; b=gxcAOi8BEkgKSvzlbN161HTgJmwdg+KV+DWooEV4pqgmvDaquYeq+VlacJwIKxeluTsaaF dce9AvQGeIKagw2rsEHuoOvQT6VBe5CYPhqTs7QthWmE8bYNm/PSkp7FFASlGaVxkYsmIQ xgxx/mgUm58ivpl4IsN2nOqdRoW5NeQ= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-20-sugp22kyP6SHahQFu3GWpQ-1; Thu, 23 Apr 2026 04:30:43 -0400 X-MC-Unique: sugp22kyP6SHahQFu3GWpQ-1 X-Mimecast-MFC-AGG-ID: sugp22kyP6SHahQFu3GWpQ_1776933042 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-48919890a95so30516175e9.2 for ; Thu, 23 Apr 2026 01:30:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776933042; x=1777537842; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=gLQ2QJLY+AQR6FFwHQfI1wULr2cHcwHy9LUPLxUKoMQ=; b=froz5sNz5ov0qzNoOeZQVCC8sOdAvNAPsxYa0v1KukLnmy7uahOaz5ra7tqHt0Otel BWYDJ7QKVxPcjPcRCGYiQj85hL5TpykdXEI5af2KCke9d2MWN3fp19UnMNx9UnPQOEbv LDA/oIWLj+YFe8I5YnGhK20HJT/HamH+eKajfhGmiY3KbK8nprCYnB8brej7A50zOFaz YZSwn/EWGS9iqBnAt+91sgQYt8JHj6+WqnDtc6kwlGIjNHV3pOVszMhGHoTTIhWUkUaW 6itXj9ZaYQn8mZImZtmaPycg05KQwOOwM+9V/npd9WOOzQMqNuFnZ1Z06ocko4qkCNzV OzCQ== X-Forwarded-Encrypted: i=1; AFNElJ/QokXiIypdmn+X2a8PgRdz2oqsZnbPds952ZuYl6gxPeFJ2GmEtLKvuJQYk7Jxr6cbLvvCLM7R3+ed6LuO1aZg@lists.infradead.org X-Gm-Message-State: AOJu0YxibBVnLYnZlbfzLbgkhAWufFtXYBgBqSOA5ZxlakigB5EZ+/Jx +fZH+jP2F0JiGQfGn9kRvMbdZQq64AwXqUomemmlhtsuvRuJN7zYS9OLc0QMdzup30As1iciR3a 9dLIsThmIEkL9ZaprC60SO2Ydp/Do2zItNM2HtfGxqHNMTQRS3crFlM12PpUMkml9dUGqJnzuj0 Qx X-Gm-Gg: AeBDievaKh1ZirlBCaJ8xISsH+p94br5meynP4kXRHqU2hVwIdKx04QhsCCoZ5tsLNf 9KpeqEBQ4uLdVPPNBhXtUW3wsL0MzxUWQl2L1jERifJj6qVK9Sfor/c9wzTAm7b7SQ3i0eYBvKA gOnR4dOhGuR4zi+s6DFXkVBTPSTgLGzX+hMDtlKv7AwviWeUkDScAhqeFabrPLgZWy1zySJsYHX 9YaOizUa82VcluSnmf4B2gr+CGnY1NiYQ2887H+LTZnGWpnngTcvloHZLsLNhc1W6V+rzpbyxZw Nff7I/F5JEeywGiExQpZDnz6R9wGXoYYoOcctSz1aDBBmhd87O2gFz5HRco9/KebrJ5IIW35Dxj xRwDnv9ZKAp+WErhMmYY69Evbv9ZOLpVOgWwHwFpjk/MN1ET/YSIHgwQpGBldPy4IUHI= X-Received: by 2002:a05:600c:64c7:b0:488:a2ac:a334 with SMTP id 5b1f17b1804b1-488fb73aa3bmr388953815e9.3.1776933041293; Thu, 23 Apr 2026 01:30:41 -0700 (PDT) X-Received: by 2002:a05:600c:64c7:b0:488:a2ac:a334 with SMTP id 5b1f17b1804b1-488fb73aa3bmr388952835e9.3.1776933040577; Thu, 23 Apr 2026 01:30:40 -0700 (PDT) Received: from [192.168.88.32] ([150.228.93.216]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488fb77b001sm238148475e9.3.2026.04.23.01.30.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 23 Apr 2026 01:30:40 -0700 (PDT) Message-ID: <31829d8e-f760-4460-8f38-613f26206d87@redhat.com> Date: Thu, 23 Apr 2026 10:30:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net v2] net: dsa: mt7530: fix .get_stats64 sleeping in atomic context To: Daniel Golle , "Chester A. Unal" , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Matthias Brugger , AngeloGioacchino Del Regno , Russell King , Christian Marangi , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Cc: Frank Wunderlich , John Crispin References: <58aff8b5b1d691872342a6ffd3315f27854788a6.1776595131.git.daniel@makrotopia.org> From: Paolo Abeni In-Reply-To: <58aff8b5b1d691872342a6ffd3315f27854788a6.1776595131.git.daniel@makrotopia.org> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: VYYwzsBpHmZJQok_OcWVrFLoQ8hGviewbsuU6BmxFbA_1776933042 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260423_013104_492713_E5A298F4 X-CRM114-Status: GOOD ( 24.75 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 4/19/26 12:43 PM, Daniel Golle wrote: > The .get_stats64 callback runs in atomic context, but on > MDIO-connected switches every register read acquires the MDIO bus > mutex, which can sleep: > [ 12.645973] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:609 > [ 12.654442] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 759, name: grep > [ 12.663377] preempt_count: 0, expected: 0 > [ 12.667410] RCU nest depth: 1, expected: 0 > [ 12.671511] INFO: lockdep is turned off. > [ 12.675441] CPU: 0 UID: 0 PID: 759 Comm: grep Tainted: G S W 7.0.0+ #0 PREEMPT > [ 12.675453] Tainted: [S]=CPU_OUT_OF_SPEC, [W]=WARN > [ 12.675456] Hardware name: Bananapi BPI-R64 (DT) > [ 12.675459] Call trace: > [ 12.675462] show_stack+0x14/0x1c (C) > [ 12.675477] dump_stack_lvl+0x68/0x8c > [ 12.675487] dump_stack+0x14/0x1c > [ 12.675495] __might_resched+0x14c/0x220 > [ 12.675504] __might_sleep+0x44/0x80 > [ 12.675511] __mutex_lock+0x50/0xb10 > [ 12.675523] mutex_lock_nested+0x20/0x30 > [ 12.675532] mt7530_get_stats64+0x40/0x2ac > [ 12.675542] dsa_user_get_stats64+0x2c/0x40 > [ 12.675553] dev_get_stats+0x44/0x1e0 > [ 12.675564] dev_seq_printf_stats+0x24/0xe0 > [ 12.675575] dev_seq_show+0x14/0x3c > [ 12.675583] seq_read_iter+0x37c/0x480 > [ 12.675595] seq_read+0xd0/0xec > [ 12.675605] proc_reg_read+0x94/0xe4 > [ 12.675615] vfs_read+0x98/0x29c > [ 12.675625] ksys_read+0x54/0xdc > [ 12.675633] __arm64_sys_read+0x18/0x20 > [ 12.675642] invoke_syscall.constprop.0+0x54/0xec > [ 12.675653] do_el0_svc+0x3c/0xb4 > [ 12.675662] el0_svc+0x38/0x200 > [ 12.675670] el0t_64_sync_handler+0x98/0xdc > [ 12.675679] el0t_64_sync+0x158/0x15c > > For MDIO-connected switches, poll MIB counters asynchronously using a > delayed workqueue every second and let .get_stats64 return the cached > values under a spinlock. A mod_delayed_work() call on each read > triggers an immediate refresh so counters stay responsive when queried > more frequently. > > MMIO-connected switches (MT7988, EN7581, AN7583) are not affected > because their regmap does not sleep, so they continue to read MIB > counters directly in .get_stats64. > > Fixes: 88c810f35ed5 ("net: dsa: mt7530: implement .get_stats64") > Signed-off-by: Daniel Golle > Acked-by: Chester A. Unal > Reviewed-by: Andrew Lunn > --- > v2: > * use spin_lock_bh()/spin_unlock_bh() to prevent potential deadlock > * rate-limit mod_delayed_work() refresh to at most once per 100ms > * move cancel_delayed_work_sync() after dsa_unregister_switch() > * add mt753x_teardown() callback to cancel the stats work > * fix commit message > > drivers/net/dsa/mt7530.c | 66 ++++++++++++++++++++++++++++++++++++++-- > drivers/net/dsa/mt7530.h | 8 +++++ > 2 files changed, 71 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c > index b9423389c2ef0..8c1186ba2279b 100644 > --- a/drivers/net/dsa/mt7530.c > +++ b/drivers/net/dsa/mt7530.c > @@ -25,6 +25,9 @@ > > #include "mt7530.h" > > +#define MT7530_STATS_POLL_INTERVAL (1 * HZ) > +#define MT7530_STATS_RATE_LIMIT (HZ / 10) > + > static struct mt753x_pcs *pcs_to_mt753x_pcs(struct phylink_pcs *pcs) > { > return container_of(pcs, struct mt753x_pcs, pcs); > @@ -906,10 +909,9 @@ static void mt7530_get_rmon_stats(struct dsa_switch *ds, int port, > *ranges = mt7530_rmon_ranges; > } > > -static void mt7530_get_stats64(struct dsa_switch *ds, int port, > - struct rtnl_link_stats64 *storage) > +static void mt7530_read_port_stats64(struct mt7530_priv *priv, int port, > + struct rtnl_link_stats64 *storage) > { > - struct mt7530_priv *priv = ds->priv; > uint64_t data; > > /* MIB counter doesn't provide a FramesTransmittedOK but instead > @@ -951,6 +953,45 @@ static void mt7530_get_stats64(struct dsa_switch *ds, int port, > &storage->rx_crc_errors); > } > > +static void mt7530_stats_poll(struct work_struct *work) > +{ > + struct mt7530_priv *priv = container_of(work, struct mt7530_priv, > + stats_work.work); > + struct rtnl_link_stats64 stats = {}; > + struct dsa_port *dp; > + int port; > + > + dsa_switch_for_each_user_port(dp, priv->ds) { > + port = dp->index; > + > + mt7530_read_port_stats64(priv, port, &stats); > + > + spin_lock_bh(&priv->stats_lock); > + priv->ports[port].stats = stats; > + spin_unlock_bh(&priv->stats_lock); > + } > + > + priv->stats_last = jiffies; > + schedule_delayed_work(&priv->stats_work, > + MT7530_STATS_POLL_INTERVAL); > +} > + > +static void mt7530_get_stats64(struct dsa_switch *ds, int port, > + struct rtnl_link_stats64 *storage) > +{ > + struct mt7530_priv *priv = ds->priv; > + > + if (priv->bus) { > + spin_lock_bh(&priv->stats_lock); > + *storage = priv->ports[port].stats; > + spin_unlock_bh(&priv->stats_lock); > + if (time_after(jiffies, priv->stats_last + MT7530_STATS_RATE_LIMIT)) Since both the `stats_last` access and read are lockless, it looks like they may race leading wrong/unexpected delay. I think it would be better move both under the spinlock (yes, the write will happen multiple times per stats update, I don't think it will matter). /P