FAILED: patch "[PATCH] idpf: fix netdev Tx queue stop/wake" failed to apply to 6.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.10.y
git checkout FETCH_HEAD
git cherry-pick -x e4b398dd82f5d5867bc5f442c43abc8fba30ed2c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024100147-stark-hurry-20c2@gregkh' --subject-prefix 'PATCH 6.10.y' HEAD^..
Possible dependencies:
e4b398dd82f5 ("idpf: fix netdev Tx queue stop/wake")14f662b43bf8 ("idpf: merge singleq and splitq &net_device_ops") e4891e4687c8 ("idpf: split &idpf_queue into 4 strictly-typed queue structures") 66c27e3b19d5 ("idpf: stop using macros for accessing queue descriptors")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e4b398dd82f5d5867bc5f442c43abc8fba30ed2c Mon Sep 17 00:00:00 2001
From: Michal Kubiak <[email protected]>
Date: Wed, 4 Sep 2024 17:47:47 +0200
Subject: [PATCH] idpf: fix netdev Tx queue stop/wake
netif_txq_maybe_stop() returns -1, 0, or 1, while idpf_tx_maybe_stop_common() says it returns 0 or -EBUSY. As a result, there sometimes are Tx queue timeout warnings despite that the queue is empty or there is at least enough space to restart it. Make idpf_tx_maybe_stop_common() inline and returning true or false, handling the return of netif_txq_maybe_stop() properly. Use a correct goto in idpf_tx_maybe_stop_splitq() to avoid stopping the queue or incrementing the stops counter twice.
drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c +4 -0
@@ -375,6 +375,10 @@ netdev_tx_t idpf_tx_singleq_frame(struct sk_buff *skb, IDPF_TX_DESCS_FOR_CTX)) {idpf_tx_buf_hw_update (tx_q, tx_q->next_to_use, false); +u64_stats_update_begin (&tx_q->stats_sync); +u64_stats_inc (&tx_q->q_stats.q_busy); +u64_stats_update_end (&tx_q->stats_sync); +return NETDEV_TX_BUSY ; }
drivers/net/ethernet/intel/idpf/idpf_txrx.c +9 -26
@@ -2132,29 +2132,6 @@ void idpf_tx_splitq_build_flow_desc(union idpf_tx_flex_desc *desc, desc->flow.qw1.compl_tag =cpu_to_le16 (params->compl_tag); } -/** -* idpf_tx_maybe_stop_common - 1st level check for common Tx stop conditions -* @tx_q: the queue to be checked -* @size: number of descriptors we want to assure is available -* -* Returns 0 if stop is not needed -*/ -int idpf_tx_maybe_stop_common (struct idpf_tx_queue *tx_q,unsigned int size) -{ -struct netdev_queue *nq; - -if (likely (IDPF_DESC_UNUSED (tx_q) >= size)) -return 0 ; - -u64_stats_update_begin (&tx_q->stats_sync); -u64_stats_inc (&tx_q->q_stats.q_busy); -u64_stats_update_end (&tx_q->stats_sync); - - nq =netdev_get_tx_queue (tx_q->netdev, tx_q->idx); - -return netif_txq_maybe_stop (nq,IDPF_DESC_UNUSED (tx_q), size, size); -} -/** * idpf_tx_maybe_stop_splitq - 1st level check for Tx splitq stop conditions * @tx_q: the queue to be checked
@@ -2166,7 +2143,7 @@ static int idpf_tx_maybe_stop_splitq(struct idpf_tx_queue *tx_q, unsigned int descs_needed) {if (idpf_tx_maybe_stop_common (tx_q, descs_needed)) - goto splitq_stop; + goto out;/* If there are too many outstanding completions expected on the * completion queue, stop the TX queue to give the device some time to
@@ -2185,10 +2162,12 @@ static int idpf_tx_maybe_stop_splitq(struct idpf_tx_queue *tx_q,return 0 ; splitq_stop: +netif_stop_subqueue (tx_q->netdev, tx_q->idx); + +out:u64_stats_update_begin (&tx_q->stats_sync);u64_stats_inc (&tx_q->q_stats.q_busy);u64_stats_update_end (&tx_q->stats_sync); -netif_stop_subqueue (tx_q->netdev, tx_q->idx);return -EBUSY ; }
@@ -2211,7 +2190,11 @@ void idpf_tx_buf_hw_update(struct idpf_tx_queue *tx_q, u32 val, nq =netdev_get_tx_queue (tx_q->netdev, tx_q->idx); tx_q->next_to_use = val; -idpf_tx_maybe_stop_common (tx_q,IDPF_TX_DESC_NEEDED ); +if (idpf_tx_maybe_stop_common (tx_q,IDPF_TX_DESC_NEEDED )) { +u64_stats_update_begin (&tx_q->stats_sync); +u64_stats_inc (&tx_q->q_stats.q_busy); +u64_stats_update_end (&tx_q->stats_sync); + }/* Force memory writes to complete before letting h/w * know there are new descriptors to fetch. (Only
drivers/net/ethernet/intel/idpf/idpf_txrx.h +8 -1
@@ -1018,7 +1018,6 @@ void idpf_tx_dma_map_error(struct idpf_tx_queue *txq, struct sk_buff *skb, struct idpf_tx_buf *first, u16 ring_idx);unsigned int idpf_tx_desc_count_required (struct idpf_tx_queue *txq,struct sk_buff *skb); -int idpf_tx_maybe_stop_common (struct idpf_tx_queue *tx_q,unsigned int size);void idpf_tx_timeout (struct net_device *netdev,unsigned int txqueue);netdev_tx_t idpf_tx_singleq_frame (struct sk_buff *skb,struct idpf_tx_queue *tx_q);
@@ -1027,4 +1026,12 @@ bool idpf_rx_singleq_buf_hw_alloc_all(struct idpf_rx_queue *rxq, u16 cleaned_count);int idpf_tso (struct sk_buff *skb,struct idpf_tx_offload_params *off); +static inline bool idpf_tx_maybe_stop_common (struct idpf_tx_queue *tx_q, +u32 needed) +{ +return !netif_subqueue_maybe_stop (tx_q->netdev, tx_q->idx, +IDPF_DESC_UNUSED (tx_q), + needed, needed); +} +#endif /* !_IDPF_TXRX_H_ */