From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 74558307AF4 for ; Fri, 20 Feb 2026 18:32:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771612376; cv=none; b=GrYW9xdb4T+W3C3bv9oc1ws6qnxhY8V8X64OSgl3YYt3cH1/vOjHNN1Jk1VGUbuF58DOsR182dDUzCq4TCke/bXrHpY9zlb9hWANQt1xv1hUsf3Fj9531+btWLucOv3u9Ng7QiyYM3i1MghPw/xGn1RL5J8m1D86G06e3jLbDIQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771612376; c=relaxed/simple; bh=K7BhCXj0E/nLPBm19m08UFqnTFUFHR+vKsTmMuF7OcY=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QiGk/zUNcxkSsfetaEdaTruzQbU2k9L8OM6c8bMBEECPF40JbxecjooOknhxnxeRfJFc/VB0YY5r3Y+VV+5RVYdke0uaKx77YEX0kPLbEF1XOizpgZsLUp+VLm4aDP6NfpKqflZMSwmdGOlv3JhbEbozry4BNWvT5n2qefeoTvg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hlCaPA2m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hlCaPA2m" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B631DC116C6; Fri, 20 Feb 2026 18:32:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771612376; bh=K7BhCXj0E/nLPBm19m08UFqnTFUFHR+vKsTmMuF7OcY=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=hlCaPA2mmWlD84jYCAVHTvRiCdGumgYL65iUS33dTezHPnDIePgPlJTFmZC4JTqeP rVEocfm7k46vbsmHDcAXD4X94yfqLUNio4ppNkjGb/dfwRJkD4biCuhjX6j7IghTbG 7qvpTDm3O73oUOfwP/21SIQ9Sp041NgR/v2nOF8m/iPozxai5cnGF4FDpvAtGejNAQ gApTxk2o/yvVaqL7txFdJ9j44CUACE8vM6OcESY/YFs2aPd73i92KD6TmNMZT+cziy cz0uhNpso4jjiUxSd6GZJE5GXc7IP8Vn0ECIRS9n5HNNPFdP5AihUQpSre0bN7KQhF spQRpVPruJkYg== Date: Fri, 20 Feb 2026 10:32:54 -0800 From: Jakub Kicinski To: Eric Dumazet Cc: davem@davemloft.net, netdev@vger.kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, sdf@fomichev.me, hawk@kernel.org, alexander.h.duyck@intel.com Subject: Re: [PATCH net] net: consume xmit errors of GSO frames Message-ID: <20260220103254.69e087e6@kernel.org> In-Reply-To: References: <20260220170032.2964535-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Fri, 20 Feb 2026 18:17:14 +0100 Eric Dumazet wrote: > This rings a bell. > > I sent back in October something in the same vein. > > https://www.spinics.net/lists/netdev/msg1131452.html Yes, I had a recollection of you explaining this problem in the past. Otherwise I would have never thought of this path! :) If we want to cover the BUSY case maybe the patch below? Too messy? diff --git a/net/core/dev.c b/net/core/dev.c index 096b3ff13f6b..65b7c54e1bef 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4822,6 +4822,8 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) * to -1 or to their cpu id, but not to our id. */ if (READ_ONCE(txq->xmit_lock_owner) != cpu) { + bool is_list = false, completed = false; + if (dev_xmit_recursion()) goto recursion_alert; @@ -4832,17 +4834,27 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) HARD_TX_LOCK(dev, txq, cpu); if (!netif_xmit_stopped(txq)) { + /* GSO segments a single SKB into + * a list of frames. TCP expects error + * to mean none of the data was sent. + */ + is_list = !!skb->next; + dev_xmit_recursion_inc(); skb = dev_hard_start_xmit(skb, dev, txq, &rc); dev_xmit_recursion_dec(); - if (dev_xmit_complete(rc)) { - HARD_TX_UNLOCK(dev, txq); - goto out; - } + completed = dev_xmit_complete(rc); + if (is_list) + rc = NETDEV_TX_OK; } HARD_TX_UNLOCK(dev, txq); + if (completed) + goto out; + net_crit_ratelimited("Virtual device %s asks to queue packet!\n", dev->name); + if (!is_list) + rc = -ENETDOWN; } else { /* Recursion is detected! It is possible, * unfortunately @@ -4850,10 +4862,10 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) recursion_alert: net_crit_ratelimited("Dead loop on virtual device %s, fix it urgently!\n", dev->name); + rc = -ENETDOWN; } } - rc = -ENETDOWN; rcu_read_unlock_bh(); dev_core_stats_tx_dropped_inc(dev);