* [PATCH 1/10] spidernet: skb used after netif_receive_skb
@ 2007-05-22 23:09 Linas Vepstas
2007-05-22 23:13 ` [PATCH 2/10] spidernet: beautify error messages Linas Vepstas
` (9 more replies)
0 siblings, 10 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:09 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
From: Florin Malita <fmalita@gmail.com>
The stats update code in spider_net_pass_skb_up() is touching the skb
after it's been passed up to the stack. To avoid that, just update the
stats first.
Signed-off-by: Florin Malita <fmalita@gmail.com>
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c
index 108adbf..1df2f0b 100644
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-21 17:40:49.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:16.000000000 -0500
@@ -1014,12 +1014,12 @@ spider_net_pass_skb_up(struct spider_net
*/
}
- /* pass skb up to stack */
- netif_receive_skb(skb);
-
/* update netdevice statistics */
card->netdev_stats.rx_packets++;
card->netdev_stats.rx_bytes += skb->len;
+
+ /* pass skb up to stack */
+ netif_receive_skb(skb);
}
#ifdef DEBUG
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/10] spidernet: beautify error messages
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
@ 2007-05-22 23:13 ` Linas Vepstas
2007-05-24 21:27 ` Jeff Garzik
2007-05-22 23:21 ` [PATCH 3/10] spidernet: move a block of code around Linas Vepstas
` (8 subsequent siblings)
9 siblings, 1 reply; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:13 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Make error messages print which interface they apply to.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 10 ++++++----
drivers/net/spider_net.h | 2 +-
2 files changed, 7 insertions(+), 5 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:16.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:24.000000000 -0500
@@ -434,7 +434,8 @@ spider_net_prepare_rx_descr(struct spide
bufsize + SPIDER_NET_RXBUF_ALIGN - 1);
if (!descr->skb) {
if (netif_msg_rx_err(card) && net_ratelimit())
- pr_err("Not enough memory to allocate rx buffer\n");
+ pr_err("%s: Not enough memory to allocate rx buffer\n",
+ card->netdev->name);
card->spider_stats.alloc_rx_skb_error++;
return -ENOMEM;
}
@@ -455,7 +456,8 @@ spider_net_prepare_rx_descr(struct spide
dev_kfree_skb_any(descr->skb);
descr->skb = NULL;
if (netif_msg_rx_err(card) && net_ratelimit())
- pr_err("Could not iommu-map rx buffer\n");
+ pr_err("%s: Could not iommu-map rx buffer\n",
+ card->netdev->name);
card->spider_stats.rx_iommu_map_error++;
hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
} else {
@@ -1455,8 +1457,8 @@ spider_net_handle_error_irq(struct spide
case SPIDER_NET_GRFAFLLINT: /* fallthrough */
case SPIDER_NET_GRMFLLINT:
if (netif_msg_intr(card) && net_ratelimit())
- pr_err("Spider RX RAM full, incoming packets "
- "might be discarded!\n");
+ pr_err("%s: Spider RX RAM full, incoming packets "
+ "might be discarded!\n", card->netdev->name);
spider_net_rx_irq_off(card);
netif_rx_schedule(card->netdev);
show_error = 0;
Index: netdev-2.6/drivers/net/spider_net.h
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.h 2007-05-21 17:40:49.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.h 2007-05-22 18:03:24.000000000 -0500
@@ -25,7 +25,7 @@
#ifndef _SPIDER_NET_H
#define _SPIDER_NET_H
-#define VERSION "2.0 A"
+#define VERSION "2.0 B"
#include "sungem_phy.h"
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/10] spidernet: move a block of code around
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
2007-05-22 23:13 ` [PATCH 2/10] spidernet: beautify error messages Linas Vepstas
@ 2007-05-22 23:21 ` Linas Vepstas
2007-05-22 23:36 ` [PATCH 4/10] spidernet: zero out a pointer Linas Vepstas
` (7 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:21 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Put the enable and disable routines next to one-another,
as this makes verifying thier symmetry that much easier.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:24.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:30.000000000 -0500
@@ -506,6 +506,20 @@ spider_net_enable_rxdmac(struct spider_n
}
/**
+ * spider_net_disable_rxdmac - disables the receive DMA controller
+ * @card: card structure
+ *
+ * spider_net_disable_rxdmac terminates processing on the DMA controller
+ * by turing off the DMA controller, with the force-end flag set.
+ */
+static inline void
+spider_net_disable_rxdmac(struct spider_net_card *card)
+{
+ spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR,
+ SPIDER_NET_DMA_RX_FEND_VALUE);
+}
+
+/**
* spider_net_refill_rx_chain - refills descriptors/skbs in the rx chains
* @card: card structure
*
@@ -657,20 +671,6 @@ write_hash:
}
/**
- * spider_net_disable_rxdmac - disables the receive DMA controller
- * @card: card structure
- *
- * spider_net_disable_rxdmac terminates processing on the DMA controller by
- * turing off DMA and issueing a force end
- */
-static void
-spider_net_disable_rxdmac(struct spider_net_card *card)
-{
- spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR,
- SPIDER_NET_DMA_RX_FEND_VALUE);
-}
-
-/**
* spider_net_prepare_tx_descr - fill tx descriptor with skb data
* @card: card structure
* @descr: descriptor structure to fill out
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/10] spidernet: zero out a pointer.
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
2007-05-22 23:13 ` [PATCH 2/10] spidernet: beautify error messages Linas Vepstas
2007-05-22 23:21 ` [PATCH 3/10] spidernet: move a block of code around Linas Vepstas
@ 2007-05-22 23:36 ` Linas Vepstas
2007-05-22 23:39 ` [PATCH 5/10] spidernet: null out skb pointer after its been used Linas Vepstas
` (6 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:36 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Invalidate a pointer as its pci_unmap'ed; this is a bit of
paranoia to make sure hardware doesn't continue trying to
DMA to it.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:30.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:32.000000000 -0500
@@ -1069,6 +1069,7 @@ spider_net_decode_one_descr(struct spide
struct spider_net_descr_chain *chain = &card->rx_chain;
struct spider_net_descr *descr = chain->tail;
struct spider_net_hw_descr *hwdescr = descr->hwdescr;
+ u32 hw_buf_addr;
int status;
status = spider_net_get_descr_status(hwdescr);
@@ -1082,7 +1083,9 @@ spider_net_decode_one_descr(struct spide
chain->tail = descr->next;
/* unmap descriptor */
- pci_unmap_single(card->pdev, hwdescr->buf_addr,
+ hw_buf_addr = hwdescr->buf_addr;
+ hwdescr->buf_addr = 0x0;
+ pci_unmap_single(card->pdev, hw_buf_addr,
SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE);
if ( (status == SPIDER_NET_DESCR_RESPONSE_ERROR) ||
@@ -1118,7 +1121,7 @@ spider_net_decode_one_descr(struct spide
pr_err("%s: bad status, cmd_status=x%08x\n",
card->netdev->name,
hwdescr->dmac_cmd_status);
- pr_err("buf_addr=x%08x\n", hwdescr->buf_addr);
+ pr_err("buf_addr=x%08x\n", hw_buf_addr);
pr_err("buf_size=x%08x\n", hwdescr->buf_size);
pr_err("next_descr_addr=x%08x\n", hwdescr->next_descr_addr);
pr_err("result_size=x%08x\n", hwdescr->result_size);
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 5/10] spidernet: null out skb pointer after its been used.
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (2 preceding siblings ...)
2007-05-22 23:36 ` [PATCH 4/10] spidernet: zero out a pointer Linas Vepstas
@ 2007-05-22 23:39 ` Linas Vepstas
2007-05-22 23:40 ` [PATCH 6/10] spidernet: Don't terminate the RX ring Linas Vepstas
` (5 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:39 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
If the ethernet interface is brought down while there is still
RX traffic in flight, the device shutdown routine can end up
trying to double-free an skb, leading to a crash in mm/slab.c
Avoid the double-free by nulling out the skb pointer.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 1 +
1 file changed, 1 insertion(+)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:32.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:34.000000000 -0500
@@ -1136,6 +1136,7 @@ spider_net_decode_one_descr(struct spide
/* Ok, we've got a packet in descr */
spider_net_pass_skb_up(descr, card);
+ descr->skb = NULL;
hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
return 1;
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 6/10] spidernet: Don't terminate the RX ring
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (3 preceding siblings ...)
2007-05-22 23:39 ` [PATCH 5/10] spidernet: null out skb pointer after its been used Linas Vepstas
@ 2007-05-22 23:40 ` Linas Vepstas
2007-05-22 23:42 ` [PATCH 7/10] spidernet: enhance the dump routine Linas Vepstas
` (4 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:40 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
There is no real reason to terminate the RX ring; it
doesn't make the operation any smooother, and it does
require an extra sync. So don't do it.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:34.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:35.000000000 -0500
@@ -462,13 +462,9 @@ spider_net_prepare_rx_descr(struct spide
hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
} else {
hwdescr->buf_addr = buf;
- hwdescr->next_descr_addr = 0;
wmb();
hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_CARDOWNED |
SPIDER_NET_DMAC_NOINTR_COMPLETE;
-
- wmb();
- descr->prev->hwdescr->next_descr_addr = descr->bus_addr;
}
return 0;
@@ -557,12 +553,16 @@ spider_net_refill_rx_chain(struct spider
static int
spider_net_alloc_rx_skbs(struct spider_net_card *card)
{
- int result;
- struct spider_net_descr_chain *chain;
+ struct spider_net_descr_chain *chain = &card->rx_chain;
+ struct spider_net_descr *start= chain->tail;
+ struct spider_net_descr *descr = start;
- result = -ENOMEM;
+ /* Link up the hardware chain pointers */
+ do {
+ descr->prev->hwdescr->next_descr_addr = descr->bus_addr;
+ descr = descr->next;
+ } while (descr != start);
- chain = &card->rx_chain;
/* Put at least one buffer into the chain. if this fails,
* we've got a problem. If not, spider_net_refill_rx_chain
* will do the rest at the end of this function. */
@@ -579,7 +579,7 @@ spider_net_alloc_rx_skbs(struct spider_n
error:
spider_net_free_rx_chain_contents(card);
- return result;
+ return -ENOMEM;
}
/**
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 7/10] spidernet: enhance the dump routine
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (4 preceding siblings ...)
2007-05-22 23:40 ` [PATCH 6/10] spidernet: Don't terminate the RX ring Linas Vepstas
@ 2007-05-22 23:42 ` Linas Vepstas
2007-05-22 23:45 ` [PATCH 8/10] spidernet: reset the card when an rxramfull is seen Linas Vepstas
` (3 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:42 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Crazy device problems are hard to debug, when one does not have
good trace info. This patch makes a major enhancement to the
device dump routine.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 62 ++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 54 insertions(+), 8 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:35.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:37.000000000 -0500
@@ -1024,34 +1024,78 @@ spider_net_pass_skb_up(struct spider_net
netif_receive_skb(skb);
}
-#ifdef DEBUG
static void show_rx_chain(struct spider_net_card *card)
{
struct spider_net_descr_chain *chain = &card->rx_chain;
struct spider_net_descr *start= chain->tail;
struct spider_net_descr *descr= start;
+ struct spider_net_hw_descr *hwd = start->hwdescr;
+ char *iface = card->netdev->name;
+ u32 curr_desc, next_desc;
int status;
int cnt = 0;
- int cstat = spider_net_get_descr_status(descr);
- printk(KERN_INFO "RX chain tail at descr=%ld\n",
- (start - card->descr) - card->tx_chain.num_desc);
+ int off = 0;
+ int cstat = hwd->dmac_cmd_status;
+
+ printk(KERN_INFO "%s: Total number of descrs=%d\n",
+ iface, chain->num_desc);
+ printk(KERN_INFO "%s: Chain tail located at descr=%d\n",
+ iface, (int) (start - chain->ring));
+
+ curr_desc = spider_net_read_reg(card, SPIDER_NET_GDACTDPA);
+ next_desc = spider_net_read_reg(card, SPIDER_NET_GDACNEXTDA);
+
status = cstat;
do
{
- status = spider_net_get_descr_status(descr);
+ hwd = descr->hwdescr;
+ off = descr - chain->ring;
+ if (descr==chain->head)
+ printk(KERN_INFO "%s: chain head is at %d\n", iface, off);
+ if (curr_desc == descr->bus_addr)
+ printk(KERN_INFO "%s: hw curr desc is at %d\n", iface, off);
+ if (next_desc == descr->bus_addr)
+ printk(KERN_INFO "%s: hw next desc is at %d\n", iface, off);
+ if (hwd->next_descr_addr == 0)
+ printk(KERN_INFO "%s: chain is cut at %d\n", iface, off);
+ status = hwd->dmac_cmd_status;
if (cstat != status) {
- printk(KERN_INFO "Have %d descrs with stat=x%08x\n", cnt, cstat);
+ printk(KERN_INFO "%s: Have %d descrs with stat=x%08x\n",
+ iface, cnt, cstat);
cstat = status;
cnt = 0;
}
cnt ++;
descr = descr->next;
} while (descr != start);
- printk(KERN_INFO "Last %d descrs with stat=x%08x\n", cnt, cstat);
-}
+ printk(KERN_INFO "%s: Last %d descrs with stat=x%08x\n",
+ iface, cnt, cstat);
+
+#ifdef DEBUG
+ /* Now dump the whole ring */
+ descr = start;
+ do
+ {
+ struct spider_net_hw_descr *hwd = descr->hwdescr;
+ status = spider_net_get_descr_status(hwd);
+ cnt = descr - chain->ring;
+ printk(KERN_INFO "Descr %d stat=0x%08x skb=%p\n",
+ cnt, status, descr->skb);
+ printk(KERN_INFO "bus addr=%08x buf addr=%08x sz=%d\n",
+ descr->bus_addr, hwd->buf_addr, hwd->buf_size);
+ printk(KERN_INFO "next=%08x result sz=%d valid sz=%d\n",
+ hwd->next_descr_addr, hwd->result_size, hwd->valid_size);
+ printk(KERN_INFO "dmac=%08x data stat=%08x data err=%08x\n",
+ hwd->dmac_cmd_status, hwd->data_status, hwd->data_error);
+ printk(KERN_INFO "\n");
+
+ descr = descr->next;
+ } while (descr != start);
#endif
+}
+
/**
* spider_net_decode_one_descr - processes an RX descriptor
* @card: card structure
@@ -1141,6 +1185,8 @@ spider_net_decode_one_descr(struct spide
return 1;
bad_desc:
+ if (netif_msg_rx_err(card))
+ show_rx_chain(card);
dev_kfree_skb_irq(descr->skb);
descr->skb = NULL;
hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 8/10] spidernet: reset the card when an rxramfull is seen
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (5 preceding siblings ...)
2007-05-22 23:42 ` [PATCH 7/10] spidernet: enhance the dump routine Linas Vepstas
@ 2007-05-22 23:45 ` Linas Vepstas
2007-05-22 23:47 ` [PATCH 9/10] spidernet: service TX later Linas Vepstas
` (2 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:45 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Some versions of the spider have a firmware bug, where the
RX ring sequencer goes crazy when the RX RAM on the device
fills up. Appearently the only viable wrkaround is a soft
reset of the card.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:37.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:39.000000000 -0500
@@ -1506,11 +1506,17 @@ spider_net_handle_error_irq(struct spide
case SPIDER_NET_GRFBFLLINT: /* fallthrough */
case SPIDER_NET_GRFAFLLINT: /* fallthrough */
case SPIDER_NET_GRMFLLINT:
- if (netif_msg_intr(card) && net_ratelimit())
- pr_err("%s: Spider RX RAM full, incoming packets "
- "might be discarded!\n", card->netdev->name);
+ if (netif_msg_intr(card) && net_ratelimit()) {
+ pr_err("%s: Spider RX RAM full, reseting device.\n",
+ card->netdev->name);
+ show_rx_chain(card);
+ }
spider_net_rx_irq_off(card);
netif_rx_schedule(card->netdev);
+
+ /* If the card is spewing rxramfulls, then reset */
+ atomic_inc(&card->tx_timeout_task_counter);
+ schedule_work(&card->tx_timeout_task);
show_error = 0;
break;
@@ -2087,6 +2093,8 @@ spider_net_workaround_rxramfull(struct s
{
int i, sequencer = 0;
+ printk(KERN_INFO "%s: calling rxramfull workaround\n", card->netdev->name);
+
/* cancel reset */
spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
SPIDER_NET_CKRCTRL_RUN_VALUE);
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 9/10] spidernet: service TX later.
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (6 preceding siblings ...)
2007-05-22 23:45 ` [PATCH 8/10] spidernet: reset the card when an rxramfull is seen Linas Vepstas
@ 2007-05-22 23:47 ` Linas Vepstas
2007-05-22 23:52 ` [PATCH 10/10] spidernet: increase the NAPI weight Linas Vepstas
2007-05-24 21:25 ` [PATCH 1/10] spidernet: skb used after netif_receive_skb Jeff Garzik
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:47 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
When entering the netdev poll routine, empty out the RX
chain first, before cleaning up the TX chain. This should
help avoid RX buffer overflows.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Index: netdev-2.6/drivers/net/spider_net.c
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.c 2007-05-22 18:03:39.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.c 2007-05-22 18:03:41.000000000 -0500
@@ -1212,7 +1212,6 @@ spider_net_poll(struct net_device *netde
int packets_to_do, packets_done = 0;
int no_more_packets = 0;
- spider_net_cleanup_tx_ring(card);
packets_to_do = min(*budget, netdev->quota);
while (packets_to_do) {
@@ -1231,6 +1230,8 @@ spider_net_poll(struct net_device *netde
spider_net_refill_rx_chain(card);
spider_net_enable_rxdmac(card);
+ spider_net_cleanup_tx_ring(card);
+
/* if all packets are in the stack, enable interrupts and return 0 */
/* if not, return 1 */
if (no_more_packets) {
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 10/10] spidernet: increase the NAPI weight
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (7 preceding siblings ...)
2007-05-22 23:47 ` [PATCH 9/10] spidernet: service TX later Linas Vepstas
@ 2007-05-22 23:52 ` Linas Vepstas
2007-05-24 21:25 ` [PATCH 1/10] spidernet: skb used after netif_receive_skb Jeff Garzik
9 siblings, 0 replies; 12+ messages in thread
From: Linas Vepstas @ 2007-05-22 23:52 UTC (permalink / raw)
To: Jeff Garzik, Andrew Morton
Cc: netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Another way of minimizing the likelyhood of RX ram from overflowing
is to empty out the entire rx ring every chance we get. Change
the crazy watchdog timeout from 50 seconds to 3 seconds, while
we're here.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
drivers/net/spider_net.h | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
Index: netdev-2.6/drivers/net/spider_net.h
===================================================================
--- netdev-2.6.orig/drivers/net/spider_net.h 2007-05-22 18:03:24.000000000 -0500
+++ netdev-2.6/drivers/net/spider_net.h 2007-05-22 18:03:43.000000000 -0500
@@ -56,8 +56,13 @@ extern char spider_net_driver_name[];
#define SPIDER_NET_RX_CSUM_DEFAULT 1
-#define SPIDER_NET_WATCHDOG_TIMEOUT 50*HZ
-#define SPIDER_NET_NAPI_WEIGHT 64
+#define SPIDER_NET_WATCHDOG_TIMEOUT 3*HZ
+
+/* We really really want to empty the ring buffer every time,
+ * so as to avoid the RX ram full bug. So set the napi weight
+ * to the ring size.
+ */
+#define SPIDER_NET_NAPI_WEIGHT SPIDER_NET_RX_DESCRIPTORS_DEFAULT
#define SPIDER_NET_FIRMWARE_SEQS 6
#define SPIDER_NET_FIRMWARE_SEQWORDS 1024
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/10] spidernet: skb used after netif_receive_skb
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
` (8 preceding siblings ...)
2007-05-22 23:52 ` [PATCH 10/10] spidernet: increase the NAPI weight Linas Vepstas
@ 2007-05-24 21:25 ` Jeff Garzik
9 siblings, 0 replies; 12+ messages in thread
From: Jeff Garzik @ 2007-05-24 21:25 UTC (permalink / raw)
To: Linas Vepstas
Cc: Andrew Morton, netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Linas Vepstas wrote:
> From: Florin Malita <fmalita@gmail.com>
>
> The stats update code in spider_net_pass_skb_up() is touching the skb
> after it's been passed up to the stack. To avoid that, just update the
> stats first.
>
> Signed-off-by: Florin Malita <fmalita@gmail.com>
> Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
> ----
>
> drivers/net/spider_net.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
applied to #upstream-fixes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/10] spidernet: beautify error messages
2007-05-22 23:13 ` [PATCH 2/10] spidernet: beautify error messages Linas Vepstas
@ 2007-05-24 21:27 ` Jeff Garzik
0 siblings, 0 replies; 12+ messages in thread
From: Jeff Garzik @ 2007-05-24 21:27 UTC (permalink / raw)
To: Linas Vepstas
Cc: Andrew Morton, netdev, Florin Malita, cbe-oss-dev, linuxppc-dev
Linas Vepstas wrote:
> Make error messages print which interface they apply to.
>
> Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
>
> ----
> drivers/net/spider_net.c | 10 ++++++----
> drivers/net/spider_net.h | 2 +-
> 2 files changed, 7 insertions(+), 5 deletions(-)
applied 2-10 to #upstream (2.6.23)
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2007-05-24 21:27 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-22 23:09 [PATCH 1/10] spidernet: skb used after netif_receive_skb Linas Vepstas
2007-05-22 23:13 ` [PATCH 2/10] spidernet: beautify error messages Linas Vepstas
2007-05-24 21:27 ` Jeff Garzik
2007-05-22 23:21 ` [PATCH 3/10] spidernet: move a block of code around Linas Vepstas
2007-05-22 23:36 ` [PATCH 4/10] spidernet: zero out a pointer Linas Vepstas
2007-05-22 23:39 ` [PATCH 5/10] spidernet: null out skb pointer after its been used Linas Vepstas
2007-05-22 23:40 ` [PATCH 6/10] spidernet: Don't terminate the RX ring Linas Vepstas
2007-05-22 23:42 ` [PATCH 7/10] spidernet: enhance the dump routine Linas Vepstas
2007-05-22 23:45 ` [PATCH 8/10] spidernet: reset the card when an rxramfull is seen Linas Vepstas
2007-05-22 23:47 ` [PATCH 9/10] spidernet: service TX later Linas Vepstas
2007-05-22 23:52 ` [PATCH 10/10] spidernet: increase the NAPI weight Linas Vepstas
2007-05-24 21:25 ` [PATCH 1/10] spidernet: skb used after netif_receive_skb Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).