[kernel] r22061 - in dists/sid/linux/debian: . patches patches/bugfix/all
Ian James Campbell
ijc at moszumanska.debian.org
Sun Nov 9 10:54:17 UTC 2014
Author: ijc
Date: Sun Nov 9 10:54:17 2014
New Revision: 22061
Log:
Backport fix for TSO with mv643xx_eth driver
Replacing previous workaround for #764162.
Added:
dists/sid/linux/debian/patches/bugfix/all/net-mv643xx_eth-reclaim-TX-skbs-only-when-released-b.patch
Deleted:
dists/sid/linux/debian/patches/bugfix/all/net-mv643xx-disable-tso-by-default.patch
Modified:
dists/sid/linux/debian/changelog
dists/sid/linux/debian/patches/series
Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog Sun Nov 9 10:50:36 2014 (r22060)
+++ dists/sid/linux/debian/changelog Sun Nov 9 10:54:17 2014 (r22061)
@@ -7,6 +7,8 @@
[ Ian Campbell ]
* [xen] Backport various netback fixes (Closes: #767261).
+ * Backport fix for TSO with mv643xx_eth driver, replacing previous workaround
+ (#764162)
-- Ben Hutchings <ben at decadent.org.uk> Sun, 09 Nov 2014 10:13:09 +0000
Added: dists/sid/linux/debian/patches/bugfix/all/net-mv643xx_eth-reclaim-TX-skbs-only-when-released-b.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/net-mv643xx_eth-reclaim-TX-skbs-only-when-released-b.patch Sun Nov 9 10:54:17 2014 (r22061)
@@ -0,0 +1,75 @@
+From 2c2a9cbd64387d6b70ac5db013e9bfe9412c7354 Mon Sep 17 00:00:00 2001
+From: Karl Beldan <karl.beldan at rivierawaves.com>
+Date: Wed, 5 Nov 2014 15:32:59 +0100
+Subject: [PATCH] net: mv643xx_eth: reclaim TX skbs only when released by the
+ HW
+Origin: https://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=2c2a9cbd64387d6b70ac5db013e9bfe9412c7354
+
+ATM, txq_reclaim will dequeue and free an skb for each tx desc released
+by the hw that has TX_LAST_DESC set. However, in case of TSO, each
+hw desc embedding the last part of a segment has TX_LAST_DESC set,
+losing the one-to-one 'last skb frag'/'TX_LAST_DESC set' correspondance,
+which causes data corruption.
+
+Fix this by checking TX_ENABLE_INTERRUPT instead of TX_LAST_DESC, and
+warn when trying to dequeue from an empty txq (which can be symptomatic
+of releasing skbs prematurely).
+
+Fixes: 3ae8f4e0b98 ('net: mv643xx_eth: Implement software TSO')
+Reported-by: Slawomir Gajzner <slawomir.gajzner at gmail.com>
+Reported-by: Julien D'Ascenzio <jdascenzio at yahoo.fr>
+Signed-off-by: Karl Beldan <karl.beldan at rivierawaves.com>
+Cc: Ian Campbell <ijc at hellion.org.uk>
+Cc: Eric Dumazet <eric.dumazet at gmail.com>
+Cc: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
+Cc: Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/marvell/mv643xx_eth.c | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
+index b151a94..d44560d 100644
+--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
++++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
+@@ -1047,7 +1047,6 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
+ int tx_index;
+ struct tx_desc *desc;
+ u32 cmd_sts;
+- struct sk_buff *skb;
+
+ tx_index = txq->tx_used_desc;
+ desc = &txq->tx_desc_area[tx_index];
+@@ -1066,19 +1065,22 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
+ reclaimed++;
+ txq->tx_desc_count--;
+
+- skb = NULL;
+- if (cmd_sts & TX_LAST_DESC)
+- skb = __skb_dequeue(&txq->tx_skb);
++ if (!IS_TSO_HEADER(txq, desc->buf_ptr))
++ dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr,
++ desc->byte_cnt, DMA_TO_DEVICE);
++
++ if (cmd_sts & TX_ENABLE_INTERRUPT) {
++ struct sk_buff *skb = __skb_dequeue(&txq->tx_skb);
++
++ if (!WARN_ON(!skb))
++ dev_kfree_skb(skb);
++ }
+
+ if (cmd_sts & ERROR_SUMMARY) {
+ netdev_info(mp->dev, "tx error\n");
+ mp->dev->stats.tx_errors++;
+ }
+
+- if (!IS_TSO_HEADER(txq, desc->buf_ptr))
+- dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr,
+- desc->byte_cnt, DMA_TO_DEVICE);
+- dev_kfree_skb(skb);
+ }
+
+ __netif_tx_unlock_bh(nq);
+--
+1.7.10.4
+
Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series Sun Nov 9 10:50:36 2014 (r22060)
+++ dists/sid/linux/debian/patches/series Sun Nov 9 10:54:17 2014 (r22061)
@@ -145,7 +145,7 @@
bugfix/all/net-sctp-fix-panic-on-duplicate-ASCONF-chunks.patch
bugfix/all/net-sctp-fix-remote-memory-pressure-from-excessive-q.patch
bugfix/all/mnt-Prevent-pivot_root-from-creating-a-loop-in-the-m.patch
-bugfix/all/net-mv643xx-disable-tso-by-default.patch
+bugfix/all/net-mv643xx_eth-reclaim-TX-skbs-only-when-released-b.patch
bugfix/all/xen-netback-Adding-debugfs-io_ring_qX-files.patch
bugfix/all/xen-netback-Using-a-new-state-bit-instead-of-carrier.patch
bugfix/all/xen-netback-Turn-off-the-carrier-if-the-guest-is-not.patch
More information about the Kernel-svn-changes
mailing list