[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