Re: Can decnet be deprecated?
On Sun, Nov 25, 2018 at 4:14 AM David Ahern wrote: > > IPX was moved to staging at the end of last year. Can decnet follow > suit? git log seems to indicate no active development in a very long time. > > David Kill it :)
Re: ipv6 issues after an DDoS for kernel 4.6.3
On Fri, Jul 8, 2016 at 6:14 PM, Eric Dumazetwrote: > On Fri, 2016-07-08 at 15:51 +0200, Toralf Förster wrote: >> I do run a 4.6.3 hardened Gentoo kernel at a commodity i7 server. A >> DDoS with about 300 MBit/sec over 5 mins resulted an issue for ipv6 at >> that system. >> >> The IPv6 monitoring from my ISP told my that the to be monitored >> services (80, 443, 5) weren't reachable any longer at ipv6 (at >> ipv4 there was no issue). Restarting the NIC brought back green lights >> for the services at the ipv6 ports too. > > Hard to tell without knowing DDOS details, but IPv6 lacks some > scalability improvements found in IPv4. > > IPv4 no longer has a routing cache, but IPv6 still has one. > Any pointers as to which part of the kernel to look for to implement one for IPv6 ? > Are you sure conntrack is needed at all ? > >
Re: [PATCH] iproute2: Fix musl compatibility
ping stephen.
[PATCH] iproute2: Fix musl compatibility
Don't redefine in6_addr due to including linux/in6.h and also fix the case of MAXPATHLEN constant not found. (Original patch from VoidLinux) Signed-off-by: Loganaden Velvindron <lo...@hackers.mu> --- include/linux/if_bridge.h | 1 - include/linux/netfilter.h | 2 -- include/linux/xfrm.h | 1 - include/utils.h | 1 + 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index ee197a3..f823aa4 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h @@ -15,7 +15,6 @@ #include #include -#include #define SYSFS_BRIDGE_ATTR "bridge" #define SYSFS_BRIDGE_FDB "brforward" diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index b71b4c9..3e4e6ae 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -4,8 +4,6 @@ #include #include -#include -#include /* Responses from hook functions. */ #define NF_DROP 0 diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index b8f5451..a9761a5 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h @@ -1,7 +1,6 @@ #ifndef _LINUX_XFRM_H #define _LINUX_XFRM_H -#include #include /* All of the structures in this file may not change size as they are diff --git a/include/utils.h b/include/utils.h index c43427c..debcdde 100644 --- a/include/utils.h +++ b/include/utils.h @@ -1,6 +1,7 @@ #ifndef __UTILS_H__ #define __UTILS_H__ 1 +#include /* MAXPATHLEN */ #include #include #include -- 2.7.0
[PATCH net-next ] net: ipv4: memset addr before calling copy_to_user()
zero addr before calling copy_to_user() Signed-off-by: Loganaden Velvindron <lo...@elandsys.com> --- net/ipv4/ip_sockglue.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index c3c359a..d7a5a8b 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -1373,6 +1373,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, case IP_MULTICAST_IF: { struct in_addr addr; + memset(, 0, sizeof(addr)); len = min_t(unsigned int, len, sizeof(struct in_addr)); addr.s_addr = inet->mc_addr; release_sock(sk); -- 2.6.2 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: nothing other than BUG fixes please
On Tue, Nov 3, 2015 at 4:10 AM, David Millerwrote: > > > If it's not a bug fix, I really don't want to see it submitted at > this time. No exceptions. > > Things will stay this way until some short period after the merge > window opens and I open up net-next and patchwork to new feature > patches and cleanups. > > Anyone violating this will not even get an email reply from me, > I will simply toss your submission from patchwork silently. It's > simply too much pointless work for me to keep reminding people > what I explicitly state on the list about the state of the trees > we develop under. > > The best part is this will only punish the people who don't pay > attention and just blindly come post patches here when it's convenient > for them to submit patches, rather than actually reading the list and > making an effort to participate in development properly. Do small "security" patches that prevent resource leakage count as bugfixes ? e.g: http://patchwork.ozlabs.org/patch/537519/ > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH net-next] use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userland later on.
--- net/bridge/netfilter/ebtables.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index f46ca41..26922e9 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c @@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl, the check on the size is done later, when we have the lock */ if (repl->num_counters) { unsigned long size = repl->num_counters * sizeof(*counterstmp); - counterstmp = vmalloc(size); + counterstmp = vzalloc(size); if (!counterstmp) return -ENOMEM; } @@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t, return -EINVAL; } - counterstmp = vmalloc(nentries * sizeof(*counterstmp)); + counterstmp = vzalloc(nentries * sizeof(*counterstmp)); if (!counterstmp) return -ENOMEM; -- 2.6.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userland la
--- net/bridge/netfilter/ebtables.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index f46ca41..26922e9 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c @@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl, the check on the size is done later, when we have the lock */ if (repl->num_counters) { unsigned long size = repl->num_counters * sizeof(*counterstmp); - counterstmp = vmalloc(size); + counterstmp = vzalloc(size); if (!counterstmp) return -ENOMEM; } @@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t, return -EINVAL; } - counterstmp = vmalloc(nentries * sizeof(*counterstmp)); + counterstmp = vzalloc(nentries * sizeof(*counterstmp)); if (!counterstmp) return -ENOMEM; -- 2.6.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userlan
On Wed, Oct 28, 2015 at 09:10:20PM +0300, Sergei Shtylyov wrote: > Hello. > >Your subject is too long, it should have been placed in the changelog > partially. You you didn't sign off on the patch, so it can't applied. > > MBR, Sergei Thank you. Please reject this patch. I re-sent a proper one in another mail. > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userlan
Please reject this patch. I sent a proper one with the sign-on later on. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/1 net-next] net: bridge: use vzalloc() instead of vmalloc() for counterstmp
counterstmp is not cleared before it is used in get_counters(). it might be leaked partially when it is sent to userland later on. Signed-off-by: Loganaden Velvindron <lo...@elandsys.com> --- net/bridge/netfilter/ebtables.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index f46ca41..26922e9 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c @@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl, the check on the size is done later, when we have the lock */ if (repl->num_counters) { unsigned long size = repl->num_counters * sizeof(*counterstmp); - counterstmp = vmalloc(size); + counterstmp = vzalloc(size); if (!counterstmp) return -ENOMEM; } @@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t, return -EINVAL; } - counterstmp = vmalloc(nentries * sizeof(*counterstmp)); + counterstmp = vzalloc(nentries * sizeof(*counterstmp)); if (!counterstmp) return -ENOMEM; -- 2.6.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH net-next] 3c59x: Add BQL support for 3c59x ethernet driver.
This BQL patch is based on work done by Tino Reichardt. Tested on :05:00.0: 3Com PCI 3c905C Tornado at c9e6e000 by running Flent several times. Signed-off-by: Loganaden Velvindron lo...@elandsys.com --- drivers/net/ethernet/3com/3c59x.c | 23 --- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 753887d..2839af0 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev) if (vp-cb_fn_base) /* The PCMCIA people are idiots. */ iowrite32(0x8000, vp-cb_fn_base + 4); netif_start_queue (dev); + netdev_reset_queue(dev); err_out: return err; } @@ -1935,16 +1936,18 @@ static void vortex_tx_timeout(struct net_device *dev) if (vp-cur_tx - vp-dirty_tx 0ioread32(ioaddr + DownListPtr) == 0) iowrite32(vp-tx_ring_dma + (vp-dirty_tx % TX_RING_SIZE) * sizeof(struct boom_tx_desc), ioaddr + DownListPtr); - if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE) + if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE) { netif_wake_queue (dev); + netdev_reset_queue (dev); + } if (vp-drv_flags IS_BOOMERANG) iowrite8(PKT_BUF_SZ8, ioaddr + TxFreeThreshold); iowrite16(DownUnstall, ioaddr + EL3_CMD); } else { dev-stats.tx_dropped++; netif_wake_queue(dev); + netdev_reset_queue(dev); } - /* Issue Tx Enable */ iowrite16(TxEnable, ioaddr + EL3_CMD); dev-trans_start = jiffies; /* prevent tx timeout */ @@ -2063,6 +2066,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct vortex_private *vp = netdev_priv(dev); void __iomem *ioaddr = vp-ioaddr; + int skblen = skb-len; /* Put out the doubleword header... */ iowrite32(skb-len, ioaddr + TX_FIFO); @@ -2094,6 +2098,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) } } + netdev_sent_queue(dev, skblen); /* Clear the Tx status stack. */ { @@ -2125,6 +2130,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) void __iomem *ioaddr = vp-ioaddr; /* Calculate the next Tx descriptor entry. */ int entry = vp-cur_tx % TX_RING_SIZE; + int skblen = skb-len; struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % TX_RING_SIZE]; unsigned long flags; dma_addr_t dma_addr; @@ -2230,6 +2236,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) } vp-cur_tx++; + netdev_sent_queue(dev, skblen); + if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE - 1) { netif_stop_queue (dev); } else {/* Clear previous interrupt enable. */ @@ -2267,6 +2275,7 @@ vortex_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; spin_lock(vp-lock); @@ -2314,6 +2323,8 @@ vortex_interrupt(int irq, void *dev_id) if (ioread16(ioaddr + Wn7_MasterStatus) 0x1000) { iowrite16(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ pci_unmap_single(VORTEX_PCI(vp), vp-tx_skb_dma, (vp-tx_skb-len + 3) ~3, PCI_DMA_TODEVICE); + pkts_compl++; + bytes_compl += vp-tx_skb-len; dev_kfree_skb_irq(vp-tx_skb); /* Release the transferred buffer */ if (ioread16(ioaddr + TxFree) 1536) { /* @@ -2358,6 +2369,7 @@ vortex_interrupt(int irq, void *dev_id) iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); } while ((status = ioread16(ioaddr + EL3_STATUS)) (IntLatch | RxComplete)); + netdev_completed_queue(dev, pkts_compl, bytes_compl); spin_unlock(vp-window_lock); if (vortex_debug 4) @@ -2382,6 +2394,7 @@ boomerang_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; @@ -2455,6 +2468,8 @@ boomerang_interrupt(int irq, void *dev_id) pci_unmap_single(VORTEX_PCI(vp), le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE); #endif + pkts_compl
[PATCH net-next] 3c59x: Add BQL support for 3c59x ethernet driver.
--- drivers/net/ethernet/3com/3c59x.c | 23 --- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 753887d..2839af0 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev) if (vp-cb_fn_base) /* The PCMCIA people are idiots. */ iowrite32(0x8000, vp-cb_fn_base + 4); netif_start_queue (dev); + netdev_reset_queue(dev); err_out: return err; } @@ -1935,16 +1936,18 @@ static void vortex_tx_timeout(struct net_device *dev) if (vp-cur_tx - vp-dirty_tx 0ioread32(ioaddr + DownListPtr) == 0) iowrite32(vp-tx_ring_dma + (vp-dirty_tx % TX_RING_SIZE) * sizeof(struct boom_tx_desc), ioaddr + DownListPtr); - if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE) + if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE) { netif_wake_queue (dev); + netdev_reset_queue (dev); + } if (vp-drv_flags IS_BOOMERANG) iowrite8(PKT_BUF_SZ8, ioaddr + TxFreeThreshold); iowrite16(DownUnstall, ioaddr + EL3_CMD); } else { dev-stats.tx_dropped++; netif_wake_queue(dev); + netdev_reset_queue(dev); } - /* Issue Tx Enable */ iowrite16(TxEnable, ioaddr + EL3_CMD); dev-trans_start = jiffies; /* prevent tx timeout */ @@ -2063,6 +2066,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct vortex_private *vp = netdev_priv(dev); void __iomem *ioaddr = vp-ioaddr; + int skblen = skb-len; /* Put out the doubleword header... */ iowrite32(skb-len, ioaddr + TX_FIFO); @@ -2094,6 +2098,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) } } + netdev_sent_queue(dev, skblen); /* Clear the Tx status stack. */ { @@ -2125,6 +2130,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) void __iomem *ioaddr = vp-ioaddr; /* Calculate the next Tx descriptor entry. */ int entry = vp-cur_tx % TX_RING_SIZE; + int skblen = skb-len; struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % TX_RING_SIZE]; unsigned long flags; dma_addr_t dma_addr; @@ -2230,6 +2236,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) } vp-cur_tx++; + netdev_sent_queue(dev, skblen); + if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE - 1) { netif_stop_queue (dev); } else {/* Clear previous interrupt enable. */ @@ -2267,6 +2275,7 @@ vortex_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; spin_lock(vp-lock); @@ -2314,6 +2323,8 @@ vortex_interrupt(int irq, void *dev_id) if (ioread16(ioaddr + Wn7_MasterStatus) 0x1000) { iowrite16(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ pci_unmap_single(VORTEX_PCI(vp), vp-tx_skb_dma, (vp-tx_skb-len + 3) ~3, PCI_DMA_TODEVICE); + pkts_compl++; + bytes_compl += vp-tx_skb-len; dev_kfree_skb_irq(vp-tx_skb); /* Release the transferred buffer */ if (ioread16(ioaddr + TxFree) 1536) { /* @@ -2358,6 +2369,7 @@ vortex_interrupt(int irq, void *dev_id) iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); } while ((status = ioread16(ioaddr + EL3_STATUS)) (IntLatch | RxComplete)); + netdev_completed_queue(dev, pkts_compl, bytes_compl); spin_unlock(vp-window_lock); if (vortex_debug 4) @@ -2382,6 +2394,7 @@ boomerang_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; @@ -2455,6 +2468,8 @@ boomerang_interrupt(int irq, void *dev_id) pci_unmap_single(VORTEX_PCI(vp), le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE); #endif + pkts_compl++; + bytes_compl += skb-len; dev_kfree_skb_irq(skb); vp-tx_skbuff[entry] = NULL;
[PATCH] Add BQL support for 3c59x, based on patch from Tino Reichardt.
Tested on 3Com PCI 3c905C Tornardo by running Flent multiple times. Signed-off-by: Loganaden Velvindron lo...@elandsys.com --- drivers/net/ethernet/3com/3c59x.c | 17 - 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 2d1ce3c..5b1b818 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev) if (vp-cb_fn_base) /* The PCMCIA people are idiots. */ iowrite32(0x8000, vp-cb_fn_base + 4); netif_start_queue (dev); + netdev_reset_queue(dev); err_out: return err; } @@ -2064,6 +2065,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct vortex_private *vp = netdev_priv(dev); void __iomem *ioaddr = vp-ioaddr; + int skblen = skb-len; /* Put out the doubleword header... */ iowrite32(skb-len, ioaddr + TX_FIFO); @@ -2095,6 +2097,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) } } + netdev_sent_queue(dev, skblen); /* Clear the Tx status stack. */ { @@ -2126,6 +2129,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) void __iomem *ioaddr = vp-ioaddr; /* Calculate the next Tx descriptor entry. */ int entry = vp-cur_tx % TX_RING_SIZE; + int skblen = skb-len; struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % TX_RING_SIZE]; unsigned long flags; dma_addr_t dma_addr; @@ -2231,6 +2235,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) } vp-cur_tx++; + netdev_sent_queue(dev, skblen); + if (vp-cur_tx - vp-dirty_tx TX_RING_SIZE - 1) { netif_stop_queue (dev); } else {/* Clear previous interrupt enable. */ @@ -2268,6 +2274,7 @@ vortex_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; spin_lock(vp-lock); @@ -2315,6 +2322,8 @@ vortex_interrupt(int irq, void *dev_id) if (ioread16(ioaddr + Wn7_MasterStatus) 0x1000) { iowrite16(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ pci_unmap_single(VORTEX_PCI(vp), vp-tx_skb_dma, (vp-tx_skb-len + 3) ~3, PCI_DMA_TODEVICE); + pkts_compl++; + bytes_compl += vp-tx_skb-len; dev_kfree_skb_irq(vp-tx_skb); /* Release the transferred buffer */ if (ioread16(ioaddr + TxFree) 1536) { /* @@ -2359,6 +2368,7 @@ vortex_interrupt(int irq, void *dev_id) iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); } while ((status = ioread16(ioaddr + EL3_STATUS)) (IntLatch | RxComplete)); + netdev_completed_queue(dev, pkts_compl, bytes_compl); spin_unlock(vp-window_lock); if (vortex_debug 4) @@ -2383,6 +2393,7 @@ boomerang_interrupt(int irq, void *dev_id) int status; int work_done = max_interrupt_work; int handled = 0; + unsigned int bytes_compl = 0, pkts_compl = 0; ioaddr = vp-ioaddr; @@ -2456,6 +2467,8 @@ boomerang_interrupt(int irq, void *dev_id) pci_unmap_single(VORTEX_PCI(vp), le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE); #endif + pkts_compl++; + bytes_compl += skb-len; dev_kfree_skb_irq(skb); vp-tx_skbuff[entry] = NULL; } else { @@ -2496,6 +2509,7 @@ boomerang_interrupt(int irq, void *dev_id) iowrite32(0x8000, vp-cb_fn_base + 4); } while ((status = ioread16(ioaddr + EL3_STATUS)) IntLatch); + netdev_completed_queue(dev, pkts_compl, bytes_compl); if (vortex_debug 4) pr_debug(%s: exiting interrupt, status %4.4x.\n, @@ -2697,7 +2711,8 @@ vortex_down(struct net_device *dev, int final_down) struct vortex_private *vp = netdev_priv(dev); void __iomem *ioaddr = vp-ioaddr; - netif_stop_queue (dev); + netdev_reset_queue(dev); + netif_stop_queue(dev); del_timer_sync(vp-rx_oom_timer); del_timer_sync(vp-timer); -- 2.4.5 -- To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo