From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx.nabladev.com (mx.nabladev.com [178.251.229.89]) (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 26CEC1A262A; Tue, 7 Apr 2026 21:23:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.251.229.89 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775597033; cv=none; b=kwdq/Gm/MFAjZ0tMIIw9uIr863xHuxkftppAQNwtWVI6hu34Yd8yCMKO+hF5KI76afLyvqUTo0M9gBV2ITObmauDyeyh6BIJ56ES9Ey+BnC3sXVP5nO1SPiMHZwscYSreD88aGS5vzjCIugCFySUt9lzncgDrUH2SjkTrghXTqc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775597033; c=relaxed/simple; bh=D2FV4mmR3Mv3FZcepcDCPIBpYElD6Alzkwfl2bNaCOs=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Rb9ap10GDHXMazZ2vrw0Y6kKD3OjPzQU6mqEBBWa0wMaE6GYPyecwDf/E0RGZ1o26nbnP02xZeccOgWjbeJ8XkCI4RbGc8K7bUXZ2D2BctwdSAfN/sDFDirkjPELN6SfoazcWlhAJ6eSRoSkBGFA8hFTrW12nrdHUO0iOgelms4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nabladev.com; spf=pass smtp.mailfrom=nabladev.com; dkim=pass (2048-bit key) header.d=nabladev.com header.i=@nabladev.com header.b=X6GAkcee; arc=none smtp.client-ip=178.251.229.89 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nabladev.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nabladev.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nabladev.com header.i=@nabladev.com header.b="X6GAkcee" Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id EF9131133B5; Tue, 7 Apr 2026 23:23:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nabladev.com; s=dkim; t=1775597029; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding; bh=5pruJMXvEGtxNqSK13NCzI9Ss3op0hP30Lb+hUiwnMA=; b=X6GAkceeZy+f+dJ3dAEHeeF/JDDZUc5v7UCEl6BLMOCP8qOvrBpZyjsBRLFh7kpeA4EmJz 2eponU61Q/nkVDSBQLOPZmQIPRzs+d00x3DDN+J2JN7lTLHcng2JujTVL0xTJa6VAvup6S ltHj4Mi+D9yXnlTLopaPKgceHb80j9JaoxBF6jluD840eUnPEJYHYi2AJIskTdFcqe7/zx IUFc+j40i3l/xmjZn2vrRob95yfE6TOiahpKpHQqg3SYZU03OKKxus6F9mTL+OQrQqxQdt yyfIpkff1ixuqwnqFi0urDSNwwESpA8wuAQOn4cu+lk3+oS4Ap1cD1tWdLhB3g== From: Marek Vasut To: netdev@vger.kernel.org Cc: Marek Vasut , stable@vger.kernel.org, "David S. Miller" , Andrew Lunn , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Ronald Wahl , Yicong Hui , linux-kernel@vger.kernel.org Subject: [net,PATCH] net: ks8851: Reinstate disabling of BHs around IRQ handler Date: Tue, 7 Apr 2026 23:23:33 +0200 Message-ID: <20260407212344.80265-1-marex@nabladev.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Last-TLS-Session-Version: TLSv1.3 If CONFIG_PREEMPT_RT=y is set AND the driver executes ks8851_irq() AND KSZ_ISR register bit IRQ_RXI is set AND ks8851_rx_pkts() detects that there are packets in the RX FIFO, then netdev_alloc_skb_ip_align() is called to allocate SKBs. If netdev_alloc_skb_ip_align() is called with BH enabled, local_bh_enable() at the end of netdev_alloc_skb_ip_align() will call __local_bh_enable_ip(), which will call __do_softirq(), which may trigger net_tx_action() softirq, which may ultimately call the xmit callback ks8851_start_xmit_par(). The ks8851_start_xmit_par() will try to lock struct ks8851_net_par .lock spinlock, which is already locked by ks8851_irq() from which ks8851_start_xmit_par() was called. This leads to a deadlock, which is reported by the kernel, including a trace listed below. Fix the problem by disabling BH around the IRQ handler, thus preventing the net_tx_action() softirq from triggering during the IRQ handler. The net_tx_action() softirq is now triggered at the end of the IRQ handler, once all the other IRQ handler actions have been completed. __schedule from schedule_rtlock+0x1c/0x34 schedule_rtlock from rtlock_slowlock_locked+0x538/0x894 rtlock_slowlock_locked from rt_spin_lock+0x44/0x5c rt_spin_lock from ks8851_start_xmit_par+0x68/0x1a0 ks8851_start_xmit_par from netdev_start_xmit+0x1c/0x40 netdev_start_xmit from dev_hard_start_xmit+0xec/0x1b0 dev_hard_start_xmit from sch_direct_xmit+0xb8/0x25c sch_direct_xmit from __qdisc_run+0x20c/0x4fc __qdisc_run from qdisc_run+0x1c/0x28 qdisc_run from net_tx_action+0x1f4/0x244 net_tx_action from handle_softirqs+0x1c0/0x29c handle_softirqs from __local_bh_enable_ip+0xdc/0xf4 __local_bh_enable_ip from __netdev_alloc_skb+0x140/0x194 __netdev_alloc_skb from ks8851_irq+0x348/0x4d8 ks8851_irq from irq_thread_fn+0x24/0x64 irq_thread_fn from irq_thread+0x110/0x1dc irq_thread from kthread+0x104/0x10c kthread from ret_from_fork+0x14/0x28 Fixes: e0863634bf9f ("net: ks8851: Queue RX packets in IRQ handler instead of disabling BHs") Cc: stable@vger.kernel.org Signed-off-by: Marek Vasut --- Cc: "David S. Miller" Cc: Andrew Lunn Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Ronald Wahl Cc: Yicong Hui Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org --- drivers/net/ethernet/micrel/ks8851_common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/micrel/ks8851_common.c b/drivers/net/ethernet/micrel/ks8851_common.c index 8048770958d60..dadedea016fac 100644 --- a/drivers/net/ethernet/micrel/ks8851_common.c +++ b/drivers/net/ethernet/micrel/ks8851_common.c @@ -316,6 +316,7 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) unsigned int status; struct sk_buff *skb; + local_bh_disable(); ks8851_lock(ks, &flags); status = ks8851_rdreg16(ks, KS_ISR); @@ -381,6 +382,7 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) if (status & IRQ_RXI) while ((skb = __skb_dequeue(&rxq))) netif_rx(skb); + local_bh_enable(); return IRQ_HANDLED; } -- 2.53.0