Linux kernel -stable discussions
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Eric Dumazet <edumazet@kernel.org>
Cc: "David S . Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Willem de Bruijn <willemb@google.com>,
	Simon Horman <horms@kernel.org>, <netdev@vger.kernel.org>,
	<stable@vger.kernel.org>,
	Tony Nguyen <anthony.l.nguyen@intel.com>,
	Przemek Kitszel <przemyslaw.kitszel@intel.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>
Subject: Re: [PATCH net] ixgbe: reserve TX timestamp after skb preparation
Date: Mon, 26 Oct 2026 14:42:44 +0100	[thread overview]
Message-ID: <at9Y1H+aZ1CI5Prp@boxer> (raw)
In-Reply-To: <20261026082035.335770-1-edumazet@kernel.org>

On Mon, Oct 26, 2026 at 09:20:35AM +0100, Eric Dumazet wrote:
> ixgbe_xmit_frame_ring() takes an extra skb reference with skb_get()
> for the pending TX timestamp before preparing the skb for transmit.
> Several of the following steps may need to reallocate the skb head:
> 
> - ixgbe_tso() calls skb_cow_head(), which reaches pskb_expand_head()
>   when the header is cloned (e.g. a packet tap holds a clone).
> - ixgbe_tx_csum() falls back to skb_checksum_help() for unsupported
>   checksum offsets, which can call pskb_expand_head() through
>   skb_ensure_writable().
> - With DCB and a software VLAN tag, skb_cow_head() is called to
>   rewrite the VLAN priority.
> 
> pskb_expand_head() used to BUG() on shared skbs. Since commit
> c7d8bc3dd511 ("net: skbuff: don't BUG() on bad arguments to
> pskb_expand_head()") it returns -EINVAL instead, so these packets
> are dropped (TSO, DCB) or sent with an unfinished checksum
> (skb_checksum_help() errors are ignored by ixgbe_tx_csum()).
> 
> Reserve the TX timestamp right before ixgbe_tx_map(), after all skb
> preparation, as i40e and ice already do. The timestamp request
> remains covered on the FCoE path, and the cleanup on ixgbe_tx_map()
> failure is unchanged.
> 
> Fixes: 891dc0821d20 ("ixgbe: Add ptp work item to poll for the Tx timestamp")
> Cc: stable@vger.kernel.org
> Signed-off-by: Eric Dumazet <edumazet@kernel.org>

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>

> ---
> Cc: Tony Nguyen <anthony.l.nguyen@intel.com>
> Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Cc: Andrew Lunn <andrew+netdev@lunn.ch>
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 40 +++++++++++--------
>  1 file changed, 23 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> index f91856498eb2d9e0e4173153c8c00bc2248bb708..b9496f0bee1312499f28c2f3c24fcff9a1e66e0d 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> @@ -9444,23 +9444,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
>  	}
>  	protocol = vlan_get_protocol(skb);
>  
> -	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
> -	    adapter->ptp_clock) {
> -		if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&
> -		    !test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS,
> -					   &adapter->state)) {
> -			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
> -			tx_flags |= IXGBE_TX_FLAGS_TSTAMP;
> -
> -			/* schedule check for Tx timestamp */
> -			adapter->ptp_tx_skb = skb_get(skb);
> -			adapter->ptp_tx_start = jiffies;
> -			schedule_work(&adapter->ptp_tx_work);
> -		} else {
> -			adapter->tx_hwtstamp_skipped++;
> -		}
> -	}
> -
>  #ifdef CONFIG_PCI_IOV
>  	/*
>  	 * Use the l2switch_enable flag - would be false if the DMA
> @@ -9525,6 +9508,29 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
>  #ifdef IXGBE_FCOE
>  xmit_fcoe:
>  #endif /* IXGBE_FCOE */
> +	/* Reserve the Tx timestamp only after all skb preparation:
> +	 * skb_get() makes the skb shared, and pskb_expand_head()
> +	 * (reached from skb_cow_head() or skb_checksum_help())
> +	 * refuses shared skbs.
> +	 */
> +	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
> +	    adapter->ptp_clock) {
> +		if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&
> +		    !test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS,
> +					   &adapter->state)) {
> +			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
> +			tx_flags |= IXGBE_TX_FLAGS_TSTAMP;
> +			first->tx_flags |= IXGBE_TX_FLAGS_TSTAMP;
> +
> +			/* schedule check for Tx timestamp */
> +			adapter->ptp_tx_skb = skb_get(skb);
> +			adapter->ptp_tx_start = jiffies;
> +			schedule_work(&adapter->ptp_tx_work);
> +		} else {
> +			adapter->tx_hwtstamp_skipped++;
> +		}
> +	}
> +
>  	if (ixgbe_tx_map(tx_ring, first, hdr_len))
>  		goto cleanup_tx_timestamp;
>  
> -- 
> 2.53.0
> 
> 

  parent reply	other threads:[~2026-10-26 13:42 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-26  8:20 [PATCH net] ixgbe: reserve TX timestamp after skb preparation Eric Dumazet
2026-10-26  8:26 ` netdev-bot+sinfo
2026-10-26  8:49   ` Eric Dumazet
2026-10-26 13:42 ` Maciej Fijalkowski [this message]
2026-10-27 11:40 ` patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=at9Y1H+aZ1CI5Prp@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=anthony.l.nguyen@intel.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=przemyslaw.kitszel@intel.com \
    --cc=stable@vger.kernel.org \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox