From nobody Fri Oct 3 10:15:05 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (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 68CB82FA0DB; Tue, 2 Sep 2025 12:18:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756815493; cv=none; b=sntcSEOC2SIsVsD+pzuQSFaC4MAMece6laYYVBAjCt5ZopNGbW3SiSVyjMRwPojlqieXckcmiqrhsF2BBH8/e3wcfGVE2OTw01cOiiWSCcW6E7MnSIbYGoYU5d4w29puon7ObgrHahpU3K7Es+nYeTs6aur4DFQ8cbxWhT9InpM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756815493; c=relaxed/simple; bh=8MQuwFTABPkO9ySA/Qz0a4ZCUshzU7SVMBVe7/oGLuE=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=aj4oMwR6sphggpm5lPG9KCBeydcWH1SFZFT+mDhWBg3dcLEkGZfUPO4NtUv6Op/JJhqlu7TPl2wNgE7wuIz3AZ6b5ThPuF4N7rl5N2CyfkC9ewrvYmQ9klKrRQnTSJMUv0mQ4GX174qcEfaiHinjR54BW3kcEIRlHT8FctyiuXU= 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=S7V0IlVe; arc=none smtp.client-ip=68.232.153.233 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="S7V0IlVe" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1756815491; x=1788351491; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=8MQuwFTABPkO9ySA/Qz0a4ZCUshzU7SVMBVe7/oGLuE=; b=S7V0IlVebgfoOrYYg7/lT15y5MvdTIDG1L6pa3Hx28I9zs5549ZSXfbR qiGqCndPArsJfdzaEth6etcfPCvCJz9aMkpRr/w281ak1DR86RFUcrWuN TLJX2ZvNPpVyM8s6uMaeboyVl+nJMGjw7/J8XCRjlGuePkKP3w3f+hah0 hGPnTxXNV48eAsIiJDzfO35jpquPLEHwRZ84OGoqXqJvykepKcdzEP6MB voIZE9dT3SQuEBCU3D7KlLA/ZMGwpuqUdZYCvnVtw0GW4JOxruSrvzDOF C9UGAXup3kRW+R65AbSrq/TdOW7jU6sCRgpBvWFSmrLQNaxbDW+Kh1gLC Q==; X-CSE-ConnectionGUID: b2GtH1jnQ62VBZ1JLxN0GQ== X-CSE-MsgGUID: dhNSDwMaS/2A7zy1rDTAbQ== X-IronPort-AV: E=Sophos;i="6.18,230,1751266800"; d="scan'208";a="51627327" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 02 Sep 2025 05:18:10 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.44; Tue, 2 Sep 2025 05:17:29 -0700 Received: from DEN-DL-M31836.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.44 via Frontend Transport; Tue, 2 Sep 2025 05:17:27 -0700 From: Horatiu Vultur To: , , , , , , , , , , , , CC: , , Horatiu Vultur Subject: [PATCH net v3] phy: mscc: Stop taking ts_lock for tx_queue and use its own lock Date: Tue, 2 Sep 2025 14:12:59 +0200 Message-ID: <20250902121259.3257536-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" When transmitting a PTP frame which is timestamp using 2 step, the following warning appears if CONFIG_PROVE_LOCKING is enabled: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D [ BUG: Invalid wait context ] 6.17.0-rc1-00326-ge6160462704e #427 Not tainted Reviewed-by: Vadim Fedorenko ----------------------------- ptp4l/119 is trying to lock: c2a44ed4 (&vsc8531->ts_lock){+.+.}-{3:3}, at: vsc85xx_txtstamp+0x50/0xac other info that might help us debug this: context-{4:4} 4 locks held by ptp4l/119: #0: c145f068 (rcu_read_lock_bh){....}-{1:2}, at: __dev_queue_xmit+0x58/0x1= 440 #1: c29df974 (dev->qdisc_tx_busylock ?: &qdisc_tx_busylock){+...}-{2:2}, a= t: __dev_queue_xmit+0x5c4/0x1440 #2: c2aaaad0 (_xmit_ETHER#2){+.-.}-{2:2}, at: sch_direct_xmit+0x108/0x350 #3: c2aac170 (&lan966x->tx_lock){+.-.}-{2:2}, at: lan966x_port_xmit+0xd0/0= x350 stack backtrace: CPU: 0 UID: 0 PID: 119 Comm: ptp4l Not tainted 6.17.0-rc1-00326-ge616046270= 4e #427 NONE 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 __lock_acquire+0x8e8/0x29dc __lock_acquire from lock_acquire+0x108/0x38c lock_acquire from __mutex_lock+0xb0/0xe78 __mutex_lock from mutex_lock_nested+0x1c/0x24 mutex_lock_nested from vsc85xx_txtstamp+0x50/0xac vsc85xx_txtstamp from lan966x_fdma_xmit+0xd8/0x3a8 lan966x_fdma_xmit from lan966x_port_xmit+0x1bc/0x350 lan966x_port_xmit from dev_hard_start_xmit+0xc8/0x2c0 dev_hard_start_xmit from sch_direct_xmit+0x8c/0x350 sch_direct_xmit from __dev_queue_xmit+0x680/0x1440 __dev_queue_xmit from packet_sendmsg+0xfa4/0x1568 packet_sendmsg from __sys_sendto+0x110/0x19c __sys_sendto from sys_send+0x18/0x20 sys_send from ret_fast_syscall+0x0/0x1c Exception stack(0xf0b05fa8 to 0xf0b05ff0) 5fa0: 00000001 0000000e 0000000e 0004b47a 0000003a 000000= 00 5fc0: 00000001 0000000e 00000000 00000121 0004af58 00044874 00000000 000000= 00 5fe0: 00000001 bee9d420 00025a10 b6e75c7c So, instead of using the ts_lock for tx_queue, use the spinlock that skb_buff_head has. Reviewed-by: Vadim Fedorenko Fixes: 7d272e63e0979d ("net: phy: mscc: timestamping and PHC support") Signed-off-by: Horatiu Vultur --- v2->v3: - replace skb_queue_len with skb_queue_len_lockless v1->v2: - initialize tx_queue in ptp_probe - purge the tx_queue when the driver is removed or when TX timestamping is OFF --- drivers/net/phy/mscc/mscc_ptp.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_pt= p.c index 72847320cb652..d692df7d975c7 100644 --- a/drivers/net/phy/mscc/mscc_ptp.c +++ b/drivers/net/phy/mscc/mscc_ptp.c @@ -456,12 +456,12 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *p= tp) *p++ =3D (reg >> 24) & 0xff; } =20 - len =3D skb_queue_len(&ptp->tx_queue); + len =3D skb_queue_len_lockless(&ptp->tx_queue); if (len < 1) return; =20 while (len--) { - skb =3D __skb_dequeue(&ptp->tx_queue); + skb =3D skb_dequeue(&ptp->tx_queue); if (!skb) return; =20 @@ -486,7 +486,7 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp) * packet in the FIFO right now, reschedule it for later * packets. */ - __skb_queue_tail(&ptp->tx_queue, skb); + skb_queue_tail(&ptp->tx_queue, skb); } } =20 @@ -1068,6 +1068,7 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *m= ii_ts, case HWTSTAMP_TX_ON: break; case HWTSTAMP_TX_OFF: + skb_queue_purge(&vsc8531->ptp->tx_queue); break; default: return -ERANGE; @@ -1092,9 +1093,6 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *m= ii_ts, =20 mutex_lock(&vsc8531->ts_lock); =20 - __skb_queue_purge(&vsc8531->ptp->tx_queue); - __skb_queue_head_init(&vsc8531->ptp->tx_queue); - /* Disable predictor while configuring the 1588 block */ val =3D vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR); @@ -1180,9 +1178,7 @@ static void vsc85xx_txtstamp(struct mii_timestamper *= mii_ts, =20 skb_shinfo(skb)->tx_flags |=3D SKBTX_IN_PROGRESS; =20 - mutex_lock(&vsc8531->ts_lock); - __skb_queue_tail(&vsc8531->ptp->tx_queue, skb); - mutex_unlock(&vsc8531->ts_lock); + skb_queue_tail(&vsc8531->ptp->tx_queue, skb); return; =20 out: @@ -1548,6 +1544,7 @@ void vsc8584_ptp_deinit(struct phy_device *phydev) if (vsc8531->ptp->ptp_clock) { ptp_clock_unregister(vsc8531->ptp->ptp_clock); skb_queue_purge(&vsc8531->rx_skbs_list); + skb_queue_purge(&vsc8531->ptp->tx_queue); } } =20 @@ -1571,7 +1568,7 @@ irqreturn_t vsc8584_handle_ts_interrupt(struct phy_de= vice *phydev) if (rc & VSC85XX_1588_INT_FIFO_ADD) { vsc85xx_get_tx_ts(priv->ptp); } else if (rc & VSC85XX_1588_INT_FIFO_OVERFLOW) { - __skb_queue_purge(&priv->ptp->tx_queue); + skb_queue_purge(&priv->ptp->tx_queue); vsc85xx_ts_reset_fifo(phydev); } =20 @@ -1591,6 +1588,7 @@ int vsc8584_ptp_probe(struct phy_device *phydev) mutex_init(&vsc8531->phc_lock); mutex_init(&vsc8531->ts_lock); skb_queue_head_init(&vsc8531->rx_skbs_list); + skb_queue_head_init(&vsc8531->ptp->tx_queue); =20 /* Retrieve the shared load/save GPIO. Request it as non exclusive as * the same GPIO can be requested by all the PHYs of the same package. --=20 2.34.1