From nobody Sun Feb 8 14:31:03 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) (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 4C2012BEFEF; Wed, 5 Nov 2025 07:52:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.154.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762329158; cv=none; b=JmaT82DszwMiY4mJMCfLj5j/C06SHYkNOwUezXl8//n1Zr0inLjg19NfHOXzUcPgk2YPvFu3GUIKC1TM+/VsK2U/X0Hv1EzxF5LHnXI/HOG+t2tGLIJywuWv29LKzXTvnWMsp2GfZxFiNS0j6mYQ9xsgqpdLuOeXCtadFHCyeVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762329158; c=relaxed/simple; bh=AP6iw/C+qSN0VhEoNPlaRqVGq/0omuQEYyq9jskelWo=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=WYxSI3vqU1AAOEOs79Rm3ShiumcQhn+KyPEB97gihYhIQlrQTvzRX1jVkRoSJRe77CrwuH8FtAJnJc2nBMitcc/RiLZzdeTMeOctqAirUEdNx2qBVc3jtOzy84DEddi/Dlzay1U9eCN5aBfWhORlBUFYamjxuO1Wtd9HtU/x+/E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=kKSUZjOz; arc=none smtp.client-ip=68.232.154.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="kKSUZjOz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1762329156; x=1793865156; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=AP6iw/C+qSN0VhEoNPlaRqVGq/0omuQEYyq9jskelWo=; b=kKSUZjOzED1TmCye/v1WFJ2CnZpO3ou1oZ1qHdRVE/R+E6ljaW9+ueuh q25XXc/pAe2HHQVi2jaEIQ4ciPN/COyFjpEOoYW2US1zhXQDPFiRFNNsO mLlzThOC5cqJxA5SAB/z8DpJeERAxXcDif1dx35ENbJ2+EG7BFDyGUw/H OOZcjcCLA3vmPXyigUIQJNAC4/LDi/sOm64KtSAPuz6m9U+kyARbVHtDk 0RE/sjimYJ4HXOM1gtlQhGoH5+ZrZteh1+YUHjVQFKb36shl7hSNaV0/t Pd1/JhISjrjMy1H58P89yuTia9yxJo3ZLwwjk5cHdCddGo/lM6BvGDqIn A==; X-CSE-ConnectionGUID: vGo73ZIDT7+RbrhE2gduWw== X-CSE-MsgGUID: AnOy/bNYRP6oDyB9RL62Fg== X-IronPort-AV: E=Sophos;i="6.19,281,1754982000"; d="scan'208";a="48068506" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa4.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2025 00:52:35 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.87.72) by chn-vm-ex4.mchp-main.com (10.10.87.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.29; Wed, 5 Nov 2025 00:52:24 -0700 Received: from DEN-DL-M31836.microchip.com (10.10.85.11) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Wed, 5 Nov 2025 00:52:22 -0700 From: Horatiu Vultur To: , , , , , CC: , , Horatiu Vultur Subject: [PATCH net] lan966x: Fix sleeping in atomic context Date: Wed, 5 Nov 2025 08:49:55 +0100 Message-ID: <20251105074955.1766792-1-horatiu.vultur@microchip.com> X-Mailer: git-send-email 2.34.1 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" The following warning was seen when we try to connect using ssh to the devi= ce. BUG: sleeping function called from invalid context at kernel/locking/mutex.= c:575 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 104, name: dropbear preempt_count: 1, expected: 0 INFO: lockdep is turned off. CPU: 0 UID: 0 PID: 104 Comm: dropbear Tainted: G W 6.18.0-= rc2-00399-g6f1ab1b109b9-dirty #530 NONE Tainted: [W]=3DWARN Hardware name: Generic DT based system Call trace: unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x7c/0xac dump_stack_lvl from __might_resched+0x16c/0x2b0 __might_resched from __mutex_lock+0x64/0xd34 __mutex_lock from mutex_lock_nested+0x1c/0x24 mutex_lock_nested from lan966x_stats_get+0x5c/0x558 lan966x_stats_get from dev_get_stats+0x40/0x43c dev_get_stats from dev_seq_printf_stats+0x3c/0x184 dev_seq_printf_stats from dev_seq_show+0x10/0x30 dev_seq_show from seq_read_iter+0x350/0x4ec seq_read_iter from seq_read+0xfc/0x194 seq_read from proc_reg_read+0xac/0x100 proc_reg_read from vfs_read+0xb0/0x2b0 vfs_read from ksys_read+0x6c/0xec ksys_read from ret_fast_syscall+0x0/0x1c Exception stack(0xf0b11fa8 to 0xf0b11ff0) 1fa0: 00000001 00001000 00000008 be9048d8 00001000 000000= 01 1fc0: 00000001 00001000 00000008 00000003 be905920 0000001e 00000000 000000= 01 1fe0: 0005404c be9048c0 00018684 b6ec2cd8 It seems that we are using a mutex in a atomic context which is wrong. Change the mutex with a spinlock. Fixes: 12c2d0a5b8e2 ("net: lan966x: add ethtool configuration and statistic= s") Signed-off-by: Horatiu Vultur Reviewed-by: Jacob Keller --- .../microchip/lan966x/lan966x_ethtool.c | 18 +++++++++--------- .../ethernet/microchip/lan966x/lan966x_main.c | 2 -- .../ethernet/microchip/lan966x/lan966x_main.h | 4 ++-- .../microchip/lan966x/lan966x_vcap_impl.c | 8 ++++---- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_ethtool.c b/dri= vers/net/ethernet/microchip/lan966x/lan966x_ethtool.c index 2474dfd330f46..fe4e614052840 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_ethtool.c @@ -294,7 +294,7 @@ static void lan966x_stats_update(struct lan966x *lan966= x) { int i, j; =20 - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); =20 for (i =3D 0; i < lan966x->num_phys_ports; i++) { uint idx =3D i * lan966x->num_stats; @@ -310,7 +310,7 @@ static void lan966x_stats_update(struct lan966x *lan966= x) } } =20 - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); } =20 static int lan966x_get_sset_count(struct net_device *dev, int sset) @@ -365,7 +365,7 @@ static void lan966x_get_eth_mac_stats(struct net_device= *dev, =20 idx =3D port->chip_port * lan966x->num_stats; =20 - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); =20 mac_stats->FramesTransmittedOK =3D lan966x->stats[idx + SYS_COUNT_TX_UC] + @@ -416,7 +416,7 @@ static void lan966x_get_eth_mac_stats(struct net_device= *dev, lan966x->stats[idx + SYS_COUNT_RX_LONG] + lan966x->stats[idx + SYS_COUNT_RX_PMAC_LONG]; =20 - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); } =20 static const struct ethtool_rmon_hist_range lan966x_rmon_ranges[] =3D { @@ -442,7 +442,7 @@ static void lan966x_get_eth_rmon_stats(struct net_devic= e *dev, =20 idx =3D port->chip_port * lan966x->num_stats; =20 - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); =20 rmon_stats->undersize_pkts =3D lan966x->stats[idx + SYS_COUNT_RX_SHORT] + @@ -500,7 +500,7 @@ static void lan966x_get_eth_rmon_stats(struct net_devic= e *dev, lan966x->stats[idx + SYS_COUNT_TX_SZ_1024_1526] + lan966x->stats[idx + SYS_COUNT_TX_PMAC_SZ_1024_1526]; =20 - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); =20 *ranges =3D lan966x_rmon_ranges; } @@ -603,7 +603,7 @@ void lan966x_stats_get(struct net_device *dev, =20 idx =3D port->chip_port * lan966x->num_stats; =20 - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); =20 stats->rx_bytes =3D lan966x->stats[idx + SYS_COUNT_RX_OCT] + lan966x->stats[idx + SYS_COUNT_RX_PMAC_OCT]; @@ -685,7 +685,7 @@ void lan966x_stats_get(struct net_device *dev, =20 stats->collisions =3D lan966x->stats[idx + SYS_COUNT_TX_COL]; =20 - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); } =20 int lan966x_stats_init(struct lan966x *lan966x) @@ -701,7 +701,7 @@ int lan966x_stats_init(struct lan966x *lan966x) return -ENOMEM; =20 /* Init stats worker */ - mutex_init(&lan966x->stats_lock); + spin_lock_init(&lan966x->stats_lock); snprintf(queue_name, sizeof(queue_name), "%s-stats", dev_name(lan966x->dev)); lan966x->stats_queue =3D create_singlethread_workqueue(queue_name); diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c b/driver= s/net/ethernet/microchip/lan966x/lan966x_main.c index 7001584f1b7a6..47752d3fde0b1 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c @@ -1261,7 +1261,6 @@ static int lan966x_probe(struct platform_device *pdev) =20 cancel_delayed_work_sync(&lan966x->stats_work); destroy_workqueue(lan966x->stats_queue); - mutex_destroy(&lan966x->stats_lock); =20 debugfs_remove_recursive(lan966x->debugfs_root); =20 @@ -1279,7 +1278,6 @@ static void lan966x_remove(struct platform_device *pd= ev) =20 cancel_delayed_work_sync(&lan966x->stats_work); destroy_workqueue(lan966x->stats_queue); - mutex_destroy(&lan966x->stats_lock); =20 lan966x_mac_purge_entries(lan966x); lan966x_mdb_deinit(lan966x); diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h b/driver= s/net/ethernet/microchip/lan966x/lan966x_main.h index 4f75f06883693..eea286c29474f 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h @@ -295,8 +295,8 @@ struct lan966x { const struct lan966x_stat_layout *stats_layout; u32 num_stats; =20 - /* workqueue for reading stats */ - struct mutex stats_lock; + /* lock for reading stats */ + spinlock_t stats_lock; u64 *stats; struct delayed_work stats_work; struct workqueue_struct *stats_queue; diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_vcap_impl.c b/d= rivers/net/ethernet/microchip/lan966x/lan966x_vcap_impl.c index a1471e38d1189..2a37fc1ba4bcd 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_vcap_impl.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_vcap_impl.c @@ -403,11 +403,11 @@ static void lan966x_es0_read_esdx_counter(struct lan9= 66x *lan966x, u32 counter; =20 id =3D id & 0xff; /* counter limit */ - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); lan_wr(SYS_STAT_CFG_STAT_VIEW_SET(id), lan966x, SYS_STAT_CFG); counter =3D lan_rd(lan966x, SYS_CNT(LAN966X_STAT_ESDX_GRN_PKTS)) + lan_rd(lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_PKTS)); - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); if (counter) admin->cache.counter =3D counter; } @@ -417,14 +417,14 @@ static void lan966x_es0_write_esdx_counter(struct lan= 966x *lan966x, { id =3D id & 0xff; /* counter limit */ =20 - mutex_lock(&lan966x->stats_lock); + spin_lock(&lan966x->stats_lock); lan_wr(SYS_STAT_CFG_STAT_VIEW_SET(id), lan966x, SYS_STAT_CFG); lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_GRN_BYTES)); lan_wr(admin->cache.counter, lan966x, SYS_CNT(LAN966X_STAT_ESDX_GRN_PKTS)); lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_BYTES)); lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_PKTS)); - mutex_unlock(&lan966x->stats_lock); + spin_unlock(&lan966x->stats_lock); } =20 static void lan966x_vcap_cache_write(struct net_device *dev, --=20 2.34.1