From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794591249; b=JhXrOnmLhfRnHArvirrkgNiH5NlV6JsA3tNXyPy3t4L7dK3wDjul6CRnrnViGZCWUAkK KKyjSjJeTjVU1xTVpQ5BW0dRiKf/ZEuiApwr+lh6B4dT7WUOSnjyAa23ZqFjyT7XM8gny lhrec9mxJPuYrlWc0VjjyXY+LdFp57urbTtdnYr/ygH5bBLMRaq83VevdvUXZO4gd8xSl OB0RP7kitLkZDKiiGfhCuu/q+C0XDANHBj6eWnHZ/pAZTz75dFS1zDG1Nq9k29bxWHHmg n2mliyHdzoqUoZ7Qp7zXxl8e3Wy2qg4VIlXFNUy1OVFsprbQDNibdaPgNeIgZC/9Xvw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794591249; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:User-Agent:X-stable:X-Patchwork-Hint: MIME-Version:Content-Transfer-Encoding; bh=H72eI2YCy2MSFbo/jDwD9newU/B5MOzfNSapKa4QAT4=; b=g0MmFPJ4cBVR0/b1Eu2HR6TUAMQDXsOyKgrdaWBHqGZ9ngvQ1wd7ESCQIBJNJ/yGq5yH cbWb6W4ly1vwlJgLT8vTzmayNSAzHA+hNL83fnA4eHqTTOJfYk1wE+jcA2dMYxYYP3VpX et2XeMA0Gvcev/UD/H1RWQVuv0zRdZZxru49Nnd8k4nRnKmWJoztP/6VAty48xSN2jv6f Q6z9vfEP9lqT3999gBXVxkRNnA7qE7fs2/BPMlKs1cIiCFsJJQsBLu0pyOvA5BqZox9Ii +6MNYYehvQwyL0ngUs57Syub/KP9N2H+EiIo1RoplQgDZDPdKSHjBr5p4dQKLNuy0nA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=Vmh7whCX; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73BB260A262A; Fri, 13 Nov 2026 17:34:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=Vmh7whCX Received: by smtp.kernel.org (Postfix) with ESMTPSA id 206C21F000C4; Fri, 13 Nov 2026 17:34:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1794591249; bh=H72eI2YCy2MSFbo/jDwD9newU/B5MOzfNSapKa4QAT4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Vmh7whCXvai1OslB2CvdF1guEqziXpq2wUQWLrHMnk4pOfdIYPs8QSmwflalQ/RQv qD/f3Ox+RcXZVWpnAUezMmkWb1Fe5hdkAklM+q9gsgAqSXCUDu8KntEKM0AAAV2XWt zFnjcArQvSNYzjCOhhYXQ7m6igFup39WetUATi0A= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Ray Zhang , Kuniyuki Iwashima , Eric Dumazet , Paolo Abeni , Sasha Levin Subject: [PATCH 6.12 374/670] net: count last skb of each sk_backlog pass in __release_sock() Date: Fri, 13 Nov 2026 10:48:58 -0500 Message-ID: <20261113153824.464617029@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261113153811.177190860@linuxfoundation.org> References: <20261113153811.177190860@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: stable@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.12-stable review patch. If anyone has any objections, please let me know. ------------------ From: Ray Zhang [ Upstream commit c4e4056b21355356f6a95bcdf03a850edd9f49e7 ] Running 500 concurrent TCPv6 streams (neper "tcp_stream -6 -T 1 -F 500") on a 2-core Cortex-A53 (CONFIG_PREEMPT_NONE=y, HZ=1000, LATENCY_WARN) triggers resched_latency_warn() in __release_sock(): [ 3655.311821] sched: CPU 0 need_resched set for > 100006892 ns (100 ticks) without schedule [ 3655.311889] Call trace: ... [ 3655.311944] resched_latency_warn+0x7c/0x88 [ 3655.311958] sched_tick+0x1c0/0x418 ... [ 3655.312578] net_rx_action+0x238/0x438 ... [ 3655.312641] do_softirq+0x4c/0x90 [ 3655.312651] __local_bh_enable_ip+0x84/0x90 [ 3655.312663] local_bh_enable+0x1c/0x28 [ 3655.312674] __dev_queue_xmit+0x4a8/0xb00 ... [ 3655.312782] tcp_v6_do_rcv+0x240/0x5f8 [ 3655.312793] __release_sock+0x9c/0x188 [ 3655.312806] release_sock+0x150/0x168 [ 3655.312817] tcp_sendmsg+0x4c/0x70 __release_sock() can loop past 100 ms without calling cond_resched(): - Each outer-loop pass drains sk_backlog, but "if (!skb) break;" runs before "++nb", so a pass of B skbs only adds B - 1 to nb (0 for 1 skb). - With 500 TCPv6 streams and NAPI sharing two Cortex-A53 cores, runnable tasks keep TIF_NEED_RESCHED set on CPU 0. - During spin_unlock_bh() and TX softirqs (__dev_queue_xmit() -> local_bh_enable()), tcp_add_backlog() coalesces arriving pure ACKs into a single tail skb. - Repeated 1-skb passes never advance nb or call cond_resched(), triggering resched_latency_warn() after 100 ticks. Restore the do-while loop and drop "if (!skb) break;" so every skb increments nb across passes and calls cond_resched() every 16 skbs. Reproduced the issue and verified the fix on two 2-core Cortex-A53 hosts (CONFIG_PREEMPT_NONE=y, HZ=1000, LATENCY_WARN, latency_warn_once=0) with a userspace reproducer over /dev/net/tun: - CPU 0 runs a TCPv6 sender and a second runnable task while CPU 1 writes pure ACKs to /dev/net/tun (~30k TCPBacklogCoalesce/run), sustaining 1-skb sk_backlog refills in __release_sock() for ~400 ms (ftrace). - Before: CPU 0 stayed unscheduled in __release_sock(), hitting resched_latency_warn() 293 and 275 times on the two hosts (> 100.9 ms). - After: cond_resched() yielded CPU 0 inside __release_sock(), with 0 resched_latency_warn() hits on both hosts. - Also observed no regression with the workload from commit 16c610162d1f ("net: call cond_resched() less often in __release_sock()"), "super_netperf 4 -H srv -T,10 -l 3000 &". Fixes: 16c610162d1f ("net: call cond_resched() less often in __release_sock()") Cc: stable@vger.kernel.org Signed-off-by: Ray Zhang Reviewed-by: Kuniyuki Iwashima Reviewed-by: Eric Dumazet Link: https://patch.msgid.link/20261101075145.698399-1-sgzhang@google.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/core/sock.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 181a66488ec21..6a718b8e1dde5 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3131,7 +3131,7 @@ void __release_sock(struct sock *sk) spin_unlock_bh(&sk->sk_lock.slock); - while (1) { + do { next = skb->next; prefetch(next); DEBUG_NET_WARN_ON_ONCE(skb_dst_is_noref(skb)); @@ -3139,12 +3139,10 @@ void __release_sock(struct sock *sk) sk_backlog_rcv(sk, skb); skb = next; - if (!skb) - break; if (!(++nb & 15)) cond_resched(); - } + } while (skb); spin_lock_bh(&sk->sk_lock.slock); } -- 2.53.0