[kernel/f14/master] Scatter-gather on via-velocity is hopelessly broken. Just switch it off for now.

Dave Jones davej at fedoraproject.org
Thu Sep 2 21:23:37 UTC 2010


commit 7def7eaed3c2c124c8179917f544674931ed416d
Author: Dave Jones <davej at redhat.com>
Date:   Thu Sep 2 17:23:32 2010 -0400

    Scatter-gather on via-velocity is hopelessly broken.
    Just switch it off for now.

 kernel.spec                          |    6 ++-
 linux-2.6-via-velocity-dma-fix.patch |  115 +++-------------------------------
 2 files changed, 15 insertions(+), 106 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index b71554d..0ac884d 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -48,7 +48,7 @@ Summary: The Linux kernel
 # reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
 # scripts/rebase.sh should be made to do that for you, actually.
 #
-%global baserelease 17
+%global baserelease 18
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
@@ -1896,6 +1896,10 @@ fi
 # and build.
 
 %changelog
+* Thu Sep 02 2010 Dave Jones <davej at redhat.com> 2.6.35.4-18
+- Scatter-gather on via-velocity is hopelessly broken.
+  Just switch it off for now.
+
 * Thu Sep 02 2010 Dave Jones <davej at redhat.com> 2.6.35.4-17
 - Simplify the VIA Velocity changes. The last round of
   fixes introduced some bugs.
diff --git a/linux-2.6-via-velocity-dma-fix.patch b/linux-2.6-via-velocity-dma-fix.patch
index 09c2ec6..2128677 100644
--- a/linux-2.6-via-velocity-dma-fix.patch
+++ b/linux-2.6-via-velocity-dma-fix.patch
@@ -9,115 +9,20 @@ References: <20100901200555.GA30689 at redhat.com>
 	<20100901.133414.24593005.davem at davemloft.net>
 	<20100901.133547.236248297.davem at davemloft.net>
 
-New patch:
 
-via-velocity: Fix TX buffer unmapping.
-
-Fix several bugs in TX buffer DMA unmapping:
-
-1) Use pci_unmap_page() as appropriate.
-
-2) Don't try to fetch the length from the DMA descriptor,
-   the chip and modify that value.  Use the correct lengths,
-   calculated the same way as is done at map time.
-
-3) Kill meaningless NULL checks (against embedded sized
-   arrays which can never be NULL, and against the address
-   of the non-zero indexed entry of an array).
-
-4) max() on ETH_ZLEN is not necessary and just adds
-   confusion, since the xmit function does a proper
-   skb_padto() very early on.
-
-Reported-by: Dave Jones <davej at redhat.com>
-Signed-off-by: David S. Miller <davem at davemloft.net>
+Ok, this is becomming hopeless.  Let's just try turning off SG support
+for now, the length calculations are correct in those cases.
 
 diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c
-index fd69095..a4e2164 100644
+index fd69095..f534123 100644
 --- a/drivers/net/via-velocity.c
 +++ b/drivers/net/via-velocity.c
-@@ -1716,15 +1716,15 @@ static void velocity_free_tx_buf(struct velocity_info *vptr,
- 		int i;
+@@ -2824,7 +2824,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
+ 	netif_napi_add(dev, &vptr->napi, velocity_poll, VELOCITY_NAPI_WEIGHT);
  
- 		for (i = 0; i < tdinfo->nskb_dma; i++) {
--			size_t pktlen = max_t(size_t, skb->len, ETH_ZLEN);
-+			if (i > 0) {
-+				skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
+ 	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER |
+-		NETIF_F_HW_VLAN_RX | NETIF_F_IP_CSUM | NETIF_F_SG;
++		NETIF_F_HW_VLAN_RX | NETIF_F_IP_CSUM;
  
--			/* For scatter-gather */
--			if (skb_shinfo(skb)->nr_frags > 0)
--				pktlen = max_t(size_t, pktlen,
--						td->td_buf[i].size & ~TD_QUEUE);
--
--			pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i],
--					le16_to_cpu(pktlen), PCI_DMA_TODEVICE);
-+				pci_unmap_page(vptr->pdev, tdinfo->skb_dma[i],
-+					       frag->size, PCI_DMA_TODEVICE);
-+			} else {
-+				pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i],
-+						 skb_headlen(skb), PCI_DMA_TODEVICE);
-+			}
- 		}
- 	}
- 	dev_kfree_skb_irq(skb);
-@@ -1745,14 +1745,20 @@ static void velocity_free_td_ring_entry(struct velocity_info *vptr,
- 		return;
- 
- 	if (td_info->skb) {
-+		struct sk_buff *skb = td_info->skb;
-+
- 		for (i = 0; i < td_info->nskb_dma; i++) {
--			if (td_info->skb_dma[i]) {
-+			if (i > 0) {
-+				skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
-+
-+				pci_unmap_page(vptr->pdev, td_info->skb_dma[i],
-+					       frag->size, PCI_DMA_TODEVICE);
-+			} else {
- 				pci_unmap_single(vptr->pdev, td_info->skb_dma[i],
--					td_info->skb->len, PCI_DMA_TODEVICE);
--				td_info->skb_dma[i] = 0;
-+						 skb_headlen(skb), PCI_DMA_TODEVICE);
- 			}
- 		}
--		dev_kfree_skb(td_info->skb);
-+		dev_kfree_skb(skb);
- 		td_info->skb = NULL;
- 	}
- }
-@@ -2520,7 +2526,6 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
- 	struct tx_desc *td_ptr;
- 	struct velocity_td_info *tdinfo;
- 	unsigned long flags;
--	int pktlen;
- 	int index, prev;
- 	int i = 0;
- 
-@@ -2534,10 +2539,6 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
- 		return NETDEV_TX_OK;
- 	}
- 
--	pktlen = skb_shinfo(skb)->nr_frags == 0 ?
--			max_t(unsigned int, skb->len, ETH_ZLEN) :
--				skb_headlen(skb);
--
- 	spin_lock_irqsave(&vptr->lock, flags);
- 
- 	index = vptr->tx.curr[qnum];
-@@ -2552,11 +2553,12 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
- 	 *	add it to the transmit ring.
- 	 */
- 	tdinfo->skb = skb;
--	tdinfo->skb_dma[0] = pci_map_single(vptr->pdev, skb->data, pktlen, PCI_DMA_TODEVICE);
--	td_ptr->tdesc0.len = cpu_to_le16(pktlen);
-+	tdinfo->skb_dma[0] = pci_map_single(vptr->pdev, skb->data,
-+					    skb_headlen(skb), PCI_DMA_TODEVICE);
-+	td_ptr->tdesc0.len = cpu_to_le16(skb->len);
- 	td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]);
- 	td_ptr->td_buf[0].pa_high = 0;
--	td_ptr->td_buf[0].size = cpu_to_le16(pktlen);
-+	td_ptr->td_buf[0].size = cpu_to_le16(skb_headlen(skb));
- 
- 	/* Handle fragments */
- 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-
+ 	ret = register_netdev(dev);
+ 	if (ret < 0)


More information about the scm-commits mailing list