From michael.vittrup.larsen@ericsson.com Mon Nov 1 01:58:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 01:59:00 -0800 (PST) Received: from albatross.ericsson.se (albatross.ericsson.se [193.180.251.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA19wpFT004323 for ; Mon, 1 Nov 2004 01:58:52 -0800 Received: from esealmw143.al.sw.ericsson.se ([153.88.254.118]) by albatross.ericsson.se (8.12.10/8.12.10/WIREfire-1.8b) with ESMTP id iA19wYWR004513 for ; Mon, 1 Nov 2004 10:58:34 +0100 (MET) Received: from esealnt613.al.sw.ericsson.se ([153.88.254.125]) by esealmw143.al.sw.ericsson.se with Microsoft SMTPSVC(6.0.3790.211); Mon, 1 Nov 2004 10:58:33 +0100 Received: from unixmail.ted.dk.eu.ericsson.se (knud.ted.dk.eu.ericsson.se [213.159.188.246]) by esealnt613.al.sw.ericsson.se with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id WB1YZ71Q; Mon, 1 Nov 2004 10:58:33 +0100 Received: from diadem.ted.dk.eu.ericsson.se (diadem.ted.dk.eu.ericsson.se [213.159.189.76]) by unixmail.ted.dk.eu.ericsson.se (8.10.1/8.10.1/TEDmain-1.0) with ESMTP id iA19wR321026; Mon, 1 Nov 2004 10:58:31 +0100 (MET) X-Sybari-Trust: ac4731ec 8cefd49f cf62e456 00000138 From: Michael Vittrup Larsen Organization: Ericsson To: Stephen Hemminger Subject: Re: [PATCH] tcp: efficient port randomisation Date: Mon, 1 Nov 2004 11:58:23 +0200 User-Agent: KMail/1.7 Cc: "David S. Miller" , netdev@oss.sgi.com References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200410291048.01955.michael.vittrup.larsen@ericsson.com> <20041029102828.123502e7@zqx3.pdx.osdl.net> In-Reply-To: <20041029102828.123502e7@zqx3.pdx.osdl.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411011058.23141.michael.vittrup.larsen@ericsson.com> X-OriginalArrivalTime: 01 Nov 2004 09:58:33.0685 (UTC) FILETIME=[59293050:01C4BFF9] X-archive-position: 11274 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: michael.vittrup.larsen@ericsson.com Precedence: bulk X-list: netdev Content-Length: 850 Lines: 21 On Friday 29 October 2004 19:28, Stephen Hemminger wrote: > Provide port randomization for incoming connections using variation of > existing sequence number hash. Replace tcp_portalloc_lock and > tcp_port_rover with atomic operation to allow better parallelism. > > This is based on > http://www.ietf.org/internet-drafts/draft-larsen-tsvwg-port-randomisation-0 >0.txt (with confirmation of of no IPR issues). I have looked through this, and have a few comments: * It is probably a good strategy to set 'tcp_rover_next' such that the next search is resumed from the previous port found to be free. (similar to the old algorithm). I don't see this in your patch, but of course I could have missed it. * connect_port_offset() does not (at least from an algorithm point of view) need to return an u32, an u16 is sufficient. Michael Larsen From kas@fi.muni.cz Mon Nov 1 03:23:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 03:23:55 -0800 (PST) Received: from anor.ics.muni.cz (root@anor.ics.muni.cz [147.251.4.35]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1BNfQ2009259 for ; Mon, 1 Nov 2004 03:23:42 -0800 Received: from anxur.fi.muni.cz (IDENT:0@anxur.fi.muni.cz [147.251.48.3]) by anor.ics.muni.cz (8.12.1/8.12.1) with ESMTP id iA1BNK4k013917; Mon, 1 Nov 2004 12:23:20 +0100 Received: from anxur.fi.muni.cz (IDENT:11561@localhost [127.0.0.1]) by anxur.fi.muni.cz (8.12.10/8.12.8) with ESMTP id iA1BNJc4007145; Mon, 1 Nov 2004 12:23:19 +0100 (MET) Received: (from kas@localhost) by anxur.fi.muni.cz (8.12.10/8.12.8/Submit) id iA1BNEHT007136; Mon, 1 Nov 2004 12:23:14 +0100 (MET) Date: Mon, 1 Nov 2004 12:23:14 +0100 From: Jan Kasprzak To: Jeff Garzik Cc: janitor@sternwelten.at, netdev@oss.sgi.com, nacc@us.ibm.com Subject: Re: [patch 06/18] net/cosa: replace schedule_timeout() with msleep_interruptible() Message-ID: <20041101112313.GD12416@fi.muni.cz> References: <4184C79F.3090602@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C79F.3090602@pobox.com> User-Agent: Mutt/1.4.2i X-Muni-Spam-TestIP: 147.251.48.3 X-Muni-Virus-Test: Clean X-archive-position: 11275 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kas@fi.muni.cz Precedence: bulk X-list: netdev Content-Length: 686 Lines: 16 Jeff Garzik wrote: : why add all the memory barriers and such associated with : set_current_state() ? : This is not time-critical - COSA is an ISA-only device, and the driver is not tested on SMP (I have tried to make it SMP-aware, but at the time I had no SMP machine with ISA slot). -Yenya -- | Jan "Yenya" Kasprzak | | GPG: ID 1024/D3498839 Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E | | http://www.fi.muni.cz/~kas/ Czech Linux Homepage: http://www.linux.cz/ | > Whatever the Java applications and desktop dances may lead to, Unix will < > still be pushing the packets around for a quite a while. --Rob Pike < From hch@lst.de Mon Nov 1 03:46:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 03:46:32 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1BkNkX010666 for ; Mon, 1 Nov 2004 03:46:24 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iA1Bk5la007538 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 1 Nov 2004 12:46:05 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iA1Bk5WH007536; Mon, 1 Nov 2004 12:46:05 +0100 Date: Mon, 1 Nov 2004 12:46:05 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: [PATCH] remove dead exports from net/core/dev.c Message-ID: <20041101114605.GA7507@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11276 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 5873 Lines: 196 this also allows to kill some competely dead code, e.g. many of the non-locked __foo routines. Signed-off-by: Christoph Hellwig --- 1.91/include/linux/netdevice.h 2004-10-26 18:09:33 +02:00 +++ edited/include/linux/netdevice.h 2004-10-30 21:04:33 +02:00 @@ -526,20 +526,13 @@ extern int netdev_boot_setup_check(struct net_device *dev); extern unsigned long netdev_boot_base(const char *prefix, int unit); extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr); -extern struct net_device *__dev_getfirstbyhwtype(unsigned short type); extern struct net_device *dev_getfirstbyhwtype(unsigned short type); extern void dev_add_pack(struct packet_type *pt); extern void dev_remove_pack(struct packet_type *pt); extern void __dev_remove_pack(struct packet_type *pt); -extern int __dev_get(const char *name); -static inline int __deprecated dev_get(const char *name) -{ - return __dev_get(name); -} + extern struct net_device *dev_get_by_flags(unsigned short flags, unsigned short mask); -extern struct net_device *__dev_get_by_flags(unsigned short flags, - unsigned short mask); extern struct net_device *dev_get_by_name(const char *name); extern struct net_device *__dev_get_by_name(const char *name); extern int dev_alloc_name(struct net_device *dev, const char *name); @@ -553,7 +546,6 @@ extern int register_netdevice_notifier(struct notifier_block *nb); extern int unregister_netdevice_notifier(struct notifier_block *nb); extern int call_netdevice_notifiers(unsigned long val, void *v); -extern int dev_new_index(void); extern struct net_device *dev_get_by_index(int ifindex); extern struct net_device *__dev_get_by_index(int ifindex); extern int dev_restart(struct net_device *dev); @@ -910,7 +902,6 @@ /* These functions live elsewhere (drivers/net/net_init.c, but related) */ extern void ether_setup(struct net_device *dev); -extern void fddi_setup(struct net_device *dev); extern void tr_setup(struct net_device *dev); extern void fc_setup(struct net_device *dev); extern void fc_freedev(struct net_device *dev); --- 1.169/net/core/dev.c 2004-10-26 18:09:33 +02:00 +++ edited/net/core/dev.c 2004-10-30 23:17:56 +02:00 @@ -520,35 +520,6 @@ return dev; } -/* - Return value is changed to int to prevent illegal usage in future. - It is still legal to use to check for device existence. - - User should understand, that the result returned by this function - is meaningless, if it was not issued under rtnl semaphore. - */ - -/** - * dev_get - test if a device exists - * @name: name to test for - * - * Test if a name exists. Returns true if the name is found. In order - * to be sure the name is not allocated or removed during the test the - * caller must hold the rtnl semaphore. - * - * This function exists only for back compatibility with older - * drivers. - */ -int __dev_get(const char *name) -{ - struct net_device *dev; - - read_lock(&dev_base_lock); - dev = __dev_get_by_name(name); - read_unlock(&dev_base_lock); - return dev != NULL; -} - /** * __dev_get_by_index - find a device by its ifindex * @ifindex: index of device @@ -623,26 +594,17 @@ return dev; } -struct net_device *__dev_getfirstbyhwtype(unsigned short type) -{ - struct net_device *dev; - - for (dev = dev_base; dev; dev = dev->next) - if (dev->type == type) - break; - return dev; -} - -EXPORT_SYMBOL(__dev_getfirstbyhwtype); - struct net_device *dev_getfirstbyhwtype(unsigned short type) { struct net_device *dev; rtnl_lock(); - dev = __dev_getfirstbyhwtype(type); - if (dev) - dev_hold(dev); + for (dev = dev_base; dev; dev = dev->next) { + if (dev->type == type) { + dev_hold(dev); + break; + } + } rtnl_unlock(); return dev; } @@ -665,32 +627,14 @@ struct net_device *dev; read_lock(&dev_base_lock); - dev = __dev_get_by_flags(if_flags, mask); - if (dev) - dev_hold(dev); - read_unlock(&dev_base_lock); - return dev; -} - -/** - * __dev_get_by_flags - find any device with given flags - * @if_flags: IFF_* values - * @mask: bitmask of bits in if_flags to check - * - * Search for any interface with the given flags. Returns NULL if a device - * is not found or a pointer to the device. The caller must hold either - * the RTNL semaphore or @dev_base_lock. - */ - -struct net_device *__dev_get_by_flags(unsigned short if_flags, unsigned short mask) -{ - struct net_device *dev; - for (dev = dev_base; dev != NULL; dev = dev->next) { - if (((dev->flags ^ if_flags) & mask) == 0) - return dev; + if (((dev->flags ^ if_flags) & mask) == 0) { + dev_hold(dev); + break; + } } - return NULL; + read_unlock(&dev_base_lock); + return dev; } /** @@ -2696,7 +2640,7 @@ * number. The caller must hold the rtnl semaphore or the * dev_base_lock to be sure it remains unique. */ -int dev_new_index(void) +static int dev_new_index(void) { static int ifindex; for (;;) { @@ -3236,30 +3180,23 @@ subsys_initcall(net_dev_init); -EXPORT_SYMBOL(__dev_get); -EXPORT_SYMBOL(__dev_get_by_flags); EXPORT_SYMBOL(__dev_get_by_index); EXPORT_SYMBOL(__dev_get_by_name); EXPORT_SYMBOL(__dev_remove_pack); EXPORT_SYMBOL(__skb_linearize); -EXPORT_SYMBOL(call_netdevice_notifiers); EXPORT_SYMBOL(dev_add_pack); EXPORT_SYMBOL(dev_alloc_name); EXPORT_SYMBOL(dev_close); EXPORT_SYMBOL(dev_get_by_flags); EXPORT_SYMBOL(dev_get_by_index); EXPORT_SYMBOL(dev_get_by_name); -EXPORT_SYMBOL(dev_getbyhwaddr); EXPORT_SYMBOL(dev_ioctl); -EXPORT_SYMBOL(dev_new_index); EXPORT_SYMBOL(dev_open); EXPORT_SYMBOL(dev_queue_xmit); -EXPORT_SYMBOL(dev_queue_xmit_nit); EXPORT_SYMBOL(dev_remove_pack); EXPORT_SYMBOL(dev_set_allmulti); EXPORT_SYMBOL(dev_set_promiscuity); EXPORT_SYMBOL(dev_change_flags); -EXPORT_SYMBOL(dev_change_name); EXPORT_SYMBOL(dev_set_mtu); EXPORT_SYMBOL(free_netdev); EXPORT_SYMBOL(netdev_boot_setup_check); From hch@lst.de Mon Nov 1 03:57:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 03:57:17 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1BvBam011317 for ; Mon, 1 Nov 2004 03:57:11 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iA1Burla007725 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 1 Nov 2004 12:56:53 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iA1BurxK007723; Mon, 1 Nov 2004 12:56:53 +0100 Date: Mon, 1 Nov 2004 12:56:53 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: [PATCH] remove dead skb_iter* functions Message-ID: <20041101115653.GA7714@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11277 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 4363 Lines: 160 Signed-off-by: Christoph Hellwig --- 1.56/include/linux/skbuff.h 2004-10-05 23:51:01 +02:00 +++ edited/include/linux/skbuff.h 2004-10-30 21:04:33 +02:00 @@ -592,7 +592,6 @@ /* * Insert a packet on a list. */ -extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk); static inline void __skb_insert(struct sk_buff *newsk, struct sk_buff *prev, struct sk_buff *next, struct sk_buff_head *list) @@ -1120,22 +1119,6 @@ extern void skb_init(void); extern void skb_add_mtu(int mtu); - -struct skb_iter { - /* Iteration functions set these */ - unsigned char *data; - unsigned int len; - - /* Private to iteration */ - unsigned int nextfrag; - struct sk_buff *fraglist; -}; - -/* Keep iterating until skb_iter_next returns false. */ -extern void skb_iter_first(const struct sk_buff *skb, struct skb_iter *i); -extern int skb_iter_next(const struct sk_buff *skb, struct skb_iter *i); -/* Call this if aborting loop before !skb_iter_next */ -extern void skb_iter_abort(const struct sk_buff *skb, struct skb_iter *i); #ifdef CONFIG_NETFILTER static inline void nf_conntrack_put(struct nf_conntrack *nfct) --- 1.39/net/core/skbuff.c 2004-10-20 06:56:24 +02:00 +++ edited/net/core/skbuff.c 2004-10-30 21:04:33 +02:00 @@ -929,72 +929,7 @@ return -EFAULT; } -/* Keep iterating until skb_iter_next returns false. */ -void skb_iter_first(const struct sk_buff *skb, struct skb_iter *i) -{ - i->len = skb_headlen(skb); - i->data = (unsigned char *)skb->data; - i->nextfrag = 0; - i->fraglist = NULL; -} - -int skb_iter_next(const struct sk_buff *skb, struct skb_iter *i) -{ - /* Unmap previous, if not head fragment. */ - if (i->nextfrag) - kunmap_skb_frag(i->data); - - if (i->fraglist) { - fraglist: - /* We're iterating through fraglist. */ - if (i->nextfrag < skb_shinfo(i->fraglist)->nr_frags) { - i->data = kmap_skb_frag(&skb_shinfo(i->fraglist) - ->frags[i->nextfrag]); - i->len = skb_shinfo(i->fraglist)->frags[i->nextfrag] - .size; - i->nextfrag++; - return 1; - } - /* Fragments with fragments? Too hard! */ - BUG_ON(skb_shinfo(i->fraglist)->frag_list); - i->fraglist = i->fraglist->next; - if (!i->fraglist) - goto end; - - i->len = skb_headlen(i->fraglist); - i->data = i->fraglist->data; - i->nextfrag = 0; - return 1; - } - - if (i->nextfrag < skb_shinfo(skb)->nr_frags) { - i->data = kmap_skb_frag(&skb_shinfo(skb)->frags[i->nextfrag]); - i->len = skb_shinfo(skb)->frags[i->nextfrag].size; - i->nextfrag++; - return 1; - } - - i->fraglist = skb_shinfo(skb)->frag_list; - if (i->fraglist) - goto fraglist; - -end: - /* Bug trap for callers */ - i->data = NULL; - return 0; -} - -void skb_iter_abort(const struct sk_buff *skb, struct skb_iter *i) -{ - /* Unmap previous, if not head fragment. */ - if (i->data && i->nextfrag) - kunmap_skb_frag(i->data); - /* Bug trap for callers */ - i->data = NULL; -} - /* Checksum skb data. */ - unsigned int skb_checksum(const struct sk_buff *skb, int offset, int len, unsigned int csum) { @@ -1318,25 +1253,6 @@ } -/** - * skb_insert - insert a buffer - * @old: buffer to insert before - * @newsk: buffer to insert - * - * Place a packet before a given packet in a list. The list locks are taken - * and this function is atomic with respect to other list locked calls - * A buffer cannot be placed on two lists at the same time. - */ - -void skb_insert(struct sk_buff *old, struct sk_buff *newsk) -{ - unsigned long flags; - - spin_lock_irqsave(&old->list->lock, flags); - __skb_insert(newsk, old->prev, old, old->list); - spin_unlock_irqrestore(&old->list->lock, flags); -} - #if 0 /* * Tune the memory allocator for a new MTU size. @@ -1444,7 +1360,6 @@ EXPORT_SYMBOL(pskb_expand_head); EXPORT_SYMBOL(skb_checksum); EXPORT_SYMBOL(skb_clone); -EXPORT_SYMBOL(skb_clone_fraglist); EXPORT_SYMBOL(skb_copy); EXPORT_SYMBOL(skb_copy_and_csum_bits); EXPORT_SYMBOL(skb_copy_and_csum_dev); @@ -1456,13 +1371,8 @@ EXPORT_SYMBOL(skb_under_panic); EXPORT_SYMBOL(skb_dequeue); EXPORT_SYMBOL(skb_dequeue_tail); -EXPORT_SYMBOL(skb_insert); EXPORT_SYMBOL(skb_queue_purge); EXPORT_SYMBOL(skb_queue_head); EXPORT_SYMBOL(skb_queue_tail); EXPORT_SYMBOL(skb_unlink); EXPORT_SYMBOL(skb_append); -EXPORT_SYMBOL(skb_split); -EXPORT_SYMBOL(skb_iter_first); -EXPORT_SYMBOL(skb_iter_next); -EXPORT_SYMBOL(skb_iter_abort); From hch@lst.de Mon Nov 1 05:02:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 05:02:13 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1D22nV016986 for ; Mon, 1 Nov 2004 05:02:03 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iA1D1ila008754 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 1 Nov 2004 14:01:45 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iA1D1isb008752; Mon, 1 Nov 2004 14:01:44 +0100 Date: Mon, 1 Nov 2004 14:01:44 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: [PATCH] remove net_init.c ifdef clutter Message-ID: <20041101130144.GA8727@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11278 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 20351 Lines: 727 Move the devicetype-specific functions from net_init.c to the devicetype-specific files under net/. --- 1.24/drivers/net/net_init.c 2004-04-06 00:46:26 +02:00 +++ edited/drivers/net/net_init.c 2004-11-01 13:20:45 +01:00 @@ -105,260 +105,6 @@ } EXPORT_SYMBOL(alloc_netdev); -/** - * alloc_etherdev - Allocates and sets up an ethernet device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with ethernet-generic - * values. Basically does everything except registering the device. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_etherdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "eth%d", ether_setup); -} - -EXPORT_SYMBOL(alloc_etherdev); - -static int eth_mac_addr(struct net_device *dev, void *p) -{ - struct sockaddr *addr=p; - if (netif_running(dev)) - return -EBUSY; - memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); - return 0; -} - -static int eth_change_mtu(struct net_device *dev, int new_mtu) -{ - if ((new_mtu < 68) || (new_mtu > 1500)) - return -EINVAL; - dev->mtu = new_mtu; - return 0; -} - -#ifdef CONFIG_FDDI - -/** - * alloc_fddidev - Register FDDI device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this FDDI device - * - * Fill in the fields of the device structure with FDDI-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_fddidev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); -} - -EXPORT_SYMBOL(alloc_fddidev); - -static int fddi_change_mtu(struct net_device *dev, int new_mtu) -{ - if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) - return(-EINVAL); - dev->mtu = new_mtu; - return(0); -} - -#endif /* CONFIG_FDDI */ - -#ifdef CONFIG_HIPPI - -static int hippi_change_mtu(struct net_device *dev, int new_mtu) -{ - /* - * HIPPI's got these nice large MTUs. - */ - if ((new_mtu < 68) || (new_mtu > 65280)) - return -EINVAL; - dev->mtu = new_mtu; - return(0); -} - - -/* - * For HIPPI we will actually use the lower 4 bytes of the hardware - * address as the I-FIELD rather than the actual hardware address. - */ -static int hippi_mac_addr(struct net_device *dev, void *p) -{ - struct sockaddr *addr = p; - if (netif_running(dev)) - return -EBUSY; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - return 0; -} - -static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) -{ - /* Never send broadcast/multicast ARP messages */ - p->mcast_probes = 0; - - /* In IPv6 unicast probes are valid even on NBMA, - * because they are encapsulated in normal IPv6 protocol. - * Should be a generic flag. - */ - if (p->tbl->family != AF_INET6) - p->ucast_probes = 0; - return 0; -} - -static void hippi_setup(struct net_device *dev) -{ - dev->set_multicast_list = NULL; - dev->change_mtu = hippi_change_mtu; - dev->hard_header = hippi_header; - dev->rebuild_header = hippi_rebuild_header; - dev->set_mac_address = hippi_mac_addr; - dev->hard_header_parse = NULL; - dev->hard_header_cache = NULL; - dev->header_cache_update = NULL; - dev->neigh_setup = hippi_neigh_setup_dev; - - /* - * We don't support HIPPI `ARP' for the time being, and probably - * never will unless someone else implements it. However we - * still need a fake ARPHRD to make ifconfig and friends play ball. - */ - dev->type = ARPHRD_HIPPI; - dev->hard_header_len = HIPPI_HLEN; - dev->mtu = 65280; - dev->addr_len = HIPPI_ALEN; - dev->tx_queue_len = 25 /* 5 */; - memset(dev->broadcast, 0xFF, HIPPI_ALEN); - - - /* - * HIPPI doesn't support broadcast+multicast and we only use - * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. - */ - dev->flags = 0; -} - -/** - * alloc_hippi_dev - Register HIPPI device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this HIPPI device - * - * Fill in the fields of the device structure with HIPPI-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_hippi_dev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); -} - -EXPORT_SYMBOL(alloc_hippi_dev); - -#endif /* CONFIG_HIPPI */ - -void ether_setup(struct net_device *dev) -{ - /* Fill in the fields of the device structure with ethernet-generic values. - This should be in a common file instead of per-driver. */ - - dev->change_mtu = eth_change_mtu; - dev->hard_header = eth_header; - dev->rebuild_header = eth_rebuild_header; - dev->set_mac_address = eth_mac_addr; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update= eth_header_cache_update; - dev->hard_header_parse = eth_header_parse; - - dev->type = ARPHRD_ETHER; - dev->hard_header_len = ETH_HLEN; - dev->mtu = 1500; /* eth_mtu */ - dev->addr_len = ETH_ALEN; - dev->tx_queue_len = 1000; /* Ethernet wants good queues */ - - memset(dev->broadcast,0xFF, ETH_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST|IFF_MULTICAST; -} -EXPORT_SYMBOL(ether_setup); - -#ifdef CONFIG_FDDI - -void fddi_setup(struct net_device *dev) -{ - /* - * Fill in the fields of the device structure with FDDI-generic values. - * This should be in a common file instead of per-driver. - */ - - dev->change_mtu = fddi_change_mtu; - dev->hard_header = fddi_header; - dev->rebuild_header = fddi_rebuild_header; - - dev->type = ARPHRD_FDDI; - dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ - dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ - dev->addr_len = FDDI_K_ALEN; - dev->tx_queue_len = 100; /* Long queues on FDDI */ - - memset(dev->broadcast, 0xFF, FDDI_K_ALEN); - - /* New-style flags */ - dev->flags = IFF_BROADCAST | IFF_MULTICAST; -} -EXPORT_SYMBOL(fddi_setup); - -#endif /* CONFIG_FDDI */ - -#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) - -static int ltalk_change_mtu(struct net_device *dev, int mtu) -{ - return -EINVAL; -} - -static int ltalk_mac_addr(struct net_device *dev, void *addr) -{ - return -EINVAL; -} - - -void ltalk_setup(struct net_device *dev) -{ - /* Fill in the fields of the device structure with localtalk-generic values. */ - - dev->change_mtu = ltalk_change_mtu; - dev->hard_header = NULL; - dev->rebuild_header = NULL; - dev->set_mac_address = ltalk_mac_addr; - dev->hard_header_cache = NULL; - dev->header_cache_update= NULL; - - dev->type = ARPHRD_LOCALTLK; - dev->hard_header_len = LTALK_HLEN; - dev->mtu = LTALK_MTU; - dev->addr_len = LTALK_ALEN; - dev->tx_queue_len = 10; - - dev->broadcast[0] = 0xFF; - - dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; -} -EXPORT_SYMBOL(ltalk_setup); - -#endif /* CONFIG_ATALK || CONFIG_ATALK_MODULE */ - int register_netdev(struct net_device *dev) { int err; @@ -404,90 +150,3 @@ EXPORT_SYMBOL(register_netdev); EXPORT_SYMBOL(unregister_netdev); - -#ifdef CONFIG_TR - -void tr_setup(struct net_device *dev) -{ - /* - * Configure and register - */ - - dev->hard_header = tr_header; - dev->rebuild_header = tr_rebuild_header; - - dev->type = ARPHRD_IEEE802_TR; - dev->hard_header_len = TR_HLEN; - dev->mtu = 2000; - dev->addr_len = TR_ALEN; - dev->tx_queue_len = 100; /* Long queues on tr */ - - memset(dev->broadcast,0xFF, TR_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST | IFF_MULTICAST ; -} - -/** - * alloc_trdev - Register token ring device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this token ring device - * - * Fill in the fields of the device structure with token ring-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_trdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "tr%d", tr_setup); -} - -EXPORT_SYMBOL(tr_setup); -EXPORT_SYMBOL(alloc_trdev); - -#endif /* CONFIG_TR */ - -#ifdef CONFIG_NET_FC - -void fc_setup(struct net_device *dev) -{ - dev->hard_header = fc_header; - dev->rebuild_header = fc_rebuild_header; - - dev->type = ARPHRD_IEEE802; - dev->hard_header_len = FC_HLEN; - dev->mtu = 2024; - dev->addr_len = FC_ALEN; - dev->tx_queue_len = 100; /* Long queues on fc */ - - memset(dev->broadcast,0xFF, FC_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST; -} - -/** - * alloc_fcdev - Register fibre channel device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this fibre channel device - * - * Fill in the fields of the device structure with fibre channel-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_fcdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "fc%d", fc_setup); -} - -EXPORT_SYMBOL(fc_setup); -EXPORT_SYMBOL(alloc_fcdev); - -#endif /* CONFIG_NET_FC */ - --- 1.91/include/linux/netdevice.h 2004-10-26 18:09:33 +02:00 +++ edited/include/linux/netdevice.h 2004-11-01 13:13:07 +01:00 @@ -910,10 +910,7 @@ /* These functions live elsewhere (drivers/net/net_init.c, but related) */ extern void ether_setup(struct net_device *dev); -extern void fddi_setup(struct net_device *dev); -extern void tr_setup(struct net_device *dev); -extern void fc_setup(struct net_device *dev); -extern void fc_freedev(struct net_device *dev); + /* Support for loadable net-drivers */ extern struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *)); ===== net/802/fc.c 1.3 vs edited ===== --- 1.3/net/802/fc.c 2004-06-24 21:37:35 +02:00 +++ edited/net/802/fc.c 2004-11-01 13:52:59 +01:00 @@ -129,3 +129,35 @@ return ntohs(ETH_P_802_2); } + +static void fc_setup(struct net_device *dev) +{ + dev->hard_header = fc_header; + dev->rebuild_header = fc_rebuild_header; + + dev->type = ARPHRD_IEEE802; + dev->hard_header_len = FC_HLEN; + dev->mtu = 2024; + dev->addr_len = FC_ALEN; + dev->tx_queue_len = 100; /* Long queues on fc */ + dev->flags = IFF_BROADCAST; + + memset(dev->broadcast, 0xFF, FC_ALEN); +} + +/** + * alloc_fcdev - Register fibre channel device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this fibre channel device + * + * Fill in the fields of the device structure with fibre channel-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_fcdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "fc%d", fc_setup); +} +EXPORT_SYMBOL(alloc_fcdev); --- 1.3/net/802/fddi.c 2003-09-29 04:23:30 +02:00 +++ edited/net/802/fddi.c 2004-11-01 13:12:14 +01:00 @@ -166,3 +166,44 @@ } EXPORT_SYMBOL(fddi_type_trans); + +static int fddi_change_mtu(struct net_device *dev, int new_mtu) +{ + if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) + return(-EINVAL); + dev->mtu = new_mtu; + return(0); +} + +static void fddi_setup(struct net_device *dev) +{ + dev->change_mtu = fddi_change_mtu; + dev->hard_header = fddi_header; + dev->rebuild_header = fddi_rebuild_header; + + dev->type = ARPHRD_FDDI; + dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ + dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ + dev->addr_len = FDDI_K_ALEN; + dev->tx_queue_len = 100; /* Long queues on FDDI */ + dev->flags = IFF_BROADCAST | IFF_MULTICAST; + + memset(dev->broadcast, 0xFF, FDDI_K_ALEN); +} + +/** + * alloc_fddidev - Register FDDI device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this FDDI device + * + * Fill in the fields of the device structure with FDDI-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_fddidev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); +} +EXPORT_SYMBOL(alloc_fddidev); --- 1.4/net/802/hippi.c 2003-09-29 04:23:30 +02:00 +++ edited/net/802/hippi.c 2004-11-01 13:53:31 +01:00 @@ -154,3 +154,92 @@ } EXPORT_SYMBOL(hippi_type_trans); + +static int hippi_change_mtu(struct net_device *dev, int new_mtu) +{ + /* + * HIPPI's got these nice large MTUs. + */ + if ((new_mtu < 68) || (new_mtu > 65280)) + return -EINVAL; + dev->mtu = new_mtu; + return(0); +} + +/* + * For HIPPI we will actually use the lower 4 bytes of the hardware + * address as the I-FIELD rather than the actual hardware address. + */ +static int hippi_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + if (netif_running(dev)) + return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + return 0; +} + +static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) +{ + /* Never send broadcast/multicast ARP messages */ + p->mcast_probes = 0; + + /* In IPv6 unicast probes are valid even on NBMA, + * because they are encapsulated in normal IPv6 protocol. + * Should be a generic flag. + */ + if (p->tbl->family != AF_INET6) + p->ucast_probes = 0; + return 0; +} + +static void hippi_setup(struct net_device *dev) +{ + dev->set_multicast_list = NULL; + dev->change_mtu = hippi_change_mtu; + dev->hard_header = hippi_header; + dev->rebuild_header = hippi_rebuild_header; + dev->set_mac_address = hippi_mac_addr; + dev->hard_header_parse = NULL; + dev->hard_header_cache = NULL; + dev->header_cache_update = NULL; + dev->neigh_setup = hippi_neigh_setup_dev; + + /* + * We don't support HIPPI `ARP' for the time being, and probably + * never will unless someone else implements it. However we + * still need a fake ARPHRD to make ifconfig and friends play ball. + */ + dev->type = ARPHRD_HIPPI; + dev->hard_header_len = HIPPI_HLEN; + dev->mtu = 65280; + dev->addr_len = HIPPI_ALEN; + dev->tx_queue_len = 25 /* 5 */; + memset(dev->broadcast, 0xFF, HIPPI_ALEN); + + + /* + * HIPPI doesn't support broadcast+multicast and we only use + * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. + */ + dev->flags = 0; +} + +/** + * alloc_hippi_dev - Register HIPPI device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this HIPPI device + * + * Fill in the fields of the device structure with HIPPI-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ + +struct net_device *alloc_hippi_dev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); +} + +EXPORT_SYMBOL(alloc_hippi_dev); --- 1.17/net/802/tr.c 2004-06-24 21:36:53 +02:00 +++ edited/net/802/tr.c 2004-11-01 13:14:02 +01:00 @@ -583,6 +583,43 @@ #endif +static void tr_setup(struct net_device *dev) +{ + /* + * Configure and register + */ + + dev->hard_header = tr_header; + dev->rebuild_header = tr_rebuild_header; + + dev->type = ARPHRD_IEEE802_TR; + dev->hard_header_len = TR_HLEN; + dev->mtu = 2000; + dev->addr_len = TR_ALEN; + dev->tx_queue_len = 100; /* Long queues on tr */ + + memset(dev->broadcast,0xFF, TR_ALEN); + + /* New-style flags. */ + dev->flags = IFF_BROADCAST | IFF_MULTICAST ; +} + +/** + * alloc_trdev - Register token ring device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this token ring device + * + * Fill in the fields of the device structure with token ring-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_trdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "tr%d", tr_setup); +} + /* * Called during bootup. We don't actually have to initialise * too much for this. @@ -604,3 +641,4 @@ EXPORT_SYMBOL(tr_source_route); EXPORT_SYMBOL(tr_type_trans); +EXPORT_SYMBOL(alloc_trdev); --- 1.8/net/appletalk/Makefile 2004-08-18 23:35:04 +02:00 +++ edited/net/appletalk/Makefile 2004-11-01 13:22:42 +01:00 @@ -4,6 +4,6 @@ obj-$(CONFIG_ATALK) += appletalk.o -appletalk-y := aarp.o ddp.o +appletalk-y := aarp.o ddp.o dev.o appletalk-$(CONFIG_PROC_FS) += atalk_proc.o appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o --- 1.9/net/ethernet/eth.c 2004-10-05 23:51:01 +02:00 +++ edited/net/ethernet/eth.c 2004-11-01 13:54:23 +01:00 @@ -245,3 +245,64 @@ } EXPORT_SYMBOL(eth_type_trans); + +static int eth_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr=p; + if (netif_running(dev)) + return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); + return 0; +} + +static int eth_change_mtu(struct net_device *dev, int new_mtu) +{ + if ((new_mtu < 68) || (new_mtu > 1500)) + return -EINVAL; + dev->mtu = new_mtu; + return 0; +} + +/* + * Fill in the fields of the device structure with ethernet-generic values. + */ +void ether_setup(struct net_device *dev) +{ + dev->change_mtu = eth_change_mtu; + dev->hard_header = eth_header; + dev->rebuild_header = eth_rebuild_header; + dev->set_mac_address = eth_mac_addr; + dev->hard_header_cache = eth_header_cache; + dev->header_cache_update= eth_header_cache_update; + dev->hard_header_parse = eth_header_parse; + + dev->type = ARPHRD_ETHER; + dev->hard_header_len = ETH_HLEN; + dev->mtu = 1500; /* eth_mtu */ + dev->addr_len = ETH_ALEN; + dev->tx_queue_len = 1000; /* Ethernet wants good queues */ + dev->flags = IFF_BROADCAST|IFF_MULTICAST; + + memset(dev->broadcast,0xFF, ETH_ALEN); + +} +EXPORT_SYMBOL(ether_setup); + +/** + * alloc_etherdev - Allocates and sets up an ethernet device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this ethernet device + * + * Fill in the fields of the device structure with ethernet-generic + * values. Basically does everything except registering the device. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ + +struct net_device *alloc_etherdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "eth%d", ether_setup); +} +EXPORT_SYMBOL(alloc_etherdev); --- /dev/null 2004-08-20 00:05:11.000000000 +0200 +++ b/net/appletalk/dev.c 2004-11-01 13:49:02.111094544 +0100 @@ -0,0 +1,43 @@ +/* + * Moved here from drivers/net/net_init.c, which is: + * Written 1993,1994,1995 by Donald Becker. + */ + +#include +#include +#include +#include +#include + +static int ltalk_change_mtu(struct net_device *dev, int mtu) +{ + return -EINVAL; +} + +static int ltalk_mac_addr(struct net_device *dev, void *addr) +{ + return -EINVAL; +} + +void ltalk_setup(struct net_device *dev) +{ + /* Fill in the fields of the device structure with localtalk-generic values. */ + + dev->change_mtu = ltalk_change_mtu; + dev->hard_header = NULL; + dev->rebuild_header = NULL; + dev->set_mac_address = ltalk_mac_addr; + dev->hard_header_cache = NULL; + dev->header_cache_update= NULL; + + dev->type = ARPHRD_LOCALTLK; + dev->hard_header_len = LTALK_HLEN; + dev->mtu = LTALK_MTU; + dev->addr_len = LTALK_ALEN; + dev->tx_queue_len = 10; + + dev->broadcast[0] = 0xFF; + + dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; +} +EXPORT_SYMBOL(ltalk_setup); From SRS0+637e20ab50b9227e3014+435+infradead.org+hch@phoenix.srs.infradead.org Mon Nov 1 05:03:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 05:04:05 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1D3tVP017241 for ; Mon, 1 Nov 2004 05:03:56 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CObqO-00079U-BF; Mon, 01 Nov 2004 13:03:32 +0000 Date: Mon, 1 Nov 2004 13:03:32 +0000 From: Christoph Hellwig To: Christoph Hellwig Cc: davem@redhat.com, netdev@oss.sgi.com Subject: Re: [PATCH] remove net_init.c ifdef clutter Message-ID: <20041101130331.GA27476@infradead.org> References: <20041101130144.GA8727@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101130144.GA8727@lst.de> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11279 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev Content-Length: 21942 Lines: 732 On Mon, Nov 01, 2004 at 02:01:44PM +0100, Christoph Hellwig wrote: > Move the devicetype-specific functions from net_init.c to the > devicetype-specific files under net/. Signed-off-by: Christoph Hellwig > > --- 1.24/drivers/net/net_init.c 2004-04-06 00:46:26 +02:00 > +++ edited/drivers/net/net_init.c 2004-11-01 13:20:45 +01:00 > @@ -105,260 +105,6 @@ > } > EXPORT_SYMBOL(alloc_netdev); > > -/** > - * alloc_etherdev - Allocates and sets up an ethernet device > - * @sizeof_priv: Size of additional driver-private structure to be allocated > - * for this ethernet device > - * > - * Fill in the fields of the device structure with ethernet-generic > - * values. Basically does everything except registering the device. > - * > - * Constructs a new net device, complete with a private data area of > - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > - * this private data area. > - */ > - > -struct net_device *alloc_etherdev(int sizeof_priv) > -{ > - return alloc_netdev(sizeof_priv, "eth%d", ether_setup); > -} > - > -EXPORT_SYMBOL(alloc_etherdev); > - > -static int eth_mac_addr(struct net_device *dev, void *p) > -{ > - struct sockaddr *addr=p; > - if (netif_running(dev)) > - return -EBUSY; > - memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); > - return 0; > -} > - > -static int eth_change_mtu(struct net_device *dev, int new_mtu) > -{ > - if ((new_mtu < 68) || (new_mtu > 1500)) > - return -EINVAL; > - dev->mtu = new_mtu; > - return 0; > -} > - > -#ifdef CONFIG_FDDI > - > -/** > - * alloc_fddidev - Register FDDI device > - * @sizeof_priv: Size of additional driver-private structure to be allocated > - * for this FDDI device > - * > - * Fill in the fields of the device structure with FDDI-generic values. > - * > - * Constructs a new net device, complete with a private data area of > - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > - * this private data area. > - */ > - > -struct net_device *alloc_fddidev(int sizeof_priv) > -{ > - return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); > -} > - > -EXPORT_SYMBOL(alloc_fddidev); > - > -static int fddi_change_mtu(struct net_device *dev, int new_mtu) > -{ > - if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) > - return(-EINVAL); > - dev->mtu = new_mtu; > - return(0); > -} > - > -#endif /* CONFIG_FDDI */ > - > -#ifdef CONFIG_HIPPI > - > -static int hippi_change_mtu(struct net_device *dev, int new_mtu) > -{ > - /* > - * HIPPI's got these nice large MTUs. > - */ > - if ((new_mtu < 68) || (new_mtu > 65280)) > - return -EINVAL; > - dev->mtu = new_mtu; > - return(0); > -} > - > - > -/* > - * For HIPPI we will actually use the lower 4 bytes of the hardware > - * address as the I-FIELD rather than the actual hardware address. > - */ > -static int hippi_mac_addr(struct net_device *dev, void *p) > -{ > - struct sockaddr *addr = p; > - if (netif_running(dev)) > - return -EBUSY; > - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); > - return 0; > -} > - > -static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) > -{ > - /* Never send broadcast/multicast ARP messages */ > - p->mcast_probes = 0; > - > - /* In IPv6 unicast probes are valid even on NBMA, > - * because they are encapsulated in normal IPv6 protocol. > - * Should be a generic flag. > - */ > - if (p->tbl->family != AF_INET6) > - p->ucast_probes = 0; > - return 0; > -} > - > -static void hippi_setup(struct net_device *dev) > -{ > - dev->set_multicast_list = NULL; > - dev->change_mtu = hippi_change_mtu; > - dev->hard_header = hippi_header; > - dev->rebuild_header = hippi_rebuild_header; > - dev->set_mac_address = hippi_mac_addr; > - dev->hard_header_parse = NULL; > - dev->hard_header_cache = NULL; > - dev->header_cache_update = NULL; > - dev->neigh_setup = hippi_neigh_setup_dev; > - > - /* > - * We don't support HIPPI `ARP' for the time being, and probably > - * never will unless someone else implements it. However we > - * still need a fake ARPHRD to make ifconfig and friends play ball. > - */ > - dev->type = ARPHRD_HIPPI; > - dev->hard_header_len = HIPPI_HLEN; > - dev->mtu = 65280; > - dev->addr_len = HIPPI_ALEN; > - dev->tx_queue_len = 25 /* 5 */; > - memset(dev->broadcast, 0xFF, HIPPI_ALEN); > - > - > - /* > - * HIPPI doesn't support broadcast+multicast and we only use > - * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. > - */ > - dev->flags = 0; > -} > - > -/** > - * alloc_hippi_dev - Register HIPPI device > - * @sizeof_priv: Size of additional driver-private structure to be allocated > - * for this HIPPI device > - * > - * Fill in the fields of the device structure with HIPPI-generic values. > - * > - * Constructs a new net device, complete with a private data area of > - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > - * this private data area. > - */ > - > -struct net_device *alloc_hippi_dev(int sizeof_priv) > -{ > - return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); > -} > - > -EXPORT_SYMBOL(alloc_hippi_dev); > - > -#endif /* CONFIG_HIPPI */ > - > -void ether_setup(struct net_device *dev) > -{ > - /* Fill in the fields of the device structure with ethernet-generic values. > - This should be in a common file instead of per-driver. */ > - > - dev->change_mtu = eth_change_mtu; > - dev->hard_header = eth_header; > - dev->rebuild_header = eth_rebuild_header; > - dev->set_mac_address = eth_mac_addr; > - dev->hard_header_cache = eth_header_cache; > - dev->header_cache_update= eth_header_cache_update; > - dev->hard_header_parse = eth_header_parse; > - > - dev->type = ARPHRD_ETHER; > - dev->hard_header_len = ETH_HLEN; > - dev->mtu = 1500; /* eth_mtu */ > - dev->addr_len = ETH_ALEN; > - dev->tx_queue_len = 1000; /* Ethernet wants good queues */ > - > - memset(dev->broadcast,0xFF, ETH_ALEN); > - > - /* New-style flags. */ > - dev->flags = IFF_BROADCAST|IFF_MULTICAST; > -} > -EXPORT_SYMBOL(ether_setup); > - > -#ifdef CONFIG_FDDI > - > -void fddi_setup(struct net_device *dev) > -{ > - /* > - * Fill in the fields of the device structure with FDDI-generic values. > - * This should be in a common file instead of per-driver. > - */ > - > - dev->change_mtu = fddi_change_mtu; > - dev->hard_header = fddi_header; > - dev->rebuild_header = fddi_rebuild_header; > - > - dev->type = ARPHRD_FDDI; > - dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ > - dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ > - dev->addr_len = FDDI_K_ALEN; > - dev->tx_queue_len = 100; /* Long queues on FDDI */ > - > - memset(dev->broadcast, 0xFF, FDDI_K_ALEN); > - > - /* New-style flags */ > - dev->flags = IFF_BROADCAST | IFF_MULTICAST; > -} > -EXPORT_SYMBOL(fddi_setup); > - > -#endif /* CONFIG_FDDI */ > - > -#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) > - > -static int ltalk_change_mtu(struct net_device *dev, int mtu) > -{ > - return -EINVAL; > -} > - > -static int ltalk_mac_addr(struct net_device *dev, void *addr) > -{ > - return -EINVAL; > -} > - > - > -void ltalk_setup(struct net_device *dev) > -{ > - /* Fill in the fields of the device structure with localtalk-generic values. */ > - > - dev->change_mtu = ltalk_change_mtu; > - dev->hard_header = NULL; > - dev->rebuild_header = NULL; > - dev->set_mac_address = ltalk_mac_addr; > - dev->hard_header_cache = NULL; > - dev->header_cache_update= NULL; > - > - dev->type = ARPHRD_LOCALTLK; > - dev->hard_header_len = LTALK_HLEN; > - dev->mtu = LTALK_MTU; > - dev->addr_len = LTALK_ALEN; > - dev->tx_queue_len = 10; > - > - dev->broadcast[0] = 0xFF; > - > - dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; > -} > -EXPORT_SYMBOL(ltalk_setup); > - > -#endif /* CONFIG_ATALK || CONFIG_ATALK_MODULE */ > - > int register_netdev(struct net_device *dev) > { > int err; > @@ -404,90 +150,3 @@ > > EXPORT_SYMBOL(register_netdev); > EXPORT_SYMBOL(unregister_netdev); > - > -#ifdef CONFIG_TR > - > -void tr_setup(struct net_device *dev) > -{ > - /* > - * Configure and register > - */ > - > - dev->hard_header = tr_header; > - dev->rebuild_header = tr_rebuild_header; > - > - dev->type = ARPHRD_IEEE802_TR; > - dev->hard_header_len = TR_HLEN; > - dev->mtu = 2000; > - dev->addr_len = TR_ALEN; > - dev->tx_queue_len = 100; /* Long queues on tr */ > - > - memset(dev->broadcast,0xFF, TR_ALEN); > - > - /* New-style flags. */ > - dev->flags = IFF_BROADCAST | IFF_MULTICAST ; > -} > - > -/** > - * alloc_trdev - Register token ring device > - * @sizeof_priv: Size of additional driver-private structure to be allocated > - * for this token ring device > - * > - * Fill in the fields of the device structure with token ring-generic values. > - * > - * Constructs a new net device, complete with a private data area of > - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > - * this private data area. > - */ > - > -struct net_device *alloc_trdev(int sizeof_priv) > -{ > - return alloc_netdev(sizeof_priv, "tr%d", tr_setup); > -} > - > -EXPORT_SYMBOL(tr_setup); > -EXPORT_SYMBOL(alloc_trdev); > - > -#endif /* CONFIG_TR */ > - > -#ifdef CONFIG_NET_FC > - > -void fc_setup(struct net_device *dev) > -{ > - dev->hard_header = fc_header; > - dev->rebuild_header = fc_rebuild_header; > - > - dev->type = ARPHRD_IEEE802; > - dev->hard_header_len = FC_HLEN; > - dev->mtu = 2024; > - dev->addr_len = FC_ALEN; > - dev->tx_queue_len = 100; /* Long queues on fc */ > - > - memset(dev->broadcast,0xFF, FC_ALEN); > - > - /* New-style flags. */ > - dev->flags = IFF_BROADCAST; > -} > - > -/** > - * alloc_fcdev - Register fibre channel device > - * @sizeof_priv: Size of additional driver-private structure to be allocated > - * for this fibre channel device > - * > - * Fill in the fields of the device structure with fibre channel-generic values. > - * > - * Constructs a new net device, complete with a private data area of > - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > - * this private data area. > - */ > - > -struct net_device *alloc_fcdev(int sizeof_priv) > -{ > - return alloc_netdev(sizeof_priv, "fc%d", fc_setup); > -} > - > -EXPORT_SYMBOL(fc_setup); > -EXPORT_SYMBOL(alloc_fcdev); > - > -#endif /* CONFIG_NET_FC */ > - > --- 1.91/include/linux/netdevice.h 2004-10-26 18:09:33 +02:00 > +++ edited/include/linux/netdevice.h 2004-11-01 13:13:07 +01:00 > @@ -910,10 +910,7 @@ > /* These functions live elsewhere (drivers/net/net_init.c, but related) */ > > extern void ether_setup(struct net_device *dev); > -extern void fddi_setup(struct net_device *dev); > -extern void tr_setup(struct net_device *dev); > -extern void fc_setup(struct net_device *dev); > -extern void fc_freedev(struct net_device *dev); > + > /* Support for loadable net-drivers */ > extern struct net_device *alloc_netdev(int sizeof_priv, const char *name, > void (*setup)(struct net_device *)); > ===== net/802/fc.c 1.3 vs edited ===== > --- 1.3/net/802/fc.c 2004-06-24 21:37:35 +02:00 > +++ edited/net/802/fc.c 2004-11-01 13:52:59 +01:00 > @@ -129,3 +129,35 @@ > > return ntohs(ETH_P_802_2); > } > + > +static void fc_setup(struct net_device *dev) > +{ > + dev->hard_header = fc_header; > + dev->rebuild_header = fc_rebuild_header; > + > + dev->type = ARPHRD_IEEE802; > + dev->hard_header_len = FC_HLEN; > + dev->mtu = 2024; > + dev->addr_len = FC_ALEN; > + dev->tx_queue_len = 100; /* Long queues on fc */ > + dev->flags = IFF_BROADCAST; > + > + memset(dev->broadcast, 0xFF, FC_ALEN); > +} > + > +/** > + * alloc_fcdev - Register fibre channel device > + * @sizeof_priv: Size of additional driver-private structure to be allocated > + * for this fibre channel device > + * > + * Fill in the fields of the device structure with fibre channel-generic values. > + * > + * Constructs a new net device, complete with a private data area of > + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > + * this private data area. > + */ > +struct net_device *alloc_fcdev(int sizeof_priv) > +{ > + return alloc_netdev(sizeof_priv, "fc%d", fc_setup); > +} > +EXPORT_SYMBOL(alloc_fcdev); > --- 1.3/net/802/fddi.c 2003-09-29 04:23:30 +02:00 > +++ edited/net/802/fddi.c 2004-11-01 13:12:14 +01:00 > @@ -166,3 +166,44 @@ > } > > EXPORT_SYMBOL(fddi_type_trans); > + > +static int fddi_change_mtu(struct net_device *dev, int new_mtu) > +{ > + if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) > + return(-EINVAL); > + dev->mtu = new_mtu; > + return(0); > +} > + > +static void fddi_setup(struct net_device *dev) > +{ > + dev->change_mtu = fddi_change_mtu; > + dev->hard_header = fddi_header; > + dev->rebuild_header = fddi_rebuild_header; > + > + dev->type = ARPHRD_FDDI; > + dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ > + dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ > + dev->addr_len = FDDI_K_ALEN; > + dev->tx_queue_len = 100; /* Long queues on FDDI */ > + dev->flags = IFF_BROADCAST | IFF_MULTICAST; > + > + memset(dev->broadcast, 0xFF, FDDI_K_ALEN); > +} > + > +/** > + * alloc_fddidev - Register FDDI device > + * @sizeof_priv: Size of additional driver-private structure to be allocated > + * for this FDDI device > + * > + * Fill in the fields of the device structure with FDDI-generic values. > + * > + * Constructs a new net device, complete with a private data area of > + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > + * this private data area. > + */ > +struct net_device *alloc_fddidev(int sizeof_priv) > +{ > + return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); > +} > +EXPORT_SYMBOL(alloc_fddidev); > --- 1.4/net/802/hippi.c 2003-09-29 04:23:30 +02:00 > +++ edited/net/802/hippi.c 2004-11-01 13:53:31 +01:00 > @@ -154,3 +154,92 @@ > } > > EXPORT_SYMBOL(hippi_type_trans); > + > +static int hippi_change_mtu(struct net_device *dev, int new_mtu) > +{ > + /* > + * HIPPI's got these nice large MTUs. > + */ > + if ((new_mtu < 68) || (new_mtu > 65280)) > + return -EINVAL; > + dev->mtu = new_mtu; > + return(0); > +} > + > +/* > + * For HIPPI we will actually use the lower 4 bytes of the hardware > + * address as the I-FIELD rather than the actual hardware address. > + */ > +static int hippi_mac_addr(struct net_device *dev, void *p) > +{ > + struct sockaddr *addr = p; > + if (netif_running(dev)) > + return -EBUSY; > + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); > + return 0; > +} > + > +static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) > +{ > + /* Never send broadcast/multicast ARP messages */ > + p->mcast_probes = 0; > + > + /* In IPv6 unicast probes are valid even on NBMA, > + * because they are encapsulated in normal IPv6 protocol. > + * Should be a generic flag. > + */ > + if (p->tbl->family != AF_INET6) > + p->ucast_probes = 0; > + return 0; > +} > + > +static void hippi_setup(struct net_device *dev) > +{ > + dev->set_multicast_list = NULL; > + dev->change_mtu = hippi_change_mtu; > + dev->hard_header = hippi_header; > + dev->rebuild_header = hippi_rebuild_header; > + dev->set_mac_address = hippi_mac_addr; > + dev->hard_header_parse = NULL; > + dev->hard_header_cache = NULL; > + dev->header_cache_update = NULL; > + dev->neigh_setup = hippi_neigh_setup_dev; > + > + /* > + * We don't support HIPPI `ARP' for the time being, and probably > + * never will unless someone else implements it. However we > + * still need a fake ARPHRD to make ifconfig and friends play ball. > + */ > + dev->type = ARPHRD_HIPPI; > + dev->hard_header_len = HIPPI_HLEN; > + dev->mtu = 65280; > + dev->addr_len = HIPPI_ALEN; > + dev->tx_queue_len = 25 /* 5 */; > + memset(dev->broadcast, 0xFF, HIPPI_ALEN); > + > + > + /* > + * HIPPI doesn't support broadcast+multicast and we only use > + * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. > + */ > + dev->flags = 0; > +} > + > +/** > + * alloc_hippi_dev - Register HIPPI device > + * @sizeof_priv: Size of additional driver-private structure to be allocated > + * for this HIPPI device > + * > + * Fill in the fields of the device structure with HIPPI-generic values. > + * > + * Constructs a new net device, complete with a private data area of > + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > + * this private data area. > + */ > + > +struct net_device *alloc_hippi_dev(int sizeof_priv) > +{ > + return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); > +} > + > +EXPORT_SYMBOL(alloc_hippi_dev); > --- 1.17/net/802/tr.c 2004-06-24 21:36:53 +02:00 > +++ edited/net/802/tr.c 2004-11-01 13:14:02 +01:00 > @@ -583,6 +583,43 @@ > > #endif > > +static void tr_setup(struct net_device *dev) > +{ > + /* > + * Configure and register > + */ > + > + dev->hard_header = tr_header; > + dev->rebuild_header = tr_rebuild_header; > + > + dev->type = ARPHRD_IEEE802_TR; > + dev->hard_header_len = TR_HLEN; > + dev->mtu = 2000; > + dev->addr_len = TR_ALEN; > + dev->tx_queue_len = 100; /* Long queues on tr */ > + > + memset(dev->broadcast,0xFF, TR_ALEN); > + > + /* New-style flags. */ > + dev->flags = IFF_BROADCAST | IFF_MULTICAST ; > +} > + > +/** > + * alloc_trdev - Register token ring device > + * @sizeof_priv: Size of additional driver-private structure to be allocated > + * for this token ring device > + * > + * Fill in the fields of the device structure with token ring-generic values. > + * > + * Constructs a new net device, complete with a private data area of > + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > + * this private data area. > + */ > +struct net_device *alloc_trdev(int sizeof_priv) > +{ > + return alloc_netdev(sizeof_priv, "tr%d", tr_setup); > +} > + > /* > * Called during bootup. We don't actually have to initialise > * too much for this. > @@ -604,3 +641,4 @@ > > EXPORT_SYMBOL(tr_source_route); > EXPORT_SYMBOL(tr_type_trans); > +EXPORT_SYMBOL(alloc_trdev); > --- 1.8/net/appletalk/Makefile 2004-08-18 23:35:04 +02:00 > +++ edited/net/appletalk/Makefile 2004-11-01 13:22:42 +01:00 > @@ -4,6 +4,6 @@ > > obj-$(CONFIG_ATALK) += appletalk.o > > -appletalk-y := aarp.o ddp.o > +appletalk-y := aarp.o ddp.o dev.o > appletalk-$(CONFIG_PROC_FS) += atalk_proc.o > appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o > --- 1.9/net/ethernet/eth.c 2004-10-05 23:51:01 +02:00 > +++ edited/net/ethernet/eth.c 2004-11-01 13:54:23 +01:00 > @@ -245,3 +245,64 @@ > } > > EXPORT_SYMBOL(eth_type_trans); > + > +static int eth_mac_addr(struct net_device *dev, void *p) > +{ > + struct sockaddr *addr=p; > + if (netif_running(dev)) > + return -EBUSY; > + memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); > + return 0; > +} > + > +static int eth_change_mtu(struct net_device *dev, int new_mtu) > +{ > + if ((new_mtu < 68) || (new_mtu > 1500)) > + return -EINVAL; > + dev->mtu = new_mtu; > + return 0; > +} > + > +/* > + * Fill in the fields of the device structure with ethernet-generic values. > + */ > +void ether_setup(struct net_device *dev) > +{ > + dev->change_mtu = eth_change_mtu; > + dev->hard_header = eth_header; > + dev->rebuild_header = eth_rebuild_header; > + dev->set_mac_address = eth_mac_addr; > + dev->hard_header_cache = eth_header_cache; > + dev->header_cache_update= eth_header_cache_update; > + dev->hard_header_parse = eth_header_parse; > + > + dev->type = ARPHRD_ETHER; > + dev->hard_header_len = ETH_HLEN; > + dev->mtu = 1500; /* eth_mtu */ > + dev->addr_len = ETH_ALEN; > + dev->tx_queue_len = 1000; /* Ethernet wants good queues */ > + dev->flags = IFF_BROADCAST|IFF_MULTICAST; > + > + memset(dev->broadcast,0xFF, ETH_ALEN); > + > +} > +EXPORT_SYMBOL(ether_setup); > + > +/** > + * alloc_etherdev - Allocates and sets up an ethernet device > + * @sizeof_priv: Size of additional driver-private structure to be allocated > + * for this ethernet device > + * > + * Fill in the fields of the device structure with ethernet-generic > + * values. Basically does everything except registering the device. > + * > + * Constructs a new net device, complete with a private data area of > + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for > + * this private data area. > + */ > + > +struct net_device *alloc_etherdev(int sizeof_priv) > +{ > + return alloc_netdev(sizeof_priv, "eth%d", ether_setup); > +} > +EXPORT_SYMBOL(alloc_etherdev); > --- /dev/null 2004-08-20 00:05:11.000000000 +0200 > +++ b/net/appletalk/dev.c 2004-11-01 13:49:02.111094544 +0100 > @@ -0,0 +1,43 @@ > +/* > + * Moved here from drivers/net/net_init.c, which is: > + * Written 1993,1994,1995 by Donald Becker. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +static int ltalk_change_mtu(struct net_device *dev, int mtu) > +{ > + return -EINVAL; > +} > + > +static int ltalk_mac_addr(struct net_device *dev, void *addr) > +{ > + return -EINVAL; > +} > + > +void ltalk_setup(struct net_device *dev) > +{ > + /* Fill in the fields of the device structure with localtalk-generic values. */ > + > + dev->change_mtu = ltalk_change_mtu; > + dev->hard_header = NULL; > + dev->rebuild_header = NULL; > + dev->set_mac_address = ltalk_mac_addr; > + dev->hard_header_cache = NULL; > + dev->header_cache_update= NULL; > + > + dev->type = ARPHRD_LOCALTLK; > + dev->hard_header_len = LTALK_HLEN; > + dev->mtu = LTALK_MTU; > + dev->addr_len = LTALK_ALEN; > + dev->tx_queue_len = 10; > + > + dev->broadcast[0] = 0xFF; > + > + dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; > +} > +EXPORT_SYMBOL(ltalk_setup); > ---end quoted text--- From penberg@cs.helsinki.fi Mon Nov 1 06:29:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 06:29:19 -0800 (PST) Received: from mail.cs.helsinki.fi (courier.cs.helsinki.fi [128.214.9.1]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1ET3MK020656 for ; Mon, 1 Nov 2004 06:29:04 -0800 Received: from cs181096176.pp.htv.fi (cs181096176.pp.htv.fi [82.181.96.176]) (AUTH: LOGIN penberg, SSL: TLSv1/SSLv3,128bits,RC4-MD5) by mail.cs.helsinki.fi with esmtp; Mon, 01 Nov 2004 16:26:32 +0200 id 000741CF.41864798.00002A8C Subject: Re: net: generic netdev_ioaddr From: Pekka Enberg To: Krzysztof Halasa Cc: Al Viro , davem@davemloft.net, netdev@oss.sgi.com, linux-kernel@vger.kernel.org In-Reply-To: References: <1099044244.9566.0.camel@localhost> <20041029131607.GU24336@parcelfarce.linux.theplanet.co.uk> <20041029193827.GV24336@parcelfarce.linux.theplanet.co.uk> <1099129946.10961.9.camel@localhost> <1099206669.9571.10.camel@localhost> Date: Mon, 01 Nov 2004 16:27:47 +0200 Message-Id: <1099319267.9550.3.camel@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit X-Mailer: Evolution 2.0.2 X-archive-position: 11281 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: penberg@cs.helsinki.fi Precedence: bulk X-list: netdev Content-Length: 23942 Lines: 829 Hi, On Mon, 2004-11-01 at 00:14 +0100, Krzysztof Halasa wrote: > IMHO partially: base_addr etc should go from the core (to driver's > local structs if needed). I think no general netdev-setup thing is > needed, we have module parameters and library functions. > > No ioctl for such things is needed either. > /sbin/ifconfig shouldn't mess with hardware data such as I/O address, > IRQ etc. - it should be a configuration tool for software protocols, > not for hardware (i.e. as /sbin/ip is). > > My opinion of course. FWIW I am running this patch on my box. ifconfig doesn't mind but I am not sure about the rtnetlink part. I can start stabbing other drivers if the maintainers are interested in this cleanup... Pekka --- drivers/net/Space.c | 23 ++----- drivers/net/natsemi.c | 134 +++++++++++++++++++++---------------------- include/linux/netdevice.h | 12 --- net/core/dev.c | 141 ---------------------------------------------- net/core/rtnetlink.c | 12 --- net/ethernet/eth.c | 4 - 6 files changed, 74 insertions(+), 252 deletions(-) Index: 2.6.10-rc1-mm1/drivers/net/Space.c =================================================================== --- 2.6.10-rc1-mm1.orig/drivers/net/Space.c 2004-11-01 16:11:34.682350032 +0200 +++ 2.6.10-rc1-mm1/drivers/net/Space.c 2004-11-01 16:12:31.554704120 +0200 @@ -322,17 +322,12 @@ static void __init ethif_probe2(int unit) { - unsigned long base_addr = netdev_boot_base("eth", unit); - - if (base_addr == 1) - return; - - (void)( probe_list2(unit, m68k_probes, base_addr == 0) && - probe_list2(unit, mips_probes, base_addr == 0) && - probe_list2(unit, eisa_probes, base_addr == 0) && - probe_list2(unit, mca_probes, base_addr == 0) && - probe_list2(unit, isa_probes, base_addr == 0) && - probe_list2(unit, parport_probes, base_addr == 0)); + (void)( probe_list2(unit, m68k_probes, 1) && + probe_list2(unit, mips_probes, 1) && + probe_list2(unit, eisa_probes, 1) && + probe_list2(unit, mca_probes, 1) && + probe_list2(unit, isa_probes, 1) && + probe_list2(unit, parport_probes, 1)); } #ifdef CONFIG_TR @@ -374,11 +369,7 @@ static void __init trif_probe2(int unit) { - unsigned long base_addr = netdev_boot_base("tr", unit); - - if (base_addr == 1) - return; - probe_list2(unit, tr_probes2, base_addr == 0); + probe_list2(unit, tr_probes2, 1); } #endif Index: 2.6.10-rc1-mm1/drivers/net/natsemi.c =================================================================== --- 2.6.10-rc1-mm1.orig/drivers/net/natsemi.c 2004-11-01 16:11:33.217572712 +0200 +++ 2.6.10-rc1-mm1/drivers/net/natsemi.c 2004-11-01 16:12:31.700681928 +0200 @@ -327,7 +327,7 @@ is set, then access is permitted under spin_lock_irq(&np->lock). Thus configuration functions that want to access everything must call - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_bh(dev->xmit_lock); spin_lock_irq(&np->lock); @@ -349,7 +349,7 @@ -enum pcistuff { +enum { PCI_USES_IO = 0x01, PCI_USES_MEM = 0x02, PCI_USES_MASTER = 0x04, @@ -668,6 +668,8 @@ }; struct netdev_private { + void __iomem *mmioaddr; + unsigned int irq; /* Descriptor rings first for alignment */ dma_addr_t ring_dma; struct netdev_desc *rx_ring; @@ -770,15 +772,10 @@ static int netdev_get_eeprom(struct net_device *dev, u8 *buf); static struct ethtool_ops ethtool_ops; -static inline void __iomem *ns_ioaddr(struct net_device *dev) -{ - return (void __iomem *) dev->base_addr; -} - static void move_int_phy(struct net_device *dev, int addr) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; int target = 31; /* @@ -867,11 +864,11 @@ prev_eedata = eedata; } - dev->base_addr = (unsigned long __force) ioaddr; - dev->irq = irq; np = netdev_priv(dev); + np->mmioaddr = ioaddr; + np->irq = irq; np->pci_dev = pdev; pci_set_drvdata(pdev, dev); np->iosize = iosize; @@ -906,8 +903,6 @@ } option = find_cnt < MAX_UNITS ? options[find_cnt] : 0; - if (dev->mem_start) - option = dev->mem_start; /* The lower four bits are the media type. */ if (option) { @@ -1073,7 +1068,8 @@ static int mii_getbit (struct net_device *dev) { int data; - void __iomem *ioaddr = ns_ioaddr(dev); + struct netdev_private *np = netdev_priv(dev); + void __iomem *ioaddr = np->mmioaddr; writel(MII_ShiftClk, ioaddr + EECtrl); data = readl(ioaddr + EECtrl); @@ -1085,7 +1081,8 @@ static void mii_send_bits (struct net_device *dev, u32 data, int len) { u32 i; - void __iomem *ioaddr = ns_ioaddr(dev); + struct netdev_private *np = netdev_priv(dev); + void __iomem *ioaddr = np->mmioaddr; for (i = (1 << (len-1)); i; i >>= 1) { @@ -1141,7 +1138,7 @@ static int mdio_read(struct net_device *dev, int reg) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; /* The 83815 series has two ports: * - an internal transceiver @@ -1156,7 +1153,7 @@ static void mdio_write(struct net_device *dev, int reg, u16 data) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; /* The 83815 series has an internal transceiver; handle separately */ if (dev->if_port == PORT_TP) @@ -1168,7 +1165,7 @@ static void init_phy_fixup(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; int i; u32 cfg; u16 tmp; @@ -1280,7 +1277,7 @@ static int switch_port_external(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; u32 cfg; cfg = readl(ioaddr + ChipConfig); @@ -1313,7 +1310,7 @@ static int switch_port_internal(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; int i; u32 cfg; u16 bmcr; @@ -1414,7 +1411,7 @@ u16 pmatch[3]; u16 sopass[3]; struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; /* * Resetting the chip causes some registers to be lost. @@ -1485,7 +1482,7 @@ static void natsemi_reload_eeprom(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; int i; writel(EepromReload, ioaddr + PCIBusCfg); @@ -1505,8 +1502,8 @@ static void natsemi_stop_rxtx(struct net_device *dev) { - void __iomem * ioaddr = ns_ioaddr(dev); struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; int i; writel(RxOff | TxOff, ioaddr + ChipCmd); @@ -1527,21 +1524,21 @@ static int netdev_open(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; int i; /* Reset the chip, just in case. */ natsemi_reset(dev); - i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); + i = request_irq(np->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (i) return i; if (netif_msg_ifup(np)) printk(KERN_DEBUG "%s: netdev_open() irq %d.\n", - dev->name, dev->irq); + dev->name, np->irq); i = alloc_ring(dev); if (i < 0) { - free_irq(dev->irq, dev); + free_irq(np->irq, dev); return i; } init_ring(dev); @@ -1576,7 +1573,7 @@ static void do_cable_magic(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); + void __iomem *ioaddr = np->mmioaddr; if (dev->if_port != PORT_TP) return; @@ -1621,7 +1618,7 @@ { u16 data; struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; if (dev->if_port != PORT_TP) return; @@ -1640,7 +1637,7 @@ static void check_link(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; int duplex; u16 bmsr; @@ -1701,7 +1698,7 @@ static void init_registers(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; init_phy_fixup(dev); @@ -1780,7 +1777,7 @@ { struct net_device *dev = (struct net_device *)data; struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; int next_tick = 5*HZ; if (netif_msg_timer(np)) { @@ -1805,14 +1802,14 @@ if (netif_msg_hw(np)) printk(KERN_NOTICE "%s: possible phy reset: " "re-initializing\n", dev->name); - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_irq(&np->lock); natsemi_stop_rxtx(dev); dump_ring(dev); reinit_ring(dev); init_registers(dev); spin_unlock_irq(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); } else { /* hurry back */ next_tick = HZ; @@ -1829,10 +1826,10 @@ spin_unlock_irq(&np->lock); } if (np->oom) { - disable_irq(dev->irq); + disable_irq(np->irq); np->oom = 0; refill_rx(dev); - enable_irq(dev->irq); + enable_irq(np->irq); if (!np->oom) { writel(RxOn, ioaddr + ChipCmd); } else { @@ -1868,9 +1865,9 @@ static void tx_timeout(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_irq(&np->lock); if (!np->hands_off) { if (netif_msg_tx_err(np)) @@ -1889,7 +1886,7 @@ dev->name); } spin_unlock_irq(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); dev->trans_start = jiffies; np->stats.tx_errors++; @@ -2068,7 +2065,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; unsigned entry; /* Note: Ordering is important here, set the field with the @@ -2162,7 +2159,7 @@ { struct net_device *dev = dev_instance; struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; int boguscnt = max_interrupt_work; unsigned int handled = 0; @@ -2224,7 +2221,7 @@ int boguscnt = np->dirty_rx + RX_RING_SIZE - np->cur_rx; s32 desc_status = le32_to_cpu(np->rx_head_desc->cmd_status); unsigned int buflen = np->rx_buf_sz; - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; /* If the driver owns the next entry it's a new packet. Send it up. */ while (desc_status < 0) { /* e.g. & DescOwn */ @@ -2312,7 +2309,7 @@ static void netdev_error(struct net_device *dev, int intr_status) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; spin_lock(&np->lock); if (intr_status & LinkChange) { @@ -2371,8 +2368,8 @@ static void __get_stats(struct net_device *dev) { - void __iomem * ioaddr = ns_ioaddr(dev); struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; /* The chip only need report frame silently dropped. */ np->stats.rx_crc_errors += readl(ioaddr + RxCRCErrs); @@ -2395,17 +2392,17 @@ #ifdef CONFIG_NET_POLL_CONTROLLER static void natsemi_poll_controller(struct net_device *dev) { - disable_irq(dev->irq); - intr_handler(dev->irq, dev, NULL); - enable_irq(dev->irq); + disable_irq(np->irq); + intr_handler(np->irq, dev, NULL); + enable_irq(np->irq); } #endif #define HASH_TABLE 0x200 static void __set_rx_mode(struct net_device *dev) { - void __iomem * ioaddr = ns_ioaddr(dev); struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; u8 mc_filter[64]; /* Multicast hash filter */ u32 rx_mode; @@ -2450,9 +2447,9 @@ /* synchronized against open : rtnl_lock() held by caller */ if (netif_running(dev)) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock(&np->lock); /* stop engines */ natsemi_stop_rxtx(dev); @@ -2465,7 +2462,7 @@ /* restart engines */ writel(RxOn | TxOn, ioaddr + ChipCmd); spin_unlock(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); } return 0; } @@ -2612,7 +2609,7 @@ static int netdev_set_wol(struct net_device *dev, u32 newval) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; u32 data = readl(ioaddr + WOLCmd) & ~WakeOptsSummary; /* translate to bitmasks this chip understands */ @@ -2642,7 +2639,7 @@ static int netdev_get_wol(struct net_device *dev, u32 *supported, u32 *cur) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; u32 regval = readl(ioaddr + WOLCmd); *supported = (WAKE_PHY | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST @@ -2678,7 +2675,7 @@ static int netdev_set_sopass(struct net_device *dev, u8 *newval) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; u16 *sval = (u16 *)newval; u32 addr; @@ -2710,7 +2707,7 @@ static int netdev_get_sopass(struct net_device *dev, u8 *data) { struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; u16 *sval = (u16 *)data; u32 addr; @@ -2894,7 +2891,8 @@ int j; u32 rfcr; u32 *rbuf = (u32 *)buf; - void __iomem * ioaddr = ns_ioaddr(dev); + struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; /* read non-mii page 0 of registers */ for (i = 0; i < NATSEMI_PG0_NREGS/2; i++) { @@ -2944,7 +2942,8 @@ { int i; u16 *ebuf = (u16 *)buf; - void __iomem * ioaddr = ns_ioaddr(dev); + struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; /* eeprom_read reads 16 bits, and indexes by 16 bits */ for (i = 0; i < NATSEMI_EEPROM_SIZE/2; i++) { @@ -3016,8 +3015,8 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr) { - void __iomem * ioaddr = ns_ioaddr(dev); struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; if (netif_msg_wol(np)) printk(KERN_INFO "%s: remaining active for wake-on-lan\n", @@ -3049,8 +3048,8 @@ static int netdev_close(struct net_device *dev) { - void __iomem * ioaddr = ns_ioaddr(dev); struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; if (netif_msg_ifdown(np)) printk(KERN_DEBUG @@ -3070,16 +3069,16 @@ */ del_timer_sync(&np->timer); - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_irq(&np->lock); /* Disable interrupts, and flush posted writes */ writel(0, ioaddr + IntrEnable); readl(ioaddr + IntrEnable); np->hands_off = 1; spin_unlock_irq(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); - free_irq(dev->irq, dev); + free_irq(np->irq, dev); /* Interrupt disabled, interrupt handler released, * queue stopped, timer deleted, rtnl_lock held @@ -3126,7 +3125,8 @@ static void __devexit natsemi_remove1 (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - void __iomem * ioaddr = ns_ioaddr(dev); + struct netdev_private *np = netdev_priv(dev); + void __iomem * ioaddr = np->mmioaddr; unregister_netdev (dev); pci_release_regions (pdev); @@ -3164,13 +3164,13 @@ { struct net_device *dev = pci_get_drvdata (pdev); struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + void __iomem * ioaddr = np->mmioaddr; rtnl_lock(); if (netif_running (dev)) { del_timer_sync(&np->timer); - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_irq(&np->lock); writel(0, ioaddr + IntrEnable); @@ -3179,7 +3179,7 @@ netif_stop_queue(dev); spin_unlock_irq(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); /* Update the error counts. */ __get_stats(dev); @@ -3222,13 +3222,13 @@ natsemi_reset(dev); init_ring(dev); - disable_irq(dev->irq); + disable_irq(np->irq); spin_lock_irq(&np->lock); np->hands_off = 0; init_registers(dev); netif_device_attach(dev); spin_unlock_irq(&np->lock); - enable_irq(dev->irq); + enable_irq(np->irq); mod_timer(&np->timer, jiffies + 1*HZ); } Index: 2.6.10-rc1-mm1/include/linux/netdevice.h =================================================================== --- 2.6.10-rc1-mm1.orig/include/linux/netdevice.h 2004-11-01 16:11:34.683349880 +0200 +++ 2.6.10-rc1-mm1/include/linux/netdevice.h 2004-11-01 16:12:31.625693328 +0200 @@ -272,15 +272,6 @@ char name[IFNAMSIZ]; /* - * I/O specific fields - * FIXME: Merge these and struct ifmap into one - */ - unsigned long mem_end; /* shared mem end */ - unsigned long mem_start; /* shared mem start */ - unsigned long base_addr; /* device I/O address */ - unsigned int irq; /* device IRQ number */ - - /* * Some hardware also needs these fields, but they are not * part of the usual set specified in Space.c. */ @@ -522,9 +513,6 @@ extern struct net_device *dev_base; /* All devices */ extern rwlock_t dev_base_lock; /* Device list lock */ -extern int netdev_boot_setup_add(char *name, struct ifmap *map); -extern int netdev_boot_setup_check(struct net_device *dev); -extern unsigned long netdev_boot_base(const char *prefix, int unit); extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr); extern struct net_device *__dev_getfirstbyhwtype(unsigned short type); extern struct net_device *dev_getfirstbyhwtype(unsigned short type); Index: 2.6.10-rc1-mm1/net/core/dev.c =================================================================== --- 2.6.10-rc1-mm1.orig/net/core/dev.c 2004-11-01 16:11:35.376244544 +0200 +++ 2.6.10-rc1-mm1/net/core/dev.c 2004-11-01 16:12:31.559703360 +0200 @@ -343,129 +343,6 @@ synchronize_net(); } -/****************************************************************************** - - Device Boot-time Settings Routines - -*******************************************************************************/ - -/* Boot time configuration table */ -static struct netdev_boot_setup dev_boot_setup[NETDEV_BOOT_SETUP_MAX]; - -/** - * netdev_boot_setup_add - add new setup entry - * @name: name of the device - * @map: configured settings for the device - * - * Adds new setup entry to the dev_boot_setup list. The function - * returns 0 on error and 1 on success. This is a generic routine to - * all netdevices. - */ -int netdev_boot_setup_add(char *name, struct ifmap *map) -{ - struct netdev_boot_setup *s; - int i; - - s = dev_boot_setup; - for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { - if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { - memset(s[i].name, 0, sizeof(s[i].name)); - strcpy(s[i].name, name); - memcpy(&s[i].map, map, sizeof(s[i].map)); - break; - } - } - - return i >= NETDEV_BOOT_SETUP_MAX ? 0 : 1; -} - -/** - * netdev_boot_setup_check - check boot time settings - * @dev: the netdevice - * - * Check boot time settings for the device. - * The found settings are set for the device to be used - * later in the device probing. - * Returns 0 if no settings found, 1 if they are. - */ -int netdev_boot_setup_check(struct net_device *dev) -{ - struct netdev_boot_setup *s = dev_boot_setup; - int i; - - for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { - if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && - !strncmp(dev->name, s[i].name, strlen(s[i].name))) { - dev->irq = s[i].map.irq; - dev->base_addr = s[i].map.base_addr; - dev->mem_start = s[i].map.mem_start; - dev->mem_end = s[i].map.mem_end; - return 1; - } - } - return 0; -} - - -/** - * netdev_boot_base - get address from boot time settings - * @prefix: prefix for network device - * @unit: id for network device - * - * Check boot time settings for the base address of device. - * The found settings are set for the device to be used - * later in the device probing. - * Returns 0 if no settings found. - */ -unsigned long netdev_boot_base(const char *prefix, int unit) -{ - const struct netdev_boot_setup *s = dev_boot_setup; - char name[IFNAMSIZ]; - int i; - - sprintf(name, "%s%d", prefix, unit); - - /* - * If device already registered then return base of 1 - * to indicate not to probe for this interface - */ - if (__dev_get_by_name(name)) - return 1; - - for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) - if (!strcmp(name, s[i].name)) - return s[i].map.base_addr; - return 0; -} - -/* - * Saves at boot time configured settings for any netdevice. - */ -int __init netdev_boot_setup(char *str) -{ - int ints[5]; - struct ifmap map; - - str = get_options(str, ARRAY_SIZE(ints), ints); - if (!str || !*str) - return 0; - - /* Save settings */ - memset(&map, 0, sizeof(map)); - if (ints[0] > 0) - map.irq = ints[1]; - if (ints[0] > 1) - map.base_addr = ints[2]; - if (ints[0] > 2) - map.mem_start = ints[3]; - if (ints[0] > 3) - map.mem_end = ints[4]; - - /* Add new entry to the list */ - return netdev_boot_setup_add(str, &map); -} - -__setup("netdev=", netdev_boot_setup); /******************************************************************************* @@ -2404,23 +2281,6 @@ NETDEV_CHANGEADDR, dev); return 0; - case SIOCGIFMAP: - ifr->ifr_map.mem_start = dev->mem_start; - ifr->ifr_map.mem_end = dev->mem_end; - ifr->ifr_map.base_addr = dev->base_addr; - ifr->ifr_map.irq = dev->irq; - ifr->ifr_map.dma = dev->dma; - ifr->ifr_map.port = dev->if_port; - return 0; - - case SIOCSIFMAP: - if (dev->set_config) { - if (!netif_device_present(dev)) - return -ENODEV; - return dev->set_config(dev, &ifr->ifr_map); - } - return -EOPNOTSUPP; - case SIOCADDMULTI: if (!dev->set_multicast_list || ifr->ifr_hwaddr.sa_family != AF_UNSPEC) @@ -3264,7 +3124,6 @@ EXPORT_SYMBOL(dev_change_name); EXPORT_SYMBOL(dev_set_mtu); EXPORT_SYMBOL(free_netdev); -EXPORT_SYMBOL(netdev_boot_setup_check); EXPORT_SYMBOL(netdev_set_master); EXPORT_SYMBOL(netdev_state_change); EXPORT_SYMBOL(netif_receive_skb); Index: 2.6.10-rc1-mm1/net/core/rtnetlink.c =================================================================== --- 2.6.10-rc1-mm1.orig/net/core/rtnetlink.c 2004-11-01 16:11:32.428692640 +0200 +++ 2.6.10-rc1-mm1/net/core/rtnetlink.c 2004-11-01 16:12:31.755673568 +0200 @@ -181,18 +181,6 @@ RTA_PUT(skb, IFLA_WEIGHT, sizeof(weight), &weight); } - if (1) { - struct rtnl_link_ifmap map = { - .mem_start = dev->mem_start, - .mem_end = dev->mem_end, - .base_addr = dev->base_addr, - .irq = dev->irq, - .dma = dev->dma, - .port = dev->if_port, - }; - RTA_PUT(skb, IFLA_MAP, sizeof(map), &map); - } - if (dev->addr_len) { RTA_PUT(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr); RTA_PUT(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast); Index: 2.6.10-rc1-mm1/net/ethernet/eth.c =================================================================== --- 2.6.10-rc1-mm1.orig/net/ethernet/eth.c 2004-11-01 16:11:34.687349272 +0200 +++ 2.6.10-rc1-mm1/net/ethernet/eth.c 2004-11-01 16:12:31.560703208 +0200 @@ -62,10 +62,6 @@ #include #include -extern int __init netdev_boot_setup(char *str); - -__setup("ether=", netdev_boot_setup); - /* * Create the Ethernet MAC header for an arbitrary protocol layer * From zaitcev@redhat.com Mon Nov 1 08:28:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 08:28:25 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1GSK9O028509 for ; Mon, 1 Nov 2004 08:28:20 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iA1GS3FP018297 for ; Mon, 1 Nov 2004 11:28:03 -0500 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iA1GS3r30546 for ; Mon, 1 Nov 2004 11:28:03 -0500 Received: from lembas.zaitcev.lan (vpn50-9.rdu.redhat.com [172.16.50.9]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id iA1GRxap016581; Mon, 1 Nov 2004 11:27:59 -0500 Date: Mon, 1 Nov 2004 08:27:57 -0800 From: Pete Zaitcev To: netdev@oss.sgi.com Cc: jgarzik@redhat.com, zaitcev@redhat.com Subject: The boot time failure in tulip Message-ID: <20041101082757.64583eb2@lembas.zaitcev.lan> Organization: Red Hat, Inc. X-Mailer: Sylpheed-Claws 0.9.12cvs126.2 (GTK+ 2.4.13; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-archive-position: 11282 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zaitcev@redhat.com Precedence: bulk X-list: netdev Content-Length: 1448 Lines: 39 I have finally figured how the failure develops. I poked Jeff about it before, but nothing could be done because it looked impossible to reproduce without reboots. Just asking for negotiation with mii-tool would always yield a working link. Also, this only happens with a dumb hub (tried several), but works dandy when talking to a switch. So, here's the deal. The Fedora startup has a segment which works like this: ip link set dev $1 up >/dev/null 2>&1 timeout=0 while [ $timeout -le 10 ]; do check_mii_tool $1 m=$? check_ethtool $1 e=$? if [ $m -eq 1 ] || [ $e -eq 1 ] ; then return 1 fi if [ $m -eq 2 ] && [ $e -eq 2 ] ; then return 1 fi usleep 500000 timeout=$((timeout+1)) done It appears that the negotiation will not happen after "ip link set ... up" if we keep beating the interface with mii-tool (despite the 0.5s delay). Weird, huh? It's enough to fix things if a 3s delay is inserted after the ip ... up. I think the bug here is that polling with mii-tool disrupts the autonegotiation. It is ok to return failure after a reset, but eventually this has to resolve itself despite the polling. I suspect that 3c59x has the same failure as well. But I haven't played with it much. -- Pete From shemminger@osdl.org Mon Nov 1 09:19:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 09:19:10 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1HJ3Pj030004 for ; Mon, 1 Nov 2004 09:19:04 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iA1HIbPE007190 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 1 Nov 2004 09:18:37 -0800 Date: Mon, 1 Nov 2004 09:20:27 -0800 From: Stephen Hemminger To: Michael Vittrup Larsen Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] tcp: efficient port randomisation Message-Id: <20041101092027.2a741e82@zqx3.pdx.osdl.net> In-Reply-To: <200411011058.23141.michael.vittrup.larsen@ericsson.com> References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200410291048.01955.michael.vittrup.larsen@ericsson.com> <20041029102828.123502e7@zqx3.pdx.osdl.net> <200411011058.23141.michael.vittrup.larsen@ericsson.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.93 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11283 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1346 Lines: 31 On Mon, 1 Nov 2004 11:58:23 +0200 Michael Vittrup Larsen wrote: > On Friday 29 October 2004 19:28, Stephen Hemminger wrote: > > Provide port randomization for incoming connections using variation of > > existing sequence number hash. Replace tcp_portalloc_lock and > > tcp_port_rover with atomic operation to allow better parallelism. > > > > This is based on > > http://www.ietf.org/internet-drafts/draft-larsen-tsvwg-port-randomisation-0 > >0.txt (with confirmation of of no IPR issues). > > I have looked through this, and have a few comments: > > * It is probably a good strategy to set 'tcp_rover_next' such that > the next search is resumed from the previous port found to be free. > (similar to the old algorithm). I don't see this in your patch, > but of course I could have missed it. It was intentional since it would require holding a lock around the search. The tradeoff is better SMP performance in the sparsely filled port space (more typical) vs. better UP performance in the case of a mostly full port space. > * connect_port_offset() does not (at least from an algorithm point > of view) need to return an u32, an u16 is sufficient. If it is truncated to u16, then compiler has to take extra effort to truncate is unnecessary given later modulo operation. > Michael Larsen From nacc@us.ibm.com Mon Nov 1 09:31:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 09:31:24 -0800 (PST) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1HVD0P030602 for ; Mon, 1 Nov 2004 09:31:20 -0800 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e3.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1HUpPJ733244; Mon, 1 Nov 2004 12:30:51 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1HUnU5222144; Mon, 1 Nov 2004 12:30:50 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1IVIEd001786; Mon, 1 Nov 2004 10:31:19 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1IVI5M001783; Mon, 1 Nov 2004 10:31:18 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 10:31:18 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: janitor@sternwelten.at, netdev@oss.sgi.com Subject: Re: [patch 05/18] net/s2io: replace schedule_timeout() with msleep() Message-ID: <20041101183118.GA1730@us.ibm.com> References: <4184C7EE.5070107@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C7EE.5070107@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11284 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 657 Lines: 20 On Sun, Oct 31, 2004 at 06:09:34AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >@@ -2846,11 +2838,10 @@ static int s2io_ethtool_idnic(struct net > > sp->id_timer.data = (unsigned long) sp; > > } > > mod_timer(&sp->id_timer, jiffies); > >- set_current_state(TASK_INTERRUPTIBLE); > > if (data) > >- schedule_timeout(data * HZ); > >+ msleep_interruptible(data * 1000); > > > clearly wants ssleep() here Even though ssleep() is in TASK_UNINTERRUPTIBLE? In cases where the existing code used TASK_INTERRUPTIBLE, but was sleeping in terms of seconds, I left it as msleep_interruptible, since ssleep_interruptible() doesn't exist. -Nish From rddunlap@osdl.org Mon Nov 1 09:33:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 09:33:09 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1HX3k2030836 for ; Mon, 1 Nov 2004 09:33:03 -0800 Received: from [172.20.1.27] (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iA1HWWPE008900 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO); Mon, 1 Nov 2004 09:32:32 -0800 Message-ID: <418670AC.7010801@osdl.org> Date: Mon, 01 Nov 2004 09:21:48 -0800 From: "Randy.Dunlap" Organization: OSDL User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jeff Garzik CC: netdev@oss.sgi.com, rl@hellgate.ch Subject: [PATCH] via-rhine: references __init code during resume References: <4179543F.1020407@osdl.org> <418390F2.7080901@pobox.com> In-Reply-To: <418390F2.7080901@pobox.com> Content-Type: multipart/mixed; boundary="------------060901020707080309020307" X-MIMEDefang-Filter: osdl$Revision: 1.93 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11285 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 1310 Lines: 44 This is a multi-part message in MIME format. --------------060901020707080309020307 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit [Does it work if the patch description is inline & the patch is attached?] Fix __init section usage: rhine_resume calls enable_mmio, so latter cannot be __devinit; Error: ./drivers/net/via-rhine.o .text refers to 0000000000000925 R_X86_64_PC32 .init.text+0xfffffffffffffffc Signed-off-by: Randy Dunlap diffstat:= drivers/net/via-rhine.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) -- ~Randy --------------060901020707080309020307 Content-Type: text/x-patch; name="via_rhine_mmio.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="via_rhine_mmio.patch" diff -Naurp ./drivers/net/via-rhine.c~via_rhine_mmio ./drivers/net/via-rhine.c --- ./drivers/net/via-rhine.c~via_rhine_mmio 2004-10-18 14:55:28.000000000 -0700 +++ ./drivers/net/via-rhine.c 2004-10-22 10:10:58.928311448 -0700 @@ -627,7 +627,7 @@ static void rhine_chip_reset(struct net_ } #ifdef USE_MMIO -static void __devinit enable_mmio(long pioaddr, u32 quirks) +static void enable_mmio(long pioaddr, u32 quirks) { int n; if (quirks & rqRhineI) { --------------060901020707080309020307-- From mdomsch@lists.us.dell.com Mon Nov 1 09:35:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 09:35:15 -0800 (PST) Received: from lists.us.dell.com (linux.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1HZ8n6031326 for ; Mon, 1 Nov 2004 09:35:09 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.10/8.12.10/Dell.IT.3.31.03) with ESMTP id iA1HYZMU012622; Mon, 1 Nov 2004 11:34:35 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.10/8.12.10/Submit) id iA1HYYIX012620; Mon, 1 Nov 2004 11:34:34 -0600 Date: Mon, 1 Nov 2004 11:34:34 -0600 From: Matt Domsch To: netdev@oss.sgi.com Cc: jamal , Herbert Xu Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101173434.GA12437@lists.us.dell.com> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101044433.GA18772@lists.us.dell.com> User-Agent: Mutt/1.4.1i X-archive-position: 11286 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 2011 Lines: 52 On Sun, Oct 31, 2004 at 10:44:33PM -0600, Matt Domsch wrote: > I think -EOVERFLOW would be appropriate return for dev->addr_len > > sizeof sa_data, yes? > > I'd prefer though, that an "obsolete" function, be marked as such > somehow (perhaps print a net_ratelimit()ed KERN_DEBUG message when > it's called telling apps to move to rtnetlink), and that the behaviour > for everything except overflow be consistent with the prior > implementation, at least until such a time that all the apps in the > distros are converted to rtnetlink. How's this look? This makes ioctl(SIOCIFHWADDR) behavior in 2.6 consistent with that of previous kernels wherever possible. It returns -EOVERFLOW if it can't represent the address, zeros the data if dev->addr_len is zero, and prints a KERN_DEBUG message telling people to fix their applications to use rtnetlink. Compiles on x86 and x86-64 cleanly. Signed-off-by: Matt Domsch -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com ===== net/core/dev.c 1.169 vs edited ===== --- 1.169/net/core/dev.c 2004-10-26 11:09:33 -05:00 +++ edited/net/core/dev.c 2004-11-01 11:20:25 -06:00 @@ -2375,8 +2375,16 @@ return dev_set_mtu(dev, ifr->ifr_mtu); case SIOCGIFHWADDR: - memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, - min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); + if (net_ratelimit()) + printk(KERN_DEBUG "Warning: %s uses obsolete ioctl(SIOCGIFHWADDR), please convert it to rtnetlink(3,7)\n", current->comm); + + if ((size_t) dev->addr_len > sizeof ifr->ifr_hwaddr.sa_data) + return -EOVERFLOW; + else if (!dev->addr_len) + memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); + else + memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, + min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); ifr->ifr_hwaddr.sa_family = dev->type; return 0; From jgarzik@pobox.com Mon Nov 1 10:03:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:03:57 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1I3iML032379 for ; Mon, 1 Nov 2004 10:03:46 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1COgWb-00077m-Rp; Mon, 01 Nov 2004 18:03:25 +0000 Message-ID: <41867A5E.4040301@pobox.com> Date: Mon, 01 Nov 2004 13:03:10 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Nishanth Aravamudan CC: janitor@sternwelten.at, netdev@oss.sgi.com Subject: Re: [patch 05/18] net/s2io: replace schedule_timeout() with msleep() References: <4184C7EE.5070107@pobox.com> <20041101183118.GA1730@us.ibm.com> In-Reply-To: <20041101183118.GA1730@us.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11287 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 747 Lines: 29 Nishanth Aravamudan wrote: > On Sun, Oct 31, 2004 at 06:09:34AM -0500, Jeff Garzik wrote: > >>janitor@sternwelten.at wrote: >> >>>@@ -2846,11 +2838,10 @@ static int s2io_ethtool_idnic(struct net >>> sp->id_timer.data = (unsigned long) sp; >>> } >>> mod_timer(&sp->id_timer, jiffies); >>>- set_current_state(TASK_INTERRUPTIBLE); >>> if (data) >>>- schedule_timeout(data * HZ); >>>+ msleep_interruptible(data * 1000); >> >> >>clearly wants ssleep() here > > > Even though ssleep() is in TASK_UNINTERRUPTIBLE? In cases where the > existing code used TASK_INTERRUPTIBLE, but was sleeping in terms of > seconds, I left it as msleep_interruptible, since ssleep_interruptible() > doesn't exist. Right: create ssleep_interruptible() :) Jeff From nacc@us.ibm.com Mon Nov 1 10:08:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:09:03 -0800 (PST) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1I8xoo000382 for ; Mon, 1 Nov 2004 10:08:59 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1I8M8m606240 for ; Mon, 1 Nov 2004 13:08:23 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1I8EBb134230 for ; Mon, 1 Nov 2004 11:08:16 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1I8D0K012010 for ; Mon, 1 Nov 2004 11:08:14 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1I8D4k011957; Mon, 1 Nov 2004 11:08:13 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1J8gDN001969; Mon, 1 Nov 2004 11:08:42 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1J8fVk001966; Mon, 1 Nov 2004 11:08:41 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 11:08:41 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: netdev@oss.sgi.com, kernel-janitors@lists.osdl.org Subject: [PATCH] net/gt96100eth: replace gt96100_delay() with msleep_interruptible() Message-ID: <20041101190841.GB1730@us.ibm.com> References: <4184C72F.8000905@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C72F.8000905@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11288 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3015 Lines: 90 On Sun, Oct 31, 2004 at 06:06:23AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >@@ -528,7 +517,7 @@ abort(struct net_device *dev, u32 abort_ > > // wait for abort to complete > > while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) { > > // snooze for 20 msec and check again > >- gt96100_delay(1); > >+ msleep_interruptible(20); > > > > if (--timedout == 0) { > > > don't change the behavior of the driver, even if it disagrees with the > comment. Ok, please find the corrected patch below. Description: Uses msleep_interruptible() instead of gt96100_delay() to guarantee the task delays as expected. Removes prototype and definition of now unused gt96100_delay() function. Corrects one comment to correspond to the code. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/gt96100eth.c 2004-10-30 15:33:30.000000000 -0700 +++ 2.6.10-rc1/drivers/net/gt96100eth.c 2004-11-01 11:05:37.000000000 -0800 @@ -59,7 +59,6 @@ // prototypes static void* dmaalloc(size_t size, dma_addr_t *dma_handle); static void dmafree(size_t size, void *vaddr); -static void gt96100_delay(int msec); static int gt96100_add_hash_entry(struct net_device *dev, unsigned char* addr); static void read_mib_counters(struct gt96100_private *gp); @@ -183,16 +182,6 @@ static void dmafree(size_t size, void *v free_pages((unsigned long)vaddr, get_order(size)); } -static void gt96100_delay(int ms) -{ - if (in_interrupt()) - return; - else { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(ms*HZ/1000); - } -} - static int parse_mac_addr(struct net_device *dev, char* macstr) { @@ -238,7 +227,7 @@ read_MII(int phy_addr, u32 reg) // wait for last operation to complete while (GT96100_READ(GT96100_ETH_SMI_REG) & smirBusy) { // snooze for 1 msec and check again - gt96100_delay(1); + msleep_interruptible(1); if (--timedout == 0) { printk(KERN_ERR "%s: busy timeout!!\n", __FUNCTION__); @@ -252,7 +241,7 @@ read_MII(int phy_addr, u32 reg) // wait for read to complete while (!((smir = GT96100_READ(GT96100_ETH_SMI_REG)) & smirReadValid)) { // snooze for 1 msec and check again - gt96100_delay(1); + msleep_interruptible(1); if (--timedout == 0) { printk(KERN_ERR "%s: timeout!!\n", __FUNCTION__); @@ -304,7 +293,7 @@ write_MII(int phy_addr, u32 reg, u16 dat // wait for last operation to complete while (GT96100_READ(GT96100_ETH_SMI_REG) & smirBusy) { // snooze for 1 msec and check again - gt96100_delay(1); + msleep_interruptible(1); if (--timedout == 0) { printk(KERN_ERR "%s: busy timeout!!\n", __FUNCTION__); @@ -527,8 +516,8 @@ abort(struct net_device *dev, u32 abort_ // wait for abort to complete while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) { - // snooze for 20 msec and check again - gt96100_delay(1); + // snooze for 1 msec and check again + msleep_interruptible(1); if (--timedout == 0) { err("%s: timeout!!\n", __FUNCTION__); From nacc@us.ibm.com Mon Nov 1 10:14:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:14:51 -0800 (PST) Received: from e4.ny.us.ibm.com (e4.ny.us.ibm.com [32.97.182.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1IEiUM000855 for ; Mon, 1 Nov 2004 10:14:47 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e4.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1IENCE396636; Mon, 1 Nov 2004 13:14:23 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1IELDC231800; Mon, 1 Nov 2004 13:14:22 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1JEosC002023; Mon, 1 Nov 2004 11:14:51 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1JEoMC002020; Mon, 1 Nov 2004 11:14:50 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 11:14:50 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: janitor@sternwelten.at, netdev@oss.sgi.com Subject: Re: [patch 05/18] net/s2io: replace schedule_timeout() with msleep() Message-ID: <20041101191450.GC1730@us.ibm.com> References: <4184C7EE.5070107@pobox.com> <20041101183118.GA1730@us.ibm.com> <41867A5E.4040301@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41867A5E.4040301@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11289 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 985 Lines: 30 On Mon, Nov 01, 2004 at 01:03:10PM -0500, Jeff Garzik wrote: > Nishanth Aravamudan wrote: > >On Sun, Oct 31, 2004 at 06:09:34AM -0500, Jeff Garzik wrote: > > > >>janitor@sternwelten.at wrote: > >> > >>>@@ -2846,11 +2838,10 @@ static int s2io_ethtool_idnic(struct net > >>> sp->id_timer.data = (unsigned long) sp; > >>> } > >>> mod_timer(&sp->id_timer, jiffies); > >>>- set_current_state(TASK_INTERRUPTIBLE); > >>> if (data) > >>>- schedule_timeout(data * HZ); > >>>+ msleep_interruptible(data * 1000); > >> > >> > >>clearly wants ssleep() here > > > > > >Even though ssleep() is in TASK_UNINTERRUPTIBLE? In cases where the > >existing code used TASK_INTERRUPTIBLE, but was sleeping in terms of > >seconds, I left it as msleep_interruptible, since ssleep_interruptible() > >doesn't exist. > > Right: create ssleep_interruptible() :) Ok, will do :) I wasn't sure by your e-mail whether you meant to use ssleep() or create ssleep_interruptible(). Patch will follow shortly. -Nish From nacc@us.ibm.com Mon Nov 1 10:22:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:22:33 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1IMSgX001381 for ; Mon, 1 Nov 2004 10:22:28 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1IM6J8342880 for ; Mon, 1 Nov 2004 13:22:06 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1IM5PM182682 for ; Mon, 1 Nov 2004 11:22:05 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1ILhIa017360 for ; Mon, 1 Nov 2004 11:21:43 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1ILggo017305; Mon, 1 Nov 2004 11:21:43 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1JMBrf002099; Mon, 1 Nov 2004 11:22:11 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1JMA98002096; Mon, 1 Nov 2004 11:22:10 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 11:22:10 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] linux/ibmtr.h: add constants for appropriate delays Message-ID: <20041101192210.GD1730@us.ibm.com> References: <4184C66B.8040501@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C66B.8040501@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11290 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 2280 Lines: 63 On Sun, Oct 31, 2004 at 06:03:07AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >Any comments would be appreciated. > > > >Description: Use msleep() / msleep_interruptible() [as appropriate] > >instead of schedule_timeout() to guarantee the task delays as expected. > > > >Signed-off-by: Nishanth Aravamudan > >Signed-off-by: Maximilian Attems > > > >--- > > > > linux-2.6.10-rc1-max/drivers/net/tokenring/ibmtr.c | 11 +++++------ > > 1 files changed, 5 insertions(+), 6 deletions(-) > >- schedule_timeout(TR_RST_TIME); /* wait 50ms */ > >+ msleep(jiffies_to_msecs(TR_RST_TIME)); /* wait 50ms */ > >- current->state=TASK_UNINTERRUPTIBLE; > >- schedule_timeout(TR_RST_TIME); /* wait 50ms */ > >+ msleep(jiffies_to_msecs(TR_RST_TIME)); /* wait 50ms */ > >- current->state=TASK_INTERRUPTIBLE; > >- i=schedule_timeout(TR_RETRY_INTERVAL); /* wait 30 seconds */ > >- if(i!=0) break; /*prob. a signal, like the i>24*HZ case > >above */ > >+ if(msleep_interruptible(jiffies_to_msecs(TR_RETRY_INTERVAL))) > >+ break; /*prob. a signal, like the i>24*HZ case above > It makes more sense to convert the constants to msecs in the source > code, instead of converting them at runtime. This required changing both the .h and .c files, the first of which is attached below. Description: Adds constant definitions for timeout variables in terms of milliseconds to avoid run-time constant conversion. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/include/linux/ibmtr.h 2004-10-30 15:34:03.000000000 -0700 +++ 2.6.10-rc1/include/linux/ibmtr.h 2004-11-01 11:13:41.000000000 -0800 @@ -6,8 +6,10 @@ /* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */ -#define TR_RETRY_INTERVAL (30*HZ) /* 500 on PC = 5 s */ -#define TR_RST_TIME (HZ/20) /* 5 on PC = 50 ms */ +#define TR_RETRY_INTERVAL (30*HZ) /* 500 on PC = 5 s (in jiffies) */ +#define TR_RETRY_INTERVAL (30000) /* 500 on PC = 5 s */ +#define TR_RST_TIME (HZ/20) /* 5 on PC = 50 ms (in jiffies) */ +#define TR_RST_TIME_MS (50) /* 5 on PC = 50 ms */ #define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */ #define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */ From nacc@us.ibm.com Mon Nov 1 10:27:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:27:37 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1IRXX8001796 for ; Mon, 1 Nov 2004 10:27:33 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1IRBJ8466992 for ; Mon, 1 Nov 2004 13:27:11 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1IRBBb121298 for ; Mon, 1 Nov 2004 11:27:11 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1IRA7I012089 for ; Mon, 1 Nov 2004 11:27:11 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1IRAHj012053; Mon, 1 Nov 2004 11:27:10 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1JRdlU002121; Mon, 1 Nov 2004 11:27:39 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1JRc61002118; Mon, 1 Nov 2004 11:27:38 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 11:27:38 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] net/ibmtr: replace schedule_timeout() with msleep()/msleep_interruptible() Message-ID: <20041101192738.GE1730@us.ibm.com> References: <4184C66B.8040501@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C66B.8040501@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11291 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3086 Lines: 88 On Sun, Oct 31, 2004 at 06:03:07AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >Any comments would be appreciated. > > > >Description: Use msleep() / msleep_interruptible() [as appropriate] > >instead of schedule_timeout() to guarantee the task delays as expected. > > > >Signed-off-by: Nishanth Aravamudan > >Signed-off-by: Maximilian Attems > > > >--- > > > > linux-2.6.10-rc1-max/drivers/net/tokenring/ibmtr.c | 11 +++++------ > > 1 files changed, 5 insertions(+), 6 deletions(-) > > > >- schedule_timeout(TR_RST_TIME); /* wait 50ms */ > >+ msleep(jiffies_to_msecs(TR_RST_TIME)); /* wait 50ms */ > >- current->state=TASK_UNINTERRUPTIBLE; > >- schedule_timeout(TR_RST_TIME); /* wait 50ms */ > >+ msleep(jiffies_to_msecs(TR_RST_TIME)); /* wait 50ms */ > >- current->state=TASK_INTERRUPTIBLE; > >- i=schedule_timeout(TR_RETRY_INTERVAL); /* wait 30 seconds */ > >- if(i!=0) break; /*prob. a signal, like the i>24*HZ case > >above */ > >+ if(msleep_interruptible(jiffies_to_msecs(TR_RETRY_INTERVAL))) > >+ break; /*prob. a signal, like the i>24*HZ case above > It makes more sense to convert the constants to msecs in the source > code, instead of converting them at runtime. Here is the patch to ibmtr.c which completes these changes... Description: Uses msleep()/msleep_interruptible() [as appropriate] to guarantee the task delays as expected. This patch depends on the corresponding addition of the millisecond-unit constants to ibmtr.h. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/tokenring/ibmtr.c 2004-10-30 15:33:28.000000000 -0700 +++ 2.6.10-rc1/drivers/net/tokenring/ibmtr.c 2004-11-01 11:18:10.000000000 -0800 @@ -130,6 +130,7 @@ in the event that chatty debug messages #include #include #include +#include #include @@ -317,7 +318,7 @@ static void ibmtr_cleanup_card(struct ne if (dev->base_addr) { outb(0,dev->base_addr+ADAPTRESET); - schedule_timeout(TR_RST_TIME); /* wait 50ms */ + msleep(TR_RST_TIME_MS); outb(0,dev->base_addr+ADAPTRESETREL); } @@ -858,8 +859,7 @@ static int tok_init_card(struct net_devi writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); outb(0, PIOaddr + ADAPTRESET); - current->state=TASK_UNINTERRUPTIBLE; - schedule_timeout(TR_RST_TIME); /* wait 50ms */ + msleep(TR_RST_TIME_MS); outb(0, PIOaddr + ADAPTRESETREL); #ifdef ENABLE_PAGING @@ -912,9 +912,8 @@ static int tok_open(struct net_device *d DPRINTK("Adapter is up and running\n"); return 0; } - current->state=TASK_INTERRUPTIBLE; - i=schedule_timeout(TR_RETRY_INTERVAL); /* wait 30 seconds */ - if(i!=0) break; /*prob. a signal, like the i>24*HZ case above */ + if(msleep_interruptible(TR_RETRY_INTERVAL_MS)) break; + /*prob. a signal, like the i>24*HZ case above */ } outb(0, dev->base_addr + ADAPTRESET);/* kill pending interrupts*/ DPRINTK("TERMINATED via signal\n"); /*BMS useful */ From kaber@trash.net Mon Nov 1 10:41:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:41:27 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1IfKcn002523 for ; Mon, 1 Nov 2004 10:41:21 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1COh6p-0008Tv-VX; Mon, 01 Nov 2004 19:40:52 +0100 Message-ID: <41868333.7050602@trash.net> Date: Mon, 01 Nov 2004 19:40:51 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Christoph Hellwig CC: davem@redhat.com, netdev@oss.sgi.com Subject: Re: [PATCH] remove dead skb_iter* functions References: <20041101115653.GA7714@lst.de> In-Reply-To: <20041101115653.GA7714@lst.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11292 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 4710 Lines: 173 Harald is working on code for pattern-matching inside non-linear skbs for conntrack helpers. This code needs the skb_iter* functions. Regards Patrick Christoph Hellwig wrote: >Signed-off-by: Christoph Hellwig > > > >--- 1.56/include/linux/skbuff.h 2004-10-05 23:51:01 +02:00 >+++ edited/include/linux/skbuff.h 2004-10-30 21:04:33 +02:00 >@@ -592,7 +592,6 @@ > /* > * Insert a packet on a list. > */ >-extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk); > static inline void __skb_insert(struct sk_buff *newsk, > struct sk_buff *prev, struct sk_buff *next, > struct sk_buff_head *list) >@@ -1120,22 +1119,6 @@ > > extern void skb_init(void); > extern void skb_add_mtu(int mtu); >- >-struct skb_iter { >- /* Iteration functions set these */ >- unsigned char *data; >- unsigned int len; >- >- /* Private to iteration */ >- unsigned int nextfrag; >- struct sk_buff *fraglist; >-}; >- >-/* Keep iterating until skb_iter_next returns false. */ >-extern void skb_iter_first(const struct sk_buff *skb, struct skb_iter *i); >-extern int skb_iter_next(const struct sk_buff *skb, struct skb_iter *i); >-/* Call this if aborting loop before !skb_iter_next */ >-extern void skb_iter_abort(const struct sk_buff *skb, struct skb_iter *i); > > #ifdef CONFIG_NETFILTER > static inline void nf_conntrack_put(struct nf_conntrack *nfct) >--- 1.39/net/core/skbuff.c 2004-10-20 06:56:24 +02:00 >+++ edited/net/core/skbuff.c 2004-10-30 21:04:33 +02:00 >@@ -929,72 +929,7 @@ > return -EFAULT; > } > >-/* Keep iterating until skb_iter_next returns false. */ >-void skb_iter_first(const struct sk_buff *skb, struct skb_iter *i) >-{ >- i->len = skb_headlen(skb); >- i->data = (unsigned char *)skb->data; >- i->nextfrag = 0; >- i->fraglist = NULL; >-} >- >-int skb_iter_next(const struct sk_buff *skb, struct skb_iter *i) >-{ >- /* Unmap previous, if not head fragment. */ >- if (i->nextfrag) >- kunmap_skb_frag(i->data); >- >- if (i->fraglist) { >- fraglist: >- /* We're iterating through fraglist. */ >- if (i->nextfrag < skb_shinfo(i->fraglist)->nr_frags) { >- i->data = kmap_skb_frag(&skb_shinfo(i->fraglist) >- ->frags[i->nextfrag]); >- i->len = skb_shinfo(i->fraglist)->frags[i->nextfrag] >- .size; >- i->nextfrag++; >- return 1; >- } >- /* Fragments with fragments? Too hard! */ >- BUG_ON(skb_shinfo(i->fraglist)->frag_list); >- i->fraglist = i->fraglist->next; >- if (!i->fraglist) >- goto end; >- >- i->len = skb_headlen(i->fraglist); >- i->data = i->fraglist->data; >- i->nextfrag = 0; >- return 1; >- } >- >- if (i->nextfrag < skb_shinfo(skb)->nr_frags) { >- i->data = kmap_skb_frag(&skb_shinfo(skb)->frags[i->nextfrag]); >- i->len = skb_shinfo(skb)->frags[i->nextfrag].size; >- i->nextfrag++; >- return 1; >- } >- >- i->fraglist = skb_shinfo(skb)->frag_list; >- if (i->fraglist) >- goto fraglist; >- >-end: >- /* Bug trap for callers */ >- i->data = NULL; >- return 0; >-} >- >-void skb_iter_abort(const struct sk_buff *skb, struct skb_iter *i) >-{ >- /* Unmap previous, if not head fragment. */ >- if (i->data && i->nextfrag) >- kunmap_skb_frag(i->data); >- /* Bug trap for callers */ >- i->data = NULL; >-} >- > /* Checksum skb data. */ >- > unsigned int skb_checksum(const struct sk_buff *skb, int offset, > int len, unsigned int csum) > { >@@ -1318,25 +1253,6 @@ > } > > >-/** >- * skb_insert - insert a buffer >- * @old: buffer to insert before >- * @newsk: buffer to insert >- * >- * Place a packet before a given packet in a list. The list locks are taken >- * and this function is atomic with respect to other list locked calls >- * A buffer cannot be placed on two lists at the same time. >- */ >- >-void skb_insert(struct sk_buff *old, struct sk_buff *newsk) >-{ >- unsigned long flags; >- >- spin_lock_irqsave(&old->list->lock, flags); >- __skb_insert(newsk, old->prev, old, old->list); >- spin_unlock_irqrestore(&old->list->lock, flags); >-} >- > #if 0 > /* > * Tune the memory allocator for a new MTU size. >@@ -1444,7 +1360,6 @@ > EXPORT_SYMBOL(pskb_expand_head); > EXPORT_SYMBOL(skb_checksum); > EXPORT_SYMBOL(skb_clone); >-EXPORT_SYMBOL(skb_clone_fraglist); > EXPORT_SYMBOL(skb_copy); > EXPORT_SYMBOL(skb_copy_and_csum_bits); > EXPORT_SYMBOL(skb_copy_and_csum_dev); >@@ -1456,13 +1371,8 @@ > EXPORT_SYMBOL(skb_under_panic); > EXPORT_SYMBOL(skb_dequeue); > EXPORT_SYMBOL(skb_dequeue_tail); >-EXPORT_SYMBOL(skb_insert); > EXPORT_SYMBOL(skb_queue_purge); > EXPORT_SYMBOL(skb_queue_head); > EXPORT_SYMBOL(skb_queue_tail); > EXPORT_SYMBOL(skb_unlink); > EXPORT_SYMBOL(skb_append); >-EXPORT_SYMBOL(skb_split); >-EXPORT_SYMBOL(skb_iter_first); >-EXPORT_SYMBOL(skb_iter_next); >-EXPORT_SYMBOL(skb_iter_abort); > > > From greearb@candelatech.com Mon Nov 1 10:59:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 10:59:28 -0800 (PST) Received: from www.lanforge.com (ns1.lanforge.com [66.165.47.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1IxL4l003308 for ; Mon, 1 Nov 2004 10:59:22 -0800 Received: from [4.35.49.74] (evrtwa1-ar2-4-35-049-074.evrtwa1.dsl-verizon.net [4.35.49.74]) (authenticated bits=0) by www.lanforge.com (8.12.8/8.12.8) with ESMTP id iA1J6vLH013685; Mon, 1 Nov 2004 11:06:57 -0800 Message-ID: <4186876E.5040204@candelatech.com> Date: Mon, 01 Nov 2004 10:58:54 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040913 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Tommy Christensen CC: "'netdev@oss.sgi.com'" , "Linux 802.1Q VLAN" , Francois Romieu , "David S. Miller" Subject: Re: [PATCH] 802.1Q VLAN References: <41797696.9070905@candelatech.com> <20041022214611.GA4948@electric-eye.fr.zoreil.com> <41798506.1030909@candelatech.com> <417D675F.3000909@candelatech.com> <4181838B.6040002@tpack.net> <41818D99.9020300@candelatech.com> <1099038566.1813.99.camel@cyan.cph.tpack.net> <418281C1.9080707@candelatech.com> <4182D44E.7070507@tpack.net> <4182DABE.7000502@candelatech.com> <4182E0C6.6090205@tpack.net> In-Reply-To: <4182E0C6.6090205@tpack.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11293 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 2733 Lines: 90 How does this look? I think it should fix the problem with having a new skb created in the __vlan_put_tag() method. int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct net_device_stats *stats = vlan_dev_get_stats(dev); struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data); /* Please note, dev_queue_xmit consumes the pkt regardless of the * return value. So, will copy the skb first and free if successful. */ struct sk_buff* skb2 = skb_get(skb); /* Handle non-VLAN frames if they are sent to us, for example by DHCP. * * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... */ if (veth->h_vlan_proto != __constant_htons(ETH_P_8021Q)) { int orig_headroom = skb_headroom(skb); unsigned short veth_TCI; /* This is not a VLAN frame...but we can fix that! */ VLAN_DEV_INFO(dev)->cnt_encap_on_xmit++; #ifdef VLAN_DEBUG printk(VLAN_DBG "%s: proto to encap: 0x%hx (hbo)\n", __FUNCTION__, htons(veth->h_vlan_proto)); #endif /* Construct the second two bytes. This field looks something * like: * usr_priority: 3 bits (high bits) * CFI 1 bit * VLAN ID 12 bits (low bits) */ veth_TCI = VLAN_DEV_INFO(dev)->vlan_id; veth_TCI |= vlan_dev_get_egress_qos_mask(dev, skb); skb = __vlan_put_tag(skb, veth_TCI); if (!skb) { stats->tx_dropped++; /* Free the extra copy, assuming this is a non-recoverable * issue and we don't want calling code to retry. */ kfree_skb(skb2); return 0; } if (orig_headroom < VLAN_HLEN) { VLAN_DEV_INFO(dev)->cnt_inc_headroom_on_tx++; } } #ifdef VLAN_DEBUG printk(VLAN_DBG "%s: about to send skb: %p to dev: %s\n", __FUNCTION__, skb, skb->dev->name); printk(VLAN_DBG " %2hx.%2hx.%2hx.%2xh.%2hx.%2hx %2hx.%2hx.%2hx.%2hx.%2hx.%2hx %4hx %4hx %4hx\n", veth->h_dest[0], veth->h_dest[1], veth->h_dest[2], veth->h_dest[3], veth->h_dest[4], veth->h_dest[5], veth->h_source[0], veth->h_source[1], veth->h_source[2], veth->h_source[3], veth->h_source[4], veth->h_source[5], veth->h_vlan_proto, veth->h_vlan_TCI, veth->h_vlan_encapsulated_proto); #endif skb->dev = VLAN_DEV_INFO(dev)->real_dev; { int rv = dev_queue_xmit(skb); if (rv == 0) { /* Was success, need to free the skb reference since * we bumped up the user count above. If there was an * error instead, then the skb2 will not be freed, and so * the calling code will be able to re-send it. */ stats->tx_packets++; /* for statics only */ stats->tx_bytes += skb2->len; kfree_skb(skb2); } return rv; } } -- Ben Greear Candela Technologies Inc http://www.candelatech.com From nacc@us.ibm.com Mon Nov 1 11:07:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 11:07:52 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1J7jGY003882 for ; Mon, 1 Nov 2004 11:07:48 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e5.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1J7NpA210034; Mon, 1 Nov 2004 14:07:23 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1J7MDC266204; Mon, 1 Nov 2004 14:07:22 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1K7oMv003246; Mon, 1 Nov 2004 12:07:50 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1K7nCd003243; Mon, 1 Nov 2004 12:07:49 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 12:07:49 -0800 From: Nishanth Aravamudan To: janitor@sternwelten.at Cc: netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: [PATCH] Add ssleep_interruptible() Message-ID: <20041101200749.GF1730@us.ibm.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11294 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 886 Lines: 21 Description: Adds ssleep_interruptible() to allow longer delays to occur in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with msleep_interruptible(), ssleep_interruptible() returns the remaining time left in the delay in terms of seconds. This required dividing the return value of msleep_interruptible() by 1000, thus a cast to (unsigned long) to prevent any floating point issues. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 15:34:03.000000000 -0700 +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s msleep(seconds * 1000); } +static inline unsigned long ssleep_interruptible(unsigned int seconds) +{ + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); +} + #endif /* defined(_LINUX_DELAY_H) */ From latten@austin.ibm.com Mon Nov 1 11:12:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 11:12:57 -0800 (PST) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1JCpYa004307 for ; Mon, 1 Nov 2004 11:12:51 -0800 Received: from westrelay05.boulder.ibm.com (westrelay05.boulder.ibm.com [9.17.193.33]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1JCS1p711836 for ; Mon, 1 Nov 2004 14:12:28 -0500 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by westrelay05.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1JCSwp089792 for ; Mon, 1 Nov 2004 12:12:28 -0700 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JCRQZ013468 for ; Mon, 1 Nov 2004 12:12:27 -0700 Received: from austin.ibm.com (netmail2.austin.ibm.com [9.41.248.176]) by d03av03.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JCR0E013460 for ; Mon, 1 Nov 2004 12:12:27 -0700 Received: from faith.austin.ibm.com (faith.austin.ibm.com [9.41.94.16]) by austin.ibm.com (8.12.10/8.12.10) with ESMTP id iA1JCOqI038910 for ; Mon, 1 Nov 2004 13:12:25 -0600 Received: from faith.austin.ibm.com (localhost.localdomain [127.0.0.1]) by faith.austin.ibm.com (8.12.10/8.12.8) with ESMTP id iA34Xn2A017837 for ; Tue, 2 Nov 2004 22:33:50 -0600 Received: (from jml@localhost) by faith.austin.ibm.com (8.12.10/8.12.10/Submit) id iA34Xnou017836 for netdev@oss.sgi.com; Tue, 2 Nov 2004 22:33:49 -0600 Date: Tue, 2 Nov 2004 22:33:49 -0600 From: Joy Latten Message-Id: <200411030433.iA34Xnou017836@faith.austin.ibm.com> To: netdev@oss.sgi.com Subject: IPSecv6 tunnel mode beahviour X-archive-position: 11295 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: latten@austin.ibm.com Precedence: bulk X-list: netdev Content-Length: 1717 Lines: 55 I am using 2.6.9 + 2.6.10-rc1 + 2.6.10-rc1-bk5 kernel. I also recall seeing this before 2.6.9... I am running IPSecv6 in tunnelmode and am noticing what I think is odd behaviour. First, I have a simple config where packets go from one subnet to another through my ipsec tunnel. I noticed TCPv6 packets are being fragmented at the tunnel. I did not see this using similar configuration with ipv4. Although the packets are received ok, sniffer output looks odd to me, it appears Fragment header was not removed at tunnel endpoint because I still see it after packet was forwarded on subnet to receiving machine. Sniffer on receiving machine's interface shows... Frame 15... Ethernet II... Internet Protocol Version 6 Fragmentation Header Next Header TCP Offset: 0 More fragments: No Identification: 0x00000000 Transmission Protocol.. I see odd behaviour in ICMPv6 too if I send packet larger than mtu of sender. Packet is fragmented twice, once at sender and then again at tunnel entry point. My ping works fine, but, what is odd, is that again Fragment Header is not removed, such that after packet is forwarded onto receiving subnet and reaches receiving machine, there are 2 fragment headers. sniffer output on receiver... Frame 1... Ethernet II... Internet Protocol Version 6 Fragment Header Next header: IPv6 fragment(0x2c) Offset: 0 More fragments: No Identification: 0x00000000 Fragment Header Next header: ICMPv6 (0x3a) Offset: 0 More fragments: Yes Identification: 0x1300000 Internet Control Message Protocol v6 What is the correct behaviour? Who should be removing Fragment Header... tunnel endpoint... or should it even be there in TCPv6 case? Joy Latten From nacc@us.ibm.com Mon Nov 1 11:20:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 11:20:56 -0800 (PST) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1JKooq004820 for ; Mon, 1 Nov 2004 11:20:51 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e2.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1JKKBF116010; Mon, 1 Nov 2004 14:20:20 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1JKJDC258730; Mon, 1 Nov 2004 14:20:20 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1KKmLH003307; Mon, 1 Nov 2004 12:20:48 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1KKlEG003304; Mon, 1 Nov 2004 12:20:47 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 12:20:47 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] net/s2io: replace schedule_timeout() with msleep()/ssleep_interruptible() Message-ID: <20041101202047.GG1730@us.ibm.com> References: <4184C7EE.5070107@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C7EE.5070107@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11296 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 5472 Lines: 193 On Sun, Oct 31, 2004 at 06:09:34AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >@@ -2846,11 +2838,10 @@ static int s2io_ethtool_idnic(struct net > > sp->id_timer.data = (unsigned long) sp; > > } > > mod_timer(&sp->id_timer, jiffies); > >- set_current_state(TASK_INTERRUPTIBLE); > > if (data) > >- schedule_timeout(data * HZ); > >+ msleep_interruptible(data * 1000); > > > clearly wants ssleep() here Here is this patch. Depends, of course, on the patch sent just now to lkml/kj which adds ssleep_interruptible to linux/delay.h. Description: Uses msleep()/msleep_interruptible()/ssleep_interruptible() [as appropriate] to guarantee the task delays as expected. I decided to leave the MAX_SCHEDULE_TIMEOUT as is, since the overhead of converting to seconds/msecs and then back again within the corresponding sleep() function seemed unnecessary. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/s2io.c 2004-10-30 15:33:29.000000000 -0700 +++ 2.6.10-rc1/drivers/net/s2io.c 2004-11-01 12:19:22.000000000 -0800 @@ -555,8 +555,7 @@ static int initNic(struct s2io_nic *nic) val64 = 0; writeq(val64, &bar0->sw_reset); val64 = readq(&bar0->sw_reset); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 2); + msleep(500); /* Enable Receiving broadcasts */ val64 = readq(&bar0->mac_cfg); @@ -803,8 +802,7 @@ static int initNic(struct s2io_nic *nic) dev->name); return -1; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); time++; } @@ -838,8 +836,7 @@ static int initNic(struct s2io_nic *nic) return -1; } time++; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); } /* Initializing proper values as Pause threshold into all @@ -1182,8 +1179,7 @@ static int startNic(struct s2io_nic *nic writeq(val64, &bar0->mc_rldram_mrs); val64 = readq(&bar0->mc_rldram_mrs); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); /* Delay by around 100 ms. */ + msleep(100); /* Delay by around 100 ms. */ /* Enabling ECC Protection. */ val64 = readq(&bar0->adapter_control); @@ -1891,8 +1887,7 @@ int waitForCmdComplete(nic_t * sp) ret = SUCCESS; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); if (cnt++ > 10) break; } @@ -1931,15 +1926,13 @@ void s2io_reset(nic_t * sp) * As of now I'am just giving a 250ms delay and hoping that the * PCI write to sw_reset register is done by this time. */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 4); + msleep(250); /* Restore the PCI state saved during initializarion. */ pci_restore_state(sp->pdev); s2io_init_pci(sp); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 4); + msleep(250); /* SXE-002: Configure link and activity LED to turn it off */ subid = sp->pdev->subsystem_device; @@ -2157,8 +2150,7 @@ int s2io_close(struct net_device *dev) /* If the device tasklet is running, wait till its done before killing it */ while (atomic_read(&(sp->tasklet_status))) { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); + msleep(100); } tasklet_kill(&sp->task); @@ -2169,8 +2161,7 @@ int s2io_close(struct net_device *dev) break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); cnt++; if (cnt == 10) { DBG_PRINT(ERR_DBG, @@ -2846,11 +2837,12 @@ static int s2io_ethtool_idnic(struct net sp->id_timer.data = (unsigned long) sp; } mod_timer(&sp->id_timer, jiffies); - set_current_state(TASK_INTERRUPTIBLE); - if (data) - schedule_timeout(data * HZ); - else + if (data) { + ssleep_interruptible(data); + } else { + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(MAX_SCHEDULE_TIMEOUT); + } del_timer_sync(&sp->id_timer); return 0; @@ -2943,8 +2935,7 @@ static u32 readEeprom(nic_t * sp, int of data = I2C_CONTROL_GET_DATA(val64); break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); exit_cnt++; } @@ -2983,8 +2974,7 @@ static int writeEeprom(nic_t * sp, int o ret = 0; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); + msleep(50); exit_cnt++; } @@ -3256,8 +3246,7 @@ static int s2io_bistTest(nic_t * sp, uin ret = 0; break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); + msleep(100); cnt++; } @@ -3356,8 +3345,7 @@ static int s2io_rldramTest(nic_t * sp, u val64 = readq(&bar0->mc_rldram_test_ctrl); if (val64 & MC_RLDRAM_TEST_DONE) break; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 5); + msleep(200); } if (cnt == 5) @@ -3373,8 +3361,7 @@ static int s2io_rldramTest(nic_t * sp, u val64 = readq(&bar0->mc_rldram_test_ctrl); if (val64 & MC_RLDRAM_TEST_DONE) break; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 2); + msleep(500); } if (cnt == 5) @@ -3711,8 +3698,7 @@ static void s2io_set_link(unsigned long /* Allow a small delay for the NICs self initiated * cleanup to complete. */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); + msleep(100); val64 = readq(&bar0->adapter_status); if (verify_xena_quiescence(val64, nic->device_enabled_once)) { From nacc@us.ibm.com Mon Nov 1 11:24:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 11:24:47 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1JOfbo005227 for ; Mon, 1 Nov 2004 11:24:41 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1JOJLv211376 for ; Mon, 1 Nov 2004 14:24:19 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1JOIPM170784 for ; Mon, 1 Nov 2004 12:24:19 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JOHo8014557 for ; Mon, 1 Nov 2004 12:24:18 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JOHHm014485; Mon, 1 Nov 2004 12:24:17 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1KOjdF003347; Mon, 1 Nov 2004 12:24:46 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1KOjkt003344; Mon, 1 Nov 2004 12:24:45 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 12:24:45 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] net/sb1000: replace nicedelay() with ssleep_interruptible() Message-ID: <20041101202445.GH1730@us.ibm.com> References: <4184C6EB.1000700@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C6EB.1000700@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11297 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3040 Lines: 79 On Sun, Oct 31, 2004 at 06:05:15AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >Any comments would be appreciated. > > > >Description: Use msleep_interruptible() instead of nicedelay() > >to guarantee the task delays as expected. Remove the prototype and > >definition of nicedelay(). This is a very weird function, because it is > >called to sleep in terms of usecs, but always sleeps for 1 second, > >completely ignoring the parameter. I have gone ahead and followed suit, > >just sleeping for a second in all cases, but maybe someone with the > >hardware could tell me if perhaps the paramter *should* matter. > >Also remove a random "^L" character. > > use ssleep() here too Done, please fine patch below: Description: Use ssleep_interruptible() instead of nicedelay() to guarantee the task delays as expected. Remove the prototype and definition of nicedelay(). This is a very weird function, because it is called to sleep in terms of usecs, but always sleeps for 1 second, completely ignoring the parameter. I have gone ahead and followed suit, just sleeping for a second in all cases, but maybe someone with the hardware could tell me if perhaps the paramter *should* matter. escription. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/sb1000.c 2004-10-30 15:33:28.000000000 -0700 +++ 2.6.10-rc1/drivers/net/sb1000.c 2004-11-01 12:22:26.000000000 -0800 @@ -90,7 +90,6 @@ static int sb1000_close(struct net_devic /* SB1000 hardware routines to be used during open/configuration phases */ -static inline void nicedelay(unsigned long usecs); static inline int card_wait_for_busy_clear(const int ioaddr[], const char* name); static inline int card_wait_for_ready(const int ioaddr[], const char* name, @@ -254,13 +253,6 @@ static struct pnp_driver sb1000_driver = const int TimeOutJiffies = (875 * HZ) / 100; -static inline void nicedelay(unsigned long usecs) -{ - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(HZ); - return; -} - /* Card Wait For Busy Clear (cannot be used during an interrupt) */ static inline int card_wait_for_busy_clear(const int ioaddr[], const char* name) @@ -475,7 +467,7 @@ sb1000_reset(const int ioaddr[], const c udelay(1000); outb(0x0, port); inb(port); - nicedelay(60000); + ssleep_interruptible(1); outb(0x4, port); inb(port); udelay(1000); @@ -537,7 +529,7 @@ sb1000_activate(const int ioaddr[], cons const unsigned char Command0[6] = {0x80, 0x11, 0x00, 0x00, 0x00, 0x00}; const unsigned char Command1[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00}; - nicedelay(50000); + ssleep_interruptible(1); if ((status = card_send_command(ioaddr, name, Command0, st))) return status; if ((status = card_send_command(ioaddr, name, Command1, st))) @@ -944,7 +936,7 @@ sb1000_open(struct net_device *dev) /* initialize sb1000 */ if ((status = sb1000_reset(ioaddr, name))) return status; - nicedelay(200000); + ssleep_interruptible(1); if ((status = sb1000_check_CRC(ioaddr, name))) return status; From nacc@us.ibm.com Mon Nov 1 11:49:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 11:49:25 -0800 (PST) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1JnJan006303 for ; Mon, 1 Nov 2004 11:49:19 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1Jmv1p487020 for ; Mon, 1 Nov 2004 14:48:57 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1JmvPM183000 for ; Mon, 1 Nov 2004 12:48:57 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JmZJV007678 for ; Mon, 1 Nov 2004 12:48:36 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1JmZ42007608; Mon, 1 Nov 2004 12:48:35 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1JmYkg003965; Mon, 1 Nov 2004 11:48:34 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1JmXHA003962; Mon, 1 Nov 2004 11:48:33 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 11:48:33 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com, acme@conectiva.com.br Subject: [PATCH] net/cycx_drv: replace delay_cycx() with ssleep_interruptible() Message-ID: <20041101194833.GA3391@us.ibm.com> References: <4184C6A7.7060400@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C6A7.7060400@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11298 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 2638 Lines: 97 On Sun, Oct 31, 2004 at 06:04:07AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >-/* Delay */ > >-static void delay_cycx(int sec) > >-{ > >- set_current_state(TASK_INTERRUPTIBLE); > >- schedule_timeout(sec * HZ); > >-} > > > this _clearly_ wants an ssleep() derivative, not msleep() Fixed, see patch below. Description: Use ssleep_interruptible() instead of delay_cycx() to guarantee the task delays as expected. Remove the prototype and definition of delay_cycx(). Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/wan/cycx_drv.c 2004-10-30 15:33:28.000000000 -0700 +++ 2.6.10-rc1/drivers/net/wan/cycx_drv.c 2004-11-01 11:46:08.000000000 -0800 @@ -74,7 +74,6 @@ static int reset_cyc2x(void __iomem *add static int detect_cyc2x(void __iomem *addr); /* Miscellaneous functions */ -static void delay_cycx(int sec); static int get_option_index(long *optlist, long optval); static u16 checksum(u8 *buf, u32 len); @@ -259,7 +258,7 @@ static int memory_exists(void __iomem *a if (readw(addr + 0x10) == TEST_PATTERN) return 1; - delay_cycx(1); + ssleep_interruptible(1); } return 0; @@ -316,7 +315,7 @@ static void cycx_reset_boot(void __iomem /* 80186 was in hold, go */ writeb(0, addr + START_CPU); - delay_cycx(1); + ssleep_interruptible(1); } /* Load data.bin file through boot (reset) interface. */ @@ -462,13 +461,13 @@ static int load_cyc2x(struct cycx_hw *hw cycx_reset_boot(hw->dpmbase, reset_image, img_hdr->reset_size); /* reset is waiting for boot */ writew(GEN_POWER_ON, pt_cycld); - delay_cycx(1); + ssleep_interruptible(1); for (j = 0 ; j < 3 ; j++) if (!readw(pt_cycld)) goto reset_loaded; else - delay_cycx(1); + ssleep_interruptible(1); } printk(KERN_ERR "%s: reset not started.\n", modname); @@ -495,7 +494,7 @@ reset_loaded: /* Arthur Ganzert's tip: wait a while after the firmware loading... seg abr 26 17:17:12 EST 1999 - acme */ - delay_cycx(7); + ssleep_interruptible(7); printk(KERN_INFO "%s: firmware loaded!\n", modname); /* enable interrupts */ @@ -547,20 +546,13 @@ static int get_option_index(long *optlis static int reset_cyc2x(void __iomem *addr) { writeb(0, addr + RST_ENABLE); - delay_cycx(2); + ssleep_interruptible(2); writeb(0, addr + RST_DISABLE); - delay_cycx(2); + ssleep_interruptible(2); return memory_exists(addr); } -/* Delay */ -static void delay_cycx(int sec) -{ - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(sec * HZ); -} - /* Calculate 16-bit CRC using CCITT polynomial. */ static u16 checksum(u8 *buf, u32 len) { From jmorris@redhat.com Mon Nov 1 12:03:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 12:03:26 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1K3LFS007020 for ; Mon, 1 Nov 2004 12:03:22 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iA1K32Rb020509; Mon, 1 Nov 2004 15:03:02 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iA1K31r02302; Mon, 1 Nov 2004 15:03:01 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iA1K30FF026679; Mon, 1 Nov 2004 15:03:00 -0500 Date: Mon, 1 Nov 2004 15:03:01 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Patrick McHardy cc: Christoph Hellwig , , Subject: Re: [PATCH] remove dead skb_iter* functions In-Reply-To: <41868333.7050602@trash.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11299 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev Content-Length: 309 Lines: 15 On Mon, 1 Nov 2004, Patrick McHardy wrote: > Harald is working on code for pattern-matching inside > non-linear skbs for conntrack helpers. This code needs > the skb_iter* functions. Perhaps put it back when the pattern matching code is submitted upstream. - James -- James Morris From herbert@gondor.apana.org.au Mon Nov 1 12:28:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 12:28:38 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1KST74011225 for ; Mon, 1 Nov 2004 12:28:30 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1COimZ-0005lp-00; Tue, 02 Nov 2004 07:28:03 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1COimQ-00061s-00; Tue, 02 Nov 2004 07:27:54 +1100 Date: Tue, 2 Nov 2004 07:27:54 +1100 To: Matt Domsch Cc: netdev@oss.sgi.com, jamal Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101202754.GA23149@gondor.apana.org.au> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101173434.GA12437@lists.us.dell.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11300 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 692 Lines: 16 On Mon, Nov 01, 2004 at 11:34:34AM -0600, Matt Domsch wrote: > > + else if (!dev->addr_len) > + memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); > + else > + memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, > + min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); Same problem as before. If dev->addr_len is greater than zero but less than sizeof ifr->ifr_hwaddr.sa_data, then you've got garbage in there. Zero is not a special case. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From mdomsch@lists.us.dell.com Mon Nov 1 12:38:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 12:38:57 -0800 (PST) Received: from lists.us.dell.com (lists.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1Kcpji011746 for ; Mon, 1 Nov 2004 12:38:51 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.10/8.12.10/Dell.IT.3.31.03) with ESMTP id iA1KcLMU017123; Mon, 1 Nov 2004 14:38:21 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.10/8.12.10/Submit) id iA1KcLbS017121; Mon, 1 Nov 2004 14:38:21 -0600 Date: Mon, 1 Nov 2004 14:38:21 -0600 From: Matt Domsch To: Herbert Xu Cc: netdev@oss.sgi.com, jamal Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101203821.GA15086@lists.us.dell.com> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101202754.GA23149@gondor.apana.org.au> User-Agent: Mutt/1.4.1i X-archive-position: 11301 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 1236 Lines: 31 On Tue, Nov 02, 2004 at 07:27:54AM +1100, Herbert Xu wrote: > Same problem as before. If dev->addr_len is greater than zero but less > than sizeof ifr->ifr_hwaddr.sa_data, then you've got garbage in there. > Zero is not a special case. OK, I'll unconditionally clear it all first. How's this? Signed-off-by: Matt Domsch -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com ===== net/core/dev.c 1.169 vs edited ===== --- 1.169/net/core/dev.c 2004-10-26 11:09:33 -05:00 +++ edited/net/core/dev.c 2004-11-01 14:35:02 -06:00 @@ -2375,6 +2375,12 @@ return dev_set_mtu(dev, ifr->ifr_mtu); case SIOCGIFHWADDR: + if (net_ratelimit()) + printk(KERN_DEBUG "Warning: %s uses obsolete ioctl(SIOCGIFHWADDR), please convert it to rtnetlink(3,7)\n", current->comm); + + if ((size_t) dev->addr_len > sizeof ifr->ifr_hwaddr.sa_data) + return -EOVERFLOW; + memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); ifr->ifr_hwaddr.sa_family = dev->type; From herbert@gondor.apana.org.au Mon Nov 1 12:42:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 12:42:12 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1Kg3LD012130 for ; Mon, 1 Nov 2004 12:42:05 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1COizk-0005sd-00; Tue, 02 Nov 2004 07:41:40 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1COizb-00063q-00; Tue, 02 Nov 2004 07:41:31 +1100 Date: Tue, 2 Nov 2004 07:41:31 +1100 To: Matt Domsch Cc: netdev@oss.sgi.com, jamal Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101204131.GA23277@gondor.apana.org.au> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101203821.GA15086@lists.us.dell.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11302 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 785 Lines: 21 On Mon, Nov 01, 2004 at 02:38:21PM -0600, Matt Domsch wrote: > > OK, I'll unconditionally clear it all first. How's this? It's nearly there :) > + if ((size_t) dev->addr_len > sizeof ifr->ifr_hwaddr.sa_data) > + return -EOVERFLOW; > + memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); > memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, > min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); You don't need the min anymore since you've checked that dev->addr_len is not greater than sizeof ifr->ifr_hwaddr.sa_data. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From mdomsch@lists.us.dell.com Mon Nov 1 12:46:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 12:46:28 -0800 (PST) Received: from lists.us.dell.com (linux.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1KkG2g012539 for ; Mon, 1 Nov 2004 12:46:17 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.10/8.12.10/Dell.IT.3.31.03) with ESMTP id iA1KjYMU017293; Mon, 1 Nov 2004 14:45:34 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.10/8.12.10/Submit) id iA1KjXLn017291; Mon, 1 Nov 2004 14:45:33 -0600 Date: Mon, 1 Nov 2004 14:45:33 -0600 From: Matt Domsch To: Herbert Xu Cc: netdev@oss.sgi.com, jamal Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101204533.GA17279@lists.us.dell.com> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101204131.GA23277@gondor.apana.org.au> User-Agent: Mutt/1.4.1i X-archive-position: 11303 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 1223 Lines: 33 On Tue, Nov 02, 2004 at 07:41:31AM +1100, Herbert Xu wrote: > You don't need the min anymore since you've checked that dev->addr_len > is not greater than sizeof ifr->ifr_hwaddr.sa_data. Good catch. Signed-off-by: Matt Domsch -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com ===== net/core/dev.c 1.169 vs edited ===== --- 1.169/net/core/dev.c 2004-10-26 11:09:33 -05:00 +++ edited/net/core/dev.c 2004-11-01 14:42:59 -06:00 @@ -2375,8 +2375,13 @@ return dev_set_mtu(dev, ifr->ifr_mtu); case SIOCGIFHWADDR: - memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, - min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len)); + if (net_ratelimit()) + printk(KERN_DEBUG "Warning: %s uses obsolete ioctl(SIOCGIFHWADDR), please convert it to rtnetlink(3,7)\n", current->comm); + + if ((size_t) dev->addr_len > sizeof ifr->ifr_hwaddr.sa_data) + return -EOVERFLOW; + memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data); + memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, dev->addr_len); ifr->ifr_hwaddr.sa_family = dev->type; return 0; From dlstevens@us.ibm.com Mon Nov 1 13:49:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 13:49:55 -0800 (PST) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1Lni8d014631 for ; Mon, 1 Nov 2004 13:49:50 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1LnL8m449306 for ; Mon, 1 Nov 2004 16:49:21 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1LnL5Y141138 for ; Mon, 1 Nov 2004 14:49:21 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1LnKwk015022 for ; Mon, 1 Nov 2004 14:49:20 -0700 Received: from d03nm121.boulder.ibm.com (d03nm121.boulder.ibm.com [9.17.195.147]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1LnKwH015015; Mon, 1 Nov 2004 14:49:20 -0700 In-Reply-To: To: Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: Small Help required!!! X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Mon, 1 Nov 2004 13:49:17 -0800 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/01/2004 14:49:20, Serialize complete at 11/01/2004 14:49:20 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 11304 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 773 Lines: 22 netdev-bounce@oss.sgi.com wrote on 10/30/2004 08:32:55 AM: > hi, > I needed some information about how to proceed with implementing a Name > Switch Server plugin that > allows to resolve multicast DNS names using normal libc calls(such as > gethostbyname()). > If someone has knowledge in this regard,please mail me back. I think this will already work as-is. All you should need to do is register the multicast address in the DNS server. Have you tried it? Some well-known multicast addresses (like NTP's) are commonly registered with root servers already. I haven't tried using "gethostbyame()" on a multicast address that is registered, but I'm not aware of any checks on the class of the address in any of the code. +-DLS From hadi@cyberus.ca Mon Nov 1 13:51:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 13:51:28 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1LpMDr014845 for ; Mon, 1 Nov 2004 13:51:22 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1COk4u-00014o-6j for netdev@oss.sgi.com; Mon, 01 Nov 2004 16:51:04 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1COk4l-0003P2-0g; Mon, 01 Nov 2004 16:50:55 -0500 Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len From: jamal Reply-To: hadi@cyberus.ca To: Matt Domsch Cc: Herbert Xu , netdev@oss.sgi.com In-Reply-To: <20041101204533.GA17279@lists.us.dell.com> References: <20041030013700.GA21540@lists.us.dell.com> <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099345849.1073.1.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 01 Nov 2004 16:50:49 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11305 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 526 Lines: 17 My onluy comment is on use of -EOVERFLOW which i have seen only being used in the context of floating point computation (same as -EUNDERFLOW). I dont know what the right thing to return would be. cheers, jamal On Mon, 2004-11-01 at 15:45, Matt Domsch wrote: > On Tue, Nov 02, 2004 at 07:41:31AM +1100, Herbert Xu wrote: > > You don't need the min anymore since you've checked that dev->addr_len > > is not greater than sizeof ifr->ifr_hwaddr.sa_data. > > Good catch. > > Signed-off-by: Matt Domsch From hch@lst.de Mon Nov 1 13:54:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 13:54:46 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1Lse3r015466 for ; Mon, 1 Nov 2004 13:54:41 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iA1LsNla017108 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 1 Nov 2004 22:54:23 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iA1LsNC9017106; Mon, 1 Nov 2004 22:54:23 +0100 Date: Mon, 1 Nov 2004 22:54:23 +0100 From: Christoph Hellwig To: James Morris Cc: Patrick McHardy , davem@redhat.com, netdev@oss.sgi.com Subject: Re: [PATCH] remove dead skb_iter* functions Message-ID: <20041101215423.GA17080@lst.de> References: <41868333.7050602@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11306 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 418 Lines: 12 On Mon, Nov 01, 2004 at 03:03:01PM -0500, James Morris wrote: > On Mon, 1 Nov 2004, Patrick McHardy wrote: > > > Harald is working on code for pattern-matching inside > > non-linear skbs for conntrack helpers. This code needs > > the skb_iter* functions. > > Perhaps put it back when the pattern matching code is submitted upstream. And especially put it into some netfilter module instead of bloating the kernel. From nacc@us.ibm.com Mon Nov 1 14:00:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:00:38 -0800 (PST) Received: from e4.ny.us.ibm.com (e4.ny.us.ibm.com [32.97.182.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1M0WuW016057 for ; Mon, 1 Nov 2004 14:00:33 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e4.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1M0ACE884158; Mon, 1 Nov 2004 17:00:10 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1M09su230828; Mon, 1 Nov 2004 17:00:10 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1M084v004292; Mon, 1 Nov 2004 14:00:09 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1M088j004289; Mon, 1 Nov 2004 14:00:08 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 14:00:07 -0800 From: Nishanth Aravamudan To: Jan Kasprzak Cc: Jeff Garzik , janitor@sternwelten.at, netdev@oss.sgi.com Subject: Re: [patch 06/18] net/cosa: replace schedule_timeout() with msleep_interruptible() Message-ID: <20041101220007.GA4255@us.ibm.com> References: <4184C79F.3090602@pobox.com> <20041101112313.GD12416@fi.muni.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101112313.GD12416@fi.muni.cz> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11308 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 480 Lines: 13 On Mon, Nov 01, 2004 at 12:23:14PM +0100, Jan Kasprzak wrote: > Jeff Garzik wrote: > : why add all the memory barriers and such associated with > : set_current_state() ? > : > This is not time-critical - COSA is an ISA-only device, > and the driver is not tested on SMP (I have tried to make it SMP-aware, > but at the time I had no SMP machine with ISA slot). Just to make it clear, then, the current patch is ok? Or would you prefer I had used __set_current_state()? -Nish From mdomsch@lists.us.dell.com Mon Nov 1 14:00:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:00:22 -0800 (PST) Received: from lists.us.dell.com (linux.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1M0Hff016041 for ; Mon, 1 Nov 2004 14:00:17 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.10/8.12.10/Dell.IT.3.31.03) with ESMTP id iA1LxiMU018418; Mon, 1 Nov 2004 15:59:44 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.10/8.12.10/Submit) id iA1LxinM018416; Mon, 1 Nov 2004 15:59:44 -0600 Date: Mon, 1 Nov 2004 15:59:44 -0600 From: Matt Domsch To: jamal Cc: Herbert Xu , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101215944.GB17279@lists.us.dell.com> References: <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> <1099345849.1073.1.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1099345849.1073.1.camel@jzny.localdomain> User-Agent: Mutt/1.4.1i X-archive-position: 11307 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 831 Lines: 26 On Mon, Nov 01, 2004 at 04:50:49PM -0500, jamal wrote: > My onluy comment is on use of -EOVERFLOW which i have seen only > being used in the context of floating point computation > (same as -EUNDERFLOW). I dont know what the right thing to return would > be. Actually, -EOVERFLOW appears throughout the kernel. A couple examples: drivers/net/ppp_generic.:ppp_read() uses it to indicate skb->len > sizeof buffer to put the data into. fs/stat.c:cp_new_stat() and friends if (stat->size > MAX_NON_LFS) return -EOVERFLOW; indicates that the file size is larger than can be represented by the app. I believe our use would be consistent. Thanks, Matt -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com From herbert@gondor.apana.org.au Mon Nov 1 14:04:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:04:18 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1M48tQ016768 for ; Mon, 1 Nov 2004 14:04:09 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1COkH7-0006Ul-00; Tue, 02 Nov 2004 09:03:41 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1COkH0-0006CE-00; Tue, 02 Nov 2004 09:03:34 +1100 Date: Tue, 2 Nov 2004 09:03:34 +1100 To: jamal Cc: Matt Domsch , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101220334.GA23809@gondor.apana.org.au> References: <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> <1099345849.1073.1.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1099345849.1073.1.camel@jzny.localdomain> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11309 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 507 Lines: 12 On Mon, Nov 01, 2004 at 04:50:49PM -0500, jamal wrote: > My onluy comment is on use of -EOVERFLOW which i have seen only > being used in the context of floating point computation > (same as -EUNDERFLOW). I dont know what the right thing to return would > be. How about ERANGE? getcwd(3) uses it. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Mon Nov 1 14:07:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:07:20 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1M7DoF017202 for ; Mon, 1 Nov 2004 14:07:14 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1COkK8-0006WE-00; Tue, 02 Nov 2004 09:06:48 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1COkK4-0006Dk-00; Tue, 02 Nov 2004 09:06:44 +1100 Date: Tue, 2 Nov 2004 09:06:44 +1100 To: Matt Domsch Cc: jamal , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041101220644.GA23903@gondor.apana.org.au> References: <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> <1099345849.1073.1.camel@jzny.localdomain> <20041101215944.GB17279@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101215944.GB17279@lists.us.dell.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11310 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 398 Lines: 10 On Mon, Nov 01, 2004 at 03:59:44PM -0600, Matt Domsch wrote: > > Actually, -EOVERFLOW appears throughout the kernel. A couple examples: I agree. Please disregard my comment re ERANGE. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From nacc@us.ibm.com Mon Nov 1 14:11:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:11:23 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1MB9fx017614 for ; Mon, 1 Nov 2004 14:11:16 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA1MAiAd311986 for ; Mon, 1 Nov 2004 17:10:44 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1MAibN170534 for ; Mon, 1 Nov 2004 15:10:44 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1MAhga008788 for ; Mon, 1 Nov 2004 15:10:44 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA1MAhZv008748; Mon, 1 Nov 2004 15:10:43 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1MAgc6004332; Mon, 1 Nov 2004 14:10:42 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1MAfjR004329; Mon, 1 Nov 2004 14:10:41 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 14:10:41 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] net/pcnet32: replace schedule_timeout() with ssleep_interruptible() Message-ID: <20041101221041.GB4255@us.ibm.com> References: <4184C701.5030103@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C701.5030103@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11311 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 1399 Lines: 38 On Sun, Oct 31, 2004 at 06:05:37AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >diff -puN drivers/net/pcnet32.c~msleep_interruptible-drivers_net_pcnet32 > >drivers/net/pcnet32.c > >--- > >linux-2.6.10-rc1/drivers/net/pcnet32.c~msleep_interruptible-drivers_net_pcnet32 2004-10-24 17:05:14.000000000 +0200 > >+++ linux-2.6.10-rc1-max/drivers/net/pcnet32.c 2004-10-24 > >17:05:14.000000000 +0200 > >@@ -847,7 +847,7 @@ static int pcnet32_phys_id(struct net_de > > if ((!data) || (data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))) > > data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); > > > >- schedule_timeout(data * HZ); > >+ msleep_interruptible(data * 1000); > > > clearly and obviously ssleep() Here is the corrected patch. Description: Use ssleep_interruptible() instead of schedule_timeout() to guarantee the task delays as expected. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/pcnet32.c 2004-10-30 15:33:28.000000000 -0700 +++ 2.6.10-rc1/drivers/net/pcnet32.c 2004-11-01 14:08:10.000000000 -0800 @@ -847,7 +847,7 @@ static int pcnet32_phys_id(struct net_de if ((!data) || (data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))) data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); - schedule_timeout(data * HZ); + ssleep_interruptible(data); del_timer_sync(&lp->blink_timer); /* Restore the original value of the bcrs */ From nacc@us.ibm.com Mon Nov 1 14:20:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:20:47 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1MKe9M018237 for ; Mon, 1 Nov 2004 14:20:41 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id iA1MK8eG166784; Mon, 1 Nov 2004 17:20:08 -0500 Received: from localhost.localdomain (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA1MK7su288192; Mon, 1 Nov 2004 17:20:08 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA1MK7Ia004393; Mon, 1 Nov 2004 14:20:07 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA1MK6FI004390; Mon, 1 Nov 2004 14:20:06 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 1 Nov 2004 14:20:06 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: kernel-janitors@lists.osdl.org, netdev@oss.sgi.com Subject: [PATCH] net/airo: replace schedule_timeout() with *sleep() variants Message-ID: <20041101222006.GC4255@us.ibm.com> References: <4184C61F.2080906@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4184C61F.2080906@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11312 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 4983 Lines: 154 On Sun, Oct 31, 2004 at 06:01:51AM -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >Any comments would be appreciated. > > > >Description: Use msleep()/msleep_interruptible() [as appropriate] > >instead of schedule_timeout() to guarantee the task delays as > >expected. Also uses set_current_state() instead of direct assignment of > >current->state in one place. > > > >Signed-off-by: Nishanth Aravamudan > >Signed-off-by: Maximilian Attems > > > >--- > > > > linux-2.6.10-rc1-max/drivers/net/wireless/airo.c | 27 > > ++++++++--------------- > > 1 files changed, 10 insertions(+), 17 deletions(-) > > > >diff -puN > >drivers/net/wireless/airo.c~msleep+msleep_interruptible-drivers_net_wireless_airo drivers/net/wireless/airo.c > >--- > >linux-2.6.10-rc1/drivers/net/wireless/airo.c~msleep+msleep_interruptible-drivers_net_wireless_airo 2004-10-24 17:05:35.000000000 +0200 > >+++ linux-2.6.10-rc1-max/drivers/net/wireless/airo.c 2004-10-24 > >17:05:35.000000000 +0200 > >@@ -1699,9 +1699,8 @@ static int readBSSListRid(struct airo_in > > issuecommand(ai, &cmd, &rsp); > > up(&ai->sem); > > /* Let the command take effect */ > >- set_current_state (TASK_INTERRUPTIBLE); > > ai->task = current; > >- schedule_timeout (3*HZ); > >+ msleep_interruptible(3*1000); > > ai->task = NULL; > > } > > rc = PC4500_readrid(ai, first ? RID_BSSLISTFIRST : RID_BSSLISTNEXT, > > use ssleep() here > > > >@@ -2950,7 +2947,7 @@ static int airo_thread(void *data) { > > } > > break; > > } > >- current->state = TASK_RUNNING; > >+ set_current_state(TASK_RUNNING); > > remove_wait_queue(&ai->thr_wait, &wait); > > locked = 1; > > } > > why are you adding barriers? Fixed both issues in the following patch: Description: Use msleep()/msleep_interruptible()/ssleep()/ ssleep_interruptible() [as appropriate] instead of schedule_timeout() to guarantee the task delays as expected. Also uses __set_current_state() instead of direct assignment of current->state. Also fixes tabbing in one line. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/wireless/airo.c 2004-10-30 15:33:27.000000000 -0700 +++ 2.6.10-rc1/drivers/net/wireless/airo.c 2004-11-01 14:17:52.000000000 -0800 @@ -1699,9 +1699,8 @@ static int readBSSListRid(struct airo_in issuecommand(ai, &cmd, &rsp); up(&ai->sem); /* Let the command take effect */ - set_current_state (TASK_INTERRUPTIBLE); ai->task = current; - schedule_timeout (3*HZ); + ssleep_interruptible(3); ai->task = NULL; } rc = PC4500_readrid(ai, first ? RID_BSSLISTFIRST : RID_BSSLISTNEXT, @@ -2686,11 +2685,9 @@ int reset_card( struct net_device *dev , return -1; waitbusy (ai); OUT4500(ai,COMMAND,CMD_SOFTRESET); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ/5); + msleep(200); waitbusy (ai); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ/5); + msleep(200); if (lock) up(&ai->sem); return 0; @@ -2950,7 +2947,7 @@ static int airo_thread(void *data) { } break; } - current->state = TASK_RUNNING; + __set_current_state(TASK_RUNNING); remove_wait_queue(&ai->thr_wait, &wait); locked = 1; } @@ -5518,12 +5515,12 @@ static int airo_pci_resume(struct pci_de } else { OUT4500(ai, EVACK, EV_AWAKEN); OUT4500(ai, EVACK, EV_AWAKEN); - schedule_timeout(HZ/10); + msleep_interruptible(100); } set_bit (FLAG_COMMIT, &ai->flags); disable_MAC(ai, 0); - schedule_timeout (HZ/5); + msleep_interruptible(200); if (ai->SSID) { writeSsidRid(ai, ai->SSID, 0); kfree(ai->SSID); @@ -7472,8 +7469,7 @@ int cmdreset(struct airo_info *ai) { OUT4500(ai,COMMAND,CMD_SOFTRESET); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); /* WAS 600 12/7/00 */ + ssleep(1); /* WAS 600 12/7/00 */ if(!waitbusy (ai)){ printk(KERN_INFO "Waitbusy hang AFTER RESET\n"); @@ -7500,8 +7496,7 @@ int setflashmode (struct airo_info *ai) OUT4500(ai, SWS3, FLASH_COMMAND); OUT4500(ai, COMMAND,0); } - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ/2); /* 500ms delay */ + msleep(500); /* 500ms delay */ if(!waitbusy(ai)) { clear_bit (FLAG_FLASHING, &ai->flags); @@ -7611,8 +7606,7 @@ int flashputbuf(struct airo_info *ai){ int flashrestart(struct airo_info *ai,struct net_device *dev){ int i,status; - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); /* Added 12/7/00 */ + ssleep(1); /* Added 12/7/00 */ clear_bit (FLAG_FLASHING, &ai->flags); if (test_bit(FLAG_MPI, &ai->flags)) { status = mpi_init_descriptors(ai); @@ -7627,8 +7621,7 @@ int flashrestart(struct airo_info *ai,st ( ai, 2312, i >= MAX_FIDS / 2 ); } - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); /* Added 12/7/00 */ + ssleep(1); /* Added 12/7/00 */ return status; } #endif /* CISCO_EXT */ From jt@bougret.hpl.hp.com Mon Nov 1 14:58:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 14:58:47 -0800 (PST) Received: from palrel11.hp.com (palrel11.hp.com [156.153.255.246]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA1MwfvV020406 for ; Mon, 1 Nov 2004 14:58:41 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel11.hp.com (Postfix) with ESMTP id 77FA918CB4; Mon, 1 Nov 2004 14:58:24 -0800 (PST) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id PAA23985; Mon, 1 Nov 2004 15:03:08 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1COl84-0004Qu-00; Mon, 01 Nov 2004 14:58:24 -0800 Date: Mon, 1 Nov 2004 14:58:24 -0800 To: Jeff Garzik , Linux kernel mailing list , netdev@oss.sgi.com Subject: [PATCH 2.6] Wireless Extension dropped patchlet Message-ID: <20041101225823.GA16560@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 11313 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev Content-Length: 3258 Lines: 77 Hi Jeff, This tiny bit of the last WE-17 patch was lost between me and you. I initially decided to wait to resubmit, but Chris Wedgwood reported that the MadWifi driver needs it. Sorry for not having pushed harder. I recreated this patch, and tested with 2.6.10-rc1, and Chris tested it with MadWifi. Would you mind pushing that up to Linus ? Thanks in advance... Jean Changelog : o remove unneeded const o spelling + comments Signed-off-by: Jean Tourrilhes --------------------------------------------------------------- diff -u -p linux-2.6.10-rc1/include/linux/wireless.h linux-2.6.9/include/linux/wireless.h --- linux-2.6.10-rc1/include/net/iw_handler.h Mon Nov 1 11:14:46 2004 +++ linux-2.6.9/include/net/iw_handler.h Mon Nov 1 11:14:50 2004 @@ -311,10 +311,10 @@ struct iw_handler_def { /* Number of handlers defined (more precisely, index of the * last defined handler + 1) */ - const __u16 num_standard; - const __u16 num_private; + __u16 num_standard; + __u16 num_private; /* Number of private arg description */ - const __u16 num_private_args; + __u16 num_private_args; /* Array of handlers for standard ioctls * We will call dev->wireless_handlers->standard[ioctl - SIOCSIWNAME] @@ -332,7 +332,7 @@ struct iw_handler_def const struct iw_priv_args * private_args; /* This field will be *removed* in the next version of WE */ - const long spy_offset; /* DO NOT USE */ + long spy_offset; /* DO NOT USE */ /* New location of get_wireless_stats, to de-bloat struct net_device. * The old pointer in struct net_device will be gradually phased diff -u -p linux-2.6.10-rc1/include/net/iw_handler.h linux-2.6.9/include/net/iw_handler.h --- linux-2.6.10-rc1/net/core/wireless.c Mon Nov 1 11:14:48 2004 +++ linux-2.6.9/net/core/wireless.c Mon Nov 1 11:24:32 2004 @@ -52,7 +52,8 @@ * v6 - 18.06.04 - Jean II * o Change get_spydata() method for added safety * o Remove spy #ifdef, they are always on -> cleaner code - * o Allow any size GET request is user specifies length > max + * o Allow any size GET request if user specifies length > max + * and if request has IW_DESCR_FLAG_NOMAX flag or is SIOCGIWPRIV * o Start migrating get_wireless_stats to struct iw_handler_def * o Add wmb() in iw_handler_set_spy() for non-coherent archs/cpus * Based on patch from Pavel Roskin : @@ -690,6 +691,10 @@ static inline int ioctl_standard_call(st * we can support any size GET requests. * There is still a limit : -ENOMEM. */ extra_size = user_length * descr->token_size; + /* Note : user_length is originally a __u16, + * and token_size is controlled by us, + * so extra_size won't get negative and + * won't overflow... */ } } @@ -1227,7 +1232,7 @@ int iw_handler_set_spy(struct net_device /* We want to operate without locking, because wireless_spy_update() * most likely will happen in the interrupt handler, and therefore - * have it own locking constraints and needs performance. + * have its own locking constraints and needs performance. * The rtnl_lock() make sure we don't race with the other iw_handlers. * This make sure wireless_spy_update() "see" that the spy list * is temporarily disabled. */ From tommy.christensen@tpack.net Mon Nov 1 15:09:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 15:09:29 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA1N9NNv022126 for ; Mon, 1 Nov 2004 15:09:24 -0800 Received: (qmail 7916 invoked from network); 1 Nov 2004 23:09:00 -0000 Received: from dhcp-174.cph.tpack.net (HELO ?172.17.159.11?) (192.168.0.174) by 0 with SMTP; 1 Nov 2004 23:09:00 -0000 Message-ID: <4186C201.5030004@tpack.net> Date: Tue, 02 Nov 2004 00:08:49 +0100 From: Tommy Christensen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Ben Greear CC: "'netdev@oss.sgi.com'" , "Linux 802.1Q VLAN" , Francois Romieu , "David S. Miller" Subject: Re: [PATCH] 802.1Q VLAN References: <41797696.9070905@candelatech.com> <20041022214611.GA4948@electric-eye.fr.zoreil.com> <41798506.1030909@candelatech.com> <417D675F.3000909@candelatech.com> <4181838B.6040002@tpack.net> <41818D99.9020300@candelatech.com> <1099038566.1813.99.camel@cyan.cph.tpack.net> <418281C1.9080707@candelatech.com> <4182D44E.7070507@tpack.net> <4182DABE.7000502@candelatech.com> <4182E0C6.6090205@tpack.net> <4186876E.5040204@candelatech.com> In-Reply-To: <4186876E.5040204@candelatech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11314 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Content-Length: 1203 Lines: 43 Ben Greear wrote: > How does this look? I think it should fix the problem with > having a new skb created in the __vlan_put_tag() method. Yes, this seems to be handled correctly now. Two nitpickings: - veth should be reassigned after calling __vlan_put_tag - sample skb->len before calling dev_queue_xmit and use that to update stats->tx_bytes (it can be different from skb2->len) And then there's the return values ... This is a hard_start_xmit() method, so we should try to be consistent with real device drivers. The only defined return values are: NETDEV_TX_OK and NETDEV_TX_BUSY. (There is also Andi's NETDEV_TX_LOCKED, which we can ignore here). Furthermore transmission shouldn't be retried in case of failure, only on congestion does this make sense. So my suggestion for the last part of the function is: len = skb->len; rv = dev_queue_xmit(skb); if (rv < 0) { stats->tx_dropped++; kfree_skb(skb2); ret = NETDEV_TX_OK; } else if (rv == NET_XMIT_SUCCESS || rv == NET_XMIT_CN) { stats->tx_packets++; stats->tx_bytes += len; kfree_skb(skb2); ret = NETDEV_TX_OK; } else { /* The device below us is congested */ ret = NETDEV_TX_BUSY; } return ret; -Tommy From davem@davemloft.net Mon Nov 1 16:41:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 16:42:00 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA20fsjV029668 for ; Mon, 1 Nov 2004 16:41:54 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmXN-0003vM-00; Mon, 01 Nov 2004 16:28:37 -0800 Date: Mon, 1 Nov 2004 16:28:37 -0800 From: "David S. Miller" To: Adrian Bunk Cc: acme@conectiva.com.br, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [2.6 patch] appletalk: remove an unused function Message-Id: <20041101162837.33fd343e.davem@davemloft.net> In-Reply-To: <20041029001439.GC29142@stusta.de> References: <20041028221046.GI3207@stusta.de> <20041029001439.GC29142@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11315 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 166 Lines: 6 On Fri, 29 Oct 2004 02:14:39 +0200 Adrian Bunk wrote: > The patch below removes an unsed function from net/appletalk/ddp.c Applied, thanks Adrian. From davem@davemloft.net Mon Nov 1 16:43:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 16:43:11 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA20h7lT029818 for ; Mon, 1 Nov 2004 16:43:07 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmYU-0003wp-00; Mon, 01 Nov 2004 16:29:46 -0800 Date: Mon, 1 Nov 2004 16:29:46 -0800 From: "David S. Miller" To: Adrian Bunk Cc: ralf@linux-mips.org, linux-hams@vger.kernel.org, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [2.6 patch] ax25_route.c: remove an unused function Message-Id: <20041101162946.19b3869e.davem@davemloft.net> In-Reply-To: <20041029002045.GO29142@stusta.de> References: <20041028230032.GU3207@stusta.de> <20041029002045.GO29142@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11316 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 169 Lines: 6 On Fri, 29 Oct 2004 02:20:45 +0200 Adrian Bunk wrote: > The patch below removes an unused function from net/ax25/ax25_route.c Applied, thanks Adrian. From davem@davemloft.net Mon Nov 1 16:44:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 16:44:39 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA20iZTp030446 for ; Mon, 1 Nov 2004 16:44:36 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmZh-0003xG-00; Mon, 01 Nov 2004 16:31:01 -0800 Date: Mon, 1 Nov 2004 16:31:00 -0800 From: "David S. Miller" To: Adrian Bunk Cc: coreteam@netfilter.org, marc@mbsi.ca, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [2.6 patch] netfilter/ipt_tcpmss.c: remove an unused function Message-Id: <20041101163100.60e737ff.davem@davemloft.net> In-Reply-To: <20041029002113.GP29142@stusta.de> References: <20041028230202.GV3207@stusta.de> <20041029002113.GP29142@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11317 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 304 Lines: 9 On Fri, 29 Oct 2004 02:21:13 +0200 Adrian Bunk wrote: > The patch below removes an unused function from > net/ipv4/netfilter/ipt_tcpmss.c Applied, thanks Adrian. This one is probably due to cut&paste from ipt_TCPMSS.c where this inline is also implemented and also actually used :-) From davem@davemloft.net Mon Nov 1 16:49:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 16:49:08 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA20n4sb030908 for ; Mon, 1 Nov 2004 16:49:04 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmXu-0003vc-00; Mon, 01 Nov 2004 16:29:10 -0800 Date: Mon, 1 Nov 2004 16:29:09 -0800 From: "David S. Miller" To: Adrian Bunk Cc: dagb@cs.uit.no, jt@hpl.hp.com, irda-users@lists.sourceforge.net, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [2.6 patch] irda/qos.c: remove an unused function Message-Id: <20041101162909.4af0ebbd.davem@davemloft.net> In-Reply-To: <20041029001809.GJ29142@stusta.de> References: <20041028222238.GP3207@stusta.de> <20041029001809.GJ29142@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11318 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 162 Lines: 6 On Fri, 29 Oct 2004 02:18:09 +0200 Adrian Bunk wrote: > The patch below removes an unused function from net/irda/qos.c Applied, thanks Adrian. From davem@davemloft.net Mon Nov 1 16:49:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 16:49:14 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA20n9dd030919 for ; Mon, 1 Nov 2004 16:49:09 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmhR-00042e-00; Mon, 01 Nov 2004 16:39:01 -0800 Date: Mon, 1 Nov 2004 16:39:01 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: Re: [PATCH 7/6] cls_fw: CONFIG_NET_CLS_IND is not dependant on CONFIG_NET_CLS_ACT Message-Id: <20041101163901.2b4449d3.davem@davemloft.net> In-Reply-To: <20041029102620.GH12289@postel.suug.ch> References: <20041029002113.GY12289@postel.suug.ch> <20041029102620.GH12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11319 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 100 Lines: 4 All 7 (of 6!) patches applied, thanks Thomas :-) I'll add Jamal's IPT action patch right now too. From davem@davemloft.net Mon Nov 1 17:08:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:08:29 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA218NVW032216 for ; Mon, 1 Nov 2004 17:08:24 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COn08-0004Ce-00; Mon, 01 Nov 2004 16:58:20 -0800 Date: Mon, 1 Nov 2004 16:58:20 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.4] PKT_SCHED: break is not enough to stop walking Message-Id: <20041101165820.75159f20.davem@davemloft.net> In-Reply-To: <20041029002958.GF12289@postel.suug.ch> References: <20041029002958.GF12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11320 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 298 Lines: 9 On Fri, 29 Oct 2004 02:29:58 +0200 Thomas Graf wrote: > break is not enough to escape from the walking loops, since > multiple encapsulated loops are used to traverse the hash tables. > > Signed-off-by: Thomas Graf Applied, thanks for doing this backport Thomas. From davem@davemloft.net Mon Nov 1 17:09:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:09:24 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA219IYg032432 for ; Mon, 1 Nov 2004 17:09:18 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COn0x-0004Cx-00; Mon, 01 Nov 2004 16:59:11 -0800 Date: Mon, 1 Nov 2004 16:59:10 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [XFRM] Move xfrm4_rcv export to its site Message-Id: <20041101165910.138a0f94.davem@davemloft.net> In-Reply-To: <20041029021352.GA22550@gondor.apana.org.au> References: <20041029021352.GA22550@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11321 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 315 Lines: 10 On Fri, 29 Oct 2004 12:13:52 +1000 Herbert Xu wrote: > Here is a trivial patch that moves xfrm4_rcv's export to the > site of its definition. Currently it lives in net/xfrm which > is miles away. > > Signed-off-by: Herbert Xu Applied, thanks Herbert. From davem@davemloft.net Mon Nov 1 17:10:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:10:07 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA21A2Ao000430 for ; Mon, 1 Nov 2004 17:10:02 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COn1j-0004DJ-00; Mon, 01 Nov 2004 16:59:59 -0800 Date: Mon, 1 Nov 2004 16:59:58 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [IPSEC] Make ah4/esp4/ipcomp depend on INET Message-Id: <20041101165958.674c0485.davem@davemloft.net> In-Reply-To: <20041029033900.GA23206@gondor.apana.org.au> References: <20041029033900.GA23206@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11322 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 307 Lines: 9 On Fri, 29 Oct 2004 13:39:00 +1000 Herbert Xu wrote: > As it is someone could disable INET and still enable ah4/esp4/ipcomp. > This patch adds the dependency on INET to prevent this. > > Signed-off-by: Herbert Xu Applied, thanks a lot Herbert. From davem@davemloft.net Mon Nov 1 17:10:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:10:41 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA21AZp3000704 for ; Mon, 1 Nov 2004 17:10:35 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COmzB-0004C1-00; Mon, 01 Nov 2004 16:57:21 -0800 Date: Mon, 1 Nov 2004 16:57:21 -0800 From: "David S. Miller" To: Adrian Bunk Cc: sri@us.ibm.com, lksctp-developers@lists.sourceforge.net, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [2.6 patch] sctp/outqueue.c: remove an unused function Message-Id: <20041101165721.777295fc.davem@davemloft.net> In-Reply-To: <20041029002201.GQ29142@stusta.de> References: <20041028230353.GW3207@stusta.de> <20041029002201.GQ29142@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11323 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 167 Lines: 6 On Fri, 29 Oct 2004 02:22:01 +0200 Adrian Bunk wrote: > The patch below removes an unused function from net/sctp/outqueue.c Applied, thanks Adrian. From davem@davemloft.net Mon Nov 1 17:11:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:11:55 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA21Bov9001195 for ; Mon, 1 Nov 2004 17:11:50 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COn3R-0004Dh-00; Mon, 01 Nov 2004 17:01:45 -0800 Date: Mon, 1 Nov 2004 17:01:45 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modularise tcpdiag Message-Id: <20041101170145.52185904.davem@davemloft.net> In-Reply-To: <20041029043858.GA27907@gondor.apana.org.au> References: <20041029043858.GA27907@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11324 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 333 Lines: 11 On Fri, 29 Oct 2004 14:38:58 +1000 Herbert Xu wrote: > This is the first step in fixing the tcpdiag/modular ipv6 issue. > We modularise tcpdiag in the obvious way. > > Next we can move out the IPv6-specific stuff. > > Signed-off-by: Herbert Xu Applied, thanks Herbert. From davem@davemloft.net Mon Nov 1 17:16:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:16:22 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA21GIBX001663 for ; Mon, 1 Nov 2004 17:16:18 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COn7o-0004Ev-00; Mon, 01 Nov 2004 17:06:16 -0800 Date: Mon, 1 Nov 2004 17:06:16 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: Re: [PATCHSET 0/4] PKT_SCHED: More classifier cleanups Message-Id: <20041101170616.588da57d.davem@davemloft.net> In-Reply-To: <20041029140612.GO12289@postel.suug.ch> References: <20041029140612.GO12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11325 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 325 Lines: 11 On Fri, 29 Oct 2004 16:06:12 +0200 Thomas Graf wrote: > Cleans up route,rsvp,tcindex, and u32 classifier to > use the generic classifier routines. > > All trivial changes not changing any behaviour. > > Relative to patchset "Generic classifier routines / cls_fw cleanup" All applied, thanks a lot Thomas. From davem@davemloft.net Mon Nov 1 17:37:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 17:37:16 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA21bBZO002598 for ; Mon, 1 Nov 2004 17:37:11 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COnS4-0004J2-00; Mon, 01 Nov 2004 17:27:12 -0800 Date: Mon, 1 Nov 2004 17:27:12 -0800 From: "David S. Miller" To: Mike Waychison Cc: Brian.Somers@Sun.COM, netdev@oss.sgi.com Subject: Re: [PATCH] TG3: fiber hw autoneg bounces Message-Id: <20041101172712.55e97846.davem@davemloft.net> In-Reply-To: <4182B6A7.90700@sun.com> References: <4182B6A7.90700@sun.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11326 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 633 Lines: 16 On Fri, 29 Oct 2004 17:31:19 -0400 Mike Waychison wrote: > I've traced it to be caused by the tg3_timer 1 second work noticing that > MAC_STATUS_LNKSTATE_CHANGED was set, which driver would see as the link > going down. > > Upon further inspection, it appears that we don't wait long enough > between setting SG_DIG_CTRL and reading the SG_DIG_STATUS for the result. How come the bcm5700 Broadcom driver gets away without this incredibly huge delay? The touching of the device is absolutely identical in the tg3 driver to what Broadcom's bcm5700 code is doing. I'll apply the patch for now though... From davem@davemloft.net Mon Nov 1 18:15:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 18:15:59 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA22Fo1W004465 for ; Mon, 1 Nov 2004 18:15:50 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COo3M-0004Qv-00; Mon, 01 Nov 2004 18:05:44 -0800 Date: Mon, 1 Nov 2004 18:05:44 -0800 From: "David S. Miller" To: "chas williams (contractor)" Cc: netdev@oss.sgi.com, rddunlap@osdl.org, myxie@debian.org, gprocida@madge.com, linux-atm-general@lists.sourceforge.net Subject: Re: [PATCH][ATM]: [ambassador] fix type and printk warning (from Randy Dunlap ) Message-Id: <20041101180544.1b94222c.davem@davemloft.net> In-Reply-To: <200410311552.i9VFq5XQ017682@ginger.cmf.nrl.navy.mil> References: <416AD8B9.9000901@osdl.org> <200410311552.i9VFq5XQ017682@ginger.cmf.nrl.navy.mil> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11327 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 365 Lines: 10 On Sun, 31 Oct 2004 10:52:06 -0500 "chas williams (contractor)" wrote: > # This is a BitKeeper generated diff -Nru style patch. > # > # ChangeSet > # 2004/10/31 10:49:16-05:00 chas@relax.cmf.nrl.navy.mil > # [ATM]: [ambassador] fix type and printk warning (from Randy Dunlap ) Applied, thanks Chas and Randy. From davem@davemloft.net Mon Nov 1 18:16:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 18:16:46 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA22GgSn004523 for ; Mon, 1 Nov 2004 18:16:42 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1COo4D-0004RQ-00; Mon, 01 Nov 2004 18:06:37 -0800 Date: Mon, 1 Nov 2004 18:06:37 -0800 From: "David S. Miller" To: "chas williams (contractor)" Cc: netdev@oss.sgi.com, davem@redhat.com, adam@yggdrasil.com Subject: Re: [PATCH][ATM]: [drivers] add missing pci_tbl exports (pointed out by "Adam J. Richter" ) Message-Id: <20041101180637.078c7779.davem@davemloft.net> In-Reply-To: <200410311628.i9VGSNma017970@ginger.cmf.nrl.navy.mil> References: <200410311628.i9VGSNma017970@ginger.cmf.nrl.navy.mil> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11328 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 361 Lines: 10 On Sun, 31 Oct 2004 11:28:24 -0500 "chas williams (contractor)" wrote: > # This is a BitKeeper generated diff -Nru style patch. > # > # ChangeSet > # 2004/10/31 11:26:23-05:00 chas@relax.cmf.nrl.navy.mil > # [ATM]: [drivers] add missing pci_tbl exports (pointed out by "Adam J. Richter" Applied, thanks Chas. From rddunlap@osdl.org Mon Nov 1 20:29:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 20:30:04 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA24TxH6029774 for ; Mon, 1 Nov 2004 20:29:59 -0800 Received: from [127.0.0.1] (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iA24Ta903407; Mon, 1 Nov 2004 20:29:36 -0800 Message-ID: <41870BF9.6060207@osdl.org> Date: Mon, 01 Nov 2004 20:24:25 -0800 From: "Randy.Dunlap" User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: ganesh.venkatesan@intel.com, jesse.brandeburg@intel.com, netdev@oss.sgi.com Subject: e100 badness (2.6.10-rc1-mm2) Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11330 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 845 Lines: 28 Hi Ganesh, Jesse -- I see this in 2.6.10-rc1-mm2: Badness in enable_irq at kernel/irq/manage.c:112 [] dump_stack+0x1e/0x20 [] enable_irq+0xaa/0x114 [] e100_up+0x130/0x23f [] e100_open+0x26/0x6e [] dev_open+0x6e/0x7c [] dev_change_flags+0x56/0x126 [] devinet_ioctl+0x60b/0x6cd [] inet_ioctl+0x81/0xae [] sock_ioctl+0x1d3/0x2d6 [] sys_ioctl+0x179/0x21d [] sysenter_past_esp+0x52/0x71 I think that it happens because (in e100_up()), disable_irq() is called before request_irq() is called. If there are no other interrupt handlers on the same irq, then desc->depth is cleared to 0 by setup_irq() [called from request_irq()]. Then the following enable_irq() is confused by desc->depth == 0. -- ~Randy From ganesh.venkatesan@intel.com Mon Nov 1 21:07:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 21:07:18 -0800 (PST) Received: from caduceus.jf.intel.com (fmr06.intel.com [134.134.136.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA257C7o030964 for ; Mon, 1 Nov 2004 21:07:12 -0800 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by caduceus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iA256UxN018686; Tue, 2 Nov 2004 05:06:30 GMT Received: from orsmsxvs041.jf.intel.com (orsmsxvs041.jf.intel.com [192.168.65.54]) by talaria.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with SMTP id iA24xc5r030910; Tue, 2 Nov 2004 04:59:43 GMT Received: from orsmsx331.amr.corp.intel.com ([192.168.65.56]) by orsmsxvs041.jf.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004110121064132245 ; Mon, 01 Nov 2004 21:06:44 -0800 Received: from orsmsx408.amr.corp.intel.com ([192.168.65.52]) by orsmsx331.amr.corp.intel.com with Microsoft SMTPSVC(6.0.3790.0); Mon, 1 Nov 2004 21:05:54 -0800 X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Subject: RE: e100 badness (2.6.10-rc1-mm2) Date: Mon, 1 Nov 2004 21:05:52 -0800 Message-ID: <468F3FDA28AA87429AD807992E22D07E031BAB39@orsmsx408> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: e100 badness (2.6.10-rc1-mm2) Thread-Index: AcTAlJEUFYqeMQePSiyXxbUBGyc6nAABLWfw From: "Venkatesan, Ganesh" To: "Randy.Dunlap" , "Brandeburg, Jesse" , Cc: "Chilakala, Mallikarjuna" X-OriginalArrivalTime: 02 Nov 2004 05:05:54.0878 (UTC) FILETIME=[A1B59DE0:01C4C099] X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA257C7o030964 X-archive-position: 11331 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ganesh.venkatesan@intel.com Precedence: bulk X-list: netdev Content-Length: 1296 Lines: 44 Randy: Thanks for the information. We are aware of this (from a previous conversation between Scott Feldman, Andrew Morton and Jeremy Fitzhardinge). We are working on a fix for this. Thanks, Ganesh. >-----Original Message----- >From: Randy.Dunlap [mailto:rddunlap@osdl.org] >Sent: Monday, November 01, 2004 8:24 PM >To: Venkatesan, Ganesh; Brandeburg, Jesse; netdev@oss.sgi.com >Subject: e100 badness (2.6.10-rc1-mm2) > >Hi Ganesh, Jesse -- > >I see this in 2.6.10-rc1-mm2: > >Badness in enable_irq at kernel/irq/manage.c:112 > [] dump_stack+0x1e/0x20 > [] enable_irq+0xaa/0x114 > [] e100_up+0x130/0x23f > [] e100_open+0x26/0x6e > [] dev_open+0x6e/0x7c > [] dev_change_flags+0x56/0x126 > [] devinet_ioctl+0x60b/0x6cd > [] inet_ioctl+0x81/0xae > [] sock_ioctl+0x1d3/0x2d6 > [] sys_ioctl+0x179/0x21d > [] sysenter_past_esp+0x52/0x71 > > >I think that it happens because (in e100_up()), >disable_irq() is called before request_irq() is called. >If there are no other interrupt handlers on the same irq, >then desc->depth is cleared to 0 by setup_irq() [called >from request_irq()]. >Then the following enable_irq() is confused by >desc->depth == 0. > >-- >~Randy From michael.vittrup.larsen@ericsson.com Mon Nov 1 23:55:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Nov 2004 23:55:19 -0800 (PST) Received: from eagle.ericsson.se (eagle.ericsson.se [193.180.251.53]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA27tCkw004604 for ; Mon, 1 Nov 2004 23:55:13 -0800 Received: from esealmw143.al.sw.ericsson.se ([153.88.254.118]) by eagle.ericsson.se (8.12.10/8.12.10/WIREfire-1.8b) with ESMTP id iA27ssR2020434 for ; Tue, 2 Nov 2004 08:54:55 +0100 Received: from esealnt613.al.sw.ericsson.se ([153.88.254.125]) by esealmw143.al.sw.ericsson.se with Microsoft SMTPSVC(6.0.3790.211); Tue, 2 Nov 2004 08:54:54 +0100 Received: from unixmail.ted.dk.eu.ericsson.se (knud.ted.dk.eu.ericsson.se [213.159.188.246]) by esealnt613.al.sw.ericsson.se with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id WB1ZD7FQ; Tue, 2 Nov 2004 08:54:54 +0100 Received: from diadem.ted.dk.eu.ericsson.se (diadem.ted.dk.eu.ericsson.se [213.159.189.76]) by unixmail.ted.dk.eu.ericsson.se (8.10.1/8.10.1/TEDmain-1.0) with ESMTP id iA27sj321903; Tue, 2 Nov 2004 08:54:52 +0100 (MET) X-Sybari-Trust: dc62f736 8cefd49f 03c8e4c8 00000138 From: Michael Vittrup Larsen Organization: Ericsson To: Stephen Hemminger Subject: Re: [PATCH] tcp: efficient port randomisation Date: Tue, 2 Nov 2004 09:54:44 +0200 User-Agent: KMail/1.7 Cc: "David S. Miller" , netdev@oss.sgi.com References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411011058.23141.michael.vittrup.larsen@ericsson.com> <20041101092027.2a741e82@zqx3.pdx.osdl.net> In-Reply-To: <20041101092027.2a741e82@zqx3.pdx.osdl.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Message-Id: <200411020854.44745.michael.vittrup.larsen@ericsson.com> X-OriginalArrivalTime: 02 Nov 2004 07:54:54.0939 (UTC) FILETIME=[3DA822B0:01C4C0B1] Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA27tCkw004604 X-archive-position: 11337 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: michael.vittrup.larsen@ericsson.com Precedence: bulk X-list: netdev Content-Length: 2741 Lines: 55 On Monday 01 November 2004 18:20, Stephen Hemminger wrote: > > * It is probably a good strategy to set 'tcp_rover_next' such that > > the next search is resumed from the previous port found to be free. > > (similar to the old algorithm). I don't see this in your patch, > > but of course I could have missed it. > > It was intentional since it would require holding a lock around the search. > The tradeoff is better SMP performance in the sparsely filled port space > (more typical) vs. better UP performance in the case of a mostly full port > space. I think a typical scenario is many short-lived (e.g. minutes) TCP connections, few long-lived (e.g. hours) connections and an ephemeral port wrap-around probably also in hours - at least a long time compared to the life-time of the short-lived connections. This would result in a closely spaced 'group' of ports being occupied somewhere in the ephemeral port range, and 'tcp_rover_next' would point at the uppermost extreme of this group and thus always guarantee a free port on first try (collisions will only happen with long-lived connections). If you don't update 'tcp_rover_next', and this somehow gets to lag behind this 'group' of ports (say point at the lower extreme) you will need to search through this group first before you enter the unoccupied port space. Your scheme works initially because you do not lag behind the free port space, but eventually you will, and I think this will result in less optimal performance compared to the old behaviour. Since updating the 'tcp_rover_next' practically always result in a free port on first try, I think SMP performance will not suffer even though the lock was held all through the port search (except when the port space is very crowded). And yes, I do use Linux exclusively, so I do care :-)) From a statistically point of view, if the connection life-times are uniformly distributed from zero to infinite (theoretical scenario), it does not matter what starting point you use. However, soon as life-times are not uniformly distributed, this kind of search algorithm will benefit from good starting point defining where the probability of used vs. unused port drop from high to low. The BSD solution with a pure random rover suffers similarly, especially when the port space becomes crowded. > > * connect_port_offset() does not (at least from an algorithm point > > of view) need to return an u32, an u16 is sufficient. > > If it is truncated to u16, then compiler has to take extra effort to > truncate is unnecessary given later modulo operation. I agree (in fact thats what I argued in the draft) - it probably depends on your platform - you are assuming a 32-bit platform I guess. From cchan@outblaze.com Tue Nov 2 00:14:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 00:14:48 -0800 (PST) Received: from corpmail.outblaze.com (corpmail.outblaze.com [203.86.166.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA28Ef2O005383 for ; Tue, 2 Nov 2004 00:14:42 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by corpmail.outblaze.com (Postfix) with ESMTP id EDE8A37BB4; Tue, 2 Nov 2004 08:14:19 +0000 (GMT) Received: from [192.168.2.119] (210-177-227-130.outblaze.com [210.177.227.130]) by corpmail.outblaze.com (Postfix) with ESMTP id 57F0716DD86; Tue, 2 Nov 2004 08:14:17 +0000 (GMT) Message-ID: <418741EB.3080701@outblaze.com> Date: Tue, 02 Nov 2004 16:14:35 +0800 From: Christopher Chan User-Agent: Mozilla Thunderbird 0.8 (X11/20040908) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: Andrew Morton Subject: linux 2.6.9 still having network code problems Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-AntiVirus: checked by Vexira MailArmor (version: 2.0.2-8; VAE: 6.28.0.12; VDF: 6.28.0.47; host: corpmail.outblaze.com) X-archive-position: 11338 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cchan@outblaze.com Precedence: bulk X-list: netdev Content-Length: 4021 Lines: 80 Mr. Morton, I'm ccing you due to the oom-killer stuff. Previously with 2.6.7 I had to use this values in sysctl to be able to continue to access the box: net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.route.gc_thresh = 65536 net.ipv4.route.max_size = 1048576 2.6.9 without this values gave me similar problems with 2.6.7 without the above values. Sample log lines below: There are multiple oom-killer lines (different pid for smtpd process) and the network related messages repeated until the box was rebooted about 45 mins later. Nov 1 03:15:58 spf5-3 kernel: oom-killer: gfp_mask=0x1d2 Nov 1 03:15:58 spf5-3 kernel: DMA per-cpu: Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 2, high 6, batch 1 Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 2, batch 1 Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 2, high 6, batch 1 Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 2, batch 1 Nov 1 03:15:58 spf5-3 kernel: Normal per-cpu: Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 32, high 96, batch 16 Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 32, batch 16 Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 32, high 96, batch 16 Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 32, batch 16 Nov 1 03:15:58 spf5-3 kernel: HighMem per-cpu: Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 16, high 48, batch 8 Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 16, batch 8 Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 16, high 48, batch 8 Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 16, batch 8 Nov 1 03:15:58 spf5-3 kernel: Nov 1 03:15:58 spf5-3 kernel: Free pages: 1264kB (128kB HighMem) Nov 1 03:15:58 spf5-3 kernel: Active:204122 inactive:68 dirty:0 writeback:0 unstable:0 free:316 slab:27673 mapped:204956 pagetables:22623 Nov 1 03:15:58 spf5-3 kernel: DMA free:16kB min:16kB low:32kB high:48kB active:10544kB inactive:0kB present:16384kB Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 Nov 1 03:15:59 spf5-3 kernel: Normal free:1120kB min:936kB low:1872kB high:2808kB active:693760kB inactive:556kB present:901120kB Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 Nov 1 03:15:59 spf5-3 kernel: HighMem free:128kB min:128kB low:256kB high:384kB active:112132kB inactive:152kB present:131072kB Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 Nov 1 03:15:59 spf5-3 kernel: DMA: 0*4kB 0*8kB 1*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 16kB Nov 1 03:15:59 spf5-3 kernel: Normal: 104*4kB 4*8kB 0*16kB 1*32kB 0*64kB 0*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 1248kB Nov 1 03:15:59 spf5-3 kernel: HighMem: 0*4kB 0*8kB 0*16kB 2*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 128kB Nov 1 03:15:59 spf5-3 kernel: Swap cache: add 0, delete 0, find 0/0, race 0+0 Nov 1 03:16:00 spf5-3 kernel: Out of Memory: Killed process 21861 (smtpd). Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at net/ipv4/tcp.c (1348) Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at net/ipv4/tcp.c (1348) Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at net/ipv4/tcp.c (1348) From akpm@osdl.org Tue Nov 2 00:21:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 00:21:41 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA28LWpJ009120 for ; Tue, 2 Nov 2004 00:21:33 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA28L3903210; Tue, 2 Nov 2004 00:21:03 -0800 Date: Tue, 2 Nov 2004 01:19:18 -0800 From: Andrew Morton To: Christopher Chan Cc: netdev@oss.sgi.com Subject: Re: linux 2.6.9 still having network code problems Message-Id: <20041102011918.2b453e21.akpm@osdl.org> In-Reply-To: <418741EB.3080701@outblaze.com> References: <418741EB.3080701@outblaze.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11339 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 4394 Lines: 97 Christopher Chan wrote: > > Mr. Morton, > > I'm ccing you due to the oom-killer stuff. > gee thanks ;) > Previously with 2.6.7 I had to use this values in sysctl to be able to > continue to access the box: > > net.ipv4.tcp_max_syn_backlog = 2048 > net.ipv4.route.gc_thresh = 65536 > net.ipv4.route.max_size = 1048576 Why? > 2.6.9 without this values gave me similar problems with 2.6.7 without > the above values. What problems? > Sample log lines below: > > There are multiple oom-killer lines (different pid for smtpd process) > and the network related messages repeated until the box was rebooted > about 45 mins later. > > Nov 1 03:15:58 spf5-3 kernel: oom-killer: gfp_mask=0x1d2 > Nov 1 03:15:58 spf5-3 kernel: DMA per-cpu: > Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 2, high 6, batch 1 > Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 2, batch 1 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 2, high 6, batch 1 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 2, batch 1 > Nov 1 03:15:58 spf5-3 kernel: Normal per-cpu: > Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 32, high 96, batch 16 > Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 32, batch 16 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 32, high 96, batch 16 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 32, batch 16 > Nov 1 03:15:58 spf5-3 kernel: HighMem per-cpu: > Nov 1 03:15:58 spf5-3 kernel: cpu 0 hot: low 16, high 48, batch 8 > Nov 1 03:15:58 spf5-3 kernel: cpu 0 cold: low 0, high 16, batch 8 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 hot: low 16, high 48, batch 8 > Nov 1 03:15:58 spf5-3 kernel: cpu 1 cold: low 0, high 16, batch 8 > Nov 1 03:15:58 spf5-3 kernel: > Nov 1 03:15:58 spf5-3 kernel: Free pages: 1264kB (128kB HighMem) > Nov 1 03:15:58 spf5-3 kernel: Active:204122 inactive:68 dirty:0 > writeback:0 unstable:0 free:316 slab:27673 mapped:204956 pagetables:22623 You ran out of memory. All your memory is in use by userspace processes. > Nov 1 03:15:58 spf5-3 kernel: DMA free:16kB min:16kB low:32kB high:48kB > active:10544kB inactive:0kB present:16384kB > Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 > Nov 1 03:15:59 spf5-3 kernel: Normal free:1120kB min:936kB low:1872kB > high:2808kB active:693760kB inactive:556kB present:901120kB > Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 > Nov 1 03:15:59 spf5-3 kernel: HighMem free:128kB min:128kB low:256kB > high:384kB active:112132kB inactive:152kB present:131072kB > Nov 1 03:15:59 spf5-3 kernel: protections[]: 0 0 0 > Nov 1 03:15:59 spf5-3 kernel: DMA: 0*4kB 0*8kB 1*16kB 0*32kB 0*64kB > 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 16kB > Nov 1 03:15:59 spf5-3 kernel: Normal: 104*4kB 4*8kB 0*16kB 1*32kB > 0*64kB 0*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 1248kB > Nov 1 03:15:59 spf5-3 kernel: HighMem: 0*4kB 0*8kB 0*16kB 2*32kB 1*64kB > 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 128kB > Nov 1 03:15:59 spf5-3 kernel: Swap cache: add 0, delete 0, find 0/0, > race 0+0 Try mounting some swapspace. > Nov 1 03:16:00 spf5-3 kernel: Out of Memory: Killed process 21861 (smtpd). > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) > failed at net/ipv4/tcp.c (1284) > Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) > failed at net/ipv4/tcp.c (1284) > Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == > tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at > net/ipv4/tcp.c (1348) > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) > failed at net/ipv4/tcp.c (1284) > Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == > tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at > net/ipv4/tcp.c (1348) > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) > failed at net/ipv4/tcp.c (1284) > Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 > Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == > tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at > net/ipv4/tcp.c (1348) This is a networking bug. From cchan@outblaze.com Tue Nov 2 00:38:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 00:38:40 -0800 (PST) Received: from corpmail.outblaze.com (corpmail.outblaze.com [203.86.166.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA28cYnY010010 for ; Tue, 2 Nov 2004 00:38:35 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by corpmail.outblaze.com (Postfix) with ESMTP id 694E037B0C; Tue, 2 Nov 2004 08:38:17 +0000 (GMT) Received: from [192.168.2.119] (210-177-227-130.outblaze.com [210.177.227.130]) by corpmail.outblaze.com (Postfix) with ESMTP id D127516DD83; Tue, 2 Nov 2004 08:38:16 +0000 (GMT) Message-ID: <4187478A.1040002@outblaze.com> Date: Tue, 02 Nov 2004 16:38:34 +0800 From: Christopher Chan User-Agent: Mozilla Thunderbird 0.8 (X11/20040908) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andrew Morton Cc: netdev@oss.sgi.com Subject: Re: linux 2.6.9 still having network code problems References: <418741EB.3080701@outblaze.com> <20041102011918.2b453e21.akpm@osdl.org> In-Reply-To: <20041102011918.2b453e21.akpm@osdl.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-AntiVirus: checked by Vexira MailArmor (version: 2.0.2-8; VAE: 6.28.0.12; VDF: 6.28.0.47; host: corpmail.outblaze.com) X-archive-position: 11340 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cchan@outblaze.com Precedence: bulk X-list: netdev Content-Length: 2422 Lines: 71 >>Previously with 2.6.7 I had to use this values in sysctl to be able to >>continue to access the box: >> >>net.ipv4.tcp_max_syn_backlog = 2048 >>net.ipv4.route.gc_thresh = 65536 >>net.ipv4.route.max_size = 1048576 > > > Why? without these, i get dst cache overflow errors and the similar networking error messages and the box is inaccessible via the network and unusable via serial console. > > >>2.6.9 without this values gave me similar problems with 2.6.7 without >>the above values. > > > What problems? See above. > > > You ran out of memory. All your memory is in use by userspace processes. DOH. the kernel swapped the controller order on me...fstab entries referred to the wrong device names... > > > > Try mounting some swapspace. swapon -a issued :P > > >>Nov 1 03:16:00 spf5-3 kernel: Out of Memory: Killed process 21861 (smtpd). >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>failed at net/ipv4/tcp.c (1284) >>Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>failed at net/ipv4/tcp.c (1284) >>Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>net/ipv4/tcp.c (1348) >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>failed at net/ipv4/tcp.c (1284) >>Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>net/ipv4/tcp.c (1348) >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>failed at net/ipv4/tcp.c (1284) >>Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>net/ipv4/tcp.c (1348) > > > This is a networking bug. > Yes...it's the same one that won't allow me to use the e100 driver with NAPI enabled with or without them sysctl tweaks and the same one that forces me to use the tweaks without NAPI enabled for the e100 driver. With NAPI enabled, I see the problem when under pressure. FYI, the 2.6.9 kernel is running with NAPI enabled. From akpm@osdl.org Tue Nov 2 00:43:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 00:43:34 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA28hSaJ010664 for ; Tue, 2 Nov 2004 00:43:29 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA28h3905812; Tue, 2 Nov 2004 00:43:03 -0800 Date: Tue, 2 Nov 2004 01:41:19 -0800 From: Andrew Morton To: Christopher Chan Cc: netdev@oss.sgi.com Subject: Re: linux 2.6.9 still having network code problems Message-Id: <20041102014119.1a6096cc.akpm@osdl.org> In-Reply-To: <4187478A.1040002@outblaze.com> References: <418741EB.3080701@outblaze.com> <20041102011918.2b453e21.akpm@osdl.org> <4187478A.1040002@outblaze.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11341 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 364 Lines: 11 Christopher Chan wrote: > > DOH. the kernel swapped the controller order on me...fstab entries > referred to the wrong device names... Eh? That shouldn't happen. Could you please generate a full report of this, send it to the appropriate list and cc myself? Although if that's the 2.6.9 behaviour it's probably a bit late to fix it up. From herbert@gondor.apana.org.au Tue Nov 2 03:27:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 03:27:27 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2BRH4J021552 for ; Tue, 2 Nov 2004 03:27:18 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1COwoR-00031W-00; Tue, 02 Nov 2004 22:26:55 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1COwoN-0002IO-00; Tue, 02 Nov 2004 22:26:51 +1100 Date: Tue, 2 Nov 2004 22:26:51 +1100 To: "David S. Miller" , netdev@oss.sgi.com Subject: [NET] Fix neighbour tbl->entries race Message-ID: <20041102112651.GA8633@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="OgqxwSJOaUobr8KG" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11342 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 3348 Lines: 122 --OgqxwSJOaUobr8KG Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: This patch turns neigh_table's entries counter into an atomic_t. This is needed since tbl->entries is updated with no locks held. This is no big deal in practice since it'll be off by a few entries at most which is way less than any of the neighbour thresholds. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --OgqxwSJOaUobr8KG Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== include/net/neighbour.h 1.24 vs edited ===== --- 1.24/include/net/neighbour.h 2004-10-22 14:51:12 +10:00 +++ edited/include/net/neighbour.h 2004-11-02 22:21:41 +11:00 @@ -189,7 +189,7 @@ struct timer_list gc_timer; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; - int entries; + atomic_t entries; rwlock_t lock; unsigned long last_rand; struct neigh_parms *parms_list; ===== net/core/neighbour.c 1.54 vs edited ===== --- 1.54/net/core/neighbour.c 2004-10-06 04:37:37 +10:00 +++ edited/net/core/neighbour.c 2004-11-02 22:23:18 +11:00 @@ -254,18 +254,20 @@ { struct neighbour *n = NULL; unsigned long now = jiffies; + int entries; - if (tbl->entries > tbl->gc_thresh3 || - (tbl->entries > tbl->gc_thresh2 && + entries = atomic_inc_return(&tbl->entries) - 1; + if (entries >= tbl->gc_thresh3 || + (entries >= tbl->gc_thresh2 && time_after(now, tbl->last_flush + 5 * HZ))) { - if (!neigh_forced_gc(tbl) && - tbl->entries > tbl->gc_thresh3) - goto out; + neigh_forced_gc(tbl); + if (atomic_read(&tbl->entries) > tbl->gc_thresh3) + goto out_entries; } n = kmem_cache_alloc(tbl->kmem_cachep, SLAB_ATOMIC); if (!n) - goto out; + goto out_entries; memset(n, 0, tbl->entry_size); @@ -281,12 +283,15 @@ NEIGH_CACHE_STAT_INC(tbl, allocs); neigh_glbl_allocs++; - tbl->entries++; n->tbl = tbl; atomic_set(&n->refcnt, 1); n->dead = 1; out: return n; + +out_entries: + atomic_dec(&tbl->entries); + goto out; } static struct neighbour **neigh_hash_alloc(unsigned int entries) @@ -427,7 +432,7 @@ write_lock_bh(&tbl->lock); - if (tbl->entries > (tbl->hash_mask + 1)) + if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1)) neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1); hash_val = tbl->hash(pkey, dev) & tbl->hash_mask; @@ -608,7 +613,7 @@ NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); neigh_glbl_allocs--; - neigh->tbl->entries--; + atomic_dec(&neigh->tbl->entries); kmem_cache_free(neigh->tbl->kmem_cachep, neigh); } @@ -1394,7 +1399,7 @@ del_timer_sync(&tbl->proxy_timer); pneigh_queue_purge(&tbl->proxy_queue); neigh_ifdown(tbl, NULL); - if (tbl->entries) + if (atomic_read(&tbl->entries)) printk(KERN_CRIT "neighbour leakage\n"); write_lock(&neigh_tbl_lock); for (tp = &neigh_tables; *tp; tp = &(*tp)->next) { @@ -1951,7 +1956,7 @@ seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx " "%08lx %08lx %08lx %08lx\n", - tbl->entries, + atomic_read(&tbl->entries), st->allocs, st->destroys, --OgqxwSJOaUobr8KG-- From jgarzik@pobox.com Tue Nov 2 04:48:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 04:48:28 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2CmJwR026913 for ; Tue, 2 Nov 2004 04:48:20 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1COy4u-0003TB-2d; Tue, 02 Nov 2004 12:48:00 +0000 Message-ID: <418781EF.7020100@pobox.com> Date: Tue, 02 Nov 2004 07:47:43 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Linux Kernel , Netdev CC: YOSHIFUJI Hideaki , Andrew Morton , "David S. Miller" Subject: IPv6 dead in -bk11 Content-Type: multipart/mixed; boundary="------------090906050700040108000402" X-archive-position: 11343 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 24377 Lines: 468 This is a multi-part message in MIME format. --------------090906050700040108000402 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit IPv6 works 100% for my workstations in 2.6.10-rc2-bk2, but fails in 2.6.10-rc2-bk11: [jgarzik@sata g]$ ping6 www.kame.net connect: Network is unreachable 100% reproducible on multiple machines (x86, x86-64). Fedora Core 2 userland. The only difference is the kernel, no configuration differences account for this. dmesg and config are attached, but IMO are unlikely to be helpful. Did someone break the IPv6 routing code or something, perhaps? I'll narrow down which -bk snapshot broke IPv6 later on today... Jeff --------------090906050700040108000402 Content-Type: text/plain; name="dmesg.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="dmesg.txt" Linux version 2.6.10-rc1-bk11 (jgarzik@sata.yyz.us) (gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)) #1 SMP Tue Nov 2 07:35:27 EST 2004 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009e000 (usable) BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved) BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000003fff0000 (usable) BIOS-e820: 000000003fff0000 - 0000000040000000 (reserved) BIOS-e820: 00000000fec00000 - 0000000100000000 (reserved) Warning only 896MB will be used. Use a HIGHMEM enabled kernel. 896MB LOWMEM available. found SMP MP-table at 000f8d90 On node 0 totalpages: 229376 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 225280 pages, LIFO batch:16 HighMem zone: 0 pages, LIFO batch:1 DMI 2.3 present. ACPI: RSDP (v000 COMPAQ ) @ 0x000e9e10 ACPI: RSDT (v001 COMPAQ CPQ0063 0x20031217 0x00000000) @ 0x000e5640 ACPI: FADT (v001 COMPAQ CANTERW 0x00000001 0x00000000) @ 0x000e56ec ACPI: SSDT (v001 COMPAQ PROJECT 0x00000001 MSFT 0x0100000e) @ 0x000e6579 ACPI: MADT (v001 COMPAQ CANTERW 0x00000001 0x00000000) @ 0x000e5760 ACPI: ASF! (v016 COMPAQ CANTERW 0x00000001 0x00000000) @ 0x000e57c8 ACPI: DSDT (v001 COMPAQ DSDT 0x00000001 MSFT 0x0100000e) @ 0x00000000 ACPI: PM-Timer IO Port: 0xf808 ACPI: Local APIC address 0xfee00000 ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled) Processor #0 15:2 APIC version 20 ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled) Processor #1 15:2 APIC version 20 ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1]) ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1]) ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0]) IOAPIC[0]: apic_id 1 already used, trying 2 IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23 ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) ACPI: IRQ0 used by override. ACPI: IRQ2 used by override. ACPI: IRQ9 used by override. Enabling APIC mode: Flat. Using 1 I/O APICs Using ACPI (MADT) for SMP configuration information Built 1 zonelists Kernel command line: ro root=LABEL=/ nogui Initializing CPU#0 PID hash table entries: 4096 (order: 12, 65536 bytes) Detected 2395.070 MHz processor. Using pmtmr for high-res timesource Console: colour VGA+ 80x25 Dentry cache hash table entries: 131072 (order: 7, 524288 bytes) Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) Memory: 904796k/917504k available (2535k kernel code, 12164k reserved, 804k data, 192k init, 0k highmem) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay loop... 4734.97 BogoMIPS (lpj=2367488) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 CPU: Trace cache: 12K uops, L1 D cache: 8K CPU: L2 cache: 512K CPU: Physical Processor ID: 0 CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. CPU0: Intel P4/Xeon Extended MCE MSRs (12) available CPU0: Thermal monitoring enabled Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Checking 'hlt' instruction... OK. CPU0: Intel(R) Pentium(R) 4 CPU 2.80GHz stepping 09 per-CPU timeslice cutoff: 1462.31 usecs. task migration cache decay timeout: 2 msecs. Booting processor 1/1 eip 3000 Initializing CPU#1 Calibrating delay loop... 4784.12 BogoMIPS (lpj=2392064) CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 CPU: Trace cache: 12K uops, L1 D cache: 8K CPU: L2 cache: 512K CPU: Physical Processor ID: 0 CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#1. CPU1: Intel P4/Xeon Extended MCE MSRs (12) available CPU1: Thermal monitoring enabled CPU1: Intel(R) Pentium(R) 4 CPU 2.80GHz stepping 09 Total of 2 processors activated (9519.10 BogoMIPS). ENABLING IO-APIC IRQs ..TIMER: vector=0x31 pin1=2 pin2=-1 checking TSC synchronization across 2 CPUs: passed. Brought up 2 CPUs CPU0: domain 0: span 3 groups: 1 2 domain 1: span 3 groups: 3 CPU1: domain 0: span 3 groups: 2 1 domain 1: span 3 groups: 3 checking if image is initramfs...it isn't (no cpio magic); looks like an initrd Freeing initrd memory: 137k freed NET: Registered protocol family 16 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20040816 ACPI: Interpreter enabled ACPI: Using IOAPIC for interrupt routing ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 10 *11 14 15) ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 *5 6 7 10 11 14 15) ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 7 *10 11 14 15) ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 10 *11 14 15) ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 10 *11 14 15) ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 *5 6 7 10 11 14 15) ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 10 *11 14 15) ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1 PCI: Transparent bridge - 0000:00:1e.0 ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.HUB_._PRT] SCSI subsystem initialized usbcore: registered new driver usbfs usbcore: registered new driver hub PCI: Using ACPI for IRQ routing ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1f.2[A] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 ACPI: PCI interrupt 0000:01:00.0[A] -> GSI 20 (level, low) -> IRQ 209 ACPI: PCI interrupt 0000:05:02.0[A] -> GSI 17 (level, low) -> IRQ 201 ACPI: PCI interrupt 0000:05:0a.0[A] -> GSI 21 (level, low) -> IRQ 217 Machine check exception polling timer started. Initializing Cryptographic API ACPI: Power Button (FF) [PWRF] ACPI: Processor [CPU0] (supports C1, 8 throttling states) ACPI: Processor [CPU1] (supports C1, 8 throttling states) Real Time Clock Driver v1.12 Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected an Intel i875 Chipset. agpgart: Maximum main memory to use for agp memory: 816M agpgart: AGP aperture is 256M @ 0xe0000000 serio: i8042 AUX port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing enabled ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A io scheduler noop registered io scheduler anticipatory registered io scheduler deadline registered io scheduler cfq registered elevator: using anticipatory as default io scheduler Floppy drive(s): fd0 is 1.44M FDC 0 is a post-1991 82077 RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize Universal TUN/TAP device driver 1.5 (C)1999-2002 Maxim Krasnyansky Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx ICH5: IDE controller at PCI slot 0000:00:1f.1 PCI: Enabling device 0000:00:1f.1 (0005 -> 0007) ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ICH5: chipset revision 2 ICH5: not 100% native mode: will probe irqs later ide0: BM-DMA at 0x24c0-0x24c7, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0x24c8-0x24cf, BIOS settings: hdc:DMA, hdd:pio Probing IDE interface ide0... hda: MAXTOR 6L080J4, ATA DISK drive ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 Probing IDE interface ide1... hdc: HL-DT-ST CD-ROM GCR-8480B, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 hda: max request size: 128KiB hda: 156301488 sectors (80026 MB) w/1819KiB Cache, CHS=65535/16/63, UDMA(100) hda: cache flushes supported hda: hda1 hda2 hda3 hda4 < hda5 hda6 > hdc: ATAPI 48X CD-ROM drive, 128kB Cache, DMA Uniform CD-ROM driver Revision: 3.20 ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ehci_hcd 0000:00:1d.7: EHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 193, pci mem 0xf0500000 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 8 ports detected USB Universal Host Controller Interface driver v2.2 hub 1-0:1.0: over-current change on port 7 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 uhci_hcd 0000:00:1d.0: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 169, io base 0x2440 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 uhci_hcd 0000:00:1d.1: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 177, io base 0x2460 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 uhci_hcd 0000:00:1d.2: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.2 to 64 uhci_hcd 0000:00:1d.2: irq 185, io base 0x2480 uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected Initializing USB Mass Storage driver... usbcore: registered new driver usb-storage USB Mass Storage support registered. mice: PS/2 mouse device common for all mice input: AT Translated Set 2 keyboard on isa0060/serio0 input: ImPS/2 Generic Wheel Mouse on isa0060/serio1 input: PC Speaker NET: Registered protocol family 26 NET: Registered protocol family 2 IP: routing cache hash table of 8192 buckets, 64Kbytes TCP: Hash tables configured (established 262144 bind 65536) Initializing IPsec netlink socket NET: Registered protocol family 1 NET: Registered protocol family 10 IPv6 over IPv4 tunneling driver NET: Registered protocol family 17 NET: Registered protocol family 15 p4-clockmod: P4/Xeon(TM) CPU On-Demand Clock Modulation available ACPI: (supports S0 S1 S3 S4 S5) ACPI wakeup devices: PCI0 HUB COM1 COM2 USB1 USB2 USB3 USB4 EUSB PBTN BIOS EDD facility v0.16 2004-Jun-25, 3 devices found RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). libata version 1.02 loaded. ata_piix version 1.02 ACPI: PCI interrupt 0000:00:1f.2[A] -> GSI 18 (level, low) -> IRQ 185 PCI: Setting latency timer of device 0000:00:1f.2 to 64 ata1: SATA max UDMA/133 cmd 0x24F0 ctl 0x280A bmdma 0x24D0 irq 185 ata2: SATA max UDMA/133 cmd 0x24F8 ctl 0x280E bmdma 0x24D8 irq 185 ata1: dev 0 cfg 49:2f00 82:74eb 83:7fea 84:4023 85:74e9 86:3c02 87:4023 88:203f ata1: dev 0 ATA, max UDMA/100, 160836480 sectors: lba48 ata1: dev 0 configured for UDMA/100 scsi0 : ata_piix ata2: SATA port has no device. scsi1 : ata_piix Vendor: ATA Model: HDS722580VLSA80 Rev: V32O Type: Direct-Access ANSI SCSI revision: 05 SCSI device sda: 160836480 512-byte hdwr sectors (82348 MB) SCSI device sda: drive cache: write back sda: sda1 Attached scsi disk sda at scsi0, channel 0, id 0, lun 0 Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0, type 0 sata_sil version 0.54 ACPI: PCI interrupt 0000:05:0a.0[A] -> GSI 21 (level, low) -> IRQ 217 ata3: SATA max UDMA/100 cmd 0xF8848080 ctl 0xF884808A bmdma 0xF8848000 irq 217 ata4: SATA max UDMA/100 cmd 0xF88480C0 ctl 0xF88480CA bmdma 0xF8848008 irq 217 ata3: dev 0 cfg 49:2f00 82:7c6b 83:7f09 84:4003 85:7c69 86:3e01 87:4003 88:407f ata3: dev 0 ATA, max UDMA/133, 488281250 sectors: lba48 ata3: dev 0 configured for UDMA/100 scsi2 : sata_sil ata4: no device found (phy stat 00000000) scsi3 : sata_sil Vendor: ATA Model: Maxtor 6Y250M0 Rev: YAR5 Type: Direct-Access ANSI SCSI revision: 05 SCSI device sdb: 488281250 512-byte hdwr sectors (250000 MB) SCSI device sdb: drive cache: write back sdb: sdb1 Attached scsi disk sdb at scsi2, channel 0, id 0, lun 0 Attached scsi generic sg1 at scsi2, channel 0, id 0, lun 0, type 0 kjournald starting. Commit interval 5 seconds EXT3-fs: mounted filesystem with ordered data mode. Freeing unused kernel memory: 192k freed EXT3 FS on hda5, internal journal Adding 1020592k swap on /dev/hda2. Priority:-1 extents:1 kjournald starting. Commit interval 5 seconds EXT3 FS on sda1, internal journal EXT3-fs: mounted filesystem with ordered data mode. kjournald starting. Commit interval 5 seconds EXT3 FS on hda3, internal journal EXT3-fs: mounted filesystem with ordered data mode. ip_tables: (C) 2000-2002 Netfilter core team Disabled Privacy Extensions on device c03f5880(lo) tg3.c:v3.11 (October 20, 2004) ACPI: PCI interrupt 0000:05:02.0[A] -> GSI 17 (level, low) -> IRQ 201 eth0: Tigon3 [partno(BCM95700A6) rev 3002 PHY(5705)] (PCI:33MHz:32-bit) 10/100/1000BaseT Ethernet 00:30:6e:4c:04:ac eth0: RXcsums[1] LinkChgREG[0] MIirq[0] ASF[0] Split[0] WireSpeed[0] TSOcap[1] ip_tables: (C) 2000-2002 Netfilter core team tg3: eth0: Link is up at 1000 Mbps, full duplex. tg3: eth0: Flow control is on for TX and on for RX. Intel 810 + AC97 Audio, version 1.01, 07:31:33 Nov 2 2004 ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 PCI: Setting latency timer of device 0000:00:1f.5 to 64 i810: Intel ICH5 found at IO 0x2400 and 0x2000, MEM 0xf0500400 and 0xf0500600, IRQ 201 i810: Intel ICH5 mmio at 0xf8852400 and 0xf8860600 i810_audio: Primary codec has ID 0 i810_audio: Audio Controller supports 6 channels. i810_audio: Defaulting to base 2 channel mode. i810_audio: Resetting connection 0 i810_audio: Connection 0 with codec id 0 ac97_codec: AC97 Audio codec, id: ADS116 (Unknown) i810_audio: AC'97 codec 0 supports AMAP, total channels = 2 --------------090906050700040108000402 Content-Type: application/x-bzip2; name="config.txt.bz2" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="config.txt.bz2" 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 IiA= --------------090906050700040108000402-- From yoshfuji@linux-ipv6.org Tue Nov 2 05:53:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 05:53:15 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2Dr7h5029323 for ; Tue, 2 Nov 2004 05:53:07 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id B5C1E33CE5; Tue, 2 Nov 2004 22:53:45 +0900 (JST) Date: Tue, 02 Nov 2004 22:53:43 +0900 (JST) Message-Id: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> To: jgarzik@pobox.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, davem@davemloft.net, yoshfuji@linux-ipv6.org Subject: Re: IPv6 dead in -bk11 From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <418781EF.7020100@pobox.com> References: <418781EF.7020100@pobox.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11344 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 447 Lines: 19 In article <418781EF.7020100@pobox.com> (at Tue, 02 Nov 2004 07:47:43 -0500), Jeff Garzik says: > > IPv6 works 100% for my workstations in 2.6.10-rc2-bk2, but fails in > 2.6.10-rc2-bk11: > > [jgarzik@sata g]$ ping6 www.kame.net > connect: Network is unreachable Please send me: % ifconfig -a % netstat -nr --inet6 % ip -6 addr % ip -6 route % ip -6 neigh Thanks. --yoshfuji @ still trying to debug refcnt etc.... From yoshfuji@linux-ipv6.org Tue Nov 2 06:01:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 06:01:24 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2E1He2029922 for ; Tue, 2 Nov 2004 06:01:18 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id C23C933CE5; Tue, 2 Nov 2004 23:01:56 +0900 (JST) Date: Tue, 02 Nov 2004 23:01:56 +0900 (JST) Message-Id: <20041102.230156.71928163.yoshfuji@linux-ipv6.org> To: jgarzik@pobox.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, davem@davemloft.net, yoshfuji@linux-ipv6.org Subject: Re: IPv6 dead in -bk11 From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> References: <418781EF.7020100@pobox.com> <20041102.225343.06193184.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 11345 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 644 Lines: 24 In article <20041102.225343.06193184.yoshfuji@linux-ipv6.org> (at Tue, 02 Nov 2004 22:53:43 +0900 (JST)), YOSHIFUJI Hideaki / 吉藤英明 says: > In article <418781EF.7020100@pobox.com> (at Tue, 02 Nov 2004 07:47:43 -0500), Jeff Garzik says: > > > > > IPv6 works 100% for my workstations in 2.6.10-rc2-bk2, but fails in > > 2.6.10-rc2-bk11: > > > > [jgarzik@sata g]$ ping6 www.kame.net > > connect: Network is unreachable > > Please send me: > % ifconfig -a > % netstat -nr --inet6 > % ip -6 addr > % ip -6 route > % ip -6 neigh and, % grep 6_ /proc/slabinfo Thanks. --yoshfuji From hadi@cyberus.ca Tue Nov 2 06:14:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 06:14:14 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2EE80U030575 for ; Tue, 2 Nov 2004 06:14:08 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1COzPx-0002Go-0H for netdev@oss.sgi.com; Tue, 02 Nov 2004 09:13:49 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1COzPt-00050Q-Oi; Tue, 02 Nov 2004 09:13:45 -0500 Subject: Re: [NET] Fix neighbour tbl->entries race From: jamal Reply-To: hadi@cyberus.ca To: Herbert Xu Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <20041102112651.GA8633@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099404823.1021.15.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 02 Nov 2004 09:13:43 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11346 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 823 Lines: 29 On Tue, 2004-11-02 at 06:26, Herbert Xu wrote: > Hi Dave: > > This patch turns neigh_table's entries counter into an atomic_t. This > is needed since tbl->entries is updated with no locks held. This is > no big deal in practice since it'll be off by a few entries at most > which is way less than any of the neighbour thresholds. > Is this still the same logic: ------------- - if (!neigh_forced_gc(tbl) && - tbl->entries > tbl->gc_thresh3) - goto out; + neigh_forced_gc(tbl); + if (atomic_read(&tbl->entries) > tbl->gc_thresh3) + goto out_entries; ------- In previous code it seems you should short-circuit if neigh_forced_gc(tbl) returns non-zero. why do you have to break that if statement? cheers, jamal From jgarzik@pobox.com Tue Nov 2 07:17:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 07:17:35 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2FHSfu000354 for ; Tue, 2 Nov 2004 07:17:28 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CP0PF-0007Tv-O4; Tue, 02 Nov 2004 15:17:10 +0000 Message-ID: <4187A4E3.8010600@pobox.com> Date: Tue, 02 Nov 2004 10:16:51 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: YOSHIFUJI Hideaki CC: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, davem@davemloft.net Subject: Re: IPv6 dead in -bk11 References: <418781EF.7020100@pobox.com> <20041102.225343.06193184.yoshfuji@linux-ipv6.org> In-Reply-To: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> Content-Type: multipart/mixed; boundary="------------040207000109040401090605" X-archive-position: 11347 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 6128 Lines: 112 This is a multi-part message in MIME format. --------------040207000109040401090605 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit YOSHIFUJI Hideaki / wrote: > In article <418781EF.7020100@pobox.com> (at Tue, 02 Nov 2004 07:47:43 -0500), Jeff Garzik says: > > >>IPv6 works 100% for my workstations in 2.6.10-rc2-bk2, but fails in >>2.6.10-rc2-bk11: >> >> [jgarzik@sata g]$ ping6 www.kame.net >> connect: Network is unreachable > > > Please send me: > % ifconfig -a > % netstat -nr --inet6 > % ip -6 addr > % ip -6 route > % ip -6 neigh > > Thanks. > > --yoshfuji @ still trying to debug refcnt etc.... Done, see attached. ipv6/working/* is 2.6.10-rc1-bk2, and ipv6/dead/* is 2.6.10-rc1-BK-current. Jeff --------------040207000109040401090605 Content-Type: application/x-bzip2; name="ipv6-output.tar.bz2" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="ipv6-output.tar.bz2" QlpoOTFBWSZTWVsMlwUAI1N/3P//wjb8Z//1P//fyP////gEAAACIAACBgAIYBJ+e+0WeJEQ ndJBbLdveecWrXZvTruvYztd7uvdu9Vdj3nuqklUTvbTmmpSQCSmqeRomptT0ZTyRqNPUGgD QGQbUAAAABoADyglAmgRNEJ6pk0aAAZAANA0AAAB6Q0AAcDQNANA0NABoZDTQA00A0AAZDEA BoJCQRJlJ+hNNJ6mmjRo0A0ADINAAAAAAACKQRoCJkATVP0p+mST8kQDR+pGEaB6nqAepptR 6nqaABgVJE0IBDIk/QIk1D9U9R6mPUTMpoA0GgZPUBo9QYIB858iuf9AeykHaB3sBMqQ3KxI CAAi8EF6VIAO/u7oi0pxPviRS4AqDiwK18xX2yoZqS98iSSstLX5DWXVTCAEUJJgkB9JuSWV BURQFRESXqCVVUVUBAhBAwQgSgBZMIsoVMvYaFKnpLY+ZophZ9KkuoZJknc6LJkUf5Mew5tr NwUW3msSZs2RdSiOCiPu0iypHSgYSVGqGYUiCG1k5OLiw0GBRV0VhAEThPeLiaoohVSZYLiG HGQ8sooN20jhI735caSvMxjo5l4YsYyXto4zLxWIXY1WXVXq1K1OJ3ip03StArD3UlyiS1Vc Uqyt6J9GILOxcVWHHAyWy+Fri0WzhgxIuCbLZsYrS9JpkWwqqiioqQDKKKYwvG2KZWapUQlJ GcVCg85ml9L3uzSo23EucEAvY0oPxEWjewjY2SSOEajI2QQRxjkRGARDUZBtuMiHHExszaF7 1M9ucRPjEkqWJfawurimWzVU0eBazs9X2e60poGlSmj1nKQypF4WdJlxlph0Z9B71tSFJGvh ZgosUChVxqSQ0EaVipPZE0re8lhtY2X0LhhqmSQxZ325vWFG2x7b3vh2u4ZqMkMZtM6YsPGM vRtrDI8MRpmqHnWIorRwADbtQggK6SIkiRqwlQlMigo9LJCRxcwEBYWxXOI0FFNGyGfvO5xY XSmdDXlfkEW6ZJliL73fVTgLYFRVf7WNo1diPy7W0zRdhBDu7WWOdegptdm14dwvbbiyV6js nUJpNSbu9Z40hXo4tKrCmwtE/Pfx/Wx2ejXjkLnaNixAoe2Ime+RBZQ4YO8AOlxV3UwwC81K vbN656SvLpJWVFCMHTutL1jGmL6JJXQgKEMtdQpQ2IT62lmcVBpEFRhRGdNCkziiJmQjMgFW MZI3HOfvPlP0lxoWDE6hoZqE3i9iHlNDIqXcYLHyVlU7GPV6ke8lGs6qMpCpzUCaqO+SoPyQ oshSQJDzuZsBmg1sMlQlYiQJQhcmFFeTGBBhhiGAhQiFQ7thumZTJylvIiKiqkhMaGxwZrLH 1t+Y6tDi72rz3KzZM06qPZOzcun0vJ3ubNTCdycjpJZCj/QlJ2tNFXspTvZrLMlPVk1Zk7Hx puIuxp09cm3GL4pHvh1aymbrvGacj1lLNqbCNWxJO5VeJvQ/k2va2k7yaLmsZPkptOM3EGgq tfmJCq3D6N+AB3wBOE34Y5SlKkhXWF34FmiC6QdyacIxI6JH0mpIk2pRVrFU/TbHm7RSnuUn GnFSMk8b4tk6+G3v/W64xjGMZdeHXtbilFiLFFFG5TKTPNttttuJcQLdv1m/WBYiEjrjNgL3 wpIN0IQQopAQzKEGxTB6ylSbOS256ZTyq+ClqmZN2KwjiIA9YouFJUMKhIrKiOqIEOnZhdh2 H6fneiuy+x6cXnjLE0wdmtUIOzqFsjJM3NkQ601xgm2M2O865q7RrEIBn2vUIMsZKUJax5eW TNxRaTzM05Sg49OiqUXTcomjNZNH9BSyh2Epyzgl/S9rLKheJFxminkKgPr9n87gessfEfbI GZQsQofd+X6p/AnOc/V6rhNrCsA2kC82guYQJQpu6pNGg8R0jplgVr1bNnYpmqbHa1rC5i4s lhLxRQCg0BkCCGUYzjus65NguaHOC+7bq3BjbaYxxl5c62sOozRUvA0JnvEF2JtJLrKE8vUw CepQmqjIr2aiHXOwGfSzNvfpMuDEDt36sm4nB8tIXRgMS9rVUhaxbobr6JykBld3GMG45N2F YOLZYxjvhKtZGvMpJWJZkqa4iDwz0vw7ulb6YOc+VLIpLaThKlmdnhmc3Ptk28eC2iSaTCcB QBgNGShoLmjm+Wa9NGMTNVbmto0ZYsRhTVSGmXLR5Sa0Cl9iTrJoxU87hD2gQAqO7rBJnNKg trc2Su9frIHOCjBVWlszNJZaQOwaOD49dvKXGFNGGgOe9nBrsY3NIiixtoaGKHPOi2TOL73C 9u8vEFctnB87YUlE8GmLx7GnDj28fHzx7NN17TIpzKcooolDhSdyDI+FqbAkml44pJhuiZRE tMqkLlbsVWM7qv6G5SltTG/x865ZdKg3Jbz0vvjRUzcOmAb2uPsV3GNlM3GpGVEsoqHIfeML FMasjyV0J2wAlyiUJtWM6bG/BGTVxEuDFb0TPFk7Pddd1c5u48npz3dzaTPJGRm21x28HT4p xduXS2HKKuTZuuWKxukgPbB8mLchop03MywIexwWrcH32yIEoqQi3OQ6wcDpFTJUQQ0x1zIj eVFy4zGrTnVw1vVNchI868cChlJ60gHmqysVqJvaAmZMCQQFJS8Ra5aUeEoUwpdIvvDJMIiL Y5jpzeMiIKlURi9eNHejVgukJtoGor0RmHmM4aTBsIKCcQTpVsmybbJqg6pphaOA1B660FrK bjpUPfxQvGxYslFh1YF1fgXYHGabuJu+iR2zM4pI4yVm+/RD38GLsbHwpJZrFuMsIjeoOA3r 1Ijc0CvghgNnQHRfszsyQ0bjBZyL6SU56Wj26W1prfHN0tsmDp6DRRXlos1ovABGZervCCkI nTHFAcQNTJd5Mssl4L7+kQVz7Los37bFnO+FImgNBXo5HxBlgJIGdmwpGN0TutoULzbldkcY gUaXIucrjsnMKxfceC09SaM+JK+z6cMGjdBJE7x3tZWLQ3QKd4lkaYZh+Z9bImuGhLCubhoA vli6p4dHupjCkNy07UkpZaUtw2Nsu2r+cmgbi6D8mVFbCmLhsVEHeyTLO/U5ZxVuVlTuiGj1 5oHcDXBw6ZsIkUDYbkIS6FGgzRmzMmcMSmnlErVqWMUnAwk0RSuvIVtGCD5lVUTUR2Skshvt VdX0oj8sLLQKXU171X5WjMpvWFILLkFZuhV+tTkjilyWUdaSfR85o+hou3PAkkb1XmGg2D8A AeAMDuPOe4NhO4sWNgll34C1K7kZtHaUpT+IxYu+C5+NvJYoLBYI4hJj7/pOGUPpP2n6zsvE 4zlOwmDY0DNYuinq+w0KUpmnkzWdUp0DvaNh3QJ8fR9fo5S+JxPzh0h/H1o5n8g9g+QC8NT1 kHoJy465QDh4dxwZkLIbJSe03QylDxlpAw3jCB9DDCn8DNzKlz761nNtNH0H7izDpEofUoO8 4mpwf5v9jJ+A8i7MWNE8zq2m0lO24slv6htPVMkzT6kfElHJ/PmcgwHCHAvfNS6Y222NNttu ur7Xfdfr/t588ILs/fqkdeOt46jRPyRfTHwu2lNbxz5db9UnVRd+9vM7HJ52/dluHPjYE2Nh a7X4Yub9+k37Dtjn0E5tS52OStt1y5boaa83Nyq71Vc4v9s++cIkjwE271ADnswCaisl2CZv FpEc0Gx2k+DGJH5Gxh70emLQGZQ6MDEg0dn96jPEYdp4WG9W+hSVB9Qr0yx7zRm7bPjAcOW9 6M5jjOzZ2v729ZSzM8DaeMgw+ITU84c1wqvDxyZLQJCiEmCZ13txJ1bmlRJaRoTe9pSzJPMm /w+PZeq3ILMk3J8F9qbXBUR40g8qYifUsTb8ydBqP2B34YhKDKuLi5RyR1UJLYHxG6ceTjnU kQEB40VdxE7wqAZIehdeMgmSRb+dtnaI04T0DhsJwjOEs9zip0mlQtSNalqOyi9du9hDmp4p +hE8Hi6pJuSmEpjeM9lt/k4ojmFNhZYlLVajOWYMkI9wqzHuByR3J2OA16JubPDaudij2J83 d05z9J0XTeDUHAnsnqbBNhCgurF4MXcnB7xGpvUNFPfKkaSJ7xgmGY3wPRwRrPvLnadH4Sw+ VUH7TZnnOr2hdNp+Wu5tbZqlRmfOpYuTl8FLmZtM3q7lipuHyKT68yyPEO2RBC/6FenylGxH akTJfSOpBzRJaUI4KKBJqUsYMq+PTcHUdKgZUHgmPcZ3nIZPtCvDZX17RDwa8QPKBiZusrnV S7BkYugljELmDck8UEUi0Zf5n0Z92H9v6NqTyyb5ciwUTX3pWbD5HJCxpL/yvGcgeUVvDsRg bwkQZvgeVoLouDd1ly6qIERsmrHYuhAEP9O73YZvaEado1FQlWdwNy/DfsMRvcyZAwOhAp+w 8xj9TPvdx5tsomc1OLcvteGE9VGCWwvQaIu0yKkpLGQsk5cGev3mqtUttyrYv6NY8VLwfKwt NCob6RTnYU2b3swDRK5/ccZm6uo3UR7PbBkFbcO+9+GPppGHONI5TeByHMK6uoQVA1fxs2Cb 9wON+I+/JkTZq8m/KNPgsnBO4na4rviTTO8t8VNCXdnTLVpKJxJi3Tf1s8PtORxFnpS/AHUa Tklx0EK7TYXce05CLGpXPUlznJOTkRvMkoUlFrS3LclTljTd3kZmg0Mt40OBsBiVUC8dt9Vz czVaag3gBJdQ0yay4LxkMKpiDAZuAsUFZiWtZf1tISc4Sjmo7kwTQsS9qilKTh8cRhdU4E37 R2+g+H1/H4RKdRy6CXFDpkPdM44EeCySi41FV7+06QbjfI7UHEJ4HQGHSrylTWVn7SeZ3Vks p1Mlj3Lis3RgwTR7Xpi5bLMBwbsB22syunFrTV+oTYJn+N3Y4liptKpGBwF+CgWaRIW83ouo qtzaQ+wHBF8ZyuRwOQHeJVmZtS8VWcEC8xAWB2QaSPnVgeHNF+QeNQ8pMNPmG4vGgkA7jPLx INTZdh0rnfMrizMNsYNRCB29Nszl4QclG4V6lV+gXckU4UJBbDJcFA== --------------040207000109040401090605-- From johnpol@2ka.mipt.ru Tue Nov 2 07:56:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 07:56:35 -0800 (PST) Received: from mailer.campus.mipt.ru (mailer.campus.mipt.ru [194.85.82.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2FuPW4003233 for ; Tue, 2 Nov 2004 07:56:25 -0800 Received: from ffke-campus-gw.mipt.ru (2ka [194.85.82.65]) by mailer.campus.mipt.ru (8.13.1/8.13.1) with ESMTP id iA2Fu4IV032013; Tue, 2 Nov 2004 18:56:04 +0300 Received: from zanzibar.2ka.mipt.ru (zanzibar.2ka.mipt.ru [194.85.82.77]) by ffke-campus-gw.mipt.ru (8.12.11/8.12.11) with SMTP id iA2FIPj1009177; Tue, 2 Nov 2004 18:18:25 +0300 Date: Tue, 2 Nov 2004 18:24:15 +0300 From: Evgeniy Polyakov To: jamal , James Morris , Michal Ludvig Cc: netdev@oss.sgi.com, cryptoapi@lists.logix.cz Subject: Re: Asynchronous crypto layer. Message-ID: <20041102182415.61f5e8a4@zanzibar.2ka.mipt.ru> In-Reply-To: <1099030958.4944.148.camel@uganda> References: <1099030958.4944.148.camel@uganda> Organization: MIPT X-Mailer: Sylpheed-Claws 0.9.12b (GTK+ 1.2.10; i386-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC" X-archive-position: 11349 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: johnpol@2ka.mipt.ru Precedence: bulk X-list: netdev Content-Length: 20610 Lines: 831 This is a multi-part message in MIME format. --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Here we go. Numbers. Actually nothing excitement: since ecryption/decryption was made in a one thread (please see dirty hack in sync_provider.c:89 to allow crypto_cipher_{en,de}crypt() work in _bh context, BUG() in crypto_yeld() can be reproduced by removing hack). UP with HT badly broken Xeon(800 mhz) 2 parallel running scripts: rnd=$RANDOM file=/mnt/$rnd for ((i=0; i<20; ++i)); do echo -en "." dd if=/dev/zero of=$file bs=1M count=40 > /dev/null 2>&1 rm -f $file done echo Pure sync mode: 0.07user 14.87system 0:16.49elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+6840minor)pagefaults 0swaps Pseudo async mode(data ecnryption/decryption is done synchronous thread, only pre/post processing is asynchronous): 0.08user 11.66system 0:17.03elapsed 68%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+6870minor)pagefaults 0swaps Attached synchronous and asynchronous crypto providers and purely in-memory block device. Usage: Async mode: cd crypto sudo ./i cd ../block sudo ./i term1$ sudo time ./start term2$ sudo time ./start Sync mode: cd block sudo ./r cd ../crypto sudo ./r cd ../block sudo ./i 1 term1$ sudo time ./start term2$ sudo time ./start I will send updated asynchronous crypto patch in a next e-mail. Evgeniy Polyakov Only failure makes us experts. -- Theo de Raadt --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: text/x-csrc; name="async_provider.c" Content-Disposition: attachment; filename="async_provider.c" Content-Transfer-Encoding: 7bit /* * async_provider.c * * Copyright (c) 2004 Evgeniy Polyakov * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../crypto/acrypto.h" #include "../crypto/crypto_stat.h" #include "../crypto/crypto_def.h" static void prov_data_ready(struct crypto_device *); static void async_callback(struct crypto_session_initializer *, struct crypto_data *); static struct crypto_capability prov_caps[] = { {CRYPTO_OP_ENCRYPT, CRYPTO_TYPE_AES_128, CRYPTO_MODE_ECB, 10000}, {CRYPTO_OP_DECRYPT, CRYPTO_TYPE_AES_128, CRYPTO_MODE_ECB, 10000}, }; static int prov_cap_number = sizeof(prov_caps)/sizeof(prov_caps[0]); static struct completion thread_exited; static DECLARE_WAIT_QUEUE_HEAD(async_wait_queue); static int need_exit; static struct crypto_tfm *tfm; static char async_algo[] = "aes"; static char async_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; static struct crypto_session_initializer ci = { .operation = CRYPTO_OP_ENCRYPT, .mode = CRYPTO_MODE_ECB, .type = CRYPTO_TYPE_AES_128, .callback = async_callback, }; static struct crypto_device pdev = { .name = "async_provider", .data_ready = prov_data_ready, .cap = &prov_caps[0], }; static void async_callback(struct crypto_session_initializer *ci, struct crypto_data *data) { struct request *req = data->priv; dprintk("%s: req=%p, req->q=%p.\n", __func__, req, req->q); (unsigned long)req->special--; if ((unsigned long)req->special == 0 && req->q) { spinlock_t *l = req->q->queue_lock; dprintk("Finishing request for req=%p [%lu].\n", req, (unsigned long)req->special); spin_lock_irq(l); (unsigned long)req->special = 0; if (!end_that_request_first(req, 1, req->nr_sectors)); end_that_request_last(req); spin_unlock_irq(l); } } static __inline__ void async_prepare(struct crypto_data *data, void *src, void *dst, unsigned long size, void *priv) { struct request *req = priv; (unsigned long)req->special++; dprintk("%s: req=%p, refcnt=%lu.\n", __func__, req, (unsigned long)req->special); data->sg_src.page = virt_to_page(src); data->sg_src.offset = offset_in_page(src); data->sg_src.length = size; data->sg_dst.page = virt_to_page(dst); data->sg_dst.offset = offset_in_page(dst); data->sg_dst.length = size; data->sg_key.page = virt_to_page(async_key); data->sg_key.offset = offset_in_page(async_key); data->sg_key.length = sizeof(async_key); data->priv = priv; data->priv_size = 0; } void bd_encrypt(void *src, void *dst, u64 size, void *priv) { struct crypto_data data; struct crypto_session *sp; async_prepare(&data, src, dst, size, priv); ci.operation = CRYPTO_OP_ENCRYPT; sp = crypto_session_alloc(&ci, &data); BUG_ON(!sp); wake_up_interruptible(&async_wait_queue); } void bd_decrypt(void *src, void *dst, u64 size, void *priv) { struct crypto_data data; struct crypto_session *sp; async_prepare(&data, src, dst, size, priv); ci.operation = CRYPTO_OP_DECRYPT; sp = crypto_session_alloc(&ci, &data); BUG_ON(!sp); wake_up_interruptible(&async_wait_queue); } static void prov_data_ready(struct crypto_device *dev) { wake_up_interruptible(&async_wait_queue); } static int async_thread(void *data) { struct crypto_device *dev = (struct crypto_device *)data; struct crypto_session *s, *n; daemonize("%s", dev->name); allow_signal(SIGTERM); while (!need_exit) { int num, pnum; interruptible_sleep_on_timeout(&async_wait_queue, 100); if (need_exit) break; num = pnum = 0; list_for_each_entry_safe(s, n, &dev->session_list, dev_queue_entry) { num++; if (session_completed(s)) continue; pnum++; start_process_session(s); if (s->ci.operation == CRYPTO_OP_ENCRYPT) crypto_cipher_encrypt(tfm, &s->data.sg_dst, &s->data.sg_src, s->data.sg_src.length); else crypto_cipher_decrypt(tfm, &s->data.sg_dst, &s->data.sg_src, s->data.sg_src.length); dprintk("%lu: Completing session %llu [%llu] in %s.\n", jiffies, s->ci.id, s->ci.dev_id, pdev.name); crypto_stat_complete_inc(s); complete_session(s); stop_process_session(s); } dprintk("%lu: %s: %d sessions, %d processed.\n", jiffies, dev->name, num, pnum); } complete_and_exit(&thread_exited, 0); } int prov_init(void) { int err, pid; tfm = crypto_alloc_tfm(async_algo, 0); if (!tfm) { dprintk(KERN_ERR "Failed to allocate %s tfm.\n", async_algo); return -EINVAL; } err = crypto_cipher_setkey(tfm, async_key, sizeof(async_key)); if (err) { dprintk("Failed to set key [keylen=%d]: err=%d.\n", sizeof(async_key), err); goto err_out_free_tfm; } init_completion(&thread_exited); pid = kernel_thread(async_thread, &pdev, CLONE_FS | CLONE_FILES); if (IS_ERR((void *)pid)) { err = -EINVAL; dprintk(KERN_ERR "Failed to create kernel load balancing thread.\n"); goto err_out_free_tfm; } pdev.cap_number = prov_cap_number; err = crypto_device_add(&pdev); if (err) goto err_out_remove_thread; dprintk(KERN_INFO "Test crypto provider module %s is loaded.\n", pdev.name); return 0; err_out_remove_thread: need_exit = 1; wake_up(&async_wait_queue); wait_for_completion(&thread_exited); err_out_free_tfm: crypto_free_tfm(tfm); return err; } void prov_fini(void) { need_exit = 1; wake_up(&async_wait_queue); wait_for_completion(&thread_exited); crypto_device_remove(&pdev); crypto_free_tfm(tfm); dprintk(KERN_INFO "Test crypto provider module %s is unloaded.\n", pdev.name); } module_init(prov_init); module_exit(prov_fini); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Evgeniy Polyakov "); MODULE_DESCRIPTION("Test crypto module provider."); EXPORT_SYMBOL(bd_encrypt); EXPORT_SYMBOL(bd_decrypt); --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: application/octet-stream; name="Makefile" Content-Disposition: attachment; filename="Makefile" Content-Transfer-Encoding: base64 b2JqLW0JCTo9IGJkLm8KCktESVIJOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1 aWxkCiNLRElSCTo9IC91c3IvbG9jYWwvc3JjL2xpbnV4LTIuNi9saW51eC0yLjYKUFdECTo9ICQo c2hlbGwgcHdkKQoKZGVmYXVsdDoKCSQoTUFLRSkgLUMgJChLRElSKSBTVUJESVJTPSQoUFdEKSBt b2R1bGVzCgpjbGVhbjoKCXJtIC1mICoubyAqLmtvICoubW9kLiogLiouY21kICp+CglybSAtcmYg LnRtcF92ZXJzaW9ucwo= --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: text/x-csrc; name="bd.c" Content-Disposition: attachment; filename="bd.c" Content-Transfer-Encoding: 7bit /* * bd.c * * Copyright (c) 2004 Evgeniy Polyakov * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include //#define BD_DEBUG #ifdef BD_DEBUG #define dprintk(f, a...) printk(KERN_EMERG f, ##a) #else #define dprintk(f, a...) do {} while(0) #endif #define BD_READ 0 #define BD_WRITE 1 static char bd_name[] = "bd"; static unsigned int bd_major = 123; module_param(bd_major, uint, 0); static unsigned int bd_sector_size = 512; module_param(bd_sector_size, uint, 0); static unsigned int bd_max_request_size = 1024*1024*50; module_param(bd_max_request_size, uint, 0); static int sync_mode = 0; module_param(sync_mode, uint, 0); static void *bd_request_data; static spinlock_t bd_lock = SPIN_LOCK_UNLOCKED; static struct gendisk *bd_disk; static unsigned long req_counter = 1; extern void bd_encrypt(void *src, void *dst, u64 size, void *priv); extern void bd_decrypt(void *src, void *dst, u64 size, void *priv); static int bd_ioctl(struct inode *, struct file *, unsigned int, unsigned long); static struct block_device_operations bd_fops = { .owner = THIS_MODULE, .ioctl = bd_ioctl, }; static int bd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { dprintk("%s: cmd=%u, arg=%ld.\n", __func__, cmd, arg); return 0; } static int bd_process_data(int cmd, void *buf, u64 off, u64 size, void *priv) { if (size > bd_max_request_size) { dprintk("Too big size %llu, setting to %u.\n", size, bd_max_request_size); size = bd_max_request_size; } if (off + size > bd_max_request_size) { dprintk("Too big size %llu or offset %llu, exiting.\n", size, off); size = bd_max_request_size; } switch (cmd) { case BD_READ: bd_decrypt(((char *)bd_request_data) + off, buf, size, priv); break; case BD_WRITE: bd_encrypt(buf, ((char *)bd_request_data) + off, size, priv); break; } dprintk("%s finished cmd=%s, size=%llu, off=%llu.\n", __func__, (cmd == BD_WRITE)?"WRITE":"READ", size, off); return 0; } static __inline__ int bd_process_bvec(int cmd, struct bio_vec *bvec, u64 off, void *priv) { int err; char *kaddr; void *buf; u64 size; kaddr = page_address(bvec->bv_page); buf = kaddr + bvec->bv_offset; size = bvec->bv_len; err = bd_process_data(cmd, buf, off, size, priv); return err; } static void bd_request(request_queue_t * q) { struct request *req; u64 size, off; int err, cmd, bad_bio; struct bio *bio; while ((req = elv_next_request(q)) != NULL) { blkdev_dequeue_request(req); (unsigned long)req->special = 0; off = req->sector * bd_sector_size; size = req->nr_sectors * bd_sector_size; cmd = (rq_data_dir(req) == 1)?BD_WRITE:BD_READ; dprintk("%s: TRANSFER: req=%p [%lu], cmd=%s, off=%llu [sector=%llu], size=%llu [nr_sectors=%lu], flags=%lx.\n", bd_name, req, (unsigned long)req->special, (cmd == BD_WRITE)?"WRITE":"READ", off, req->sector, size, req->nr_sectors, req->flags); bad_bio = 0; if (!(req->flags & REQ_CMD)) { dprintk("%s: wrong command.\n", bd_name); goto err_out_wrong_command; } rq_for_each_bio(bio, req) { struct bio_vec *bvec; int i; dprintk("BIO: bi_size=%u, bvec=%p.\n", bio->bi_size, bio->bi_io_vec); if (!bio->bi_size || !bio->bi_io_vec) { bad_bio = 1; continue; } bio_for_each_segment(bvec, bio, i) { dprintk("%s: i=%d, req=%p, size=%d.\n", bd_disk->disk_name, i, req, bvec->bv_len); err = bd_process_bvec(cmd, bvec, off, req); if (err) { bad_bio = 1; continue; } off += bvec->bv_len; size -= bvec->bv_len; } /* * bio->bi_end_io = NULL; * bio_endio(bio, bio->bi_size, (bad_bio)?-EIO:0); */ } dprintk("cmd=%s has been processed: err=%d\n", (cmd == BD_WRITE)?"WRITE":"READ", req->errors); err_out_wrong_command: if (sync_mode) { if (!end_that_request_first(req, (bad_bio)?0:1, req->nr_sectors)); end_that_request_last(req); } } } static void bd_setup(struct gendisk *d) { request_queue_t *q; d->major = bd_major; d->first_minor = 0; d->fops = &bd_fops; d->private_data = NULL; d->flags = GENHD_FL_SUPPRESS_PARTITION_INFO; sprintf(d->disk_name, "%s%d", bd_name, 0); q = d->queue; blk_queue_hardsect_size(q, bd_sector_size); set_capacity(d, bd_max_request_size/bd_sector_size); add_disk(d); } int __devinit bd_init(void) { int err; bd_request_data = vmalloc(bd_max_request_size); if (!bd_request_data) { dprintk("Failed to allocate %d bytes for %s requests.\n", bd_max_request_size, bd_name); return -ENOMEM; } err = register_blkdev(bd_major, bd_name); if (err) { dprintk("Failed to register blkdev with major %u: err=%d.\n", bd_major, err); return err; } bd_disk = alloc_disk(1); if (!bd_disk) { dprintk("Failed to allocate a disk.\n"); goto err_out_unregister_blkdev; } bd_disk->queue = blk_init_queue(bd_request, &bd_lock); if (!bd_disk->queue) { dprintk("Failed to initialize blk queue: err=%d.\n", err); goto err_out_free_disk; } bd_setup(bd_disk); dprintk("%s has beed successfully added.\n", bd_name); return 0; err_out_free_disk: put_disk(bd_disk); err_out_unregister_blkdev: unregister_blkdev(bd_major, "bd"); vfree(bd_request_data); return -EINVAL; } void __devexit bd_fini(void) { del_gendisk(bd_disk); blk_cleanup_queue(bd_disk->queue); put_disk(bd_disk); unregister_blkdev(bd_major, "bd"); vfree(bd_request_data); dprintk("%s has beed successfully removed.\n", bd_name); } module_init(bd_init); module_exit(bd_fini); MODULE_AUTHOR("Evgeniy Polyakov "); MODULE_LICENSE("GPL"); --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: application/octet-stream; name="i" Content-Disposition: attachment; filename="i" Content-Transfer-Encoding: base64 IyEvYmluL3NoCgpudW09JCMKCmRldl9maWxlPS9kZXYvYmQwCnN5bmNfbW9kZT0wOwoKaWYgWyAk bnVtICE9IDAgXTsgdGhlbgoJc3luY19tb2RlPSQxCmZpCgppZiBbICRzeW5jX21vZGUgIT0gMCBd OyB0aGVuCglpbnNtb2QgLi9zeW5jX3Byb3ZpZGVyLmtvCmVsc2UKCWluc21vZCAuL2FzeW5jX3By b3ZpZGVyLmtvCmZpCmluc21vZCAuL2JkLmtvIHN5bmNfbW9kZT0kc3luY19tb2RlCgppZiBbICEg LWYgJGRldl9maWxlIF07IHRoZW4KCW1rbm9kICRkZXZfZmlsZSBiIDEyMyAwCmZpCgpta2ZzLmV4 dDIgJGRldl9maWxlCm1vdW50ICRkZXZfZmlsZSAvbW50Cg== --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: application/octet-stream; name="r" Content-Disposition: attachment; filename="r" Content-Transfer-Encoding: base64 ZGV2X2ZpbGU9L2Rldi9iZDAKCnVtb3VudCAvbW50CnJtbW9kIGJkCnJtbW9kIGFzeW5jX3Byb3Zp ZGVyCnJtbW9kIHN5bmNfcHJvdmlkZXIK --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: text/x-csrc; name="sync_provider.c" Content-Disposition: attachment; filename="sync_provider.c" Content-Transfer-Encoding: 7bit /* * sync_provider.c * * Copyright (c) 2004 Evgeniy Polyakov * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include //#define SYNC_DEBUG #ifdef SYNC_DEBUG #define dprintk(f, a...) printk(KERN_EMERG f, ##a) #else #define dprintk(f, a...) do {} while(0) #endif #define OP_ENCRYPT 0 #define OP_DECRYPT 1 static char sync_algo[] = "aes"; static char sync_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; static struct crypto_tfm *tfm; void bd_encrypt(void *src, void *dst, u64 size, void *priv) { struct scatterlist s, d; s.page = virt_to_page(src); s.offset = offset_in_page(src); s.length = size; d.page = virt_to_page(dst); d.offset = offset_in_page(dst); d.length = size; /* * A hack to fool crypto layer - it thinks that we can sleep here... * Sigh. * * preempt_count() |= SOFTIRQ_MASK; */ preempt_count() |= SOFTIRQ_MASK; crypto_cipher_encrypt(tfm, &d, &s, size); preempt_count() &= ~SOFTIRQ_MASK; } void bd_decrypt(void *src, void *dst, u64 size, void *priv) { struct scatterlist s, d; s.page = virt_to_page(src); s.offset = offset_in_page(src); s.length = size; d.page = virt_to_page(dst); d.offset = offset_in_page(dst); d.length = size; /* * A hack to fool crypto layer - it thinks that we can sleep here... * Sigh. * * preempt_count() |= SOFTIRQ_MASK; */ preempt_count() |= SOFTIRQ_MASK; crypto_cipher_decrypt(tfm, &d, &s, size); preempt_count() &= ~SOFTIRQ_MASK; } int __devinit sync_init(void) { int err; err = -ENODEV; tfm = crypto_alloc_tfm(sync_algo, 0); if (!tfm) { dprintk("Failed to allocate %s tfm.\n", sync_algo); goto err_out_exit; } err = crypto_cipher_setkey(tfm, sync_key, sizeof(sync_key)); if (err) { dprintk("Failed to set key [keylen=%d]: err=%d.\n", sizeof(sync_key), err); goto err_out_free_tfm; } return 0; err_out_free_tfm: crypto_free_tfm(tfm); err_out_exit: return err; } void __devexit sync_fini(void) { crypto_free_tfm(tfm); } module_init(sync_init); module_exit(sync_fini); MODULE_AUTHOR("Evgeniy Polyakov "); MODULE_LICENSE("GPL"); EXPORT_SYMBOL(bd_encrypt); EXPORT_SYMBOL(bd_decrypt); --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC Content-Type: application/octet-stream; name="start" Content-Disposition: attachment; filename="start" Content-Transfer-Encoding: base64 cm5kPSRSQU5ET00KZmlsZT0vbW50LyRybmQKCmZvciAoKGk9MDsgaTwyMDsgKytpKSk7IGRvCgll Y2hvIC1lbiAiLiIKCWRkIGlmPS9kZXYvemVybyBvZj0kZmlsZSBicz0xTSBjb3VudD00MCA+IC9k ZXYvbnVsbCAyPiYxCglybSAtZiAkZmlsZQpkb25lCmVjaG8K --Multipart=_Tue__2_Nov_2004_18_24_15_+0300_SHM75zEMLqjdT6mC-- From johnpol@2ka.mipt.ru Tue Nov 2 07:56:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 07:56:32 -0800 (PST) Received: from mailer.campus.mipt.ru (mailer.campus.mipt.ru [194.85.82.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2FuMv3003229 for ; Tue, 2 Nov 2004 07:56:24 -0800 Received: from ffke-campus-gw.mipt.ru (2ka [194.85.82.65]) by mailer.campus.mipt.ru (8.13.1/8.13.1) with ESMTP id iA2Fu6Dn032017; Tue, 2 Nov 2004 18:56:06 +0300 Received: from zanzibar.2ka.mipt.ru (zanzibar.2ka.mipt.ru [194.85.82.77]) by ffke-campus-gw.mipt.ru (8.12.11/8.12.11) with SMTP id iA2FIZ2u009318; Tue, 2 Nov 2004 18:18:35 +0300 Date: Tue, 2 Nov 2004 19:12:35 +0300 From: Evgeniy Polyakov To: jamal , James Morris , Michal Ludvig Cc: netdev@oss.sgi.com, cryptoapi@lists.logix.cz Subject: Re: Asynchronous crypto layer. Message-ID: <20041102191235.609efde6@zanzibar.2ka.mipt.ru> In-Reply-To: <1099030958.4944.148.camel@uganda> References: <1099030958.4944.148.camel@uganda> Organization: MIPT X-Mailer: Sylpheed-Claws 0.9.12b (GTK+ 1.2.10; i386-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Tue__2_Nov_2004_19_12_35_+0300_L9m.J=UR4DueZh+G" X-archive-position: 11348 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: johnpol@2ka.mipt.ru Precedence: bulk X-list: netdev Content-Length: 126797 Lines: 1667 This is a multi-part message in MIME format. --Multipart=_Tue__2_Nov_2004_19_12_35_+0300_L9m.J=UR4DueZh+G Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit This patch implements several features discussed previously: - crypto_session_alloc() split. I did not change crypto_session_alloc() name, but added struct crypto_session *crypto_session_create( struct crypto_initizlier *, struct crypto_data *) and void crypto_session_add(struct crypto_session *s); Thus now we have timeslice for crypto routing manipulations. - Added per crypto_initializer ptime and scomp fields. The former is total time sessions with given crypto_initializer being processed, it is in jifies. The latter is total number of session with given crypto_initializer already have been processed. Sum of all scomp above is equal to dev->stat.scompleted - total number io completed sessions in given device. - Added crypto_wake_lb() call - this function is called when device finishes session processing(by calling stop_process_session()). It wakes crypto_lb_thread() which efficiently reduces latancies. - Added struct crypto_data * parameter into crypto_lb_find_device(). Load balancer now has ability to select device based not only on device's capabilities, but on packet's characteristics too. - If none crypto load balancer registered yet, then just return NULL from crypto_session_{create,alloc}(), not BUG_ON(). Evgeniy Polyakov Only failure makes us experts. -- Theo de Raadt --Multipart=_Tue__2_Nov_2004_19_12_35_+0300_L9m.J=UR4DueZh+G Content-Type: application/octet-stream; name="crypto.patch" Content-Disposition: attachment; filename="crypto.patch" Content-Transfer-Encoding: base64 ZGlmZiAtTnJ1IC90bXAvZW1wdHkvS2NvbmZpZyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL0tj b25maWcKLS0tIC90bXAvZW1wdHkvS2NvbmZpZwkxOTcwLTAxLTAxIDAzOjAwOjAwLjAwMDAwMDAw MCArMDMwMAorKysgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9LY29uZmlnCTIwMDQtMTAtMzAg MTI6MzI6NTMuMDAwMDAwMDAwICswNDAwCkBAIC0wLDAgKzEsMTUgQEAKK21lbnUgIkFzeW5jaHJv bm91cyBjcnlwdG8gbGF5ZXIiCisKK2NvbmZpZyBBQ1JZUFRPCisJdHJpc3RhdGUgIkFzeW5jaHJv bm91cyBjcnlwdG8gbGF5ZXIiCisJZGVwZW5kcyBvbiBDT05ORUNUT1IgJiYgQ1JZUFRPCisJLS0t aGVscC0tLQorCQlBc3luY2hyb25vdXMgY3J5cHRvIGxheWVyLgorCitjb25maWcgU0lNUExFX0xC CisJdHJpc3RhdGUgIlNpbXBsZSBsb2FkIGJhbGFuY2VyIgorCWRlcGVuZHMgb24gQUNSWVBUTwor CS0tLWhlbHAtLS0KKwkJU2ltcGxlIGxvYWQgYmFsYW5jZXIuCitlbmRtZW51CisKZGlmZiAtTnJ1 IC90bXAvZW1wdHkvTWFrZWZpbGUgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9NYWtlZmlsZQot LS0gL3RtcC9lbXB0eS9NYWtlZmlsZQkxOTcwLTAxLTAxIDAzOjAwOjAwLjAwMDAwMDAwMCArMDMw MAorKysgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9NYWtlZmlsZQkyMDA0LTEwLTMwIDA5OjAz OjE0LjAwMDAwMDAwMCArMDQwMApAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19BQ1JZUFRP KQkJKz0gYWNyeXB0by5vIAorb2JqLSQoQ09ORklHX1NJTVBMRV9MQikJCSs9IHNpbXBsZV9sYi5v IAorYWNyeXB0by1vYmpzCTo9IGNyeXB0b19tYWluLm8gY3J5cHRvX2xiLm8gY3J5cHRvX2Rldi5v IGNyeXB0b19jb25uLm8gY3J5cHRvX3N0YXQubworCitvYmotJChDT05GSUdfVklBX1BBRExPQ0sp CSs9IHZpYS1wYWRsb2NrLwpkaWZmIC1OcnUgL3RtcC9lbXB0eS9hY3J5cHRvLmggbGludXgtMi42 L2RyaXZlcnMvYWNyeXB0by9hY3J5cHRvLmgKLS0tIC90bXAvZW1wdHkvYWNyeXB0by5oCTE5NzAt MDEtMDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5 cHRvL2FjcnlwdG8uaAkyMDA0LTExLTAyIDE4OjQ0OjIxLjAwMDAwMDAwMCArMDMwMApAQCAtMCww ICsxLDIzMSBAQAorLyoKKyAqIAlhY3J5cHRvLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQg RXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUg MzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0FDUllQVE9f SAorI2RlZmluZSBfX0FDUllQVE9fSAorCisjZGVmaW5lIFNDQUNIRV9OQU1FTEVOCQkzMgorCitz dHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXI7CitzdHJ1Y3QgY3J5cHRvX2RhdGE7Cit0 eXBlZGVmIHZvaWQgKCpjcnlwdG9fY2FsbGJhY2tfdCkoc3RydWN0IGNyeXB0b19zZXNzaW9uX2lu aXRpYWxpemVyICosIHN0cnVjdCBjcnlwdG9fZGF0YSAqKTsKKworZXh0ZXJuIHZvaWQgY3J5cHRv X3dha2VfbGIodm9pZCk7CisKKyNkZWZpbmUgU0VTU0lPTl9DT01QTEVURUQJKDE8PDE1KQorI2Rl ZmluZSBTRVNTSU9OX0ZJTklTSEVECSgxPDwxNCkKKyNkZWZpbmUgU0VTU0lPTl9TVEFSVEVECQko MTw8MTMpCisjZGVmaW5lIFNFU1NJT05fUFJPQ0VTU0VECSgxPDwxMikKKyNkZWZpbmUgU0VTU0lP Tl9CSU5ERUQJCSgxPDwxMSkKKyNkZWZpbmUgU0VTU0lPTl9CUk9LRU4JCSgxPDwxMCkKKworI2Rl ZmluZSBzZXNzaW9uX2NvbXBsZXRlZChzKQkocy0+Y2kuZmxhZ3MgJiBTRVNTSU9OX0NPTVBMRVRF RCkKKyNkZWZpbmUgY29tcGxldGVfc2Vzc2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgfD0gU0VTU0lP Tl9DT01QTEVURUQ7fSB3aGlsZSgwKQorI2RlZmluZSB1bmNvbXBsZXRlX3Nlc3Npb24ocykJZG8g e3MtPmNpLmZsYWdzICY9IH5TRVNTSU9OX0NPTVBMRVRFRDt9IHdoaWxlICgwKQorCisjZGVmaW5l IHNlc3Npb25fZmluaXNoZWQocykJKHMtPmNpLmZsYWdzICYgU0VTU0lPTl9GSU5JU0hFRCkKKyNk ZWZpbmUgZmluaXNoX3Nlc3Npb24ocykJZG8ge3MtPmNpLmZsYWdzIHw9IFNFU1NJT05fRklOSVNI RUQ7fSB3aGlsZSgwKQorI2RlZmluZSB1bmZpbmlzaF9zZXNzaW9uKHMpCWRvIHtzLT5jaS5mbGFn cyAmPSB+U0VTU0lPTl9GSU5JU0hFRDt9IHdoaWxlICgwKQorCisjZGVmaW5lIHNlc3Npb25fc3Rh cnRlZChzKQkocy0+Y2kuZmxhZ3MgJiBTRVNTSU9OX1NUQVJURUQpCisjZGVmaW5lIHN0YXJ0X3Nl c3Npb24ocykJZG8ge3MtPmNpLmZsYWdzIHw9IFNFU1NJT05fU1RBUlRFRDt9IHdoaWxlKDApCisj ZGVmaW5lIHVuc3RhcnRfc2Vzc2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgJj0gflNFU1NJT05fU1RB UlRFRDt9IHdoaWxlICgwKQorCisjZGVmaW5lIHNlc3Npb25faXNfcHJvY2Vzc2VkKHMpCQkocy0+ Y2kuZmxhZ3MgJiBTRVNTSU9OX1BST0NFU1NFRCkKKyNkZWZpbmUgc3RhcnRfcHJvY2Vzc19zZXNz aW9uKHMpCWRvIHtzLT5jaS5mbGFncyB8PSBTRVNTSU9OX1BST0NFU1NFRDsgcy0+Y2kucHRpbWUg PSBqaWZmaWVzO30gd2hpbGUoMCkKKyNkZWZpbmUgc3RvcF9wcm9jZXNzX3Nlc3Npb24ocykJCWRv IHtzLT5jaS5mbGFncyAmPSB+U0VTU0lPTl9QUk9DRVNTRUQ7IHMtPmNpLnB0aW1lID0gamlmZmll cyAtIHMtPmNpLnB0aW1lOyBjcnlwdG9fd2FrZV9sYigpO30gd2hpbGUgKDApCisKKyNkZWZpbmUg c2Vzc2lvbl9iaW5kZWQocykJKHMtPmNpLmZsYWdzICYgU0VTU0lPTl9CSU5ERUQpCisjZGVmaW5l IGJpbmRfc2Vzc2lvbihzKQkJZG8ge3MtPmNpLmZsYWdzIHw9IFNFU1NJT05fQklOREVEO30gd2hp bGUoMCkKKyNkZWZpbmUgdW5iaW5kX3Nlc3Npb24ocykJZG8ge3MtPmNpLmZsYWdzICY9IH5TRVNT SU9OX0JJTkRFRDt9IHdoaWxlICgwKQorI2RlZmluZSBzY2lfYmluZGVkKGNpKQkJKGNpLT5mbGFn cyAmIFNFU1NJT05fQklOREVEKQorCisjZGVmaW5lIHNlc3Npb25fYnJva2VuKHMpCShzLT5jaS5m bGFncyAmIFNFU1NJT05fQlJPS0VOKQorI2RlZmluZSBicm9rZV9zZXNzaW9uKHMpCWRvIHtzLT5j aS5mbGFncyB8PSBTRVNTSU9OX0JST0tFTjt9IHdoaWxlKDApCisjZGVmaW5lIHVuYnJva2Vfc2Vz c2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgJj0gflNFU1NJT05fQlJPS0VOO30gd2hpbGUgKDApCisK K3N0cnVjdCBjcnlwdG9fZGV2aWNlX3N0YXQKK3sKKwlfX3U2NAkJCXNjb21wbGV0ZWQ7CisJX191 NjQJCQlzZmluaXNoZWQ7CisJX191NjQJCQlzc3RhcnRlZDsKKwlfX3U2NAkJCWttZW1fZmFpbGVk OworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cisj aW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRl IDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKKy8v I2RlZmluZSBERUJVRworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGsoZiwgYS4uLikgcHJp bnRrKEtFUk5fRU1FUkcgZiwgIyNhKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhmLCBhLi4uKQor I2VuZGlmCisKKyNkZWZpbmUgQ1JZUFRPX01BWF9QUklWX1NJWkUJMTAyNAorCisjZGVmaW5lIERF VklDRV9CUk9LRU4JCSgxPDwwKQorCisjZGVmaW5lIGRldmljZV9icm9rZW4oZGV2KQkoZGV2LT5m bGFncyAmIERFVklDRV9CUk9LRU4pCisjZGVmaW5lIGJyb2tlX2RldmljZShkZXYpCWRvIHtkZXYt PmZsYWdzIHw9IERFVklDRV9CUk9LRU47fSB3aGlsZSgwKQorI2RlZmluZSByZXBhaXJfZGV2aWNl KGRldikJZG8ge2Rldi0+ZmxhZ3MgJj0gfkRFVklDRV9CUk9LRU47fSB3aGlsZSgwKQorCitzdHJ1 Y3QgY3J5cHRvX2NhcGFiaWxpdHkKK3sKKwl1MTYJCQlvcGVyYXRpb247CisJdTE2CQkJdHlwZTsK Kwl1MTYJCQltb2RlOworCXUxNgkJCXFsZW47CisJdTY0CQkJcHRpbWU7CisJdTY0CQkJc2NvbXA7 Cit9OworCitzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIKK3sKKwl1MTYJCQlvcGVy YXRpb247CisJdTE2CQkJdHlwZTsKKwl1MTYJCQltb2RlOworCXUxNgkJCXByaW9yaXR5OworCisJ dTY0CQkJaWQ7CisJdTY0CQkJZGV2X2lkOworCisJdTMyCQkJZmxhZ3M7CisKKwl1MzIJCQliZGV2 OworCisJdTY0CQkJcHRpbWU7CisKKwljcnlwdG9fY2FsbGJhY2tfdAljYWxsYmFjazsKK307CisK K3N0cnVjdCBjcnlwdG9fZGF0YQoreworCWludCAJCQlzZ19zcmNfbnVtOworCXN0cnVjdCBzY2F0 dGVybGlzdAlzZ19zcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0CXNnX2RzdDsKKwlzdHJ1Y3Qgc2Nh dHRlcmxpc3QJc2dfa2V5OworCXN0cnVjdCBzY2F0dGVybGlzdAlzZ19pdjsKKworCXZvaWQJCQkq cHJpdjsKKwl1bnNpZ25lZCBpbnQJCXByaXZfc2l6ZTsKK307CisKK3N0cnVjdCBjcnlwdG9fZGV2 aWNlCit7CisJY2hhcgkJCW5hbWVbU0NBQ0hFX05BTUVMRU5dOworCisJc3BpbmxvY2tfdAkJc2Vz c2lvbl9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJc2Vzc2lvbl9saXN0OworCisJdTY0CQkJc2lk OworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlhdG9taWNfdAkJcmVmY250OworCisJdTMyCQkJZmxh Z3M7CisKKwl1MzIJCQlpZDsKKworCXN0cnVjdCBsaXN0X2hlYWQJY2Rldl9lbnRyeTsKKworCXZv aWQJCQkoKmRhdGFfcmVhZHkpKHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOworCisJc3RydWN0IGRl dmljZV9kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlCQlkZXZpY2U7CisJc3RydWN0IGNs YXNzX2RldmljZQljbGFzc19kZXZpY2U7CisJc3RydWN0IGNvbXBsZXRpb24gCWRldl9yZWxlYXNl ZDsKKworCXNwaW5sb2NrX3QJCXN0YXRfbG9jazsKKwlzdHJ1Y3QgY3J5cHRvX2RldmljZV9zdGF0 CXN0YXQ7CisKKwlzdHJ1Y3QgY3J5cHRvX2NhcGFiaWxpdHkJKmNhcDsKKwlpbnQJCQljYXBfbnVt YmVyOworfTsKKworc3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkCit7CisJc3RydWN0IGNyeXB0b19y b3V0ZSAJKm5leHQ7CisJc3RydWN0IGNyeXB0b19yb3V0ZSAJKnByZXY7CisKKwlfX3UzMgkJCXFs ZW47CisJc3BpbmxvY2tfdAkJbG9jazsKK307CisKK3N0cnVjdCBjcnlwdG9fcm91dGUKK3sKKwlz dHJ1Y3QgY3J5cHRvX3JvdXRlCSpuZXh0OworCXN0cnVjdCBjcnlwdG9fcm91dGUJKnByZXY7CisK KwlzdHJ1Y3QgY3J5cHRvX3JvdXRlX2hlYWQgKmxpc3Q7CisJc3RydWN0IGNyeXB0b19kZXZpY2Ug CSpkZXY7CisKKwlzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIJY2k7Cit9OworCisK K3N0cnVjdCBjcnlwdG9fc2Vzc2lvbgoreworCXN0cnVjdCBsaXN0X2hlYWQJZGV2X3F1ZXVlX2Vu dHJ5OworCXN0cnVjdCBsaXN0X2hlYWQJbWFpbl9xdWV1ZV9lbnRyeTsKKworCXN0cnVjdCBjcnlw dG9fc2Vzc2lvbl9pbml0aWFsaXplciBjaTsKKworCXN0cnVjdCBjcnlwdG9fZGF0YQlkYXRhOwor CisJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCAJd29yazsKKworCXN0 cnVjdCBjcnlwdG9fcm91dGVfaGVhZCByb3V0ZV9saXN0OworfTsKKworc3RydWN0IGNyeXB0b19z ZXNzaW9uICpjcnlwdG9fc2Vzc2lvbl9hbGxvYyhzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlh bGl6ZXIgKiwgc3RydWN0IGNyeXB0b19kYXRhICopOworc3RydWN0IGNyeXB0b19zZXNzaW9uICpj cnlwdG9fc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICos IHN0cnVjdCBjcnlwdG9fZGF0YSAqKTsKK3ZvaWQgY3J5cHRvX3Nlc3Npb25fYWRkKHN0cnVjdCBj cnlwdG9fc2Vzc2lvbiAqKTsKK2lubGluZSB2b2lkIGNyeXB0b19zZXNzaW9uX2RlcXVldWVfbWFp bihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKik7CitpbmxpbmUgdm9pZCBfX2NyeXB0b19zZXNzaW9u X2RlcXVldWVfbWFpbihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKik7Cit2b2lkIGNyeXB0b19zZXNz aW9uX2RlcXVldWVfcm91dGUoc3RydWN0IGNyeXB0b19zZXNzaW9uICopOworCitpbmxpbmUgdm9p ZCBjcnlwdG9fZGV2aWNlX2dldChzdHJ1Y3QgY3J5cHRvX2RldmljZSAqKTsKK2lubGluZSB2b2lk IGNyeXB0b19kZXZpY2VfcHV0KHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOworaW5saW5lIHN0cnVj dCBjcnlwdG9fZGV2aWNlICpjcnlwdG9fZGV2aWNlX2dldF9uYW1lKGNoYXIgKik7CisKK2ludCBf X2NyeXB0b19kZXZpY2VfYWRkKHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOworaW50IGNyeXB0b19k ZXZpY2VfYWRkKHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOwordm9pZCBfX2NyeXB0b19kZXZpY2Vf cmVtb3ZlKHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOwordm9pZCBjcnlwdG9fZGV2aWNlX3JlbW92 ZShzdHJ1Y3QgY3J5cHRvX2RldmljZSAqKTsKK2ludCBtYXRjaF9pbml0aWFsaXplcihzdHJ1Y3Qg Y3J5cHRvX2RldmljZSAqLCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKik7Citp bnQgX19tYXRjaF9pbml0aWFsaXplcihzdHJ1Y3QgY3J5cHRvX2NhcGFiaWxpdHkgKiwgc3RydWN0 IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICopOworCitpbmxpbmUgdm9pZCBjcnlwdG9fc2Vz c2lvbl9pbnNlcnRfbWFpbihzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2LCBzdHJ1Y3QgY3J5cHRv X3Nlc3Npb24gKnMpOworaW5saW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25faW5zZXJ0KHN0cnVjdCBj cnlwdG9fZGV2aWNlICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcyk7CisKKyNlbmRpZiAv KiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19BQ1JZUFRPX0ggKi8KZGlmZiAtTnJ1IC90bXAv ZW1wdHkvY3J5cHRvX2Nvbm4uYyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL2NyeXB0b19jb25u LmMKLS0tIC90bXAvZW1wdHkvY3J5cHRvX2Nvbm4uYwkxOTcwLTAxLTAxIDAzOjAwOjAwLjAwMDAw MDAwMCArMDMwMAorKysgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9jcnlwdG9fY29ubi5jCTIw MDQtMTEtMDIgMTg6NDQ6MjEuMDAwMDAwMDAwICswMzAwCkBAIC0wLDAgKzEsMTk1IEBACisvKgor ICogCWNyeXB0b19jb25uLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQb2x5 YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK KyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24s IE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2lu Y2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Cisj aW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8 bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiYWNyeXB0by5oIgorI2luY2x1ZGUgImNyeXB0 b19sYi5oIgorCisjaW5jbHVkZSAiLi4vY29ubmVjdG9yL2Nvbm5lY3Rvci5oIgorCisjaW5jbHVk ZSAiY3J5cHRvX2Nvbm4uaCIKKworc3RhdGljIHN0cnVjdCBjYl9pZCBjcnlwdG9fY29ubl9pZCA9 IHsgMHhkZWFkLCAweDAwMDAgfTsKK3N0YXRpYyBjaGFyIGNyeXB0b19jb25uX25hbWVbXSA9ICJj cmNvbm4iOworCitzdGF0aWMgdm9pZCBjcnlwdG9fY29ubl9jYWxsYmFjayh2b2lkICpkYXRhKQor eworCXN0cnVjdCBjbl9tc2cgKm1zZywgKnJlcGx5OworCXN0cnVjdCBjcnlwdG9fY29ubl9kYXRh ICpkLCAqY21kOworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7CisJdTMyIHNlc3Npb25zOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAJbXNnID0gKHN0cnVjdCBjbl9tc2cgKilk YXRhOworICAgICAgIAlkID0gKHN0cnVjdCBjcnlwdG9fY29ubl9kYXRhICopbXNnLT5kYXRhOwor CisJaWYgKG1zZy0+bGVuIDwgc2l6ZW9mKCpkKSkKKwl7CisJCWRwcmludGsoS0VSTl9FUlIgIldy b25nIG1lc3NhZ2UgdG8gY3J5cHRvIGNvbm5lY3RvcjogbXNnLT5sZW49JXUgPCAldS5cbiIsIAor CQkJCW1zZy0+bGVuLCBzaXplb2YoKmQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtc2ctPmxl biAhPSBzaXplb2YoKmQpICsgZC0+bGVuKQorCXsKKwkJZHByaW50ayhLRVJOX0VSUiAiV3Jvbmcg bWVzc2FnZSB0byBjcnlwdG8gY29ubmVjdG9yOiBtc2ctPmxlbj0ldSAhPSAldS5cbiIsIAorCQkJ CW1zZy0+bGVuLCBzaXplb2YoKmQpICsgZC0+bGVuKTsKKwkJcmV0dXJuOworCX0KKworCWRldiA9 IGNyeXB0b19kZXZpY2VfZ2V0X25hbWUoZC0+bmFtZSk7CisJaWYgKCFkZXYpCisJeworCQlkcHJp bnRrKEtFUk5fSU5GTyAiQ3J5cHRvIGRldmljZSAlcyB3YXMgbm90IGZvdW5kLlxuIiwgZC0+bmFt ZSk7CisJCXJldHVybjsKKwl9CisJCQkKKwlzd2l0Y2ggKGQtPmNtZCkKKwl7CisJCWNhc2UgQ1JZ UFRPX0NPTk5fUkVBRF9TRVNTSU9OUzoKKwkJcmVwbHkgPSBrbWFsbG9jKHNpemVvZigqbXNnKSAr IHNpemVvZigqY21kKSArIHNpemVvZihzZXNzaW9ucyksIEdGUF9BVE9NSUMpOworCQlpZiAocmVw bHkpIHsKKwkJCW1lbWNweShyZXBseSwgbXNnLCBzaXplb2YoKnJlcGx5KSk7CisJCQlyZXBseS0+ bGVuID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKHNlc3Npb25zKTsKKworCQkJLyoKKwkJCSAqIFNl ZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiBjb25uZWN0b3IuYworCQkJICovCisJCQlyZXBseS0+ YWNrKys7CisKKwkJCWNtZCA9IChzdHJ1Y3QgY3J5cHRvX2Nvbm5fZGF0YSAqKShyZXBseSArIDEp OworCQkJbWVtY3B5KGNtZCwgZCwgc2l6ZW9mKCpjbWQpKTsKKwkJCWNtZC0+bGVuID0gc2l6ZW9m KHNlc3Npb25zKTsKKwkJCQorCQkJc2Vzc2lvbnMgPSBhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQp OworCisJCQltZW1jcHkoY21kKzEsICZzZXNzaW9ucywgc2l6ZW9mKHNlc3Npb25zKSk7CisJCQkK KwkJCWNuX25ldGxpbmtfc2VuZChyZXBseSwgMCk7CisKKwkJCWtmcmVlKHJlcGx5KTsKKwkJfSBl bHNlCisJCQlkcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgaW4g cmVwbHkgdG8gY29tYW1uZCAweCV4LlxuIiwKKwkJCSAgICAgICBzaXplb2YoKm1zZykgKyBzaXpl b2YoKmNtZCksIGQtPmNtZCk7CisJCWJyZWFrOworCQljYXNlIENSWVBUT19DT05OX0RVTVBfUVVF VUU6CisJCXJlcGx5ID0ga21hbGxvYyhzaXplb2YoKm1zZykgKyBzaXplb2YoKmNtZCkgKyAxMDI0 KnNpemVvZihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIpLCBHRlBfQVRPTUlDKTsK KwkJaWYgKHJlcGx5KSB7CisJCQlzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnM7CisJCQlzdHJ1Y3Qg Y3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKnB0cjsKKwkJCQorCQkJbWVtY3B5KHJlcGx5LCBt c2csIHNpemVvZigqcmVwbHkpKTsKKworCQkJLyoKKwkJCSAqIFNlZSBwcm90b2NvbCBkZXNjcmlw dGlvbiBpbiBjb25uZWN0b3IuYworCQkJICovCisJCQlyZXBseS0+YWNrKys7CisKKwkJCWNtZCA9 IChzdHJ1Y3QgY3J5cHRvX2Nvbm5fZGF0YSAqKShyZXBseSArIDEpOworCQkJbWVtY3B5KGNtZCwg ZCwgc2l6ZW9mKCpjbWQpKTsKKwkJCQorCQkJcHRyID0gKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9p bml0aWFsaXplciAqKShjbWQrMSk7CisKKwkJCXNlc3Npb25zID0gMDsKKwkJCXNwaW5fbG9ja19p cnFzYXZlKCZkZXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRy eShzLCAmZGV2LT5zZXNzaW9uX2xpc3QsIGRldl9xdWV1ZV9lbnRyeSkKKwkJCXsKKwkJCQltZW1j cHkocHRyLCAmcy0+Y2ksIHNpemVvZigqcHRyKSk7CisJCQkJc2Vzc2lvbnMrKzsKKwkJCQlwdHIr KzsKKworCQkJCWlmIChzZXNzaW9ucyA+PSAxMDI0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJCQkKKwkJ CWNtZC0+bGVuID0gc2l6ZW9mKCpwdHIpKnNlc3Npb25zOworCQkJcmVwbHktPmxlbiA9IHNpemVv ZigqY21kKSArIGNtZC0+bGVuOworCQkJCisJCQljbl9uZXRsaW5rX3NlbmQocmVwbHksIDApOwor CisJCQlrZnJlZShyZXBseSk7CisJCX0gZWxzZQorCQkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVk IHRvIGFsbG9jYXRlICVkIGJ5dGVzIGluIHJlcGx5IHRvIGNvbWFtbmQgMHgleC5cbiIsCisJCQkg ICAgICAgc2l6ZW9mKCptc2cpICsgc2l6ZW9mKCpjbWQpLCBkLT5jbWQpOworCQlicmVhazsKKwkJ Y2FzZSBDUllQVE9fR0VUX1NUQVQ6CisJCXJlcGx5ID0ga21hbGxvYyhzaXplb2YoKm1zZykgKyBz aXplb2YoKmNtZCkgKyBzaXplb2Yoc3RydWN0IGNyeXB0b19kZXZpY2Vfc3RhdCksIEdGUF9BVE9N SUMpOworCQlpZiAocmVwbHkpIHsKKwkJCXN0cnVjdCBjcnlwdG9fZGV2aWNlX3N0YXQgKnB0cjsK KwkJCQorCQkJbWVtY3B5KHJlcGx5LCBtc2csIHNpemVvZigqcmVwbHkpKTsKKwkJCXJlcGx5LT5s ZW4gPSBzaXplb2YoKmNtZCkgKyBzaXplb2YoKnB0cik7CisKKwkJCS8qCisJCQkgKiBTZWUgcHJv dG9jb2wgZGVzY3JpcHRpb24gaW4gY29ubmVjdG9yLmMKKwkJCSAqLworCQkJcmVwbHktPmFjaysr OworCisJCQljbWQgPSAoc3RydWN0IGNyeXB0b19jb25uX2RhdGEgKikocmVwbHkgKyAxKTsKKwkJ CW1lbWNweShjbWQsIGQsIHNpemVvZigqY21kKSk7CisJCQljbWQtPmxlbiA9IHNpemVvZigqcHRy KTsKKwkJCQorCQkJcHRyID0gKHN0cnVjdCBjcnlwdG9fZGV2aWNlX3N0YXQgKikoY21kKzEpOwor CQkJbWVtY3B5KHB0ciwgJmRldi0+c3RhdCwgc2l6ZW9mKCpwdHIpKTsKKwkJCQorCQkJY25fbmV0 bGlua19zZW5kKHJlcGx5LCAwKTsKKworCQkJa2ZyZWUocmVwbHkpOworCQl9IGVsc2UKKwkJCWRw cmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBpbiByZXBseSB0byBj b21hbW5kIDB4JXguXG4iLAorCQkJICAgICAgIHNpemVvZigqbXNnKSArIHNpemVvZigqY21kKSwg ZC0+Y21kKTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKEtFUk5fRVJSICJXcm9u ZyBvcGVyYXRpb24gMHglMDR4IGZvciBjcnlwdG8gY29ubmVjdG9yLlxuIiwgCisJCQkJCWQtPmNt ZCk7CisJCQlyZXR1cm47CisJfQorCisJY3J5cHRvX2RldmljZV9wdXQoZGV2KTsKK30KKworaW50 IGNyeXB0b19jb25uX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCQorCWVyciA9IGNuX2FkZF9j YWxsYmFjaygmY3J5cHRvX2Nvbm5faWQsIGNyeXB0b19jb25uX25hbWUsIGNyeXB0b19jb25uX2Nh bGxiYWNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHByaW50ayhLRVJOX0lORk8g IkNyeXB0byBjb25uZWN0b3IgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC5cbiIpOworCisJcmV0dXJu IDA7Cit9CisKK3ZvaWQgY3J5cHRvX2Nvbm5fZmluaSh2b2lkKQoreworCWNuX2RlbF9jYWxsYmFj aygmY3J5cHRvX2Nvbm5faWQpOworCWRwcmludGsoS0VSTl9JTkZPICJDcnlwdG8gY29ubmVjdG9y IGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZC5cbiIpOworfQpkaWZmIC1OcnUgL3RtcC9lbXB0eS9j cnlwdG9fY29ubi5oIGxpbnV4LTIuNi9kcml2ZXJzL2FjcnlwdG8vY3J5cHRvX2Nvbm4uaAotLS0g L3RtcC9lbXB0eS9jcnlwdG9fY29ubi5oCTE5NzAtMDEtMDEgMDM6MDA6MDAuMDAwMDAwMDAwICsw MzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL2NyeXB0b19jb25uLmgJMjAwNC0xMS0w MiAxODo0NDoyMS4wMDAwMDAwMDAgKzAzMDAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIAljcnlw dG9fY29ubi5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPGpv aG5wb2xAMmthLm1pcHQucnU+CisgKiAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2Yg dGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor ICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3Vu ZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjEx MS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DUllQVE9fQ09OTl9ICisjZGVmaW5lIF9fQ1JZ UFRPX0NPTk5fSAorCisjaW5jbHVkZSAiYWNyeXB0by5oIgorCisjZGVmaW5lIENSWVBUT19DT05O X1JFQURfU0VTU0lPTlMJCTAKKyNkZWZpbmUgQ1JZUFRPX0NPTk5fRFVNUF9RVUVVRQkJCTEKKyNk ZWZpbmUgQ1JZUFRPX0dFVF9TVEFUCQkJCTIKKworc3RydWN0IGNyeXB0b19jb25uX2RhdGEKK3sK KwljaGFyCQkJbmFtZVtTQ0FDSEVfTkFNRUxFTl07CisJX191MTYJCQljbWQ7CisJX191MTYJCQls ZW47CisJX191OAkJCWRhdGFbMF07Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCitpbnQgY3J5 cHRvX2Nvbm5faW5pdCh2b2lkKTsKK3ZvaWQgY3J5cHRvX2Nvbm5fZmluaSh2b2lkKTsKKworI2Vu ZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0NSWVBUT19DT05OX0ggKi8KZGlmZiAt TnJ1IC90bXAvZW1wdHkvY3J5cHRvX2RlZi5oIGxpbnV4LTIuNi9kcml2ZXJzL2FjcnlwdG8vY3J5 cHRvX2RlZi5oCi0tLSAvdG1wL2VtcHR5L2NyeXB0b19kZWYuaAkxOTcwLTAxLTAxIDAzOjAwOjAw LjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9jcnlwdG9fZGVm LmgJMjAwNC0xMS0wMiAxODo0NDoyMS4wMDAwMDAwMDAgKzAzMDAKQEAgLTAsMCArMSwzOCBAQAor LyoKKyAqIAljcnlwdG9fZGVmLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQ b2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NSWVBUT19ERUZfSAorI2Rl ZmluZSBfX0NSWVBUT19ERUZfSAorCisjZGVmaW5lIENSWVBUT19PUF9ERUNSWVBUCTAKKyNkZWZp bmUgQ1JZUFRPX09QX0VOQ1JZUFQJMQorI2RlZmluZSBDUllQVE9fT1BfSE1BQwkJMgorCisjZGVm aW5lIENSWVBUT19NT0RFX0VDQgkJMAorI2RlZmluZSBDUllQVE9fTU9ERV9DQkMJCTEKKyNkZWZp bmUgQ1JZUFRPX01PREVfQ0ZCCQkyCisjZGVmaW5lIENSWVBUT19NT0RFX09GQgkJMworCisjZGVm aW5lIENSWVBUT19UWVBFX0FFU18xMjgJMAorI2RlZmluZSBDUllQVE9fVFlQRV9BRVNfMTkyCTEK KyNkZWZpbmUgQ1JZUFRPX1RZUEVfQUVTXzI1NgkyCisKKyNlbmRpZiAvKiBfX0NSWVBUT19ERUZf SCAqLwpkaWZmIC1OcnUgL3RtcC9lbXB0eS9jcnlwdG9fZGV2LmMgbGludXgtMi42L2RyaXZlcnMv YWNyeXB0by9jcnlwdG9fZGV2LmMKLS0tIC90bXAvZW1wdHkvY3J5cHRvX2Rldi5jCTE5NzAtMDEt MDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRv L2NyeXB0b19kZXYuYwkyMDA0LTExLTAyIDE4OjQ0OjIxLjAwMDAwMDAwMCArMDMwMApAQCAtMCww ICsxLDM4NyBAQAorLyoKKyAqIAljcnlwdG9fZGV2LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIw MDQgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQor ICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3Vp dGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4 L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21v ZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9s aXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNl Lmg+CisKKyNpbmNsdWRlICJhY3J5cHRvLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQoY2Rldl9saXN0 KTsKK3N0YXRpYyBzcGlubG9ja190IGNkZXZfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0 YXRpYyB1MzIgY2Rldl9pZHM7CisKK3N0cnVjdCBsaXN0X2hlYWQgKmNyeXB0b19kZXZpY2VfbGlz dCA9ICZjZGV2X2xpc3Q7CitzcGlubG9ja190ICpjcnlwdG9fZGV2aWNlX2xvY2sgPSAmY2Rldl9s b2NrOworCitzdGF0aWMgaW50IGNyeXB0b19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY3J5 cHRvX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwor c3RhdGljIGludCBjcnlwdG9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgY3J5cHRvX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQor eworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNy eXB0b19kZXZpY2UsIGRldmljZSk7CisKKwljb21wbGV0ZSgmZC0+ZGV2X3JlbGVhc2VkKTsKK30K Kworc3RhdGljIHZvaWQgY3J5cHRvX2NsYXNzX3JlbGVhc2Uoc3RydWN0IGNsYXNzICpjbGFzcykK K3sKK30KKworc3RhdGljIHZvaWQgY3J5cHRvX2NsYXNzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBj bGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKK30KKworc3RydWN0IGNsYXNzIGNyeXB0b19jbGFz cyA9Cit7CisJLm5hbWUJCQk9ICJhY3J5cHRvIiwKKwkuY2xhc3NfcmVsZWFzZQkJPSBjcnlwdG9f Y2xhc3NfcmVsZWFzZSwKKwkucmVsZWFzZQkJPSBjcnlwdG9fY2xhc3NfcmVsZWFzZV9kZXZpY2UK K307CisKK3N0cnVjdCBidXNfdHlwZSBjcnlwdG9fYnVzX3R5cGUgPQoreworCS5uYW1lCQkJPSAi YWNyeXB0byIsCisJLm1hdGNoCQkJPSBjcnlwdG9fbWF0Y2gKK307CisKK3N0cnVjdCBkZXZpY2Vf ZHJpdmVyIGNyeXB0b19kcml2ZXIgPSB7CisJLm5hbWUgPSAiY3J5cHRvX2RyaXZlciIsCisJLmJ1 cyA9ICZjcnlwdG9fYnVzX3R5cGUsCisJLnByb2JlID0gY3J5cHRvX3Byb2JlLAorCS5yZW1vdmUg PSBjcnlwdG9fcmVtb3ZlLAorfTsKKworc3RydWN0IGRldmljZSBjcnlwdG9fZGV2ID0geworCS5w YXJlbnQgPSBOVUxMLAorCS5idXMgPSAmY3J5cHRvX2J1c190eXBlLAorCS5idXNfaWQgPSAiQXN5 bmNocm9ub3VzIGNyeXB0byIsCisJLmRyaXZlciA9ICZjcnlwdG9fZHJpdmVyLAorCS5yZWxlYXNl ID0gJmNyeXB0b19yZWxlYXNlCit9OworCitzdGF0aWMgc3NpemVfdCBzZXNzaW9uc19zaG93KHN0 cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcnlwdG9fZGV2 aWNlICpkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2UsIGNsYXNzX2Rl dmljZSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYXRvbWljX3JlYWQoJmQtPnJl ZmNudCkpOworfQorc3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2Ug KmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkID0gY29udGFpbmVy X29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2UsIGNsYXNzX2RldmljZSk7CisKKwlyZXR1cm4g c3ByaW50ZihidWYsICIlc1xuIiwgZC0+bmFtZSk7Cit9CitzdGF0aWMgc3NpemVfdCBkZXZpY2Vz X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGNy eXB0b19kZXZpY2UgKmQ7CisJaW50IG9mZiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZjZGV2X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KGQsICZjZGV2X2xpc3QsIGNkZXZfZW50cnkpCisJeworCQlvZmYgKz0gc3ByaW50ZihidWYr b2ZmLCAiJXMgIiwgZC0+bmFtZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZXZf bG9jaywgZmxhZ3MpOworCisJaWYgKCFvZmYpCisJCW9mZiA9IHNwcmludGYoYnVmLCAiTm8gZGV2 aWNlcyByZWdpc3RlcmVkIHlldC4iKTsKKworCW9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJcbiIp OworCQorCXJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGttZW1fZmFpbGVkX3Nob3co c3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGNyeXB0b19k ZXZpY2UgKmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY3J5cHRvX2RldmljZSwgY2xhc3Nf ZGV2aWNlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIGQtPnN0YXQua21lbV9m YWlsZWQpOworfQorc3RhdGljIHNzaXplX3Qgc3N0YXJ0ZWRfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2 aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZCA9IGNvbnRh aW5lcl9vZihkZXYsIHN0cnVjdCBjcnlwdG9fZGV2aWNlLCBjbGFzc19kZXZpY2UpOworCisJcmV0 dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgZC0+c3RhdC5zc3RhcnRlZCk7Cit9CitzdGF0aWMg c3NpemVfdCBzZmluaXNoZWRfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1 ZikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVj dCBjcnlwdG9fZGV2aWNlLCBjbGFzc19kZXZpY2UpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAi JWxsdVxuIiwgZC0+c3RhdC5zZmluaXNoZWQpOworfQorc3RhdGljIHNzaXplX3Qgc2NvbXBsZXRl ZF9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBj cnlwdG9fZGV2aWNlICpkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2Us IGNsYXNzX2RldmljZSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCBkLT5zdGF0 LnNjb21wbGV0ZWQpOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2Vzc2lvbnMsIDA0 NDQsIHNlc3Npb25zX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUs IDA0NDQsIG5hbWVfc2hvdywgTlVMTCk7CitDTEFTU19ERVZJQ0VfQVRUUihkZXZpY2VzLCAwNDQ0 LCBkZXZpY2VzX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNjb21wbGV0 ZWQsIDA0NDQsIHNjb21wbGV0ZWRfc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FU VFIoc3N0YXJ0ZWQsIDA0NDQsIHNzdGFydGVkX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RF VklDRV9BVFRSKHNmaW5pc2hlZCwgMDQ0NCwgc2ZpbmlzaGVkX3Nob3csIE5VTEwpOworc3RhdGlj IENMQVNTX0RFVklDRV9BVFRSKGttZW1fZmFpbGVkLCAwNDQ0LCBrbWVtX2ZhaWxlZF9zaG93LCBO VUxMKTsKKworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9kZXZpY2Uoc3RydWN0IGNyeXB0b19k ZXZpY2UgKmQxLCBzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZDIpCit7CisJaWYgKCFzdHJuY21wKGQx LT5uYW1lLCBkMi0+bmFtZSwgc2l6ZW9mKGQxLT5uYW1lKSkpCisJCXJldHVybiAxOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2VfYXR0cmlidXRlcyhzdHJ1Y3Qg Y3J5cHRvX2RldmljZSAqZGV2KQoreworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5j bGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9zZXNzaW9ucyk7CisJY2xhc3NfZGV2aWNl X2NyZWF0ZV9maWxlKCZkZXYtPmNsYXNzX2RldmljZSwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUp OworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19k ZXZpY2VfYXR0cl9zY29tcGxldGVkKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfc3N0YXJ0ZWQpOworCWNsYXNzX2Rldmlj ZV9jcmVhdGVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9zZmlu aXNoZWQpOworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZj bGFzc19kZXZpY2VfYXR0cl9rbWVtX2ZhaWxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9k ZXZpY2VfYXR0cmlidXRlcyhzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2KQoreworCWNsYXNzX2Rl dmljZV9yZW1vdmVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9z ZXNzaW9ucyk7CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmNsYXNzX2RldmljZSwg JmNsYXNzX2RldmljZV9hdHRyX25hbWUpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2 LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9zY29tcGxldGVkKTsKKwljbGFzc19k ZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJf c3N0YXJ0ZWQpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2Us ICZjbGFzc19kZXZpY2VfYXR0cl9zZmluaXNoZWQpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmls ZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9rbWVtX2ZhaWxlZCk7Cit9 CisKK2ludCBfX21hdGNoX2luaXRpYWxpemVyKHN0cnVjdCBjcnlwdG9fY2FwYWJpbGl0eSAqY2Fw LCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKmNpKQoreworCWlmICgJY2FwLT5v cGVyYXRpb24gPT0gY2ktPm9wZXJhdGlvbiAmJgorCQljYXAtPnR5cGUgPT0gY2ktPnR5cGUgJiYK KwkJY2FwLT5tb2RlID09IChjaS0+bW9kZSAmIDB4MWZmZikpCisJCXJldHVybiAxOworCisJcmV0 dXJuIDA7Cit9CisKK2ludCBtYXRjaF9pbml0aWFsaXplcihzdHJ1Y3QgY3J5cHRvX2RldmljZSAq ZGV2LCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKmNpKQoreworCWludCBpOwor CQorCWZvciAoaT0wOyBpPGRldi0+Y2FwX251bWJlcjsgKytpKQorCXsKKwkJc3RydWN0IGNyeXB0 b19jYXBhYmlsaXR5ICpjYXAgPSAmZGV2LT5jYXBbaV07CisJCQorCQlpZiAoX19tYXRjaF9pbml0 aWFsaXplcihjYXAsIGNpKSkKKwkJeworCQkJaWYgKGNhcC0+cWxlbiA+PSBhdG9taWNfcmVhZCgm ZGV2LT5yZWZjbnQpICsgMSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOwor fQorCisKK2lubGluZSB2b2lkIGNyeXB0b19kZXZpY2VfZ2V0KHN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkZXYpCit7CisJYXRvbWljX2luYygmZGV2LT5yZWZjbnQpOworfQorCitpbmxpbmUgc3RydWN0 IGNyeXB0b19kZXZpY2UgKmNyeXB0b19kZXZpY2VfZ2V0X25hbWUoY2hhciAqbmFtZSkKK3sKKwlz dHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2OworCWludCBmb3VuZCA9IDA7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2Rldl9sb2NrLCBmbGFncyk7CisJbGlz dF9mb3JfZWFjaF9lbnRyeShkZXYsICZjZGV2X2xpc3QsIGNkZXZfZW50cnkpCisJeworCQlpZiAo IXN0cmNtcChkZXYtPm5hbWUsIG5hbWUpKQorCQl7CisJCQlmb3VuZCA9IDE7CisJCQljcnlwdG9f ZGV2aWNlX2dldChkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmY2Rldl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gTlVMTDsK KwkKKwlyZXR1cm4gZGV2OworfQorCitpbmxpbmUgdm9pZCBjcnlwdG9fZGV2aWNlX3B1dChzdHJ1 Y3QgY3J5cHRvX2RldmljZSAqZGV2KQoreworCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKK30K KworCitpbnQgX19jcnlwdG9fZGV2aWNlX2FkZChzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2KQor eworCWludCBlcnI7CisKKwltZW1zZXQoJmRldi0+c3RhdCwgMCwgc2l6ZW9mKGRldi0+c3RhdCkp OworCXNwaW5fbG9ja19pbml0KCZkZXYtPnN0YXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRl di0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2Vzc2lvbl9sb2NrKTsKKwlJTklUX0xJ U1RfSEVBRCgmZGV2LT5zZXNzaW9uX2xpc3QpOworCWF0b21pY19zZXQoJmRldi0+cmVmY250LCAw KTsKKwlkZXYtPnNpZCA9IDA7CisJZGV2LT5mbGFncyA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZk ZXYtPmRldl9yZWxlYXNlZCk7CisJbWVtY3B5KCZkZXYtPmRldmljZSwgJmNyeXB0b19kZXYsIHNp emVvZihzdHJ1Y3QgZGV2aWNlKSk7CisJZGV2LT5kcml2ZXIgPSAmY3J5cHRvX2RyaXZlcjsKKwor CXNucHJpbnRmKGRldi0+ZGV2aWNlLmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2aWNlLmJ1c19pZCks ICIlcyIsIGRldi0+bmFtZSk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldmljZSk7 CisJaWYgKGVycikKKwl7CisJCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBj cnlwdG8gZGV2aWNlICVzOiBlcnI9JWQuXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGVycik7CisJCXJl dHVybiBlcnI7CisJfQorCisJc25wcmludGYoZGV2LT5jbGFzc19kZXZpY2UuY2xhc3NfaWQsIHNp emVvZihkZXYtPmNsYXNzX2RldmljZS5jbGFzc19pZCksICIlcyIsIGRldi0+bmFtZSk7CisJZGV2 LT5jbGFzc19kZXZpY2UuZGV2IAk9ICZkZXYtPmRldmljZTsKKwlkZXYtPmNsYXNzX2RldmljZS5j bGFzcwk9ICZjcnlwdG9fY2xhc3M7CisJCisJZXJyID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZk ZXYtPmNsYXNzX2RldmljZSk7CisJaWYgKGVycikKKwl7CisJCWRwcmludGsoS0VSTl9FUlIgIkZh aWxlZCB0byByZWdpc3RlciBjcnlwdG8gY2xhc3MgZGV2aWNlICVzOiBlcnI9JWQuXG4iLCAKKwkJ CQlkZXYtPm5hbWUsIGVycik7CisJCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldmljZSk7CisJ CXJldHVybiBlcnI7CisJfQorCisJY3JlYXRlX2RldmljZV9hdHRyaWJ1dGVzKGRldik7CisJCisJ cmV0dXJuIDA7Cit9CisKK3ZvaWQgX19jcnlwdG9fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgY3J5cHRv X2RldmljZSAqZGV2KQoreworCXJlbW92ZV9kZXZpY2VfYXR0cmlidXRlcyhkZXYpOworCWNsYXNz X2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPmNsYXNzX2RldmljZSk7CisJZGV2aWNlX3VucmVnaXN0 ZXIoJmRldi0+ZGV2aWNlKTsKK30KKworaW50IGNyeXB0b19kZXZpY2VfYWRkKHN0cnVjdCBjcnlw dG9fZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ ZXJyID0gX19jcnlwdG9fZGV2aWNlX2FkZChkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2Rldl9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmRl di0+Y2Rldl9lbnRyeSwgJmNkZXZfbGlzdCk7CisJZGV2LT5pZCA9ICsrY2Rldl9pZHM7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmY2Rldl9sb2NrLCBmbGFncyk7CisKKwlkcHJpbnRrKEtFUk5f SU5GTyAiQ3J5cHRvIGRldmljZSAlcyB3YXMgcmVnaXN0ZXJlZCB3aXRoIElEPSV4LlxuIiwgZGV2 LT5uYW1lLCBkZXYtPmlkKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNyeXB0b19kZXZpY2Vf cmVtb3ZlKHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNyeXB0b19kZXZp Y2UgKl9fZGV2LCAqbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19jcnlwdG9fZGV2aWNl X3JlbW92ZShkZXYpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjZGV2X2xvY2ssIGZsYWdzKTsK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoX19kZXYsIG4sICZjZGV2X2xpc3QsIGNkZXZfZW50 cnkpCisJeworCQlpZiAoY29tcGFyZV9kZXZpY2UoX19kZXYsIGRldikpCisJCXsKKwkJCWxpc3Rf ZGVsKCZfX2Rldi0+Y2Rldl9lbnRyeSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZGV2 X2xvY2ssIGZsYWdzKTsKKworCQkJLyoKKwkJCSAqIEluIHRlc3QgY2FzZXMgb3Igd2hlbiBjcnlw dG8gZGV2aWNlIGRyaXZlciBpcyBub3Qgd3JpdHRlbiBjb3JyZWN0bHksCisJCQkgKiBpdCdzIC0+ ZGF0YV9yZWFkeSgpIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZW4gYW55bW9yZQorCQkJICogYWZ0 ZXIgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSBjcnlwdG8gZGV2aWNlIGxpc3QuCisJCQkgKgorCQkJ ICogRm9yIHN1Y2ggY2FzZXMgd2UgZWl0aGVyIHNob3VsZCBwcm92aWRlIC0+Zmx1c2goKSBjYWxs CisJCQkgKiBvciBwcm9wZXJseSB3cml0ZSAtPmRhdGFfcmVhZHkoKSBtZXRob2QuCisJCQkgKi8K KworCQkJd2hpbGUgKGF0b21pY19yZWFkKCZfX2Rldi0+cmVmY250KSkKKwkJCXsKKworCQkJCWRw cmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVk LlxuIiwgCisJCQkJCQlfX2Rldi0+bmFtZSwgYXRvbWljX3JlYWQoJmRldi0+cmVmY250KSk7CisK KwkJCQkvKgorCQkJCSAqIEhhY2sgem9uZTogeW91IG5lZWQgdG8gd3JpdGUgZ29vZCAtPmRhdGFf cmVhZHkoKQorCQkJCSAqIGFuZCBjcnlwdG8gZGV2aWNlIGRyaXZlciBpdHNlbGYuCisJCQkJICoK KwkJCQkgKiBEcml2ZXIgc2hvdWQgbm90IGJ1enogaWYgaXQgaGFzIHBlbmRpbmcgc2Vzc2lvbnMK KwkJCQkgKiBpbiBpdCdzIHF1ZXVlIGFuZCBpdCB3YXMgcmVtb3ZlZCBmcm9tIGdsb2JhbCBkZXZp Y2UgbGlzdC4KKwkJCQkgKgorCQkJCSAqIEFsdGhvdWdoIEkgY2FuIHdvcmthcm91bmQgaXQgaGVy ZSwgZm9yIGV4YW1wbGUgYnkKKwkJCQkgKiBmbHVzaGluZyB0aGUgd2hvbGUgcXVldWUgYW5kIGRy b3AgYWxsIHBlbmRpbmcgc2Vzc2lvbnMuCisJCQkJICovCisKKwkJCQlfX2Rldi0+ZGF0YV9yZWFk eShfX2Rldik7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwor CQkJCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCQkJfQorCQkJCisJCQlkcHJpbnRrKEtFUk5fRVJS ICJDcnlwdG8gZGV2aWNlICVzIHdhcyB1bnJlZ2lzdGVyZWQuXG4iLCBkZXYtPm5hbWUpOworCQkJ cmV0dXJuOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZXZfbG9jaywgZmxh Z3MpOworCQkJCisJZHByaW50ayhLRVJOX0VSUiAiQ3J5cHRvIGRldmljZSAlcyB3YXMgbm90IHJl Z2lzdGVyZWQuXG4iLCBkZXYtPm5hbWUpOworfQorCitFWFBPUlRfU1lNQk9MKGNyeXB0b19kZXZp Y2VfYWRkKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2RldmljZV9yZW1vdmUpOworRVhQT1JUX1NZ TUJPTChjcnlwdG9fZGV2aWNlX2dldCk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19kZXZpY2VfZ2V0 X25hbWUpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fZGV2aWNlX3B1dCk7CitFWFBPUlRfU1lNQk9M KG1hdGNoX2luaXRpYWxpemVyKTsKK0VYUE9SVF9TWU1CT0woX19tYXRjaF9pbml0aWFsaXplcik7 CmRpZmYgLU5ydSAvdG1wL2VtcHR5L2NyeXB0b19sYi5jIGxpbnV4LTIuNi9kcml2ZXJzL2Fjcnlw dG8vY3J5cHRvX2xiLmMKLS0tIC90bXAvZW1wdHkvY3J5cHRvX2xiLmMJMTk3MC0wMS0wMSAwMzow MDowMC4wMDAwMDAwMDAgKzAzMDAKKysrIGxpbnV4LTIuNi9kcml2ZXJzL2FjcnlwdG8vY3J5cHRv X2xiLmMJMjAwNC0xMS0wMiAxODo0NDoyMS4wMDAwMDAwMDAgKzAzMDAKQEAgLTAsMCArMSw2NzMg QEAKKy8qCisgKiAJY3J5cHRvX2xiLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5p eSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor ICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m dHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBC b3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFt Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Cisj aW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cisj aW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlICJhY3J5cHRvLmgiCisjaW5jbHVkZSAi Y3J5cHRvX2xiLmgiCisjaW5jbHVkZSAiY3J5cHRvX3N0YXQuaCIKKyNpbmNsdWRlICJjcnlwdG9f cm91dGUuaCIKKworc3RhdGljIExJU1RfSEVBRChjcnlwdG9fbGJfbGlzdCk7CitzdGF0aWMgc3Bp bmxvY2tfdCBjcnlwdG9fbGJfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBpbnQg bGJfbnVtID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2xiICpjdXJyZW50X2xiLCAqZGVmYXVs dF9sYjsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfZXhpdGVkOworc3RhdGljIGlu dCBuZWVkX2V4aXQ7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNyeXB0b19sYl9x dWV1ZTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChjcnlwdG9fbGJfd2FpdF9xdWV1 ZSk7CisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICpjcnlwdG9fZGV2aWNlX2xpc3Q7CitleHRl cm4gc3BpbmxvY2tfdCAqY3J5cHRvX2RldmljZV9sb2NrOworCitleHRlcm4gaW50IGZvcmNlX2xi X3JlbW92ZTsKK2V4dGVybiBzdHJ1Y3QgY3J5cHRvX2RldmljZSBtYWluX2NyeXB0b19kZXZpY2U7 CisKK3N0YXRpYyBpbmxpbmUgaW50IGxiX2lzX2N1cnJlbnQoc3RydWN0IGNyeXB0b19sYiAqbCkK K3sKKwlyZXR1cm4gKGwtPmNyeXB0b19kZXZpY2VfbGlzdCAhPSBOVUxMICYmIGwtPmNyeXB0b19k ZXZpY2VfbG9jayAhPSBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGJfaXNfZGVmYXVs dChzdHJ1Y3QgY3J5cHRvX2xiICpsKQoreworCXJldHVybiAobCA9PSBkZWZhdWx0X2xiKTsKK30K Kworc3RhdGljIGlubGluZSB2b2lkIF9fbGJfc2V0X2N1cnJlbnQoc3RydWN0IGNyeXB0b19sYiAq bCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2xiICpjID0gY3VycmVudF9sYjsKKwkKKwlpZiAoYykKKwl7 CisJCWwtPmNyeXB0b19kZXZpY2VfbGlzdCA9IGNyeXB0b19kZXZpY2VfbGlzdDsKKwkJbC0+Y3J5 cHRvX2RldmljZV9sb2NrID0gY3J5cHRvX2RldmljZV9sb2NrOworCQljdXJyZW50X2xiID0gbDsK KwkJYy0+Y3J5cHRvX2RldmljZV9saXN0ID0gTlVMTDsKKwkJYy0+Y3J5cHRvX2RldmljZV9sb2Nr ID0gTlVMTDsKKwl9CisJZWxzZQorCXsKKwkJbC0+Y3J5cHRvX2RldmljZV9saXN0ID0gY3J5cHRv X2RldmljZV9saXN0OworCQlsLT5jcnlwdG9fZGV2aWNlX2xvY2sgPSBjcnlwdG9fZGV2aWNlX2xv Y2s7CisJCWN1cnJlbnRfbGIgPSBsOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGxiX3Nl dF9jdXJyZW50KHN0cnVjdCBjcnlwdG9fbGIgKmwpCit7CisJc3RydWN0IGNyeXB0b19sYiAqYyA9 IGN1cnJlbnRfbGI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoYykKKwl7CisJCXNw aW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJCV9fbGJfc2V0X2N1cnJlbnQobCk7 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKKwl9CisJZWxzZQor CQlfX2xiX3NldF9jdXJyZW50KGwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19sYl9zZXRf ZGVmYXVsdChzdHJ1Y3QgY3J5cHRvX2xiICpsKQoreworCWRlZmF1bHRfbGIgPSBsOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgbGJfc2V0X2RlZmF1bHQoc3RydWN0IGNyeXB0b19sYiAqbCkKK3sK KwlzdHJ1Y3QgY3J5cHRvX2xiICpjID0gZGVmYXVsdF9sYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJaWYgKGMpCisJeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOwor CQlfX2xiX3NldF9kZWZhdWx0KGwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2Nr LCBmbGFncyk7CisJfQorCWVsc2UKKwkJX19sYl9zZXRfZGVmYXVsdChsKTsKK30KKworCitzdGF0 aWMgaW50IGNyeXB0b19sYl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vf ZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2xiX3By b2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGlj IGludCBjcnlwdG9fbGJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQgY3J5cHRvX2xiX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQor eworCXN0cnVjdCBjcnlwdG9fbGIgKmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY3J5cHRv X2xiLCBkZXZpY2UpOworCisJY29tcGxldGUoJmQtPmRldl9yZWxlYXNlZCk7Cit9CisKK3N0YXRp YyB2b2lkIGNyeXB0b19sYl9jbGFzc19yZWxlYXNlKHN0cnVjdCBjbGFzcyAqY2xhc3MpCit7Cit9 CisKK3N0YXRpYyB2b2lkIGNyeXB0b19sYl9jbGFzc19yZWxlYXNlX2RldmljZShzdHJ1Y3QgY2xh c3NfZGV2aWNlICpjbGFzc19kZXYpCit7Cit9CisKK3N0cnVjdCBjbGFzcyBjcnlwdG9fbGJfY2xh c3MgPQoreworCS5uYW1lCQkJPSAiY3J5cHRvX2xiIiwKKwkuY2xhc3NfcmVsZWFzZQkJPSBjcnlw dG9fbGJfY2xhc3NfcmVsZWFzZSwKKwkucmVsZWFzZQkJPSBjcnlwdG9fbGJfY2xhc3NfcmVsZWFz ZV9kZXZpY2UKK307CisKK3N0cnVjdCBidXNfdHlwZSBjcnlwdG9fbGJfYnVzX3R5cGUgPQorewor CS5uYW1lCQkJPSAiY3J5cHRvX2xiIiwKKwkubWF0Y2gJCQk9IGNyeXB0b19sYl9tYXRjaAorfTsK Kworc3RydWN0IGRldmljZV9kcml2ZXIgY3J5cHRvX2xiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJj cnlwdG9fbGJfZHJpdmVyIiwKKwkuYnVzID0gJmNyeXB0b19sYl9idXNfdHlwZSwKKwkucHJvYmUg PSBjcnlwdG9fbGJfcHJvYmUsCisJLnJlbW92ZSA9IGNyeXB0b19sYl9yZW1vdmUsCit9OworCitz dHJ1Y3QgZGV2aWNlIGNyeXB0b19sYl9kZXYgPSB7CisJLnBhcmVudCA9IE5VTEwsCisJLmJ1cyA9 ICZjcnlwdG9fbGJfYnVzX3R5cGUsCisJLmJ1c19pZCA9ICJjcnlwdG8gbG9hZCBiYWxhbmNlciIs CisJLmRyaXZlciA9ICZjcnlwdG9fbGJfZHJpdmVyLAorCS5yZWxlYXNlID0gJmNyeXB0b19sYl9y ZWxlYXNlCit9OworCitzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGNsYXNzX2Rldmlj ZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGNyeXB0b19sYiAqbGIgPSBjb250YWluZXJf b2YoZGV2LCBzdHJ1Y3QgY3J5cHRvX2xiLCBjbGFzc19kZXZpY2UpOworCisJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJXNcbiIsIGxiLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QgY3VycmVudF9z aG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcnlw dG9fbGIgKmxiOworCWludCBvZmYgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmY3J5cHRvX2xiX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KGxiLCAmY3J5cHRvX2xiX2xpc3QsIGxiX2VudHJ5KQorCXsKKwkJaWYgKGxiX2lzX2N1cnJl bnQobGIpKQorCQkJb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIlsiKTsKKwkJaWYgKGxiX2lzX2Rl ZmF1bHQobGIpKQorCQkJb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIigiKTsKKwkJb2ZmICs9IHNw cmludGYoYnVmK29mZiwgIiVzIiwgbGItPm5hbWUpOworCQlpZiAobGJfaXNfZGVmYXVsdChsYikp CisJCQlvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiKSIpOworCQlpZiAobGJfaXNfY3VycmVudChs YikpCisJCQlvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiXSIpOworCX0KKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZjcnlwdG9fbGJfbG9jaywgZmxhZ3MpOworCisJaWYgKCFvZmYpCisJCW9mZiA9 IHNwcmludGYoYnVmLCAiTm8gbG9hZCBiYWxhbmNlcnMgcmVnaXRlcmVkIHlldC4iKTsKKworCW9m ZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJcbiIpOworCQorCXJldHVybiBvZmY7Cit9CitzdGF0aWMg c3NpemVfdCBjdXJyZW50X3N0b3JlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hh ciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNyeXB0b19sYiAqbGI7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcnlwdG9fbGJfbG9jaywgZmxh Z3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGIsICZjcnlwdG9fbGJfbGlzdCwgbGJfZW50cnkp CisJeworCQlpZiAoY291bnQgPT0gc3RybGVuKGxiLT5uYW1lKSAmJiAhc3RyY21wKGJ1ZiwgbGIt Pm5hbWUpKQorCQl7CisJCQlsYl9zZXRfY3VycmVudChsYik7CisJCQlsYl9zZXRfZGVmYXVsdChs Yik7CisKKwkJCWRwcmludGsoS0VSTl9JTkZPICJMb2FkIGJhbGFuY2VyICVzIGlzIHNldCBhcyBj dXJyZW50IGFuZCBkZWZhdWx0LlxuIiwgCisJCQkJCWxiLT5uYW1lKTsKKwkJCQorCQkJYnJlYWs7 CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3J5cHRvX2xiX2xvY2ssIGZsYWdz KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUs IDA0NDQsIG5hbWVfc2hvdywgTlVMTCk7CitDTEFTU19ERVZJQ0VfQVRUUihsYnMsIDA2NDQsIGN1 cnJlbnRfc2hvdywgY3VycmVudF9zdG9yZSk7CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2Vf YXR0cmlidXRlcyhzdHJ1Y3QgY3J5cHRvX2xiICpsYikKK3sKKwljbGFzc19kZXZpY2VfY3JlYXRl X2ZpbGUoJmxiLT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9uYW1lKTsKK30KKwor c3RhdGljIHZvaWQgcmVtb3ZlX2RldmljZV9hdHRyaWJ1dGVzKHN0cnVjdCBjcnlwdG9fbGIgKmxi KQoreworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmbGItPmNsYXNzX2RldmljZSwgJmNsYXNz X2RldmljZV9hdHRyX25hbWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2xiKHN0 cnVjdCBjcnlwdG9fbGIgKmwxLCBzdHJ1Y3QgY3J5cHRvX2xiICpsMikKK3sKKwlpZiAoIXN0cm5j bXAobDEtPm5hbWUsIGwyLT5uYW1lLCBzaXplb2YobDEtPm5hbWUpKSkKKwkJcmV0dXJuIDE7CisK KwlyZXR1cm4gMDsKK30KKworaW5saW5lIHZvaWQgY3J5cHRvX2xiX3JlaGFzaCh2b2lkKQorewor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCFjdXJyZW50X2xiKQorCQlyZXR1cm47CisK KwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudF9sYi0+bG9jaywgZmxhZ3MpOworCWN1cnJlbnRf bGItPnJlaGFzaChjdXJyZW50X2xiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50 X2xiLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNyeXB0b19sYl93 YWl0X3F1ZXVlKTsKK30KKworc3RydWN0IGNyeXB0b19kZXZpY2UgKmNyeXB0b19sYl9maW5kX2Rl dmljZShzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKmNpLCBzdHJ1Y3QgY3J5cHRv X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCQorCWlmICghY3VycmVudF9sYikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAo c2NpX2JpbmRlZChjaSkpCisJeworCQlpbnQgZm91bmQgPSAwOworCQkKKwkJc3Bpbl9sb2NrX2ly cXNhdmUoY3J5cHRvX2RldmljZV9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnko ZGV2LCBjcnlwdG9fZGV2aWNlX2xpc3QsIGNkZXZfZW50cnkpCisJCXsKKwkJCWlmIChkZXYtPmlk ID09IGNpLT5iZGV2KQorCQkJeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJ fQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNyeXB0b19kZXZpY2VfbG9jaywgZmxhZ3MpOwor CisJCXJldHVybiAoZm91bmQpP2RldjpOVUxMOworCX0KKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgm Y3VycmVudF9sYi0+bG9jaywgZmxhZ3MpOworCQorCWN1cnJlbnRfbGItPnJlaGFzaChjdXJyZW50 X2xiKTsKKworCXNwaW5fbG9jayhjcnlwdG9fZGV2aWNlX2xvY2spOworCQorCWRldiA9IGN1cnJl bnRfbGItPmZpbmRfZGV2aWNlKGN1cnJlbnRfbGIsIGNpLCBkYXRhKTsKKwlpZiAoZGV2KQorCQlj cnlwdG9fZGV2aWNlX2dldChkZXYpOworCQorCXNwaW5fdW5sb2NrKGNyeXB0b19kZXZpY2VfbG9j ayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudF9sYi0+bG9jaywgZmxhZ3MpOwor CQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3J5cHRvX2xiX3dhaXRfcXVldWUpOworCQorCXJl dHVybiBkZXY7Cit9CisKK3N0YXRpYyBpbnQgX19jcnlwdG9fbGJfcmVnaXN0ZXIoc3RydWN0IGNy eXB0b19sYiAqbGIpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pbml0KCZsYi0+bG9jayk7 CisJCisJaW5pdF9jb21wbGV0aW9uKCZsYi0+ZGV2X3JlbGVhc2VkKTsKKwltZW1jcHkoJmxiLT5k ZXZpY2UsICZjcnlwdG9fbGJfZGV2LCBzaXplb2Yoc3RydWN0IGRldmljZSkpOworCWxiLT5kcml2 ZXIgPSAmY3J5cHRvX2xiX2RyaXZlcjsKKworCXNucHJpbnRmKGxiLT5kZXZpY2UuYnVzX2lkLCBz aXplb2YobGItPmRldmljZS5idXNfaWQpLCAiJXMiLCBsYi0+bmFtZSk7CisJZXJyID0gZGV2aWNl X3JlZ2lzdGVyKCZsYi0+ZGV2aWNlKTsKKwlpZiAoZXJyKQorCXsKKwkJZHByaW50ayhLRVJOX0VS UiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBsb2FkIGJhbGFuY2VyIGRldmljZSAlczogZXJy PSVkLlxuIiwgCisJCQkJbGItPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJc25w cmludGYobGItPmNsYXNzX2RldmljZS5jbGFzc19pZCwgc2l6ZW9mKGxiLT5jbGFzc19kZXZpY2Uu Y2xhc3NfaWQpLCAiJXMiLCBsYi0+bmFtZSk7CisJbGItPmNsYXNzX2RldmljZS5kZXYgCT0gJmxi LT5kZXZpY2U7CisJbGItPmNsYXNzX2RldmljZS5jbGFzcwk9ICZjcnlwdG9fbGJfY2xhc3M7CisJ CisJZXJyID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZsYi0+Y2xhc3NfZGV2aWNlKTsKKwlpZiAo ZXJyKQorCXsKKwkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBs b2FkIGJhbGFuY2VyIGNsYXNzIGRldmljZSAlczogZXJyPSVkLlxuIiwgCisJCQkJbGItPm5hbWUs IGVycik7CisJCWRldmljZV91bnJlZ2lzdGVyKCZsYi0+ZGV2aWNlKTsKKwkJcmV0dXJuIGVycjsK Kwl9CisKKwljcmVhdGVfZGV2aWNlX2F0dHJpYnV0ZXMobGIpOworCXdha2VfdXBfaW50ZXJydXB0 aWJsZSgmY3J5cHRvX2xiX3dhaXRfcXVldWUpOworCQorCXJldHVybiAwOworCit9CisKK3N0YXRp YyB2b2lkIF9fY3J5cHRvX2xiX3VucmVnaXN0ZXIoc3RydWN0IGNyeXB0b19sYiAqbGIpCit7CisJ d2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9fbGJfd2FpdF9xdWV1ZSk7CisJcmVtb3ZlX2Rl dmljZV9hdHRyaWJ1dGVzKGxiKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmbGItPmNsYXNz X2RldmljZSk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmxiLT5kZXZpY2UpOworfQorCitpbnQgY3J5 cHRvX2xiX3JlZ2lzdGVyKHN0cnVjdCBjcnlwdG9fbGIgKmxiLCBpbnQgc2V0X2N1cnJlbnQsIGlu dCBzZXRfZGVmYXVsdCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2xiICpfX2xiOworCWludCBlcnI7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3J5cHRvX2xiX2xv Y2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fbGIsICZjcnlwdG9fbGJfbGlzdCwg bGJfZW50cnkpCisJeworCQlpZiAodW5saWtlbHkoY29tcGFyZV9sYihfX2xiLCBsYikpKQorCQl7 CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcnlwdG9fbGJfbG9jaywgZmxhZ3MpOworCQkJ ZHByaW50ayhLRVJOX0VSUiAiQ3J5cHRvIGxvYWQgYmFsYW5jZXIgJXMgaXMgYWxyZWFkeSByZWdp c3RlcmVkLlxuIiwgbGItPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwls aXN0X2FkZCgmbGItPmxiX2VudHJ5LCAmY3J5cHRvX2xiX2xpc3QpOworCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmNyeXB0b19sYl9sb2NrLCBmbGFncyk7CisJCisJZXJyID0gX19jcnlwdG9fbGJf cmVnaXN0ZXIobGIpOworCWlmIChlcnIpCisJeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3J5cHRv X2xiX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWwoJmxiLT5sYl9lbnRyeSk7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmNyeXB0b19sYl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIGVycjsK Kwl9CisKKwlpZiAoIWRlZmF1bHRfbGIgfHwgc2V0X2RlZmF1bHQpCisJCWxiX3NldF9kZWZhdWx0 KGxiKTsKKwkKKwlpZiAoIWN1cnJlbnRfbGIgfHwgc2V0X2N1cnJlbnQpCisJCWxiX3NldF9jdXJy ZW50KGxiKTsKKworCWRwcmludGsoS0VSTl9JTkZPICJDcnlwdG8gbG9hZCBiYWxhbmNlciAlcyB3 YXMgcmVnaXN0ZXJlZCBhbmQgc2V0IHRvIGJlIFslcy4lc10uXG4iLCAKKwkJCWxiLT5uYW1lLCAK KwkJCShsYl9pc19jdXJyZW50KGxiKSk/ImN1cnJlbnQiOiJub3QgY3VycmVudCIsIAorCQkJKGxi X2lzX2RlZmF1bHQobGIpKT8iZGVmYXVsdCI6Im5vdCBkZWZhdWx0Iik7CisKKwlsYl9udW0rKzsK KwkKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjcnlwdG9fbGJfdW5yZWdpc3RlcihzdHJ1Y3QgY3J5 cHRvX2xiICpsYikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2xiICpfX2xiLCAqbjsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCisJaWYgKGxiX251bSA9PSAxKQorCXsKKwkJZHByaW50ayhLRVJOX0lORk8g IllvdSBhcmUgcmVtb3ZpbmcgY3J5cHRvIGxvYWQgYmFsYW5jZXIgJXMgd2hpY2ggaXMgY3VycmVu dCBhbmQgZGVmYXVsdC5cbiIKKwkJCQkiVGhlcmUgaXMgbm8gb3RoZXIgY3J5cHRvIGxvYWQgYmFs YW5jZXJzLiAiCisJCQkJIlJlbW92aW5nICVzIGRlbGF5ZWQgdW50aWxsIG5ldyBsb2FkIGJhbGFu Y2VyIGlzIHJlZ2lzdGVyZWQuXG4iLCAKKwkJCQlsYi0+bmFtZSwgKGZvcmNlX2xiX3JlbW92ZSk/ ImlzIG5vdCI6ImlzIik7CisJCXdoaWxlIChsYl9udW0gPT0gMSAmJiAhZm9yY2VfbGJfcmVtb3Zl KQorCQl7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2No ZWR1bGVfdGltZW91dChIWik7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJ CQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQl9CisJfQorCisJX19jcnlwdG9fbGJfdW5yZWdp c3RlcihsYik7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNyeXB0b19sYl9sb2NrLCBmbGFncyk7 CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKF9fbGIsIG4sICZjcnlwdG9fbGJfbGlzdCwgbGJf ZW50cnkpCisJeworCQlpZiAoY29tcGFyZV9sYihfX2xiLCBsYikpCisJCXsKKwkJCWxiX251bS0t OworCQkJbGlzdF9kZWwoJl9fbGItPmxiX2VudHJ5KTsKKwkJCQorCQkJZHByaW50ayhLRVJOX0VS UiAiQ3J5cHRvIGxvYWQgYmFsYW5jZXIgJXMgd2FzIHVucmVnaXN0ZXJlZC5cbiIsIGxiLT5uYW1l KTsKKwkJfQorCQllbHNlIGlmIChsYl9udW0pCisJCXsKKwkJCWlmIChsYl9pc19kZWZhdWx0KGxi KSkKKwkJCQlsYl9zZXRfZGVmYXVsdChfX2xiKTsKKwkJCWlmIChsYl9pc19jdXJyZW50KGxiKSkK KwkJCQlsYl9zZXRfY3VycmVudChkZWZhdWx0X2xiKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZjcnlwdG9fbGJfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjcnlw dG9fbGJfcXVldWVfd3JhcHBlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkZXYgPSAmbWFpbl9jcnlwdG9fZGV2aWNlOworCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcyA9 IChzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKilkYXRhOworCisJZHByaW50ayhLRVJOX0lORk8gIiVz OiBDYWxsaW5nIGNhbGxiYWNrIGZvciBzZXNzaW9uICVsbHUgWyVsbHVdIGZsYWdzPSV4LCAiCisJ CQkib3A9JTA0dSwgdHlwZT0lMDR4LCBtb2RlPSUwNHgsIHByaW9yaXR5PSUwNHhcbiIsIAorCQkJ X19mdW5jX18sIAorCQkJcy0+Y2kuaWQsIHMtPmNpLmRldl9pZCwgcy0+Y2kuZmxhZ3MsCisJCQlz LT5jaS5vcGVyYXRpb24sIHMtPmNpLnR5cGUsIHMtPmNpLm1vZGUsIHMtPmNpLnByaW9yaXR5KTsK KwkKKwkvKgorCSAqIFByZXZlbnQgcmFjZXMgd2l0aCBjcnlwdG8gZGV2aWNlcyAKKwkgKiB3aGlj aCBtYXkgY2hhbmdlIGZsYWdzIG9mIHRoZSBzZXNzaW9ucyBpbiB0aGVpcnMgcXVldWVzLgorCSAq LworCXNwaW5fbG9jaygmcy0+bG9jayk7CisJY3J5cHRvX3N0YXRfZmluaXNoX2luYyhzKTsKKwlm aW5pc2hfc2Vzc2lvbihzKTsKKwl1bnN0YXJ0X3Nlc3Npb24ocyk7CisJc3Bpbl91bmxvY2soJnMt PmxvY2spOworCQorCXMtPmNpLmNhbGxiYWNrKCZzLT5jaSwgJnMtPmRhdGEpOworCisJaWYgKHNl c3Npb25fZmluaXNoZWQocykpCisJeworCQljcnlwdG9fc2Vzc2lvbl9kZXF1ZXVlX3JvdXRlKHMp OworCQlrZnJlZShzKTsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogU3BlY2lhbCBjYXNlOiBj cnlwdG8gY29uc3VtZXIgbWFya3Mgc2Vzc2lvbiBhcyAibm90IGZpbmlzaGVkIgorCQkgKiBpbiBp dCdzIGNhbGxiYWNrIC0gaXQgbWVhbnMgdGhhdCBjcnlwdG8gY29uc3VtZXIgd2FudHMgCisJCSAq IHRoaXMgc2Vzc2lvbiB0byBiZSBwcm9jZXNzZWQgZnVydGhlciwgCisJCSAqIGZvciBleGFtcGxl IGNyeXB0byBjb25zdW1lciBjYW4gYWRkIG5ldyByb3V0ZSBhbmQgdGhlbgorCQkgKiBtYXJrIHNl c3Npb24gYXMgIm5vdCBmaW5pc2hlZCIuCisJCSAqLworCQorCQl1bmNvbXBsZXRlX3Nlc3Npb24o cyk7CisJCXVuc3RhcnRfc2Vzc2lvbihzKTsKKwkJY3J5cHRvX3Nlc3Npb25faW5zZXJ0X21haW4o ZGV2LCBzKTsKKwl9CisJCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9fbGJfd2FpdF9x dWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19sYl9wcm9jZXNzX25leHRfcm91dGUoc3Ry dWN0IGNyeXB0b19zZXNzaW9uICpzKQoreworCXN0cnVjdCBjcnlwdG9fcm91dGUgKnJ0OworCXN0 cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJ0ID0g Y3J5cHRvX3JvdXRlX2RlcXVldWUocyk7CisJaWYgKHJ0KQorCXsKKwkJZGV2ID0gcnQtPmRldjsK KworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwkJbGlz dF9kZWwoJnMtPmRldl9xdWV1ZV9lbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRl di0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJCWNyeXB0b19yb3V0ZV9mcmVlKHJ0KTsKKworCQlk ZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOworCQlpZiAoZGV2KQorCQl7 CisJCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb2Nlc3NpbmcgbmV3IHJvdXRlIHRvICVzLlxu IiwgCisJCQkJCV9fZnVuY19fLCBkZXYtPm5hbWUpOworCisJCQltZW1jcHkoJnMtPmNpLCAmcnQt PmNpLCBzaXplb2Yocy0+Y2kpKTsKKwkJCWNyeXB0b19zZXNzaW9uX2luc2VydChkZXYsIHMpOwor CisJCQkvKgorCQkJICogUmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIHdhcyBhbHJlYWR5IGhvbGQg d2hlbgorCQkJICogbmV3IHJvdXRpbmcgd2FzIGFkZGVkLgorCQkJICovCisJCQljcnlwdG9fZGV2 aWNlX3B1dChkZXYpOworCQl9CisJfQorfQorCit2b2lkIGNyeXB0b193YWtlX2xiKHZvaWQpCit7 CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9fbGJfd2FpdF9xdWV1ZSk7Cit9CisKK2lu dCBjcnlwdG9fbGJfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNyeXB0b19zZXNzaW9u ICpzLCAqbjsKKwlzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2ID0gKHN0cnVjdCBjcnlwdG9fZGV2 aWNlICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWRhZW1vbml6ZSgiJXMiLCBk ZXYtPm5hbWUpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCXdoaWxlICghbmVlZF9leGl0 KQorCXsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJ CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzLCBuLCAmZGV2LT5zZXNzaW9uX2xpc3QsIG1haW5f cXVldWVfZW50cnkpCisJCXsKKwkJCWRwcmludGsoInNlc3Npb24gJWxsdSBbJWxsdV06IGZsYWdz PSV4LCByb3V0ZV9udW09JWQsICVzLCVzLCVzLCVzLlxuIiwgCisJCQkJCXMtPmNpLmlkLCBzLT5j aS5kZXZfaWQsIHMtPmNpLmZsYWdzLCAKKwkJCQkJY3J5cHRvX3JvdXRlX3F1ZXVlX2xlbihzKSwK KwkJCQkJKHNlc3Npb25fY29tcGxldGVkKHMpKT8iY29tcGxldGVkIjogIm5vdCBjb21wbGV0ZWQi LAorCQkJCQkoc2Vzc2lvbl9maW5pc2hlZChzKSk/ImZpbmlzaGVkIjogIm5vdCBmaW5pc2hlZCIs CisJCQkJCShzZXNzaW9uX3N0YXJ0ZWQocykpPyJzdGFydGVkIjogIm5vdCBzdGFydGVkIiwKKwkJ CQkJKHNlc3Npb25faXNfcHJvY2Vzc2VkKHMpKT8iaXMgYmVpbmcgcHJvY2Vzc2VkIjogImlzIG5v dCBiZWluZyBwcm9jZXNzZWQiKTsKKworCQkJaWYgKCFzcGluX3RyeWxvY2soJnMtPmxvY2spKQor CQkJCWNvbnRpbnVlOworCQkJCisJCQlpZiAoc2Vzc2lvbl9pc19wcm9jZXNzZWQocykpCisJCQkJ Z290byB1bmxvY2s7CisJCQlpZiAoc2Vzc2lvbl9zdGFydGVkKHMpKQorCQkJCWdvdG8gdW5sb2Nr OworCQkJCisJCQlpZiAoc2Vzc2lvbl9jb21wbGV0ZWQocykpCisJCQl7CisJCQkJY3J5cHRvX3N0 YXRfcHRpbWVfaW5jKHMpOworCQkJCXVuY29tcGxldGVfc2Vzc2lvbihzKTsKKworCQkJCWlmIChj cnlwdG9fcm91dGVfcXVldWVfbGVuKHMpID4gMSkKKwkJCQl7CisJCQkJCWNyeXB0b19sYl9wcm9j ZXNzX25leHRfcm91dGUocyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN0YXJ0X3Nl c3Npb24ocyk7CisJCQkJCWNyeXB0b19zdGF0X3N0YXJ0X2luYyhzKTsKKworCQkJCQlfX2NyeXB0 b19zZXNzaW9uX2RlcXVldWVfbWFpbihzKTsKKwkJCQkJc3Bpbl91bmxvY2soJnMtPmxvY2spOwor CQkJCQkKKwkJCQkJSU5JVF9XT1JLKCZzLT53b3JrLCAmY3J5cHRvX2xiX3F1ZXVlX3dyYXBwZXIs IHMpOworCQkJCQlxdWV1ZV93b3JrKGNyeXB0b19sYl9xdWV1ZSwgJnMtPndvcmspOworCQkJCQlj b250aW51ZTsKKwkJCQl9CisJCQl9Cit1bmxvY2s6CisJCQlzcGluX3VubG9jaygmcy0+bG9jayk7 CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zZXNzaW9uX2xvY2ssIGZsYWdz KTsKKworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmNyeXB0b19sYl93YWl0X3F1 ZXVlLCAxMCk7CisJfQorCisJZmx1c2hfd29ya3F1ZXVlKGNyeXB0b19sYl9xdWV1ZSk7CisJY29t cGxldGVfYW5kX2V4aXQoJnRocmVhZF9leGl0ZWQsIDApOworfQorCitpbnQgY3J5cHRvX2xiX2lu aXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWxvbmcgcGlkOworCisJZXJyID0gYnVzX3JlZ2lzdGVy KCZjcnlwdG9fbGJfYnVzX3R5cGUpOworCWlmIChlcnIpCisJeworCQlkcHJpbnRrKEtFUk5fRVJS ICJGYWlsZWQgdG8gcmVnaXN0ZXIgY3J5cHRvIGxvYWQgYmFsYW5jZXIgYnVzOiBlcnI9JWQuXG4i LCBlcnIpOworCQlnb3RvIGVycl9vdXRfZXhpdDsKKwl9CisJCisJZXJyID0gZHJpdmVyX3JlZ2lz dGVyKCZjcnlwdG9fbGJfZHJpdmVyKTsKKwlpZiAoZXJyKQorCXsKKwkJZHByaW50ayhLRVJOX0VS UiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBsb2FkIGJhbGFuY2VyIGRyaXZlcjogZXJyPSVk LlxuIiwgZXJyKTsKKwkJZ290byBlcnJfb3V0X2J1c191bnJlZ2lzdGVyOworCX0KKwkKKwljcnlw dG9fbGJfY2xhc3MuY2xhc3NfZGV2X2F0dHJzID0gJmNsYXNzX2RldmljZV9hdHRyX2xiczsKKwkK KwllcnIgPSBjbGFzc19yZWdpc3RlcigmY3J5cHRvX2xiX2NsYXNzKTsKKwlpZiAoZXJyKQorCXsK KwkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBsb2FkIGJhbGFu Y2VyIGNsYXNzOiBlcnI9JWQuXG4iLCBlcnIpOworCQlnb3RvIGVycl9vdXRfZHJpdmVyX3VucmVn aXN0ZXI7CisJfQorCisJY3J5cHRvX2xiX3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgiY2xicSIp OworCWlmICghY3J5cHRvX2xiX3F1ZXVlKQorCXsKKwkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVk IHRvIGNyZWF0ZSBjcnlwdG8gbG9hZCBiYWxhbmVyIHdvcmsgcXVldWUuXG4iKTsKKwkJZ290byBl cnJfb3V0X2NsYXNzX3VucmVnaXN0ZXI7CisJfQorCQorCWluaXRfY29tcGxldGlvbigmdGhyZWFk X2V4aXRlZCk7CisJcGlkID0ga2VybmVsX3RocmVhZChjcnlwdG9fbGJfdGhyZWFkLCAmbWFpbl9j cnlwdG9fZGV2aWNlLCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTKTsKKwlpZiAoSVNfRVJSKCh2b2lk ICopcGlkKSkKKwl7CisJCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUga2VybmVs IGxvYWQgYmFsYW5jaW5nIHRocmVhZC5cbiIpOworCQlnb3RvIGVycl9vdXRfZGVzdHJveV93b3Jr cXVldWU7CisJfQorCQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZGVzdHJveV93b3JrcXVldWU6 CisJZGVzdHJveV93b3JrcXVldWUoY3J5cHRvX2xiX3F1ZXVlKTsKK2Vycl9vdXRfY2xhc3NfdW5y ZWdpc3RlcjoKKwljbGFzc191bnJlZ2lzdGVyKCZjcnlwdG9fbGJfY2xhc3MpOworZXJyX291dF9k cml2ZXJfdW5yZWdpc3RlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmY3J5cHRvX2xiX2RyaXZlcik7 CitlcnJfb3V0X2J1c191bnJlZ2lzdGVyOgorCWJ1c191bnJlZ2lzdGVyKCZjcnlwdG9fbGJfYnVz X3R5cGUpOworZXJyX291dF9leGl0OgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgY3J5cHRvX2xi X2Zpbmkodm9pZCkKK3sKKwluZWVkX2V4aXQgPSAxOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRo cmVhZF9leGl0ZWQpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGNyeXB0b19sYl9xdWV1ZSk7CisJY2xh c3NfdW5yZWdpc3RlcigmY3J5cHRvX2xiX2NsYXNzKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmY3J5 cHRvX2xiX2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJmNyeXB0b19sYl9idXNfdHlwZSk7Cit9 CisKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2xiX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woY3J5 cHRvX2xiX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fbGJfcmVoYXNoKTsKK0VY UE9SVF9TWU1CT0woY3J5cHRvX2xiX2ZpbmRfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRv X3dha2VfbGIpOwpkaWZmIC1OcnUgL3RtcC9lbXB0eS9jcnlwdG9fbGIuaCBsaW51eC0yLjYvZHJp dmVycy9hY3J5cHRvL2NyeXB0b19sYi5oCi0tLSAvdG1wL2VtcHR5L2NyeXB0b19sYi5oCTE5NzAt MDEtMDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5 cHRvL2NyeXB0b19sYi5oCTIwMDQtMTEtMDIgMTg6NDQ6MjEuMDAwMDAwMDAwICswMzAwCkBAIC0w LDAgKzEsNjEgQEAKKy8qCisgKiAJY3J5cHRvX2xiLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIw MDQgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQor ICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3Vp dGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NSWVBU T19MQl9ICisjZGVmaW5lIF9fQ1JZUFRPX0xCX0gKKworI2luY2x1ZGUgImFjcnlwdG8uaCIKKwor I2RlZmluZSBDUllQVE9fTEJfTkFNRUxFTgkzMgorCitzdHJ1Y3QgY3J5cHRvX2xiCit7CisJc3Ry dWN0IGxpc3RfaGVhZAlsYl9lbnRyeTsKKworCWNoYXIgCQkJbmFtZVtDUllQVE9fTEJfTkFNRUxF Tl07CisKKwl2b2lkCQkJKCpyZWhhc2gpKHN0cnVjdCBjcnlwdG9fbGIgKik7CisJc3RydWN0IGNy eXB0b19kZXZpY2UgKgkoKmZpbmRfZGV2aWNlKShzdHJ1Y3QgY3J5cHRvX2xiICosIHN0cnVjdCBj cnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAqLCBzdHJ1Y3QgY3J5cHRvX2RhdGEgKik7CisKKwlz cGlubG9ja190CQlsb2NrOworCisJc3BpbmxvY2tfdAkJKmNyeXB0b19kZXZpY2VfbG9jazsKKwlz dHJ1Y3QgbGlzdF9oZWFkCSpjcnlwdG9fZGV2aWNlX2xpc3Q7CisKKwlzdHJ1Y3QgZGV2aWNlX2Ry aXZlcgkqZHJpdmVyOworCXN0cnVjdCBkZXZpY2UJCWRldmljZTsKKwlzdHJ1Y3QgY2xhc3NfZGV2 aWNlCWNsYXNzX2RldmljZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglkZXZfcmVsZWFzZWQ7CisKK307 CisKK2ludCBjcnlwdG9fbGJfcmVnaXN0ZXIoc3RydWN0IGNyeXB0b19sYiAqbGIsIGludCBzZXRf Y3VycmVudCwgaW50IHNldF9kZWZhdWx0KTsKK3ZvaWQgY3J5cHRvX2xiX3VucmVnaXN0ZXIoc3Ry dWN0IGNyeXB0b19sYiAqbGIpOworCitpbmxpbmUgdm9pZCBjcnlwdG9fbGJfcmVoYXNoKHZvaWQp Oworc3RydWN0IGNyeXB0b19kZXZpY2UgKmNyeXB0b19sYl9maW5kX2RldmljZShzdHJ1Y3QgY3J5 cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKmNpLCBzdHJ1Y3QgY3J5cHRvX2RhdGEgKmRhdGEpOwor Cit2b2lkIGNyeXB0b193YWtlX2xiKHZvaWQpOworCitpbnQgY3J5cHRvX2xiX2luaXQodm9pZCk7 Cit2b2lkIGNyeXB0b19sYl9maW5pKHZvaWQpOworCisjZW5kaWYgLyogX19DUllQVE9fTEJfSCAq LwpkaWZmIC1OcnUgL3RtcC9lbXB0eS9jcnlwdG9fbWFpbi5jIGxpbnV4LTIuNi9kcml2ZXJzL2Fj cnlwdG8vY3J5cHRvX21haW4uYwotLS0gL3RtcC9lbXB0eS9jcnlwdG9fbWFpbi5jCTE5NzAtMDEt MDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRv L2NyeXB0b19tYWluLmMJMjAwNC0xMS0wMiAxODo0NDoyMS4wMDAwMDAwMDAgKzAzMDAKQEAgLTAs MCArMSwzNTkgQEAKKy8qCisgKiAJY3J5cHRvX21haW4uYworICoKKyAqIENvcHlyaWdodCAoYykg MjAwNCBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgorICogCisgKgorICog VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl CisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0 aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBT dWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGlu dXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgv bW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4 L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJy dXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgImFjcnlwdG8u aCIKKyNpbmNsdWRlICJjcnlwdG9fbGIuaCIKKyNpbmNsdWRlICJjcnlwdG9fY29ubi5oIgorI2lu Y2x1ZGUgImNyeXB0b19yb3V0ZS5oIgorCitpbnQgZm9yY2VfbGJfcmVtb3ZlOworbW9kdWxlX3Bh cmFtKGZvcmNlX2xiX3JlbW92ZSwgaW50LCAwKTsKKworc3RydWN0IGNyeXB0b19kZXZpY2UgbWFp bl9jcnlwdG9fZGV2aWNlOworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIGNyeXB0b19idXNfdHlw ZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjcnlwdG9fZHJpdmVyOworZXh0ZXJuIHN0 cnVjdCBjbGFzcyBjcnlwdG9fY2xhc3M7CitleHRlcm4gc3RydWN0IGRldmljZSBjcnlwdG9fZGV2 OworCitleHRlcm4gc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0 dHJfZGV2aWNlczsKK2V4dGVybiBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19k ZXZpY2VfYXR0cl9sYnM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2NpKHN0cnVjdCBjcnlw dG9fc2Vzc2lvbl9pbml0aWFsaXplciAqY2kpCit7CisJZHByaW50aygiJWxsdSBbJWxsdV0gb3A9 JTA0dSwgdHlwZT0lMDR4LCBtb2RlPSUwNHgsIHByaW9yaXR5PSUwNHgiLCAKKwkJCWNpLT5pZCwg Y2ktPmRldl9pZCwKKwkJCWNpLT5vcGVyYXRpb24sIGNpLT50eXBlLCBjaS0+bW9kZSwgY2ktPnBy aW9yaXR5KTsKK30KKworc3RhdGljIHZvaWQgX19jcnlwdG9fc2Vzc2lvbl9pbnNlcnQoc3RydWN0 IGNyeXB0b19kZXZpY2UgKmRldiwgc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQoreworCXN0cnVj dCBjcnlwdG9fc2Vzc2lvbiAqX19zOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmRldi0+ c2Vzc2lvbl9saXN0KSkpCisJeworCQlsaXN0X2FkZCgmcy0+ZGV2X3F1ZXVlX2VudHJ5LCAmZGV2 LT5zZXNzaW9uX2xpc3QpOworCX0KKwllbHNlCisJeworCQlpbnQgaW5zZXJ0ZWQgPSAwOworCQkK KwkJbGlzdF9mb3JfZWFjaF9lbnRyeShfX3MsICZkZXYtPnNlc3Npb25fbGlzdCwgZGV2X3F1ZXVl X2VudHJ5KQorCQl7CisJCQlpZiAoX19zLT5jaS5wcmlvcml0eSA8IHMtPmNpLnByaW9yaXR5KQor CQkJeworCQkJCWxpc3RfYWRkX3RhaWwoJnMtPmRldl9xdWV1ZV9lbnRyeSwgJl9fcy0+ZGV2X3F1 ZXVlX2VudHJ5KTsKKwkJCQlpbnNlcnRlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwor CQlpZiAoIWluc2VydGVkKQorCQkJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2X3F1ZXVlX2VudHJ5LCAm ZGV2LT5zZXNzaW9uX2xpc3QpOworCX0KKwkKKwlkdW1wX2NpKCZzLT5jaSk7CisJZHByaW50aygi IGFkZGVkIHRvIGNyeXB0byBkZXZpY2UgJXMgWyVkXS5cbiIsIGRldi0+bmFtZSwgYXRvbWljX3Jl YWQoJmRldi0+cmVmY250KSk7Cit9CisKK2lubGluZSB2b2lkIGNyeXB0b19zZXNzaW9uX2luc2Vy dF9tYWluKHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAq cykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKl9fczsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJY3J5 cHRvX2RldmljZV9nZXQoZGV2KTsKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmZGV2LT5zZXNz aW9uX2xpc3QpKSkKKwl7CisJCWxpc3RfYWRkKCZzLT5tYWluX3F1ZXVlX2VudHJ5LCAmZGV2LT5z ZXNzaW9uX2xpc3QpOworCX0KKwllbHNlCisJeworCQlpbnQgaW5zZXJ0ZWQgPSAwOworCQkKKwkJ bGlzdF9mb3JfZWFjaF9lbnRyeShfX3MsICZkZXYtPnNlc3Npb25fbGlzdCwgbWFpbl9xdWV1ZV9l bnRyeSkKKwkJeworCQkJaWYgKF9fcy0+Y2kucHJpb3JpdHkgPCBzLT5jaS5wcmlvcml0eSkKKwkJ CXsKKwkJCQlsaXN0X2FkZF90YWlsKCZzLT5tYWluX3F1ZXVlX2VudHJ5LCAmX19zLT5tYWluX3F1 ZXVlX2VudHJ5KTsKKwkJCQlpbnNlcnRlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwor CQlpZiAoIWluc2VydGVkKQorCQkJbGlzdF9hZGRfdGFpbCgmcy0+bWFpbl9xdWV1ZV9lbnRyeSwg JmRldi0+c2Vzc2lvbl9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5z ZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwkKKwlkdW1wX2NpKCZzLT5jaSk7CisJZHByaW50aygiIGFk ZGVkIHRvIG1haW4gY3J5cHRvIGRldmljZSAlcyBbJWRdLlxuIiwgZGV2LT5uYW1lLCBhdG9taWNf cmVhZCgmZGV2LT5yZWZjbnQpKTsKK30KKworaW5saW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25faW5z ZXJ0KHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcykK K3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNl c3Npb25fbG9jaywgZmxhZ3MpOworCV9fY3J5cHRvX3Nlc3Npb25faW5zZXJ0KGRldiwgcyk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwkKKwlp ZiAoZGV2LT5kYXRhX3JlYWR5KQorCQlkZXYtPmRhdGFfcmVhZHkoZGV2KTsKK30KKworc3RydWN0 IGNyeXB0b19zZXNzaW9uICpjcnlwdG9fc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGNyeXB0b19zZXNz aW9uX2luaXRpYWxpemVyICpjaSwgc3RydWN0IGNyeXB0b19kYXRhICpkKQoreworCXN0cnVjdCBj cnlwdG9fZGV2aWNlICpkZXYgPSAmbWFpbl9jcnlwdG9fZGV2aWNlOworCXN0cnVjdCBjcnlwdG9f ZGV2aWNlICpsZGV2OworCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqczsKKwlpbnQgZXJyOworCisJ aWYgKGQtPnByaXZfc2l6ZSA+IENSWVBUT19NQVhfUFJJVl9TSVpFKQorCXsKKwkJZHByaW50aygi cHJpdl9zaXplICV1IGlzIHRvbyBiaWcsIG1heGltdW0gYWxsb3dlZCAldS5cbiIsIGQtPnByaXZf c2l6ZSwgQ1JZUFRPX01BWF9QUklWX1NJWkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsZGV2 ID0gY3J5cHRvX2xiX2ZpbmRfZGV2aWNlKGNpLCBkKTsKKwlpZiAoIWxkZXYpCisJeworCQlkcHJp bnRrKCJDYW5ub3QgZmluZCBzdWl0YWJsZSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJ fQorCQorCXMgPSBrbWFsbG9jKHNpemVvZigqcykgKyBkLT5wcml2X3NpemUsIEdGUF9BVE9NSUMp OworCWlmICghcykKKwl7CisJCWxkZXYtPnN0YXQua21lbV9mYWlsZWQrKzsKKwkJZ290byBlcnJf b3V0X2RldmljZV9wdXQ7CisJfQorCisJbWVtc2V0KHMsIDB4QUIsIHNpemVvZigqcykpOworCisJ Y3J5cHRvX3JvdXRlX2hlYWRfaW5pdCgmcy0+cm91dGVfbGlzdCk7CisJCisJc3Bpbl9sb2NrX2lu aXQoJnMtPmxvY2spOworCW1lbWNweSgmcy0+Y2ksIGNpLCBzaXplb2Yocy0+Y2kpKTsKKwltZW1j cHkoJnMtPmRhdGEsIGQsIHNpemVvZihzLT5kYXRhKSk7CisJaWYgKGQtPnByaXZfc2l6ZSkKKwl7 CisJCXMtPmRhdGEucHJpdiA9IHMrMTsKKwkJaWYgKGQtPnByaXYpCisJCQltZW1jcHkocy0+ZGF0 YS5wcml2LCBkLT5wcml2LCBkLT5wcml2X3NpemUpOworCX0KKworCXMtPmNpLmlkIAk9IGRldi0+ c2lkKys7CisJcy0+Y2kuZGV2X2lkIAk9IGxkZXYtPnNpZCsrOworCXMtPmNpLmZsYWdzIAk9IDA7 CisJCisJZXJyID0gY3J5cHRvX3JvdXRlX2FkZChsZGV2LCBzLCBjaSk7CisJaWYgKGVycikKKwl7 CisJCWRwcmludGsoIkNhbiBub3QgYWRkIHJvdXRlIHRvIGRldmljZSAlcy5cbiIsIGxkZXYtPm5h bWUpOworCQlnb3RvIGVycl9vdXRfc2Vzc2lvbl9mcmVlOworCX0KKworCXJldHVybiBzOworCitl cnJfb3V0X3Nlc3Npb25fZnJlZToKKwljcnlwdG9fZGV2aWNlX3B1dChsZGV2KTsKK2Vycl9vdXRf ZGV2aWNlX3B1dDoKKwlrZnJlZShzKTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGNyeXB0 b19zZXNzaW9uX2FkZChzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IGNyeXB0 b19kZXZpY2UgKmxkZXY7CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiA9ICZtYWluX2NyeXB0 b19kZXZpY2U7CisKKwlsZGV2ID0gY3J5cHRvX3JvdXRlX2dldF9jdXJyZW50X2RldmljZShzKTsK KwlCVUdfT04oIWxkZXYpOyAvKiBUaGlzIGNhbiBub3QgaGFwcGVuLiAqLworCQorCWNyeXB0b19z ZXNzaW9uX2luc2VydChsZGV2LCBzKTsKKworCS8qCisJICogQ3J5cHRvIGRldmljZSdzIHJlZmNu dCB3YXMgaW5jcmVtZW50ZWQgaW4gCisJICogY3J5cHRvX2xiX2ZpbmRfZGV2aWNlKCksIAorCSAq IGdldF9jdXJyZW50X2RldmljZSgpLAorCSAqIGNyeXB0b19zZXNzaW9uX2luc2VydCgpLAorCSAq IHRodXMgd2UgbmVlZCB0byBkZWNyZW1lbnQgaXQncyByZWZjbnQgdHdpY2UuCisJICovCisJY3J5 cHRvX2RldmljZV9wdXQobGRldik7CisJY3J5cHRvX2RldmljZV9wdXQobGRldik7CisKKwljcnlw dG9fc2Vzc2lvbl9pbnNlcnRfbWFpbihkZXYsIHMpOworfQorCitzdHJ1Y3QgY3J5cHRvX3Nlc3Np b24gKmNyeXB0b19zZXNzaW9uX2FsbG9jKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXpl ciAqY2ksIHN0cnVjdCBjcnlwdG9fZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24g KnM7CisKKwlzID0gY3J5cHRvX3Nlc3Npb25fY3JlYXRlKGNpLCBkKTsKKwlpZiAoIXMpCisJCXJl dHVybiBOVUxMOworCisJY3J5cHRvX3Nlc3Npb25fYWRkKHMpOworCQorCXJldHVybiBzOworfQor Cit2b2lkIGNyeXB0b19zZXNzaW9uX2RlcXVldWVfcm91dGUoc3RydWN0IGNyeXB0b19zZXNzaW9u ICpzKQoreworCXN0cnVjdCBjcnlwdG9fcm91dGUgKnJ0OworCXN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlCVUdfT04oY3J5cHRvX3JvdXRlX3F1 ZXVlX2xlbihzKSA+IDEpOworCQorCXdoaWxlICgocnQgPSBjcnlwdG9fcm91dGVfZGVxdWV1ZShz KSkpCisJeworCQlkZXYgPSBydC0+ZGV2OworCisJCWRwcmludGsoS0VSTl9JTkZPICJSZW1vdmlu ZyByb3V0ZSBlbnRyeSBmb3IgZGV2aWNlICVzLlxuIiwgZGV2LT5uYW1lKTsKKworCQlzcGluX2xv Y2tfaXJxc2F2ZSgmZGV2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWwoJnMtPmRl dl9xdWV1ZV9lbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2Vzc2lvbl9s b2NrLCBmbGFncyk7CisKKwkJY3J5cHRvX3JvdXRlX2ZyZWUocnQpOworCX0KK30KKworaW5saW5l IHZvaWQgX19jcnlwdG9fc2Vzc2lvbl9kZXF1ZXVlX21haW4oc3RydWN0IGNyeXB0b19zZXNzaW9u ICpzKQoreworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYgPSAmbWFpbl9jcnlwdG9fZGV2aWNl OworCisJbGlzdF9kZWwoJnMtPm1haW5fcXVldWVfZW50cnkpOworCWNyeXB0b19kZXZpY2VfcHV0 KGRldik7Cit9CisKK2lubGluZSB2b2lkIGNyeXB0b19zZXNzaW9uX2RlcXVldWVfbWFpbihzdHJ1 Y3QgY3J5cHRvX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiA9ICZt YWluX2NyeXB0b19kZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tf aXJxc2F2ZSgmZGV2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwlfX2NyeXB0b19zZXNzaW9uX2Rl cXVldWVfbWFpbihzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNlc3Npb25fbG9j aywgZmxhZ3MpOworfQorCitpbnQgX19kZXZpbml0IGNtYWluX2luaXQodm9pZCkKK3sKKwlzdHJ1 Y3QgY3J5cHRvX2RldmljZSAqZGV2ID0gJm1haW5fY3J5cHRvX2RldmljZTsKKwlpbnQgZXJyOwor CisJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgImNyeXB0b19zZXNzaW9u cyIpOworCisJZXJyID0gYnVzX3JlZ2lzdGVyKCZjcnlwdG9fYnVzX3R5cGUpOworCWlmIChlcnIp CisJeworCQlkcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY3J5cHRvIGJ1czog ZXJyPSVkLlxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJZXJyID0gZHJpdmVyX3Jl Z2lzdGVyKCZjcnlwdG9fZHJpdmVyKTsKKwlpZiAoZXJyKQorCXsKKwkJZHByaW50ayhLRVJOX0VS UiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBkcml2ZXI6IGVycj0lZC5cbiIsIGVycik7CisJ CWdvdG8gZXJyX291dF9idXNfdW5yZWdpc3RlcjsKKwl9CisJCisJZXJyID0gY2xhc3NfcmVnaXN0 ZXIoJmNyeXB0b19jbGFzcyk7CisJaWYgKGVycikKKwl7CisJCWRwcmludGsoS0VSTl9FUlIgIkZh aWxlZCB0byByZWdpc3RlciBjcnlwdG8gY2xhc3M6IGVycj0lZC5cbiIsIGVycik7CisJCWdvdG8g ZXJyX291dF9kcml2ZXJfdW5yZWdpc3RlcjsKKwl9CisKKwllcnIgPSBjcnlwdG9fbGJfaW5pdCgp OworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9jbGFzc191bnJlZ2lzdGVyOworCQorCWVyciA9 IGNyeXB0b19jb25uX2luaXQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfY3J5cHRvX2xi X2Zpbmk7CisJCisJZXJyID0gX19jcnlwdG9fZGV2aWNlX2FkZChkZXYpOworCWlmIChlcnIpCisJ CWdvdG8gZXJyX291dF9jcnlwdG9fY29ubl9maW5pOworCQorCWVyciA9IGNsYXNzX2RldmljZV9j cmVhdGVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9kZXZpY2Vz KTsKKwlpZiAoZXJyKQorCQlkcHJpbnRrKCJGYWlsZWQgdG8gY3JlYXRlIFwiZGV2aWNlc1wiIGF0 dHJpYnV0ZTogZXJyPSVkLlxuIiwgZXJyKTsKKwllcnIgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2Zp bGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfbGJzKTsKKwlpZiAoZXJy KQorCQlkcHJpbnRrKCJGYWlsZWQgdG8gY3JlYXRlIFwibGJzXCIgYXR0cmlidXRlOiBlcnI9JWQu XG4iLCBlcnIpOworCQorCisJcmV0dXJuIDA7CisJCitlcnJfb3V0X2NyeXB0b19jb25uX2Zpbmk6 CisJY3J5cHRvX2Nvbm5fZmluaSgpOworZXJyX291dF9jcnlwdG9fbGJfZmluaToKKwljcnlwdG9f bGJfZmluaSgpOworZXJyX291dF9jbGFzc191bnJlZ2lzdGVyOgorCWNsYXNzX3VucmVnaXN0ZXIo JmNyeXB0b19jbGFzcyk7CitlcnJfb3V0X2RyaXZlcl91bnJlZ2lzdGVyOgorCWRyaXZlcl91bnJl Z2lzdGVyKCZjcnlwdG9fZHJpdmVyKTsKK2Vycl9vdXRfYnVzX3VucmVnaXN0ZXI6CisJYnVzX3Vu cmVnaXN0ZXIoJmNyeXB0b19idXNfdHlwZSk7CisKKwlyZXR1cm4gZXJyOwkKK30KKwordm9pZCBf X2RldmV4aXQgY21haW5fZmluaSh2b2lkKQoreworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYg PSAmbWFpbl9jcnlwdG9fZGV2aWNlOworCisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYt PmNsYXNzX2RldmljZSwgJmNsYXNzX2RldmljZV9hdHRyX2RldmljZXMpOworCWNsYXNzX2Rldmlj ZV9yZW1vdmVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9sYnMp OworCV9fY3J5cHRvX2RldmljZV9yZW1vdmUoZGV2KTsKKworCWNyeXB0b19jb25uX2ZpbmkoKTsK KwljcnlwdG9fbGJfZmluaSgpOworCQorCWNsYXNzX3VucmVnaXN0ZXIoJmNyeXB0b19jbGFzcyk7 CisJZHJpdmVyX3VucmVnaXN0ZXIoJmNyeXB0b19kcml2ZXIpOworCWJ1c191bnJlZ2lzdGVyKCZj cnlwdG9fYnVzX3R5cGUpOworfQorCittb2R1bGVfaW5pdChjbWFpbl9pbml0KTsKK21vZHVsZV9l eGl0KGNtYWluX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9S KCJFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PiIpOworTU9EVUxFX0RFU0NS SVBUSU9OKCJBc3luY2hyb25vdXMgY3J5cHRvIGxheWVyLiIpOworCitFWFBPUlRfU1lNQk9MKGNy eXB0b19zZXNzaW9uX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX3Nlc3Npb25fY3JlYXRl KTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX3Nlc3Npb25fYWRkKTsKZGlmZiAtTnJ1IC90bXAvZW1w dHkvY3J5cHRvX3JvdXRlLmggbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9jcnlwdG9fcm91dGUu aAotLS0gL3RtcC9lbXB0eS9jcnlwdG9fcm91dGUuaAkxOTcwLTAxLTAxIDAzOjAwOjAwLjAwMDAw MDAwMCArMDMwMAorKysgbGludXgtMi42L2RyaXZlcnMvYWNyeXB0by9jcnlwdG9fcm91dGUuaAky MDA0LTExLTAyIDE4OjQ0OjIxLjAwMDAwMDAwMCArMDMwMApAQCAtMCwwICsxLDIyMCBAQAorLyoK KyAqIAljcnlwdG9fcm91dGUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBv bHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgorICogCisgKgorICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ1JZUFRPX1JPVVRFX0gKKyNk ZWZpbmUgX19DUllQVE9fUk9VVEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNs dWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1 ZGUgImFjcnlwdG8uaCIKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JvdXRlICpjcnlw dG9fcm91dGVfYWxsb2Moc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiwgc3RydWN0IGNyeXB0b19z ZXNzaW9uX2luaXRpYWxpemVyICpjaSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JvdXRlICpydDsKKwor CWNyeXB0b19kZXZpY2VfZ2V0KGRldik7CisJaWYgKCFtYXRjaF9pbml0aWFsaXplcihkZXYsIGNp KSkKKwl7CisJCWNyeXB0b19kZXZpY2VfcHV0KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKwor CXJ0ID0ga21hbGxvYyhzaXplb2YoKnJ0KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFydCkKKwl7CisJ CWNyeXB0b19kZXZpY2VfcHV0KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChy dCwgMCwgc2l6ZW9mKCpydCkpOworCW1lbWNweSgmcnQtPmNpLCBjaSwgc2l6ZW9mKCpjaSkpOwor CisJcnQtPmRldiA9IGRldjsKKworCXJldHVybiBydDsKK30KKworc3RhdGljIGlubGluZSB2b2lk IGNyeXB0b19yb3V0ZV9mcmVlKHN0cnVjdCBjcnlwdG9fcm91dGUgKnJ0KQoreworCWNyeXB0b19k ZXZpY2VfcHV0KHJ0LT5kZXYpOworCXJ0LT5kZXYgPSBOVUxMOworCWtmcmVlKHJ0KTsKK30KKwor c3RhdGljIGlubGluZSB2b2lkIF9fY3J5cHRvX3JvdXRlX2RlbChzdHJ1Y3QgY3J5cHRvX3JvdXRl ICpydCwgc3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0KQoreworCXN0cnVjdCBjcnlwdG9f cm91dGUgKm5leHQsICpwcmV2OworCisJbGlzdC0+cWxlbi0tOworCW5leHQJCT0gcnQtPm5leHQ7 CisJcHJldgkJPSBydC0+cHJldjsKKwlydC0+bmV4dAk9IHJ0LT5wcmV2ID0gTlVMTDsKKwlydC0+ bGlzdAk9IE5VTEw7CisJbmV4dC0+cHJldgk9IHByZXY7CisJcHJldi0+bmV4dAk9IG5leHQ7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fcm91dGVfZGVsKHN0cnVjdCBjcnlwdG9fcm91 dGUgKnJ0KQoreworCXN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdCA9IHJ0LT5saXN0Owor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlzdCkKKwl7CisJCXNwaW5fbG9ja19pcnFz YXZlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0ID09IHJ0LT5saXN0KQorCQkJX19j cnlwdG9fcm91dGVfZGVsKHJ0LCBydC0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jmxpc3QtPmxvY2ssIGZsYWdzKTsKKworCQljcnlwdG9fcm91dGVfZnJlZShydCk7CisJfQorfQor CitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fcm91dGUgKl9fY3J5cHRvX3JvdXRlX2RlcXVl dWUoc3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0KQoreworCXN0cnVjdCBjcnlwdG9fcm91 dGUgKm5leHQsICpwcmV2LCAqcmVzdWx0OworCisJcHJldiA9IChzdHJ1Y3QgY3J5cHRvX3JvdXRl ICopIGxpc3Q7CisJbmV4dCA9IHByZXYtPm5leHQ7CisJcmVzdWx0ID0gTlVMTDsKKwlpZiAobmV4 dCAhPSBwcmV2KSB7CisJCXJlc3VsdAkgICAgID0gbmV4dDsKKwkJbmV4dAkgICAgID0gbmV4dC0+ bmV4dDsKKwkJbGlzdC0+cWxlbi0tOworCQluZXh0LT5wcmV2ICAgPSBwcmV2OworCQlwcmV2LT5u ZXh0ICAgPSBuZXh0OworCQlyZXN1bHQtPm5leHQgPSByZXN1bHQtPnByZXYgPSBOVUxMOworCQly ZXN1bHQtPmxpc3QgPSBOVUxMOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBjcnlwdG9fcm91dGUgKmNyeXB0b19yb3V0ZV9kZXF1ZXVlKHN0cnVjdCBjcnlw dG9fc2Vzc2lvbiAqcykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JvdXRlICpydDsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5yb3V0ZV9saXN0LmxvY2ssIGZs YWdzKTsKKwlydCA9IF9fY3J5cHRvX3JvdXRlX2RlcXVldWUoJnMtPnJvdXRlX2xpc3QpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnJvdXRlX2xpc3QubG9jaywgZmxhZ3MpOworCisJcmV0 dXJuIHJ0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcnlwdG9fcm91dGVfcXVldWUoc3Ry dWN0IGNyeXB0b19yb3V0ZSAqcnQsIHN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdCkKK3sK KwlzdHJ1Y3QgY3J5cHRvX3JvdXRlICpwcmV2LCAqbmV4dDsKKworCXJ0LT5saXN0IAk9IGxpc3Q7 CisJbGlzdC0+cWxlbisrOworCW5leHQgCQk9IChzdHJ1Y3QgY3J5cHRvX3JvdXRlICopbGlzdDsK KwlwcmV2IAkJPSBuZXh0LT5wcmV2OworCXJ0LT5uZXh0IAk9IG5leHQ7CisJcnQtPnByZXYgCT0g cHJldjsKKwluZXh0LT5wcmV2ICAJPSBwcmV2LT5uZXh0ID0gcnQ7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBjcnlwdG9fcm91dGVfcXVldWUoc3RydWN0IGNyeXB0b19yb3V0ZSAqcnQsIHN0cnVj dCBjcnlwdG9fc2Vzc2lvbiAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5f bG9ja19pcnFzYXZlKCZzLT5yb3V0ZV9saXN0LmxvY2ssIGZsYWdzKTsKKwlfX2NyeXB0b19yb3V0 ZV9xdWV1ZShydCwgJnMtPnJvdXRlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMt PnJvdXRlX2xpc3QubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9f cm91dGVfYWRkKHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lv biAqcywgc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICpjaSkKK3sKKwlzdHJ1Y3Qg Y3J5cHRvX3JvdXRlICpydDsKKworCXJ0ID0gY3J5cHRvX3JvdXRlX2FsbG9jKGRldiwgY2kpOwor CWlmICghcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJY3J5cHRvX3JvdXRlX3F1ZXVlKHJ0LCBz KTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX3JvdXRlX3F1 ZXVlX2xlbihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpCit7CisJcmV0dXJuIHMtPnJvdXRlX2xp c3QucWxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19yb3V0ZV9oZWFkX2luaXQo c3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0KQoreworCXNwaW5fbG9ja19pbml0KCZsaXN0 LT5sb2NrKTsKKwlsaXN0LT5wcmV2ID0gbGlzdC0+bmV4dCA9IChzdHJ1Y3QgY3J5cHRvX3JvdXRl ICopbGlzdDsKKwlsaXN0LT5xbGVuID0gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5 cHRvX3JvdXRlICpfX2NyeXB0b19yb3V0ZV9jdXJyZW50KHN0cnVjdCBjcnlwdG9fcm91dGVfaGVh ZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JvdXRlICpuZXh0LCAqcHJldiwgKnJlc3VsdDsK KworCXByZXYgPSAoc3RydWN0IGNyeXB0b19yb3V0ZSAqKSBsaXN0OworCW5leHQgPSBwcmV2LT5u ZXh0OworCXJlc3VsdCA9IE5VTEw7CisJaWYgKG5leHQgIT0gcHJldikKKwkJcmVzdWx0ID0gbmV4 dDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19y b3V0ZSAqY3J5cHRvX3JvdXRlX2N1cnJlbnQoc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQorewor CXN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY3J5cHRvX3JvdXRlICpy dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxpc3QgPSAmcy0+cm91dGVfbGlz dDsKKworCWlmIChsaXN0KQorCXsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPmxvY2ssIGZs YWdzKTsKKwkJcnQgPSBfX2NyeXB0b19yb3V0ZV9jdXJyZW50KGxpc3QpOworCQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJ0OworfQor CitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fZGV2aWNlICpjcnlwdG9fcm91dGVfZ2V0X2N1 cnJlbnRfZGV2aWNlKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcykKK3sKKwlzdHJ1Y3QgY3J5cHRv X3JvdXRlICpydCA9IE5VTEw7CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiA9IE5VTEw7CisJ c3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0ID0gJnMtPnJvdXRlX2xpc3Q7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5sb2NrLCBmbGFncyk7 CisJcnQgPSBfX2NyeXB0b19yb3V0ZV9jdXJyZW50KGxpc3QpOworCWlmIChydCkKKwl7CisJCWRl diA9IHJ0LT5kZXY7CisJCWNyeXB0b19kZXZpY2VfZ2V0KGRldik7CisJfQorCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZGV2OworfQorCisjZW5k aWYgLyogX19DUllQVE9fUk9VVEVfSCAqLwpkaWZmIC1OcnUgL3RtcC9lbXB0eS9jcnlwdG9fc3Rh dC5jIGxpbnV4LTIuNi9kcml2ZXJzL2FjcnlwdG8vY3J5cHRvX3N0YXQuYwotLS0gL3RtcC9lbXB0 eS9jcnlwdG9fc3RhdC5jCTE5NzAtMDEtMDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBs aW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL2NyeXB0b19zdGF0LmMJMjAwNC0xMS0wMiAxODo0NDoy MS4wMDAwMDAwMDAgKzAzMDAKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiAJY3J5cHRvX3N0YXQu YworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJr YS5taXB0LnJ1PgorICogCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl bnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJv Z3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwg SW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBV U0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90 eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2su aD4KKworI2luY2x1ZGUgImFjcnlwdG8uaCIKKyNpbmNsdWRlICJjcnlwdG9fcm91dGUuaCIKKwor aW5saW5lIHZvaWQgY3J5cHRvX3N0YXRfc3RhcnRfaW5jKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAq cykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwlkZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOworCWlmIChkZXYp CisJeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zdGF0X2xvY2ssIGZsYWdzKTsKKwkJZGV2 LT5zdGF0LnNzdGFydGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3RhdF9s b2NrLCBmbGFncyk7CisKKwkJY3J5cHRvX2RldmljZV9wdXQoZGV2KTsKKwl9Cit9CisKK2lubGlu ZSB2b2lkIGNyeXB0b19zdGF0X2ZpbmlzaF9pbmMoc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQor eworCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CWRldiA9IGNyeXB0b19yb3V0ZV9nZXRfY3VycmVudF9kZXZpY2Uocyk7CisJaWYgKGRldikKKwl7 CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnN0YXRfbG9jaywgZmxhZ3MpOworCQlkZXYtPnN0 YXQuc2ZpbmlzaGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3RhdF9sb2Nr LCBmbGFncyk7CisKKwkJY3J5cHRvX2RldmljZV9wdXQoZGV2KTsKKwl9Cit9CisKK2lubGluZSB2 b2lkIGNyeXB0b19zdGF0X2NvbXBsZXRlX2luYyhzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpCit7 CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ ZGV2ID0gY3J5cHRvX3JvdXRlX2dldF9jdXJyZW50X2RldmljZShzKTsKKwlpZiAoZGV2KQorCXsK KwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3RhdF9sb2NrLCBmbGFncyk7CisJCWRldi0+c3Rh dC5zY29tcGxldGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3RhdF9sb2Nr LCBmbGFncyk7CisKKwkJY3J5cHRvX2RldmljZV9wdXQoZGV2KTsKKwl9Cit9CisKK2lubGluZSB2 b2lkIGNyeXB0b19zdGF0X3B0aW1lX2luYyhzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpCit7CisJ c3RydWN0IGNyeXB0b19kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2 ID0gY3J5cHRvX3JvdXRlX2dldF9jdXJyZW50X2RldmljZShzKTsKKwlpZiAoZGV2KQorCXsKKwkJ aW50IGk7CisJCQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zdGF0X2xvY2ssIGZsYWdzKTsK KwkJZm9yIChpPTA7IGk8ZGV2LT5jYXBfbnVtYmVyOyArK2kpCisJCXsKKwkJCWlmIChfX21hdGNo X2luaXRpYWxpemVyKCZkZXYtPmNhcFtpXSwgJnMtPmNpKSkKKwkJCXsKKwkJCQlkZXYtPmNhcFtp XS5wdGltZSArPSBzLT5jaS5wdGltZTsKKwkJCQlkZXYtPmNhcFtpXS5zY29tcCsrOworCQkJCWJy ZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3RhdF9sb2Nr LCBmbGFncyk7CisKKwkJY3J5cHRvX2RldmljZV9wdXQoZGV2KTsKKwl9Cit9CisKK0VYUE9SVF9T WU1CT0woY3J5cHRvX3N0YXRfc3RhcnRfaW5jKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX3N0YXRf ZmluaXNoX2luYyk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19zdGF0X2NvbXBsZXRlX2luYyk7CmRp ZmYgLU5ydSAvdG1wL2VtcHR5L2NyeXB0b19zdGF0LmggbGludXgtMi42L2RyaXZlcnMvYWNyeXB0 by9jcnlwdG9fc3RhdC5oCi0tLSAvdG1wL2VtcHR5L2NyeXB0b19zdGF0LmgJMTk3MC0wMS0wMSAw MzowMDowMC4wMDAwMDAwMDAgKzAzMDAKKysrIGxpbnV4LTIuNi9kcml2ZXJzL2FjcnlwdG8vY3J5 cHRvX3N0YXQuaAkyMDA0LTExLTAyIDE4OjQ0OjIxLjAwMDAwMDAwMCArMDMwMApAQCAtMCwwICsx LDMyIEBACisvKgorICogCWNyeXB0b19zdGF0LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQg RXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUg MzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NSWVBUT19T VEFUX0gKKyNkZWZpbmUgX19DUllQVE9fU1RBVF9ICisKKyNpbmNsdWRlICJhY3J5cHRvLmgiCisK K2lubGluZSB2b2lkIGNyeXB0b19zdGF0X3N0YXJ0X2luYyhzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24g KnMpOworaW5saW5lIHZvaWQgY3J5cHRvX3N0YXRfZmluaXNoX2luYyhzdHJ1Y3QgY3J5cHRvX3Nl c3Npb24gKnMpOworaW5saW5lIHZvaWQgY3J5cHRvX3N0YXRfY29tcGxldGVfaW5jKHN0cnVjdCBj cnlwdG9fc2Vzc2lvbiAqcyk7CitpbmxpbmUgdm9pZCBjcnlwdG9fc3RhdF9wdGltZV9pbmMoc3Ry dWN0IGNyeXB0b19zZXNzaW9uICpzKTsKKworI2VuZGlmIC8qIF9fQ1JZUFRPX1NUQVRfSCAqLwpk aWZmIC1OcnUgL3RtcC9lbXB0eS9zaW1wbGVfbGIuYyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRv L3NpbXBsZV9sYi5jCi0tLSAvdG1wL2VtcHR5L3NpbXBsZV9sYi5jCTE5NzAtMDEtMDEgMDM6MDA6 MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL3NpbXBsZV9s Yi5jCTIwMDQtMTEtMDIgMTg6NDQ6MjEuMDAwMDAwMDAwICswMzAwCkBAIC0wLDAgKzEsODggQEAK Ky8qCisgKiAJc2ltcGxlX2xiLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQ b2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KKyAqIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgor I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+ CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5j bHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNs dWRlICJjcnlwdG9fbGIuaCIKKworc3RhdGljIHZvaWQgc2ltcGxlX2xiX3JlaGFzaChzdHJ1Y3Qg Y3J5cHRvX2xiICopOworc3RhdGljIHN0cnVjdCBjcnlwdG9fZGV2aWNlICpzaW1wbGVfbGJfZmlu ZF9kZXZpY2Uoc3RydWN0IGNyeXB0b19sYiAqLCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlh bGl6ZXIgKiwgc3RydWN0IGNyeXB0b19kYXRhICopOworCitzdHJ1Y3QgY3J5cHRvX2xiIHNpbXBs ZV9sYiA9IAoreworCS5uYW1lCQk9ICJzaW1wbGVfbGIiLAorCS5yZWhhc2gJCT0gc2ltcGxlX2xi X3JlaGFzaCwKKwkuZmluZF9kZXZpY2UJPSBzaW1wbGVfbGJfZmluZF9kZXZpY2UKK307CisKK3N0 YXRpYyB2b2lkIHNpbXBsZV9sYl9yZWhhc2goc3RydWN0IGNyeXB0b19sYiAqbGIpCit7Cit9CisK K3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2RldmljZSAqc2ltcGxlX2xiX2ZpbmRfZGV2aWNlKHN0cnVj dCBjcnlwdG9fbGIgKmxiLCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKmNpLCBz dHJ1Y3QgY3J5cHRvX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiwg Kl9fZGV2OworCWludCBtaW4gPSAweDdmZmZmZmY7CisKKwlfX2RldiA9IE5VTEw7CisJbGlzdF9m b3JfZWFjaF9lbnRyeShkZXYsIGxiLT5jcnlwdG9fZGV2aWNlX2xpc3QsIGNkZXZfZW50cnkpCisJ eworCQlpZiAoZGV2aWNlX2Jyb2tlbihkZXYpKQorCQkJY29udGludWU7CisJCWlmICghbWF0Y2hf aW5pdGlhbGl6ZXIoZGV2LCBjaSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYXRvbWljX3JlYWQo JmRldi0+cmVmY250KSA8IG1pbikKKwkJeworCQkJbWluID0gYXRvbWljX3JlYWQoJmRldi0+cmVm Y250KTsKKwkJCV9fZGV2ID0gZGV2OworCQl9CisJfQorCisJcmV0dXJuIF9fZGV2OworfQorCitp bnQgX19kZXZpbml0IHNpbXBsZV9sYl9pbml0KHZvaWQpCit7CisJZHByaW50ayhLRVJOX0lORk8g IlJlZ2lzdGVyaW5nIHNpbXBsZSBjcnlwdG8gbG9hZCBiYWxhbmNlci5cbiIpOworCisJcmV0dXJu IGNyeXB0b19sYl9yZWdpc3Rlcigmc2ltcGxlX2xiLCAxLCAxKTsKK30KKwordm9pZCBfX2RldmV4 aXQgc2ltcGxlX2xiX2Zpbmkodm9pZCkKK3sKKwlkcHJpbnRrKEtFUk5fSU5GTyAiVW5yZWdpc3Rl cmluZyBzaW1wbGUgY3J5cHRvIGxvYWQgYmFsYW5jZXIuXG4iKTsKKworCWNyeXB0b19sYl91bnJl Z2lzdGVyKCZzaW1wbGVfbGIpOworfQorCittb2R1bGVfaW5pdChzaW1wbGVfbGJfaW5pdCk7Citt b2R1bGVfZXhpdChzaW1wbGVfbGJfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01P RFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Iik7CitN T0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBjcnlwdG8gbG9hZCBiYWxhbmNlci4iKTsKZGlmZiAt TnJ1IC90bXAvZW1wdHkvdmlhLXBhZGxvY2svTWFrZWZpbGUgbGludXgtMi42L2RyaXZlcnMvYWNy eXB0by92aWEtcGFkbG9jay9NYWtlZmlsZQotLS0gL3RtcC9lbXB0eS92aWEtcGFkbG9jay9NYWtl ZmlsZQkxOTcwLTAxLTAxIDAzOjAwOjAwLjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42L2Ry aXZlcnMvYWNyeXB0by92aWEtcGFkbG9jay9NYWtlZmlsZQkyMDA0LTEwLTMwIDA5OjAzOjM3LjAw MDAwMDAwMCArMDQwMApAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19WSUFfUEFETE9DSykJ Kz0gcGFkbG9jay5vCitwYWRsb2NrLW9ianMJOj0gcGFkbG9jay1hZXMubyBwYWRsb2NrLWdlbmVy aWMubwpkaWZmIC1OcnUgL3RtcC9lbXB0eS92aWEtcGFkbG9jay9wYWRsb2NrLWFlcy5jIGxpbnV4 LTIuNi9kcml2ZXJzL2FjcnlwdG8vdmlhLXBhZGxvY2svcGFkbG9jay1hZXMuYwotLS0gL3RtcC9l bXB0eS92aWEtcGFkbG9jay9wYWRsb2NrLWFlcy5jCTE5NzAtMDEtMDEgMDM6MDA6MDAuMDAwMDAw MDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL3ZpYS1wYWRsb2NrL3BhZGxv Y2stYWVzLmMJMjAwNC0xMC0zMCAwOTowMTo1Ni4wMDAwMDAwMDAgKzA0MDAKQEAgLTAsMCArMSw1 NTIgQEAKKy8qIAorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogU3VwcG9ydCBmb3IgVklB IFBhZExvY2sgaGFyZHdhcmUgY3J5cHRvIGVuZ2luZS4KKyAqCisgKiBMaW51eCBkZXZlbG9wZXJz OgorICogIE1pY2hhbCBMdWR2aWcgPG1sdWR2aWdAc3VzZS5jej4KKyAqCisgKiBLZXkgZXhwYW5z aW9uIHJvdXRpbmUgdGFrZW4gZnJvbSBjcnlwdG8vYWVzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQor ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAy MDAyLCBEciBCcmlhbiBHbGFkbWFuIDxicmdAZ2xhZG1hbi5tZS51az4sIFdvcmNlc3RlciwgVUsu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBU aGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291 cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5n ZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291 cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisg KiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29w eXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm b2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig b3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhv bGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWls dCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9u LgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0 YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGlu IHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRo b3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJl IGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRp ZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBs aW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisg KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVk ZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxh c20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9z Y2F0dGVybGlzdC5oPgorCisjaW5jbHVkZSAicGFkbG9jay5oIgorCisjaW5jbHVkZSAiLi4vY3J5 cHRvX2RlZi5oIgorI2luY2x1ZGUgIi4uL2FjcnlwdG8uaCIKKyNpbmNsdWRlICIuLi9jcnlwdG9f c3RhdC5oIgorCitzdGF0aWMgaW5saW5lIGludCBhZXNfaHdfZXh0a2V5X2F2YWlsYWJsZSAodTgg a2V5X2xlbik7CisKK3N0YXRpYyBpbmxpbmUgCit1MzIgZ2VuZXJpY19yb3RyMzIgKGNvbnN0IHUz MiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQoreworCWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUg MzI7CisJcmV0dXJuICh4ID4+IG4pIHwgKHggPDwgKDMyIC0gbikpOworfQorCitzdGF0aWMgaW5s aW5lIAordTMyIGdlbmVyaWNfcm90bDMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0 cykKK3sKKwljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOworCXJldHVybiAoeCA8PCBuKSB8 ICh4ID4+ICgzMiAtIG4pKTsKK30KKworI2RlZmluZSByb3RsIGdlbmVyaWNfcm90bDMyCisjZGVm aW5lIHJvdHIgZ2VuZXJpY19yb3RyMzIKKworLyoKKyAqICNkZWZpbmUgYnl0ZSh4LCBucikgKCh1 bnNpZ25lZCBjaGFyKSgoeCkgPj4gKG5yKjgpKSkgCisgKi8KK2lubGluZSBzdGF0aWMgdTgKK2J5 dGUoY29uc3QgdTMyIHgsIGNvbnN0IHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIHggPj4gKG4gPDwg Myk7Cit9CisKKyNkZWZpbmUgdTMyX2luKHgpIGxlMzJfdG9fY3B1KCooY29uc3QgdTMyICopKHgp KQorI2RlZmluZSB1MzJfb3V0KHRvLCBmcm9tKSAoKih1MzIgKikodG8pID0gY3B1X3RvX2xlMzIo ZnJvbSkpCisKK3N0YXRpYyB1OCBwb3dfdGFiWzI1Nl07CitzdGF0aWMgdTggbG9nX3RhYlsyNTZd Oworc3RhdGljIHU4IHNieF90YWJbMjU2XTsKK3N0YXRpYyB1OCBpc2JfdGFiWzI1Nl07CitzdGF0 aWMgdTMyIHJjb190YWJbMTBdOworc3RhdGljIHUzMiBmdF90YWJbNF1bMjU2XTsKK3N0YXRpYyB1 MzIgaXRfdGFiWzRdWzI1Nl07CisKK3N0YXRpYyB1MzIgZmxfdGFiWzRdWzI1Nl07CitzdGF0aWMg dTMyIGlsX3RhYls0XVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4CitmX211bHQgKHU4IGEsIHU4 IGIpCit7CisJdTggYWEgPSBsb2dfdGFiW2FdLCBjYyA9IGFhICsgbG9nX3RhYltiXTsKKworCXJl dHVybiBwb3dfdGFiW2NjICsgKGNjIDwgYWEgPyAxIDogMCldOworfQorCisjZGVmaW5lIGZmX211 bHQoYSxiKSAgICAoYSAmJiBiID8gZl9tdWx0KGEsIGIpIDogMCkKKworI2RlZmluZSBmX3JuKGJv LCBiaSwgbiwgaykJCQkJCVwKKyAgICBib1tuXSA9ICBmdF90YWJbMF1bYnl0ZShiaVtuXSwwKV0g XgkJCQlcCisgICAgICAgICAgICAgZnRfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBe CQlcCisgICAgICAgICAgICAgZnRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlc CisgICAgICAgICAgICAgZnRfdGFiWzNdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDMpXSBeICooayAr IG4pCisKKyNkZWZpbmUgaV9ybihibywgYmksIG4sIGspCQkJCQlcCisgICAgYm9bbl0gPSAgaXRf dGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAorICAgICAgICAgICAgIGl0X3RhYlsxXVtieXRl KGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAorICAgICAgICAgICAgIGl0X3RhYlsyXVtieXRlKGJp WyhuICsgMikgJiAzXSwyKV0gXgkJXAorICAgICAgICAgICAgIGl0X3RhYlszXVtieXRlKGJpWyhu ICsgMSkgJiAzXSwzKV0gXiAqKGsgKyBuKQorCisjZGVmaW5lIGxzX2JveCh4KQkJCQlcCisgICAg KCBmbF90YWJbMF1bYnl0ZSh4LCAwKV0gXgkJCVwKKyAgICAgIGZsX3RhYlsxXVtieXRlKHgsIDEp XSBeCQkJXAorICAgICAgZmxfdGFiWzJdW2J5dGUoeCwgMildIF4JCQlcCisgICAgICBmbF90YWJb M11bYnl0ZSh4LCAzKV0gKQorCisjZGVmaW5lIGZfcmwoYm8sIGJpLCBuLCBrKQkJCQkJXAorICAg IGJvW25dID0gIGZsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKyAgICAgICAgICAgICBm bF90YWJbMV1bYnl0ZShiaVsobiArIDEpICYgM10sMSldIF4JCVwKKyAgICAgICAgICAgICBmbF90 YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKKyAgICAgICAgICAgICBmbF90YWJb M11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikKKworI2RlZmluZSBpX3JsKGJv LCBiaSwgbiwgaykJCQkJCVwKKyAgICBib1tuXSA9ICBpbF90YWJbMF1bYnl0ZShiaVtuXSwwKV0g XgkJCQlcCisgICAgICAgICAgICAgaWxfdGFiWzFdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDEpXSBe CQlcCisgICAgICAgICAgICAgaWxfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlc CisgICAgICAgICAgICAgaWxfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDMpXSBeICooayAr IG4pCisKK3N0YXRpYyB2b2lkCitnZW5fdGFicyAodm9pZCkKK3sKKwl1MzIgaSwgdDsKKwl1OCBw LCBxOworCisJLyogbG9nIGFuZCBwb3dlciB0YWJsZXMgZm9yIEdGKDIqKjgpIGZpbml0ZSBmaWVs ZCB3aXRoCisJICAgMHgwMTFiIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBw cm1pdGl2ZQorCSAgIHJvb3QgaXMgMHgwMywgdXNlZCBoZXJlIHRvIGdlbmVyYXRlIHRoZSB0YWJs ZXMgKi8KKworCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMjU2OyArK2kpIHsKKwkJcG93X3RhYltp XSA9ICh1OCkgcDsKKwkJbG9nX3RhYltwXSA9ICh1OCkgaTsKKworCQlwIF49IChwIDw8IDEpIF4g KHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlsb2dfdGFiWzFdID0gMDsKKworCWZvciAo aSA9IDAsIHAgPSAxOyBpIDwgMTA7ICsraSkgeworCQlyY29fdGFiW2ldID0gcDsKKworCQlwID0g KHAgPDwgMSkgXiAocCAmIDB4ODAgPyAweDAxYiA6IDApOworCX0KKworCWZvciAoaSA9IDA7IGkg PCAyNTY7ICsraSkgeworCQlwID0gKGkgPyBwb3dfdGFiWzI1NSAtIGxvZ190YWJbaV1dIDogMCk7 CisJCXEgPSAoKHAgPj4gNykgfCAocCA8PCAxKSkgXiAoKHAgPj4gNikgfCAocCA8PCAyKSk7CisJ CXAgXj0gMHg2MyBeIHEgXiAoKHEgPj4gNikgfCAocSA8PCAyKSk7CisJCXNieF90YWJbaV0gPSBw OworCQlpc2JfdGFiW3BdID0gKHU4KSBpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsr aSkgeworCQlwID0gc2J4X3RhYltpXTsKKworCQl0ID0gcDsKKwkJZmxfdGFiWzBdW2ldID0gdDsK KwkJZmxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWZsX3RhYlsyXVtpXSA9IHJvdGwgKHQs IDE2KTsKKwkJZmxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXQgPSAoKHUzMikgZmZf bXVsdCAoMiwgcCkpIHwKKwkJICAgICgodTMyKSBwIDw8IDgpIHwKKwkJICAgICgodTMyKSBwIDw8 IDE2KSB8ICgodTMyKSBmZl9tdWx0ICgzLCBwKSA8PCAyNCk7CisKKwkJZnRfdGFiWzBdW2ldID0g dDsKKwkJZnRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWZ0X3RhYlsyXVtpXSA9IHJvdGwg KHQsIDE2KTsKKwkJZnRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXAgPSBpc2JfdGFi W2ldOworCisJCXQgPSBwOworCQlpbF90YWJbMF1baV0gPSB0OworCQlpbF90YWJbMV1baV0gPSBy b3RsICh0LCA4KTsKKwkJaWxfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOworCQlpbF90YWJbM11b aV0gPSByb3RsICh0LCAyNCk7CisKKwkJdCA9ICgodTMyKSBmZl9tdWx0ICgxNCwgcCkpIHwKKwkJ ICAgICgodTMyKSBmZl9tdWx0ICg5LCBwKSA8PCA4KSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAo MTMsIHApIDw8IDE2KSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAoMTEsIHApIDw8IDI0KTsKKwor CQlpdF90YWJbMF1baV0gPSB0OworCQlpdF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKKwkJaXRf dGFiWzJdW2ldID0gcm90bCAodCwgMTYpOworCQlpdF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7 CisJfQorfQorCisjZGVmaW5lIHN0YXJfeCh4KSAoKCh4KSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4g KCgoKHgpICYgMHg4MDgwODA4MCkgPj4gNykgKiAweDFiKQorCisjZGVmaW5lIGltaXhfY29sKHks eCkgICAgICAgXAorICAgIHUgICA9IHN0YXJfeCh4KTsgICAgICAgIFwKKyAgICB2ICAgPSBzdGFy X3godSk7ICAgICAgICBcCisgICAgdyAgID0gc3Rhcl94KHYpOyAgICAgICAgXAorICAgIHQgICA9 IHcgXiAoeCk7ICAgICAgICAgIFwKKyAgICh5KSAgPSB1IF4gdiBeIHc7ICAgICAgICBcCisgICAo eSkgXj0gcm90cih1IF4gdCwgIDgpIF4gXAorICAgICAgICAgIHJvdHIodiBeIHQsIDE2KSBeIFwK KyAgICAgICAgICByb3RyKHQsMjQpCisKKy8qIGluaXRpYWxpc2UgdGhlIGtleSBzY2hlZHVsZSBm cm9tIHRoZSB1c2VyIHN1cHBsaWVkIGtleSAqLworCisjZGVmaW5lIGxvb3A0KGkpICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgIHQgPSByb3RyKHQsICA4KTsgdCA9IGxz X2JveCh0KSBeIHJjb190YWJbaV07ICAgIFwKKyAgICB0IF49IEVfS0VZWzQgKiBpXTsgICAgIEVf S0VZWzQgKiBpICsgNF0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs0ICogaSArIDFdOyBFX0tF WVs0ICogaSArIDVdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAyXTsgRV9LRVlb NCAqIGkgKyA2XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzQgKiBpICsgM107IEVfS0VZWzQg KiBpICsgN10gPSB0OyAgICBcCit9CisKKyNkZWZpbmUgbG9vcDYoaSkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCit7ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQp IF4gcmNvX3RhYltpXTsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGldOyAgICAgRV9LRVlbNiAq IGkgKyA2XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgMV07IEVfS0VZWzYgKiBp ICsgN10gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDJdOyBFX0tFWVs2ICogaSAr IDhdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAzXTsgRV9LRVlbNiAqIGkgKyA5 XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgNF07IEVfS0VZWzYgKiBpICsgMTBd ID0gdDsgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDVdOyBFX0tFWVs2ICogaSArIDExXSA9 IHQ7ICAgXAorfQorCisjZGVmaW5lIGxvb3A4KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAoreyAgIHQgPSByb3RyKHQsICA4KTsgOyB0ID0gbHNfYm94KHQpIF4gcmNvX3Rh YltpXTsgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpXTsgICAgIEVfS0VZWzggKiBpICsgOF0gPSB0 OyAgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDFdOyBFX0tFWVs4ICogaSArIDldID0gdDsg ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAyXTsgRV9LRVlbOCAqIGkgKyAxMF0gPSB0OyAg IFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgM107IEVfS0VZWzggKiBpICsgMTFdID0gdDsgICBc CisgICAgdCAgPSBFX0tFWVs4ICogaSArIDRdIF4gbHNfYm94KHQpOyAgICBcCisgICAgRV9LRVlb OCAqIGkgKyAxMl0gPSB0OyAgICAgICAgICAgICAgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSAr IDVdOyBFX0tFWVs4ICogaSArIDEzXSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA2 XTsgRV9LRVlbOCAqIGkgKyAxNF0gPSB0OyAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgN107 IEVfS0VZWzggKiBpICsgMTVdID0gdDsgICBcCit9CisKK3N0YXRpYyBpbnQKK2Flc19zZXRfa2V5 KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuKQor eworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCXUzMiBpLCB0LCB1LCB2LCB3Owor CXUzMiBQW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CisJdTMyIHJvdW5kczsKKworCWlmIChrZXlf bGVuICE9IDE2ICYmIGtleV9sZW4gIT0gMjQgJiYga2V5X2xlbiAhPSAzMikgeworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJY3R4LT5FID0g Y3R4LT5lX2RhdGE7CisJY3R4LT5EID0gY3R4LT5kX2RhdGE7CisKKwkvKiBFbnN1cmUgMTYtQnl0 ZXMgYWxpZ25tZW50YXRpb24gb2Yga2V5cyBmb3IgVklBIFBhZExvY2suICovCisJaWYgKChpbnQp KGN0eC0+ZV9kYXRhKSAmIDB4MEYpCisJCWN0eC0+RSArPSA0IC0gKCgoaW50KShjdHgtPmVfZGF0 YSkgJiAweDBGKSAvIHNpemVvZiAoY3R4LT5lX2RhdGFbMF0pKTsKKworCWlmICgoaW50KShjdHgt PmRfZGF0YSkgJiAweDBGKQorCQljdHgtPkQgKz0gNCAtICgoKGludCkoY3R4LT5kX2RhdGEpICYg MHgwRikgLyBzaXplb2YgKGN0eC0+ZF9kYXRhWzBdKSk7CisKKwlFX0tFWVswXSA9IHUzMl9pbiAo aW5fa2V5KTsKKwlFX0tFWVsxXSA9IHUzMl9pbiAoaW5fa2V5ICsgNCk7CisJRV9LRVlbMl0gPSB1 MzJfaW4gKGluX2tleSArIDgpOworCUVfS0VZWzNdID0gdTMyX2luIChpbl9rZXkgKyAxMik7CisK KwkvKiBEb24ndCBnZW5lcmF0ZSBleHRlbmRlZCBrZXlzIGlmIHRoZSBoYXJkd2FyZSBjYW4gZG8g aXQuICovCisJaWYgKGFlc19od19leHRrZXlfYXZhaWxhYmxlKGtleV9sZW4pKQorCQlyZXR1cm4g MDsKKworCXN3aXRjaCAoa2V5X2xlbikgeworCWNhc2UgMTY6CisJCXQgPSBFX0tFWVszXTsKKwkJ Zm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisJCQlsb29wNCAoaSk7CisJCWJyZWFrOworCisJY2Fz ZSAyNDoKKwkJRV9LRVlbNF0gPSB1MzJfaW4gKGluX2tleSArIDE2KTsKKwkJdCA9IEVfS0VZWzVd ID0gdTMyX2luIChpbl9rZXkgKyAyMCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJCQls b29wNiAoaSk7CisJCWJyZWFrOworCisJY2FzZSAzMjoKKwkJRV9LRVlbNF0gPSB1MzJfaW4gKGlu X2tleSArIDE2KTsKKwkJRV9LRVlbNV0gPSB1MzJfaW4gKGluX2tleSArIDIwKTsKKwkJRV9LRVlb Nl0gPSB1MzJfaW4gKGluX2tleSArIDI0KTsKKwkJdCA9IEVfS0VZWzddID0gdTMyX2luIChpbl9r ZXkgKyAyOCk7CisJCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisJCQlsb29wOCAoaSk7CisJCWJy ZWFrOworCX0KKworCURfS0VZWzBdID0gRV9LRVlbMF07CisJRF9LRVlbMV0gPSBFX0tFWVsxXTsK KwlEX0tFWVsyXSA9IEVfS0VZWzJdOworCURfS0VZWzNdID0gRV9LRVlbM107CisKKwlmb3IgKGkg PSA0OyBpIDwga2V5X2xlbiArIDI0OyArK2kpIHsKKwkJaW1peF9jb2wgKERfS0VZW2ldLCBFX0tF WVtpXSk7CisJfQorCisJLyogUGFkTG9jayBuZWVkcyBhIGRpZmZlcmVudCBmb3JtYXQgb2YgdGhl IGRlY3J5cHRpb24ga2V5LiAqLworCXJvdW5kcyA9IDEwICsgKGtleV9sZW4gLSAxNikgLyA0Owor CisJZm9yIChpID0gMDsgaSA8IHJvdW5kczsgaSsrKSB7CisJCVBbKChpICsgMSkgKiA0KSArIDBd ID0gRF9LRVlbKChyb3VuZHMgLSBpIC0gMSkgKiA0KSArIDBdOworCQlQWygoaSArIDEpICogNCkg KyAxXSA9IERfS0VZWygocm91bmRzIC0gaSAtIDEpICogNCkgKyAxXTsKKwkJUFsoKGkgKyAxKSAq IDQpICsgMl0gPSBEX0tFWVsoKHJvdW5kcyAtIGkgLSAxKSAqIDQpICsgMl07CisJCVBbKChpICsg MSkgKiA0KSArIDNdID0gRF9LRVlbKChyb3VuZHMgLSBpIC0gMSkgKiA0KSArIDNdOworCX0KKwor CVBbMF0gPSBFX0tFWVsocm91bmRzICogNCkgKyAwXTsKKwlQWzFdID0gRV9LRVlbKHJvdW5kcyAq IDQpICsgMV07CisJUFsyXSA9IEVfS0VZWyhyb3VuZHMgKiA0KSArIDJdOworCVBbM10gPSBFX0tF WVsocm91bmRzICogNCkgKyAzXTsKKworCW1lbWNweShEX0tFWSwgUCwgQUVTX0VYVEVOREVEX0tF WV9TSVpFX0IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRlbGxzIHdoZXRoZXIgdGhlIEFDRSBp cyBjYXBhYmxlIHRvIGdlbmVyYXRlCisgICB0aGUgZXh0ZW5kZWQga2V5IGZvciBhIGdpdmVuIGtl eV9sZW4uICovCitzdGF0aWMgaW5saW5lIGludCBhZXNfaHdfZXh0a2V5X2F2YWlsYWJsZSh1OCBr ZXlfbGVuKQoreworCS8qIFRPRE86IFdlIHNob3VsZCBjaGVjayB0aGUgYWN0dWFsIENQVSBtb2Rl bC9zdGVwcGluZworCSAgICAgICAgIGFzIGl0J3MgbGlrZWx5IHRoYXQgdGhlIGNhcGFiaWxpdHkg d2lsbCBiZQorCSAgICAgICAgIGFkZGVkIGluIHRoZSBuZXh0IENQVSByZXZpc2lvbnMuICovCisJ aWYgKGtleV9sZW4gPT0gMTYpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMg dm9pZCBhZXNfcGFkbG9jayh2b2lkICpjdHhfYXJnLCB1OCAqb3V0X2FyZywgY29uc3QgdTggKmlu X2FyZywKKwkJCWNvbnN0IHU4ICppdl9hcmcsIHNpemVfdCBuYnl0ZXMsIGludCBlbmNkZWMsCisJ CQlpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwljaGFyIGJp Z2J1ZltzaXplb2YodW5pb24gY3dvcmQpICsgMTZdOworCXVuaW9uIGN3b3JkICpjd29yZDsKKwl2 b2lkICprZXk7CisKKwlpZiAoKChsb25nKWJpZ2J1ZikgJiAweDBGKQorCQljd29yZCA9ICh2b2lk KikoYmlnYnVmICsgMTYgLSAoKGxvbmcpYmlnYnVmICYgMHgwRikpOworCWVsc2UKKwkJY3dvcmQg PSAodm9pZCopYmlnYnVmOworCisJLyogUHJlcGFyZSBDb250cm9sIHdvcmQuICovCisJbWVtc2V0 IChjd29yZCwgMCwgc2l6ZW9mKHVuaW9uIGN3b3JkKSk7CisJY3dvcmQtPmIuZW5jZGVjID0gIWVu Y2RlYzsJLyogaW4gdGhlIHJlc3Qgb2YgY3J5cHRvYXBpIEVOQz0xL0RFQz0wICovCisJY3dvcmQt PmIucm91bmRzID0gMTAgKyAoY3R4LT5rZXlfbGVuZ3RoIC0gMTYpIC8gNDsKKwljd29yZC0+Yi5r c2l6ZSA9IChjdHgtPmtleV9sZW5ndGggLSAxNikgLyA4OworCisJLyogSXMgdGhlIGhhcmR3YXJl IGNhcGFibGUgdG8gZ2VuZXJhdGUgdGhlIGV4dGVuZGVkIGtleT8gKi8KKwlpZiAoIWFlc19od19l eHRrZXlfYXZhaWxhYmxlKGN0eC0+a2V5X2xlbmd0aCkpCisJCWN3b3JkLT5iLmtleWdlbiA9IDE7 CisKKwkvKiBjdHgtPkUgc3RhcnRzIHdpdGggYSBwbGFpbiBrZXkgLSBpZiB0aGUgaGFyZHdhcmUg aXMgY2FwYWJsZQorCSAgIHRvIGdlbmVyYXRlIHRoZSBleHRlbmRlZCBrZXkgaXRzZWxmIHdlIG11 c3Qgc3VwcGx5CisJICAgdGhlIHBsYWluIGtleSBmb3IgYm90aCBFbmNyeXB0aW9uIGFuZCBEZWNy eXB0aW9uLiAqLworCWlmIChlbmNkZWMgPT0gIENSWVBUT19PUF9FTkNSWVBUIHx8IGN3b3JkLT5i LmtleWdlbiA9PSAwKQorCQlrZXkgPSBjdHgtPkU7CisJZWxzZQorCQlrZXkgPSBjdHgtPkQ7CisJ CisJcGFkbG9ja19hbGlnbmVyKG91dF9hcmcsIGluX2FyZywgaXZfYXJnLCBrZXksIGN3b3JkLAor CQkJbmJ5dGVzLCBBRVNfQkxPQ0tfU0laRSwgZW5jZGVjLCBtb2RlKTsKK30KKworc3RhdGljIHZv aWQgYWVzX3BhZGxvY2tfZWNiKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYywgY29u c3QgdTggKml2LAorCQkJICAgIHNpemVfdCBuYnl0ZXMsIGludCBlbmNkZWMpCit7CisJYWVzX3Bh ZGxvY2soY3R4LCBkc3QsIHNyYywgTlVMTCwgbmJ5dGVzLCBlbmNkZWMsIENSWVBUT19NT0RFX0VD Qik7Cit9CisKK3N0YXRpYyB2b2lkIGFlc19wYWRsb2NrX2NiYyh2b2lkICpjdHgsIHU4ICpkc3Qs IGNvbnN0IHU4ICpzcmMsIGNvbnN0IHU4ICppdiwKKwkJCSAgICBzaXplX3QgbmJ5dGVzLCBpbnQg ZW5jZGVjKQoreworCWFlc19wYWRsb2NrKGN0eCwgZHN0LCBzcmMsIGl2LCBuYnl0ZXMsIGVuY2Rl YywgQ1JZUFRPX01PREVfQ0JDKTsKK30KKworc3RhdGljIHZvaWQgYWVzX3BhZGxvY2tfY2ZiKHZv aWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYywgY29uc3QgdTggKml2LAorCQkJICAgIHNp emVfdCBuYnl0ZXMsIGludCBlbmNkZWMpCit7CisJYWVzX3BhZGxvY2soY3R4LCBkc3QsIHNyYywg aXYsIG5ieXRlcywgZW5jZGVjLCBDUllQVE9fTU9ERV9DRkIpOworfQorCitzdGF0aWMgdm9pZCBh ZXNfcGFkbG9ja19vZmIodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCBjb25zdCB1 OCAqaXYsCisJCQkgICAgc2l6ZV90IG5ieXRlcywgaW50IGVuY2RlYykKK3sKKwlhZXNfcGFkbG9j ayhjdHgsIGRzdCwgc3JjLCBpdiwgbmJ5dGVzLCBlbmNkZWMsIENSWVBUT19NT0RFX09GQik7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2NhcGFiaWxpdHkgcGFkbG9ja19jYXBzW10gPSAKK3sK Kwl7Q1JZUFRPX09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xMjgsIENSWVBUT19NT0RFX0VD QiwgMTAwMH0sCisJe0NSWVBUT19PUF9FTkNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTI4LCBDUllQ VE9fTU9ERV9DQkMsIDEwMDB9LAorCXtDUllQVE9fT1BfRU5DUllQVCwgQ1JZUFRPX1RZUEVfQUVT XzEyOCwgQ1JZUFRPX01PREVfQ0ZCLCAxMDAwfSwKKwl7Q1JZUFRPX09QX0VOQ1JZUFQsIENSWVBU T19UWVBFX0FFU18xMjgsIENSWVBUT19NT0RFX09GQiwgMTAwMH0sCisKKwl7Q1JZUFRPX09QX0VO Q1JZUFQsIENSWVBUT19UWVBFX0FFU18xOTIsIENSWVBUT19NT0RFX0VDQiwgMTAwMH0sCisJe0NS WVBUT19PUF9FTkNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTkyLCBDUllQVE9fTU9ERV9DQkMsIDEw MDB9LAorCXtDUllQVE9fT1BfRU5DUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzE5MiwgQ1JZUFRPX01P REVfQ0ZCLCAxMDAwfSwKKwl7Q1JZUFRPX09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xOTIs IENSWVBUT19NT0RFX09GQiwgMTAwMH0sCisJCisJe0NSWVBUT19PUF9FTkNSWVBULCBDUllQVE9f VFlQRV9BRVNfMjU2LCBDUllQVE9fTU9ERV9FQ0IsIDEwMDB9LAorCXtDUllQVE9fT1BfRU5DUllQ VCwgQ1JZUFRPX1RZUEVfQUVTXzI1NiwgQ1JZUFRPX01PREVfQ0JDLCAxMDAwfSwKKwl7Q1JZUFRP X09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18yNTYsIENSWVBUT19NT0RFX0NGQiwgMTAwMH0s CisJe0NSWVBUT19PUF9FTkNSWVBULCBDUllQVE9fVFlQRV9BRVNfMjU2LCBDUllQVE9fTU9ERV9P RkIsIDEwMDB9LAorCQorCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzEyOCwg Q1JZUFRPX01PREVfRUNCLCAxMDAwfSwKKwl7Q1JZUFRPX09QX0RFQ1JZUFQsIENSWVBUT19UWVBF X0FFU18xMjgsIENSWVBUT19NT0RFX0NCQywgMTAwMH0sCisJe0NSWVBUT19PUF9ERUNSWVBULCBD UllQVE9fVFlQRV9BRVNfMTI4LCBDUllQVE9fTU9ERV9DRkIsIDEwMDB9LAorCXtDUllQVE9fT1Bf REVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzEyOCwgQ1JZUFRPX01PREVfT0ZCLCAxMDAwfSwKKwor CXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzE5MiwgQ1JZUFRPX01PREVfRUNC LCAxMDAwfSwKKwl7Q1JZUFRPX09QX0RFQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xOTIsIENSWVBU T19NT0RFX0NCQywgMTAwMH0sCisJe0NSWVBUT19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9BRVNf MTkyLCBDUllQVE9fTU9ERV9DRkIsIDEwMDB9LAorCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRP X1RZUEVfQUVTXzE5MiwgQ1JZUFRPX01PREVfT0ZCLCAxMDAwfSwKKwkKKwl7Q1JZUFRPX09QX0RF Q1JZUFQsIENSWVBUT19UWVBFX0FFU18yNTYsIENSWVBUT19NT0RFX0VDQiwgMTAwMH0sCisJe0NS WVBUT19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9BRVNfMjU2LCBDUllQVE9fTU9ERV9DQkMsIDEw MDB9LAorCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzI1NiwgQ1JZUFRPX01P REVfQ0ZCLCAxMDAwfSwKKwl7Q1JZUFRPX09QX0RFQ1JZUFQsIENSWVBUT19UWVBFX0FFU18yNTYs IENSWVBUT19NT0RFX09GQiwgMTAwMH0sCit9Oworc3RhdGljIGludCBwYWRsb2NrX2NhcF9udW1i ZXIgPSBzaXplb2YocGFkbG9ja19jYXBzKS9zaXplb2YocGFkbG9ja19jYXBzWzBdKTsKKworc3Rh dGljIHZvaWQgcGFkbG9ja19kYXRhX3JlYWR5KHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYpOwor c3RhdGljIGludCBwYWRsb2NrX2RhdGFfcmVhZHlfcmVlbnRyeTsKKworc3RhdGljIHN0cnVjdCBj cnlwdG9fZGV2aWNlIHBhZGxvY2tfZGV2aWNlID0KK3sKKwkubmFtZQkJCT0gInZpYS1wYWRsb2Nr IiwKKwkuZGF0YV9yZWFkeQkJPSBwYWRsb2NrX2RhdGFfcmVhZHksCisJLmNhcAkJCT0gJnBhZGxv Y2tfY2Fwc1swXSwKK307CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2Vzc2lvbihzdHJ1Y3QgY3J5 cHRvX3Nlc3Npb24gKnMpCit7CisJaW50IGVycjsKKwl1OCAqa2V5LCAqZHN0LCAqc3JjLCAqaXY7 CisJc2l6ZV90IHNpemUsIGtleWxlbjsKKwkKKwlrZXkgPSAoKHU4ICopcGFnZV9hZGRyZXNzKHMt PmRhdGEuc2dfa2V5LnBhZ2UpKSArIHMtPmRhdGEuc2dfa2V5Lm9mZnNldDsKKwlrZXlsZW4gPSBz LT5kYXRhLnNnX2tleS5sZW5ndGg7CisJZHN0ID0gKCh1OCAqKXBhZ2VfYWRkcmVzcyhzLT5kYXRh LnNnX2RzdC5wYWdlKSkgKyBzLT5kYXRhLnNnX2RzdC5vZmZzZXQ7CisJc3JjID0gKCh1OCAqKXBh Z2VfYWRkcmVzcyhzLT5kYXRhLnNnX3NyYy5wYWdlKSkgKyBzLT5kYXRhLnNnX3NyYy5vZmZzZXQ7 CisJc2l6ZSA9IHMtPmRhdGEuc2dfc3JjLmxlbmd0aDsKKwlpdiA9ICgodTggKilwYWdlX2FkZHJl c3Mocy0+ZGF0YS5zZ19pdi5wYWdlKSkgKyBzLT5kYXRhLnNnX2l2Lm9mZnNldDsKKwkKKwllcnIg PSBhZXNfc2V0X2tleShzLT5kYXRhLnByaXYsIGtleSwga2V5bGVuKTsKKwlpZiAoZXJyKQorCQly ZXR1cm47CisKKwlzd2l0Y2ggKHMtPmNpLm1vZGUpCisJeworCQljYXNlIENSWVBUT19NT0RFX0VD QjoKKwkJCWFlc19wYWRsb2NrX2VjYihzLT5kYXRhLnByaXYsIGRzdCwgc3JjLCBpdiwgc2l6ZSwg cy0+Y2kub3BlcmF0aW9uKTsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19NT0RFX0NCQzoKKwkJ CWFlc19wYWRsb2NrX2NiYyhzLT5kYXRhLnByaXYsIGRzdCwgc3JjLCBpdiwgc2l6ZSwgcy0+Y2ku b3BlcmF0aW9uKTsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19NT0RFX0NGQjoKKwkJCWFlc19w YWRsb2NrX2NmYihzLT5kYXRhLnByaXYsIGRzdCwgc3JjLCBpdiwgc2l6ZSwgcy0+Y2kub3BlcmF0 aW9uKTsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19NT0RFX09GQjoKKwkJCWFlc19wYWRsb2Nr X29mYihzLT5kYXRhLnByaXYsIGRzdCwgc3JjLCBpdiwgc2l6ZSwgcy0+Y2kub3BlcmF0aW9uKTsK KwkJCWJyZWFrOworCX0KKworCXMtPmRhdGEuc2dfZHN0Lmxlbmd0aCA9IHNpemU7CisKKwlyZXR1 cm47Cit9CisKK3N0YXRpYyB2b2lkIHBhZGxvY2tfZGF0YV9yZWFkeShzdHJ1Y3QgY3J5cHRvX2Rl dmljZSAqZGV2KQoreworCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcywgKm47CisKKwlpZiAocGFk bG9ja19kYXRhX3JlYWR5X3JlZW50cnkpCisJCXJldHVybjsKKworCXBhZGxvY2tfZGF0YV9yZWFk eV9yZWVudHJ5Kys7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG4sICZkZXYtPnNlc3Np b25fbGlzdCwgZGV2X3F1ZXVlX2VudHJ5KQorCXsKKwkJaWYgKCFzZXNzaW9uX2NvbXBsZXRlZChz KSkKKwkJeworCQkJc3RhcnRfcHJvY2Vzc19zZXNzaW9uKHMpOworCQkJcHJvY2Vzc19zZXNzaW9u KHMpOworCQkJY3J5cHRvX3N0YXRfY29tcGxldGVfaW5jKHMpOworCQkJY29tcGxldGVfc2Vzc2lv bihzKTsKKwkJCXN0b3BfcHJvY2Vzc19zZXNzaW9uKHMpOworCQl9CisJfQorCXBhZGxvY2tfZGF0 YV9yZWFkeV9yZWVudHJ5LS07Cit9CisKK2ludCBwYWRsb2NrX2luaXRfYWVzKHZvaWQpCit7CisJ dTMyIGNwdWlkLCBlZHg7CisJdTMyIHZhbCA9IDB4QzAwMDAwMDA7CisKKwljcHVpZCA9IGNwdWlk X2VheCh2YWwpOworCWVkeCA9IGNwdWlkX2VkeCh2YWwpOworCXByaW50aygidmFsPSV4LCBjcHVp ZD0leCwgZWR4PSV4LlxuIiwgdmFsLCBjcHVpZCwgZWR4KTsKKwlpZiAoY3B1aWQgPj0gdmFsICsg MSkKKwl7CisJCXByaW50aygiQm9hcmQgc3VwcG9ydHMgQUNFLlxuIik7CisJfQorCWVsc2UKKwl7 CisJCXByaW50aygiQm9hcmQgZG9lcyBub3Qgc3VwcG9ydCBBQ0UuXG4iKTsKKwkJcmV0dXJuIC1F Tk9ERVY7CisJfQorCQorCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgVklBIFBhZExvY2sgQUNF IGZvciBBRVMgYWxnb3JpdGhtIChtdWx0aWJsb2NrKS5cbiIpOworCisJcGFkbG9ja19kZXZpY2Uu Y2FwX251bWJlciA9IHBhZGxvY2tfY2FwX251bWJlcjsKKwkKKwlnZW5fdGFicygpOworCXJldHVy biBjcnlwdG9fZGV2aWNlX2FkZCgmcGFkbG9ja19kZXZpY2UpOworfQorCit2b2lkIHBhZGxvY2tf ZmluaV9hZXModm9pZCkKK3sKKwljcnlwdG9fZGV2aWNlX3JlbW92ZSgmcGFkbG9ja19kZXZpY2Up OworfQpkaWZmIC1OcnUgL3RtcC9lbXB0eS92aWEtcGFkbG9jay9wYWRsb2NrLWdlbmVyaWMuYyBs aW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL3ZpYS1wYWRsb2NrL3BhZGxvY2stZ2VuZXJpYy5jCi0t LSAvdG1wL2VtcHR5L3ZpYS1wYWRsb2NrL3BhZGxvY2stZ2VuZXJpYy5jCTE5NzAtMDEtMDEgMDM6 MDA6MDAuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL3ZpYS1w YWRsb2NrL3BhZGxvY2stZ2VuZXJpYy5jCTIwMDQtMTAtMzAgMDk6MDE6NTYuMDAwMDAwMDAwICsw NDAwCkBAIC0wLDAgKzEsMTk0IEBACisvKiAKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAq IFN1cHBvcnQgZm9yIFZJQSBQYWRMb2NrIGhhcmR3YXJlIGNyeXB0byBlbmdpbmUuCisgKgorICog TGludXggZGV2ZWxvcGVyczoKKyAqICBNaWNoYWwgTHVkdmlnIDxtbHVkdmlnQHN1c2UuY3o+Cisg KgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNp bmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJwYWRsb2NrLmgiCisjaW5jbHVk ZSAiLi4vYWNyeXB0by5oIgorI2luY2x1ZGUgIi4uL2NyeXB0b19kZWYuaCIKKworI2RlZmluZSBQ RlgJInBhZGxvY2s6ICIKKwordHlwZWRlZiB2b2lkICh4Y3J5cHRfdCkodTggKmlucHV0LCB1OCAq b3V0cHV0LCB1OCAqa2V5LCB1OCAqaXYsCisJCQl2b2lkICpjb250cm9sX3dvcmQsIHUzMiBjb3Vu dCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWRsb2NrX3hjcnlwdF9lY2IodTggKmlucHV0LCB1 OCAqb3V0cHV0LCB1OCAqa2V5LAorCQkJCSAgICAgIHU4ICppdiwgdm9pZCAqY29udHJvbF93b3Jk LCB1MzIgY291bnQpCit7CisJYXNtIHZvbGF0aWxlICgicHVzaGZsOyBwb3BmbCIpOwkJLyogZW5m b3JjZSBrZXkgcmVsb2FkLiAqLworCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4ZjMsMHgwZiwweGE3 LDB4YzgiCS8qIHJlcCB4Y3J5cHRlY2IgKi8KKwkJICAgICAgOiAiPW0iKCpvdXRwdXQpLCAiK1Mi KGlucHV0KSwgIitEIihvdXRwdXQpCisJCSAgICAgIDogImQiKGNvbnRyb2xfd29yZCksICJiIihr ZXkpLCAiYyIoY291bnQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBhZGxvY2tfeGNyeXB0 X2NiYyh1OCAqaW5wdXQsIHU4ICpvdXRwdXQsIHU4ICprZXksCisJCQkJICAgICAgdTggKml2LCB2 b2lkICpjb250cm9sX3dvcmQsIHUzMiBjb3VudCkKK3sKKwlhc20gdm9sYXRpbGUgKCJwdXNoZmw7 IHBvcGZsIik7CQkvKiBlbmZvcmNlIGtleSByZWxvYWQuICovCisJYXNtIHZvbGF0aWxlICgiLmJ5 dGUgMHhmMywweDBmLDB4YTcsMHhkMCIJLyogcmVwIHhjcnlwdGNiYyAqLworCQkgICAgICA6ICI9 bSIoKm91dHB1dCksICIrUyIoaW5wdXQpLCAiK0QiKG91dHB1dCkKKwkJICAgICAgOiAiZCIoY29u dHJvbF93b3JkKSwgImIiKGtleSksICJjIihjb3VudCksICJhIihpdikpOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgcGFkbG9ja194Y3J5cHRfY2ZiKHU4ICppbnB1dCwgdTggKm91dHB1dCwgdTgg KmtleSwKKwkJCQkgICAgICB1OCAqaXYsIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQor eworCWFzbSB2b2xhdGlsZSAoInB1c2hmbDsgcG9wZmwiKTsJCS8qIGVuZm9yY2Uga2V5IHJlbG9h ZC4gKi8KKwlhc20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGUwIgkvKiByZXAg eGNyeXB0Y2ZiICovCisJCSAgICAgIDogIj1tIigqb3V0cHV0KSwgIitTIihpbnB1dCksICIrRCIo b3V0cHV0KQorCQkgICAgICA6ICJkIihjb250cm9sX3dvcmQpLCAiYiIoa2V5KSwgImMiKGNvdW50 KSwgImEiKGl2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWRsb2NrX3hjcnlwdF9vZmIo dTggKmlucHV0LCB1OCAqb3V0cHV0LCB1OCAqa2V5LAorCQkJCSAgICAgIHU4ICppdiwgdm9pZCAq Y29udHJvbF93b3JkLCB1MzIgY291bnQpCit7CisJYXNtIHZvbGF0aWxlICgicHVzaGZsOyBwb3Bm bCIpOwkJLyogZW5mb3JjZSBrZXkgcmVsb2FkLiAqLworCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4 ZjMsMHgwZiwweGE3LDB4ZTgiCS8qIHJlcCB4Y3J5cHRvZmIgKi8KKwkJICAgICAgOiAiPW0iKCpv dXRwdXQpLCAiK1MiKGlucHV0KSwgIitEIihvdXRwdXQpCisJCSAgICAgIDogImQiKGNvbnRyb2xf d29yZCksICJiIihrZXkpLCAiYyIoY291bnQpLCAiYSIoaXYpKTsKK30KKwordm9pZCAqY3J5cHRv X2FsaWduZWRfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IG1vZGUsIHNpemVfdCBhbGlnbm1lbnQs IHZvaWQgKippbmRleCkKK3sKKyAgICAgICBjaGFyICpwdHI7CisKKyAgICAgICBwdHIgPSBrbWFs bG9jKHNpemUgKyBhbGlnbm1lbnQsIG1vZGUpOworICAgICAgICppbmRleCA9IHB0cjsKKyAgICAg ICBpZiAoYWxpZ25tZW50ID4gMSAmJiAoKGxvbmcpcHRyICYgKGFsaWdubWVudCAtIDEpKSkgewor ICAgICAgICAgICAgICAgcHRyICs9IGFsaWdubWVudCAtICgobG9uZylwdHIgJiAoYWxpZ25tZW50 IC0gMSkpOworICAgICAgIH0KKworICAgICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgcGFkbG9j a19hbGlnbmVyKHU4ICpvdXRfYXJnLCBjb25zdCB1OCAqaW5fYXJnLCBjb25zdCB1OCAqaXZfYXJn LAorCQkgICAgIHZvaWQgKmtleSwgdW5pb24gY3dvcmQgKmN3b3JkLAorCQkgICAgIHNpemVfdCBu Ynl0ZXMsIHNpemVfdCBibG9ja3NpemUsCisJCSAgICAgaW50IGVuY2RlYywgaW50IG1vZGUpCit7 CisJLyogRG9uJ3QgYmxpbmRseSBtb2RpZnkgdGhpcyBzdHJ1Y3R1cmUgLSB0aGUgaXRlbXMgbXVz dCAKKwkgICBmaXQgb24gMTYtQnl0ZXMgYm91bmRhcmllcyEgKi8KKwlzdHJ1Y3QgcGFkbG9ja194 Y3J5cHRfZGF0YSB7CisJCXU4IGl2W2Jsb2Nrc2l6ZV07CQkvKiBJbml0aWFsaXphdGlvbiB2ZWN0 b3IgKi8KKwl9OworCisJdTggKmluLCAqb3V0LCAqaXY7CisJdm9pZCAqaW5kZXggPSBOVUxMOwor CWNoYXIgYmlnYnVmW3NpemVvZihzdHJ1Y3QgcGFkbG9ja194Y3J5cHRfZGF0YSkgKyAxNl07CisJ c3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEgKmRhdGE7CisKKwkvKiBQbGFjZSAnZGF0YScgYXQg dGhlIGZpcnN0IDE2LUJ5dGVzIGFsaWduZWQgYWRkcmVzcyBpbiAnYmlnYnVmJy4gKi8KKwlpZiAo KChsb25nKWJpZ2J1ZikgJiAweDBGKQorCQlkYXRhID0gKHZvaWQqKShiaWdidWYgKyAxNiAtICgo bG9uZyliaWdidWYgJiAweDBGKSk7CisJZWxzZQorCQlkYXRhID0gKHZvaWQqKWJpZ2J1ZjsKKwor CWlmICgoKGxvbmcpaW5fYXJnKSAmIDB4MEYpIHsKKwkJaW4gPSBjcnlwdG9fYWxpZ25lZF9rbWFs bG9jKG5ieXRlcywgR0ZQX0tFUk5FTCwgMTYsICZpbmRleCk7CisJCW1lbWNweShpbiwgaW5fYXJn LCBuYnl0ZXMpOworCX0KKwllbHNlCisJCWluID0gKHU4Kilpbl9hcmc7CisJCisJaWYgKCgobG9u ZylvdXRfYXJnKSAmIDB4MEYpIHsKKwkJaWYgKGluZGV4KQorCQkJb3V0ID0gaW47ICAgICAgIC8q IHhjcnlwdCBjYW4gd29yayAiaW4gcGxhY2UiICovCisJCWVsc2UKKwkJCW91dCA9IGNyeXB0b19h bGlnbmVkX2ttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMLCAxNiwgJmluZGV4KTsKKwl9CisJZWxz ZQorCQlvdXQgPSBvdXRfYXJnOworCisJLyogQWx3YXlzIG1ha2UgYSBsb2NhbCBjb3B5IG9mIElW IC0geGNyeXB0IG1heSBjaGFuZ2UgaXQhICovCisJaXYgPSBkYXRhLT5pdjsKKwlpZiAoaXZfYXJn KQorCQltZW1jcHkoaXYsIGl2X2FyZywgYmxvY2tzaXplKTsKKwkKKworCWRwcmludGsoImRhdGE9 JXBcbiIsIGRhdGEpOworCWRwcmludGsoImluPSVwXG4iLCBpbik7CisJZHByaW50aygib3V0PSVw XG4iLCBvdXQpOworCWRwcmludGsoIml2PSVwXG4iLCBpdik7CisJZHByaW50aygibmJ5dGVzPSVk LCBibG9ja3NpemU9JWQuXG4iLCBuYnl0ZXMsIGJsb2Nrc2l6ZSk7CisKKwlzd2l0Y2ggKG1vZGUp IHsKKwkJY2FzZSBDUllQVE9fTU9ERV9FQ0I6CisJCQlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91 dCwga2V5LCBpdiwgY3dvcmQsIG5ieXRlcy9ibG9ja3NpemUpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBDUllQVE9fTU9ERV9DQkM6CisJCQlwYWRsb2NrX3hjcnlwdF9jYmMoaW4sIG91dCwga2V5LCBp diwgY3dvcmQsIG5ieXRlcy9ibG9ja3NpemUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDUllQVE9f TU9ERV9DRkI6CisJCQlwYWRsb2NrX3hjcnlwdF9jZmIoaW4sIG91dCwga2V5LCBpdiwgY3dvcmQs IG5ieXRlcy9ibG9ja3NpemUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDUllQVE9fTU9ERV9PRkI6 CisJCQlwYWRsb2NrX3hjcnlwdF9vZmIoaW4sIG91dCwga2V5LCBpdiwgY3dvcmQsIG5ieXRlcy9i bG9ja3NpemUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KKworCS8q IENvcHkgdGhlIDE2LUJ5dGUgYWxpZ25lZCBvdXRwdXQgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4g Ki8KKwlpZiAob3V0ICE9IG91dF9hcmcpCisJCW1lbWNweShvdXRfYXJnLCBvdXQsIG5ieXRlcyk7 CisKKwlpZiAoaW5kZXgpCisJCWtmcmVlKGluZGV4KTsKK30KKworc3RhdGljIGludCBfX2luaXQg cGFkbG9ja19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC1FTk9TWVM7CisjaWYgMAkKKwlpZiAo IWNwdV9oYXNfeGNyeXB0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlZJQSBQYWRMb2NrIG5v dCBkZXRlY3RlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWNwdV9oYXNf eGNyeXB0X2VuYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVklBIFBhZExvY2sgZGV0 ZWN0ZWQsIGJ1dCBub3QgZW5hYmxlZC4gSG1tLCBzdHJhbmdlLi4uXG4iKTsKKwkJcmV0dXJuIC1F Tk9ERVY7CisJfQorI2VuZGlmCisJaWYgKChyZXQgPSBwYWRsb2NrX2luaXRfYWVzKCkpKSB7CisJ CXByaW50ayhLRVJOX0VSUiBQRlggIlZJQSBQYWRMb2NrIEFFUyBpbml0aWFsaXphdGlvbiBmYWls ZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmV0ID09IC1FTk9TWVMpCisJCXBy aW50ayhLRVJOX0VSUiBQRlggIkhtbSwgVklBIFBhZExvY2sgd2FzIGNvbXBpbGVkIHdpdGhvdXQg YW55IGFsZ29yaXRobS5cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19l eGl0IHBhZGxvY2tfZmluaSh2b2lkKQoreworCXBhZGxvY2tfZmluaV9hZXMoKTsKK30KKworbW9k dWxlX2luaXQocGFkbG9ja19pbml0KTsKK21vZHVsZV9leGl0KHBhZGxvY2tfZmluaSk7CisKK01P RFVMRV9ERVNDUklQVElPTigiVklBIFBhZExvY2sgY3J5cHRvIGVuZ2luZSBzdXBwb3J0LiIpOwor TU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIEx1 ZHZpZyIpOwpkaWZmIC1OcnUgL3RtcC9lbXB0eS92aWEtcGFkbG9jay9wYWRsb2NrLmggbGludXgt Mi42L2RyaXZlcnMvYWNyeXB0by92aWEtcGFkbG9jay9wYWRsb2NrLmgKLS0tIC90bXAvZW1wdHkv dmlhLXBhZGxvY2svcGFkbG9jay5oCTE5NzAtMDEtMDEgMDM6MDA6MDAuMDAwMDAwMDAwICswMzAw CisrKyBsaW51eC0yLjYvZHJpdmVycy9hY3J5cHRvL3ZpYS1wYWRsb2NrL3BhZGxvY2suaAkyMDA0 LTEwLTMwIDA5OjAxOjU2LjAwMDAwMDAwMCArMDQwMApAQCAtMCwwICsxLDcxIEBACisvKgorICog Q3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhbCBMdWR2 aWcgPG1sdWR2aWdAc3VzZS5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhl IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq CisgKi8KKworI2lmbmRlZiBfQ1JZUFRPX1BBRExPQ0tfSAorI2RlZmluZSBfQ1JZUFRPX1BBRExP Q0tfSAorCisjZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYJLyogaW4gdTggdW5pdHMgKi8KKyNk ZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgkvKiBkaXR0byAqLworI2RlZmluZSBBRVNfQkxPQ0tf U0laRQkJMTYJLyogZGl0dG8gKi8KKyNkZWZpbmUgQUVTX0VYVEVOREVEX0tFWV9TSVpFCTY0CS8q IGluIHUzMiB1bml0cyAqLworI2RlZmluZSBBRVNfRVhURU5ERURfS0VZX1NJWkVfQgkoQUVTX0VY VEVOREVEX0tFWV9TSVpFICogc2l6ZW9mKHUzMikpCisKK3N0cnVjdCBhZXNfY3R4IHsKKwl1MzIg ZV9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRSs0XTsKKwl1MzIgZF9kYXRhW0FFU19FWFRFTkRF RF9LRVlfU0laRSs0XTsKKwlpbnQga2V5X2xlbmd0aDsKKwl1MzIgKkU7CisJdTMyICpEOworfTsK KworI2RlZmluZSBFX0tFWSBjdHgtPkUKKyNkZWZpbmUgRF9LRVkgY3R4LT5ECisKKworLyogQ29u dHJvbCB3b3JkLiAqLworI2lmIDEKK3VuaW9uIGN3b3JkIHsKKwl1MzIgY3dvcmRbNF07CisJc3Ry dWN0IHsKKwkJaW50IHJvdW5kczo0OworCQlpbnQgYWxnbzozOworCQlpbnQga2V5Z2VuOjE7CisJ CWludCBpbnRlcm06MTsKKwkJaW50IGVuY2RlYzoxOworCQlpbnQga3NpemU6MjsKKwl9IGI7Cit9 OworI2Vsc2UKK3VuaW9uIGN3b3JkIHsKKwl1MzIgY3dvcmRbNF07CisJc3RydWN0IHsKKwkJdW5z aWduZWQJcm91bmRzOjQsCisJCQkJYWxnbzozLAorCQkJCWtleWdlbjoxLAorCQkJCWludGVybTox LAorCQkJCWVuY2RlYzoxLAorCQkJCWtzaXplOjI7CisJfSBiOworfTsKKyNlbmRpZgorCisjZGVm aW5lIFBGWAkicGFkbG9jazogIgorCit2b2lkIHBhZGxvY2tfYWxpZ25lcih1OCAqb3V0X2FyZywg Y29uc3QgdTggKmluX2FyZywgY29uc3QgdTggKml2X2FyZywKKwkJICAgICB2b2lkICprZXksIHVu aW9uIGN3b3JkICpjd29yZCwKKwkJICAgICBzaXplX3QgbmJ5dGVzLCBzaXplX3QgYmxvY2tzaXpl LAorCQkgICAgIGludCBlbmNkZWMsIGludCBtb2RlKTsKKworaW50IHBhZGxvY2tfaW5pdF9hZXMo dm9pZCk7Cit2b2lkIHBhZGxvY2tfZmluaV9hZXModm9pZCk7CisKKyNlbmRpZgkvKiBfQ1JZUFRP X1BBRExPQ0tfSCAqLwotLS0gbGludXgtMi42L2RyaXZlcnMvS2NvbmZpZy5ub2NyeXB0bwkyMDA0 LTEwLTMwIDA5OjA1OjUyLjAwMDAwMDAwMCArMDQwMAorKysgbGludXgtMi42L2RyaXZlcnMvS2Nv bmZpZwkyMDA0LTExLTAyIDE4OjQ1OjM2LjAwMDAwMDAwMCArMDMwMApAQCAtNDYsMyArNDYsNSBA QAogCiBzb3VyY2UgImRyaXZlcnMvY29ubmVjdG9yL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVy cy9hY3J5cHRvL0tjb25maWciCisKLS0tIGxpbnV4LTIuNi9kcml2ZXJzL0tjb25maWcubm9jcnlw dG8JMjAwNC0xMS0wMiAxODo1MzoxMC4wMDAwMDAwMDAgKzAzMDAKKysrIGxpbnV4LTIuNi9kcml2 ZXJzL0tjb25maWcJMjAwNC0xMS0wMiAxODo1MzozNC4wMDAwMDAwMDAgKzAzMDAKQEAgLTQ2LDYg KzQ2LDggQEAKIAogc291cmNlICJkcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnIgogCitzb3VyY2Ug ImRyaXZlcnMvYWNyeXB0by9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9LY29uZmln IgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKLS0tIGxpbnV4LTIuNi9kcml2ZXJz L01ha2VmaWxlLm5vY3J5cHRvCTIwMDQtMTEtMDIgMTg6NTQ6MDUuMDAwMDAwMDAwICswMzAwCisr KyBsaW51eC0yLjYvZHJpdmVycy9NYWtlZmlsZQkyMDA0LTExLTAyIDE4OjU0OjE3LjAwMDAwMDAw MCArMDMwMApAQCAtNTEsNiArNTEsNyBAQAogb2JqLSQoQ09ORklHX0kyQykJCSs9IGkyYy8KIG9i ai0kKENPTkZJR19XMSkJCSs9IHcxLwogb2JqLSQoQ09ORklHX0NPTk5FQ1RPUikJCSs9IGNvbm5l Y3Rvci8KK29iai0kKENPTkZJR19DT05ORUNUT1IpCQkrPSBhY3J5cHRvLwogb2JqLSQoQ09ORklH X1BIT05FKQkJKz0gdGVsZXBob255Lwogb2JqLSQoQ09ORklHX01EKQkJKz0gbWQvCiBvYmotJChD T05GSUdfQlQpCQkrPSBibHVldG9vdGgvCg== --Multipart=_Tue__2_Nov_2004_19_12_35_+0300_L9m.J=UR4DueZh+G-- From yoshfuji@linux-ipv6.org Tue Nov 2 08:28:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 08:28:52 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2GSkJK008525 for ; Tue, 2 Nov 2004 08:28:46 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 21A1F33CE5; Wed, 3 Nov 2004 01:29:25 +0900 (JST) Date: Wed, 03 Nov 2004 01:29:23 +0900 (JST) Message-Id: <20041103.012923.102810732.yoshfuji@linux-ipv6.org> To: jgarzik@pobox.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, davem@davemloft.net, yoshfuji@linux-ipv6.org Subject: Re: IPv6 dead in -bk11 From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <4187A4E3.8010600@pobox.com> References: <418781EF.7020100@pobox.com> <20041102.225343.06193184.yoshfuji@linux-ipv6.org> <4187A4E3.8010600@pobox.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11350 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 404 Lines: 18 In article <4187A4E3.8010600@pobox.com> (at Tue, 02 Nov 2004 10:16:51 -0500), Jeff Garzik says: > > Please send me: > > % ifconfig -a > > % netstat -nr --inet6 : > Done, see attached. > > ipv6/working/* is 2.6.10-rc1-bk2, and ipv6/dead/* is 2.6.10-rc1-BK-current. Okay, thanks. So... I guess that kernel failed to add "default route" on receipt of RA. Right? Hmm.. --yoshfuji From jdmason@us.ibm.com Tue Nov 2 10:04:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 10:04:33 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2I4Icd012047 for ; Tue, 2 Nov 2004 10:04:18 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA2I3aJ8504168 for ; Tue, 2 Nov 2004 13:03:46 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA2I3PAY094190 for ; Tue, 2 Nov 2004 11:03:25 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3PGw018165 for ; Tue, 2 Nov 2004 11:03:25 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3PA3018159; Tue, 2 Nov 2004 11:03:25 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: [PATCH 3/3] r8169: clean up Date: Tue, 2 Nov 2004 12:03:25 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_tv8hBKxXyyw9TC0" Message-Id: <200411021203.25100.jdmason@us.ibm.com> X-archive-position: 11353 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3616 Lines: 112 --Boundary-00=_tv8hBKxXyyw9TC0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Removal of some magic numbers, unnecessary double not, and addition of "link down" notification. Signed-off-by: Jon Mason --- r8169.c 2004-11-02 10:37:31.035203120 -0600 +++ r8169.c.latest 2004-11-02 10:44:01.367863536 -0600 @@ -519,8 +519,10 @@ static void rtl8169_check_link_status(st if (tp->link_ok(ioaddr)) { netif_carrier_on(dev); printk(KERN_INFO PFX "%s: link up\n", dev->name); - } else + } else { netif_carrier_off(dev); + printk(KERN_INFO PFX "%s: link down\n", dev->name); + } spin_unlock_irqrestore(&tp->lock, flags); } @@ -773,7 +775,7 @@ static void rtl8169_gset_tbi(struct net_ status = RTL_R32(TBICSR); cmd->advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : 0; - cmd->autoneg = !!(status & TBINwEnable); + cmd->autoneg = status & TBINwEnable; cmd->speed = SPEED_1000; cmd->duplex = DUPLEX_FULL; /* Always set */ @@ -1639,7 +1641,7 @@ static int rtl8169_alloc_rx_skb(struct p if (!skb) goto err_out; - skb_reserve(skb, 2); + skb_reserve(skb, NET_IP_ALIGN); *sk_buff = skb; mapping = pci_map_single(pdev, skb->tail, rx_buf_sz, @@ -2071,9 +2073,9 @@ static inline int rtl8169_try_rx_copy(st if (pkt_size < rx_copybreak) { struct sk_buff *skb; - skb = dev_alloc_skb(pkt_size + 2); + skb = dev_alloc_skb(pkt_size + NET_IP_ALIGN); if (skb) { - skb_reserve(skb, 2); + skb_reserve(skb, NET_IP_ALIGN); eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0); *sk_buff = skb; rtl8169_return_to_asic(desc, rx_buf_sz); --Boundary-00=_tv8hBKxXyyw9TC0 Content-Type: text/x-diff; charset="us-ascii"; name="r8169-cleanup-3.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="r8169-cleanup-3.patch" --- r8169.c 2004-11-02 10:37:31.035203120 -0600 +++ r8169.c.latest 2004-11-02 10:44:01.367863536 -0600 @@ -519,8 +519,10 @@ static void rtl8169_check_link_status(st if (tp->link_ok(ioaddr)) { netif_carrier_on(dev); printk(KERN_INFO PFX "%s: link up\n", dev->name); - } else + } else { netif_carrier_off(dev); + printk(KERN_INFO PFX "%s: link down\n", dev->name); + } spin_unlock_irqrestore(&tp->lock, flags); } @@ -773,7 +775,7 @@ static void rtl8169_gset_tbi(struct net_ status = RTL_R32(TBICSR); cmd->advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : 0; - cmd->autoneg = !!(status & TBINwEnable); + cmd->autoneg = status & TBINwEnable; cmd->speed = SPEED_1000; cmd->duplex = DUPLEX_FULL; /* Always set */ @@ -1639,7 +1641,7 @@ static int rtl8169_alloc_rx_skb(struct p if (!skb) goto err_out; - skb_reserve(skb, 2); + skb_reserve(skb, NET_IP_ALIGN); *sk_buff = skb; mapping = pci_map_single(pdev, skb->tail, rx_buf_sz, @@ -2071,9 +2073,9 @@ static inline int rtl8169_try_rx_copy(st if (pkt_size < rx_copybreak) { struct sk_buff *skb; - skb = dev_alloc_skb(pkt_size + 2); + skb = dev_alloc_skb(pkt_size + NET_IP_ALIGN); if (skb) { - skb_reserve(skb, 2); + skb_reserve(skb, NET_IP_ALIGN); eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0); *sk_buff = skb; rtl8169_return_to_asic(desc, rx_buf_sz); --Boundary-00=_tv8hBKxXyyw9TC0-- From jdmason@us.ibm.com Tue Nov 2 10:04:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 10:04:31 -0800 (PST) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2I4BKM012028 for ; Tue, 2 Nov 2004 10:04:18 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA2I3S8m580050 for ; Tue, 2 Nov 2004 13:03:39 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA2I3IF9101258 for ; Tue, 2 Nov 2004 11:03:18 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3HxO017689 for ; Tue, 2 Nov 2004 11:03:17 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3HYp017655; Tue, 2 Nov 2004 11:03:17 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: [PATCH 1/3] r8169: non-NAPI netif_poll_disable removal Date: Tue, 2 Nov 2004 12:03:17 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_lv8hBxmERC1vq5H" Message-Id: <200411021203.17013.jdmason@us.ibm.com> X-archive-position: 11352 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3276 Lines: 98 --Boundary-00=_lv8hBxmERC1vq5H Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline rtl8169_close contains a call to netif_poll_disable. This call sets and spins on the __LINK_STATE_RX_SCHED bit, which isn't really a problem if this function is only called in close (as that bit is off with NAPI off). However, if the driver hits a transmit timeout (or any other call that references rtl8169_wait_for_quiescence), the the module will hang indefinitely during any subsequent call to netif_poll_disable or dev_close function call because this bit is now set. Since this function should not really be called with NAPI off, I chose to remove the calls if NAPI is not defined (See patch below). The patch is against the 2.6.10-rc1-mm2 version of the driver. I have verified that this fixes the problem on ppc64 and x86_64. Signed-off-by: Jon Mason --- r8169.c.orig 2004-11-02 10:21:31.305104272 -0600 +++ r8169.c 2004-11-02 10:25:56.849735352 -0600 @@ -85,10 +85,12 @@ VERSION 1.6LK <2004/04/14> #define rtl8169_rx_skb netif_receive_skb #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx #define rtl8169_rx_quota(count, quota) min(count, quota) +#define rtl8169_poll_disable(dev) netif_poll_disable(dev) #else #define rtl8169_rx_skb netif_rx #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb #define rtl8169_rx_quota(count, quota) count +#define rtl8169_poll_disable(dev) #endif /* media options */ @@ -1745,7 +1747,7 @@ static void rtl8169_wait_for_quiescence( synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ - netif_poll_disable(dev); + rtl8169_poll_disable(dev); } static void rtl8169_reinit_task(void *_data) @@ -2284,7 +2286,7 @@ rtl8169_close(struct net_device *dev) free_irq(dev->irq, dev); - netif_poll_disable(dev); + rtl8169_poll_disable(dev); rtl8169_tx_clear(tp); --Boundary-00=_lv8hBxmERC1vq5H Content-Type: text/x-diff; charset="us-ascii"; name="r8169-close-1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="r8169-close-1.patch" --- r8169.c.orig 2004-11-02 10:21:31.305104272 -0600 +++ r8169.c 2004-11-02 10:25:56.849735352 -0600 @@ -85,10 +85,12 @@ VERSION 1.6LK <2004/04/14> #define rtl8169_rx_skb netif_receive_skb #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx #define rtl8169_rx_quota(count, quota) min(count, quota) +#define rtl8169_poll_disable(dev) netif_poll_disable(dev) #else #define rtl8169_rx_skb netif_rx #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb #define rtl8169_rx_quota(count, quota) count +#define rtl8169_poll_disable(dev) #endif /* media options */ @@ -1745,7 +1747,7 @@ static void rtl8169_wait_for_quiescence( synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ - netif_poll_disable(dev); + rtl8169_poll_disable(dev); } static void rtl8169_reinit_task(void *_data) @@ -2284,7 +2286,7 @@ rtl8169_close(struct net_device *dev) free_irq(dev->irq, dev); - netif_poll_disable(dev); + rtl8169_poll_disable(dev); rtl8169_tx_clear(tp); --Boundary-00=_lv8hBxmERC1vq5H-- From jdmason@us.ibm.com Tue Nov 2 10:04:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 10:04:31 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2I4FOs012043 for ; Tue, 2 Nov 2004 10:04:18 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA2I3XAd706628 for ; Tue, 2 Nov 2004 13:03:43 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA2I3MAY113876 for ; Tue, 2 Nov 2004 11:03:22 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3MZD018016 for ; Tue, 2 Nov 2004 11:03:22 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2I3M88017984; Tue, 2 Nov 2004 11:03:22 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: [PATCH 2/3] r8169: Large Send enablement Date: Tue, 2 Nov 2004 12:03:21 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_qv8hBO1M2IDuHYd" Message-Id: <200411021203.22003.jdmason@us.ibm.com> X-archive-position: 11351 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 6594 Lines: 189 --Boundary-00=_qv8hBO1M2IDuHYd Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline This patch enables driver support of MTUs greater than 1500. Though the adapter documentation says that maximum MTU is 16k, the largest packet I could send was 7440. So, I am setting that as the max mtu until I can figure out why the adapter misbehaves with packets larger than 7440. I have tested this code on ppc64 and x86_64. Signed-off-by: Jon Mason --- r8169-post-patch1.c 2004-11-02 10:37:18.190155864 -0600 +++ r8169.c 2004-11-02 10:37:31.035203120 -0600 @@ -114,14 +114,13 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */ +#define RxPacketMaxSize 0x3FE8 /* Maximum size supported is 16K-(1+Header+CRC+VLAN ) */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 #define R8169_NAPI_WEIGHT 64 #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */ #define NUM_RX_DESC 256 /* Number of Rx descriptor registers */ -#define RX_BUF_SIZE 1536 /* Rx Buffer size */ #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) @@ -427,6 +426,8 @@ static void rtl8169_tx_timeout(struct ne static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); +static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu); + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget); #endif @@ -1239,7 +1240,7 @@ rtl8169_init_board(struct pci_dev *pdev, } tp->chipset = i; - tp->rx_buf_sz = RX_BUF_SIZE; + tp->rx_buf_sz = dev->mtu + ETH_HLEN + 8; *ioaddr_out = ioaddr; *dev_out = dev; @@ -1322,6 +1323,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr; + dev->change_mtu = rtl8169_change_mtu; #ifdef CONFIG_R8169_NAPI dev->poll = rtl8169_poll; @@ -1536,8 +1538,8 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(EarlyTxThres, EarlyTxThld); - // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + // For gigabit rtl8169, MTU + header + CRC + VLAN + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1578,6 +1580,24 @@ rtl8169_hw_start(struct net_device *dev) netif_start_queue(dev); } +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + + if (new_mtu < ETH_ZLEN || new_mtu > 7400) + return -EINVAL; + + if (netif_running(dev)) + rtl8169_close(dev); + + dev->mtu = new_mtu; + tp->rx_buf_sz = new_mtu + ETH_HLEN + 8; + + rtl8169_open(dev); + + return 0; +} + static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { desc->addr = 0x0badbadbadbadbadull; --Boundary-00=_qv8hBO1M2IDuHYd Content-Type: text/x-diff; charset="us-ascii"; name="r8169-large-send-2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="r8169-large-send-2.patch" --- r8169-post-patch1.c 2004-11-02 10:37:18.190155864 -0600 +++ r8169.c 2004-11-02 10:37:31.035203120 -0600 @@ -114,14 +114,13 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */ +#define RxPacketMaxSize 0x3FE8 /* Maximum size supported is 16K-(1+Header+CRC+VLAN ) */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 #define R8169_NAPI_WEIGHT 64 #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */ #define NUM_RX_DESC 256 /* Number of Rx descriptor registers */ -#define RX_BUF_SIZE 1536 /* Rx Buffer size */ #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) @@ -427,6 +426,8 @@ static void rtl8169_tx_timeout(struct ne static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); +static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu); + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget); #endif @@ -1239,7 +1240,7 @@ rtl8169_init_board(struct pci_dev *pdev, } tp->chipset = i; - tp->rx_buf_sz = RX_BUF_SIZE; + tp->rx_buf_sz = dev->mtu + ETH_HLEN + 8; *ioaddr_out = ioaddr; *dev_out = dev; @@ -1322,6 +1323,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr; + dev->change_mtu = rtl8169_change_mtu; #ifdef CONFIG_R8169_NAPI dev->poll = rtl8169_poll; @@ -1536,8 +1538,8 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(EarlyTxThres, EarlyTxThld); - // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + // For gigabit rtl8169, MTU + header + CRC + VLAN + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1578,6 +1580,24 @@ rtl8169_hw_start(struct net_device *dev) netif_start_queue(dev); } +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + + if (new_mtu < ETH_ZLEN || new_mtu > 7400) + return -EINVAL; + + if (netif_running(dev)) + rtl8169_close(dev); + + dev->mtu = new_mtu; + tp->rx_buf_sz = new_mtu + ETH_HLEN + 8; + + rtl8169_open(dev); + + return 0; +} + static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { desc->addr = 0x0badbadbadbadbadull; --Boundary-00=_qv8hBO1M2IDuHYd-- From mdomsch@lists.us.dell.com Tue Nov 2 11:07:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:07:51 -0800 (PST) Received: from lists.us.dell.com (lists.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2J7jFD015509 for ; Tue, 2 Nov 2004 11:07:45 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.10/8.12.10/Dell.IT.3.31.03) with ESMTP id iA2J7OMU014449; Tue, 2 Nov 2004 13:07:24 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.10/8.12.10/Submit) id iA2J7OuU014447; Tue, 2 Nov 2004 13:07:24 -0600 Date: Tue, 2 Nov 2004 13:07:24 -0600 From: Matt Domsch To: netdev@oss.sgi.com, linux.nics@intel.com, jgarzik@pobox.com Subject: [PATCH 2.6] e100, e1000, ixgb: add MODULE_VERSION tags Message-ID: <20041102190724.GA6962@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11354 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 2465 Lines: 66 Patch below adds MODULE_VERSION tags to the e100, e1000, and ixgb drivers. Tools like DKMS will make use of this information to determine if a given driver is older or newer than another given driver based on this version number. Signed-off-by: Matt Domsch -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com ===== drivers/net/e100.c 1.30 vs edited ===== --- 1.30/drivers/net/e100.c 2004-10-25 02:27:41 -05:00 +++ edited/drivers/net/e100.c 2004-11-02 12:49:44 -06:00 @@ -166,6 +166,7 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_COPYRIGHT); MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); static int debug = 3; module_param(debug, int, 0); ===== drivers/net/e1000/e1000_main.c 1.137 vs edited ===== --- 1.137/drivers/net/e1000/e1000_main.c 2004-10-25 22:41:15 -05:00 +++ edited/drivers/net/e1000/e1000_main.c 2004-11-02 12:55:04 -06:00 @@ -48,7 +48,8 @@ #else #define DRIVERNAPI "-NAPI" #endif -char e1000_driver_version[] = "5.5.4-k2"DRIVERNAPI; +#define DRV_VERSION "5.5.4-k2"DRIVERNAPI +char e1000_driver_version[] = DRV_VERSION; char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation."; /* e1000_pci_tbl - PCI Device ID Table @@ -196,6 +197,7 @@ MODULE_AUTHOR("Intel Corporation, "); MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver"); MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; module_param(debug, int, 0); ===== drivers/net/ixgb/ixgb_main.c 1.18 vs edited ===== --- 1.18/drivers/net/ixgb/ixgb_main.c 2004-10-25 20:04:30 -05:00 +++ edited/drivers/net/ixgb/ixgb_main.c 2004-11-02 12:56:03 -06:00 @@ -30,7 +30,8 @@ char ixgb_driver_name[] = "ixgb"; char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver"; -char ixgb_driver_version[] = "1.0.66-k2"; +#define DRV_VERSION "1.0.66-k2" +char ixgb_driver_version[] = DRV_VERSION; char ixgb_copyright[] = "Copyright (c) 2001-2004 Intel Corporation."; /* ixgb_pci_tbl - PCI Device ID Table @@ -138,6 +139,7 @@ MODULE_AUTHOR("Intel Corporation, "); MODULE_DESCRIPTION("Intel(R) PRO/10GbE Network Driver"); MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); /* some defines for controlling descriptor fetches in h/w */ #define RXDCTL_PTHRESH_DEFAULT 128 /* chip considers prefech below this */ From romieu@fr.zoreil.com Tue Nov 2 11:11:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:11:40 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2JBY7K015877 for ; Tue, 2 Nov 2004 11:11:35 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA2JBDvr025379; Tue, 2 Nov 2004 20:11:13 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA2JB3qF025378; Tue, 2 Nov 2004 20:11:03 +0100 Date: Tue, 2 Nov 2004 20:11:03 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 2/3] r8169: Large Send enablement Message-ID: <20041102191103.GA24860@electric-eye.fr.zoreil.com> References: <200411021203.22003.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411021203.22003.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11355 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 4893 Lines: 179 Jon Mason : [...] > @@ -1578,6 +1580,24 @@ rtl8169_hw_start(struct net_device *dev) > netif_start_queue(dev); > } > > +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) > +{ > + struct rtl8169_private *tp = netdev_priv(dev); > + > + if (new_mtu < ETH_ZLEN || new_mtu > 7400) > + return -EINVAL; > + > + if (netif_running(dev)) > + rtl8169_close(dev); > + > + dev->mtu = new_mtu; > + tp->rx_buf_sz = new_mtu + ETH_HLEN + 8; > + > + rtl8169_open(dev); > + > + return 0; > +} > + Ok. Powow: - rtl8169_close() is not protected as if it was issued during dev->close. It races with the irq handler. - I see no reason why the state of the device should change if the device was not up. Use the tool of your choice to correct me if I am wrong. - If rtl8169_open() fails [*] when the device was previously up, the driver could/should try to recover. Untested example below to clarify. [*] page allocation failure, bigger mtu/rx buffers -> I feel moderately confortable. diff -puN drivers/net/r8169.c~r8169-240 drivers/net/r8169.c --- linux-2.6.9/drivers/net/r8169.c~r8169-240 2004-10-21 21:55:45.000000000 +0200 +++ linux-2.6.9-fr/drivers/net/r8169.c 2004-11-01 23:10:25.000000000 +0100 @@ -120,6 +120,8 @@ static int multicast_filter_limit = 32; #define RX_BUF_SIZE 1536 /* Rx Buffer size */ #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) +#define R8169_MIN_MTU 8 +#define R8169_MAX_MTU ((2 << 14) - 1) #define RTL8169_TX_TIMEOUT (6*HZ) #define RTL8169_PHY_TIMEOUT (10*HZ) @@ -412,6 +414,7 @@ MODULE_PARM_DESC(use_dac, "Enable PCI DA MODULE_LICENSE("GPL"); static int rtl8169_open(struct net_device *dev); +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev); static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs); @@ -1314,6 +1317,7 @@ rtl8169_init_one(struct pci_dev *pdev, c SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops); dev->stop = rtl8169_close; dev->tx_timeout = rtl8169_tx_timeout; + dev->change_mtu = rtl8169_change_mtu; dev->set_multicast_list = rtl8169_set_rx_mode; dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; @@ -1533,7 +1537,7 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(EarlyTxThres, EarlyTxThld); // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1738,6 +1742,26 @@ static void rtl8169_schedule_work(struct schedule_delayed_work(&tp->task, 4); } +static void __rtl8169_kick(struct net_device *dev) +{ + rtl8169_hw_start(dev); + netif_poll_enable(dev); + netif_wake_queue(dev); + set_bit(__LINK_STATE_START, &dev->state); +} + +static void rtl8169_refill_task(void *_data) +{ + struct net_device *dev = _data; + int err; + + err = rtl8169_init_ring(dev); + if (err < 0) + rtl8169_schedule_work(dev, rtl8169_refill_task); + else if (netif_queue_stopped(dev)) + __rtl8169_kick(dev); +} + static void rtl8169_wait_for_quiescence(struct net_device *dev) { synchronize_irq(dev->irq); @@ -2223,6 +2247,72 @@ out: return IRQ_RETVAL(handled); } +static int rtl8169_set_rxbufsize(struct rtl8169_private *tp, int mtu) +{ + if (mtu < R8169_MIN_MTU || mtu > R8169_MAX_MTU) + return -EINVAL; + + tp->rx_buf_sz = mtu; + if (mtu > ETH_DATA_LEN) { + /* MTU + ethernet header + FCS + optional VLAN tag */ + tp->rx_buf_sz += ETH_HLEN + 8; + } + return 0; +} + + +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + struct TxDesc *txd = tp->TxDescArray; + void *ioaddr = tp->mmio_addr; + int ret, i; + + ret = rtl8169_set_rxbufsize(tp, new_mtu); + if (ret < 0) + goto out; + + if (!netif_running(dev)) + goto out; + + printk(KERN_DEBUG "%s: Tx/Rx activity going down!\n", dev->name); + RTL_W8(ChipCmd, 0x00); + RTL_R8(ChipCmd); + + flush_scheduled_work(); + + netif_poll_disable(dev); + + RTL_W16(IntrMask, 0x0000); + RTL_R16(IntrMask); + + /* A bit incestuous */ + clear_bit(__LINK_STATE_START, &dev->state); + + synchronize_irq(dev->irq); + + netif_stop_queue(dev); + + /* + * At this point we do not bother with the irq/napi handlers + * any more. Tx thread may lurk. + */ + for (i = 0; i < NUM_TX_DESC; i++, txd++) + txd->opts1 = le32_to_cpu(DescOwn); + + /* Give a racing hard_start_xmit a few cycles to complete. */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + + rtl8169_rx_clear(tp); + rtl8169_tx_clear(tp); + + rtl8169_refill_task(dev); + +out: + return ret; +} + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget) { _ From romieu@fr.zoreil.com Tue Nov 2 11:31:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:31:45 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2JVY20018144 for ; Tue, 2 Nov 2004 11:31:35 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA2JRsvr025768; Tue, 2 Nov 2004 20:27:54 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA2JRkte025766; Tue, 2 Nov 2004 20:27:46 +0100 Date: Tue, 2 Nov 2004 20:27:46 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 3/3] r8169: clean up Message-ID: <20041102192746.GB24860@electric-eye.fr.zoreil.com> References: <200411021203.25100.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411021203.25100.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11356 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 743 Lines: 23 Jon Mason : > Removal of some magic numbers, unnecessary double not, and addition of "link > down" notification. > > Signed-off-by: Jon Mason > > --- r8169.c 2004-11-02 10:37:31.035203120 -0600 > +++ r8169.c.latest 2004-11-02 10:44:01.367863536 -0600 [...] > @@ -773,7 +775,7 @@ static void rtl8169_gset_tbi(struct net_ > > status = RTL_R32(TBICSR); > cmd->advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : 0; > - cmd->autoneg = !!(status & TBINwEnable); > + cmd->autoneg = status & TBINwEnable; > > cmd->speed = SPEED_1000; > cmd->duplex = DUPLEX_FULL; /* Always set */ drivers/net/*.c use 0/1 or AUTONEG_{EN/DIS}ABLE. -- Ueimor From anil.gunturu@gmail.com Tue Nov 2 11:47:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:47:11 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.193]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2Jl6rZ019185 for ; Tue, 2 Nov 2004 11:47:07 -0800 Received: by rproxy.gmail.com with SMTP id 77so329239rnk for ; Tue, 02 Nov 2004 11:46:46 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:mime-version:content-type:content-transfer-encoding; b=RoCLPVYqnxnts+fAqCxRJsMwHXJPqOPVt4xj/l8QeT0ptYo8NBeD1gAhgXVkJoxvErelsNSlVFY/YZOjk1k4cBGhyX8KPN8g143fvrEF4Y3trGDj0gmbK6K30CRtvdcdBz+tyVi0v3Jz7xe0Kn7SfZUKuHVgij+li5shAhh8yUo= Received: by 10.39.2.52 with SMTP id e52mr647527rni; Tue, 02 Nov 2004 11:46:46 -0800 (PST) Received: by 10.39.2.38 with HTTP; Tue, 2 Nov 2004 11:46:46 -0800 (PST) Message-ID: <2f61ba570411021146657f63f4@mail.gmail.com> Date: Tue, 2 Nov 2004 11:46:46 -0800 From: Anil Gunturu Reply-To: Anil Gunturu To: netdev@oss.sgi.com Subject: NETLINK_ROUTE sockets in kernel Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11357 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anil.gunturu@gmail.com Precedence: bulk X-list: netdev Content-Length: 449 Lines: 10 Hi, I am trying to undestand the NETLINK_ROUTE protocol sockets on 2.4.18 kernel. Specifically, I am interested in knowing how the kernel processes the netlink messages that it recieves from user space. I was browsing the rtnetlink_rcv_msg (net/core/rtnetlink.c) function in the kernel. But its not clear on how the rtnetlink_links array is populated for PF_NETLINK family. rtnetlink_init seem to populate for PF_PACKET and PF_UNSPEC. Thanks, -Anil From jdmason@us.ibm.com Tue Nov 2 11:48:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:48:49 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2JmYcr019520 for ; Tue, 2 Nov 2004 11:48:34 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA2JlpAd483956 for ; Tue, 2 Nov 2004 14:48:02 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA2JlfF9044180 for ; Tue, 2 Nov 2004 12:47:41 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2Jle6W010048 for ; Tue, 2 Nov 2004 12:47:41 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA2Jle2j010012; Tue, 2 Nov 2004 12:47:40 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: Re: [PATCH 3/3] r8169: clean up Date: Tue, 2 Nov 2004 13:47:39 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com, jgarzik@pobox.com References: <200411021203.25100.jdmason@us.ibm.com> <20041102192746.GB24860@electric-eye.fr.zoreil.com> In-Reply-To: <20041102192746.GB24860@electric-eye.fr.zoreil.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411021347.39047.jdmason@us.ibm.com> X-archive-position: 11358 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 1125 Lines: 34 On Tuesday 02 November 2004 01:27 pm, Francois Romieu wrote: > Jon Mason : > > Removal of some magic numbers, unnecessary double not, and addition of > > "link down" notification. > > > > Signed-off-by: Jon Mason > > > > --- r8169.c 2004-11-02 10:37:31.035203120 -0600 > > +++ r8169.c.latest 2004-11-02 10:44:01.367863536 -0600 > > [...] > > > @@ -773,7 +775,7 @@ static void rtl8169_gset_tbi(struct net_ > > > > status = RTL_R32(TBICSR); > > cmd->advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : > > 0; - cmd->autoneg = !!(status & TBINwEnable); > > + cmd->autoneg = status & TBINwEnable; > > > > cmd->speed = SPEED_1000; > > cmd->duplex = DUPLEX_FULL; /* Always set */ > > drivers/net/*.c use 0/1 or AUTONEG_{EN/DIS}ABLE. Silly question, does "!!" not execute a bitwise not twice? If not, then please forgive my ignorance. If so, then it is unnecessary. But if you want something prettier, how about: cmd->autoneg = (status & TBINwEnable) ? AUTONEG_ENABLE : AUTONEG_DISABLE; -- Jon Mason jdmason@us.ibm.com From jgarzik@pobox.com Tue Nov 2 11:51:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:51:35 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2JpTZ6019889 for ; Tue, 2 Nov 2004 11:51:30 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CP4gR-0008Di-Km; Tue, 02 Nov 2004 19:51:11 +0000 Message-ID: <4187E523.4090402@pobox.com> Date: Tue, 02 Nov 2004 14:50:59 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jon Mason CC: Francois Romieu , netdev@oss.sgi.com Subject: Re: [PATCH 2/3] r8169: Large Send enablement References: <200411021203.22003.jdmason@us.ibm.com> In-Reply-To: <200411021203.22003.jdmason@us.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11359 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 361 Lines: 9 Jon Mason wrote: > This patch enables driver support of MTUs greater than 1500. Though the > adapter documentation says that maximum MTU is 16k, the largest packet I > could send was 7440. So, I am setting that as the max mtu until I can figure > out why the adapter misbehaves with packets larger than 7440. this is dependent on hardware FIFO sizes... From tgr@reeler.org Tue Nov 2 11:55:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 11:55:40 -0800 (PST) Received: from rei.rakuen (217-162-107-144.dclient.hispeed.ch [217.162.107.144]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2JtYLn020311 for ; Tue, 2 Nov 2004 11:55:35 -0800 Received: from tgr by rei.rakuen with local (Exim 4.34) id 1CP4kB-0000Js-C4; Tue, 02 Nov 2004 20:55:03 +0100 Date: Tue, 2 Nov 2004 20:55:03 +0100 From: Thomas Graf To: Jon Mason Cc: Francois Romieu , netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 3/3] r8169: clean up Message-ID: <20041102195503.GM19714@rei.reeler.org> References: <200411021203.25100.jdmason@us.ibm.com> <20041102192746.GB24860@electric-eye.fr.zoreil.com> <200411021347.39047.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411021347.39047.jdmason@us.ibm.com> X-archive-position: 11360 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 345 Lines: 7 > > > 0; - cmd->autoneg = !!(status & TBINwEnable); > > > + cmd->autoneg = status & TBINwEnable; > Silly question, does "!!" not execute a bitwise not twice? If not, then > please forgive my ignorance. Yes but the result is not the same, the result will be either 1 or 0 if done with !! and yours will result in TBINwEnable or 0. From linville@ra.tuxdriver.com Tue Nov 2 12:07:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 12:07:32 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2K7QDW020963 for ; Tue, 2 Nov 2004 12:07:26 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iA2K6e319827; Tue, 2 Nov 2004 15:06:40 -0500 Date: Tue, 2 Nov 2004 15:06:39 -0500 From: "John W. Linville" To: Matt Domsch Cc: netdev@oss.sgi.com, linux.nics@intel.com, jgarzik@pobox.com Subject: Re: [PATCH 2.6] e100, e1000, ixgb: add MODULE_VERSION tags Message-ID: <20041102150639.A19501@tuxdriver.com> Mail-Followup-To: Matt Domsch , netdev@oss.sgi.com, linux.nics@intel.com, jgarzik@pobox.com References: <20041102190724.GA6962@lists.us.dell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20041102190724.GA6962@lists.us.dell.com>; from Matt_Domsch@dell.com on Tue, Nov 02, 2004 at 01:07:24PM -0600 X-archive-position: 11361 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Content-Length: 437 Lines: 12 On Tue, Nov 02, 2004 at 01:07:24PM -0600, Matt Domsch wrote: > Patch below adds MODULE_VERSION tags to the e100, e1000, and ixgb > drivers. Tools like DKMS will make use of this information to I had recently posted patches to this effect for e100, e1000 (nearly identical to yours) and several others. I did not, however, include ixgb, so I'm sure that one will be quite welcome! :-) John -- John W. Linville linville@tuxdriver.com From herbert@gondor.apana.org.au Tue Nov 2 12:37:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 12:38:07 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2Kbvwl024911 for ; Tue, 2 Nov 2004 12:37:58 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP5PE-0006vC-00; Wed, 03 Nov 2004 07:37:28 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP5P6-00039s-00; Wed, 03 Nov 2004 07:37:20 +1100 Date: Wed, 3 Nov 2004 07:37:20 +1100 To: jamal Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041102203720.GA12108@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1099404823.1021.15.camel@jzny.localdomain> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11362 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 950 Lines: 28 On Tue, Nov 02, 2004 at 09:13:43AM -0500, jamal wrote: > > Is this still the same logic: > > ------------- > - if (!neigh_forced_gc(tbl) && > - tbl->entries > tbl->gc_thresh3) > - goto out; > + neigh_forced_gc(tbl); > + if (atomic_read(&tbl->entries) > tbl->gc_thresh3) > + goto out_entries; > > ------- > > In previous code it seems you should short-circuit if > neigh_forced_gc(tbl) returns non-zero. why do you have to break that > if statement? The previous logic is slightly incorrect in that even if neigh_forced_gc succeeded in removing some entries, the total number of entries may still be above the threshold 3. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From jesse.brandeburg@intel.com Tue Nov 2 12:45:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 12:45:45 -0800 (PST) Received: from orsfmr001.jf.intel.com (fmr12.intel.com [134.134.136.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2KjcGp025339 for ; Tue, 2 Nov 2004 12:45:39 -0800 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by orsfmr001.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iA2KjxmU003124; Tue, 2 Nov 2004 20:45:59 GMT Received: from nwlxmail01.jf.intel.com (nwlxmail01.jf.intel.com [10.7.171.40]) by talaria.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with ESMTP id iA2Kc55o024830; Tue, 2 Nov 2004 20:38:06 GMT Received: from isotope.jf.intel.com (isotope.jf.intel.com [10.23.51.23]) by nwlxmail01.jf.intel.com (8.12.10/8.12.9/MailSET/Hub) with ESMTP id iA2Kj7gP031949; Tue, 2 Nov 2004 12:45:07 -0800 Date: Tue, 2 Nov 2004 12:45:07 -0800 (PST) From: Jesse Brandeburg X-X-Sender: jbrandeb@isotope.jf.intel.com To: jgarzik@intel.com, cc: netdev@oss.sgi.com Subject: [PATCH 2.6] ixgb: fix ixgb_intr looping checks Message-ID: ReplyTo: "Jesse Brandeburg" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 11363 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jesse.brandeburg@intel.com Precedence: bulk X-list: netdev Content-Length: 2040 Lines: 51 Hey Jeff, we have a little problem with a patch that got accepted into -mm and is now in netdev, but never got copied to netdev mailing list. This thread: http://marc.theaimsgroup.com/?t=109149508900004&r=1&w=2 the last comment is entirely correct, we need to update the comment. this patch reverts the patch to ixgb that akpm added to do two for loops, as we actually did intend to do the boolean '&' check, and both the functions *should* be called every time through the loop. Here is a patch that we would like applied, it undoes the change we don't like, it was checked to apply cleanly against the netdev-2.6 tree this morning, and reviewed by the team. It also keeps the 10Gig (ixgb) driver consistent with our 1gig (e1000) code. This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg --- netdev-2.6/drivers/net/ixgb/ixgb_main.c 2004-10-15 10:39:56.000000000 -0700 +++ netdev-2.6/drivers/net/ixgb/ixgb_main.c.new 2004-10-15 11:09:42.000000000 -0700 @@ -1613,13 +1613,14 @@ static irqreturn_t ixgb_intr(int irq, vo __netif_rx_schedule(netdev); } #else - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_rx_irq(adapter) == FALSE) - break; - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_tx_irq(adapter) == FALSE) + /* yes, that is actually a & and it is meant to make sure that + * every pass through this for loop checks both receive and + * transmit queues for completed descriptors, intended to + * avoid starvation issues and assist tx/rx fairness. */ + for(i = 0; i < IXGB_MAX_INTR; i++) + if(!ixgb_clean_rx_irq(adapter) & + !ixgb_clean_tx_irq(adapter)) break; - /* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to * set IMS:RXDMT0 to 1 to restart the RBD timer (POLL) */ From jesse.brandeburg@intel.com Tue Nov 2 12:51:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 12:51:06 -0800 (PST) Received: from hermes.jf.intel.com (fmr05.intel.com [134.134.136.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2Kovqb025708 for ; Tue, 2 Nov 2004 12:51:02 -0800 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by hermes.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iA2KsdUf008611; Tue, 2 Nov 2004 20:54:39 GMT Received: from nwlxmail01.jf.intel.com (nwlxmail01.jf.intel.com [10.7.171.40]) by talaria.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with ESMTP id iA2KhP5o027826; Tue, 2 Nov 2004 20:43:25 GMT Received: from isotope.jf.intel.com (isotope.jf.intel.com [10.23.51.23]) by nwlxmail01.jf.intel.com (8.12.10/8.12.9/MailSET/Hub) with ESMTP id iA2KoRgP032285; Tue, 2 Nov 2004 12:50:27 -0800 Date: Tue, 2 Nov 2004 12:50:27 -0800 (PST) From: Jesse Brandeburg X-X-Sender: jbrandeb@isotope.jf.intel.com To: Jesse Brandeburg cc: jgarzik@pobox.com, , Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks In-Reply-To: Message-ID: ReplyTo: "Jesse Brandeburg" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=ISO-8859-1 Content-Transfer-Encoding: 8BIT X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 11364 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jesse.brandeburg@intel.com Precedence: bulk X-list: netdev Content-Length: 2294 Lines: 61 whoops! including jeff this time... On Tue, 2 Nov 2004, Jesse Brandeburg wrote: Hey Jeff, we have a little problem with a patch that got accepted into -mm and is now in netdev, but never got copied to netdev mailing list. This thread: http://marc.theaimsgroup.com/?t=109149508900004&r=1&w=2 the last comment is entirely correct, we need to update the comment. this patch reverts the patch to ixgb that akpm added to do two for loops, as we actually did intend to do the boolean '&' check, and both the functions *should* be called every time through the loop. Here is a patch that we would like applied, it undoes the change we don't like, it was checked to apply cleanly against the netdev-2.6 tree this morning, and reviewed by the team. It also keeps the 10Gig (ixgb) driver consistent with our 1gig (e1000) code. This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg --- netdev-2.6/drivers/net/ixgb/ixgb_main.c 2004-10-15 10:39:56.000000000 -0700 +++ netdev-2.6/drivers/net/ixgb/ixgb_main.c.new 2004-10-15 11:09:42.000000000 -0700 @@ -1613,13 +1613,14 @@ static irqreturn_t ixgb_intr(int irq, vo __netif_rx_schedule(netdev); } #else - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_rx_irq(adapter) == FALSE) - break; - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_tx_irq(adapter) == FALSE) + /* yes, that is actually a & and it is meant to make sure that + * every pass through this for loop checks both receive and + * transmit queues for completed descriptors, intended to + * avoid starvation issues and assist tx/rx fairness. */ + for(i = 0; i < IXGB_MAX_INTR; i++) + if(!ixgb_clean_rx_irq(adapter) & + !ixgb_clean_tx_irq(adapter)) break; - /* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to * set IMS:RXDMT0 to 1 to restart the RBD timer (POLL) */ From herbert@gondor.apana.org.au Tue Nov 2 13:03:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 13:03:49 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2L3eA3026395 for ; Tue, 2 Nov 2004 13:03:41 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP5o6-00077S-00; Wed, 03 Nov 2004 08:03:10 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP5nv-0003Ie-00; Wed, 03 Nov 2004 08:02:59 +1100 Date: Wed, 3 Nov 2004 08:02:59 +1100 To: jamal Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041102210259.GA12642@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="vtzGhvizbBRQ85DL" Content-Disposition: inline In-Reply-To: <20041102203720.GA12108@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11365 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 3852 Lines: 135 --vtzGhvizbBRQ85DL Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 03, 2004 at 07:37:20AM +1100, herbert wrote: > On Tue, Nov 02, 2004 at 09:13:43AM -0500, jamal wrote: > > > In previous code it seems you should short-circuit if > > neigh_forced_gc(tbl) returns non-zero. why do you have to break that > > if statement? > > The previous logic is slightly incorrect in that even if neigh_forced_gc > succeeded in removing some entries, the total number of entries may still > be above the threshold 3. Actually, after thinking about this a bit more, the short-circuit is indeed correct. The logic is that if we freed up at least one spot in the hash table then we ought to be able to take it. In fact, we can make it a bit more effective/fair by checking the previous entries count as well. Here is an updated patch. Signed-off-by: Herbert Xu Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --vtzGhvizbBRQ85DL Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== include/net/neighbour.h 1.24 vs edited ===== --- 1.24/include/net/neighbour.h 2004-10-22 14:51:12 +10:00 +++ edited/include/net/neighbour.h 2004-11-03 07:56:07 +11:00 @@ -189,7 +189,7 @@ struct timer_list gc_timer; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; - int entries; + atomic_t entries; rwlock_t lock; unsigned long last_rand; struct neigh_parms *parms_list; ===== net/core/neighbour.c 1.54 vs edited ===== --- 1.54/net/core/neighbour.c 2004-10-06 04:37:37 +10:00 +++ edited/net/core/neighbour.c 2004-11-03 07:57:32 +11:00 @@ -254,18 +254,21 @@ { struct neighbour *n = NULL; unsigned long now = jiffies; + int entries; - if (tbl->entries > tbl->gc_thresh3 || - (tbl->entries > tbl->gc_thresh2 && + entries = atomic_inc_return(&tbl->entries) - 1; + if (entries >= tbl->gc_thresh3 || + (entries >= tbl->gc_thresh2 && time_after(now, tbl->last_flush + 5 * HZ))) { if (!neigh_forced_gc(tbl) && - tbl->entries > tbl->gc_thresh3) - goto out; + entries >= tbl->gc_thresh3 && + atomic_read(&tbl->entries) > tbl->gc_thresh3) + goto out_entries; } n = kmem_cache_alloc(tbl->kmem_cachep, SLAB_ATOMIC); if (!n) - goto out; + goto out_entries; memset(n, 0, tbl->entry_size); @@ -281,12 +284,15 @@ NEIGH_CACHE_STAT_INC(tbl, allocs); neigh_glbl_allocs++; - tbl->entries++; n->tbl = tbl; atomic_set(&n->refcnt, 1); n->dead = 1; out: return n; + +out_entries: + atomic_dec(&tbl->entries); + goto out; } static struct neighbour **neigh_hash_alloc(unsigned int entries) @@ -427,7 +433,7 @@ write_lock_bh(&tbl->lock); - if (tbl->entries > (tbl->hash_mask + 1)) + if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1)) neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1); hash_val = tbl->hash(pkey, dev) & tbl->hash_mask; @@ -608,7 +614,7 @@ NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); neigh_glbl_allocs--; - neigh->tbl->entries--; + atomic_dec(&neigh->tbl->entries); kmem_cache_free(neigh->tbl->kmem_cachep, neigh); } @@ -1394,7 +1400,7 @@ del_timer_sync(&tbl->proxy_timer); pneigh_queue_purge(&tbl->proxy_queue); neigh_ifdown(tbl, NULL); - if (tbl->entries) + if (atomic_read(&tbl->entries)) printk(KERN_CRIT "neighbour leakage\n"); write_lock(&neigh_tbl_lock); for (tp = &neigh_tables; *tp; tp = &(*tp)->next) { @@ -1951,7 +1957,7 @@ seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx " "%08lx %08lx %08lx %08lx\n", - tbl->entries, + atomic_read(&tbl->entries), st->allocs, st->destroys, --vtzGhvizbBRQ85DL-- From davem@davemloft.net Tue Nov 2 13:32:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 13:32:47 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2LWfP0027244 for ; Tue, 2 Nov 2004 13:32:42 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CP66h-0007uS-00; Tue, 02 Nov 2004 13:22:23 -0800 Date: Tue, 2 Nov 2004 13:22:22 -0800 From: "David S. Miller" To: Anil Gunturu Cc: netdev@oss.sgi.com Subject: Re: NETLINK_ROUTE sockets in kernel Message-Id: <20041102132222.671cf16c.davem@davemloft.net> In-Reply-To: <2f61ba570411021146657f63f4@mail.gmail.com> References: <2f61ba570411021146657f63f4@mail.gmail.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11366 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 464 Lines: 11 On Tue, 2 Nov 2004 11:46:46 -0800 Anil Gunturu wrote: > But its not clear on how the rtnetlink_links array is > populated for PF_NETLINK family. rtnetlink_init seem to populate for > PF_PACKET and PF_UNSPEC. This is done via net/ipv4/devinet.c:devinet_init() which sets rtnetlink_links[] for PF_INET. Please run grep on the kernel tree for references to rtnetlink_links[] to see how other protocol family array entries are initialized. From pablo@eurodev.net Tue Nov 2 13:40:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 13:40:31 -0800 (PST) Received: from smtp06.retemail.es (smtp06.auna.com [62.81.186.16]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2LeMrC027677 for ; Tue, 2 Nov 2004 13:40:23 -0800 Received: from eurodev.net ([217.217.187.247]) by smtp06.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20041102213959.FUIT1314.smtp06.retemail.es@eurodev.net>; Tue, 2 Nov 2004 22:39:59 +0100 Message-ID: <4187FF18.5050608@eurodev.net> Date: Tue, 02 Nov 2004 22:41:44 +0100 From: Pablo Neira User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: netdev@oss.sgi.com CC: "David S. Miller" Subject: [NETLINK] introduce netlink bucket Content-Type: multipart/mixed; boundary="------------090104060208020908070101" X-archive-position: 11367 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pablo@eurodev.net Precedence: bulk X-list: netdev Content-Length: 4476 Lines: 162 This is a multi-part message in MIME format. --------------090104060208020908070101 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi Davem, This patch introduces the netlink bucket struct, it joins three arrays into an array of netlink bucket. Signed-off-by: Pablo Neira Ayuso --------------090104060208020908070101 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" ===== net/netlink/af_netlink.c 1.57 vs edited ===== --- 1.57/net/netlink/af_netlink.c 2004-10-20 07:10:40 +02:00 +++ edited/net/netlink/af_netlink.c 2004-10-30 19:37:26 +02:00 @@ -69,13 +69,15 @@ #define nlk_sk(__sk) ((struct netlink_opt *)(__sk)->sk_protinfo) -static struct hlist_head nl_table[MAX_LINKS]; static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait); -static unsigned nl_nonroot[MAX_LINKS]; +static struct netlink_bucket { + struct hlist_head nl_table; + unsigned nl_nonroot; #ifdef NL_EMULATE_DEV -static struct socket *netlink_kernel[MAX_LINKS]; + struct socket *netlink_kernel; #endif +} nl_bucket[MAX_LINKS]; static int netlink_dump(struct sock *sk); static void netlink_destroy_callback(struct netlink_callback *cb); @@ -164,7 +166,7 @@ struct hlist_node *node; read_lock(&nl_table_lock); - sk_for_each(sk, node, &nl_table[protocol]) { + sk_for_each(sk, node, &nl_bucket[protocol].nl_table) { if (nlk_sk(sk)->pid == pid) { sock_hold(sk); goto found; @@ -185,7 +187,7 @@ struct hlist_node *node; netlink_table_grab(); - sk_for_each(osk, node, &nl_table[sk->sk_protocol]) { + sk_for_each(osk, node, &nl_bucket[sk->sk_protocol].nl_table) { if (nlk_sk(osk)->pid == pid) break; } @@ -193,7 +195,7 @@ err = -EBUSY; if (nlk_sk(sk)->pid == 0) { nlk_sk(sk)->pid = pid; - sk_add_node(sk, &nl_table[sk->sk_protocol]); + sk_add_node(sk, &nl_bucket[sk->sk_protocol].nl_table); err = 0; } } @@ -297,7 +299,7 @@ retry: netlink_table_grab(); - sk_for_each(osk, node, &nl_table[sk->sk_protocol]) { + sk_for_each(osk, node, &nl_bucket[sk->sk_protocol].nl_table) { if (nlk_sk(osk)->pid == pid) { /* Bind collision, search negative pid values. */ if (pid > 0) @@ -318,7 +320,7 @@ static inline int netlink_capable(struct socket *sock, unsigned flag) { - return (nl_nonroot[sock->sk->sk_protocol] & flag) || + return (nl_bucket[sock->sk->sk_protocol].nl_nonroot & flag) || capable(CAP_NET_ADMIN); } @@ -615,7 +617,7 @@ netlink_lock_table(); - sk_for_each(sk, node, &nl_table[protocol]) { + sk_for_each(sk, node, &nl_bucket[protocol].nl_table) { struct netlink_opt *nlk = nlk_sk(sk); if (ssk == sk) @@ -675,7 +677,7 @@ int protocol = ssk->sk_protocol; read_lock(&nl_table_lock); - sk_for_each(sk, node, &nl_table[protocol]) { + sk_for_each(sk, node, &nl_bucket[protocol].nl_table) { struct netlink_opt *nlk = nlk_sk(sk); if (ssk == sk) continue; @@ -883,7 +885,7 @@ void netlink_set_nonroot(int protocol, unsigned flags) { if ((unsigned)protocol < MAX_LINKS) - nl_nonroot[protocol] = flags; + nl_bucket[protocol].nl_nonroot = flags; } static void netlink_destroy_callback(struct netlink_callback *cb) @@ -1034,7 +1036,7 @@ return -ENOBUFS; nlk_sk(sk)->handler = function; write_lock_bh(&nl_emu_lock); - netlink_kernel[unit] = sk->sk_socket; + nl_bucket[unit].netlink_kernel = sk->sk_socket; write_unlock_bh(&nl_emu_lock); return 0; } @@ -1044,8 +1046,8 @@ struct socket *sock; write_lock_bh(&nl_emu_lock); - sock = netlink_kernel[unit]; - netlink_kernel[unit] = NULL; + sock = nl_bucket[unit].netlink_kernel; + nl_bucket[unit].netlink_kernel = NULL; write_unlock_bh(&nl_emu_lock); sock_release(sock); @@ -1056,7 +1058,7 @@ struct socket *sock; read_lock(&nl_emu_lock); - sock = netlink_kernel[unit]; + sock = nl_bucket[unit].netlink_kernel; if (sock) { struct sock *sk = sock->sk; memset(skb->cb, 0, sizeof(skb->cb)); @@ -1083,7 +1085,7 @@ loff_t off = 0; for (i=0; iprivate = (void *) i; return s; @@ -1114,7 +1116,7 @@ long i = (long)seq->private; while (++i < MAX_LINKS) { - s = sk_head(&nl_table[i]); + s = sk_head(&nl_bucket[i].nl_table); if (s) { seq->private = (void *) i; break; --------------090104060208020908070101-- From linville@ra.tuxdriver.com Tue Nov 2 13:45:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 13:45:36 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2LjS46028061 for ; Tue, 2 Nov 2004 13:45:29 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iA2Lie321044; Tue, 2 Nov 2004 16:44:40 -0500 Date: Tue, 2 Nov 2004 16:44:40 -0500 From: "John W. Linville" To: Anil Gunturu Cc: netdev@oss.sgi.com, nhorman@redhat.com Subject: Re: NETLINK_ROUTE sockets in kernel Message-ID: <20041102164440.B19501@tuxdriver.com> Mail-Followup-To: Anil Gunturu , netdev@oss.sgi.com, nhorman@redhat.com References: <2f61ba570411021146657f63f4@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <2f61ba570411021146657f63f4@mail.gmail.com>; from anil.gunturu@gmail.com on Tue, Nov 02, 2004 at 11:46:46AM -0800 X-archive-position: 11368 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Content-Length: 347 Lines: 12 On Tue, Nov 02, 2004 at 11:46:46AM -0800, Anil Gunturu wrote: > Hi, > I am trying to undestand the NETLINK_ROUTE protocol sockets on 2.4.18 > kernel. Specifically, I am interested in knowing how the kernel Neil Horman has been working on a paper that may be of use to you... John -- John W. Linville linville@tuxdriver.com From romieu@fr.zoreil.com Tue Nov 2 13:59:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 13:59:48 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2LxbFi028778 for ; Tue, 2 Nov 2004 13:59:38 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA2Lu8vr028752; Tue, 2 Nov 2004 22:56:08 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA2Lu864028751; Tue, 2 Nov 2004 22:56:08 +0100 Date: Tue, 2 Nov 2004 22:56:07 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 3/3] r8169: clean up Message-ID: <20041102215607.GA28148@electric-eye.fr.zoreil.com> References: <200411021203.25100.jdmason@us.ibm.com> <20041102192746.GB24860@electric-eye.fr.zoreil.com> <200411021347.39047.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411021347.39047.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11369 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 392 Lines: 18 Jon Mason : [...] > Silly question, does "!!" not execute a bitwise not twice? If not, then > please forgive my ignorance. logical not: ! bitwise not: ~ > If so, then it is unnecessary. But if you want something prettier, how about: > > cmd->autoneg = (status & TBINwEnable) ? AUTONEG_ENABLE : AUTONEG_DISABLE; Ok, I take it. -- Ueimor. From herbert@gondor.apana.org.au Tue Nov 2 14:06:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:06:52 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2M6gso029276 for ; Tue, 2 Nov 2004 14:06:44 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP6n4-0007bj-00; Wed, 03 Nov 2004 09:06:10 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP6mx-0003TT-00; Wed, 03 Nov 2004 09:06:03 +1100 Date: Wed, 3 Nov 2004 09:06:03 +1100 To: jamal Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041102220603.GA13312@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="zhXaljGHf11kAtnf" Content-Disposition: inline In-Reply-To: <20041102210259.GA12642@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11370 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 3364 Lines: 123 --zhXaljGHf11kAtnf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 03, 2004 at 08:02:59AM +1100, herbert wrote: > > In fact, we can make it a bit more effective/fair by checking the > previous entries count as well. Call me a flip-flop :) This extra check is silly because in the cases where it is done it is very unlikely to succeed. So here is yet another update without that check. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --zhXaljGHf11kAtnf Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== include/net/neighbour.h 1.24 vs edited ===== --- 1.24/include/net/neighbour.h 2004-10-22 14:51:12 +10:00 +++ edited/include/net/neighbour.h 2004-11-03 07:56:07 +11:00 @@ -189,7 +189,7 @@ struct timer_list gc_timer; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; - int entries; + atomic_t entries; rwlock_t lock; unsigned long last_rand; struct neigh_parms *parms_list; ===== net/core/neighbour.c 1.54 vs edited ===== --- 1.54/net/core/neighbour.c 2004-10-06 04:37:37 +10:00 +++ edited/net/core/neighbour.c 2004-11-03 09:02:19 +11:00 @@ -254,18 +254,20 @@ { struct neighbour *n = NULL; unsigned long now = jiffies; + int entries; - if (tbl->entries > tbl->gc_thresh3 || - (tbl->entries > tbl->gc_thresh2 && + entries = atomic_inc_return(&tbl->entries) - 1; + if (entries >= tbl->gc_thresh3 || + (entries >= tbl->gc_thresh2 && time_after(now, tbl->last_flush + 5 * HZ))) { if (!neigh_forced_gc(tbl) && - tbl->entries > tbl->gc_thresh3) - goto out; + entries >= tbl->gc_thresh3) + goto out_entries; } n = kmem_cache_alloc(tbl->kmem_cachep, SLAB_ATOMIC); if (!n) - goto out; + goto out_entries; memset(n, 0, tbl->entry_size); @@ -281,12 +283,15 @@ NEIGH_CACHE_STAT_INC(tbl, allocs); neigh_glbl_allocs++; - tbl->entries++; n->tbl = tbl; atomic_set(&n->refcnt, 1); n->dead = 1; out: return n; + +out_entries: + atomic_dec(&tbl->entries); + goto out; } static struct neighbour **neigh_hash_alloc(unsigned int entries) @@ -427,7 +432,7 @@ write_lock_bh(&tbl->lock); - if (tbl->entries > (tbl->hash_mask + 1)) + if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1)) neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1); hash_val = tbl->hash(pkey, dev) & tbl->hash_mask; @@ -608,7 +613,7 @@ NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); neigh_glbl_allocs--; - neigh->tbl->entries--; + atomic_dec(&neigh->tbl->entries); kmem_cache_free(neigh->tbl->kmem_cachep, neigh); } @@ -1394,7 +1399,7 @@ del_timer_sync(&tbl->proxy_timer); pneigh_queue_purge(&tbl->proxy_queue); neigh_ifdown(tbl, NULL); - if (tbl->entries) + if (atomic_read(&tbl->entries)) printk(KERN_CRIT "neighbour leakage\n"); write_lock(&neigh_tbl_lock); for (tp = &neigh_tables; *tp; tp = &(*tp)->next) { @@ -1951,7 +1956,7 @@ seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx " "%08lx %08lx %08lx %08lx\n", - tbl->entries, + atomic_read(&tbl->entries), st->allocs, st->destroys, --zhXaljGHf11kAtnf-- From herbert@gondor.apana.org.au Tue Nov 2 14:16:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:16:25 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2MGGWh029800 for ; Tue, 2 Nov 2004 14:16:17 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP6vt-0007hp-00; Wed, 03 Nov 2004 09:15:17 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP6vo-0003Uf-00; Wed, 03 Nov 2004 09:15:12 +1100 From: Herbert Xu To: Anil Gunturu Subject: Re: NETLINK_ROUTE sockets in kernel Cc: netdev@oss.sgi.com Organization: Core In-Reply-To: <2f61ba570411021146657f63f4@mail.gmail.com> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 03 Nov 2004 09:15:12 +1100 X-archive-position: 11371 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 507 Lines: 14 Anil Gunturu wrote: > > kernel. But its not clear on how the rtnetlink_links array is > populated for PF_NETLINK family. rtnetlink_init seem to populate for rtnetlink_links[PF_NETLINK] doesn't make sense. We don't have a routing system for NETLINK itself, yet. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Tue Nov 2 14:16:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:16:46 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2MGejC029835 for ; Tue, 2 Nov 2004 14:16:40 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP6ws-0007i2-00; Wed, 03 Nov 2004 09:16:18 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP6wn-0003VF-00; Wed, 03 Nov 2004 09:16:13 +1100 From: Herbert Xu To: pablo@eurodev.net (Pablo Neira) Subject: Re: [NETLINK] introduce netlink bucket Cc: netdev@oss.sgi.com, davem@redhat.com Organization: Core In-Reply-To: <4187FF18.5050608@eurodev.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 03 Nov 2004 09:16:13 +1100 X-archive-position: 11372 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 478 Lines: 14 Pablo Neira wrote: > > This patch introduces the netlink bucket struct, it joins three arrays > into an array of netlink bucket. Please hold onto any work involving netlink itself, there are some pending patches in that area right now. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From pablo@eurodev.net Tue Nov 2 14:24:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:24:47 -0800 (PST) Received: from smtp08.retemail.es (smtp08.auna.com [62.81.186.18]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2MOdse030550 for ; Tue, 2 Nov 2004 14:24:40 -0800 Received: from eurodev.net ([217.217.187.247]) by smtp09.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20041102222015.ZUNX10464.smtp09.retemail.es@eurodev.net>; Tue, 2 Nov 2004 23:20:15 +0100 Message-ID: <4188088D.4040506@eurodev.net> Date: Tue, 02 Nov 2004 23:22:05 +0100 From: Pablo Neira User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: Herbert Xu CC: netdev@oss.sgi.com, davem@redhat.com Subject: Re: [NETLINK] introduce netlink bucket References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11373 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pablo@eurodev.net Precedence: bulk X-list: netdev Content-Length: 348 Lines: 18 Herbert Xu wrote: >Pablo Neira wrote: > > >>This patch introduces the netlink bucket struct, it joins three arrays >>into an array of netlink bucket. >> >> > >Please hold onto any work involving netlink itself, there are some >pending patches in that area right now. > > uh just curious, what kind of patches? Pablo From davem@davemloft.net Tue Nov 2 14:27:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:27:32 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2MRSml030902 for ; Tue, 2 Nov 2004 14:27:28 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CP6xU-00081S-00; Tue, 02 Nov 2004 14:16:56 -0800 Date: Tue, 2 Nov 2004 14:16:56 -0800 From: "David S. Miller" To: Pablo Neira Cc: herbert@gondor.apana.org.au, netdev@oss.sgi.com, davem@redhat.com Subject: Re: [NETLINK] introduce netlink bucket Message-Id: <20041102141656.197d657f.davem@davemloft.net> In-Reply-To: <4188088D.4040506@eurodev.net> References: <4188088D.4040506@eurodev.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11374 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 243 Lines: 8 On Tue, 02 Nov 2004 23:22:05 +0100 Pablo Neira wrote: > uh just curious, what kind of patches? Herbert and I have a pending patch which changes the code over to use hash lookups for the "find socket by PID" netlink code. From herbert@gondor.apana.org.au Tue Nov 2 14:54:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 14:54:46 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA2MsbL1032013 for ; Tue, 2 Nov 2004 14:54:39 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP7XW-00084a-00; Wed, 03 Nov 2004 09:54:10 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP7XS-0003bQ-00; Wed, 03 Nov 2004 09:54:06 +1100 Date: Wed, 3 Nov 2004 09:54:06 +1100 To: "David S. Miller" , mingo@elte.hu, netdev@oss.sgi.com Subject: [NET] Move local_bh_disable back in dev_queue_xmit Message-ID: <20041102225406.GA13760@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="TB36FDmn/VVEgNH/" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11375 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1783 Lines: 68 --TB36FDmn/VVEgNH/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Ingo: Your recent fix to dev_queue_xmit moved the local_bh_disable to include stuff like skb_linearize and skb_checksum_help. These are potentially expensive operations. Since they don't need to run with preempt off, we could simply move the local_bh_enable up instead. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --TB36FDmn/VVEgNH/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/core/dev.c 1.171 vs edited ===== --- 1.171/net/core/dev.c 2004-11-02 12:40:59 +11:00 +++ edited/net/core/dev.c 2004-11-03 09:31:09 +11:00 @@ -1261,11 +1261,6 @@ struct Qdisc *q; int rc = -ENOMEM; - /* Disable soft irqs for various locks below. Also - * stops preemption for RCU. - */ - local_bh_disable(); - if (skb_shinfo(skb)->frag_list && !(dev->features & NETIF_F_FRAGLIST) && __skb_linearize(skb, GFP_ATOMIC)) @@ -1290,6 +1285,11 @@ if (skb_checksum_help(skb, 0)) goto out_kfree_skb; + /* Disable soft irqs for various locks below. Also + * stops preemption for RCU. + */ + local_bh_disable(); + /* Updates of qdisc are serialized by queue_lock. * The struct Qdisc which is pointed to by qdisc is now a * rcu structure - it may be accessed without acquiring @@ -1363,10 +1363,10 @@ } out_enetdown: rc = -ENETDOWN; -out_kfree_skb: - kfree_skb(skb); out: local_bh_enable(); +out_kfree_skb: + kfree_skb(skb); return rc; } --TB36FDmn/VVEgNH/-- From shemminger@osdl.org Tue Nov 2 16:25:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 16:25:24 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA30PHil005775 for ; Tue, 2 Nov 2004 16:25:18 -0800 Received: from dxpl.pdx.osdl.net (dxpl.pdx.osdl.net [172.20.1.103]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iA30Os918402; Tue, 2 Nov 2004 16:24:55 -0800 Date: Tue, 2 Nov 2004 16:24:54 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: [PATCH] UDP select handling of bad checksums. Message-Id: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; x86_64-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11376 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 4321 Lines: 133 This patch addresses the issue of blocking usage of select() by UDP applications. The problem is Linux optimizes the UDP receive checksum path so that checksum validation is not performed until the application receive. This is a performance win but can cause applications that do select with blocking file descriptors to get false positives. There is a long running thread about this on LKML, as well as the cause of http://bugme.osdl.org/show_bug.cgi?id=3610 This patch makes these applications work, but keeps the one-pass performance gain for those applications smart enough to use non-blocking file descriptors with select/poll. There is still a possibility to get a false positive if application does select on non-blocking fd then makes it blocking before doing the receive, but that is unlikely. Tested by injecting bad packets with SOCK_RAW. Signed-off-by: Stephen Hemminger diff -Nru a/include/net/udp.h b/include/net/udp.h --- a/include/net/udp.h 2004-11-02 16:16:29 -08:00 +++ b/include/net/udp.h 2004-11-02 16:16:29 -08:00 @@ -71,6 +71,8 @@ extern int udp_rcv(struct sk_buff *skb); extern int udp_ioctl(struct sock *sk, int cmd, unsigned long arg); extern int udp_disconnect(struct sock *sk, int flags); +extern unsigned int udp_poll(struct file *file, struct socket *sock, + poll_table *wait); DECLARE_SNMP_STAT(struct udp_mib, udp_statistics); #define UDP_INC_STATS(field) SNMP_INC_STATS(udp_statistics, field) diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c 2004-11-02 16:16:29 -08:00 +++ b/net/ipv4/af_inet.c 2004-11-02 16:16:29 -08:00 @@ -809,7 +809,7 @@ .socketpair = sock_no_socketpair, .accept = sock_no_accept, .getname = inet_getname, - .poll = datagram_poll, + .poll = udp_poll, .ioctl = inet_ioctl, .listen = sock_no_listen, .shutdown = inet_shutdown, diff -Nru a/net/ipv4/udp.c b/net/ipv4/udp.c --- a/net/ipv4/udp.c 2004-11-02 16:16:29 -08:00 +++ b/net/ipv4/udp.c 2004-11-02 16:16:29 -08:00 @@ -1303,6 +1303,67 @@ return 0; } +static inline int udp_recv_ready(const struct file *file, + struct sk_buff_head *rcvq) +{ + struct sk_buff *skb; + + /* If non-blocking, can use faster single pass method. */ + if (file->f_flags & O_NONBLOCK) + return !skb_queue_empty(rcvq); + + spin_lock_irq(&rcvq->lock); + while ((skb = skb_peek(rcvq)) != NULL) { + /* checksum is wrong, silently remove it. */ + if (udp_checksum_complete(skb)) + __skb_unlink(skb, rcvq); + else { + /* no need to rescan */ + skb->ip_summed = CHECKSUM_UNNECESSARY; + break; + } + } + spin_unlock_irq(&rcvq->lock); + + return skb != NULL; +} + +/* + * Wait for a UDP event. + * + * This is same as datagram poll, except for the special case of + * blocking sockets. UDP doesn't checksum data until it is copied + * to the application on receive. So handle that special case here. + */ +unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) +{ + struct sock *sk = sock->sk; + unsigned int mask; + + poll_wait(file, sk->sk_sleep, wait); + mask = 0; + + /* exceptional events? */ + if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) + mask |= POLLERR; + + if (sk->sk_shutdown == SHUTDOWN_MASK) + mask |= POLLHUP; + + /* readable? */ + if ( udp_recv_ready(file, &sk->sk_receive_queue) || + (sk->sk_shutdown & RCV_SHUTDOWN)) + mask |= POLLIN | POLLRDNORM; + + /* writable? */ + if (sock_writeable(sk)) + mask |= POLLOUT | POLLWRNORM | POLLWRBAND; + else + set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); + + return mask; + +} struct proto udp_prot = { .name = "UDP", @@ -1516,6 +1577,7 @@ EXPORT_SYMBOL(udp_port_rover); EXPORT_SYMBOL(udp_prot); EXPORT_SYMBOL(udp_sendmsg); +EXPORT_SYMBOL(udp_poll); #ifdef CONFIG_PROC_FS EXPORT_SYMBOL(udp_proc_register); diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c --- a/net/ipv6/af_inet6.c 2004-11-02 16:16:29 -08:00 +++ b/net/ipv6/af_inet6.c 2004-11-02 16:16:29 -08:00 @@ -501,7 +501,7 @@ .socketpair = sock_no_socketpair, /* a do nothing */ .accept = sock_no_accept, /* a do nothing */ .getname = inet6_getname, - .poll = datagram_poll, /* ok */ + .poll = udp_poll, /* ok */ .ioctl = inet6_ioctl, /* must change */ .listen = sock_no_listen, /* ok */ .shutdown = inet_shutdown, /* ok */ From mitch@sfgoth.com Tue Nov 2 16:51:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 16:51:30 -0800 (PST) Received: from gaz.sfgoth.com (gaz.sfgoth.com [69.36.241.230]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA30pO7A006693 for ; Tue, 2 Nov 2004 16:51:24 -0800 Received: from gaz.sfgoth.com (localhost.sfgoth.com [127.0.0.1]) by gaz.sfgoth.com (8.12.10/8.12.9) with ESMTP id iA30qsGa082330; Tue, 2 Nov 2004 16:52:54 -0800 (PST) (envelope-from mitch@gaz.sfgoth.com) Received: (from mitch@localhost) by gaz.sfgoth.com (8.12.10/8.12.6/Submit) id iA30qrxr082329; Tue, 2 Nov 2004 16:52:53 -0800 (PST) (envelope-from mitch) Date: Tue, 2 Nov 2004 16:52:53 -0800 From: Mitchell Blank Jr To: Stephen Hemminger Cc: "David S. Miller" , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: [PATCH] UDP select handling of bad checksums. Message-ID: <20041103005253.GA77817@gaz.sfgoth.com> References: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> User-Agent: Mutt/1.4.2.1i X-archive-position: 11377 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mitch@sfgoth.com Precedence: bulk X-list: netdev Content-Length: 1013 Lines: 29 Stephen Hemminger wrote: > This patch addresses the issue of blocking usage of select() by UDP applications. I'm glad to see someone actually putting some code forward in this debate... Looks pretty good, but can't you implement this a bit cleaner by just wrapping datagram_poll? Something like: unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) { unsigned int mask = datagram_poll(file, sock, wait); if ((mask & POLLRDNORM) != 0 && (file->f_flags & O_NONBLOCK) == 0 && (sk->sk_shutdown & RCV_SHUTDOWN) == 0) { struct sk_buff_head *rcvq = &sk->sk_receive_queue; struct sk_buff *skb; spin_lock_irq(&rcvq->lock); // the skb_peek() loop from your udp_rcv_ready() goes here... spin_unlock_irq(&rcvq->lock); if (skb == NULL) /* nope, nothing really ready */ mask &= ~(POLLIN | POLLRDNORM); } return mask; } That way you duplicate a lot less code. It does slightly more work but only in the broken !O_NONBLOCK case - the fast path is just as quick. -Mitch From nhorman@redhat.com Tue Nov 2 16:53:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 16:53:24 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA30rHwY007033 for ; Tue, 2 Nov 2004 16:53:17 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iA30qlMt003268; Tue, 2 Nov 2004 19:52:47 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iA30qlr21586; Tue, 2 Nov 2004 19:52:47 -0500 Received: from redhat.com (vpn50-74.rdu.redhat.com [172.16.50.74]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id iA30qkLu000320; Tue, 2 Nov 2004 19:52:46 -0500 Message-ID: <41882BD5.6000406@redhat.com> Date: Tue, 02 Nov 2004 19:52:37 -0500 From: Neil Horman Reply-To: nhorman@redhat.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0; hi, Mom) Gecko/20020604 Netscape/7.01 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "John W. Linville" CC: Anil Gunturu , netdev@oss.sgi.com Subject: Re: NETLINK_ROUTE sockets in kernel References: <2f61ba570411021146657f63f4@mail.gmail.com> <20041102164440.B19501@tuxdriver.com> In-Reply-To: <20041102164440.B19501@tuxdriver.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11378 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nhorman@redhat.com Precedence: bulk X-list: netdev Content-Length: 806 Lines: 35 John W. Linville wrote: >On Tue, Nov 02, 2004 at 11:46:46AM -0800, Anil Gunturu wrote: > > >>Hi, >>I am trying to undestand the NETLINK_ROUTE protocol sockets on 2.4.18 >>kernel. Specifically, I am interested in knowing how the kernel >> >> > >Neil Horman has been working on a paper that >may be of use to you... > >John > > you can fetch the latest version of that paper from my people page: http://people.redhat.com/nhorman I've been working on it a little more and may have an update for it soon. Thanks for the reference john! Neil -- /*************************************************** *Neil Horman *Software Engineer *Red Hat, Inc. *nhorman@redhat.com *gpg keyid: 1024D / 0x92A74FA1 *http://pgp.mit.edu ***************************************************/ From mingo@elte.hu Tue Nov 2 17:10:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 17:10:08 -0800 (PST) Received: from mx2.elte.hu (mx2.elte.hu [157.181.151.9]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA319w22007782 for ; Tue, 2 Nov 2004 17:09:59 -0800 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx2.elte.hu (Postfix) with ESMTP id 819362B5320; Wed, 3 Nov 2004 02:09:23 +0100 (CET) Received: by chiara.elte.hu (Postfix, from userid 17806) id 13A9A1FC2; Wed, 3 Nov 2004 02:09:34 +0100 (CET) Date: Wed, 3 Nov 2004 02:10:43 +0100 From: Ingo Molnar To: Herbert Xu Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [NET] Move local_bh_disable back in dev_queue_xmit Message-ID: <20041103011043.GA16771@elte.hu> References: <20041102225406.GA13760@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041102225406.GA13760@gondor.apana.org.au> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.31.6-itk1 (ELTE 1.2) SpamAssassin 2.63 ClamAV 0.73 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 11379 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev Content-Length: 1764 Lines: 65 sure - perfectly fine to me. Ingo * Herbert Xu wrote: > Hi Ingo: > > Your recent fix to dev_queue_xmit moved the local_bh_disable to > include stuff like skb_linearize and skb_checksum_help. These > are potentially expensive operations. Since they don't need to > run with preempt off, we could simply move the local_bh_enable > up instead. > > Signed-off-by: Herbert Xu > > Cheers, > -- > Visit Openswan at http://www.openswan.org/ > Email: Herbert Xu ~{PmV>HI~} > Home Page: http://gondor.apana.org.au/~herbert/ > PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt > ===== net/core/dev.c 1.171 vs edited ===== > --- 1.171/net/core/dev.c 2004-11-02 12:40:59 +11:00 > +++ edited/net/core/dev.c 2004-11-03 09:31:09 +11:00 > @@ -1261,11 +1261,6 @@ > struct Qdisc *q; > int rc = -ENOMEM; > > - /* Disable soft irqs for various locks below. Also > - * stops preemption for RCU. > - */ > - local_bh_disable(); > - > if (skb_shinfo(skb)->frag_list && > !(dev->features & NETIF_F_FRAGLIST) && > __skb_linearize(skb, GFP_ATOMIC)) > @@ -1290,6 +1285,11 @@ > if (skb_checksum_help(skb, 0)) > goto out_kfree_skb; > > + /* Disable soft irqs for various locks below. Also > + * stops preemption for RCU. > + */ > + local_bh_disable(); > + > /* Updates of qdisc are serialized by queue_lock. > * The struct Qdisc which is pointed to by qdisc is now a > * rcu structure - it may be accessed without acquiring > @@ -1363,10 +1363,10 @@ > } > out_enetdown: > rc = -ENETDOWN; > -out_kfree_skb: > - kfree_skb(skb); > out: > local_bh_enable(); > +out_kfree_skb: > + kfree_skb(skb); > return rc; > } > From yoshfuji@linux-ipv6.org Tue Nov 2 17:13:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 17:13:34 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA31DRSN008186 for ; Tue, 2 Nov 2004 17:13:27 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 7ABDF33CE5; Wed, 3 Nov 2004 10:14:06 +0900 (JST) Date: Wed, 03 Nov 2004 10:14:03 +0900 (JST) Message-Id: <20041103.101403.118617263.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: hadi@cyberus.ca, davem@davemloft.net, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [NET] Fix neighbour tbl->entries race From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041102210259.GA12642@gondor.apana.org.au> References: <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11380 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 542 Lines: 15 In article <20041102210259.GA12642@gondor.apana.org.au> (at Wed, 3 Nov 2004 08:02:59 +1100), Herbert Xu says: > - if (tbl->entries > tbl->gc_thresh3 || > - (tbl->entries > tbl->gc_thresh2 && > + entries = atomic_inc_return(&tbl->entries) - 1; > + if (entries >= tbl->gc_thresh3 || > + (entries >= tbl->gc_thresh2 && Why don't you do something like this? entries = atomic_inc_return(&tbl->entries); if (entries > tbl->gc_thresh3 || (entries > tbl->gc_thresh2 && --yoshfuji From herbert@gondor.apana.org.au Tue Nov 2 17:26:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 17:26:07 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA31PuKG008824 for ; Tue, 2 Nov 2004 17:25:59 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CP9tv-0000gj-00; Wed, 03 Nov 2004 12:25:27 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CP9to-0003s8-00; Wed, 03 Nov 2004 12:25:20 +1100 Date: Wed, 3 Nov 2004 12:25:20 +1100 To: "YOSHIFUJI Hideaki / ?$B5HF#1QL@" Cc: hadi@cyberus.ca, davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041103012520.GA14818@gondor.apana.org.au> References: <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041103.101403.118617263.yoshfuji@linux-ipv6.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103.101403.118617263.yoshfuji@linux-ipv6.org> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11381 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1100 Lines: 28 On Wed, Nov 03, 2004 at 10:14:03AM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@ wrote: > In article <20041102210259.GA12642@gondor.apana.org.au> (at Wed, 3 Nov 2004 08:02:59 +1100), Herbert Xu says: > > > - if (tbl->entries > tbl->gc_thresh3 || > > - (tbl->entries > tbl->gc_thresh2 && > > + entries = atomic_inc_return(&tbl->entries) - 1; > > + if (entries >= tbl->gc_thresh3 || > > + (entries >= tbl->gc_thresh2 && > > Why don't you do something like this? > > entries = atomic_inc_return(&tbl->entries); > if (entries > tbl->gc_thresh3 || > (entries > tbl->gc_thresh2 && We could do that. The first form generates slightly better code on i386. However, the situation is probably reversed for other architectures. A more serious issue is that some architectures arm/arm26/um/x86_64 don't have atomic_inc_return. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Tue Nov 2 17:49:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 17:49:09 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA31mwGj009564 for ; Tue, 2 Nov 2004 17:49:02 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPAG8-0000m4-00; Wed, 03 Nov 2004 12:48:24 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPAFz-0003wZ-00; Wed, 03 Nov 2004 12:48:15 +1100 Date: Wed, 3 Nov 2004 12:48:14 +1100 To: "YOSHIFUJI Hideaki / ?$B5HF#1QL@" Cc: hadi@cyberus.ca, davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041103014814.GA15148@gondor.apana.org.au> References: <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041103.101403.118617263.yoshfuji@linux-ipv6.org> <20041103012520.GA14818@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103012520.GA14818@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11382 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 442 Lines: 11 On Wed, Nov 03, 2004 at 12:25:20PM +1100, herbert wrote: > > A more serious issue is that some architectures arm/arm26/um/x86_64 > don't have atomic_inc_return. Actually arm/arm26/x86_64 have atomic_inc_return now so it's just um. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Tue Nov 2 17:53:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Nov 2004 17:53:14 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA31r6Xd009950 for ; Tue, 2 Nov 2004 17:53:07 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPAKE-0000oM-00; Wed, 03 Nov 2004 12:52:38 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPAKD-0003y3-00; Wed, 03 Nov 2004 12:52:37 +1100 Date: Wed, 3 Nov 2004 12:52:37 +1100 To: "YOSHIFUJI Hideaki / ?$B5HF#1QL@" Cc: hadi@cyberus.ca, davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041103015237.GA15240@gondor.apana.org.au> References: <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041103.101403.118617263.yoshfuji@linux-ipv6.org> <20041103012520.GA14818@gondor.apana.org.au> <20041103014814.GA15148@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103014814.GA15148@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11383 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 589 Lines: 15 On Wed, Nov 03, 2004 at 12:48:14PM +1100, herbert wrote: > On Wed, Nov 03, 2004 at 12:25:20PM +1100, herbert wrote: > > > > A more serious issue is that some architectures arm/arm26/um/x86_64 > > don't have atomic_inc_return. > > Actually arm/arm26/x86_64 have atomic_inc_return now so it's just um. And of course um doesn't need it since it just includes asm/arch/atomic.h :) -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Wed Nov 3 01:45:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 01:45:27 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA39jIT8006506 for ; Wed, 3 Nov 2004 01:45:19 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPHhH-0002yr-00; Wed, 03 Nov 2004 20:44:55 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPHhD-0005dj-00; Wed, 03 Nov 2004 20:44:51 +1100 Date: Wed, 3 Nov 2004 20:44:51 +1100 To: "David S. Miller" , netdev@oss.sgi.com Subject: [TCP] Modular IPv6 support in tcpdiag Message-ID: <20041103094451.GA20220@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="n8g4imXOkfNTN/H1" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11384 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 4489 Lines: 166 --n8g4imXOkfNTN/H1 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: This patch allows tcpdiag to support ipv6 work as a module when itself is also a module. I was planning for a more extensible method but now I think the effort would be better directed at a new generic socket netlink interface than the TCP-specific tcpdiag. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --n8g4imXOkfNTN/H1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv4/Kconfig 1.22 vs edited ===== --- 1.22/net/ipv4/Kconfig 2004-11-02 11:48:28 +11:00 +++ edited/net/ipv4/Kconfig 2004-11-03 20:39:16 +11:00 @@ -351,12 +351,16 @@ config IP_TCPDIAG tristate "IP: TCP socket monitoring interface" + depends on INET default y ---help--- Support for TCP socket monitoring interface used by native Linux tools such as ss. If unsure, say Y. + +config IP_TCPDIAG_IPV6 + def_bool (IP_TCPDIAG=y && IPV6=y) || (IP_TCPDIAG=m && IPV6) source "net/ipv4/ipvs/Kconfig" ===== net/ipv4/tcp_diag.c 1.26 vs edited ===== --- 1.26/net/ipv4/tcp_diag.c 2004-11-02 11:48:28 +11:00 +++ edited/net/ipv4/tcp_diag.c 2004-11-03 20:37:03 +11:00 @@ -103,14 +103,12 @@ r->tcpdiag_wqueue = 0; r->tcpdiag_uid = 0; r->tcpdiag_inode = 0; -#ifdef CONFIG_IPV6 if (r->tcpdiag_family == AF_INET6) { ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_src, &tw->tw_v6_rcv_saddr); ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_dst, &tw->tw_v6_daddr); } -#endif nlh->nlmsg_len = skb->tail - b; return skb->len; } @@ -120,7 +118,6 @@ r->id.tcpdiag_src[0] = inet->rcv_saddr; r->id.tcpdiag_dst[0] = inet->daddr; -#ifdef CONFIG_IPV6 if (r->tcpdiag_family == AF_INET6) { struct ipv6_pinfo *np = inet6_sk(sk); @@ -129,7 +126,6 @@ ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_dst, &np->daddr); } -#endif #define EXPIRES_IN_MS(tmo) ((tmo-jiffies)*1000+HZ-1)/HZ @@ -188,11 +184,19 @@ return -1; } -extern struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif); -#ifdef CONFIG_IPV6 +extern struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, + int dif); +#ifdef CONFIG_IP_TCPDIAG_IPV6 extern struct sock *tcp_v6_lookup(struct in6_addr *saddr, u16 sport, struct in6_addr *daddr, u16 dport, int dif); +#else +static inline struct sock *tcp_v6_lookup(struct in6_addr *saddr, u16 sport, + struct in6_addr *daddr, u16 dport, + int dif) +{ + return NULL; +} #endif static int tcpdiag_get_exact(struct sk_buff *in_skb, const struct nlmsghdr *nlh) @@ -207,13 +211,11 @@ req->id.tcpdiag_src[0], req->id.tcpdiag_sport, req->id.tcpdiag_if); } -#ifdef CONFIG_IPV6 else if (req->tcpdiag_family == AF_INET6) { sk = tcp_v6_lookup((struct in6_addr*)req->id.tcpdiag_dst, req->id.tcpdiag_dport, (struct in6_addr*)req->id.tcpdiag_src, req->id.tcpdiag_sport, req->id.tcpdiag_if); } -#endif else { return -EINVAL; } @@ -422,14 +424,12 @@ struct inet_opt *inet = inet_sk(sk); entry.family = sk->sk_family; -#ifdef CONFIG_IPV6 if (entry.family == AF_INET6) { struct ipv6_pinfo *np = inet6_sk(sk); entry.saddr = np->rcv_saddr.s6_addr32; entry.daddr = np->daddr.s6_addr32; } else -#endif { entry.saddr = &inet->rcv_saddr; entry.daddr = &inet->daddr; @@ -482,14 +482,12 @@ r->tcpdiag_wqueue = 0; r->tcpdiag_uid = sock_i_uid(sk); r->tcpdiag_inode = 0; -#ifdef CONFIG_IPV6 if (r->tcpdiag_family == AF_INET6) { ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_src, &req->af.v6_req.loc_addr); ipv6_addr_copy((struct in6_addr *)r->id.tcpdiag_dst, &req->af.v6_req.rmt_addr); } -#endif nlh->nlmsg_len = skb->tail - b; return skb->len; @@ -545,16 +543,12 @@ if (bc) { entry.saddr = -#ifdef CONFIG_IPV6 (entry.family == AF_INET6) ? req->af.v6_req.loc_addr.s6_addr32 : -#endif &req->af.v4_req.loc_addr; entry.daddr = -#ifdef CONFIG_IPV6 (entry.family == AF_INET6) ? req->af.v6_req.rmt_addr.s6_addr32 : -#endif &req->af.v4_req.rmt_addr; entry.dport = ntohs(req->rmt_port); --n8g4imXOkfNTN/H1-- From yoshfuji@linux-ipv6.org Wed Nov 3 03:25:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 03:25:32 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3BPPjM014189 for ; Wed, 3 Nov 2004 03:25:25 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id D2BBE33CE5; Wed, 3 Nov 2004 20:26:04 +0900 (JST) Date: Wed, 03 Nov 2004 20:26:04 +0900 (JST) Message-Id: <20041103.202604.56126215.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au, davem@davemloft.net Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041103094451.GA20220@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11385 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 256 Lines: 8 In article <20041103094451.GA20220@gondor.apana.org.au> (at Wed, 3 Nov 2004 20:44:51 +1100), Herbert Xu says: > This patch allows tcpdiag to support ipv6 work as a module when itself > is also a module. I agree. --yoshfuji From tommy.christensen@tpack.net Wed Nov 3 06:49:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 06:49:30 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA3EnMb6022495 for ; Wed, 3 Nov 2004 06:49:23 -0800 Received: (qmail 20945 invoked from network); 3 Nov 2004 14:48:59 -0000 Received: from dhcp-179.cph.tpack.net (HELO ?172.17.159.11?) (192.168.0.179) by 0 with SMTP; 3 Nov 2004 14:48:59 -0000 Message-ID: <4188EFD1.4050909@tpack.net> Date: Wed, 03 Nov 2004 15:48:49 +0100 From: Tommy Christensen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Herbert Xu CC: "David S. Miller" , mingo@elte.hu, netdev@oss.sgi.com Subject: Re: [NET] Move local_bh_disable back in dev_queue_xmit References: <20041102225406.GA13760@gondor.apana.org.au> In-Reply-To: <20041102225406.GA13760@gondor.apana.org.au> Content-Type: multipart/mixed; boundary="------------070405050509000708050508" X-archive-position: 11386 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Content-Length: 2122 Lines: 79 This is a multi-part message in MIME format. --------------070405050509000708050508 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Herbert Xu wrote: > Hi Ingo: > > Your recent fix to dev_queue_xmit moved the local_bh_disable to > include stuff like skb_linearize and skb_checksum_help. These > are potentially expensive operations. Since they don't need to > run with preempt off, we could simply move the local_bh_enable > up instead. No, this breaks the normal return path. How about this instead? Signed-off-by: Tommy S. Christensen --------------070405050509000708050508 Content-Type: text/plain; name="dev.c.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="dev.c.patch" --- linux-2.6.10-rc1-bk/net/core/dev.c Wed Nov 3 15:10:43 2004 +++ linux-2.6.10-rc1-work/net/core/dev.c Wed Nov 3 15:31:22 2004 @@ -1261,11 +1261,6 @@ struct Qdisc *q; int rc = -ENOMEM; - /* Disable soft irqs for various locks below. Also - * stops preemption for RCU. - */ - local_bh_disable(); - if (skb_shinfo(skb)->frag_list && !(dev->features & NETIF_F_FRAGLIST) && __skb_linearize(skb, GFP_ATOMIC)) @@ -1290,6 +1285,11 @@ if (skb_checksum_help(skb, 0)) goto out_kfree_skb; + /* Disable soft irqs for various locks below. Also + * stops preemption for RCU. + */ + local_bh_disable(); + /* Updates of qdisc are serialized by queue_lock. * The struct Qdisc which is pointed to by qdisc is now a * rcu structure - it may be accessed without acquiring @@ -1352,7 +1352,6 @@ if (net_ratelimit()) printk(KERN_CRIT "Virtual device %s asks to " "queue packet!\n", dev->name); - goto out_enetdown; } else { /* Recursion is detected! It is possible, * unfortunately */ @@ -1361,10 +1360,13 @@ "%s, fix it urgently!\n", dev->name); } } -out_enetdown: + rc = -ENETDOWN; + local_bh_enable(); + out_kfree_skb: kfree_skb(skb); + return rc; out: local_bh_enable(); return rc; --------------070405050509000708050508-- From yoshfuji@linux-ipv6.org Wed Nov 3 08:20:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 08:20:57 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3GKnen031946 for ; Wed, 3 Nov 2004 08:20:50 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 745E533CE8; Thu, 4 Nov 2004 01:21:29 +0900 (JST) Date: Thu, 04 Nov 2004 01:21:28 +0900 (JST) Message-Id: <20041104.012128.51410945.yoshfuji@linux-ipv6.org> To: davem@davemloft.net, jgarzik@pobox.com Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, davem@davemloft.net, yoshfuji@linux-ipv6.org Subject: Re: IPv6 dead in -bk11 From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041103.012923.102810732.yoshfuji@linux-ipv6.org> References: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> <4187A4E3.8010600@pobox.com> <20041103.012923.102810732.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 11387 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1029 Lines: 37 In article <20041103.012923.102810732.yoshfuji@linux-ipv6.org> (at Wed, 03 Nov 2004 01:29:23 +0900 (JST)), YOSHIFUJI Hideaki / 吉藤英明 says: > So... I guess that kernel failed to add "default route" on receipt of RA. > Right? : Sorry, this bug was introduced by my changeset: . David, this should fix the issue. Please apply. D: Don't purge default routes by RA. D: D: Signed-off-by: Hideaki YOSHIFUJI ===== net/ipv6/ndisc.c 1.103 vs edited ===== --- 1.103/net/ipv6/ndisc.c 2004-10-26 12:55:42 +09:00 +++ edited/net/ipv6/ndisc.c 2004-11-04 01:05:19 +09:00 @@ -1078,13 +1078,6 @@ return; } neigh->flags |= NTF_ROUTER; - - /* - * If we where using an "all destinations on link" route - * delete it - */ - - rt6_purge_dflt_routers(); } if (rt) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From shemminger@osdl.org Wed Nov 3 09:14:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 09:14:53 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3HEjMP000559 for ; Wed, 3 Nov 2004 09:14:46 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iA3HEAPE018876 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 3 Nov 2004 09:14:11 -0800 Date: Wed, 3 Nov 2004 09:16:09 -0800 From: Stephen Hemminger To: Herbert Xu Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-Id: <20041103091609.7f6d5d9c@zqx3.pdx.osdl.net> In-Reply-To: <20041103094451.GA20220@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11388 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 887 Lines: 23 On Wed, 3 Nov 2004 20:44:51 +1100 Herbert Xu wrote: > Hi Dave: > > This patch allows tcpdiag to support ipv6 work as a module when itself > is also a module. > > I was planning for a more extensible method but now I think the effort > would be better directed at a new generic socket netlink interface than > the TCP-specific tcpdiag. > > Signed-off-by: Herbert Xu I wanted to ask why all the work to make tcp_diag a module? If it is a module there are more possibilties of user problems. Any utilities that expect it would then have to deal with it not being loaded as well as the possiblity of building a kernel without it. Perhaps there ought to be a CONFIG_INET_EMBEDDED that is for those configurations that want more restricted and smaller networking (ie no cache's, smaller hash tables, less sysctl options, ...) From Falko_M_Klein@gmx.de Wed Nov 3 09:38:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 09:38:37 -0800 (PST) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA3HcVDv001347 for ; Wed, 3 Nov 2004 09:38:31 -0800 Received: (qmail 9754 invoked by uid 0); 3 Nov 2004 17:38:09 -0000 Received: from 141.78.180.92 by www6.gmx.net with HTTP; Wed, 3 Nov 2004 18:38:09 +0100 (MET) Date: Wed, 3 Nov 2004 18:38:09 +0100 (MET) From: "Anton meier" To: netdev@oss.sgi.com MIME-Version: 1.0 Subject: Interviewing some Linux Developer X-Priority: 3 (Normal) X-Authenticated: #24899823 Message-ID: <7624.1099503489@www6.gmx.net> X-Mailer: WWW-Mail 1.6 (Global Message Exchange) X-Flags: 0001 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-archive-position: 11389 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Falko_M_Klein@gmx.de Precedence: bulk X-list: netdev Content-Length: 521 Lines: 19 Hi! I'm doing my final thesis on "Coordination Mechanism and Coordination Success at Linux". In order to complete it, I would like to interview some Linux Developers about project coordination, project structure, motivation ect. The interview will be by email or by telephone (at my charge). Please send me an email if you are interested in participating. Kind regards, Falko Klein -- NEU +++ DSL Komplett von GMX +++ http://www.gmx.net/de/go/dsl GMX DSL-Netzanschluss + Tarif zum supergnstigen Komplett-Preis! From davem@davemloft.net Wed Nov 3 12:19:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:19:36 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KJSNA008381 for ; Wed, 3 Nov 2004 12:19:28 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPRR2-0001ew-00; Wed, 03 Nov 2004 12:08:48 -0800 Date: Wed, 3 Nov 2004 12:08:48 -0800 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, yoshfuji@linux-ipv6.org Subject: Re: IPv6 dead in -bk11 Message-Id: <20041103120848.632e8fee.davem@davemloft.net> In-Reply-To: <20041104.012128.51410945.yoshfuji@linux-ipv6.org> References: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> <4187A4E3.8010600@pobox.com> <20041103.012923.102810732.yoshfuji@linux-ipv6.org> <20041104.012128.51410945.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA3KJSNA008381 X-archive-position: 11390 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 617 Lines: 16 On Thu, 04 Nov 2004 01:21:28 +0900 (JST) YOSHIFUJI Hideaki / 吉藤英明 wrote: > In article <20041103.012923.102810732.yoshfuji@linux-ipv6.org> (at Wed, 03 Nov 2004 01:29:23 +0900 (JST)), YOSHIFUJI Hideaki / 吉藤英明 says: > > > So... I guess that kernel failed to add "default route" on receipt of RA. > > Right? > : > > Sorry, this bug was introduced by my changeset: > . > > David, this should fix the issue. Patch applied, thanks for tracking down and fixing this bug. From davem@davemloft.net Wed Nov 3 12:31:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:31:42 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KVZXZ008928 for ; Wed, 3 Nov 2004 12:31:36 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPRcg-0001l1-00; Wed, 03 Nov 2004 12:20:50 -0800 Date: Wed, 3 Nov 2004 12:20:50 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-Id: <20041103122050.50f6f556.davem@davemloft.net> In-Reply-To: <20041103094451.GA20220@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11391 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 391 Lines: 12 On Wed, 3 Nov 2004 20:44:51 +1100 Herbert Xu wrote: > This patch allows tcpdiag to support ipv6 work as a module when itself > is also a module. Any particular reason you didn't use the same config ifdef tests we use for structure layouts? Ie. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) I don't see the need for the special new config option. From herbert@gondor.apana.org.au Wed Nov 3 12:32:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:33:06 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KWub5009090 for ; Wed, 3 Nov 2004 12:32:58 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPRny-0007S1-00; Thu, 04 Nov 2004 07:32:30 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPRnv-0006aa-00; Thu, 04 Nov 2004 07:32:27 +1100 Date: Thu, 4 Nov 2004 07:32:27 +1100 To: Stephen Hemminger Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-ID: <20041103203227.GA25279@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> <20041103091609.7f6d5d9c@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103091609.7f6d5d9c@zqx3.pdx.osdl.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11392 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 901 Lines: 22 On Wed, Nov 03, 2004 at 09:16:09AM -0800, Stephen Hemminger wrote: > > I wanted to ask why all the work to make tcp_diag a module? If it is > a module there are more possibilties of user problems. Any utilities > that expect it would then have to deal with it not being loaded as well > as the possiblity of building a kernel without it. The reason is that prior to this if IPv6 was built as a module then you couldn't have tcp_diag support for IPv6 sockets at all. You're absolutely right about the potential problems with modules. However, I did set the default to Y. We should also have netlink module aliases so that these modules can be loaded automatically by af_netlink. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Wed Nov 3 12:34:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:34:48 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KYeYI009594 for ; Wed, 3 Nov 2004 12:34:42 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPRpf-0007TM-00; Thu, 04 Nov 2004 07:34:15 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPRpe-0006b8-00; Thu, 04 Nov 2004 07:34:14 +1100 Date: Thu, 4 Nov 2004 07:34:14 +1100 To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-ID: <20041103203414.GB25279@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> <20041103122050.50f6f556.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103122050.50f6f556.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11393 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 653 Lines: 20 On Wed, Nov 03, 2004 at 12:20:50PM -0800, David S. Miller wrote: > > Any particular reason you didn't use the same config ifdef > tests we use for structure layouts? Ie. > > #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) If I used that then it'll break when TCPDIAG is built-in and IPv6 is built as a module. > I don't see the need for the special new config option. The user won't see it at all since it's a def_bool. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From davem@davemloft.net Wed Nov 3 12:40:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:40:31 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KePk6010006 for ; Wed, 3 Nov 2004 12:40:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPRlF-0001mJ-00; Wed, 03 Nov 2004 12:29:41 -0800 Date: Wed, 3 Nov 2004 12:29:41 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-Id: <20041103122941.71a5b440.davem@davemloft.net> In-Reply-To: <20041103203414.GB25279@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> <20041103122050.50f6f556.davem@davemloft.net> <20041103203414.GB25279@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11394 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 485 Lines: 15 On Thu, 4 Nov 2004 07:34:14 +1100 Herbert Xu wrote: > On Wed, Nov 03, 2004 at 12:20:50PM -0800, David S. Miller wrote: > > > > Any particular reason you didn't use the same config ifdef > > tests we use for structure layouts? Ie. > > > > #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > > If I used that then it'll break when TCPDIAG is built-in and > IPv6 is built as a module. I see, you need the ipv6 tcp socket lookup symbols... hmmm. From herbert@gondor.apana.org.au Wed Nov 3 12:43:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:43:57 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3Khmqi010377 for ; Wed, 3 Nov 2004 12:43:49 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPRyY-0007b9-00; Thu, 04 Nov 2004 07:43:26 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPRyV-0006d7-00; Thu, 04 Nov 2004 07:43:23 +1100 Date: Thu, 4 Nov 2004 07:43:21 +1100 To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-ID: <20041103204321.GA25470@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> <20041103122050.50f6f556.davem@davemloft.net> <20041103203414.GB25279@gondor.apana.org.au> <20041103122941.71a5b440.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103122941.71a5b440.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11395 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 704 Lines: 19 On Wed, Nov 03, 2004 at 12:29:41PM -0800, David S. Miller wrote: > > > If I used that then it'll break when TCPDIAG is built-in and > > IPv6 is built as a module. > > I see, you need the ipv6 tcp socket lookup symbols... hmmm. Well it really should be turned into a plugin system. However, since any effort to do that might as well be spent doing a generic socket info interface, I thought that we should just patch up tcp_diag and mark it as obsolete once we have a new interface. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From davem@davemloft.net Wed Nov 3 12:51:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 12:51:53 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3KplsB010851 for ; Wed, 3 Nov 2004 12:51:48 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPRwF-0001pu-00; Wed, 03 Nov 2004 12:41:03 -0800 Date: Wed, 3 Nov 2004 12:41:03 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [TCP] Modular IPv6 support in tcpdiag Message-Id: <20041103124103.13fe69d5.davem@davemloft.net> In-Reply-To: <20041103204321.GA25470@gondor.apana.org.au> References: <20041103094451.GA20220@gondor.apana.org.au> <20041103122050.50f6f556.davem@davemloft.net> <20041103203414.GB25279@gondor.apana.org.au> <20041103122941.71a5b440.davem@davemloft.net> <20041103204321.GA25470@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11396 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 766 Lines: 19 On Thu, 4 Nov 2004 07:43:21 +1100 Herbert Xu wrote: > On Wed, Nov 03, 2004 at 12:29:41PM -0800, David S. Miller wrote: > > > > > If I used that then it'll break when TCPDIAG is built-in and > > > IPv6 is built as a module. > > > > I see, you need the ipv6 tcp socket lookup symbols... hmmm. > > Well it really should be turned into a plugin system. However, > since any effort to do that might as well be spent doing a > generic socket info interface, I thought that we should just > patch up tcp_diag and mark it as obsolete once we have a new > interface. I've put your patch in for now, but I don't know what I think about deprecating an interface that took so much effort to get people to use over the /proc/net/tcp{,6} stuff. From davem@davemloft.net Wed Nov 3 13:01:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:01:30 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3L1PCb011649 for ; Wed, 3 Nov 2004 13:01:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPS5O-0001qz-00; Wed, 03 Nov 2004 12:50:30 -0800 Date: Wed, 3 Nov 2004 12:50:30 -0800 From: "David S. Miller" To: Tommy Christensen Cc: herbert@gondor.apana.org.au, mingo@elte.hu, netdev@oss.sgi.com Subject: Re: [NET] Move local_bh_disable back in dev_queue_xmit Message-Id: <20041103125030.211d9833.davem@davemloft.net> In-Reply-To: <4188EFD1.4050909@tpack.net> References: <20041102225406.GA13760@gondor.apana.org.au> <4188EFD1.4050909@tpack.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11397 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 548 Lines: 17 On Wed, 03 Nov 2004 15:48:49 +0100 Tommy Christensen wrote: > Herbert Xu wrote: > > Hi Ingo: > > > > Your recent fix to dev_queue_xmit moved the local_bh_disable to > > include stuff like skb_linearize and skb_checksum_help. These > > are potentially expensive operations. Since they don't need to > > run with preempt off, we could simply move the local_bh_enable > > up instead. > > No, this breaks the normal return path. > > How about this instead? Yep, this one is better. Patch applied, thanks everyone. From herbert@gondor.apana.org.au Wed Nov 3 13:09:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:10:02 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3L9rUl012149 for ; Wed, 3 Nov 2004 13:09:54 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPSNf-0007r4-00; Thu, 04 Nov 2004 08:09:23 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPSNY-0006fe-00; Thu, 04 Nov 2004 08:09:16 +1100 From: Herbert Xu To: tommy.christensen@tpack.net (Tommy Christensen) Subject: Re: [NET] Move local_bh_disable back in dev_queue_xmit Cc: herbert@gondor.apana.org.au, davem@davemloft.net, mingo@elte.hu, netdev@oss.sgi.com Organization: Core In-Reply-To: <4188EFD1.4050909@tpack.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Thu, 04 Nov 2004 08:09:16 +1100 X-archive-position: 11398 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 377 Lines: 12 Tommy Christensen wrote: > > No, this breaks the normal return path. > > How about this instead? Thanks, your patch looks much better. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From shemminger@osdl.org Wed Nov 3 13:19:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:19:15 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3LJ9XR012618 for ; Wed, 3 Nov 2004 13:19:09 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iA3LIkPE021844 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 3 Nov 2004 13:18:46 -0800 Date: Wed, 3 Nov 2004 13:20:46 -0800 From: Stephen Hemminger To: Mitchell Blank Jr Cc: "David S. Miller" , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: [PATCH] UDP select handling of bad checksums. Message-Id: <20041103132046.02061e54@zqx3.pdx.osdl.net> In-Reply-To: <20041103005253.GA77817@gaz.sfgoth.com> References: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> <20041103005253.GA77817@gaz.sfgoth.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11399 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 743 Lines: 19 On Tue, 2 Nov 2004 16:52:53 -0800 Mitchell Blank Jr wrote: > Stephen Hemminger wrote: > > This patch addresses the issue of blocking usage of select() by UDP applications. > > I'm glad to see someone actually putting some code forward in this debate... > Looks pretty good, but can't you implement this a bit cleaner by just > wrapping datagram_poll? Something like: But the wrapper was bigger and uglier than just doing it. Especially since UDP doesn't need to connection oriented checks. So the fast path code in UDP is actually faster than datagram_poll. > > That way you duplicate a lot less code. It does slightly more work but > only in the broken !O_NONBLOCK case - the fast path is just as quick. > > -Mitch From tgraf@suug.ch Wed Nov 3 13:58:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:58:22 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3LwEEf013700 for ; Wed, 3 Nov 2004 13:58:15 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 95F7FF; Wed, 3 Nov 2004 22:57:33 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 5EDE01C0E9; Wed, 3 Nov 2004 22:58:16 +0100 (CET) Date: Wed, 3 Nov 2004 22:58:16 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCHSET 0/8] PKT_SCHED: Use gnet_stats for actions and policer Message-ID: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 11400 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 497 Lines: 15 Dave, This is the last patchset in my attempt to clean up traffic control statistics. It converts the action and policer code to the gnet_stats API. I decided to not provide backward compatibility for action statistics and introduce a new TLV type TCA_ACT_STATS for them in order to get some consistency and be prepared if we ever introduce statistics to classifiers. This was approved by Jamal. Shall I mark the old estimator and statistic API as __deprecated or remove it right away? Cheers From tgraf@suug.ch Wed Nov 3 13:59:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:59:11 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3Lx3ag013794 for ; Wed, 3 Nov 2004 13:59:03 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 5E2F4F; Wed, 3 Nov 2004 22:58:24 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id C40D61C0E9; Wed, 3 Nov 2004 22:59:07 +0100 (CET) Date: Wed, 3 Nov 2004 22:59:07 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 1/8] tcf_action: copy generic stats via TCA_ACT_STATS Message-ID: <20041103215907.GB12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11401 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 3193 Lines: 107 Dumps the statistic common to all action modules via the newly introduced TLV type TCA_ACT_STATS in tcf_action_copy_stats but allows the corresponding module to dump its own statistic by implementing the get_stats callback. Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/include/linux/rtnetlink.h linux-2.6.10-rc1-bk11/include/linux/rtnetlink.h --- linux-2.6.10-rc1-bk11.orig/include/linux/rtnetlink.h 2004-11-02 11:43:04.000000000 +0100 +++ linux-2.6.10-rc1-bk11/include/linux/rtnetlink.h 2004-11-02 12:02:44.000000000 +0100 @@ -699,6 +699,7 @@ TCA_RATE, TCA_FCNT, TCA_STATS2, + TCA_ACT_STATS, __TCA_MAX }; diff -Nru linux-2.6.10-rc1-bk11.orig/include/net/act_api.h linux-2.6.10-rc1-bk11/include/net/act_api.h --- linux-2.6.10-rc1-bk11.orig/include/net/act_api.h 2004-11-02 11:43:07.000000000 +0100 +++ linux-2.6.10-rc1-bk11/include/net/act_api.h 2004-11-02 12:02:33.000000000 +0100 @@ -44,10 +44,16 @@ u32 capab; \ int action; \ struct tcf_t tm; \ - struct tc_stats stats; \ + struct gnet_stats_basic bstats; \ + struct gnet_stats_queue qstats; \ + struct gnet_stats_rate_est rate_est; \ spinlock_t *stats_lock; \ spinlock_t lock +struct tcf_act_hdr +{ + tca_gen(act_hdr); +}; struct tc_action { diff -Nru linux-2.6.10-rc1-bk11.orig/include/net/pkt_act.h linux-2.6.10-rc1-bk11/include/net/pkt_act.h --- linux-2.6.10-rc1-bk11.orig/include/net/pkt_act.h 2004-11-02 11:43:07.000000000 +0100 +++ linux-2.6.10-rc1-bk11/include/net/pkt_act.h 2004-11-02 12:03:01.000000000 +0100 @@ -60,7 +60,7 @@ *p1p = p->next; write_unlock_bh(&tcf_t_lock); #ifdef CONFIG_NET_ESTIMATOR - qdisc_kill_estimator(&p->stats); + gen_kill_estimator(&p->bstats, &p->rate_est); #endif kfree(p); return; @@ -256,9 +256,8 @@ p->tm.install = jiffies; p->tm.lastuse = jiffies; #ifdef CONFIG_NET_ESTIMATOR - if (est) { - qdisc_new_estimator(&p->stats, p->stats_lock, est); - } + if (est) + gen_new_estimator(&p->bstats, &p->rate_est, p->stats_lock, est); #endif h = tcf_hash(p->index); write_lock_bh(&tcf_t_lock); diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/act_api.c linux-2.6.10-rc1-bk11/net/sched/act_api.c --- linux-2.6.10-rc1-bk11.orig/net/sched/act_api.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/act_api.c 2004-11-02 12:06:02.000000000 +0100 @@ -416,14 +416,37 @@ int tcf_action_copy_stats (struct sk_buff *skb,struct tc_action *a) { + struct gnet_dump d; + struct tcf_act_hdr *h = a->priv; + #ifdef CONFIG_KMOD /* place holder */ #endif - if (NULL == a->ops || NULL == a->ops->get_stats) - return 1; + if (NULL == h) + goto errout; + + if (gnet_stats_start_copy(skb, TCA_ACT_STATS, h->stats_lock, &d) < 0) + goto errout; + + if (NULL != a->ops && NULL != a->ops->get_stats) + if (a->ops->get_stats(skb, a) < 0) + goto errout; + + if (gnet_stats_copy_basic(&d, &h->bstats) < 0 || +#ifdef CONFIG_NET_ESTIMATOR + gnet_stats_copy_rate_est(&d, &h->rate_est) < 0 || +#endif + gnet_stats_copy_queue(&d, &h->qstats) < 0) + goto errout; + + if (gnet_stats_finish_copy(&d) < 0) + goto errout; + + return 0; - return a->ops->get_stats(skb,a); +errout: + return -1; } From tgraf@suug.ch Wed Nov 3 13:59:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 13:59:47 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3Lxh5N014137 for ; Wed, 3 Nov 2004 13:59:44 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id D0226F; Wed, 3 Nov 2004 22:59:04 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 3CC341C0E9; Wed, 3 Nov 2004 22:59:48 +0100 (CET) Date: Wed, 3 Nov 2004 22:59:48 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 2/8] gact: use gnet_stats for action stats Message-ID: <20041103215948.GC12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11402 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1286 Lines: 54 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/gact.c linux-2.6.10-rc1-bk11/net/sched/gact.c --- linux-2.6.10-rc1-bk11.orig/net/sched/gact.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/gact.c 2004-11-02 12:10:39.000000000 +0100 @@ -62,7 +62,7 @@ int gact_determ(struct tcf_gact *p) { - if (p->stats.packets%p->pval) + if (p->bstats.packets%p->pval) return p->action; return p->paction; } @@ -163,10 +163,10 @@ #else action = p->action; #endif - p->stats.bytes += skb->len; - p->stats.packets++; + p->bstats.bytes += skb->len; + p->bstats.packets++; if (TC_ACT_SHOT == action) - p->stats.drops++; + p->qstats.drops++; p->tm.lastuse = jiffies; spin_unlock(&p->lock); @@ -214,17 +214,6 @@ return -1; } -int -tcf_gact_stats(struct sk_buff *skb, struct tc_action *a) -{ - struct tcf_gact *p; - p = PRIV(a,gact); - if (NULL != p) - return qdisc_copy_stats(skb, &p->stats,p->stats_lock); - - return 1; -} - struct tc_action_ops act_gact_ops = { .next = NULL, .kind = "gact", @@ -232,7 +221,6 @@ .capab = TCA_CAP_NONE, .owner = THIS_MODULE, .act = tcf_gact, - .get_stats = tcf_gact_stats, .dump = tcf_gact_dump, .cleanup = tcf_gact_cleanup, .lookup = tcf_hash_search, From tgraf@suug.ch Wed Nov 3 14:00:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:00:26 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M0L1V014646 for ; Wed, 3 Nov 2004 14:00:22 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id AEFC8F; Wed, 3 Nov 2004 22:59:42 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 1C8FD1C0E9; Wed, 3 Nov 2004 23:00:26 +0100 (CET) Date: Wed, 3 Nov 2004 23:00:26 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 3/8] ipt: use gnet_stats for action stats Message-ID: <20041103220026.GD12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11403 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1533 Lines: 63 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/ipt.c linux-2.6.10-rc1-bk11/net/sched/ipt.c --- linux-2.6.10-rc1-bk11.orig/net/sched/ipt.c 2004-11-02 11:59:44.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/ipt.c 2004-11-02 12:14:04.000000000 +0100 @@ -218,9 +218,8 @@ */ p->tm.install = jiffies; #ifdef CONFIG_NET_ESTIMATOR - if (est) { - qdisc_new_estimator(&p->stats, p->stats_lock, est); - } + if (est) + gen_new_estimator(&p->bstats, &p->rate_est, p->stats_lock, est); #endif h = tcf_hash(p->index); write_lock_bh(&ipt_lock); @@ -258,8 +257,8 @@ spin_lock(&p->lock); p->tm.lastuse = jiffies; - p->stats.bytes += skb->len; - p->stats.packets++; + p->bstats.bytes += skb->len; + p->bstats.packets++; if (skb_cloned(skb) ) { if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { @@ -278,7 +277,7 @@ break; case NF_DROP: result = TC_ACT_SHOT; - p->stats.drops++; + p->qstats.drops++; break; case IPT_CONTINUE: result = TC_ACT_PIPE; @@ -346,17 +345,6 @@ return -1; } -int -tcf_ipt_stats(struct sk_buff *skb, struct tc_action *a) -{ - struct tcf_ipt *p; - p = PRIV(a,ipt); - if (NULL != p) - return qdisc_copy_stats(skb, &p->stats, p->stats_lock); - - return 1; -} - struct tc_action_ops act_ipt_ops = { .next = NULL, .kind = "ipt", @@ -364,7 +352,6 @@ .capab = TCA_CAP_NONE, .owner = THIS_MODULE, .act = tcf_ipt, - .get_stats = tcf_ipt_stats, .dump = tcf_ipt_dump, .cleanup = tcf_ipt_cleanup, .lookup = tcf_hash_search, From tgraf@suug.ch Wed Nov 3 14:00:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:01:04 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M0xk6014986 for ; Wed, 3 Nov 2004 14:00:59 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 63D0FF; Wed, 3 Nov 2004 23:00:20 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id BE4991C0E9; Wed, 3 Nov 2004 23:01:03 +0100 (CET) Date: Wed, 3 Nov 2004 23:01:03 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 4/8] mirred: use gnet_stats for action stats Message-ID: <20041103220103.GE12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11404 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1473 Lines: 56 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/mirred.c linux-2.6.10-rc1-bk11/net/sched/mirred.c --- linux-2.6.10-rc1-bk11.orig/net/sched/mirred.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/mirred.c 2004-11-02 12:10:07.000000000 +0100 @@ -195,9 +195,9 @@ bad_mirred: if (NULL != skb2) kfree_skb(skb2); - p->stats.overlimits++; - p->stats.bytes += skb->len; - p->stats.packets++; + p->qstats.overlimits++; + p->bstats.bytes += skb->len; + p->bstats.packets++; spin_unlock(&p->lock); /* should we be asking for packet to be dropped? * may make sense for redirect case only @@ -216,8 +216,8 @@ goto bad_mirred; } - p->stats.bytes += skb2->len; - p->stats.packets++; + p->bstats.bytes += skb2->len; + p->bstats.packets++; if ( !(at & AT_EGRESS)) { if (p->ok_push) { skb_push(skb2, skb2->dev->hard_header_len); @@ -268,18 +268,6 @@ return -1; } -int -tcf_mirred_stats(struct sk_buff *skb, struct tc_action *a) -{ - struct tcf_mirred *p; - p = PRIV(a,mirred); - - if (NULL != p) - return qdisc_copy_stats(skb, &p->stats, p->stats_lock); - - return 1; -} - static struct tc_action_ops act_mirred_ops = { .next = NULL, .kind = "mirred", @@ -287,7 +275,6 @@ .capab = TCA_CAP_NONE, .owner = THIS_MODULE, .act = tcf_mirred, - .get_stats = tcf_mirred_stats, .dump = tcf_mirred_dump, .cleanup = tcf_mirred_cleanup, .lookup = tcf_hash_search, From tgraf@suug.ch Wed Nov 3 14:01:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:01:33 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M1SHj015222 for ; Wed, 3 Nov 2004 14:01:29 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id BACF9F; Wed, 3 Nov 2004 23:00:49 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 25BBE1C0E9; Wed, 3 Nov 2004 23:01:33 +0100 (CET) Date: Wed, 3 Nov 2004 23:01:33 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 5/8] pedit: use gnet_stats for action stats Message-ID: <20041103220133.GF12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11405 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1076 Lines: 45 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/pedit.c linux-2.6.10-rc1-bk11/net/sched/pedit.c --- linux-2.6.10-rc1-bk11.orig/net/sched/pedit.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/pedit.c 2004-11-02 12:11:11.000000000 +0100 @@ -183,10 +183,10 @@ } bad: - p->stats.overlimits++; + p->qstats.overlimits++; done: - p->stats.bytes += skb->len; - p->stats.packets++; + p->bstats.bytes += skb->len; + p->bstats.packets++; spin_unlock(&p->lock); return p->action; } @@ -255,17 +255,6 @@ return -1; } -int -tcf_pedit_stats(struct sk_buff *skb, struct tc_action *a) -{ - struct tcf_pedit *p; - p = PRIV(a,pedit); - if (NULL != p) - return qdisc_copy_stats(skb, &p->stats, p->stats_lock); - - return 1; -} - static struct tc_action_ops act_pedit_ops = { .kind = "pedit", @@ -273,7 +262,6 @@ .capab = TCA_CAP_NONE, .owner = THIS_MODULE, .act = tcf_pedit, - .get_stats = tcf_pedit_stats, .dump = tcf_pedit_dump, .cleanup = tcf_pedit_cleanup, .lookup = tcf_hash_search, From tgraf@suug.ch Wed Nov 3 14:01:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:02:02 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M1vY6015546 for ; Wed, 3 Nov 2004 14:01:57 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 79F0AF; Wed, 3 Nov 2004 23:01:18 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id DC1751C0E9; Wed, 3 Nov 2004 23:02:01 +0100 (CET) Date: Wed, 3 Nov 2004 23:02:01 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 6/8] police: use gnet_stats for action policer stats Message-ID: <20041103220201.GG12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11406 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1713 Lines: 65 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/police.c linux-2.6.10-rc1-bk11/net/sched/police.c --- linux-2.6.10-rc1-bk11.orig/net/sched/police.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/police.c 2004-11-02 13:54:14.000000000 +0100 @@ -245,7 +245,7 @@ p->index = parm->index ? : tcf_police_new_index(); #ifdef CONFIG_NET_ESTIMATOR if (est) - qdisc_new_estimator(&p->stats, p->stats_lock, est); + gen_new_estimator(&p->bstats, &p->rate_est, p->stats_lock, est); #endif h = tcf_police_hash(p->index); write_lock_bh(&police_lock); @@ -275,16 +275,6 @@ return 0; } -int tcf_act_police_stats(struct sk_buff *skb, struct tc_action *a) -{ - struct tcf_police *p; - p = PRIV(a); - if (NULL != p) - return qdisc_copy_stats(skb, &p->stats, p->stats_lock); - - return 1; -} - int tcf_act_police(struct sk_buff **pskb, struct tc_action *a) { psched_time_t now; @@ -302,12 +292,12 @@ spin_lock(&p->lock); - p->stats.bytes += skb->len; - p->stats.packets++; + p->bstats.bytes += skb->len; + p->bstats.packets++; #ifdef CONFIG_NET_ESTIMATOR - if (p->ewma_rate && p->stats.bps >= p->ewma_rate) { - p->stats.overlimits++; + if (p->ewma_rate && p->rate_est.bps >= p->ewma_rate) { + p->qstats.overlimits++; spin_unlock(&p->lock); return p->action; } @@ -343,7 +333,7 @@ } } - p->stats.overlimits++; + p->qstats.overlimits++; spin_unlock(&p->lock); return p->action; } @@ -400,7 +390,6 @@ .capab = TCA_CAP_NONE, .owner = THIS_MODULE, .act = tcf_act_police, - .get_stats = tcf_act_police_stats, .dump = tcf_act_police_dump, .cleanup = tcf_act_police_cleanup, .lookup = tcf_hash_search, From tgraf@suug.ch Wed Nov 3 14:02:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:02:38 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M2Vac015922 for ; Wed, 3 Nov 2004 14:02:32 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id CD20BF; Wed, 3 Nov 2004 23:01:52 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 407EE1C0E9; Wed, 3 Nov 2004 23:02:36 +0100 (CET) Date: Wed, 3 Nov 2004 23:02:36 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 7/8] police: use gnet_stats for old policer stats Message-ID: <20041103220236.GH12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11407 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 3248 Lines: 110 Transforms old policer to use generic statistic via TCA_STATS2 and maintain backward compatibility via TCA_STATS. Adds a new API for classifiers to invoke the dumping process. Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk13.orig/include/net/act_api.h linux-2.6.10-rc1-bk13/include/net/act_api.h --- linux-2.6.10-rc1-bk13.orig/include/net/act_api.h 2004-11-03 17:04:58.000000000 +0100 +++ linux-2.6.10-rc1-bk13/include/net/act_api.h 2004-11-03 17:04:44.000000000 +0100 @@ -28,7 +28,9 @@ struct qdisc_rate_table *R_tab; struct qdisc_rate_table *P_tab; - struct tc_stats stats; + struct gnet_stats_basic bstats; + struct gnet_stats_queue qstats; + struct gnet_stats_rate_est rate_est; spinlock_t *stats_lock; }; @@ -101,6 +103,7 @@ extern void tcf_police_destroy(struct tcf_police *p); extern struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est); extern int tcf_police_dump(struct sk_buff *skb, struct tcf_police *p); +extern int tcf_police_dump_stats(struct sk_buff *skb, struct tcf_police *p); static inline int tcf_police_release(struct tcf_police *p, int bind) diff -Nru linux-2.6.10-rc1-bk13.orig/net/sched/police.c linux-2.6.10-rc1-bk13/net/sched/police.c --- linux-2.6.10-rc1-bk13.orig/net/sched/police.c 2004-11-03 17:05:10.000000000 +0100 +++ linux-2.6.10-rc1-bk13/net/sched/police.c 2004-11-03 17:04:44.000000000 +0100 @@ -149,7 +149,7 @@ *p1p = p->next; write_unlock_bh(&police_lock); #ifdef CONFIG_NET_ESTIMATOR - qdisc_kill_estimator(&p->stats); + gen_kill_estimator(&p->bstats, &p->rate_est); #endif if (p->R_tab) qdisc_put_rtab(p->R_tab); @@ -469,7 +469,7 @@ p->action = parm->action; #ifdef CONFIG_NET_ESTIMATOR if (est) - qdisc_new_estimator(&p->stats, p->stats_lock, est); + gen_new_estimator(&p->bstats, &p->rate_est, p->stats_lock, est); #endif h = tcf_police_hash(p->index); write_lock_bh(&police_lock); @@ -493,12 +493,12 @@ spin_lock(&p->lock); - p->stats.bytes += skb->len; - p->stats.packets++; + p->bstats.bytes += skb->len; + p->bstats.packets++; #ifdef CONFIG_NET_ESTIMATOR - if (p->ewma_rate && p->stats.bps >= p->ewma_rate) { - p->stats.overlimits++; + if (p->ewma_rate && p->rate_est.bps >= p->ewma_rate) { + p->qstats.overlimits++; spin_unlock(&p->lock); return p->action; } @@ -534,7 +534,7 @@ } } - p->stats.overlimits++; + p->qstats.overlimits++; spin_unlock(&p->lock); return p->action; } @@ -570,9 +570,34 @@ return -1; } +int tcf_police_dump_stats(struct sk_buff *skb, struct tcf_police *p) +{ + struct gnet_dump d; + + if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, + TCA_XSTATS, p->stats_lock, &d) < 0) + + if (gnet_stats_copy_basic(&d, &p->bstats) < 0 || +#ifdef CONFIG_NET_ESTIMATOR + gnet_stats_copy_rate_est(&d, &p->rate_est) < 0 || +#endif + gnet_stats_copy_queue(&d, &p->qstats) < 0) + goto errout; + + if (gnet_stats_finish_copy(&d) < 0) + goto errout; + + return 0; + +errout: + return -1; +} + + EXPORT_SYMBOL(tcf_police); EXPORT_SYMBOL(tcf_police_destroy); EXPORT_SYMBOL(tcf_police_dump); +EXPORT_SYMBOL(tcf_police_dump_stats); EXPORT_SYMBOL(tcf_police_hash); EXPORT_SYMBOL(tcf_police_ht); EXPORT_SYMBOL(tcf_police_locate); From tgraf@suug.ch Wed Nov 3 14:03:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:03:12 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3M36xD016253 for ; Wed, 3 Nov 2004 14:03:07 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id EB514F; Wed, 3 Nov 2004 23:02:27 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 380421C0E9; Wed, 3 Nov 2004 23:03:11 +0100 (CET) Date: Wed, 3 Nov 2004 23:03:11 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: [PATCH 8/8] cls_*: use tcf_police_dump_stats to dump via new gnet_stats API Message-ID: <20041103220311.GI12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103215816.GA12289@postel.suug.ch> X-archive-position: 11408 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 2456 Lines: 70 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/cls_fw.c linux-2.6.10-rc1-bk11/net/sched/cls_fw.c --- linux-2.6.10-rc1-bk11.orig/net/sched/cls_fw.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/cls_fw.c 2004-11-02 13:53:52.000000000 +0100 @@ -395,11 +395,9 @@ } #else /* CONFIG_NET_CLS_ACT */ #ifdef CONFIG_NET_CLS_POLICE - if (f->police) { - if (qdisc_copy_stats(skb, &f->police->stats, - f->police->stats_lock)) + if (f->police) + if (tcf_police_dump_stats(skb, f->police) < 0) goto rtattr_failure; - } #endif /* CONFIG_NET_CLS_POLICE */ #endif /* CONFIG_NET_CLS_ACT */ return skb->len; diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/cls_route.c linux-2.6.10-rc1-bk11/net/sched/cls_route.c --- linux-2.6.10-rc1-bk11.orig/net/sched/cls_route.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/cls_route.c 2004-11-02 13:53:52.000000000 +0100 @@ -566,11 +566,9 @@ rta->rta_len = skb->tail - b; #ifdef CONFIG_NET_CLS_POLICE - if (f->police) { - if (qdisc_copy_stats(skb, &f->police->stats, - f->police->stats_lock)) + if (f->police) + if (tcf_police_dump_stats(skb, f->police) < 0) goto rtattr_failure; - } #endif return skb->len; diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/cls_rsvp.h linux-2.6.10-rc1-bk11/net/sched/cls_rsvp.h --- linux-2.6.10-rc1-bk11.orig/net/sched/cls_rsvp.h 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/cls_rsvp.h 2004-11-02 13:53:52.000000000 +0100 @@ -631,11 +631,9 @@ rta->rta_len = skb->tail - b; #ifdef CONFIG_NET_CLS_POLICE - if (f->police) { - if (qdisc_copy_stats(skb, &f->police->stats, - f->police->stats_lock)) + if (f->police) + if (tcf_police_dump_stats(skb, f->police) < 0) goto rtattr_failure; - } #endif return skb->len; diff -Nru linux-2.6.10-rc1-bk11.orig/net/sched/cls_u32.c linux-2.6.10-rc1-bk11/net/sched/cls_u32.c --- linux-2.6.10-rc1-bk11.orig/net/sched/cls_u32.c 2004-11-02 11:43:27.000000000 +0100 +++ linux-2.6.10-rc1-bk11/net/sched/cls_u32.c 2004-11-02 13:53:52.000000000 +0100 @@ -775,11 +775,9 @@ } #else #ifdef CONFIG_NET_CLS_POLICE - if (TC_U32_KEY(n->handle) && n->police) { - if (qdisc_copy_stats(skb, &n->police->stats, - n->police->stats_lock)) + if (TC_U32_KEY(n->handle) && n->police) + if (tcf_police_dump_stats(skb, n->police) < 0) goto rtattr_failure; - } #endif #endif return skb->len; From davem@davemloft.net Wed Nov 3 14:29:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 14:29:14 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3MT7BM017369 for ; Wed, 3 Nov 2004 14:29:08 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPTSO-0001zL-00; Wed, 03 Nov 2004 14:18:20 -0800 Date: Wed, 3 Nov 2004 14:18:20 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: Re: [PATCHSET 0/8] PKT_SCHED: Use gnet_stats for actions and policer Message-Id: <20041103141820.7a0c7832.davem@davemloft.net> In-Reply-To: <20041103215816.GA12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11409 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 683 Lines: 19 On Wed, 3 Nov 2004 22:58:16 +0100 Thomas Graf wrote: > This is the last patchset in my attempt to clean up traffic > control statistics. It converts the action and policer code > to the gnet_stats API. > > I decided to not provide backward compatibility for action > statistics and introduce a new TLV type TCA_ACT_STATS for them > in order to get some consistency and be prepared if we ever > introduce statistics to classifiers. This was approved by Jamal. All applied, very nice work Thomas. > Shall I mark the old estimator and statistic API as __deprecated > or remove it right away? Since nothing in the tree uses it any more, let's just kill it outright. From linux-netdev@gmane.org Wed Nov 3 15:33:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 15:33:32 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.229.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA3NXOgn019379 for ; Wed, 3 Nov 2004 15:33:25 -0800 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 1CPUck-0007B6-00 for ; Thu, 04 Nov 2004 00:33:06 +0100 Received: from lan-outside.tiba.com ([200.61.64.36]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 04 Nov 2004 00:33:06 +0100 Received: from javier by lan-outside.tiba.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 04 Nov 2004 00:33:06 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com From: Javier Szyszlican Subject: Outbound IPIP Tunnel Packets not shaped/policed Date: Wed, 03 Nov 2004 20:36:14 -0300 Organization: TIBA Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@sea.gmane.org X-Gmane-NNTP-Posting-Host: lan-outside.tiba.com User-Agent: Mozilla Thunderbird 0.8 (X11/20040921) X-Accept-Language: en-us, en X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime X-archive-position: 11410 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: javier@szysz.com Precedence: bulk X-list: netdev Content-Length: 1633 Lines: 55 Hi, I've a gateway host (cali), connected to the Internet via ADSL and a PPTP tunnel (ppp0). I also have a IPIP tunnel to another host over the Internet (mytun). I want to give more priority to the IPIP packets coming OUT of the PPP (PPTP connection) interface. And I can't get this to work. Class 2:21 is the one with high priority. FILTERS: filter parent 2: protocol ip pref 1 fw filter parent 2: protocol ip pref 1 fw handle 0x1 classid 2:21 CLASS Stats: class htb 2:21 parent 2:1 prio 1 rate 96Kbit ceil 128Kbit burst 1721b cburst 1762b Sent 0 bytes 0 pkts (dropped 0, overlimits 0) lended: 0 borrowed: 0 giants: 0 tokens: 218962 ctokens: 168131 As you can see no packets have gone out of this class. IPTABLES RULES (mangle table): Chain OUTPUT (policy ACCEPT 794K packets, 111M bytes) pkts bytes target prot opt in out source destination 4984 377K mark.4 4 -- * * 0.0.0.0/0 0.0.0.0/0 Chain mark.4 (1 references) pkts bytes target prot opt in out source destination 4984 377K MARK all -- * * 0.0.0.0/0 0.0.0.0/0 MARK set 0x1 But you can see that iptables is marking the packets correctly (the counters were reset at the same time). So, I'm guessing that the IPIP packets generated by the kernel, are not going into the packet scheduling routines/functions. If someone can point me to the place where this should be occurring, it will be great. I'm using Kernel 2.6.9 (2.6.8 did the same thing). Thanks. Javier -- -=-=-=-=-=-=-=-=- Javier Szyszlican javier@^^^^^.com From davem@davemloft.net Wed Nov 3 16:02:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:02:29 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA402LUx020253 for ; Wed, 3 Nov 2004 16:02:21 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPUrh-0002Av-00; Wed, 03 Nov 2004 15:48:33 -0800 Date: Wed, 3 Nov 2004 15:48:33 -0800 From: "David S. Miller" To: Pablo Neira Cc: netdev@oss.sgi.com, davem@redhat.com, herbert@gondor.apana.org.au Subject: Re: [NETLINK] introduce netlink bucket Message-Id: <20041103154833.164e33f5.davem@davemloft.net> In-Reply-To: <4187FF18.5050608@eurodev.net> References: <4187FF18.5050608@eurodev.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11411 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 16499 Lines: 737 On Tue, 02 Nov 2004 22:41:44 +0100 Pablo Neira wrote: > This patch introduces the netlink bucket struct, it joins three arrays > into an array of netlink bucket. > > Signed-off-by: Pablo Neira Ayuso Here is the work Herbert and I were talking about. It kind of makes your patch taken care of already :-) Herbert, this is what I actually checked into my tree. If you could cook up a 2.4.x version, that would be really great. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/03 15:34:53-08:00 herbert@gondor.apana.org.au # [NETLINK]: Hash sockets by pid if not multicast. # # Collaborative work between David S. Miller and # Herbert Xu. # # Signed-off-by: Herbert Xu # Signed-off-by: David S. Miller # # net/netlink/af_netlink.c # 2004/11/03 15:33:45-08:00 herbert@gondor.apana.org.au +374 -109 # [NETLINK]: Hash sockets by pid if not multicast. # diff -Nru a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c --- a/net/netlink/af_netlink.c 2004-11-03 15:35:38 -08:00 +++ b/net/netlink/af_netlink.c 2004-11-03 15:35:38 -08:00 @@ -44,6 +44,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include #include @@ -56,9 +62,9 @@ struct netlink_opt { u32 pid; - unsigned groups; + unsigned int groups; u32 dst_pid; - unsigned dst_groups; + unsigned int dst_groups; unsigned long state; int (*handler)(int unit, struct sk_buff *skb); wait_queue_head_t wait; @@ -69,9 +75,28 @@ #define nlk_sk(__sk) ((struct netlink_opt *)(__sk)->sk_protinfo) -static struct hlist_head nl_table[MAX_LINKS]; +struct nl_pid_hash { + struct hlist_head *table; + unsigned long rehash_time; + + unsigned int mask; + unsigned int shift; + + unsigned int entries; + unsigned int max_shift; + + u32 rnd; +}; + +struct netlink_table { + struct nl_pid_hash hash; + struct hlist_head mc_list; +}; + +static struct netlink_table *nl_table; + static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait); -static unsigned nl_nonroot[MAX_LINKS]; +static unsigned int nl_nonroot[MAX_LINKS]; #ifdef NL_EMULATE_DEV static struct socket *netlink_kernel[MAX_LINKS]; @@ -85,6 +110,11 @@ static struct notifier_block *netlink_chain; +static struct hlist_head *nl_pid_hashfn(struct nl_pid_hash *hash, u32 pid) +{ + return &hash->table[jhash_1word(pid, hash->rnd) & hash->mask]; +} + static void netlink_sock_destruct(struct sock *sk) { skb_queue_purge(&sk->sk_receive_queue); @@ -153,11 +183,14 @@ static __inline__ struct sock *netlink_lookup(int protocol, u32 pid) { + struct nl_pid_hash *hash = &nl_table[protocol].hash; + struct hlist_head *head; struct sock *sk; struct hlist_node *node; read_lock(&nl_table_lock); - sk_for_each(sk, node, &nl_table[protocol]) { + head = nl_pid_hashfn(hash, pid); + sk_for_each(sk, node, head) { if (nlk_sk(sk)->pid == pid) { sock_hold(sk); goto found; @@ -169,27 +202,118 @@ return sk; } +static inline struct hlist_head *nl_pid_hash_alloc(size_t size) +{ + if (size <= PAGE_SIZE) + return kmalloc(size, GFP_ATOMIC); + else + return (struct hlist_head *) + __get_free_pages(GFP_ATOMIC, get_order(size)); +} + +static inline void nl_pid_hash_free(struct hlist_head *table, size_t size) +{ + if (size <= PAGE_SIZE) + kfree(table); + else + free_pages((unsigned long)table, get_order(size)); +} + +static int nl_pid_hash_rehash(struct nl_pid_hash *hash, int grow) +{ + unsigned int omask, mask, shift; + size_t osize, size; + struct hlist_head *otable, *table; + int i; + + omask = mask = hash->mask; + osize = size = (mask + 1) * sizeof(*table); + shift = hash->shift; + + if (grow) { + if (++shift > hash->max_shift) + return 0; + mask = mask * 2 + 1; + size *= 2; + } + + table = nl_pid_hash_alloc(size); + if (!table) + return 0; + + memset(table, 0, size); + otable = hash->table; + hash->table = table; + hash->mask = mask; + hash->shift = shift; + get_random_bytes(&hash->rnd, sizeof(hash->rnd)); + + for (i = 0; i <= omask; i++) { + struct sock *sk; + struct hlist_node *node, *tmp; + + sk_for_each_safe(sk, node, tmp, &otable[i]) + __sk_add_node(sk, nl_pid_hashfn(hash, nlk_sk(sk)->pid)); + } + + nl_pid_hash_free(otable, osize); + hash->rehash_time = jiffies + 10 * 60 * HZ; + return 1; +} + +static inline int nl_pid_hash_dilute(struct nl_pid_hash *hash, int len) +{ + int avg = hash->entries >> hash->shift; + + if (unlikely(avg > 1) && nl_pid_hash_rehash(hash, 1)) + return 1; + + if (unlikely(len > avg) && time_after(jiffies, hash->rehash_time)) { + nl_pid_hash_rehash(hash, 0); + return 1; + } + + return 0; +} + static struct proto_ops netlink_ops; static int netlink_insert(struct sock *sk, u32 pid) { + struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; + struct hlist_head *head; int err = -EADDRINUSE; struct sock *osk; struct hlist_node *node; + int len; netlink_table_grab(); - sk_for_each(osk, node, &nl_table[sk->sk_protocol]) { + head = nl_pid_hashfn(hash, pid); + len = 0; + sk_for_each(osk, node, head) { if (nlk_sk(osk)->pid == pid) break; + len++; } - if (!node) { - err = -EBUSY; - if (nlk_sk(sk)->pid == 0) { - nlk_sk(sk)->pid = pid; - sk_add_node(sk, &nl_table[sk->sk_protocol]); - err = 0; - } - } + if (node) + goto err; + + err = -EBUSY; + if (nlk_sk(sk)->pid) + goto err; + + err = -ENOMEM; + if (BITS_PER_LONG > 32 && unlikely(hash->entries >= UINT_MAX)) + goto err; + + if (len && nl_pid_hash_dilute(hash, len)) + head = nl_pid_hashfn(hash, pid); + hash->entries++; + nlk_sk(sk)->pid = pid; + sk_add_node(sk, head); + err = 0; + +err: netlink_table_ungrab(); return err; } @@ -197,7 +321,10 @@ static void netlink_remove(struct sock *sk) { netlink_table_grab(); + nl_table[sk->sk_protocol].hash.entries--; sk_del_node_init(sk); + if (nlk_sk(sk)->groups) + __sk_del_bind_node(sk); netlink_table_ungrab(); } @@ -282,19 +409,25 @@ static int netlink_autobind(struct socket *sock) { struct sock *sk = sock->sk; + struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; + struct hlist_head *head; struct sock *osk; struct hlist_node *node; s32 pid = current->pid; int err; + static s32 rover = -4097; retry: + cond_resched(); netlink_table_grab(); - sk_for_each(osk, node, &nl_table[sk->sk_protocol]) { + head = nl_pid_hashfn(hash, pid); + sk_for_each(osk, node, head) { if (nlk_sk(osk)->pid == pid) { /* Bind collision, search negative pid values. */ if (pid > 0) - pid = -4096; - pid--; + pid = rover; + else if (--pid > 0) + pid = -4097; netlink_table_ungrab(); goto retry; } @@ -308,7 +441,7 @@ return 0; } -static inline int netlink_capable(struct socket *sock, unsigned flag) +static inline int netlink_capable(struct socket *sock, unsigned int flag) { return (nl_nonroot[sock->sk->sk_protocol] & flag) || capable(CAP_NET_ADMIN); @@ -331,21 +464,19 @@ if (nlk->pid) { if (nladdr->nl_pid != nlk->pid) return -EINVAL; - nlk->groups = nladdr->nl_groups; - return 0; + } else { + err = nladdr->nl_pid ? + netlink_insert(sk, nladdr->nl_pid) : + netlink_autobind(sock); + if (err) + return err; } - if (nladdr->nl_pid == 0) { - err = netlink_autobind(sock); - if (err == 0) - nlk->groups = nladdr->nl_groups; - return err; - } + nlk->groups = nladdr->nl_groups; + if (nladdr->nl_groups) + sk_add_bind_node(sk, &nl_table[sk->sk_protocol].mc_list); - err = netlink_insert(sk, nladdr->nl_pid); - if (err == 0) - nlk->groups = nladdr->nl_groups; - return err; + return 0; } static int netlink_connect(struct socket *sock, struct sockaddr *addr, @@ -590,16 +721,76 @@ return -1; } +struct netlink_broadcast_data { + struct sock *exclude_sk; + u32 pid; + u32 group; + int failure; + int congested; + int delivered; + int allocation; + struct sk_buff *skb, *skb2; +}; + +static inline int do_one_broadcast(struct sock *sk, + struct netlink_broadcast_data *p) +{ + struct netlink_opt *nlk = nlk_sk(sk); + int val; + + if (p->exclude_sk == sk) + goto out; + + if (nlk->pid == p->pid || !(nlk->groups & p->group)) + goto out; + + if (p->failure) { + netlink_overrun(sk); + goto out; + } + + sock_hold(sk); + if (p->skb2 == NULL) { + if (atomic_read(&p->skb->users) != 1) { + p->skb2 = skb_clone(p->skb, p->allocation); + } else { + p->skb2 = p->skb; + atomic_inc(&p->skb->users); + } + } + if (p->skb2 == NULL) { + netlink_overrun(sk); + /* Clone failed. Notify ALL listeners. */ + p->failure = 1; + } else if ((val = netlink_broadcast_deliver(sk, p->skb2)) < 0) { + netlink_overrun(sk); + } else { + p->congested |= val; + p->delivered = 1; + p->skb2 = NULL; + } + sock_put(sk); + +out: + return 0; +} + int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, u32 group, int allocation) { - struct sock *sk; + struct netlink_broadcast_data info; struct hlist_node *node; - struct sk_buff *skb2 = NULL; - int protocol = ssk->sk_protocol; - int failure = 0, delivered = 0; - int congested = 0; - int val; + struct sock *sk; + + info.exclude_sk = ssk; + info.pid = pid; + info.group = group; + info.failure = 0; + info.congested = 0; + info.delivered = 0; + info.allocation = allocation; + info.skb = skb; + info.skb2 = NULL; netlink_trim(skb, allocation); @@ -607,77 +798,65 @@ netlink_lock_table(); - sk_for_each(sk, node, &nl_table[protocol]) { - struct netlink_opt *nlk = nlk_sk(sk); - - if (ssk == sk) - continue; - - if (nlk->pid == pid || !(nlk->groups & group)) - continue; - - if (failure) { - netlink_overrun(sk); - continue; - } - - sock_hold(sk); - if (skb2 == NULL) { - if (atomic_read(&skb->users) != 1) { - skb2 = skb_clone(skb, allocation); - } else { - skb2 = skb; - atomic_inc(&skb->users); - } - } - if (skb2 == NULL) { - netlink_overrun(sk); - /* Clone failed. Notify ALL listeners. */ - failure = 1; - } else if ((val = netlink_broadcast_deliver(sk, skb2)) < 0) { - netlink_overrun(sk); - } else { - congested |= val; - delivered = 1; - skb2 = NULL; - } - sock_put(sk); - } + sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list) + do_one_broadcast(sk, &info); netlink_unlock_table(); - if (skb2) - kfree_skb(skb2); + if (info.skb2) + kfree_skb(info.skb2); kfree_skb(skb); - if (delivered) { - if (congested && (allocation & __GFP_WAIT)) + if (info.delivered) { + if (info.congested && (allocation & __GFP_WAIT)) yield(); return 0; } - if (failure) + if (info.failure) return -ENOBUFS; return -ESRCH; } +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 pid; + u32 group; + int code; +}; + +static inline int do_one_set_err(struct sock *sk, + struct netlink_set_err_data *p) +{ + struct netlink_opt *nlk = nlk_sk(sk); + + if (sk == p->exclude_sk) + goto out; + + if (nlk->pid == p->pid || !(nlk->groups & p->group)) + goto out; + + sk->sk_err = p->code; + sk->sk_error_report(sk); +out: + return 0; +} + void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) { - struct sock *sk; + struct netlink_set_err_data info; struct hlist_node *node; - int protocol = ssk->sk_protocol; + struct sock *sk; + + info.exclude_sk = ssk; + info.pid = pid; + info.group = group; + info.code = code; read_lock(&nl_table_lock); - sk_for_each(sk, node, &nl_table[protocol]) { - struct netlink_opt *nlk = nlk_sk(sk); - if (ssk == sk) - continue; - if (nlk->pid == pid || !(nlk->groups & group)) - continue; + sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list) + do_one_set_err(sk, &info); - sk->sk_err = code; - sk->sk_error_report(sk); - } read_unlock(&nl_table_lock); } @@ -853,6 +1032,9 @@ struct socket *sock; struct sock *sk; + if (!nl_table) + return NULL; + if (unit<0 || unit>=MAX_LINKS) return NULL; @@ -875,9 +1057,9 @@ return sk; } -void netlink_set_nonroot(int protocol, unsigned flags) +void netlink_set_nonroot(int protocol, unsigned int flags) { - if ((unsigned)protocol < MAX_LINKS) + if ((unsigned int)protocol < MAX_LINKS) nl_nonroot[protocol] = flags; } @@ -1070,20 +1252,31 @@ #endif #ifdef CONFIG_PROC_FS +struct nl_seq_iter { + int link; + int hash_idx; +}; + static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos) { - long i; + struct nl_seq_iter *iter = seq->private; + int i, j; struct sock *s; struct hlist_node *node; loff_t off = 0; for (i=0; iprivate = (void *) i; - return s; + struct nl_pid_hash *hash = &nl_table[i].hash; + + for (j = 0; j <= hash->mask; j++) { + sk_for_each(s, node, &hash->table[j]) { + if (off == pos) { + iter->link = i; + iter->hash_idx = j; + return s; + } + ++off; } - ++off; } } return NULL; @@ -1098,6 +1291,8 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos) { struct sock *s; + struct nl_seq_iter *iter; + int i, j; ++*pos; @@ -1105,18 +1300,29 @@ return netlink_seq_socket_idx(seq, 0); s = sk_next(v); - if (!s) { - long i = (long)seq->private; + if (s) + return s; + + iter = seq->private; + i = iter->link; + j = iter->hash_idx + 1; - while (++i < MAX_LINKS) { - s = sk_head(&nl_table[i]); + do { + struct nl_pid_hash *hash = &nl_table[i].hash; + + for (; j <= hash->mask; j++) { + s = sk_head(&hash->table[j]); if (s) { - seq->private = (void *) i; - break; + iter->link = i; + iter->hash_idx = j; + return s; } } - } - return s; + + j = 0; + } while (++i < MAX_LINKS); + + return NULL; } static void netlink_seq_stop(struct seq_file *seq, void *v) @@ -1160,7 +1366,24 @@ static int netlink_seq_open(struct inode *inode, struct file *file) { - return seq_open(file, &netlink_seq_ops); + struct seq_file *seq; + struct nl_seq_iter *iter; + int err; + + iter = kmalloc(sizeof(*iter), GFP_KERNEL); + if (!iter) + return -ENOMEM; + + err = seq_open(file, &netlink_seq_ops); + if (err) { + kfree(iter); + return err; + } + + memset(iter, 0, sizeof(*iter)); + seq = file->private_data; + seq->private = iter; + return 0; } static struct file_operations netlink_seq_fops = { @@ -1168,7 +1391,7 @@ .open = netlink_seq_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = seq_release_private, }; #endif @@ -1210,14 +1433,54 @@ .owner = THIS_MODULE, /* for consistency 8) */ }; +extern void netlink_skb_parms_too_large(void); + static int __init netlink_proto_init(void) { struct sk_buff *dummy_skb; + int i; + unsigned long max; + unsigned int order; + + if (sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb)) + netlink_skb_parms_too_large(); + + nl_table = kmalloc(sizeof(*nl_table) * MAX_LINKS, GFP_KERNEL); + if (!nl_table) { +enomem: + printk(KERN_CRIT "netlink_init: Cannot allocate nl_table\n"); + return -ENOMEM; + } + + memset(nl_table, 0, sizeof(*nl_table) * MAX_LINKS); - if (sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb)) { - printk(KERN_CRIT "netlink_init: panic\n"); - return -1; + if (num_physpages >= (128 * 1024)) + max = num_physpages >> (21 - PAGE_SHIFT); + else + max = num_physpages >> (23 - PAGE_SHIFT); + + order = get_bitmask_order(max) - 1 + PAGE_SHIFT; + max = (1UL << order) / sizeof(struct hlist_head); + order = get_bitmask_order(max > UINT_MAX ? UINT_MAX : max) - 1; + + for (i = 0; i < MAX_LINKS; i++) { + struct nl_pid_hash *hash = &nl_table[i].hash; + + hash->table = nl_pid_hash_alloc(1 * sizeof(*hash->table)); + if (!hash->table) { + while (i-- > 0) + nl_pid_hash_free(nl_table[i].hash.table, + 1 * sizeof(*hash->table)); + kfree(nl_table); + goto enomem; + } + memset(hash->table, 0, 1 * sizeof(*hash->table)); + hash->max_shift = order; + hash->shift = 0; + hash->mask = 0; + hash->rehash_time = jiffies; } + sock_register(&netlink_family_ops); #ifdef CONFIG_PROC_FS proc_net_fops_create("netlink", 0, &netlink_seq_fops); @@ -1231,6 +1494,8 @@ { sock_unregister(PF_NETLINK); proc_net_remove("netlink"); + kfree(nl_table); + nl_table = NULL; } core_initcall(netlink_proto_init); From davem@davemloft.net Wed Nov 3 16:05:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:05:31 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA405O9w020630 for ; Wed, 3 Nov 2004 16:05:24 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPUxa-0002Bj-00; Wed, 03 Nov 2004 15:54:38 -0800 Date: Wed, 3 Nov 2004 15:54:38 -0800 From: "David S. Miller" To: Herbert Xu Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-Id: <20041103155438.07a219ad.davem@davemloft.net> In-Reply-To: <20041102220603.GA13312@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041102220603.GA13312@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11412 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 674 Lines: 19 On Wed, 3 Nov 2004 09:06:03 +1100 Herbert Xu wrote: > On Wed, Nov 03, 2004 at 08:02:59AM +1100, herbert wrote: > > > > In fact, we can make it a bit more effective/fair by checking the > > previous entries count as well. > > Call me a flip-flop :) This extra check is silly because in the > cases where it is done it is very unlikely to succeed. So here > is yet another update without that check. > > Signed-off-by: Herbert Xu Applied. We can make the proposed atomic_inc_return() enhancement as a followon patch. Can you cook up a 2.4.x version of this Herbert? The new neighbour code is now there too. From jdmason@us.ibm.com Wed Nov 3 16:17:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:17:36 -0800 (PST) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40HKbo021141 for ; Wed, 3 Nov 2004 16:17:20 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA40Gb1p429856 for ; Wed, 3 Nov 2004 19:16:47 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA40GGaS085680 for ; Wed, 3 Nov 2004 17:16:17 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA40GFk4006137 for ; Wed, 3 Nov 2004 17:16:15 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA40GFEW006123; Wed, 3 Nov 2004 17:16:15 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: Re: [PATCH 2/3] r8169: Large Send enablement Date: Wed, 3 Nov 2004 18:16:11 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com, jgarzik@pobox.com References: <200411021203.22003.jdmason@us.ibm.com> <20041102191103.GA24860@electric-eye.fr.zoreil.com> In-Reply-To: <20041102191103.GA24860@electric-eye.fr.zoreil.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411031816.11675.jdmason@us.ibm.com> X-archive-position: 11413 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 1438 Lines: 40 On Tuesday 02 November 2004 01:11 pm, Francois Romieu wrote: [...] > - If rtl8169_open() fails [*] when the device was previously up, the driver > could/should try to recover. I disagree. It should fail, complain loudly, and let the user try and fix it (or return it to the previous state). The code provided below will act like it is successful in changing the MTU, even if it hits an error and is in the process of recovering. This will cause more difficult to diagnose problems. > Untested example below to clarify. > > [*] page allocation failure, bigger mtu/rx buffers -> I feel moderately > confortable. > > > diff -puN drivers/net/r8169.c~r8169-240 drivers/net/r8169.c > --- linux-2.6.9/drivers/net/r8169.c~r8169-240 2004-10-21 21:55:45.000000000 > +0200 +++ linux-2.6.9-fr/drivers/net/r8169.c 2004-11-01 23:10:25.000000000 > +0100 @@ -120,6 +120,8 @@ static int multicast_filter_limit = 32; > #define RX_BUF_SIZE 1536 /* Rx Buffer size */ > #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) > #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) > +#define R8169_MIN_MTU 8 > +#define R8169_MAX_MTU ((2 << 14) - 1) [...] > @@ -2223,6 +2247,72 @@ out: > return IRQ_RETVAL(handled); > } > > +static int rtl8169_set_rxbufsize(struct rtl8169_private *tp, int mtu) > +{ > + if (mtu < R8169_MIN_MTU || mtu > R8169_MAX_MTU) Is 8 really a valid MTU? -- Jon Mason jdmason@us.ibm.com From davem@davemloft.net Wed Nov 3 16:18:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:18:32 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40IPvD021438 for ; Wed, 3 Nov 2004 16:18:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPV9z-0002DI-00; Wed, 03 Nov 2004 16:07:27 -0800 Date: Wed, 3 Nov 2004 16:07:27 -0800 From: "David S. Miller" To: Herbert Xu Cc: Matt_Domsch@dell.com, hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-Id: <20041103160727.54dc0c15.davem@davemloft.net> In-Reply-To: <20041101220644.GA23903@gondor.apana.org.au> References: <20041030030936.GA25102@lists.us.dell.com> <1099163419.1039.97.camel@jzny.localdomain> <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> <1099345849.1073.1.camel@jzny.localdomain> <20041101215944.GB17279@lists.us.dell.com> <20041101220644.GA23903@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11415 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 567 Lines: 15 On Tue, 2 Nov 2004 09:06:44 +1100 Herbert Xu wrote: > On Mon, Nov 01, 2004 at 03:59:44PM -0600, Matt Domsch wrote: > > > > Actually, -EOVERFLOW appears throughout the kernel. A couple examples: > > I agree. Please disregard my comment re ERANGE. I think there is nothing wrong with clearing out the buffer for the !dev->addr_len case. This is not to say that what the apps are doing is correct or not, it merely preserves 2.4.x behavior which was changed unintentionally. I'm going to apply Matt's patch which began this thread. From jdmason@us.ibm.com Wed Nov 3 16:18:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:18:32 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40IDJP021373 for ; Wed, 3 Nov 2004 16:18:14 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA40HLJ8159458 for ; Wed, 3 Nov 2004 19:17:41 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA40HBaS141838 for ; Wed, 3 Nov 2004 17:17:11 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA40HAVO007311 for ; Wed, 3 Nov 2004 17:17:10 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA40H9CA007300; Wed, 3 Nov 2004 17:17:09 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: [PATCH] r8169: Large Send enablement, part 2 Date: Wed, 3 Nov 2004 18:17:06 -0600 User-Agent: KMail/1.6.2 Cc: netdev@oss.sgi.com, jgarzik@pobox.com References: <200411021203.22003.jdmason@us.ibm.com> <20041102191103.GA24860@electric-eye.fr.zoreil.com> In-Reply-To: <20041102191103.GA24860@electric-eye.fr.zoreil.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_CUXiBVwclKE1ew4" Message-Id: <200411031817.06629.jdmason@us.ibm.com> X-archive-position: 11414 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 12338 Lines: 403 --Boundary-00=_CUXiBVwclKE1ew4 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline I have tried to address all of the issues with the previous large send patch in the following patch (and I have confirmed it works on ppc64). --- r8169.c.orig 2004-11-02 11:01:02.000000000 -0600 +++ r8169.c 2004-11-03 17:58:49.830373784 -0600 @@ -85,10 +85,14 @@ VERSION 1.6LK <2004/04/14> #define rtl8169_rx_skb netif_receive_skb #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx #define rtl8169_rx_quota(count, quota) min(count, quota) +#define rtl8169_poll_disable(dev) netif_poll_disable(dev) +#define rtl8169_poll_enable(dev) netif_poll_enable(dev) #else #define rtl8169_rx_skb netif_rx #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb #define rtl8169_rx_quota(count, quota) count +#define rtl8169_poll_disable(dev) +#define rtl8169_poll_enable(dev) #endif /* media options */ @@ -112,14 +116,13 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */ +#define RxPacketMaxSize 0x3FFE /* Maximum size supported is 16K-1 */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 #define R8169_NAPI_WEIGHT 64 #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */ #define NUM_RX_DESC 256 /* Number of Rx descriptor registers */ -#define RX_BUF_SIZE 1536 /* Rx Buffer size */ #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) @@ -425,6 +428,9 @@ static void rtl8169_tx_timeout(struct ne static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); +static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu); +static int rtl8169_down(struct net_device *dev); + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget); #endif @@ -1237,8 +1243,6 @@ rtl8169_init_board(struct pci_dev *pdev, } tp->chipset = i; - tp->rx_buf_sz = RX_BUF_SIZE; - *ioaddr_out = ioaddr; *dev_out = dev; out: @@ -1320,6 +1324,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr; + dev->change_mtu = rtl8169_change_mtu; #ifdef CONFIG_R8169_NAPI dev->poll = rtl8169_poll; @@ -1455,6 +1460,8 @@ rtl8169_open(struct net_device *dev) struct pci_dev *pdev = tp->pci_dev; int retval; + tp->rx_buf_sz = dev->mtu + ETH_HLEN + 8; + retval = request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev); if (retval < 0) @@ -1534,8 +1541,8 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(EarlyTxThres, EarlyTxThld); - // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + // For gigabit rtl8169, MTU + header + CRC + VLAN + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1576,6 +1583,36 @@ rtl8169_hw_start(struct net_device *dev) netif_start_queue(dev); } +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + int retval; + + if (new_mtu < ETH_ZLEN || new_mtu > RxPacketMaxSize) + return -EINVAL; + + dev->mtu = new_mtu; + + if (!netif_running(dev)) + return 0; + + rtl8169_down(dev); + + tp->rx_buf_sz = new_mtu + ETH_HLEN + 8; + + retval = rtl8169_init_ring(dev); + if (retval < 0) + return retval; + + rtl8169_hw_start(dev); + + rtl8169_poll_enable(dev); + + rtl8169_request_timer(dev); + + return 0; +} + static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { desc->addr = 0x0badbadbadbadbadull; @@ -1745,7 +1782,7 @@ static void rtl8169_wait_for_quiescence( synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ - netif_poll_disable(dev); + rtl8169_poll_disable(dev); } static void rtl8169_reinit_task(void *_data) @@ -1785,6 +1822,7 @@ static void rtl8169_reset_task(void *_da rtl8169_init_ring_indexes(tp); rtl8169_hw_start(dev); netif_wake_queue(dev); + rtl8169_poll_enable(dev); } else { if (net_ratelimit()) { printk(PFX KERN_EMERG "%s: Rx buffers shortage\n", @@ -2255,19 +2293,17 @@ static int rtl8169_poll(struct net_devic } #endif -static int -rtl8169_close(struct net_device *dev) +static int rtl8169_down(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); - struct pci_dev *pdev = tp->pci_dev; void __iomem *ioaddr = tp->mmio_addr; + rtl8169_delete_timer(dev); + netif_stop_queue(dev); flush_scheduled_work(); - rtl8169_delete_timer(dev); - spin_lock_irq(&tp->lock); /* Stop the chip's Tx and Rx DMA processes. */ @@ -2282,14 +2318,30 @@ rtl8169_close(struct net_device *dev) spin_unlock_irq(&tp->lock); - free_irq(dev->irq, dev); + synchronize_irq(dev->irq); + + rtl8169_poll_disable(dev); - netif_poll_disable(dev); + /* Give a racing hard_start_xmit a few cycles to complete. */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); rtl8169_tx_clear(tp); rtl8169_rx_clear(tp); + return 0; +} + +static int rtl8169_close(struct net_device *dev) +{ + struct rtl8169_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + + rtl8169_down(dev); + + free_irq(dev->irq, dev); + pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, tp->RxPhyAddr); pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, --Boundary-00=_CUXiBVwclKE1ew4 Content-Type: text/x-diff; charset="iso-8859-1"; name="r8169-large-send.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="r8169-large-send.patch" --- r8169.c.orig 2004-11-02 11:01:02.000000000 -0600 +++ r8169.c 2004-11-03 17:58:49.830373784 -0600 @@ -85,10 +85,14 @@ VERSION 1.6LK <2004/04/14> #define rtl8169_rx_skb netif_receive_skb #define rtl8169_rx_hwaccel_skb vlan_hwaccel_rx #define rtl8169_rx_quota(count, quota) min(count, quota) +#define rtl8169_poll_disable(dev) netif_poll_disable(dev) +#define rtl8169_poll_enable(dev) netif_poll_enable(dev) #else #define rtl8169_rx_skb netif_rx #define rtl8169_rx_hwaccel_skb vlan_hwaccel_receive_skb #define rtl8169_rx_quota(count, quota) count +#define rtl8169_poll_disable(dev) +#define rtl8169_poll_enable(dev) #endif /* media options */ @@ -112,14 +116,13 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */ +#define RxPacketMaxSize 0x3FFE /* Maximum size supported is 16K-1 */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 #define R8169_NAPI_WEIGHT 64 #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */ #define NUM_RX_DESC 256 /* Number of Rx descriptor registers */ -#define RX_BUF_SIZE 1536 /* Rx Buffer size */ #define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) @@ -425,6 +428,9 @@ static void rtl8169_tx_timeout(struct ne static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); +static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu); +static int rtl8169_down(struct net_device *dev); + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget); #endif @@ -1237,8 +1243,6 @@ rtl8169_init_board(struct pci_dev *pdev, } tp->chipset = i; - tp->rx_buf_sz = RX_BUF_SIZE; - *ioaddr_out = ioaddr; *dev_out = dev; out: @@ -1320,6 +1324,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr; + dev->change_mtu = rtl8169_change_mtu; #ifdef CONFIG_R8169_NAPI dev->poll = rtl8169_poll; @@ -1455,6 +1460,8 @@ rtl8169_open(struct net_device *dev) struct pci_dev *pdev = tp->pci_dev; int retval; + tp->rx_buf_sz = dev->mtu + ETH_HLEN + 8; + retval = request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev); if (retval < 0) @@ -1534,8 +1541,8 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(EarlyTxThres, EarlyTxThld); - // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + // For gigabit rtl8169, MTU + header + CRC + VLAN + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1576,6 +1583,36 @@ rtl8169_hw_start(struct net_device *dev) netif_start_queue(dev); } +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + int retval; + + if (new_mtu < ETH_ZLEN || new_mtu > RxPacketMaxSize) + return -EINVAL; + + dev->mtu = new_mtu; + + if (!netif_running(dev)) + return 0; + + rtl8169_down(dev); + + tp->rx_buf_sz = new_mtu + ETH_HLEN + 8; + + retval = rtl8169_init_ring(dev); + if (retval < 0) + return retval; + + rtl8169_hw_start(dev); + + rtl8169_poll_enable(dev); + + rtl8169_request_timer(dev); + + return 0; +} + static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { desc->addr = 0x0badbadbadbadbadull; @@ -1745,7 +1782,7 @@ static void rtl8169_wait_for_quiescence( synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ - netif_poll_disable(dev); + rtl8169_poll_disable(dev); } static void rtl8169_reinit_task(void *_data) @@ -1785,6 +1822,7 @@ static void rtl8169_reset_task(void *_da rtl8169_init_ring_indexes(tp); rtl8169_hw_start(dev); netif_wake_queue(dev); + rtl8169_poll_enable(dev); } else { if (net_ratelimit()) { printk(PFX KERN_EMERG "%s: Rx buffers shortage\n", @@ -2255,19 +2293,17 @@ static int rtl8169_poll(struct net_devic } #endif -static int -rtl8169_close(struct net_device *dev) +static int rtl8169_down(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); - struct pci_dev *pdev = tp->pci_dev; void __iomem *ioaddr = tp->mmio_addr; + rtl8169_delete_timer(dev); + netif_stop_queue(dev); flush_scheduled_work(); - rtl8169_delete_timer(dev); - spin_lock_irq(&tp->lock); /* Stop the chip's Tx and Rx DMA processes. */ @@ -2282,14 +2318,30 @@ rtl8169_close(struct net_device *dev) spin_unlock_irq(&tp->lock); - free_irq(dev->irq, dev); + synchronize_irq(dev->irq); + + rtl8169_poll_disable(dev); - netif_poll_disable(dev); + /* Give a racing hard_start_xmit a few cycles to complete. */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); rtl8169_tx_clear(tp); rtl8169_rx_clear(tp); + return 0; +} + +static int rtl8169_close(struct net_device *dev) +{ + struct rtl8169_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + + rtl8169_down(dev); + + free_irq(dev->irq, dev); + pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, tp->RxPhyAddr); pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, --Boundary-00=_CUXiBVwclKE1ew4-- From tgr@reeler.org Wed Nov 3 16:40:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:40:51 -0800 (PST) Received: from rei.rakuen (217-162-107-144.dclient.hispeed.ch [217.162.107.144]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40eiVA025777 for ; Wed, 3 Nov 2004 16:40:45 -0800 Received: from tgr by rei.rakuen with local (Exim 4.34) id 1CPVfn-0000Am-Sz; Thu, 04 Nov 2004 01:40:19 +0100 Date: Thu, 4 Nov 2004 01:40:19 +0100 From: Thomas Graf To: Javier Szyszlican Cc: netdev@oss.sgi.com Subject: Re: Outbound IPIP Tunnel Packets not shaped/policed Message-ID: <20041104004019.GO19714@rei.reeler.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-archive-position: 11416 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 927 Lines: 24 * Javier Szyszlican 2004-11-03 20:36 > filter parent 2: protocol ip pref 1 fw > filter parent 2: protocol ip pref 1 fw handle 0x1 classid 2:21 > > Chain OUTPUT (policy ACCEPT 794K packets, 111M bytes) > pkts bytes target prot opt in out source > destination > 4984 377K mark.4 4 -- * * 0.0.0.0/0 > 0.0.0.0/0 > > Chain mark.4 (1 references) > pkts bytes target prot opt in out source > destination > 4984 377K MARK all -- * * 0.0.0.0/0 > 0.0.0.0/0 MARK set 0x1 Is this on the same device? I have such a setup in my test suite and it works fine with the latest bk snapshot. Can you show me the actual commands you execute? > So, I'm guessing that the IPIP packets generated by the kernel, are not > going into the packet scheduling routines/functions. They surely are. From tgraf@suug.ch Wed Nov 3 16:43:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:43:31 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40hQI9026138 for ; Wed, 3 Nov 2004 16:43:26 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 7D34EF; Thu, 4 Nov 2004 01:42:46 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 18AC21C0E9; Thu, 4 Nov 2004 01:43:27 +0100 (CET) Date: Thu, 4 Nov 2004 01:43:27 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: Re: [PATCHSET 0/8] PKT_SCHED: Use gnet_stats for actions and policer Message-ID: <20041104004327.GJ12289@postel.suug.ch> References: <20041103215816.GA12289@postel.suug.ch> <20041103141820.7a0c7832.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103141820.7a0c7832.davem@davemloft.net> X-archive-position: 11417 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 389 Lines: 9 * David S. Miller <20041103141820.7a0c7832.davem@davemloft.net> 2004-11-03 14:18 > > Shall I mark the old estimator and statistic API as __deprecated > > or remove it right away? > > Since nothing in the tree uses it any more, let's just kill it > outright. I will come up with a patch tomorrow together with the iproute2 patch which needs some more work. Thanks for the quick applying. From linux-netdev@gmane.org Wed Nov 3 16:52:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 16:52:19 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.229.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA40qDC7026915 for ; Wed, 3 Nov 2004 16:52:14 -0800 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 1CPVr2-0002CF-00 for ; Thu, 04 Nov 2004 01:51:56 +0100 Received: from lan-outside.tiba.com ([200.61.64.36]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 04 Nov 2004 01:51:56 +0100 Received: from javier by lan-outside.tiba.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 04 Nov 2004 01:51:56 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com From: Javier Szyszlican Subject: Re: Outbound IPIP Tunnel Packets not shaped/policed Date: Wed, 03 Nov 2004 21:55:03 -0300 Organization: TIBA Message-ID: <41897DE7.8080106@szysz.com> References: <20041104004019.GO19714@rei.reeler.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@sea.gmane.org Cc: netdev@oss.sgi.com X-Gmane-NNTP-Posting-Host: lan-outside.tiba.com User-Agent: Mozilla Thunderbird 0.8 (X11/20040921) X-Accept-Language: en-us, en In-Reply-To: <20041104004019.GO19714@rei.reeler.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime X-archive-position: 11418 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: javier@szysz.com Precedence: bulk X-list: netdev Content-Length: 1855 Lines: 62 Thomas, The commands are (Generated via firehol) Iptables: -A FORWARD -p 4 -j mark.4 -A OUTPUT -p ipencap -j mark.5 -A mark.4 -j MARK --set-mark 0x1 -A mark.5 -j MARK --set-mark 0x1 And in TC: tc qdisc add dev ppp0 root handle 2:0 htb default 22 tc class add dev ppp0 parent 2:0 classid 2:1 htb rate 128kbit ceil 128kbit tc class add dev ppp0 parent 2:1 classid 2:22 htb rate 32kbit ceil 128kbit prio 10 tc class add dev ppp0 parent 2:1 classid 2:21 htb rate 96kbit ceil 128kbit prio 1 tc filter add dev ppp0 protocol ip parent 2:0 prio 1 handle 1 fw flowid 2:21 What do you mean by "same device", all this is on my gateway host, that has the pptp connection (ppp0) and over that the IPIP tunnel. If the IPIP packets geneated by kernel are going to the shaping functions, how is that I don't see them in my tc -s ? Thanks you very much for helping me. Javier Thomas Graf wrote: > * Javier Szyszlican 2004-11-03 20:36 > >>filter parent 2: protocol ip pref 1 fw >>filter parent 2: protocol ip pref 1 fw handle 0x1 classid 2:21 >> >>Chain OUTPUT (policy ACCEPT 794K packets, 111M bytes) >> pkts bytes target prot opt in out source >> destination >> 4984 377K mark.4 4 -- * * 0.0.0.0/0 >> 0.0.0.0/0 >> >>Chain mark.4 (1 references) >> pkts bytes target prot opt in out source >> destination >> 4984 377K MARK all -- * * 0.0.0.0/0 >> 0.0.0.0/0 MARK set 0x1 > > > Is this on the same device? I have such a setup in my test suite > and it works fine with the latest bk snapshot. Can you show me > the actual commands you execute? > > >>So, I'm guessing that the IPIP packets generated by the kernel, are not >>going into the packet scheduling routines/functions. > > > They surely are. > > From christopherc@team.outblaze.com Wed Nov 3 17:03:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 17:03:59 -0800 (PST) Received: from corpmail.outblaze.com (corpmail.outblaze.com [203.86.166.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA413qrH027598 for ; Wed, 3 Nov 2004 17:03:53 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by corpmail.outblaze.com (Postfix) with ESMTP id 8692237B08 for ; Thu, 4 Nov 2004 01:03:34 +0000 (GMT) Received: from smtp1.hk1.outblaze.com (smtp1.hk1.outblaze.com [203.86.166.80]) by corpmail.outblaze.com (Postfix) with SMTP id 4B46F16DD8D for ; Thu, 4 Nov 2004 01:03:34 +0000 (GMT) Received: (qmail 9857 invoked from network); 4 Nov 2004 01:03:33 -0000 Received: from unknown (HELO ?192.168.4.22?) (christopherc@team.outblaze.com@210.177.227.130) by smtp1.hk1.outblaze.com with SMTP; 4 Nov 2004 01:03:33 -0000 Message-ID: <4189810C.4080302@outblaze.com> Date: Thu, 04 Nov 2004 09:08:28 +0800 From: Christopher Chan User-Agent: Mozilla Thunderbird 0.7.3 (X11/20040803) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: Christopher Chan , ganesh.venkatesan@intel.com Subject: Re: linux 2.6.9 still having network code problems References: <418741EB.3080701@outblaze.com> <20041102011918.2b453e21.akpm@osdl.org> <4187478A.1040002@outblaze.com> In-Reply-To: <4187478A.1040002@outblaze.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-AntiVirus: checked by Vexira MailArmor (version: 2.0.2-8; VAE: 6.28.0.12; VDF: 6.28.0.52; host: corpmail.outblaze.com) X-archive-position: 11419 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cchan@outblaze.com Precedence: bulk X-list: netdev Content-Length: 5753 Lines: 127 Christopher Chan wrote: > >>> Previously with 2.6.7 I had to use this values in sysctl to be able >>> to continue to access the box: >>> >>> net.ipv4.tcp_max_syn_backlog = 2048 >>> net.ipv4.route.gc_thresh = 65536 >>> net.ipv4.route.max_size = 1048576 >>> Nov 1 03:16:00 spf5-3 kernel: Out of Memory: Killed process 21861 >>> (smtpd). >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>> failed at net/ipv4/tcp.c (1284) >>> Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>> failed at net/ipv4/tcp.c (1284) >>> Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>> tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>> net/ipv4/tcp.c (1348) >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>> failed at net/ipv4/tcp.c (1284) >>> Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>> tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>> net/ipv4/tcp.c (1348) >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (flags & MSG_PEEK) >>> failed at net/ipv4/tcp.c (1284) >>> Nov 1 03:16:00 spf5-3 kernel: recvmsg bug: copied 1E619F78 seq 1E61A378 >>> Nov 1 03:16:00 spf5-3 kernel: KERNEL: assertion (tp->copied_seq == >>> tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed at >>> net/ipv4/tcp.c (1348) >> >> >> >> This is a networking bug. >> > > Yes...it's the same one that won't allow me to use the e100 driver with > NAPI enabled with or without them sysctl tweaks and the same one that > forces me to use the tweaks without NAPI enabled for the e100 driver. > > With NAPI enabled, I see the problem when under pressure. > > FYI, the 2.6.9 kernel is running with NAPI enabled. > 2.6.9 kernel with NAPI enabled and sysctl tweaks listed at the top of mail still triggers network code problems: Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:46:45 spf0 kernel: KERNEL: assertion (tp->copied_seq == tp->rcv_nxt || (flags & (MSG_PEEK | MSG_TRUNC))) failed a t net/ipv4/tcp.c (1348) Nov 3 10:47:56 spf0 kernel: kb)->end_seq)) failed at net/ipv4/tcp.c (1061) Nov 3 10:47:56 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:47:56 spf0 kernel: KERNEL: assertion (!skb || before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)) failed at net/ipv 4/tcp.c (1061) ...................................... Nov 3 10:47:59 spf0 kernel: printk: 156 messages suppressed. Nov 3 10:47:59 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:47:59 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:47:59 spf0 kernel: KERNEL: assertion (!skb || before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)) failed at net/ipv 4/tcp.c (1061) Nov 3 10:47:59 spf0 kernel: printk: 106 messages suppressed. Nov 3 10:47:59 spf0 kernel: printk: 121 messages suppressed. Nov 3 10:47:59 spf0 kernel: printk: 222 messages suppressed. Nov 3 10:47:59 spf0 kernel: printk: 151 messages suppressed. Nov 3 10:47:59 spf0 kernel: KERNEL: assertion (flags & MSG_PEEK) failed at net/ipv4/tcp.c (1284) Nov 3 10:47:59 spf0 kernel: recvmsg bug: copied D51512C9 seq D51512FA Nov 3 10:47:59 spf0 kernel: printk: 163 messages suppressed. Nov 3 10:48:04 spf0 kernel: printk: 216 messages suppressed. apparent recovery... Nov 3 11:15:44 spf0 kernel: printk: 15 messages suppressed. Nov 3 11:23:42 spf0 kernel: printk: 61 messages suppressed. Box is gone... Please continue to keep available the NAPI disable/enable option in the e100 driver. From kaber@trash.net Wed Nov 3 19:11:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 19:11:40 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA43BXxU032222 for ; Wed, 3 Nov 2004 19:11:34 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPY1n-0005oB-W5 for netdev@oss.sgi.com; Thu, 04 Nov 2004 04:11:12 +0100 Message-ID: <41899DCF.3050804@trash.net> Date: Thu, 04 Nov 2004 04:11:11 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: request_module while holding rtnl semaphore Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11420 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 500 Lines: 12 There are several instances of request_module beeing called while holding the rtnl semaphore in net/sched. A pratical problem with this is the teql scheduler which deadlocks when calling register_netdev from its init function. A more far-fetched problem would be some crazy person with their modules in a nfs-mounted directory on a server reachable over a dial-on-demand link. I couldn't come up with a solution except for refusing to autoload teql, maybe someone else has an idea. Regards Patrick From mdomsch@lists.us.dell.com Wed Nov 3 19:43:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 19:43:19 -0800 (PST) Received: from lists.us.dell.com (linux.us.dell.com [143.166.224.162]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA43hDih000786 for ; Wed, 3 Nov 2004 19:43:13 -0800 Received: from lists.us.dell.com (localhost.localdomain [127.0.0.1]) by lists.us.dell.com (8.12.11/8.12.11) with ESMTP id iA43gg8t026355; Wed, 3 Nov 2004 21:42:42 -0600 Received: (from mdomsch@localhost) by lists.us.dell.com (8.12.11/8.12.11/Submit) id iA43ggwg026353; Wed, 3 Nov 2004 21:42:42 -0600 Date: Wed, 3 Nov 2004 21:42:42 -0600 From: Matt Domsch To: "David S. Miller" Cc: Herbert Xu , hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] dev.c: clear SIOCGIFHWADDR buffer if !dev->addr_len Message-ID: <20041104034241.GA26300@lists.us.dell.com> References: <20041101044433.GA18772@lists.us.dell.com> <20041101173434.GA12437@lists.us.dell.com> <20041101202754.GA23149@gondor.apana.org.au> <20041101203821.GA15086@lists.us.dell.com> <20041101204131.GA23277@gondor.apana.org.au> <20041101204533.GA17279@lists.us.dell.com> <1099345849.1073.1.camel@jzny.localdomain> <20041101215944.GB17279@lists.us.dell.com> <20041101220644.GA23903@gondor.apana.org.au> <20041103160727.54dc0c15.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041103160727.54dc0c15.davem@davemloft.net> User-Agent: Mutt/1.4.1i X-archive-position: 11421 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Matt_Domsch@dell.com Precedence: bulk X-list: netdev Content-Length: 1024 Lines: 29 On Wed, Nov 03, 2004 at 04:07:27PM -0800, David S. Miller wrote: > On Tue, 2 Nov 2004 09:06:44 +1100 > Herbert Xu wrote: > > > On Mon, Nov 01, 2004 at 03:59:44PM -0600, Matt Domsch wrote: > > > > > > Actually, -EOVERFLOW appears throughout the kernel. A couple examples: > > > > I agree. Please disregard my comment re ERANGE. > > I think there is nothing wrong with clearing out the buffer > for the !dev->addr_len case. This is not to say that what > the apps are doing is correct or not, it merely preserves > 2.4.x behavior which was changed unintentionally. > > I'm going to apply Matt's patch which began this thread. If it's all the same to you, I prefer the last version. If you want to remove the net_ratelimited printk, that would be fine too. Either way the apps will work as expected again. Thanks, Matt -- Matt Domsch Sr. Software Engineer, Lead Engineer Dell Linux Solutions linux.dell.com & www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com From kaber@trash.net Wed Nov 3 22:26:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:26:17 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46QBbT008129 for ; Wed, 3 Nov 2004 22:26:11 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb47-00021k-Ty; Thu, 04 Nov 2004 07:25:47 +0100 Message-ID: <4189CB6B.5050508@trash.net> Date: Thu, 04 Nov 2004 07:25:47 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 3/5]: ipt: mark some functions static Content-Type: multipart/mixed; boundary="------------000307010105070907030008" X-archive-position: 11424 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1980 Lines: 89 This is a multi-part message in MIME format. --------------000307010105070907030008 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mark some functions static in ipt action. --------------000307010105070907030008 Content-Type: text/x-patch; name="3.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="3.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 06:41:17+01:00 kaber@coreworks.de # [PKT_SCHED]: ipt: mark some functions static # # Signed-off-by: Patrick McHardy # # net/sched/ipt.c # 2004/11/04 06:41:10+01:00 kaber@coreworks.de +6 -6 # [PKT_SCHED]: ipt: mark some functions static # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/ipt.c b/net/sched/ipt.c --- a/net/sched/ipt.c 2004-11-04 07:17:23 +01:00 +++ b/net/sched/ipt.c 2004-11-04 07:17:23 +01:00 @@ -42,7 +42,7 @@ #define MY_TAB_SIZE 16 #define MY_TAB_MASK 15 -u32 idx_gen; +static u32 idx_gen; static struct tcf_ipt *tcf_ipt_ht[MY_TAB_SIZE]; /* ipt hash table lock */ static rwlock_t ipt_lock = RW_LOCK_UNLOCKED; @@ -93,7 +93,7 @@ return ret; } -int +static int tcf_ipt_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a, int ovr, int bind) { struct ipt_entry_target *t; @@ -231,7 +231,7 @@ } -int +static int tcf_ipt_cleanup(struct tc_action *a, int bind) { struct tcf_ipt *p; @@ -241,7 +241,7 @@ return 0; } -int +static int tcf_ipt(struct sk_buff **pskb, struct tc_action *a) { int ret = 0, result = 0; @@ -293,7 +293,7 @@ } -int +static int tcf_ipt_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref) { struct ipt_entry_target *t; @@ -345,7 +345,7 @@ return -1; } -struct tc_action_ops act_ipt_ops = { +static struct tc_action_ops act_ipt_ops = { .next = NULL, .kind = "ipt", .type = TCA_ACT_IPT, --------------000307010105070907030008-- From kaber@trash.net Wed Nov 3 22:26:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:26:21 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46QEsA008143 for ; Wed, 3 Nov 2004 22:26:14 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb4C-00021w-IT; Thu, 04 Nov 2004 07:25:52 +0100 Message-ID: <4189CB70.3060703@trash.net> Date: Thu, 04 Nov 2004 07:25:52 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function Content-Type: multipart/mixed; boundary="------------000304030001030906050804" X-archive-position: 11426 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 4010 Lines: 164 This is a multi-part message in MIME format. --------------000304030001030906050804 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mark some functions static in act_api. tc_lookup_action_id was unused so I removed it. --------------000304030001030906050804 Content-Type: text/x-patch; name="5.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="5.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 06:45:26+01:00 kaber@coreworks.de # [PKT_SCHED]: act_api: mark some functions static/remove unused function # # Signed-off-by: Patrick McHardy # # net/sched/act_api.c # 2004/11/04 06:45:20+01:00 kaber@coreworks.de +11 -33 # [PKT_SCHED]: act_api: mark some functions static/remove unused function # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/act_api.c b/net/sched/act_api.c --- a/net/sched/act_api.c 2004-11-04 07:17:32 +01:00 +++ b/net/sched/act_api.c 2004-11-04 07:17:32 +01:00 @@ -88,7 +88,7 @@ } /* lookup by name */ -struct tc_action_ops *tc_lookup_action_n(char *kind) +static struct tc_action_ops *tc_lookup_action_n(char *kind) { struct tc_action_ops *a = NULL; @@ -111,7 +111,7 @@ } /* lookup by rtattr */ -struct tc_action_ops *tc_lookup_action(struct rtattr *kind) +static struct tc_action_ops *tc_lookup_action(struct rtattr *kind) { struct tc_action_ops *a = NULL; @@ -134,28 +134,6 @@ return a; } -/* lookup by id */ -struct tc_action_ops *tc_lookup_action_id(u32 type) -{ - struct tc_action_ops *a = NULL; - - if (type) { - read_lock(&act_mod_lock); - for (a = act_base; a; a = a->next) { - if (a->type == type) { - if (!try_module_get(a->owner)) { - read_unlock(&act_mod_lock); - return NULL; - } - break; - } - } - read_unlock(&act_mod_lock); - } - - return a; -} - int tcf_action_exec(struct sk_buff *skb,struct tc_action *act, struct tcf_result *res) { @@ -504,7 +482,7 @@ return err; } -int tcf_action_get_1(struct rtattr *rta, struct tc_action *a, struct nlmsghdr *n, u32 pid) +static int tcf_action_get_1(struct rtattr *rta, struct tc_action *a, struct nlmsghdr *n, u32 pid) { struct tc_action_ops *a_o; char act_name[4 + IFNAMSIZ + 1]; @@ -571,7 +549,7 @@ return err; } -void cleanup_a (struct tc_action *act) +static void cleanup_a (struct tc_action *act) { struct tc_action *a; @@ -587,7 +565,7 @@ } } -struct tc_action_ops *get_ao(struct rtattr *kind, struct tc_action *a) +static struct tc_action_ops *get_ao(struct rtattr *kind, struct tc_action *a) { char act_name[4 + IFNAMSIZ + 1]; struct tc_action_ops *a_o = NULL; @@ -622,7 +600,7 @@ return a_o; } -struct tc_action *create_a(int i) +static struct tc_action *create_a(int i) { struct tc_action *act = NULL; @@ -639,7 +617,7 @@ return act; } -int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) +static int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) { struct sk_buff *skb; unsigned char *b; @@ -709,7 +687,7 @@ return err; } -int tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event ) +static int tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event ) { int s = 0; @@ -793,7 +771,7 @@ } -int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event, unsigned flags) +static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event, unsigned flags) { struct tcamsg *t; struct nlmsghdr *nlh; @@ -840,7 +818,7 @@ } -int tcf_action_add(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int ovr ) +static int tcf_action_add(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int ovr ) { int ret = 0; struct tc_action *act = NULL; @@ -923,7 +901,7 @@ return ret; } -char * +static char * find_dump_kind(struct nlmsghdr *n) { struct rtattr *tb1, *tb2[TCA_ACT_MAX+1]; --------------000304030001030906050804-- From kaber@trash.net Wed Nov 3 22:26:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:26:14 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46Q7Ao008127 for ; Wed, 3 Nov 2004 22:26:08 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb45-00021f-Hk; Thu, 04 Nov 2004 07:25:45 +0100 Message-ID: <4189CB69.1000309@trash.net> Date: Thu, 04 Nov 2004 07:25:45 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 2/5]: mirred: mark some functions static Content-Type: multipart/mixed; boundary="------------000804080501010506010904" X-archive-position: 11422 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1626 Lines: 71 This is a multi-part message in MIME format. --------------000804080501010506010904 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mark some functions static in mirred action. --------------000804080501010506010904 Content-Type: text/x-patch; name="2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 06:40:04+01:00 kaber@coreworks.de # [PKT_SCHED]: mirred: mark some functions static # # Signed-off-by: Patrick McHardy # # net/sched/mirred.c # 2004/11/04 06:39:58+01:00 kaber@coreworks.de +4 -4 # [PKT_SCHED]: mirred: mark some functions static # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/mirred.c b/net/sched/mirred.c --- a/net/sched/mirred.c 2004-11-04 07:17:19 +01:00 +++ b/net/sched/mirred.c 2004-11-04 07:17:19 +01:00 @@ -76,7 +76,7 @@ return 0; } -int +static int tcf_mirred_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,int ovr, int bind) { struct rtattr *tb[TCA_MIRRED_MAX]; @@ -150,7 +150,7 @@ } -int +static int tcf_mirred_cleanup(struct tc_action *a, int bind) { struct tcf_mirred *p; @@ -160,7 +160,7 @@ return 0; } -int +static int tcf_mirred(struct sk_buff **pskb, struct tc_action *a) { struct tcf_mirred *p; @@ -235,7 +235,7 @@ return p->action; } -int +static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a,int bind, int ref) { unsigned char *b = skb->tail; --------------000804080501010506010904-- From kaber@trash.net Wed Nov 3 22:26:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:26:18 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46QCQR008133 for ; Wed, 3 Nov 2004 22:26:12 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb4A-00021p-9o; Thu, 04 Nov 2004 07:25:50 +0100 Message-ID: <4189CB6E.8020208@trash.net> Date: Thu, 04 Nov 2004 07:25:50 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 4/5]: gact: mark some functions static Content-Type: multipart/mixed; boundary="------------020606090909060602060201" X-archive-position: 11425 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2166 Lines: 97 This is a multi-part message in MIME format. --------------020606090909060602060201 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mark some functions static in gact. --------------020606090909060602060201 Content-Type: text/x-patch; name="4.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="4.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 06:42:01+01:00 kaber@coreworks.de # [PKT_SCHED]: gact: mark some functions static # # Signed-off-by: Patrick McHardy # # net/sched/gact.c # 2004/11/04 06:41:55+01:00 kaber@coreworks.de +7 -7 # [PKT_SCHED]: gact: mark some functions static # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/gact.c b/net/sched/gact.c --- a/net/sched/gact.c 2004-11-04 07:17:28 +01:00 +++ b/net/sched/gact.c 2004-11-04 07:17:28 +01:00 @@ -53,14 +53,14 @@ #ifdef CONFIG_GACT_PROB typedef int (*g_rand)(struct tcf_gact *p); -int +static int gact_net_rand(struct tcf_gact *p) { if (net_random()%p->pval) return p->action; return p->paction; } -int +static int gact_determ(struct tcf_gact *p) { if (p->bstats.packets%p->pval) return p->action; @@ -71,7 +71,7 @@ g_rand gact_rand[MAX_RAND]= { NULL,gact_net_rand, gact_determ}; #endif -int +static int tcf_gact_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,int ovr,int bind) { struct rtattr *tb[TCA_GACT_MAX]; @@ -129,7 +129,7 @@ return ret; } -int +static int tcf_gact_cleanup(struct tc_action *a, int bind) { struct tcf_gact *p; @@ -139,7 +139,7 @@ return 0; } -int +static int tcf_gact(struct sk_buff **pskb, struct tc_action *a) { struct tcf_gact *p; @@ -173,7 +173,7 @@ return action; } -int +static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref) { unsigned char *b = skb->tail; @@ -214,7 +214,7 @@ return -1; } -struct tc_action_ops act_gact_ops = { +static struct tc_action_ops act_gact_ops = { .next = NULL, .kind = "gact", .type = TCA_ACT_GACT, --------------020606090909060602060201-- From kaber@trash.net Wed Nov 3 22:26:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:26:16 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46Q60p008125 for ; Wed, 3 Nov 2004 22:26:07 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb42-00021U-Uz; Thu, 04 Nov 2004 07:25:42 +0100 Message-ID: <4189CB66.5080208@trash.net> Date: Thu, 04 Nov 2004 07:25:42 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 1/5]: pedit: mark some functions static Content-Type: multipart/mixed; boundary="------------050807030609090808030600" X-archive-position: 11423 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1631 Lines: 71 This is a multi-part message in MIME format. --------------050807030609090808030600 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mark some functions static in pedit action. --------------050807030609090808030600 Content-Type: text/x-patch; name="1.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="1.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 06:38:09+01:00 kaber@coreworks.de # [PKT_SCHED]: pedit: mark some functions static # # Signed-off-by: Patrick McHardy # # net/sched/pedit.c # 2004/11/04 06:38:02+01:00 kaber@coreworks.de +4 -4 # [PKT_SCHED]: pedit: mark some functions static # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/pedit.c b/net/sched/pedit.c --- a/net/sched/pedit.c 2004-11-04 07:17:14 +01:00 +++ b/net/sched/pedit.c 2004-11-04 07:17:14 +01:00 @@ -53,7 +53,7 @@ #include -int +static int tcf_pedit_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,int ovr, int bind) { struct rtattr *tb[TCA_PEDIT_MAX]; @@ -100,7 +100,7 @@ return ret; } -int +static int tcf_pedit_cleanup(struct tc_action *a, int bind) { struct tcf_pedit *p; @@ -113,7 +113,7 @@ /* ** */ -int +static int tcf_pedit(struct sk_buff **pskb, struct tc_action *a) { struct tcf_pedit *p; @@ -191,7 +191,7 @@ return p->action; } -int +static int tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,int bind, int ref) { unsigned char *b = skb->tail; --------------050807030609090808030600-- From kaber@trash.net Wed Nov 3 22:30:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Nov 2004 22:30:29 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA46UO8h009105 for ; Wed, 3 Nov 2004 22:30:25 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPb8E-00026h-UB; Thu, 04 Nov 2004 07:30:02 +0100 Message-ID: <4189CC6A.9040007@trash.net> Date: Thu, 04 Nov 2004 07:30:02 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6]: Fix device leaks in mirred action Content-Type: multipart/mixed; boundary="------------060200070306030602060705" X-archive-position: 11427 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1368 Lines: 49 This is a multi-part message in MIME format. --------------060200070306030602060705 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit When a mirred action is created it takes two references to the device (dev_get_by_index + dev_hold), but only drops one when it gets destroyed. It also leaks a reference when a mirred action is replaced. --------------060200070306030602060705 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 07:28:30+01:00 kaber@coreworks.de # [PKT_SCHED]: Fix device leaks in mirred action # # Signed-off-by: Patrick McHardy # # net/sched/mirred.c # 2004/11/04 07:28:24+01:00 kaber@coreworks.de +2 -1 # [PKT_SCHED]: Fix device leaks in mirred action # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/mirred.c b/net/sched/mirred.c --- a/net/sched/mirred.c 2004-11-04 07:28:59 +01:00 +++ b/net/sched/mirred.c 2004-11-04 07:28:59 +01:00 @@ -138,8 +138,9 @@ p->eaction = parm->eaction; if (parm->ifindex) { p->ifindex = parm->ifindex; + if (ovr) + dev_put(p->dev); p->dev = dev; - dev_hold(p->dev); } spin_unlock(&p->lock); } --------------060200070306030602060705-- From anil.gunturu@gmail.com Thu Nov 4 00:17:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 00:17:32 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.205]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA48HNlV012043 for ; Thu, 4 Nov 2004 00:17:23 -0800 Received: by rproxy.gmail.com with SMTP id z35so243252rne for ; Thu, 04 Nov 2004 00:17:01 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:mime-version:content-type:content-transfer-encoding; b=FbHlEe3ti7Hj34Y17GMom9+W69UGfQ6FbXkJaoArsu7hpt5rSABbhBZUyL3MZ0kxDA0GaK8GhZkpNrmDmgFZKWXm6+B/VaAQa0mUIQv/nR+dHdC4gBB/kN6BUow8ZPt/ae7XeBt8mL7i15P3yfBCwFygziOBQnFeAl+7bzzKlmI= Received: by 10.38.163.72 with SMTP id l72mr694079rne; Wed, 03 Nov 2004 23:17:01 -0800 (PST) Received: by 10.39.2.38 with HTTP; Wed, 3 Nov 2004 23:17:01 -0800 (PST) Message-ID: <2f61ba570411032317438bd494@mail.gmail.com> Date: Wed, 3 Nov 2004 23:17:01 -0800 From: Anil Gunturu Reply-To: Anil Gunturu To: netdev@oss.sgi.com Subject: kernel scalability Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11428 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anil.gunturu@gmail.com Precedence: bulk X-list: netdev Content-Length: 425 Lines: 9 Hi, We are porting linux kernel (2.4.18) for an embdded device that supports a large number of logical interfaces (upto 200) and routes (4000). There are only two physical ethernet interfaces, but we are planning to add multiple ip addresses and routes using the "ip" utility from iproute2 package. Just wondering if there are any scalability issues in doing so as far as the kernel is concerned. Thanks for your help, -Anil From herbert@gondor.apana.org.au Thu Nov 4 01:08:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 01:08:30 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA498KtV017146 for ; Thu, 4 Nov 2004 01:08:21 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPbzf-0003Be-00; Thu, 04 Nov 2004 18:25:15 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPbzb-0007ld-00; Thu, 04 Nov 2004 18:25:11 +1100 Date: Thu, 4 Nov 2004 18:25:11 +1100 To: "David S. Miller" , netdev@oss.sgi.com Subject: [NET] Get rid of unused glbl counter in neighbour Message-ID: <20041104072511.GA29842@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="TB36FDmn/VVEgNH/" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11429 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1407 Lines: 51 --TB36FDmn/VVEgNH/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: This patch gets rid of an unused global counter in neighbour.c. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --TB36FDmn/VVEgNH/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/core/neighbour.c 1.55 vs edited ===== --- 1.55/net/core/neighbour.c 2004-11-04 10:41:49 +11:00 +++ edited/net/core/neighbour.c 2004-11-04 14:47:14 +11:00 @@ -59,7 +59,6 @@ static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev); void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); -static int neigh_glbl_allocs; static struct neigh_table *neigh_tables; static struct file_operations neigh_stat_seq_fops; @@ -282,7 +281,6 @@ n->timer.data = (unsigned long)n; NEIGH_CACHE_STAT_INC(tbl, allocs); - neigh_glbl_allocs++; n->tbl = tbl; atomic_set(&n->refcnt, 1); n->dead = 1; @@ -612,7 +610,6 @@ NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); - neigh_glbl_allocs--; atomic_dec(&neigh->tbl->entries); kmem_cache_free(neigh->tbl->kmem_cachep, neigh); } --TB36FDmn/VVEgNH/-- From andi@cosy.sbg.ac.at Thu Nov 4 05:13:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 05:13:29 -0800 (PST) Received: from dobermann.cosy.sbg.ac.at (dobermann.cosy.sbg.ac.at [141.201.2.56]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4DDO5t003125 for ; Thu, 4 Nov 2004 05:13:24 -0800 Received: by dobermann.cosy.sbg.ac.at (Postfix, from userid 102) id 4306BF9B54; Thu, 4 Nov 2004 14:13:06 +0100 (CET) Received: from leu (leu.cosy.sbg.ac.at [141.201.2.107]) by dobermann.cosy.sbg.ac.at (Postfix) with ESMTP id 010DEF9ABC for ; Thu, 4 Nov 2004 14:13:05 +0100 (CET) Date: Thu, 04 Nov 2004 13:13:10 +0000 From: Andreas Maier Subject: Hide AF_INET To: netdev@oss.sgi.com X-Mailer: Balsa 2.2.5 Message-Id: <1099573990l.4491l.1l@leu> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; DelSp=Yes; Format=Flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA4DDO5t003125 X-archive-position: 11430 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: andi@cosy.sbg.ac.at Precedence: bulk X-list: netdev Content-Length: 1889 Lines: 75 I need a Linux testbed to test applications in an IPv6-only environment. Unfortunately IPv6 cannot be enabled without also enabling IPv4. Therefor I try to hide AF_INET from user space with the appended patch. It is a partial success in that AF_INET is no longer available to user space, the kernel does not crash, TCP6 connections (ssh) work and UDP6 connections seem to work (DNS). The drawback is that ICMP6 (ping6) does not work and that I think my basic approach is ugly. What could be a quick hack to get ICMP6 working in my scenario? Would it be possible - with reasonable effort - to convert networking code so that IPv6 no longer depends on IPv4 so that an IPv6-only configuration can be created easily? Thanks for your help, -andi --- net/ipv4/af_inet.c.orig 2004-10-29 15:01:42.000000000 +0200 +++ net/ipv4/af_inet.c 2004-11-04 11:57:11.000000000 +0100 @@ -1032,7 +1032,10 @@ * Tell SOCKET that we are alive... */ +#define HIDE_V4 +#ifndef HIDE_V4 (void)sock_register(&inet_family_ops); +#endif /* * Add all the base protocols. @@ -1066,9 +1069,11 @@ * Set the IP module up */ +#ifndef HIDE_V4 ip_init(); tcp_v4_init(&inet_family_ops); +#endif /* Setup TCP slab cache for open requests. */ tcp_init(); @@ -1078,7 +1083,9 @@ * Set the ICMP layer up */ +#ifndef HIDE_V4 icmp_init(&inet_family_ops); +#endif /* * Initialise the multicast router @@ -1093,7 +1100,9 @@ if(init_ipv4_mibs()) printk(KERN_CRIT "inet_init: Cannot init ipv4 mibs\n"); ; +#ifndef HIDE_V4 ipv4_proc_init(); +#endif ipfrag_init(); -- | Andreas Maier Paris-Lodron University of Salzburg | | (andi [at] cosy.sbg.ac.at) Department of Scientific Computing | | Tel. +43/662/8044-6339 Jakob Haringerstr. 2 | | Fax. +43/662/8044-172 5020 Salzburg / Austria, Europe | From hadi@cyberus.ca Thu Nov 4 05:54:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 05:54:28 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4DsNkQ004739 for ; Thu, 4 Nov 2004 05:54:24 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CPi3w-0003Fj-2H for netdev@oss.sgi.com; Thu, 04 Nov 2004 08:54:04 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPi3t-0002n5-Pw; Thu, 04 Nov 2004 08:54:02 -0500 Subject: Re: [PATCH 2.6]: Fix device leaks in mirred action From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <4189CC6A.9040007@trash.net> References: <4189CC6A.9040007@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099576439.1038.147.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 08:53:59 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11431 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 395 Lines: 16 On Thu, 2004-11-04 at 01:30, Patrick McHardy wrote: > When a mirred action is created it takes two references to the > device (dev_get_by_index + dev_hold), but only drops one when > it gets destroyed. Good catch. The correct fix is to remove the dev_hold(p->dev) call. > It also leaks a reference when a mirred action > is replaced. How? Is this patch supposed to fix that? cheers, jamal From hadi@cyberus.ca Thu Nov 4 05:57:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 05:57:10 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4Dv600005320 for ; Thu, 4 Nov 2004 05:57:06 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CPi6Y-0006Q2-RS for netdev@oss.sgi.com; Thu, 04 Nov 2004 08:56:46 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPi6X-0003BT-6R; Thu, 04 Nov 2004 08:56:45 -0500 Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <4189CB70.3060703@trash.net> References: <4189CB70.3060703@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099576602.1039.151.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 08:56:42 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11432 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 282 Lines: 13 On Thu, 2004-11-04 at 01:25, Patrick McHardy wrote: > Mark some functions static in act_api. All the rest of the static conversions are good except for this. > tc_lookup_action_id was unused > so I removed it. Please dont. I am incrementally submitting patches. cheers, jamal From uweber@astaro.de Thu Nov 4 06:01:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 06:01:55 -0800 (PST) Received: from mail.astaro.com (mail.astaro.com [213.221.123.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4E1kFa005820 for ; Thu, 4 Nov 2004 06:01:49 -0800 Received: from [192.168.2.219] (helo=[192.168.2.219]) by mail.astaro.com with esmtp (TLSv1:RC4-MD5:128) (Exim 4.30) id 1CPhr2-0003GF-Re; Thu, 04 Nov 2004 14:40:44 +0100 Message-ID: <418A3630.1040900@astaro.de> Date: Thu, 04 Nov 2004 15:01:20 +0100 From: Ulrich Weber User-Agent: Mozilla Thunderbird 0.8 (X11/20040926) X-Accept-Language: en-us, en MIME-Version: 1.0 To: vpn-failover@lists.balabit.hu CC: netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net Subject: Re: [Vpn-failover] [RFC] IPSEC failover - Netlink part References: <1099045435.2888.47.camel@nienna.balabit> In-Reply-To: <1099045435.2888.47.camel@nienna.balabit> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/mixed; boundary="------------080205020700070500050104" X-Scan-Signature: 15b2a1d998c4a55cfa3008925b70daf3 X-archive-position: 11433 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: uweber@astaro.de Precedence: bulk X-list: netdev Content-Length: 5971 Lines: 210 This is a multi-part message in MIME format. --------------080205020700070500050104 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, I take the opportunity to post my code as well. At the moment I'm working at the same as Krisztian. My solutions however is for openswan, which uses netlink instead of pfkey. Please find attached the appropriate netlink modifications to include/linux/xfrm.h and net/xfrm/xfrm_users.c In theses patches, a new netlink group (XFRMGRP_REPLAY) is added to notify about seq number changes. Each notify message contains a xfrm_usersa_id struct with the replay struct attached as rt attribute. In addition, these replay struct is also attached at ipsec sa dumps. Any comments are welcome :) Cheers ~ Ulrich -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBijYw22t2oTuElzoRAp0LAKCdKc4CgzWqLJLh4/U2oRFA96e49gCgk2R3 Rff8wpPVtUZtlCwJUEnP+34= =b6vx -----END PGP SIGNATURE----- --------------080205020700070500050104 Content-Type: text/x-chdr; name="linux_xfrm.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="linux_xfrm.h" --- linux.org/include/linux/xfrm.h. 2004-10-11 04:57:07.000000000 +0200 +++ linux/include/linux/xfrm.h 2004-10-18 17:00:43.000000000 +0200 @@ -140,6 +140,9 @@ XFRM_MSG_FLUSHPOLICY, #define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY + XFRM_MSG_UPDSEQ, +#define XFRM_MSG_UPDSEQ XFRM_MSG_UPDSEQ + XFRM_MSG_MAX }; @@ -171,6 +174,7 @@ XFRMA_ALG_COMP, /* struct xfrm_algo */ XFRMA_ENCAP, /* struct xfrm_algo + struct xfrm_encap_tmpl */ XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */ + XFRMA_REPLAY, /* struct xfrm_replay_state */ __XFRMA_MAX #define XFRMA_MAX (__XFRMA_MAX - 1) @@ -258,5 +258,6 @@ #define XFRMGRP_ACQUIRE 1 #define XFRMGRP_EXPIRE 2 +#define XFRMGRP_REPLAY 3 #endif /* _LINUX_XFRM_H */ --------------080205020700070500050104 Content-Type: text/x-patch; name="xfrm_user.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xfrm_user.diff" --- linux.org/net/xfrm/xfrm_user.c 2004-10-18 23:54:32.000000000 +0200 +++ linux/net/xfrm/xfrm_user.c 2004-10-21 16:27:59.000000000 +0200 @@ -240,6 +240,12 @@ if ((err = attach_encap_tmpl(&x->encap, xfrma[XFRMA_ENCAP-1]))) goto error; + if(xfrma[XFRMA_REPLAY-1]) { + struct xfrm_replay_state *replay; + replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); + x->replay = *replay; + } + err = -ENOENT; x->type = xfrm_get_type(x->id.proto, x->props.family); if (x->type == NULL) @@ -368,6 +375,8 @@ if (x->encap) RTA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap); + RTA_PUT(skb, XFRMA_REPLAY, sizeof(x->replay), &x->replay); + nlh->nlmsg_len = skb->tail - b; out: sp->this_idx++; @@ -852,6 +861,27 @@ return 0; } +static int xfrm_update_seq(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) +{ + struct xfrm_state *x; + struct xfrm_usersa_id *p = NLMSG_DATA(nlh); + struct xfrm_replay_state *replay; + + x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family); + if (x == NULL) { + printk(KERN_INFO "Found no xfrm state for sa seq update\n"); + return -ESRCH; + } + + if(xfrma[XFRMA_REPLAY-1]) { + replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); + x->replay = *replay; + } + else return -EINVAL; + + return 0; +} + static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = { NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)), /* NEW SA */ NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)), /* DEL SA */ @@ -867,6 +897,7 @@ NLMSG_LENGTH(sizeof(struct xfrm_user_polexpire)), /* POLEXPIRE */ NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush)), /* FLUSH SA */ NLMSG_LENGTH(0), /* FLUSH POLICY */ + NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),/* UPD SEQ */ }; static struct xfrm_link { @@ -893,6 +924,7 @@ {}, { .doit = xfrm_flush_sa }, { .doit = xfrm_flush_policy }, + { .doit = xfrm_update_seq }, }; static int xfrm_done(struct netlink_callback *cb) @@ -1050,6 +1082,33 @@ return -1; } +static int build_replay(struct sk_buff *skb, struct xfrm_state *x, int event) +{ + struct xfrm_usersa_id *id; + struct nlmsghdr *nlh; + unsigned char *b = skb->tail; + + nlh = NLMSG_PUT(skb, 0, 0, XFRM_MSG_UPDSEQ, + sizeof(*id)); + id = NLMSG_DATA(nlh); + nlh->nlmsg_flags = 0; + + id->daddr = x->id.daddr; + id->spi = x->id.spi; + id->family = x->props.family; + id->proto = x->id.proto; + + RTA_PUT(skb, XFRMA_REPLAY, sizeof(x->replay), &x->replay); + + nlh->nlmsg_len = skb->tail - b; + return skb->len; + +rtattr_failure: +nlmsg_failure: + skb_trim(skb, b - skb->data); + return -1; +} + static int xfrm_send_state_notify(struct xfrm_state *x, int hard) { struct sk_buff *skb; @@ -1218,12 +1277,28 @@ return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_EXPIRE, GFP_ATOMIC); } +static int xfrm_send_replay_notify(struct xfrm_state *x, int event) { + struct sk_buff *skb; + + skb = alloc_skb(sizeof(struct xfrm_usersa_id) + sizeof(struct xfrm_replay_state) + 16, GFP_ATOMIC); + if (skb == NULL) + return -ENOMEM; + + if (build_replay(skb, x, event) < 0) + BUG(); + + NETLINK_CB(skb).dst_groups = XFRMGRP_REPLAY; + + return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_REPLAY, GFP_ATOMIC); +} + static struct xfrm_mgr netlink_mgr = { .id = "netlink", .notify = xfrm_send_state_notify, .acquire = xfrm_send_acquire, .compile_policy = xfrm_compile_policy, .notify_policy = xfrm_send_policy_notify, + .notify_seq = xfrm_send_replay_notify, }; static int __init xfrm_user_init(void) --------------080205020700070500050104-- From hadi@cyberus.ca Thu Nov 4 06:15:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 06:16:00 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4EFqpI006675 for ; Thu, 4 Nov 2004 06:15:52 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CPiOe-0006Oi-Ep for netdev@oss.sgi.com; Thu, 04 Nov 2004 09:15:28 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPiOW-0005vz-6c; Thu, 04 Nov 2004 09:15:20 -0500 Subject: Re: BUG: dst underflow (again) From: jamal Reply-To: hadi@cyberus.ca To: Lennert Buytenhek Cc: YOSHIFUJI "Hideaki / ?$B5HF#1QL@" , jgarzik@pobox.com, netdev@oss.sgi.com In-Reply-To: <20041022075947.GA15795@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099577717.1039.155.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 09:15:17 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11434 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1264 Lines: 44 Jeff/Lennert Could you turn off netfilter and see if this continues to happen? Know how to reproduce this? ;-> cheers, jamal On Fri, 2004-10-22 at 03:59, Lennert Buytenhek wrote: > On Fri, Oct 22, 2004 at 03:51:59PM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@ wrote: > > > > As requested, I updated my kernel to see if the "BUG: dst underflow..." > > > messages disappeared. Alas, they didn't. dmesg and .config from > > > 2.6.9-final attached. > > > > Okay, thanks, but hmm... > > (We haven't met this issue... I really want to know tow to reproduce...) > > FWIW, I'm seeing loads of these on the kernel that comes with Fedora > Core 2, also in the ipv6.ko module. I have 6to4 enabled, if that matters > anything. > > % dmesg | grep BUG | sort | uniq > BUG: dst underflow -1: 3bcf9a80 at 42350024 > BUG: dst underflow 0: 3bcf9a80 at 423486d2 > BUG: dst underflow 0: 3bcf9a80 at 4235823d > % cat /sys/module/ipv6/sections/.text > 0x42345000 > > 0x42350024 - 0x42345000 = 0xb024, corresponds to: > 0000affa > > 0x423486d2 - 0x42345000 = 0x36d2, corresponds to: > 0000339d > > 0x4235823d - 0x42345000 = 0x1323d, corresponds to: > 00012c0d (god, that's one big function btw) > > > --L > > From kaber@trash.net Thu Nov 4 06:59:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 06:59:16 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4ExB4l008722 for ; Thu, 4 Nov 2004 06:59:12 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPj4R-0003HP-BW; Thu, 04 Nov 2004 15:58:39 +0100 Message-ID: <418A439F.2010401@trash.net> Date: Thu, 04 Nov 2004 15:58:39 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@cyberus.ca CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6]: Fix device leaks in mirred action References: <4189CC6A.9040007@trash.net> <1099576439.1038.147.camel@jzny.localdomain> In-Reply-To: <1099576439.1038.147.camel@jzny.localdomain> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11435 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 324 Lines: 19 jamal wrote: >>It also leaks a reference when a mirred action >>is replaced. >> >> > >How? Is this patch supposed to fix that? > > + if (ovr) + dev_put(p->dev); p->dev = dev; By dropping the reference before replacing it. Regards Patrick From hadi@cyberus.ca Thu Nov 4 07:24:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 07:24:27 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4FOL5m011050 for ; Thu, 4 Nov 2004 07:24:22 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CPjT0-0000Qp-GP for netdev@oss.sgi.com; Thu, 04 Nov 2004 10:24:02 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPjSy-0000WM-HW; Thu, 04 Nov 2004 10:24:00 -0500 Subject: Re: [PATCH 2.6]: Fix device leaks in mirred action From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <418A439F.2010401@trash.net> References: <4189CC6A.9040007@trash.net> <1099576439.1038.147.camel@jzny.localdomain> <418A439F.2010401@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099581832.1080.15.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 10:23:53 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11436 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 473 Lines: 23 On Thu, 2004-11-04 at 09:58, Patrick McHardy wrote: > jamal wrote: > > >>It also leaks a reference when a mirred action > >>is replaced. > > > >How? Is this patch supposed to fix that? > > > > > + if (ovr) > + dev_put(p->dev); > p->dev = dev; > > By dropping the reference before replacing it. > Ok, makes sense. Thanks Patrick. Dave please apply the patch in its entirety. cheers, jamal From kaber@trash.net Thu Nov 4 07:29:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 07:29:14 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4FT7Ki011759 for ; Thu, 4 Nov 2004 07:29:07 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPjXM-0003NM-WA; Thu, 04 Nov 2004 16:28:33 +0100 Message-ID: <418A4AA0.8070609@trash.net> Date: Thu, 04 Nov 2004 16:28:32 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@cyberus.ca CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> In-Reply-To: <1099576602.1039.151.camel@jzny.localdomain> Content-Type: multipart/mixed; boundary="------------070506020303020400050606" X-archive-position: 11437 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 4316 Lines: 179 This is a multi-part message in MIME format. --------------070506020303020400050606 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit jamal wrote: >On Thu, 2004-11-04 at 01:25, Patrick McHardy wrote: > > >>tc_lookup_action_id was unused >>so I removed it. >> >> > >Please dont. > Ok, here is the same patch without removing tc_lookup_action_id. It is instead surrounded by #if 0. >I am incrementally submitting patches. > I was about to do more cleanup, please stop me if you are already doing any of this: - move the functions from include/net/pkt_act.h to act_generic.c - convert lastuse/install/expires to USER_HZ - fix ipt: leaks memory at destruction, ovr doesn't work, doesn't refcount iptables module references Is there already userspace-code for anything besides gact ? I would like to test my changes. Regards Patrick --------------070506020303020400050606 Content-Type: text/x-patch; name="5.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="5.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 16:11:08+01:00 kaber@coreworks.de # [PKT_SCHED]: act_api: mark some functions static # # Signed-off-by: Patrick McHardy # # net/sched/act_api.c # 2004/11/04 16:11:02+01:00 kaber@coreworks.de +13 -11 # [PKT_SCHED]: act_api: mark some functions static # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/act_api.c b/net/sched/act_api.c --- a/net/sched/act_api.c 2004-11-04 16:11:32 +01:00 +++ b/net/sched/act_api.c 2004-11-04 16:11:32 +01:00 @@ -88,7 +88,7 @@ } /* lookup by name */ -struct tc_action_ops *tc_lookup_action_n(char *kind) +static struct tc_action_ops *tc_lookup_action_n(char *kind) { struct tc_action_ops *a = NULL; @@ -111,7 +111,7 @@ } /* lookup by rtattr */ -struct tc_action_ops *tc_lookup_action(struct rtattr *kind) +static struct tc_action_ops *tc_lookup_action(struct rtattr *kind) { struct tc_action_ops *a = NULL; @@ -134,6 +134,7 @@ return a; } +#if 0 /* lookup by id */ struct tc_action_ops *tc_lookup_action_id(u32 type) { @@ -155,6 +156,7 @@ return a; } +#endif int tcf_action_exec(struct sk_buff *skb,struct tc_action *act, struct tcf_result *res) { @@ -504,7 +506,7 @@ return err; } -int tcf_action_get_1(struct rtattr *rta, struct tc_action *a, struct nlmsghdr *n, u32 pid) +static int tcf_action_get_1(struct rtattr *rta, struct tc_action *a, struct nlmsghdr *n, u32 pid) { struct tc_action_ops *a_o; char act_name[4 + IFNAMSIZ + 1]; @@ -571,7 +573,7 @@ return err; } -void cleanup_a (struct tc_action *act) +static void cleanup_a (struct tc_action *act) { struct tc_action *a; @@ -587,7 +589,7 @@ } } -struct tc_action_ops *get_ao(struct rtattr *kind, struct tc_action *a) +static struct tc_action_ops *get_ao(struct rtattr *kind, struct tc_action *a) { char act_name[4 + IFNAMSIZ + 1]; struct tc_action_ops *a_o = NULL; @@ -622,7 +624,7 @@ return a_o; } -struct tc_action *create_a(int i) +static struct tc_action *create_a(int i) { struct tc_action *act = NULL; @@ -639,7 +641,7 @@ return act; } -int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) +static int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) { struct sk_buff *skb; unsigned char *b; @@ -709,7 +711,7 @@ return err; } -int tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event ) +static int tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event ) { int s = 0; @@ -793,7 +795,7 @@ } -int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event, unsigned flags) +static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event, unsigned flags) { struct tcamsg *t; struct nlmsghdr *nlh; @@ -840,7 +842,7 @@ } -int tcf_action_add(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int ovr ) +static int tcf_action_add(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int ovr ) { int ret = 0; struct tc_action *act = NULL; @@ -923,7 +925,7 @@ return ret; } -char * +static char * find_dump_kind(struct nlmsghdr *n) { struct rtattr *tb1, *tb2[TCA_ACT_MAX+1]; --------------070506020303020400050606-- From hadi@cyberus.ca Thu Nov 4 07:54:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 07:54:40 -0800 (PST) Received: from mx02.cybersurf.com (mx02.cybersurf.com [209.197.145.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4FsVsR013935 for ; Thu, 4 Nov 2004 07:54:31 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx02.cybersurf.com with esmtp (Exim 4.30) id 1CPjwB-0005C4-07 for netdev@oss.sgi.com; Thu, 04 Nov 2004 10:54:11 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPjw8-0006Sb-GT; Thu, 04 Nov 2004 10:54:08 -0500 Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <418A4AA0.8070609@trash.net> References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> <418A4AA0.8070609@trash.net> Content-Type: multipart/mixed; boundary="=-jsey1+L9qfIUO70ryExe" Organization: jamalopolous Message-Id: <1099583639.1081.30.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 10:53:59 -0500 X-archive-position: 11438 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 30642 Lines: 1303 --=-jsey1+L9qfIUO70ryExe Content-Type: text/plain Content-Transfer-Encoding: 7bit On Thu, 2004-11-04 at 10:28, Patrick McHardy wrote: > jamal wrote: > >Please dont. > > > Ok, here is the same patch without removing tc_lookup_action_id. > It is instead surrounded by #if 0. Why is this function bothering you? ;-> Why do you need to put the #if 0? > >I am incrementally submitting patches. > > > I was about to do more cleanup, please stop me if you are already doing > any of this: > My changes will be new stuff going in. So any cleanup is welcome. > - move the functions from include/net/pkt_act.h to act_generic.c Some of the larger ones make sense to move. Whats the main reason for moving them? > - convert lastuse/install/expires to USER_HZ > - fix ipt: leaks memory at destruction, ovr doesn't work, doesn't refcount > iptables module references > These two make sense. I need help eyeballing the iptables stuff. I commented out some of the refcount attempts; also i think quiet a few targets are not friendly in getting accessed by anything other than iptables; I was going at some point fix them and send you guys patches. Maybe you can help me in this area as well. > Is there already userspace-code for anything besides gact ? > I would like to test my changes. > Stephen is probably stalled somewhere because he hasnt been sucking in my updates to iproute2. I have the latest and greatest on my test machine at home. But here are tc updates for ipt and mirred that i could find on my laptop. The ipt patch needs iptables libraries and may not work with latest iptables (although the one at home will surely work). The problem is some of the iptables functions were updated. It would be nice if i didnt have to maintain my own variants in user space. cheers, jamal --=-jsey1+L9qfIUO70ryExe Content-Disposition: attachment; filename=tc-269-mirred-patch-oct052004 Content-Type: text/plain; name=tc-269-mirred-patch-oct052004; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit --- /dev/null 1998-05-05 16:32:27.000000000 -0400 +++ /home/hadi/iproute2-2.6.9/tc/m_mirred.c 2004-10-04 11:57:51.000000000 -0400 @@ -0,0 +1,310 @@ +/* + * m_egress.c ingress/egress packet mirror/redir actions module + * + * This program is free software; you can distribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Authors: J Hadi Salim (hadi@cyberus.ca) + * + * TODO: Add Ingress support + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include "tc_util.h" +#include + +int mirred_d = 1; + +static void +explain(void) +{ + fprintf(stderr, "Usage: mirred [index INDEX] \n"); + fprintf(stderr, "where: \n"); + fprintf(stderr, "DIRECTION := \n"); + fprintf(stderr, "aCTION := \n"); + fprintf(stderr, " : INDEX is the specific policy instance id\n"); + fprintf(stderr, " : DEVICENAME is the devicename \n"); +} + +#define usage() return(-1) + +char *mirred_n2a(int action) +{ + switch (action) { + case TCA_EGRESS_REDIR: + return "Egress Redirect"; + case TCA_INGRESS_REDIR: + return "Ingress Redirect"; + case TCA_EGRESS_MIRROR: + return "Egress Mirror"; + case TCA_INGRESS_MIRROR: + return "Ingress Mirror"; + default: + return "unknown"; + } +} + +int +parse_egress(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) +{ + + int argc = *argc_p; + char **argv = *argv_p; + int ok = 0, iok = 0, mirror=0,redir=0; + struct tc_mirred p; + struct rtattr *tail; + char d[16]; + struct rtnl_handle rth; + + memset(d,0,sizeof(d)-1); + memset(&p,0,sizeof(struct tc_mirred)); + + while (argc > 0) { + + if (matches(*argv, "action") == 0) { + break; + } else if (matches(*argv, "egress") == 0) { + NEXT_ARG(); + ok++; + continue; + } else { + + if (matches(*argv, "index") == 0) { + NEXT_ARG(); + if (get_u32(&p.index, *argv, 10)) { + fprintf(stderr, "Illegal \"index\"\n"); + return -1; + } + iok++; + if (!ok) { + argc--; + argv++; + break; + } + } else if(!ok) { + fprintf(stderr, "was expecting egress (%s)\n", *argv); + break; + + } else if (!mirror && matches(*argv, "mirror") == 0) { + mirror=1; + if (redir) { + fprintf(stderr, "Cant have both mirror and redir\n"); + return -1; + } + p.eaction = TCA_EGRESS_MIRROR; + p.action = TC_ACT_PIPE; + ok++; + } else if (!redir && matches(*argv, "redirect") == 0) { + redir=1; + if (mirror) { + fprintf(stderr, "Cant have both mirror and redir\n"); + return -1; + } + p.eaction = TCA_EGRESS_REDIR; + p.action = TC_ACT_STOLEN; + ok++; + } else if ((redir || mirror) && matches(*argv, "dev") == 0) { + NEXT_ARG(); + if (strlen(d)) + duparg("dev", *argv); + + strncpy(d, *argv, sizeof(d)-1); + argc--; + argv++; + + break; + + } + } + + NEXT_ARG(); + } + + if (!ok && !iok) { + explain(); + return -1; + } + + + + if (d[0]) { + int idx; + if (rtnl_open(&rth, 0) < 0) { + fprintf(stderr, "Cannot open rtnetlink\n"); + exit(1); + } + ll_init_map(&rth); + + + if ((idx = ll_name_to_index(d)) == 0) { + fprintf(stderr, "Cannot find device \"%s\"\n", d); + rtnl_close(&rth); + return -1; + } + + p.ifindex = idx; + rtnl_close(&rth); + } + + + if (argc && p.eaction == TCA_EGRESS_MIRROR) { + + if (matches(*argv, "reclassify") == 0) { + p.action = TC_POLICE_RECLASSIFY; + NEXT_ARG(); + } else if (matches(*argv, "pipe") == 0) { + p.action = TC_POLICE_PIPE; + NEXT_ARG(); + } else if (matches(*argv, "drop") == 0 || + matches(*argv, "shot") == 0) { + p.action = TC_POLICE_SHOT; + NEXT_ARG(); + } else if (matches(*argv, "continue") == 0) { + p.action = TC_POLICE_UNSPEC; + NEXT_ARG(); + } else if (matches(*argv, "pass") == 0) { + p.action = TC_POLICE_OK; + NEXT_ARG(); + } + + } + + if (argc) { + if (iok && matches(*argv, "index") == 0) { + fprintf(stderr, "mirred: Illegal double index\n"); + return -1; + } else { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); + if (get_u32(&p.index, *argv, 10)) { + fprintf(stderr, "mirred: Illegal \"index\"\n"); + return -1; + } + argc--; + argv++; + } + } + } + + if (mirred_d) + fprintf(stdout, "Action %d device %s ifindex %d\n",p.action, d,p.ifindex); + + tail = (struct rtattr *) (((void *) n) + NLMSG_ALIGN(n->nlmsg_len)); + addattr_l(n, MAX_MSG, tca_id, NULL, 0); + addattr_l(n, MAX_MSG, TCA_MIRRED_PARMS, &p, sizeof (p)); + tail->rta_len = + (((void *) n) + NLMSG_ALIGN(n->nlmsg_len)) - (void *) tail; + + *argc_p = argc; + *argv_p = argv; + return 0; +} + + +int +parse_mirred(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) +{ + + int argc = *argc_p; + char **argv = *argv_p; + + if (argc < 0) { + fprintf(stderr,"mirred bad arguement count %d\n", argc); + return -1; + } + + if (matches(*argv, "mirred") == 0) { + NEXT_ARG(); + } else { + fprintf(stderr,"mirred bad arguement %s\n", *argv); + return -1; + } + + + if (matches(*argv, "egress") == 0 || matches(*argv, "index") == 0) { + int ret = parse_egress(a, &argc, &argv, tca_id, n); + if (ret == 0) { + *argc_p = argc; + *argv_p = argv; + return 0; + } + + } else if (matches(*argv, "ingress") == 0) { + fprintf(stderr,"mirred ingress not supported at the moment\n"); + + } else { + fprintf(stderr,"mirred not supported %s\n", *argv); + } + + return -1; + +} + +int +print_mirred(struct action_util *au,FILE * f, struct rtattr *arg) +{ + struct tc_mirred *p; + struct rtattr *tb[TCA_MIRRED_MAX + 1]; + struct rtnl_handle rth; + const char *dev; + SPRINT_BUF(b1); + + if (arg == NULL) + return -1; + + memset(tb, 0, sizeof (tb)); + parse_rtattr(tb, TCA_MIRRED_MAX, RTA_DATA(arg), RTA_PAYLOAD(arg)); + + if (tb[TCA_MIRRED_PARMS] == NULL) { + fprintf(f, "[NULL mirred parameters]"); + return -1; + } + p = RTA_DATA(tb[TCA_MIRRED_PARMS]); + + if (rtnl_open(&rth, 0) < 0) { + fprintf(stderr, "Cannot open rtnetlink\n"); + return -1; + } + + ll_init_map(&rth); + + + if ((dev = ll_index_to_name(p->ifindex)) == 0) { + fprintf(stderr, "Cannot find device %d\n", p->ifindex); + rtnl_close(&rth); + return -1; + } + + fprintf(f, "mirred (%s to device %s) %s", mirred_n2a(p->eaction), dev,action_n2a(p->action, b1, sizeof (b1))); + + fprintf(f, "\n "); + fprintf(f, "\tindex %d ref %d bind %d",p->index,p->refcnt,p->bindcnt); + + if (show_stats) { + if (tb[TCA_MIRRED_TM]) { + struct tcf_t *tm = RTA_DATA(tb[TCA_MIRRED_TM]); + print_tm(f,tm); + } + } + fprintf(f, "\n "); + rtnl_close(&rth); + return 0; +} + +struct action_util mirred_util = { + .id = "mirred", + .parse_aopt = parse_mirred, + .print_aopt = print_mirred, +}; --- /dev/null 1998-05-05 16:32:27.000000000 -0400 +++ /home/hadi/iproute2-2.6.9/include/linux/tc_act/tc_mirred.h 2004-10-04 11:34:03.000000000 -0400 @@ -0,0 +1,28 @@ +#ifndef __LINUX_TC_MIR_H +#define __LINUX_TC_MIR_H + +#include + +#define TCA_ACT_MIRRED 8 +#define TCA_EGRESS_REDIR 1 /* packet redirect to EGRESS*/ +#define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */ +#define TCA_INGRESS_REDIR 3 /* packet redirect to INGRESS*/ +#define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */ + +struct tc_mirred +{ + tc_gen; + int eaction; /* one of IN/EGRESS_MIRROR/REDIR */ + __u32 ifindex; /* ifindex of egress port */ +}; + +enum +{ + TCA_MIRRED_UNSPEC, + TCA_MIRRED_TM, + TCA_MIRRED_PARMS, + __TCA_MIRRED_MAX +}; +#define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1) + +#endif --- /home/hadi/iproute2-2.6.9/configure 2004/10/04 15:31:54 1.1 +++ /home/hadi/iproute2-2.6.9/configure 2004/10/04 15:36:07 @@ -26,12 +26,19 @@ fi rm -f /tmp/atmtest.c /tmp/atmtest -# hack for now +# hacks for now echo "TC actions" if [ -e "tc/m_gact.c" ] then + echo " GACT found" echo "TC_CONFIG_ACTION_GACT=y" >>Config echo "TC_CONFIG_ACTION_PROB=y" >>Config fi +if [ -e "tc/m_mirred.c" ] +then + echo " MIRRED found" + echo "TC_CONFIG_ACTION_MIRRED=y" >>Config +fi + --- /dev/null 1998-05-05 16:32:27.000000000 -0400 +++ /home/hadi/iproute2-2.6.9/doc/actions/mirred-usage 2004-10-04 14:38:43.000000000 -0400 @@ -0,0 +1,71 @@ + +Very funky action. I do plan to add to a few more things to it +This is the basic stuff. Idea borrowed from the way ethernet switches +mirror and redirect packets. + +Usage: + +mirred [index INDEX] +where: +DIRECTION := +ACTION := +INDEX is the specific policy instance id +DEVICENAME is the devicename + + +Mirroring essentially takes a copy of the packet whereas redirecting +steals the packet and redirects to specified destination. + +Some examples: +Host A is hooked up to us on eth0 + +tc qdisc add dev lo ingress +# redirect all packets arriving on ingress of lo to eth0 +tc filter add dev lo parent ffff: protocol ip prio 10 u32 \ +match u32 0 0 flowid 1:2 action mirred egress redirect dev eth0 + +On host A start a tcpdump on interface connecting to us. + +on our host ping -c 2 127.0.0.1 + +Ping would fail sinc all packets are heading out eth0 +tcpudmp on host A would show them + +if you substitute the redirect with mirror above as in: +tc filter add dev lo parent ffff: protocol ip prio 10 u32 \ +match u32 0 0 flowid 1:2 action mirred egress mirror dev eth0 + +Then you should see the packets on both host A and the local +stack (i.e ping would work). + +Even more funky example: + +# +#allow 1 out 10 packets to randomly make it to the +# host A (Randomness uses the netrand generator) +# +tc filter add dev lo parent ffff: protocol ip prio 10 u32 \ +match u32 0 0 flowid 1:2 \ +action drop random determ ok 10\ +action mirred egress mirror dev eth0 + +------ +Example 2: +# for packets coming from 10.0.0.9: +#Redirect packets on egress (to ISP A) if you exceed a certain rate +# to eth1 (to ISP B) if you exceed a certain rate +# + +tc qdisc add dev eth0 handle 1:0 root prio + +tc filter add dev eth0 parent 1:0 protocol ip prio 6 u32 \ +match ip src 10.0.0.9/32 flowid 1:16 \ +action police rate 100kbit burst 90k ok \ +action mirred egress mirror dev eth1 + +--- + +A more interesting example is when you mirror flows to a dummy device +so you could tcpdump them (dummy by defaults drops all devices it sees). +This is a very useful debug feature. + --- /home/hadi/iproute2-2.6.9/tc/Makefile 2004/10/04 15:34:15 1.1 +++ /home/hadi/iproute2-2.6.9/tc/Makefile 2004/10/04 15:35:40 @@ -21,6 +21,7 @@ TCMODULES += q_hfsc.o TCMODULES += q_htb.o TCMODULES += m_gact.o +TCMODULES += m_mirred.o TCOBJ += $(TCMODULES) --=-jsey1+L9qfIUO70ryExe Content-Disposition: attachment; filename=patch-ipt-tc-269-3 Content-Type: text/plain; name=patch-ipt-tc-269-3; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit --- /dev/null 2003-09-15 09:40:47.000000000 -0400 +++ /root/iproute2-2.6.9-041019-mod/tc/m_ipt.c 2004-10-25 18:37:57.656805960 -0400 @@ -0,0 +1,683 @@ +/* + * m_ipt.c iptables based targets + * utilities mostly ripped from iptables + * + * This program is free software; you can distribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Authors: J Hadi Salim (hadi@cyberus.ca) + * + * TODO: bad bad hardcoding IPT_LIB_DIR and PROC_SYS_MODPROBE + * +*/ + +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include "tc_util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *pname = "tc-ipt"; +const char *tname = "mangle"; +const char *pversion = "0.1"; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef IPT_LIB_DIR +#define IPT_LIB_DIR "/usr/local/lib/iptables" +#endif + +#ifndef PROC_SYS_MODPROBE +#define PROC_SYS_MODPROBE "/proc/sys/kernel/modprobe" +#endif + +static char *ipthooks[] = { + "NF_IP_PRE_ROUTING", + "NF_IP_LOCAL_IN", + "NF_IP_FORWARD", + "NF_IP_LOCAL_OUT", + "NF_IP_POST_ROUTING", +}; + +static struct option original_opts[] = { + {"jump", 1, 0, 'j'}, + {0, 0, 0, 0} +}; + +static struct iptables_target *t_list = NULL; +static unsigned int global_option_offset = 0; +#define OPTION_OFFSET 256 + +/* no clue why register match is within targets + figure out later. Talk to Harald -- JHS +*/ +void +register_match(struct iptables_match *me) +{ +/* fprintf(stderr, "\nDummy register_match\n"); */ +} + +void +register_target(struct iptables_target *me) +{ +/* fprintf(stderr, "\nDummy register_target %s \n", me->name); +*/ + me->next = t_list; + t_list = me; + +} + +void +exit_tryhelp(int status) +{ + fprintf(stderr, "Try `%s -h' or '%s --help' for more information.\n", + pname, pname); + exit(status); +} + +void +exit_error(enum exittype status, char *msg, ...) +{ + va_list args; + + va_start(args, msg); + fprintf(stderr, "%s v%s: ", pname, pversion); + vfprintf(stderr, msg, args); + va_end(args); + fprintf(stderr, "\n"); + if (status == PARAMETER_PROBLEM) + exit_tryhelp(status); + if (status == VERSION_PROBLEM) + fprintf(stderr, + "Perhaps iptables or your kernel needs to be upgraded.\n"); + exit(status); +} + +/* stolen from iptables 1.2.11 +They should really have them as a library so i can link to them +Email them next time i remember +*/ + +static char * +addr_to_network(const struct in_addr *addr) +{ + struct netent *net; + + if ((net = getnetbyaddr((long) ntohl(addr->s_addr), AF_INET)) != NULL) + return (char *) net->n_name; + + return (char *) NULL; +} + +char * +addr_to_dotted(const struct in_addr *addrp) +{ + static char buf[20]; + const unsigned char *bytep; + + bytep = (const unsigned char *) &(addrp->s_addr); + sprintf(buf, "%d.%d.%d.%d", bytep[0], bytep[1], bytep[2], bytep[3]); + return buf; +} + +int +string_to_number_ll(const char *s, unsigned long long min, unsigned long long max, + unsigned long long *ret) +{ + unsigned long long number; + char *end; + + /* Handle hex, octal, etc. */ + errno = 0; + number = strtoull(s, &end, 0); + if (*end == '\0' && end != s) { + /* we parsed a number, let's see if we want this */ + if (errno != ERANGE && min <= number && (!max || number <= max)) { + *ret = number; + return 0; + } + } + return -1; +} + +int +string_to_number_l(const char *s, unsigned long min, unsigned long max, + unsigned long *ret) +{ + int result; + unsigned long long number; + + result = string_to_number_ll(s, min, max, &number); + *ret = (unsigned long)number; + + return result; +} + +int string_to_number(const char *s, unsigned int min, unsigned int max, + unsigned int *ret) +{ + int result; + unsigned long number; + + result = string_to_number_l(s, min, max, &number); + *ret = (unsigned int)number; + + return result; +} + +#if 0 +int +string_to_number(const char *s, unsigned int min, unsigned int max, + unsigned int *ret) +{ + long number; + char *end; + + /* Handle hex, octal, etc. */ + errno = 0; + number = strtol(s, &end, 0); + if (*end == '\0' && end != s) { + /* we parsed a number, let's see if we want this */ + if (errno != ERANGE && min <= number && number <= max) { + *ret = number; + return 0; + } + } + return -1; +} +#endif + +static struct option * +copy_options(struct option *oldopts) +{ + struct option *merge; + unsigned int num_old; + for (num_old = 0; oldopts[num_old].name; num_old++) ; + merge = malloc(sizeof (struct option) * (num_old + 1)); + if (NULL == merge) + return NULL; + memcpy(merge, oldopts, num_old * sizeof (struct option)); + memset(merge + num_old, 0, sizeof (struct option)); + return merge; +} + +static struct option * +merge_options(struct option *oldopts, const struct option *newopts, + unsigned int *option_offset) +{ + struct option *merge; + unsigned int num_old, num_new, i; + + for (num_old = 0; oldopts[num_old].name; num_old++) ; + for (num_new = 0; newopts[num_new].name; num_new++) ; + + *option_offset = global_option_offset + OPTION_OFFSET; + + merge = malloc(sizeof (struct option) * (num_new + num_old + 1)); + memcpy(merge, oldopts, num_old * sizeof (struct option)); + for (i = 0; i < num_new; i++) { + merge[num_old + i] = newopts[i]; + merge[num_old + i].val += *option_offset; + } + memset(merge + num_old + num_new, 0, sizeof (struct option)); + + return merge; +} + +static void * +fw_calloc(size_t count, size_t size) +{ + void *p; + + if ((p = (void *) calloc(count, size)) == NULL) { + perror("iptables: calloc failed"); + exit(1); + } + return p; +} + +#if 0 +static void * +fw_malloc(size_t size) +{ + void *p; + + if ((p = (void *) malloc(size)) == NULL) { + perror("iptables: malloc failed"); + exit(1); + } + return p; +} + +int +check_inverse(const char option[], int *invert) +{ + if (option && strcmp(option, "!") == 0) { + if (*invert) + exit_error(PARAMETER_PROBLEM, + "Multiple `!' flags not allowed"); + + *invert = TRUE; + return TRUE; + } + return FALSE; +} +#endif + +struct iptables_target * +find_t(char *name) +{ + struct iptables_target *m; + for (m = t_list; m; m = m->next) { + if (strcmp(m->name, name) == 0) + return m; + } + + return NULL; +} + +struct iptables_target * +get_target_name(char *name) +{ + void *handle; + char *error; + char *new_name, *lname; + struct iptables_target *m; + + char path[sizeof (IPT_LIB_DIR) + sizeof ("/libipt_.so") + strlen(name)]; + + new_name = malloc(strlen(name) + 1); + lname = malloc(strlen(name) + 1); + if (new_name) + memset(new_name, '\0', strlen(name) + 1); + else + exit_error(PARAMETER_PROBLEM, "get_target_name"); + + if (lname) + memset(lname, '\0', strlen(name) + 1); + else + exit_error(PARAMETER_PROBLEM, "get_target_name"); + + strcpy(new_name, name); + strcpy(lname, name); + + if (isupper(lname[0])) { + int i; + for (i = 0; i < strlen(name); i++) { + lname[i] = tolower(lname[i]); + } + } + + if (islower(new_name[0])) { + int i; + for (i = 0; i < strlen(new_name); i++) { + new_name[i] = toupper(new_name[i]); + } + } + + sprintf(path, IPT_LIB_DIR "/libipt_%s.so", new_name); + handle = dlopen(path, RTLD_LAZY); + if (!handle) { + sprintf(path, IPT_LIB_DIR "/libipt_%s.so", lname); + handle = dlopen(path, RTLD_LAZY); + if (!handle) { + fputs(dlerror(), stderr); + printf("\n"); + return NULL; + } + } + + m = dlsym(handle, new_name); + if ((error = dlerror()) != NULL) { + m = (struct iptables_target *) dlsym(handle, lname); + if ((error = dlerror()) != NULL) { + m = find_t(new_name); + if (NULL == m) { + m = find_t(lname); + if (NULL == m) { + fputs(error, stderr); + fprintf(stderr, "\n"); + dlclose(handle); + return NULL; + } + } + } + } + + return m; +} + +#if 0 +char * +addr_to_dotted(const struct in_addr *addrp) +{ + static char buf[20]; + const unsigned char *bytep; + + bytep = (const unsigned char *) &(addrp->s_addr); + sprintf(buf, "%d.%d.%d.%d", bytep[0], bytep[1], bytep[2], bytep[3]); + return buf; +} +#endif + +struct in_addr * +dotted_to_addr(const char *dotted) +{ + static struct in_addr addr; + unsigned char *addrp; + char *p, *q; + unsigned int onebyte; + int i; + char buf[20]; + + /* copy dotted string, because we need to modify it */ + strncpy(buf, dotted, sizeof (buf) - 1); + addrp = (unsigned char *) &(addr.s_addr); + + p = buf; + for (i = 0; i < 3; i++) { + if ((q = strchr(p, '.')) == NULL) + return (struct in_addr *) NULL; + + *q = '\0'; + if (string_to_number(p, 0, 255, &onebyte) == -1) + return (struct in_addr *) NULL; + + addrp[i] = (unsigned char) onebyte; + p = q + 1; + } + + /* we've checked 3 bytes, now we check the last one */ + if (string_to_number(p, 0, 255, &onebyte) == -1) + return (struct in_addr *) NULL; + + addrp[3] = (unsigned char) onebyte; + + return &addr; +} + +int +build_st(struct iptables_target *target, struct ipt_entry_target *t) +{ + unsigned int nfcache = 0; + + if (target) { + size_t size; + + size = + IPT_ALIGN(sizeof (struct ipt_entry_target)) + target->size; + + if (NULL == t) { + target->t = fw_calloc(1, size); + target->init(target->t, &nfcache); + target->t->u.target_size = size; + } else { + target->t = t; + } + strcpy(target->t->u.user.name, target->name); + return 0; + } + + return -1; +} + +int +parse_ipt(struct action_util *a,int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) +{ + struct iptables_target *m = NULL; + struct ipt_entry fw; + struct rtattr *tail; + int c; + int rargc = *argc_p; + char **argv = *argv_p; + struct option *opts; + int argc = 0, iargc = 0; + char k[16]; + int res = -1; + int size = 0; + int iok = 0, ok = 0; + __u32 hook = 0, index = 0; + res = 0; + + { + int i; + for (i = 0; i < rargc; i++) { + if (NULL == argv[i] || 0 == strcmp(argv[i], "action")) { + break; + } + } + iargc = argc = i; + } + + if (argc <= 2) { + fprintf(stderr,"bad arguements to ipt %d vs %d \n", argc, rargc); + return -1; + } + + opts = copy_options(original_opts); + + if (NULL == opts) + return -1; + + while (1) { + c = getopt_long(argc, argv, "j:", opts, NULL); + if (c == -1) + break; + switch (c) { + case 'j': + m = get_target_name(optarg); + if (NULL != m) { + + if (0 > build_st(m, NULL)) { + printf(" %s error \n", m->name); + return -1; + } + opts = + merge_options(opts, m->extra_opts, + &m->option_offset); + } else { + fprintf(stderr," failed to find target %s\n\n", optarg); + return -1; + } + ok++; + break; + + default: + memset(&fw, 0, sizeof (fw)); + if (m) { + unsigned int fake_flags = 0; + m->parse(c - m->option_offset, argv, 0, + &fake_flags, NULL, &m->t); + } else { + fprintf(stderr," failed to find target %s\n\n", optarg); + return -1; + + } + ok++; + + /*m->final_check(m->t); -- Is this necessary? + ** useful when theres depencies + ** eg ipt_TCPMSS.c has have the TCP match loaded + ** before this can be used; + ** also seems the ECN target needs it + */ + + break; + + } + } + + if (iargc > optind) { + if (matches(argv[optind], "index") == 0) { + if (get_u32(&index, argv[optind + 1], 10)) { + fprintf(stderr, "Illegal \"index\"\n"); + return -1; + } + iok++; + + optind += 2; + } + } + + if (!ok && !iok) { + fprintf(stderr," ipt Parser BAD!! (%s)\n",argv); + return -1; + } + + { + struct tcmsg *t = NLMSG_DATA(n); + if (t->tcm_parent != TC_H_ROOT + && t->tcm_parent == TC_H_MAJ(TC_H_INGRESS)) { + hook = NF_IP_PRE_ROUTING; + } else { + hook = NF_IP_POST_ROUTING; + } + } + + tail = (struct rtattr *) (((void *) n) + NLMSG_ALIGN(n->nlmsg_len)); + addattr_l(n, MAX_MSG, tca_id, NULL, 0); + fprintf(stdout, "tablename: %s hook: %s\n ", tname, ipthooks[hook]); + fprintf(stdout, "\ttarget: "); + + if (m) + m->print(NULL, m->t, 0); + fprintf(stdout, " index %d\n", index); + + if (strlen(tname) > 16) { + size = 16; + k[15] = 0; + } else { + size = 1 + strlen(tname); + } + strncpy(k, tname, size); + + addattr_l(n, MAX_MSG, TCA_IPT_TABLE, k, size); + addattr_l(n, MAX_MSG, TCA_IPT_HOOK, &hook, 4); + addattr_l(n, MAX_MSG, TCA_IPT_INDEX, &index, 4); + if (m) + addattr_l(n, MAX_MSG, TCA_IPT_TARG, m->t, m->t->u.target_size); + tail->rta_len = + (((void *) n) + NLMSG_ALIGN(n->nlmsg_len)) - (void *) tail; + + argc -= optind; + argv += optind; + *argc_p = rargc - iargc; + *argv_p = argv; + + optind = 1; + + return 0; + +} + +int +print_ipt(struct action_util *au,FILE * f, struct rtattr *arg) +{ + struct rtattr *tb[TCA_IPT_MAX + 1]; + struct ipt_entry_target *t = NULL; + struct option *opts; + + if (arg == NULL) + return -1; + + opts = copy_options(original_opts); + + if (NULL == opts) + return -1; + memset(tb, 0, sizeof (tb)); + parse_rtattr(tb, TCA_IPT_MAX, RTA_DATA(arg), RTA_PAYLOAD(arg)); + + if (tb[TCA_IPT_TABLE] == NULL) { + fprintf(f, "[NULL ipt table name ] assuming mangle "); + } else { + fprintf(f, "tablename: %s ", + (char *) RTA_DATA(tb[TCA_IPT_TABLE])); + } + + if (tb[TCA_IPT_HOOK] == NULL) { + fprintf(f, "[NULL ipt hook name ]\n "); + return -1; + } else { + __u32 hook; + hook = *(__u32 *) RTA_DATA(tb[TCA_IPT_HOOK]); + fprintf(f, " hook: %s \n", ipthooks[hook]); + } + + if (tb[TCA_IPT_TARG] == NULL) { + fprintf(f, "\t[NULL ipt target parameters ] \n"); + return -1; + } else { + struct iptables_target *m = NULL; + t = RTA_DATA(tb[TCA_IPT_TARG]); + m = get_target_name(t->u.user.name); + if (NULL != m) { + if (0 > build_st(m, t)) { + fprintf(stderr, " %s error \n", m->name); + return -1; + } + + opts = + merge_options(opts, m->extra_opts, + &m->option_offset); + } else { + fprintf(stderr, " failed to find target %s\n\n", + t->u.user.name); + return -1; + } + fprintf(f, "\ttarget "); + m->print(NULL, m->t, 0); + if (tb[TCA_IPT_INDEX] == NULL) { + fprintf(f, " [NULL ipt target index ]\n"); + } else { + __u32 index; + index = *(__u32 *) RTA_DATA(tb[TCA_IPT_INDEX]); + fprintf(f, " \n\tindex %d", index); + } + + if (tb[TCA_IPT_CNT]) { + struct tc_cnt *c = RTA_DATA(tb[TCA_IPT_CNT]);; + fprintf(f, " ref %d bind %d", c->refcnt, c->bindcnt); + } + if (show_stats) { + if (tb[TCA_IPT_TM]) { + struct tcf_t *tm = RTA_DATA(tb[TCA_IPT_TM]); + print_tm(f,tm); + } + } + fprintf(f, " \n"); + + } + + return 0; +} + +struct action_util ipt_action_util = { + .id = "ipt", + .parse_aopt = parse_ipt, + .print_aopt = print_ipt, +}; + --- /dev/null 2003-09-15 09:40:47.000000000 -0400 +++ /root/iproute2-2.6.9-041019-mod/include/linux/tc_act/tc_ipt.h 2004-10-24 14:48:06.000000000 -0400 @@ -0,0 +1,21 @@ +#ifndef __LINUX_TC_IPT_H +#define __LINUX_TC_IPT_H + +#include + +#define TCA_ACT_IPT 6 + +enum +{ + TCA_IPT_UNSPEC, + TCA_IPT_TABLE, + TCA_IPT_HOOK, + TCA_IPT_INDEX, + TCA_IPT_CNT, + TCA_IPT_TM, + TCA_IPT_TARG, + __TCA_IPT_MAX +}; +#define TCA_IPT_MAX (__TCA_IPT_MAX - 1) + +#endif --- /root/iproute2-2.6.9-041019/tc/Makefile 2004-10-19 16:49:02.000000000 -0400 +++ /root/iproute2-2.6.9-041019-mod/tc/Makefile 2004-10-24 21:49:33.000000000 -0400 @@ -3,6 +3,8 @@ include ../Config +IPT_INCL = /root/iptables-1.2.11/include + TCMODULES := TCMODULES += q_fifo.o TCMODULES += q_sfq.o @@ -29,6 +31,12 @@ TCLIB += tc_cbq.o TCLIB += tc_estimator.o +ifeq ($(TC_CONFIG_ACTION_IPT),y) +LDLIBS += -L. m_ipt.o -ltc -lm -ldl +else +LDLIBS += -L. -ltc -lm -ldl +endif + CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PROB @@ -52,10 +60,15 @@ ./$* >$@ rm $* -all: libtc.a tc $(TCSO) $(NETEM_DIST) +all: ipt libtc.a tc $(TCSO) $(NETEM_DIST) tc: $(TCOBJ) $(LIBNETLINK) $(LIBUTIL) $(TCLIB) +ipt: +ifeq ($(TC_CONFIG_ACTION_IPT),y) + $(CC) $(CCOPTS) -I$(KERNEL_INCLUDE) $(DEFINES) -I$(IPT_INCL) -I../include -c -o m_ipt.o m_ipt.c +#$(CC) $(CCOPTS) -I$(KERNEL_INCLUDE) -I../include $(DEFINES) -DCONFIG_NET_CLS_ACT -I$(IPT_INCL) -c -o m_ipt.o m_ipt.c +endif libtc.a: $(TCLIB) $(AR) rcs $@ $(TCLIB) --- /root/iproute2-2.6.9-041019/configure 2004-10-19 16:49:02.000000000 -0400 +++ /root/iproute2-2.6.9-041019-mod/configure 2004-10-24 14:40:01.000000000 -0400 @@ -26,12 +26,24 @@ fi rm -f /tmp/atmtest.c /tmp/atmtest -# hack for now +# hacks for now echo "TC actions" if [ -e "tc/m_gact.c" ] then + echo " GACT found" echo "TC_CONFIG_ACTION_GACT=y" >>Config echo "TC_CONFIG_ACTION_PROB=y" >>Config fi +if [ -e "tc/m_mirred.c" ] +then + echo " MIRRED found" + echo "TC_CONFIG_ACTION_MIRRED=y" >>Config +fi + +if [ -e "tc/m_ipt.c" ] +then + echo " IPT found" + echo "TC_CONFIG_ACTION_IPT=y" >>Config +fi --=-jsey1+L9qfIUO70ryExe-- From kaber@trash.net Thu Nov 4 08:24:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 08:25:02 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4GOvVx020240 for ; Thu, 4 Nov 2004 08:24:58 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPkPQ-0004aY-S6; Thu, 04 Nov 2004 17:24:24 +0100 Message-ID: <418A57B8.9040205@trash.net> Date: Thu, 04 Nov 2004 17:24:24 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@cyberus.ca CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> <418A4AA0.8070609@trash.net> <1099583639.1081.30.camel@jzny.localdomain> In-Reply-To: <1099583639.1081.30.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11439 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1720 Lines: 59 jamal wrote: >On Thu, 2004-11-04 at 10:28, Patrick McHardy wrote: > >>Ok, here is the same patch without removing tc_lookup_action_id. >>It is instead surrounded by #if 0. >> > > >Why is this function bothering you? ;-> >Why do you need to put the #if 0? > Because the compiler will warn about an unused static function. >>- move the functions from include/net/pkt_act.h to act_generic.c >> > >Some of the larger ones make sense to move. Whats the main reason for >moving them? > I was talking about the larger ones. There are multiple large inline functions that are used by all(?) actions. >These two make sense. I need help eyeballing the iptables stuff. >I commented out some of the refcount attempts; also i think quiet a >few targets are not friendly in getting accessed by anything other than >iptables; I was going at some point fix them and send you guys patches. >Maybe you can help me in this area as well. > > I can't think of a reason why targets would mind beeing used by ipt, but I'll look out for problems. >>Is there already userspace-code for anything besides gact ? >>I would like to test my changes. >> >> >> > >Stephen is probably stalled somewhere because he hasnt been sucking in >my updates to iproute2. >I have the latest and greatest on my test machine at home. But here >are tc updates for ipt and mirred that i could find on my laptop. > > Thanks. >The ipt patch needs iptables libraries and may not work with latest >iptables (although the one at home will surely work). The problem is >some of the iptables functions were updated. It would be nice if i didnt >have to maintain my own variants in user space. > > I can't see a way to avoid this currently. Regards Patrick From hadi@cyberus.ca Thu Nov 4 08:32:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 08:32:30 -0800 (PST) Received: from mx02.cybersurf.com (mx02.cybersurf.com [209.197.145.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4GWOvt021149 for ; Thu, 4 Nov 2004 08:32:25 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx02.cybersurf.com with esmtp (Exim 4.30) id 1CPkWr-0002wy-Gd for netdev@oss.sgi.com; Thu, 04 Nov 2004 11:32:05 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CPkWp-0005AV-Ku; Thu, 04 Nov 2004 11:32:03 -0500 Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <418A57B8.9040205@trash.net> References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> <418A4AA0.8070609@trash.net> <1099583639.1081.30.camel@jzny.localdomain> <418A57B8.9040205@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1099585914.1081.53.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 11:31:54 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11440 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1499 Lines: 55 On Thu, 2004-11-04 at 11:24, Patrick McHardy wrote: > >Why is this function bothering you? ;-> > >Why do you need to put the #if 0? > > > Because the compiler will warn about an unused static function. > fsck the compiler. Ok, fine if-0 it. I will unif-0 it when i submit code later on. > > > >Some of the larger ones make sense to move. Whats the main reason for > >moving them? > > > I was talking about the larger ones. There are multiple > large inline functions that are used by all(?) actions. > Sure go ahead. > > I can't think of a reason why targets would mind beeing used by ipt, > but I'll look out for problems. > Try a few targets; what i found is they were bugs in the targets code. Typically they wont check for something or other that i pass NULL to and just directly reference it. This could be both in kernel and user space. > >The ipt patch needs iptables libraries and may not work with latest > >iptables (although the one at home will surely work). The problem is > >some of the iptables functions were updated. It would be nice if i didnt > >have to maintain my own variants in user space. > > > > I can't see a way to avoid this currently. > I guess nobody has needed it before; take a look at the code i cutnpasted. See if some of that code could be made common and just referenced by me (since you guys maintain it). Thanks a lot for your help Patrick. cheers, jamal PS:- I am gonna disappear for a short while - so responses will have high latency. From hadi@znyx.com Thu Nov 4 08:35:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 08:35:15 -0800 (PST) Received: from lotus.znyx.com (znx208-2-156-007.znyx.com [208.2.156.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4GZBfZ021633 for ; Thu, 4 Nov 2004 08:35:12 -0800 Received: from [10.0.0.9] ([208.2.156.2]) by lotus.znyx.com (Lotus Domino Release 5.0.11) with ESMTP id 2004110408384675:7870 ; Thu, 4 Nov 2004 08:38:46 -0800 Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function From: Jamal Hadi Salim Reply-To: hadi@znyx.com To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <1099585914.1081.53.camel@jzny.localdomain> References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> <418A4AA0.8070609@trash.net> <1099583639.1081.30.camel@jzny.localdomain> <418A57B8.9040205@trash.net> <1099585914.1081.53.camel@jzny.localdomain> Organization: Znyx Networks Message-Id: <1099586091.1080.56.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 04 Nov 2004 11:34:51 -0500 X-MIMETrack: Itemize by SMTP Server on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/04/2004 08:38:47 AM, Serialize by Router on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/04/2004 08:38:48 AM, Serialize complete at 11/04/2004 08:38:48 AM Content-Transfer-Encoding: 7bit Content-Type: text/plain X-archive-position: 11441 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@znyx.com Precedence: bulk X-list: netdev Content-Length: 199 Lines: 9 BTW, at some point i would like to discuss an IMQ replacement which uses mirred and dummy device extension. I want these patches to settle down for a while first and getting tested. cheers, jamal From kaber@trash.net Thu Nov 4 08:51:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 08:51:15 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4GpBww023137 for ; Thu, 4 Nov 2004 08:51:11 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPkos-0004ee-6N; Thu, 04 Nov 2004 17:50:42 +0100 Message-ID: <418A5DE2.9010001@trash.net> Date: Thu, 04 Nov 2004 17:50:42 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@znyx.com CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 5/5]: act_api: mark some functions static/remove unused function References: <4189CB70.3060703@trash.net> <1099576602.1039.151.camel@jzny.localdomain> <418A4AA0.8070609@trash.net> <1099583639.1081.30.camel@jzny.localdomain> <418A57B8.9040205@trash.net> <1099585914.1081.53.camel@jzny.localdomain> <1099586091.1080.56.camel@jzny.localdomain> In-Reply-To: <1099586091.1080.56.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11442 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 358 Lines: 14 Jamal Hadi Salim wrote: >BTW, at some point i would like to discuss an IMQ replacement >which uses mirred and dummy device extension. >I want these patches to settle down for a while first and getting >tested. > > I'm not very familiar with the needs of the IMQ users these days, but I'm sure there will be lots of people with wishes :) Regards Patrick From shemminger@osdl.org Thu Nov 4 10:01:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 10:01:38 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4I1Vh4029018 for ; Thu, 4 Nov 2004 10:01:31 -0800 Received: from dxpl.pdx.osdl.net (dxpl.pdx.osdl.net [172.20.1.103]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iA4I14921474; Thu, 4 Nov 2004 10:01:04 -0800 Date: Thu, 4 Nov 2004 10:01:04 -0800 From: Stephen Hemminger To: Michael Vittrup Larsen Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] tcp: efficient port randomisation Message-Id: <20041104100104.570e67cd@dxpl.pdx.osdl.net> In-Reply-To: <200411020854.44745.michael.vittrup.larsen@ericsson.com> References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411011058.23141.michael.vittrup.larsen@ericsson.com> <20041101092027.2a741e82@zqx3.pdx.osdl.net> <200411020854.44745.michael.vittrup.larsen@ericsson.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; x86_64-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA4I1Vh4029018 X-archive-position: 11443 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 3517 Lines: 71 On Tue, 2 Nov 2004 09:54:44 +0200 Michael Vittrup Larsen wrote: > On Monday 01 November 2004 18:20, Stephen Hemminger wrote: > > > * It is probably a good strategy to set 'tcp_rover_next' such that > > > the next search is resumed from the previous port found to be free. > > > (similar to the old algorithm). I don't see this in your patch, > > > but of course I could have missed it. > > > > It was intentional since it would require holding a lock around the search. > > The tradeoff is better SMP performance in the sparsely filled port space > > (more typical) vs. better UP performance in the case of a mostly full port > > space. > > I think a typical scenario is many short-lived (e.g. minutes) TCP connections, > few long-lived (e.g. hours) connections and an ephemeral port wrap-around > probably also in hours - at least a long time compared to the life-time of > the short-lived connections. But because of the hashing most ports will be scattered all over the port space, because they come from different hosts. > This would result in a closely spaced 'group' of ports being occupied > somewhere in the ephemeral port range, and 'tcp_rover_next' would point at > the uppermost extreme of this group and thus always guarantee a free port on > first try (collisions will only happen with long-lived connections). If you > don't update 'tcp_rover_next', and this somehow gets to lag behind this > 'group' of ports (say point at the lower extreme) you will need to search > through this group first before you enter the unoccupied port space. Also, Linux TCP will reuse ports if (saddr, daddr, sport) are different. Look at __tcp_v4_check_established. This means that the ports actually have to be in use with real connections to the same host. > Your scheme works initially because you do not lag behind the free port space, > but eventually you will, and I think this will result in less optimal > performance compared to the old behaviour. Free port space should be evenly distributed because of the hash function. > Since updating the 'tcp_rover_next' practically always result in a free port > on first try, I think SMP performance will not suffer even though the lock > was held all through the port search (except when the port space is very > crowded). But by not having a global lock on port allocation, different cpu's can be searching different hash trees. This would matter under Dos attack with multiple interfaces. > And yes, I do use Linux exclusively, so I do care :-)) > > >From a statistically point of view, if the connection life-times are uniformly > distributed from zero to infinite (theoretical scenario), it does not matter > what starting point you use. However, soon as life-times are not uniformly > distributed, this kind of search algorithm will benefit from good starting > point defining where the probability of used vs. unused port drop from high > to low. > > The BSD solution with a pure random rover suffers similarly, especially when > the port space becomes crowded. > > > > > * connect_port_offset() does not (at least from an algorithm point > > > of view) need to return an u32, an u16 is sufficient. > > > > If it is truncated to u16, then compiler has to take extra effort to > > truncate is unnecessary given later modulo operation. > > I agree (in fact thats what I argued in the draft) - it probably depends on > your platform - you are assuming a 32-bit platform I guess. From kaber@trash.net Thu Nov 4 10:16:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 10:16:22 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4IGHIY030620 for ; Thu, 4 Nov 2004 10:16:18 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPm9K-0004ry-I0; Thu, 04 Nov 2004 19:15:54 +0100 Message-ID: <418A71DA.2090607@trash.net> Date: Thu, 04 Nov 2004 19:15:54 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Ulrich Weber CC: vpn-failover@lists.balabit.hu, netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net Subject: Re: [Vpn-failover] [RFC] IPSEC failover - Netlink part References: <1099045435.2888.47.camel@nienna.balabit> <418A3630.1040900@astaro.de> In-Reply-To: <418A3630.1040900@astaro.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11444 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 3666 Lines: 137 Ulrich Weber wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Hi, > > I take the opportunity to post my code as well. At the moment I'm > working at > the same as Krisztian. My solutions however is for openswan, which uses > netlink instead of pfkey. > > Please find attached the appropriate netlink modifications to > include/linux/xfrm.h and net/xfrm/xfrm_users.c > > In theses patches, a new netlink group (XFRMGRP_REPLAY) is added to > notify > about seq number changes. Each notify message contains a xfrm_usersa_id > struct with the replay struct attached as rt attribute. In addition, > these > replay struct is also attached at ipsec sa dumps. > > Any comments are welcome :) Some minor bugs, see below. Regards Patrick >------------------------------------------------------------------------ > >--- linux.org/include/linux/xfrm.h. 2004-10-11 04:57:07.000000000 +0200 >+++ linux/include/linux/xfrm.h 2004-10-18 17:00:43.000000000 +0200 >@@ -140,6 +140,9 @@ > XFRM_MSG_FLUSHPOLICY, > #define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY > >+ XFRM_MSG_UPDSEQ, >+#define XFRM_MSG_UPDSEQ XFRM_MSG_UPDSEQ >+ > XFRM_MSG_MAX > }; > >@@ -171,6 +174,7 @@ > XFRMA_ALG_COMP, /* struct xfrm_algo */ > XFRMA_ENCAP, /* struct xfrm_algo + struct xfrm_encap_tmpl */ > XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */ >+ XFRMA_REPLAY, /* struct xfrm_replay_state */ > __XFRMA_MAX > > #define XFRMA_MAX (__XFRMA_MAX - 1) >@@ -258,5 +258,6 @@ > > #define XFRMGRP_ACQUIRE 1 > #define XFRMGRP_EXPIRE 2 >+#define XFRMGRP_REPLAY 3 > > #endif /* _LINUX_XFRM_H */ > > >------------------------------------------------------------------------ > >--- linux.org/net/xfrm/xfrm_user.c 2004-10-18 23:54:32.000000000 +0200 >+++ linux/net/xfrm/xfrm_user.c 2004-10-21 16:27:59.000000000 +0200 >@@ -240,6 +240,12 @@ > if ((err = attach_encap_tmpl(&x->encap, xfrma[XFRMA_ENCAP-1]))) > goto error; > >+ if(xfrma[XFRMA_REPLAY-1]) { >+ struct xfrm_replay_state *replay; >+ replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); >+ x->replay = *replay; >+ } >+ > err = -ENOENT; > x->type = xfrm_get_type(x->id.proto, x->props.family); > if (x->type == NULL) >@@ -368,6 +375,8 @@ > if (x->encap) > RTA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap); > >+ RTA_PUT(skb, XFRMA_REPLAY, sizeof(x->replay), &x->replay); >+ > nlh->nlmsg_len = skb->tail - b; > out: > sp->this_idx++; >@@ -852,6 +861,27 @@ > return 0; > } > >+static int xfrm_update_seq(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) >+{ >+ struct xfrm_state *x; >+ struct xfrm_usersa_id *p = NLMSG_DATA(nlh); > > >+ struct xfrm_replay_state *replay; >+ >+ x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family); >+ if (x == NULL) { >+ printk(KERN_INFO "Found no xfrm state for sa seq update\n"); >+ return -ESRCH; >+ } >+ >+ if(xfrma[XFRMA_REPLAY-1]) { >+ replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); >+ x->replay = *replay; > > >+ } >+ else return -EINVAL; > > ^^ leaks xfrm_state reference >+ >+ return 0; > > ^^ same here >+} >+ > static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = { > NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)), /* NEW SA */ > NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)), /* DEL SA */ >@@ -867,6 +897,7 @@ > NLMSG_LENGTH(sizeof(struct xfrm_user_polexpire)), /* POLEXPIRE */ > NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush)), /* FLUSH SA */ > NLMSG_LENGTH(0), /* FLUSH POLICY */ >+ NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),/* UPD SEQ */ > > ^^ what about struct xfrm_replay_state ? From romieu@fr.zoreil.com Thu Nov 4 10:47:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 10:47:52 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4Ill3t000607 for ; Thu, 4 Nov 2004 10:47:48 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA4Ijavr003034; Thu, 4 Nov 2004 19:45:36 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA4IjTZ3003033; Thu, 4 Nov 2004 19:45:29 +0100 Date: Thu, 4 Nov 2004 19:45:29 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 2/3] r8169: Large Send enablement Message-ID: <20041104184529.GA2694@electric-eye.fr.zoreil.com> References: <200411021203.22003.jdmason@us.ibm.com> <20041102191103.GA24860@electric-eye.fr.zoreil.com> <200411031816.11675.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411031816.11675.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11445 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 764 Lines: 17 Jon Mason : > On Tuesday 02 November 2004 01:11 pm, Francois Romieu wrote: > [...] > > - If rtl8169_open() fails [*] when the device was previously up, the driver > > could/should try to recover. > > I disagree. It should fail, complain loudly, and let the user try and fix it > (or return it to the previous state). The code provided below will act like Mmmm... Actually both patches try to paper over the real issue: the driver should reserve the ressources it needs for the change of mtu first. Ok, I'll take the patch provided I can't find anything badly racy in it and focus on the 8139C+/8169 merge. It has already been delayed for too long and it seems the right place to fix the aforementionned issue with style :o) -- Ueimor From kaber@trash.net Thu Nov 4 15:25:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 15:25:58 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4NPrJx027282 for ; Thu, 4 Nov 2004 15:25:53 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPqyy-0006Yt-68; Fri, 05 Nov 2004 00:25:32 +0100 Message-ID: <418ABA6C.8060402@trash.net> Date: Fri, 05 Nov 2004 00:25:32 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 4/4]: ipt: convert jiffie values to USER_HZ when dumping Content-Type: multipart/mixed; boundary="------------050509080902080304040906" X-archive-position: 11449 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1542 Lines: 48 This is a multi-part message in MIME format. --------------050509080902080304040906 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Convert jiffie values to USER_HZ in ipt action. --------------050509080902080304040906 Content-Type: text/x-patch; name="4.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="4.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/05 00:17:18+01:00 kaber@coreworks.de # [PKT_SCHED]: ipt: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # # net/sched/ipt.c # 2004/11/05 00:17:10+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: ipt: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/ipt.c b/net/sched/ipt.c --- a/net/sched/ipt.c 2004-11-05 00:19:01 +01:00 +++ b/net/sched/ipt.c 2004-11-05 00:19:01 +01:00 @@ -334,9 +334,9 @@ RTA_PUT(skb, TCA_IPT_HOOK, 4, &p->hook); RTA_PUT(skb, TCA_IPT_CNT, sizeof(struct tc_cnt), &c); RTA_PUT(skb, TCA_IPT_TABLE, IFNAMSIZ, p->tname); - tm.install = jiffies - p->tm.install; - tm.lastuse = jiffies - p->tm.lastuse; - tm.expires = p->tm.expires; + tm.install = jiffies_to_clock_t(jiffies - p->tm.install); + tm.lastuse = jiffies_to_clock_t(jiffies - p->tm.lastuse); + tm.expires = jiffies_to_clock_t(p->tm.expires); RTA_PUT(skb, TCA_IPT_TM, sizeof (tm), &tm); return skb->len; --------------050509080902080304040906-- From kaber@trash.net Thu Nov 4 15:25:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 15:25:44 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4NPcIq027243 for ; Thu, 4 Nov 2004 15:25:38 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPqyg-0006YV-OH; Fri, 05 Nov 2004 00:25:14 +0100 Message-ID: <418ABA5A.70800@trash.net> Date: Fri, 05 Nov 2004 00:25:14 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 1/4]: pedit: convert jiffie values to USER_HZ when dumping Content-Type: multipart/mixed; boundary="------------020803060501050404010200" X-archive-position: 11446 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1453 Lines: 48 This is a multi-part message in MIME format. --------------020803060501050404010200 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Convert jiffie values to USER_HZ in pedit action. --------------020803060501050404010200 Content-Type: text/x-patch; name="1.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="1.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 20:18:34+01:00 kaber@coreworks.de # [PKT_SCHED]: pedit: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # # net/sched/pedit.c # 2004/11/04 20:18:27+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: pedit: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/pedit.c b/net/sched/pedit.c --- a/net/sched/pedit.c 2004-11-05 00:18:46 +01:00 +++ b/net/sched/pedit.c 2004-11-05 00:18:46 +01:00 @@ -244,9 +244,9 @@ #endif RTA_PUT(skb, TCA_PEDIT_PARMS, s, opt); - t.install = jiffies - p->tm.install; - t.lastuse = jiffies - p->tm.lastuse; - t.expires = p->tm.expires; + t.install = jiffies_to_clock_t(jiffies - p->tm.install); + t.lastuse = jiffies_to_clock_t(jiffies - p->tm.lastuse); + t.expires = jiffies_to_clock_t(p->tm.expires); RTA_PUT(skb, TCA_PEDIT_TM, sizeof (t), &t); return skb->len; --------------020803060501050404010200-- From kaber@trash.net Thu Nov 4 15:25:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 15:25:51 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4NPlrx027260 for ; Thu, 4 Nov 2004 15:25:47 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPqyr-0006Yi-Kw; Fri, 05 Nov 2004 00:25:25 +0100 Message-ID: <418ABA65.3090601@trash.net> Date: Fri, 05 Nov 2004 00:25:25 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 2/4]: mirred: convert jiffie values to USER_HZ when dumping Content-Type: multipart/mixed; boundary="------------050909090204030802000404" X-archive-position: 11447 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1607 Lines: 48 This is a multi-part message in MIME format. --------------050909090204030802000404 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Convert jiffie values to USER_HZ in mirred action. --------------050909090204030802000404 Content-Type: text/x-patch; name="2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 20:21:35+01:00 kaber@coreworks.de # [PKT_SCHED]: mirred: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # # net/sched/mirred.c # 2004/11/04 20:21:29+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: mirred: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/mirred.c b/net/sched/mirred.c --- a/net/sched/mirred.c 2004-11-05 00:18:51 +01:00 +++ b/net/sched/mirred.c 2004-11-05 00:18:51 +01:00 @@ -257,9 +257,9 @@ opt.ifindex = p->ifindex; DPRINTK(" tcf_mirred_dump index %d action %d eaction %d ifndex %d\n",p->index,p->action,p->eaction,p->ifindex); RTA_PUT(skb, TCA_MIRRED_PARMS, sizeof (opt), &opt); - t.install = jiffies - p->tm.install; - t.lastuse = jiffies - p->tm.lastuse; - t.expires = p->tm.expires; + t.install = jiffies_to_clock_t(jiffies - p->tm.install); + t.lastuse = jiffies_to_clock_t(jiffies - p->tm.lastuse); + t.expires = jiffies_to_clock_t(p->tm.expires); RTA_PUT(skb, TCA_MIRRED_TM, sizeof (t), &t); return skb->len; --------------050909090204030802000404-- From kaber@trash.net Thu Nov 4 15:25:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 15:25:54 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA4NPnvX027264 for ; Thu, 4 Nov 2004 15:25:50 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CPqyu-0006Yn-Mv; Fri, 05 Nov 2004 00:25:28 +0100 Message-ID: <418ABA68.4040100@trash.net> Date: Fri, 05 Nov 2004 00:25:28 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jamal Subject: [PATCH 2.6 3/4]: gact: convert jiffie values to USER_HZ when dumping Content-Type: multipart/mixed; boundary="------------010902060007020400060401" X-archive-position: 11448 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1462 Lines: 48 This is a multi-part message in MIME format. --------------010902060007020400060401 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Convert jiffie values to USER_HZ in gact action. --------------010902060007020400060401 Content-Type: text/x-patch; name="3.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="3.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/04 20:22:38+01:00 kaber@coreworks.de # [PKT_SCHED]: gact: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # # net/sched/gact.c # 2004/11/04 20:22:32+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: gact: convert jiffie values to USER_HZ when dumping # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/gact.c b/net/sched/gact.c --- a/net/sched/gact.c 2004-11-05 00:18:57 +01:00 +++ b/net/sched/gact.c 2004-11-05 00:18:57 +01:00 @@ -203,9 +203,9 @@ RTA_PUT(skb, TCA_GACT_PROB, sizeof (p_opt), &p_opt); } #endif - t.install = jiffies - p->tm.install; - t.lastuse = jiffies - p->tm.lastuse; - t.expires = p->tm.expires; + t.install = jiffies_to_clock_t(jiffies - p->tm.install); + t.lastuse = jiffies_to_clock_t(jiffies - p->tm.lastuse); + t.expires = jiffies_to_clock_t(p->tm.expires); RTA_PUT(skb, TCA_GACT_TM, sizeof (t), &t); return skb->len; --------------010902060007020400060401-- From jgarzik@pobox.com Thu Nov 4 18:18:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 18:18:41 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA52IXfi006547 for ; Thu, 4 Nov 2004 18:18:34 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPtg6-0001M0-N8; Fri, 05 Nov 2004 02:18:15 +0000 Message-ID: <418AE27D.6060609@pobox.com> Date: Thu, 04 Nov 2004 21:16:29 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?ISO-2022-JP?B?WU9TSElGVUpJIEhpZGVha2kgLyAbJEI1SEYjMVFMQBsoQg==?= CC: davem@davemloft.net, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org Subject: Re: IPv6 dead in -bk11 References: <20041102.225343.06193184.yoshfuji@linux-ipv6.org> <4187A4E3.8010600@pobox.com> <20041103.012923.102810732.yoshfuji@linux-ipv6.org> <20041104.012128.51410945.yoshfuji@linux-ipv6.org> In-Reply-To: <20041104.012128.51410945.yoshfuji@linux-ipv6.org> Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit X-archive-position: 11450 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 387 Lines: 19 YOSHIFUJI Hideaki / 吉藤英明 wrote: > Sorry, this bug was introduced by my changeset: > . > > David, this should fix the issue. > Please apply. > > D: Don't purge default routes by RA. > D: > D: Signed-off-by: Hideaki YOSHIFUJI ACK. This fixed my problem. Thanks! Jeff From jdmason@us.ibm.com Thu Nov 4 21:51:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 21:51:46 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA55pYZR015107 for ; Thu, 4 Nov 2004 21:51:41 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA55pBLv229882 for ; Fri, 5 Nov 2004 00:51:11 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA55pB1D268252 for ; Thu, 4 Nov 2004 22:51:11 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA55pBEr031447 for ; Thu, 4 Nov 2004 22:51:11 -0700 Received: from sig-9-65-22-92.mts.ibm.com (sig-9-65-22-92.mts.ibm.com [9.65.22.92]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA55pBOO031439; Thu, 4 Nov 2004 22:51:11 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: Re: [PATCH 2/3] r8169: Large Send enablement Date: Fri, 5 Nov 2004 05:50:33 +0000 User-Agent: KMail/1.7 Cc: netdev@oss.sgi.com, jgarzik@pobox.com References: <200411021203.22003.jdmason@us.ibm.com> <200411031816.11675.jdmason@us.ibm.com> <20041104184529.GA2694@electric-eye.fr.zoreil.com> In-Reply-To: <20041104184529.GA2694@electric-eye.fr.zoreil.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411050550.33521.jdmason@us.ibm.com> X-archive-position: 11451 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 808 Lines: 18 On Thursday 04 November 2004 06:45 pm, Francois Romieu wrote: > Jon Mason : > > On Tuesday 02 November 2004 01:11 pm, Francois Romieu wrote: > > [...] > > > > > - If rtl8169_open() fails [*] when the device was previously up, the > > > driver could/should try to recover. > > > > I disagree. It should fail, complain loudly, and let the user try and > > fix it (or return it to the previous state). The code provided below > > will act like > > Mmmm... Actually both patches try to paper over the real issue: the driver > should reserve the resources it needs for the change of mtu first. Agreed. I did a quick look in the other drivers, and didn't find any drivers that handle this possibility. Most of them ignore the fact. This sounds like an open hole in all of the drivers. From davem@davemloft.net Thu Nov 4 22:29:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 22:29:32 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA56TOWu016359 for ; Thu, 4 Nov 2004 22:29:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPxQ9-0004zi-00; Thu, 04 Nov 2004 22:18:01 -0800 Date: Thu, 4 Nov 2004 22:18:01 -0800 From: "David S. Miller" To: hadi@cyberus.ca Cc: buytenh@wantstofly.org, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-Id: <20041104221801.584c8f11.davem@davemloft.net> In-Reply-To: <1099577717.1039.155.camel@jzny.localdomain> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11452 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 1351 Lines: 36 On 04 Nov 2004 09:15:17 -0500 jamal wrote: > Could you turn off netfilter and see if this continues to happen? That's one possible angle, but let's look at the tracepoints more closely. BTW Lennert, the decoded addresses are extremely helpful. Thanks. Jeff, could you similarly decode the ones that you seem to get? That would be an incredibly useful datapoint. If you've provided this already, my bad and please point me at where you posted that. > > BUG: dst underflow -1: 3bcf9a80 at 42350024 > > BUG: dst underflow 0: 3bcf9a80 at 423486d2 > > BUG: dst underflow 0: 3bcf9a80 at 4235823d ... > > 0x42350024 - 0x42345000 = 0xb024, corresponds to: > > 0000affa > > > > 0x423486d2 - 0x42345000 = 0x36d2, corresponds to: > > 0000339d > > > > 0x4235823d - 0x42345000 = 0x1323d, corresponds to: > > 00012c0d (god, that's one big function btw) The last one is the most interesting. The only dst_release() call that occurs in udpv6_sendmsg() is when xfrm_lookup() returns an error. The semantics of that function are a complete mess (when it errors, it sometimes releases the DST, sometimes does not) and I'll fix that up. But let me ask, do you have any IPSEC policies in the kernel when these BUGs trigger? If so, I'm pretty sure I know what the problem may be. From yoshfuji@linux-ipv6.org Thu Nov 4 22:53:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 22:53:24 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA56rI4q017188 for ; Thu, 4 Nov 2004 22:53:20 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 1D8FC33CE5; Fri, 5 Nov 2004 15:53:57 +0900 (JST) Date: Fri, 05 Nov 2004 15:53:55 +0900 (JST) Message-Id: <20041105.155355.110780816.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: hadi@cyberus.ca, buytenh@wantstofly.org, jgarzik@pobox.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: BUG: dst underflow (again) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041104221801.584c8f11.davem@davemloft.net> References: <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11453 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1615 Lines: 50 In article <20041104221801.584c8f11.davem@davemloft.net> (at Thu, 4 Nov 2004 22:18:01 -0800), "David S. Miller" says: > > > 00012c0d (god, that's one big function btw) > > The last one is the most interesting. The only dst_release() call > that occurs in udpv6_sendmsg() is when xfrm_lookup() returns > an error. The semantics of that function are a complete mess > (when it errors, it sometimes releases the DST, sometimes does not) > and I'll fix that up. Oh,yes, something like this? Signed-off-by: Hideaki YOSHIFUJI ===== net/ipv6/udp.c 1.76 vs edited ===== --- 1.76/net/ipv6/udp.c 2004-10-26 11:47:26 +09:00 +++ edited/net/ipv6/udp.c 2004-11-05 15:42:00 +09:00 @@ -631,7 +631,7 @@ struct ipv6_txoptions *opt = NULL; struct ip6_flowlabel *flowlabel = NULL; struct flowi *fl = &inet->cork.fl; - struct dst_entry *dst; + struct dst_entry *dst = NULL; int addr_len = msg->msg_namelen; int ulen = len; int hlimit = -1; @@ -797,10 +797,8 @@ if (final_p) ipv6_addr_copy(&fl->fl6_dst, final_p); - if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) { - dst_release(dst); + if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) goto out; - } if (hlimit < 0) { if (ipv6_addr_is_multicast(&fl->fl6_dst)) @@ -846,6 +844,7 @@ err = np->recverr ? net_xmit_errno(err) : 0; release_sock(sk); out: + dst_release(dst); fl6_sock_release(flowlabel); if (!err) { UDP6_INC_STATS_USER(UDP_MIB_OUTDATAGRAMS); -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From jgarzik@pobox.com Thu Nov 4 23:06:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:06:21 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA576Fcg017888 for ; Thu, 4 Nov 2004 23:06:16 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyAV-0005oX-FO; Fri, 05 Nov 2004 07:05:55 +0000 Message-ID: <418B2645.6080404@pobox.com> Date: Fri, 05 Nov 2004 02:05:41 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" , hadi@cyberus.ca CC: buytenh@wantstofly.org, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> In-Reply-To: <20041104221801.584c8f11.davem@davemloft.net> Content-Type: multipart/mixed; boundary="------------060008080907010202080502" X-archive-position: 11454 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 4961 Lines: 194 This is a multi-part message in MIME format. --------------060008080907010202080502 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit David S. Miller wrote: > Jeff, could you similarly decode the ones that you seem to get? > That would be an incredibly useful datapoint. If you've provided > this already, my bad and please point me at where you posted that. I've compiled IPv6 into my router's kernel image, so next time I reboot, I should be able to get at symbol info out of the BUGs a bit more easily. > But let me ask, do you have any IPSEC policies in the kernel > when these BUGs trigger? If so, I'm pretty sure I know what > the problem may be. I know this question wasn't directed at me, but, I do always compile ipsec stuff into my kernel, in addition to netfilter. The relevant options are attached for the curious. Jeff P.S. Jamal-- I cannot disable netfilter for a period of time long enough to cause the BUGs to be produced, since that disables my NAT'ing. --------------060008080907010202080502 Content-Type: text/plain; name="config.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="config.txt" # CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set CONFIG_NETLINK_DEV=y CONFIG_UNIX=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m # CONFIG_NET_IPGRE_BROADCAST is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set # CONFIG_SYN_COOKIES is not set CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_TUNNEL=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_INET6_TUNNEL=m CONFIG_IPV6_TUNNEL=m CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=m # CONFIG_IP_NF_CT_ACCT is not set # CONFIG_IP_NF_CONNTRACK_MARK is not set # CONFIG_IP_NF_CT_PROTO_SCTP is not set CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_REALM=m # CONFIG_IP_NF_MATCH_SCTP is not set CONFIG_IP_NF_MATCH_COMMENT=m CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_RAW=m # CONFIG_IP_NF_TARGET_NOTRACK is not set CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_IP_NF_COMPAT_IPCHAINS is not set # CONFIG_IP_NF_COMPAT_IPFWADM is not set # # IPv6: Netfilter Configuration # CONFIG_IP6_NF_QUEUE=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m CONFIG_IP6_NF_RAW=m CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=m # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set CONFIG_SCTP_HMAC_SHA1=y # CONFIG_SCTP_HMAC_MD5 is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set CONFIG_NET_CLS_ROUTE=y --------------060008080907010202080502-- From davem@davemloft.net Thu Nov 4 23:25:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:25:59 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57PpHJ018726 for ; Thu, 4 Nov 2004 23:25:52 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPyIr-00057R-00; Thu, 04 Nov 2004 23:14:33 -0800 Date: Thu, 4 Nov 2004 23:14:33 -0800 From: "David S. Miller" To: Jeff Garzik Cc: hadi@cyberus.ca, buytenh@wantstofly.org, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-Id: <20041104231433.3a7233e8.davem@davemloft.net> In-Reply-To: <418B2645.6080404@pobox.com> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <418B2645.6080404@pobox.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11455 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 1043 Lines: 26 On Fri, 05 Nov 2004 02:05:41 -0500 Jeff Garzik wrote: > David S. Miller wrote: > > Jeff, could you similarly decode the ones that you seem to get? > > That would be an incredibly useful datapoint. If you've provided > > this already, my bad and please point me at where you posted that. > > I've compiled IPv6 into my router's kernel image, so next time I reboot, > I should be able to get at symbol info out of the BUGs a bit more easily. Thanks a lot. > > But let me ask, do you have any IPSEC policies in the kernel > > when these BUGs trigger? If so, I'm pretty sure I know what > > the problem may be. > > I know this question wasn't directed at me, but, I do always compile > ipsec stuff into my kernel, in addition to netfilter. The relevant > options are attached for the curious. Yes, but do you actually install any IPSEC rules into your system? The only way xfrm_lookup() can ever fall (and call that BUG'ing dst_release() in udpv6_sendmsg()) is if you have at least some IPSEC policies configured. From davem@davemloft.net Thu Nov 4 23:27:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:27:35 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57RU0b019036 for ; Thu, 4 Nov 2004 23:27:31 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CPyKY-00059N-00; Thu, 04 Nov 2004 23:16:18 -0800 Date: Thu, 4 Nov 2004 23:16:18 -0800 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: hadi@cyberus.ca, buytenh@wantstofly.org, jgarzik@pobox.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: BUG: dst underflow (again) Message-Id: <20041104231618.1d584a6f.davem@davemloft.net> In-Reply-To: <20041105.155355.110780816.yoshfuji@linux-ipv6.org> References: <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105.155355.110780816.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA57RU0b019036 X-archive-position: 11456 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 6707 Lines: 267 On Fri, 05 Nov 2004 15:53:55 +0900 (JST) YOSHIFUJI Hideaki / 吉藤英明 wrote: > In article <20041104221801.584c8f11.davem@davemloft.net> (at Thu, 4 Nov 2004 22:18:01 -0800), "David S. Miller" says: > > > > > 00012c0d (god, that's one big function btw) > > > > The last one is the most interesting. The only dst_release() call > > that occurs in udpv6_sendmsg() is when xfrm_lookup() returns > > an error. The semantics of that function are a complete mess > > (when it errors, it sometimes releases the DST, sometimes does not) > > and I'll fix that up. > > Oh,yes, something like this? Something, but not quite. :-) This change you propose adds a leak, you have to modify xfrm_lookup() as well. I'm mid-way through such changes, but it looks something like this (BTW, note the addrconf.c leak I noticed today as well): ===== net/ipv6/addrconf.c 1.115 vs edited ===== --- 1.115/net/ipv6/addrconf.c 2004-10-25 21:11:35 -07:00 +++ edited/net/ipv6/addrconf.c 2004-11-04 13:10:26 -08:00 @@ -509,6 +509,7 @@ rt = addrconf_dst_alloc(idev, addr, 0); if (IS_ERR(rt)) { err = PTR_ERR(rt); + rt = NULL; goto out; } @@ -572,6 +573,8 @@ if (unlikely(err == 0)) notifier_call_chain(&inet6addr_chain, NETDEV_UP, ifa); else { + if (rt) + dst_free(&rt->u.dst); kfree(ifa); ifa = ERR_PTR(err); } ===== net/ipv6/datagram.c 1.19 vs edited ===== --- 1.19/net/ipv6/datagram.c 2004-08-27 09:35:00 -07:00 +++ edited/net/ipv6/datagram.c 2004-11-04 16:43:24 -08:00 @@ -174,10 +174,8 @@ if (final_p) ipv6_addr_copy(&fl.fl6_dst, final_p); - if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { - dst_release(dst); + if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) goto out; - } /* source address lookup done in ip6_dst_lookup */ ===== net/ipv6/icmp.c 1.59 vs edited ===== --- 1.59/net/ipv6/icmp.c 2004-09-14 22:32:09 -07:00 +++ edited/net/ipv6/icmp.c 2004-11-04 16:44:01 -08:00 @@ -373,7 +373,7 @@ if (err) goto out; if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) - goto out_dst_release; + goto out; if (hlimit < 0) { if (ipv6_addr_is_multicast(&fl.fl6_dst)) @@ -461,7 +461,7 @@ if (err) goto out; if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) - goto out_dst_release; + goto out; if (hlimit < 0) { if (ipv6_addr_is_multicast(&fl.fl6_dst)) ===== net/ipv6/ip6_tunnel.c 1.25 vs edited ===== --- 1.25/net/ipv6/ip6_tunnel.c 2004-09-13 13:03:39 -07:00 +++ edited/net/ipv6/ip6_tunnel.c 2004-11-04 16:49:24 -08:00 @@ -759,9 +759,14 @@ t->recursion--; return 0; + tx_err_link_failure: stats->tx_carrier_errors++; dst_link_failure(skb); + if (opt) + kfree(opt); + goto tx_err; + tx_err_dst_release: dst_release(dst); if (opt) ===== net/ipv6/ndisc.c 1.104 vs edited ===== --- 1.104/net/ipv6/ndisc.c 2004-11-03 11:56:07 -08:00 +++ edited/net/ipv6/ndisc.c 2004-11-04 16:49:48 -08:00 @@ -408,10 +408,8 @@ return; err = xfrm_lookup(&dst, &fl, NULL, 0); - if (err < 0) { - dst_release(dst); + if (err < 0) return; - } if (inc_opt) { if (dev->addr_len) @@ -499,10 +497,8 @@ return; err = xfrm_lookup(&dst, &fl, NULL, 0); - if (err < 0) { - dst_release(dst); + if (err < 0) return; - } len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); send_llinfo = dev->addr_len && !ipv6_addr_any(saddr); @@ -575,10 +571,8 @@ return; err = xfrm_lookup(&dst, &fl, NULL, 0); - if (err < 0) { - dst_release(dst); + if (err < 0) return; - } len = sizeof(struct icmp6hdr); if (dev->addr_len) @@ -1302,10 +1296,8 @@ dst = &rt->u.dst; err = xfrm_lookup(&dst, &fl, NULL, 0); - if (err) { - dst_release(dst); + if (err) return; - } rt = (struct rt6_info *) dst; ===== net/ipv6/raw.c 1.73 vs edited ===== --- 1.73/net/ipv6/raw.c 2004-10-25 19:47:26 -07:00 +++ edited/net/ipv6/raw.c 2004-11-04 16:50:05 -08:00 @@ -743,10 +743,8 @@ if (final_p) ipv6_addr_copy(&fl.fl6_dst, final_p); - if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { - dst_release(dst); + if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) goto out; - } if (hlimit < 0) { if (ipv6_addr_is_multicast(&fl.fl6_dst)) ===== net/ipv6/tcp_ipv6.c 1.100 vs edited ===== --- 1.100/net/ipv6/tcp_ipv6.c 2004-11-01 16:48:28 -08:00 +++ edited/net/ipv6/tcp_ipv6.c 2004-11-04 16:52:43 -08:00 @@ -680,10 +680,8 @@ if (final_p) ipv6_addr_copy(&fl.fl6_dst, final_p); - if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { - dst_release(dst); + if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) goto failure; - } if (saddr == NULL) { saddr = &fl.fl6_src; @@ -1047,10 +1045,8 @@ /* sk = NULL, but it is safe for now. RST socket required. */ if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { - if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { - dst_release(buff->dst); + if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) return; - } ip6_xmit(NULL, buff, &fl, NULL, 0); TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); @@ -1114,10 +1110,9 @@ fl.fl_ip_sport = t1->source; if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { - if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { - dst_release(buff->dst); + if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) return; - } + ip6_xmit(NULL, buff, &fl, NULL, 0); TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); return; @@ -1378,7 +1373,7 @@ newsk = tcp_create_openreq_child(sk, req, skb); if (newsk == NULL) - goto out; + goto out_release; /* Charge newly allocated IPv6 socket */ #ifdef INET_REFCNT_DEBUG @@ -1457,11 +1452,12 @@ out_overflow: NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS); +out_release: + dst_release(dst); out: NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS); if (opt && opt != np->opt) sock_kfree_s(sk, opt, opt->tot_len); - dst_release(dst); return NULL; } @@ -1784,7 +1780,6 @@ if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { sk->sk_err_soft = -err; - dst_release(dst); return err; } @@ -1838,7 +1833,6 @@ if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { sk->sk_route_caps = 0; - dst_release(dst); return err; } ===== net/xfrm/xfrm_policy.c 1.57 vs edited ===== --- 1.57/net/xfrm/xfrm_policy.c 2004-10-25 20:23:46 -07:00 +++ edited/net/xfrm/xfrm_policy.c 2004-11-04 16:39:23 -08:00 @@ -745,8 +745,8 @@ switch (policy->action) { case XFRM_POLICY_BLOCK: /* Prohibit the flow */ - xfrm_pol_put(policy); - return -EPERM; + err = -EPERM; + goto error; case XFRM_POLICY_ALLOW: if (policy->xfrm_nr == 0) { @@ -762,8 +762,8 @@ */ dst = xfrm_find_bundle(fl, policy, family); if (IS_ERR(dst)) { - xfrm_pol_put(policy); - return PTR_ERR(dst); + err = PTR_ERR(dst); + goto error; } if (dst) From jgarzik@pobox.com Thu Nov 4 23:31:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:31:46 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57VfGT019463 for ; Thu, 4 Nov 2004 23:31:42 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyZ9-0006B8-QQ; Fri, 05 Nov 2004 07:31:23 +0000 Message-ID: <418B2C3F.60107@pobox.com> Date: Fri, 05 Nov 2004 02:31:11 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jesse Brandeburg CC: jgarzik@intel.com, akpm@osdl.org, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11457 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 105 Lines: 8 I'm OK with the patch, but it doesn't apply for me... Can you resend against 2.6.10-rc1-bk14? Jeff From jgarzik@pobox.com Thu Nov 4 23:35:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:35:21 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57ZGkY019930 for ; Thu, 4 Nov 2004 23:35:17 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPycb-0006Dh-NN; Fri, 05 Nov 2004 07:34:57 +0000 Message-ID: <418B2D15.5080303@pobox.com> Date: Fri, 05 Nov 2004 02:34:45 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" CC: hadi@cyberus.ca, buytenh@wantstofly.org, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <418B2645.6080404@pobox.com> <20041104231433.3a7233e8.davem@davemloft.net> In-Reply-To: <20041104231433.3a7233e8.davem@davemloft.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11458 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 519 Lines: 17 David S. Miller wrote: > On Fri, 05 Nov 2004 02:05:41 -0500 > Jeff Garzik wrote: >>I know this question wasn't directed at me, but, I do always compile >>ipsec stuff into my kernel, in addition to netfilter. The relevant >>options are attached for the curious. > > > Yes, but do you actually install any IPSEC rules into your system? Unless FC2 initscripts do something weird (I've never configured IPSEC... only the policies that the kernel boots with (presumably the null set?). Jeff From jgarzik@pobox.com Thu Nov 4 23:38:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:38:55 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57cnKe020334 for ; Thu, 4 Nov 2004 23:38:49 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyg3-0006HF-Q2; Fri, 05 Nov 2004 07:38:31 +0000 Message-ID: <418B2DEB.4020203@pobox.com> Date: Fri, 05 Nov 2004 02:38:19 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com CC: "David S. Miller" , hadi@cyberus.ca, buytenh@wantstofly.org, yoshfuji@linux-ipv6.org Subject: Re: BUG: dst underflow (again) References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <418B2645.6080404@pobox.com> <20041104231433.3a7233e8.davem@davemloft.net> <418B2D15.5080303@pobox.com> In-Reply-To: <418B2D15.5080303@pobox.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11459 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 267 Lines: 11 BTW to netdev, there is IMHO no excuse not to test IPv6 ;-) Plugging... Check out http://linux.yyz.us/ipv6-fc2-howto.html for starting points. Quick and easy IPv6 "6to4 automatic tunneling" setup for FC1/FC2, with pointers to Deb/Mac/Win instructions. Jeff From jgarzik@pobox.com Thu Nov 4 23:40:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:40:35 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57eVnP020683 for ; Thu, 4 Nov 2004 23:40:31 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyhh-0006J4-Gy; Fri, 05 Nov 2004 07:40:13 +0000 Message-ID: <418B2E51.9060108@pobox.com> Date: Fri, 05 Nov 2004 02:40:01 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jt@hpl.hp.com CC: Linux kernel mailing list , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] Wireless Extension dropped patchlet References: <20041101225823.GA16560@bougret.hpl.hp.com> In-Reply-To: <20041101225823.GA16560@bougret.hpl.hp.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11460 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 9 Lines: 2 applied From yoshfuji@linux-ipv6.org Thu Nov 4 23:43:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:43:59 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57hrt0021060 for ; Thu, 4 Nov 2004 23:43:54 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 4251733CE5; Fri, 5 Nov 2004 16:44:35 +0900 (JST) Date: Fri, 05 Nov 2004 16:44:34 +0900 (JST) Message-Id: <20041105.164434.121268406.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: hadi@cyberus.ca, buytenh@wantstofly.org, jgarzik@pobox.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: BUG: dst underflow (again) From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041104231618.1d584a6f.davem@davemloft.net> References: <20041104221801.584c8f11.davem@davemloft.net> <20041105.155355.110780816.yoshfuji@linux-ipv6.org> <20041104231618.1d584a6f.davem@davemloft.net> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11461 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 307 Lines: 9 In article <20041104231618.1d584a6f.davem@davemloft.net> (at Thu, 4 Nov 2004 23:16:18 -0800), "David S. Miller" says: > I'm mid-way through such changes, but it looks something > like this (BTW, note the addrconf.c leak I noticed today > as well): Ok, I leave it to you. --yoshfuji From jgarzik@pobox.com Thu Nov 4 23:47:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:47:45 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57lYmh021436 for ; Thu, 4 Nov 2004 23:47:34 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyoW-0006Pq-DD; Fri, 05 Nov 2004 07:47:16 +0000 Message-ID: <418B2FF6.8030907@pobox.com> Date: Fri, 05 Nov 2004 02:47:02 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Nishanth Aravamudan CC: netdev@oss.sgi.com, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] net/gt96100eth: replace gt96100_delay() with msleep_interruptible() References: <4184C72F.8000905@pobox.com> <20041101190841.GB1730@us.ibm.com> In-Reply-To: <20041101190841.GB1730@us.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11462 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1815 Lines: 58 Nishanth Aravamudan wrote: > On Sun, Oct 31, 2004 at 06:06:23AM -0500, Jeff Garzik wrote: > >>janitor@sternwelten.at wrote: >> >>>@@ -528,7 +517,7 @@ abort(struct net_device *dev, u32 abort_ >>> // wait for abort to complete >>> while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) { >>> // snooze for 20 msec and check again >>>- gt96100_delay(1); >>>+ msleep_interruptible(20); >>> >>> if (--timedout == 0) { >> >> >>don't change the behavior of the driver, even if it disagrees with the >>comment. > > > Ok, please find the corrected patch below. > > Description: Uses msleep_interruptible() instead of gt96100_delay() > to guarantee the task delays as expected. Removes prototype and > definition of now unused gt96100_delay() function. Corrects one comment > to correspond to the code. > > Signed-off-by: Nishanth Aravamudan > > > --- 2.6.10-rc1-vanilla/drivers/net/gt96100eth.c 2004-10-30 15:33:30.000000000 -0700 > +++ 2.6.10-rc1/drivers/net/gt96100eth.c 2004-11-01 11:05:37.000000000 -0800 > @@ -59,7 +59,6 @@ > // prototypes > static void* dmaalloc(size_t size, dma_addr_t *dma_handle); > static void dmafree(size_t size, void *vaddr); > -static void gt96100_delay(int msec); > static int gt96100_add_hash_entry(struct net_device *dev, > unsigned char* addr); > static void read_mib_counters(struct gt96100_private *gp); > @@ -183,16 +182,6 @@ static void dmafree(size_t size, void *v > free_pages((unsigned long)vaddr, get_order(size)); > } > > -static void gt96100_delay(int ms) > -{ > - if (in_interrupt()) > - return; > - else { > - current->state = TASK_INTERRUPTIBLE; > - schedule_timeout(ms*HZ/1000); I'm still worried about this patch, because 1) in_interrupt() check disappears, and 2) does driver already include linux/delay.h ? From jgarzik@pobox.com Thu Nov 4 23:58:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Nov 2004 23:58:33 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA57wTrb021966 for ; Thu, 4 Nov 2004 23:58:29 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPyz5-0006eP-71; Fri, 05 Nov 2004 07:58:11 +0000 Message-ID: <418B3286.5050102@pobox.com> Date: Fri, 05 Nov 2004 02:57:58 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Randy.Dunlap" CC: netdev@oss.sgi.com, rl@hellgate.ch Subject: Re: [PATCH] via-rhine: references __init code during resume References: <4179543F.1020407@osdl.org> <418390F2.7080901@pobox.com> <418670AC.7010801@osdl.org> In-Reply-To: <418670AC.7010801@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11463 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 318 Lines: 8 [jgarzik@pretzel net-drivers-2.6]$ dotest < /g/tmp/mbox bk import -tpatch -CR -yvia-rhine: references __init code during resume /tmp/patch21199 . Patching... Patch failed. **** patch log follows **** Patching file drivers/net/via-rhine.c 1 out of 1 hunk FAILED -- saving rejects to file drivers/net/via-rhine.c.rej From jgarzik@pobox.com Fri Nov 5 00:00:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 00:00:38 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA580YkJ022281 for ; Fri, 5 Nov 2004 00:00:34 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CPz17-0006hJ-1g; Fri, 05 Nov 2004 08:00:17 +0000 Message-ID: <418B3305.8040303@pobox.com> Date: Fri, 05 Nov 2004 03:00:05 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Pekka Enberg CC: netdev@oss.sgi.com Subject: Re: [PATCH] 8139too: use iomap for pio/mmio References: <1099228076.9571.12.camel@localhost> In-Reply-To: <1099228076.9571.12.camel@localhost> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11464 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 73 Lines: 6 Find someone who will test it... then resend and I'll apply :) Jeff From garzik@havoc.gtf.org Fri Nov 5 00:22:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 00:22:51 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA58MjTt026355 for ; Fri, 5 Nov 2004 00:22:45 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id 978E57958; Fri, 5 Nov 2004 03:22:22 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iA58MMpp025933; Fri, 5 Nov 2004 03:22:22 -0500 Date: Fri, 5 Nov 2004 03:22:22 -0500 From: Jeff Garzik To: Andrew Morton , Linus Torvalds Cc: netdev@oss.sgi.com Subject: [BK PATCHES] 2.6.x net driver updates Message-ID: <20041105082222.GA25906@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11465 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 3371 Lines: 89 Please do a bk pull bk://gkernel.bkbits.net/net-drivers-2.6 This will update the following files: include/net/iw_handler.h | 8 ++++---- net/core/wireless.c | 9 +++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) through these ChangeSets: (04/11/05 1.2465) [PATCH] Wireless Extension dropped patchlet This tiny bit of the last WE-17 patch was lost between me and you. I initially decided to wait to resubmit, but Chris Wedgwood reported that the MadWifi driver needs it. Sorry for not having pushed harder. I recreated this patch, and tested with 2.6.10-rc1, and Chris tested it with MadWifi. Would you mind pushing that up to Linus ? Changelog : o remove unneeded const o spelling + comments Signed-off-by: Jean Tourrilhes Signed-off-by: Jeff Garzik diff -Nru a/include/net/iw_handler.h b/include/net/iw_handler.h --- a/include/net/iw_handler.h 2004-11-05 03:21:48 -05:00 +++ b/include/net/iw_handler.h 2004-11-05 03:21:48 -05:00 @@ -314,10 +314,10 @@ { /* Number of handlers defined (more precisely, index of the * last defined handler + 1) */ - const __u16 num_standard; - const __u16 num_private; + __u16 num_standard; + __u16 num_private; /* Number of private arg description */ - const __u16 num_private_args; + __u16 num_private_args; /* Array of handlers for standard ioctls * We will call dev->wireless_handlers->standard[ioctl - SIOCSIWNAME] @@ -335,7 +335,7 @@ const struct iw_priv_args * private_args; /* This field will be *removed* in the next version of WE */ - const long spy_offset; /* DO NOT USE */ + long spy_offset; /* DO NOT USE */ /* New location of get_wireless_stats, to de-bloat struct net_device. * The old pointer in struct net_device will be gradually phased diff -Nru a/net/core/wireless.c b/net/core/wireless.c --- a/net/core/wireless.c 2004-11-05 03:21:48 -05:00 +++ b/net/core/wireless.c 2004-11-05 03:21:48 -05:00 @@ -52,7 +52,8 @@ * v6 - 18.06.04 - Jean II * o Change get_spydata() method for added safety * o Remove spy #ifdef, they are always on -> cleaner code - * o Allow any size GET request is user specifies length > max + * o Allow any size GET request if user specifies length > max + * and if request has IW_DESCR_FLAG_NOMAX flag or is SIOCGIWPRIV * o Start migrating get_wireless_stats to struct iw_handler_def * o Add wmb() in iw_handler_set_spy() for non-coherent archs/cpus * Based on patch from Pavel Roskin : @@ -690,6 +691,10 @@ * we can support any size GET requests. * There is still a limit : -ENOMEM. */ extra_size = user_length * descr->token_size; + /* Note : user_length is originally a __u16, + * and token_size is controlled by us, + * so extra_size won't get negative and + * won't overflow... */ } } @@ -1227,7 +1232,7 @@ /* We want to operate without locking, because wireless_spy_update() * most likely will happen in the interrupt handler, and therefore - * have it own locking constraints and needs performance. + * have its own locking constraints and needs performance. * The rtnl_lock() make sure we don't race with the other iw_handlers. * This make sure wireless_spy_update() "see" that the spy list * is temporarily disabled. */ From herbert@gondor.apana.org.au Fri Nov 5 00:49:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 00:49:45 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA58na6N027772 for ; Fri, 5 Nov 2004 00:49:37 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CPzmQ-0005oK-00; Fri, 05 Nov 2004 19:49:10 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CPzmK-00029Q-00; Fri, 05 Nov 2004 19:49:04 +1100 Date: Fri, 5 Nov 2004 19:49:04 +1100 To: "David S. Miller" , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: [IPV6] Fix memory leaks in TCP error path Message-ID: <20041105084904.GA8253@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="NzB8fVQJ5HfG6fxh" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11466 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1779 Lines: 61 --NzB8fVQJ5HfG6fxh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi: I've gone through all the xfrm_lookup() calls in net/ipv6 and I haven't seen anything that can cause an underflow. I did find a couple of memory leaks though. In tcp_ipv6.c we may leak skb's if xfrm_lookup fails. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --NzB8fVQJ5HfG6fxh Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv6/tcp_ipv6.c 1.100 vs edited ===== --- 1.100/net/ipv6/tcp_ipv6.c 2004-11-02 11:48:28 +11:00 +++ edited/net/ipv6/tcp_ipv6.c 2004-11-05 19:44:56 +11:00 @@ -1045,13 +1045,8 @@ fl.fl_ip_sport = t1->source; /* sk = NULL, but it is safe for now. RST socket required. */ - if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { - - if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { - dst_release(buff->dst); - return; - } - + if (!ip6_dst_lookup(NULL, &buff->dst, &fl) && + !xfrm_lookup(&buff->dst, &fl, NULL, 0)) { ip6_xmit(NULL, buff, &fl, NULL, 0); TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); TCP_INC_STATS_BH(TCP_MIB_OUTRSTS); @@ -1113,11 +1108,8 @@ fl.fl_ip_dport = t1->dest; fl.fl_ip_sport = t1->source; - if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { - if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { - dst_release(buff->dst); - return; - } + if (!ip6_dst_lookup(NULL, &buff->dst, &fl) && + !xfrm_lookup(&buff->dst, &fl, NULL, 0)) { ip6_xmit(NULL, buff, &fl, NULL, 0); TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); return; --NzB8fVQJ5HfG6fxh-- From buytenh@wantstofly.org Fri Nov 5 01:35:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 01:35:56 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA59ZpD3029265 for ; Fri, 5 Nov 2004 01:35:51 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id C8BE82B0EC; Fri, 5 Nov 2004 10:13:41 +0100 (MET) Date: Fri, 5 Nov 2004 10:13:41 +0100 From: Lennert Buytenhek To: Jeff Garzik Cc: netdev@oss.sgi.com, "David S. Miller" , hadi@cyberus.ca, yoshfuji@linux-ipv6.org Subject: Re: BUG: dst underflow (again) Message-ID: <20041105091341.GA28112@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <418B2645.6080404@pobox.com> <20041104231433.3a7233e8.davem@davemloft.net> <418B2D15.5080303@pobox.com> <418B2DEB.4020203@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418B2DEB.4020203@pobox.com> User-Agent: Mutt/1.4.1i X-archive-position: 11467 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Content-Length: 1564 Lines: 38 On Fri, Nov 05, 2004 at 02:38:19AM -0500, Jeff Garzik wrote: > BTW to netdev, there is IMHO no excuse not to test IPv6 ;-) :-) RIPE hands out IPv6 address space in chunks of /32, and it will only allocate such a /32 for you if you plan on assigning more than 200 /48's in two years. They specify that you should assign a /64 to a customer if they only need a single subnet, otherwise you should assign a /48. In order to assign 200 /48's in two years, you have to assign 200 address blocks to people who need at least 2 subnets, so that means you have to assign at least 400 subnets' worth of address space. If you take the canonical IPv6 subnet to be a /64 and the canonical IPv4 subnet to be a /24, that means you have to assign a block of IPv6 address space that roughly corresponds to a IPv4 /15 in two years in order to get IPv6 address space at all. I politely told RIPE that I don't think we'll be assigning that much address space any time soon, and the result of that was that our address space request was simply denied ("because it does not comply with current policy.") As a result of all this nonsense, the ISPs in the Netherlands (and elsewhere) that do supply IPv6 connectivity to their customers resort to the immensely wasteful practise of giving each and every single customer an entire /48 because otherwise they will not have assigned enough address space in two years and risk the wrath of RIPE. (And there's no way in hell you'll get people to peer with you if you start sending them 2002:xxxx:xxxx::/48 routes :-) cheers, Lennert From buytenh@wantstofly.org Fri Nov 5 01:35:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 01:35:56 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA59ZphB029266 for ; Fri, 5 Nov 2004 01:35:51 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 7A2272B0F4; Fri, 5 Nov 2004 10:14:27 +0100 (MET) Date: Fri, 5 Nov 2004 10:14:27 +0100 From: Lennert Buytenhek To: "David S. Miller" Cc: hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-ID: <20041105091427.GB28112@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041104221801.584c8f11.davem@davemloft.net> User-Agent: Mutt/1.4.1i X-archive-position: 11468 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Content-Length: 403 Lines: 16 On Thu, Nov 04, 2004 at 10:18:01PM -0800, David S. Miller wrote: > BTW Lennert, the decoded addresses are extremely helpful. Thanks. I'm glad. > But let me ask, do you have any IPSEC policies in the kernel > when these BUGs trigger? If so, I'm pretty sure I know what > the problem may be. IPSEC.. not that I know of. So unless my distro does stuff behind my back, no. How do I make sure? --L From acme@conectiva.com.br Fri Nov 5 01:42:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 01:42:07 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA59g1k3030012 for ; Fri, 5 Nov 2004 01:42:02 -0800 Received: from [200.138.55.111] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CQ0bZ-0001an-00; Fri, 05 Nov 2004 07:42:01 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 8D89614639; Fri, 5 Nov 2004 07:41:38 -0200 (BRST) Message-ID: <418B4B1A.8@conectiva.com.br> Date: Fri, 05 Nov 2004 07:42:50 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Lennert Buytenhek Cc: "David S. Miller" , hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105091427.GB28112@xi.wantstofly.org> In-Reply-To: <20041105091427.GB28112@xi.wantstofly.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11469 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 466 Lines: 22 Lennert Buytenhek wrote: > On Thu, Nov 04, 2004 at 10:18:01PM -0800, David S. Miller wrote: > > >>BTW Lennert, the decoded addresses are extremely helpful. Thanks. > > > I'm glad. > > > >>But let me ask, do you have any IPSEC policies in the kernel >>when these BUGs trigger? If so, I'm pretty sure I know what >>the problem may be. > > > IPSEC.. not that I know of. So unless my distro does stuff behind > my back, no. How do I make sure? setkey -DP From spam@crocom.com.pl Fri Nov 5 01:49:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 01:49:30 -0800 (PST) Received: from crocom.crocom.com.pl (task-crocom-rtr.task.gda.pl [153.19.102.70]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA59nLGn030511 for ; Fri, 5 Nov 2004 01:49:25 -0800 Received: from crocom.com.pl (localhost [127.0.0.1]) by crocom.crocom.com.pl (8.12.11/8.12.11) with ESMTP id iA59miek006737; Fri, 5 Nov 2004 10:48:45 +0100 (CET) Message-ID: <418B4C7C.8000402@crocom.com.pl> Date: Fri, 05 Nov 2004 10:48:44 +0100 From: Szymon Miotk Organization: Crocom Computer Systems s.c. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en, pl MIME-Version: 1.0 To: netdev@oss.sgi.com CC: kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: PROBLEM: IProute hangs after running traffic shaping scripts Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11470 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: spam@crocom.com.pl Precedence: bulk X-list: netdev Content-Length: 22731 Lines: 543 This mail was posted 02-11-2004 to linux-net@vger.kernel.org, but I got no response at all, so I am resending it. [1.] One line summary of the problem: IProute hangs after running traffic shaping scripts [2.] Full description of the problem/report: I have a server with 3 links to ISPs and 1 link for internal network. I shape my clients to certain speeds, depending on the time of the day. I have HTB shaping on each interface, about 2250 classes and 2250 qdisc on each, so it makes total ~9000 classes (HTB) and ~9000 qdisc (SFQ). I run shaping scripts 4 times/day. Sometimes it makes a kernel oops, hangs at some 'tc ...' command (it differs). Then the shaping works so-so (usually it works, but doesn't fully utilize the bandwidth) and every iproute command hangs. Killing the hanging processes kills them, but still every iproute command hangs, including ip and tc. Sometimes the server stops forwarding, but usually it does so few hours after kernel oops. Reboot always helps. [3.] Keywords (i.e., modules, networking, kernel): traffic shaping, htb, qdisc, networking, kernel [4.] Kernel version (from /proc/version): Linux version 2.6.9 (root@ducttape.mlyniec) (gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)) #2 Thu Oct 28 17:06:01 CEST 2004 [5.] Output of Oops.. message (if applicable) with symbolic information resolved (see Documentation/oops-tracing.txt ksymoops 2.4.9 on i686 2.6.5-1.358smp. Options used -v /usr/src/linux-2.6.9/vmlinux (specified) -K (specified) -L (specified) -O (specified) -m /usr/src/linux-2.6.9/System.map (specified) Oct 31 15:02:38 cerber kernel: Unable to handle kernel paging request at virtual address 00100100 Oct 31 15:02:38 cerber kernel: *pde = 00000000 Oct 31 15:02:38 cerber kernel: Oops: 0000 [#1] Oct 31 15:02:38 cerber kernel: c03728c8 Oct 31 15:02:38 cerber kernel: CPU: 0 Oct 31 15:02:38 cerber kernel: EIP: 0060:[] Not tainted VLI Using defaults from ksymoops -t elf32-i386 -a i386 Oct 31 15:02:38 cerber kernel: EFLAGS: 00010286 (2.6.9) Oct 31 15:02:38 cerber kernel: eax: 001000b8 ebx: 001000b8 ecx: f0166048 edx: 00100100 Oct 31 15:02:38 cerber kernel: esi: f7c1b12c edi: 00010000 ebp: f7c1b000 esp: f1b47c54 Oct 31 15:02:38 cerber kernel: ds: 007b es: 007b ss: 0068 Oct 31 15:02:38 cerber kernel: Stack: ef3aaa10 eedd6000 c037325c c0373353 00000000 00000000 00000000 00000000 Oct 31 15:02:38 cerber kernel: 00000000 000008dc 00000002 00000000 f23de000 c01044e5 f1b47c94 00000002 Oct 31 15:02:38 cerber kernel: 00000000 ffffffff c18fcf80 ef3aaa00 f5019680 f23de000 00000000 f5019680 Oct 31 15:02:38 cerber kernel: Call Trace: Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0x0/0x6e3 Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0xf7/0x6e3 Oct 31 15:02:38 cerber kernel: [] error_code+0x2d/0x38 Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0x0/0x6e3 Oct 31 15:02:38 cerber kernel: [] rtnetlink_rcv+0x2af/0x359 Oct 31 15:02:38 cerber kernel: [] rtnetlink_rcv+0x0/0x359 Oct 31 15:02:38 cerber kernel: [] netlink_data_ready+0x55/0x5d Oct 31 15:02:38 cerber kernel: [] netlink_sendskb+0x8a/0x8c Oct 31 15:02:38 cerber kernel: [] netlink_sendmsg+0x1d7/0x2af Oct 31 15:02:38 cerber kernel: [] sock_sendmsg+0xcc/0xe6 Oct 31 15:02:38 cerber kernel: [] sock_recvmsg+0xdc/0xf7 Oct 31 15:02:38 cerber kernel: [] buffered_rmqueue+0xcf/0x27a Oct 31 15:02:38 cerber kernel: [] ip_forward_finish+0x26/0x4b Oct 31 15:02:38 cerber kernel: [] autoremove_wake_function+0x0/0x43 Oct 31 15:02:38 cerber kernel: [] copy_from_user+0x54/0x83 Oct 31 15:02:38 cerber kernel: [] verify_iovec+0x2a/0x74 Oct 31 15:02:38 cerber kernel: [] sys_sendmsg+0x14c/0x197 Oct 31 15:02:38 cerber kernel: [] handle_mm_fault+0x11d/0x2cf Oct 31 15:02:38 cerber kernel: [] sockfd_lookup+0x16/0x6e Oct 31 15:02:38 cerber kernel: [] sys_setsockopt+0x69/0x9e Oct 31 15:02:38 cerber kernel: [] sys_socketcall+0x22b/0x249 Oct 31 15:02:38 cerber kernel: [] do_page_fault+0x0/0x52b Oct 31 15:02:38 cerber kernel: [] error_code+0x2d/0x38 Oct 31 15:02:38 cerber kernel: [] sysenter_past_esp+0x52/0x71 Oct 31 15:02:38 cerber kernel: Code: 89 d7 56 53 8b 88 2c 01 00 00 8d 59 b8 8b 53 48 0f 18 02 90 8d b0 2c 01 00 00 39 f1 74 18 39 7b 14 74 19 8b 53 48 8d 42 b8 89 c3 <8b> 40 48 0f 18 00 90 39 f2 75 e8 31 c0 5b 5e 5f c3 89 d8 eb f8 >>EIP; c03728c8 <===== >>ecx; f0166048 >>esi; f7c1b12c >>ebp; f7c1b000 >>esp; f1b47c54 Trace; c037325c Trace; c0373353 Trace; c01044e5 Trace; c037325c Trace; c036bb36 Trace; c036b887 Trace; c038add3 Trace; c038a49f Trace; c038aac5 Trace; c03595c9 Trace; c03596fb Trace; c0140657 Trace; c039333b Trace; c011a0f2 Trace; c021586d Trace; c035f4fa Trace; c035ab74 Trace; c015001e Trace; c03593fb Trace; c035a921 Trace; c035af9f Trace; c0112ca2 Trace; c01044e5 Trace; c01042e9 This architecture has variable length instructions, decoding before eip is unreliable, take these instructions with a pinch of salt. Code; c037289d 00000000 <_EIP>: Code; c037289d 0: 89 d7 mov %edx,%edi Code; c037289f 2: 56 push %esi Code; c03728a0 3: 53 push %ebx Code; c03728a1 4: 8b 88 2c 01 00 00 mov 0x12c(%eax),%ecx Code; c03728a7 a: 8d 59 b8 lea 0xffffffb8(%ecx),%ebx Code; c03728aa d: 8b 53 48 mov 0x48(%ebx),%edx Code; c03728ad 10: 0f 18 02 prefetchnta (%edx) Code; c03728b0 13: 90 nop Code; c03728b1 14: 8d b0 2c 01 00 00 lea 0x12c(%eax),%esi Code; c03728b7 1a: 39 f1 cmp %esi,%ecx Code; c03728b9 1c: 74 18 je 36 <_EIP+0x36> Code; c03728bb 1e: 39 7b 14 cmp %edi,0x14(%ebx) Code; c03728be 21: 74 19 je 3c <_EIP+0x3c> Code; c03728c0 23: 8b 53 48 mov 0x48(%ebx),%edx Code; c03728c3 26: 8d 42 b8 lea 0xffffffb8(%edx),%eax Code; c03728c6 29: 89 c3 mov %eax,%ebx This decode from eip onwards should be reliable Code; c03728c8 00000000 <_EIP>: Code; c03728c8 <===== 0: 8b 40 48 mov 0x48(%eax),%eax <===== Code; c03728cb 3: 0f 18 00 prefetchnta (%eax) Code; c03728ce 6: 90 nop Code; c03728cf 7: 39 f2 cmp %esi,%edx Code; c03728d1 9: 75 e8 jne fffffff3 <_EIP+0xfffffff3> Code; c03728d3 b: 31 c0 xor %eax,%eax Code; c03728d5 d: 5b pop %ebx Code; c03728d6 e: 5e pop %esi Code; c03728d7 f: 5f pop %edi Code; c03728d8 10: c3 ret Code; c03728d9 11: 89 d8 mov %ebx,%eax Code; c03728db 13: eb f8 jmp d <_EIP+0xd> [6.] A small shell script or example program which triggers the problem (if possible) my traffic shaping scripts are rather huge and they don't always cause kernel oops. I tried to run them together (so classes and qdisc on every interface were changed in parallel), but it didn't help. I can send you them if you wish. [7.] Environment [7.1.] Software (add the output of the ver_linux script here) This is output from where the kernel was compiled. This is machine with the same hardware setup and the same Linux distro, but with developing packages installed. Gnu C 3.3.3 Gnu make 3.80 binutils 2.15.90.0.3 util-linux 2.12 mount 2.12 module-init-tools 2.4.26 e2fsprogs 1.35 reiserfsprogs line reiser4progs line pcmcia-cs 3.2.7 quota-tools 3.10. PPP 2.4.2 isdn4k-utils 3.3 nfs-utils 1.0.6 Linux C Library 2.3.3 Dynamic linker (ldd) 2.3.3 Procps 3.2.0 Net-tools 1.60 Kbd 1.12 Sh-utils 5.2.1 [7.2.] Processor information (from /proc/cpuinfo): processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 2 model name : Intel(R) Pentium(R) 4 CPU 2.80GHz stepping : 5 cpu MHz : 2814.286 cache size : 512 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid xtpr bogomips : 5554.17 This is HT P4, but SMP was disabled. [7.3.] Module information (from /proc/modules): This is static kernel, no modules. [7.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem) cat /proc/ioports 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-006f : keyboard 0070-0077 : rtc 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 01f0-01f7 : libata 02f8-02ff : serial 0376-0376 : ide1 03c0-03df : vga+ 03f8-03ff : serial 0cf8-0cff : PCI conf1 1000-107f : 0000:00:1f.0 1080-10bf : 0000:00:1f.0 1400-141f : 0000:00:1f.3 a000-a03f : 0000:02:00.0 a000-a03f : e1000 a400-a43f : 0000:02:01.0 a400-a43f : e1000 a800-a83f : 0000:02:02.0 a800-a83f : e1000 ac00-ac3f : 0000:02:03.0 ac00-ac3f : e1000 f000-f00f : 0000:00:1f.2 f000-f00f : libata cat /proc/iomem 00000000-0009ffff : System RAM 000a0000-000bffff : Video RAM area 000c0000-000ccbff : Video ROM 000d0000-000d0fff : Adapter ROM 000d1000-000d1fff : Adapter ROM 000d2000-000d2fff : Adapter ROM 000d3000-000d3fff : Adapter ROM 000f0000-000fffff : System ROM 00100000-3ffeffff : System RAM 00100000-004215e9 : Kernel code 004215ea-0057e3ff : Kernel data 3fff0000-3fff2fff : ACPI Non-volatile Storage 3fff3000-3fffffff : ACPI Tables e8000000-efffffff : 0000:00:00.0 f0000000-f7ffffff : PCI Bus #01 f0000000-f7ffffff : 0000:01:00.0 f8000000-f9ffffff : PCI Bus #01 f8000000-f8ffffff : 0000:01:00.0 fb000000-fb01ffff : 0000:02:00.0 fb000000-fb01ffff : e1000 fb020000-fb03ffff : 0000:02:00.0 fb020000-fb03ffff : e1000 fb040000-fb05ffff : 0000:02:01.0 fb040000-fb05ffff : e1000 fb060000-fb07ffff : 0000:02:01.0 fb060000-fb07ffff : e1000 fb080000-fb09ffff : 0000:02:02.0 fb080000-fb09ffff : e1000 fb0a0000-fb0bffff : 0000:02:02.0 fb0a0000-fb0bffff : e1000 fb0c0000-fb0dffff : 0000:02:03.0 fb0c0000-fb0dffff : e1000 fb0e0000-fb0fffff : 0000:02:03.0 fb0e0000-fb0fffff : e1000 fec00000-ffffffff : reserved [7.5.] PCI information ('lspci -vvv' as root) In short: 4 x Intel 1000 MT carts, Marvell/Yukon integreated GbE disabled. 00:00.0 Host bridge: Intel Corp. 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02) Subsystem: Giga-byte Technology GA-8IPE1000 Pro2 motherboard (865PE) Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- 00:01.0 PCI bridge: Intel Corp. 82865G/PE/P PCI to AGP Controller (rev 02) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap- 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- Reset- FastB2B- 00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB/ER Hub interface to PCI Bridge (rev c2) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- Reset- FastB2B- 00:1f.0 ISA bridge: Intel Corp. 82801EB/ER (ICH5/ICH5R) LPC Bridge (rev 02) Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- Region 1: I/O ports at Region 2: I/O ports at Region 3: I/O ports at Region 4: I/O ports at f000 [size=16] 00:1f.3 SMBus: Intel Corp. 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02) Subsystem: Giga-byte Technology GA-8IPE1000 Pro2 motherboard (865PE) Control: I/O+ Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- 02:00.0 Ethernet controller: Intel Corp. 82541GI/PI Gigabit Ethernet Controller Subsystem: Intel Corp. PRO/1000 MT Desktop Adapter Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- ; Fri, 5 Nov 2004 02:02:25 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id DFC067767; Fri, 5 Nov 2004 05:02:00 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iA5A20ek031827; Fri, 5 Nov 2004 05:02:00 -0500 Date: Fri, 5 Nov 2004 05:02:00 -0500 From: Jeff Garzik To: netdev@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: netdev-2.6 queue updated Message-ID: <20041105100200.GA31755@havoc.gtf.org> Reply-To: netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.4.1i X-archive-position: 11471 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 9191 Lines: 244 NOTE: you will need to re-clone the netdev-2.6 tree. BK users: bk pull bk://gkernel.bkbits.net/netdev-2.6 Patch: http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc1-bk14-netdev1.patch.bz2 This will update the following files: drivers/net/3c505.c | 10 drivers/net/3c507.c | 148 ++-- drivers/net/3c59x.c | 1 drivers/net/8139cp.c | 102 ++- drivers/net/8139too.c | 98 +- drivers/net/8390.c | 1 drivers/net/8390.h | 1 drivers/net/Kconfig | 62 - drivers/net/ac3200.c | 64 - drivers/net/atp.c | 2 drivers/net/bonding/bond_3ad.c | 10 drivers/net/depca.c | 24 drivers/net/e100.c | 1 drivers/net/e2100.c | 18 drivers/net/eepro100.c | 293 +++----- drivers/net/fealnx.c | 275 +++----- drivers/net/hp100.c | 65 + drivers/net/ixgb/ixgb_main.c | 33 - drivers/net/lne390.c | 64 - drivers/net/mace.c | 66 -- drivers/net/ne3210.c | 34 - drivers/net/pcmcia/fmvj18x_cs.c | 4 drivers/net/pcmcia/ibmtr_cs.c | 7 drivers/net/pcmcia/pcnet_cs.c | 39 - drivers/net/pcmcia/smc91c92_cs.c | 2 drivers/net/pcmcia/xirc2ps_cs.c | 2 drivers/net/r8169.c | 855 +++++++++++++++++++------- drivers/net/sb1000.c | 14 drivers/net/sis900.c | 1 drivers/net/skfp/h/fplustm.h | 6 drivers/net/skfp/h/targethw.h | 6 drivers/net/skfp/h/targetos.h | 2 drivers/net/skfp/h/types.h | 21 drivers/net/skfp/skfddi.c | 25 drivers/net/skfp/smt.c | 7 drivers/net/starfire.c | 79 +- drivers/net/sundance.c | 259 +++---- drivers/net/tlan.c | 72 +- drivers/net/tlan.h | 88 -- drivers/net/tokenring/3c359.c | 36 - drivers/net/tokenring/3c359.h | 2 drivers/net/tokenring/ibmtr.c | 158 ++-- drivers/net/tokenring/lanstreamer.c | 24 drivers/net/tokenring/lanstreamer.h | 2 drivers/net/tokenring/olympic.c | 94 +- drivers/net/tulip/de2104x.c | 1 drivers/net/tulip/dmfe.c | 1 drivers/net/tulip/tulip_core.c | 3 drivers/net/tulip/winbond-840.c | 3 drivers/net/tulip/xircom_tulip_cb.c | 16 drivers/net/typhoon.c | 3 drivers/net/via-rhine.c | 276 ++++---- drivers/net/via-velocity.h | 4 drivers/net/wan/c101.c | 3 drivers/net/wan/cycx_drv.c | 22 drivers/net/wan/n2.c | 5 drivers/net/wireless/airo.c | 69 -- drivers/net/wireless/airport.c | 5 drivers/net/wireless/arlan-main.c | 90 +- drivers/net/wireless/arlan-proc.c | 15 drivers/net/wireless/arlan.h | 26 drivers/net/wireless/hermes.c | 43 - drivers/net/wireless/hermes.h | 62 - drivers/net/wireless/netwave_cs.c | 75 +- drivers/net/wireless/orinoco_cs.c | 10 drivers/net/wireless/orinoco_pci.c | 7 drivers/net/wireless/orinoco_plx.c | 82 +- drivers/net/wireless/orinoco_tmd.c | 51 - drivers/net/wireless/prism54/isl_ioctl.c | 24 drivers/net/wireless/prism54/islpci_hotplug.c | 2 drivers/net/wireless/prism54/prismcompat.h | 4 drivers/net/wireless/ray_cs.c | 4 drivers/net/wireless/wavelan_cs.c | 25 drivers/net/wireless/wavelan_cs.p.h | 1 include/linux/delay.h | 5 include/linux/ibmtr.h | 15 include/linux/pci_ids.h | 3 include/pcmcia/mem_op.h | 89 +- 78 files changed, 2239 insertions(+), 1982 deletions(-) through these ChangeSets: : o [netdrvr 8139cp] add PCI ID Adrian Bunk: o net/skfp/smt.c: remove an unused function o net/3c505.c: remove unused functions o bonding: remove an unused function o net/wan/n2.c: remove an unused function Alexander Viro: o mace iomem annotations - trivial part o airo iomem annotations o wavelan_cs iomem annotations o lne390 iomem annotations and fixes o fealnx iomem annotations, switch to io{read,write} o wireless iomem annotations and fixes, switch to io{read,write} o ibmtr annotations - the rest o skfp iomem annotations, switch to io{read,write} o olympic_open() cleanup and fixes o sundance iomem annotations, switch to io{read,write} o via-rhine iomem annotations, switch to io{read,write} o net/pcmcia iomem annotations o netwave iomem annotations o arlan iomem annotations and cleanups o netdev_priv() in netwave_cs o netdev_priv() in arlan o (25/32) lanstreamer iomem annotations o beginning of ibmtr iomem annotations o e2100 iomem annotations and fixes o 3c359 iomem annotations o depca iomem annotations o killed isa_... in 3c507 o starfire iomem annotations o ne3210 iomem annotations o ac3200 iomem annotations and fixes o iomem annotations in r8169 Andrew Morton: o r8169 module_param build fix Arjan van de Ven: o ray_cs export cleanup Christoph Hellwig: o unexport ei_tx_timeout Daniele Venzano: o Add Altimata PHY to sis900 driver David Dillow: o net/typhoon.c: use previously-unused function David S. Miller: o eepro100.c iomap conversion Felipe Damasio: o 8139cp net driver: add MODULE_VERSION Franois Romieu: o r8169: netconsole support o r8169: unneeded synchronize_irq() o r8169: always clean Tx desc o r8169: cleanup o r8169: rtl8169_close() races o r8169: automatic pci dac step down o r8169: wrong advertisement of VLAN features o r8169: Tx timeout rework o r8169: default on disabling PCIDAC o r8169: Mac identifier extracted from Realtek's driver v2.2 o r8169: TSO support o r8169: hint for Tx flow control o r8169: miscalculation of available Tx descriptors o 8139cp: SG support fixes o r8169: vlan support o r8169: Rx checksum support o r8169: advertise DMA to high memory o r8169: Tx checksum offload o r8169: comment a gcc 2.95.x bug o r8169: sync the names of a few bits with the 8139cp driver o r8169: bump version number o r8169: enable MWI o r8169: code cleanup o r8169: per device receive buffer size o r8169: add ethtool_ops.{get_regs_len/get_regs} Ganesh Venkatesan: o ixgb: Condition that determines when to quit polling o ixgb: Fix memory leak in NAPI mode. Avoid unnecessary o ixgb: Fix VLAN filter setup errors (while running Jeff Garzik: o [netdrvr eepro100] fix pci_iomap() args and info msg that follows o [netdrvr 8139cp] TSO support John W. Linville: o tulip: Add MODULE_VERSION o e100: Add MODULE_VERSION o r8169: Add MODULE_VERSION o 8139too: Add MODULE_VERSION o 3c59x: Add MODULE_VERSION o r8169: simplify trick if() expression o r8169: fix RxVlan bit manipulation o r8169: endian-swap return of rtl8169_tx_vlan_tag() Krzysztof Halasa: o net/wan/n2.c: remove an unused function Margit Schubert-While: o prism54 sparse fixes o prism54 fix resume processing Nishanth Aravamudan: o net/sb1000: replace nicedelay() with ssleep_interruptible() o net/cycx_drv: replace delay_cycx() with ssleep_interruptible() o net/airo: replace schedule_timeout() with *sleep() variants o Add ssleep_interruptible() Rene Herman: o 8139too Interframe Gap Time Roger Luethi: o mc_filter on big-endian arch Steffen Klassert: o 8139cp - add netpoll support Stephen Hemminger: o xircom_tulip_cb: convert to using module_param o tlan: enable faster hash function o tlan: make inline's static (rev2) o tlan: get rid of unneeded global vars (rev 2) o tlan: use netdev_priv (rev 2) o hp100: use inline for comple usage of dev->priv o hp100: use netdev_priv (rev 2) o via-velocity: get rid of unused global o via-rhine: free_ring should be static o via-rhine: use module_param o 8139too: use netdev_priv o r8169: use netdev_priv o r8169: use module_param o 8139cp - module_param Thomas Gleixner: o rtl8139too.c: Fix missing pci_disable_dev o rtl8139too.c: Fix missing pci_disable_dev Tom Rini: o IBM EMAC Kconfig changes: Add 'select CRC32' o IBM EMAC Kconfig changes From michael.vittrup.larsen@ericsson.com Fri Nov 5 02:04:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 02:04:45 -0800 (PST) Received: from penguin.ericsson.se (penguin.ericsson.se [193.180.251.47]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5A4Zrr031549 for ; Fri, 5 Nov 2004 02:04:36 -0800 Received: from esealmw142.al.sw.ericsson.se ([153.88.254.119]) by penguin.ericsson.se (8.12.10/8.12.10/WIREfire-1.8b) with ESMTP id iA5A4Hh5000715 for ; Fri, 5 Nov 2004 11:04:17 +0100 (MET) Received: from esealnt611.al.sw.ericsson.se ([153.88.254.121]) by esealmw142.al.sw.ericsson.se with Microsoft SMTPSVC(6.0.3790.211); Fri, 5 Nov 2004 11:04:17 +0100 Received: from unixmail.ted.dk.eu.ericsson.se (knud.ted.dk.eu.ericsson.se [213.159.188.246]) by esealnt611.al.sw.ericsson.se with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id WHL3DGFZ; Fri, 5 Nov 2004 11:04:09 +0100 Received: from diadem.ted.dk.eu.ericsson.se (diadem.ted.dk.eu.ericsson.se [213.159.189.76]) by unixmail.ted.dk.eu.ericsson.se (8.10.1/8.10.1/TEDmain-1.0) with ESMTP id iA5A3x317689; Fri, 5 Nov 2004 11:04:04 +0100 (MET) X-Sybari-Trust: 28fb81f7 bfd556f1 5f2520c6 00000139 From: Michael Vittrup Larsen Organization: Ericsson To: Stephen Hemminger Subject: Re: [PATCH] tcp: efficient port randomisation Date: Fri, 5 Nov 2004 12:03:58 +0200 User-Agent: KMail/1.7 Cc: "David S. Miller" , netdev@oss.sgi.com References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411020854.44745.michael.vittrup.larsen@ericsson.com> <20041104100104.570e67cd@dxpl.pdx.osdl.net> In-Reply-To: <20041104100104.570e67cd@dxpl.pdx.osdl.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Message-Id: <200411051103.59032.michael.vittrup.larsen@ericsson.com> X-OriginalArrivalTime: 05 Nov 2004 10:04:17.0096 (UTC) FILETIME=[CF808C80:01C4C31E] Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iA5A4Zrr031549 X-archive-position: 11472 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: michael.vittrup.larsen@ericsson.com Precedence: bulk X-list: netdev Content-Length: 2304 Lines: 54 On Thursday 04 November 2004 19:01, Stephen Hemminger wrote: > But because of the hashing most ports will be scattered all over the port > space, because they come from different hosts. > > Also, Linux TCP will reuse ports if (saddr, daddr, sport) are different. > Look at __tcp_v4_check_established. This means that the ports actually > have to be in use with real connections to the same host. __tcp_v4_check_established is the linux version of the uniqueness test from the draft, and of course ports ports can be reused when at least one of the other parameters (saddr, daddr, sport) are different. I focus on the situation where (saddr, daddr, sport) is constant since this is where we get collisions and need to try another port. Not storing the port found to be unused will result in situations like: tcp_rover_next is say 2000 Ports 2000-2010 are already used because you are browsing www.osdl.org Your search will find 2011 to be unused after 10 retries and tcp_rover_next will be 2001. Your next search (you continue to browse www.osdl.org) will result in 2012 - again after 10 retries. In a simple browsing scenario like this, you will usually not have holes because of TCP TIME-WAIT and your rover will continue to lag behind and you will continue to make 10 retries on ports. The question is then, when do the rover begin to lack behind? Everytime you meet a long-lived connection in the port space your rover will lag one port behind the real 'unused' rover. Using wget and browsing www.osdl.org may easily produce this problem. I understand your argument for not holding the lock, and maybe the following algorithm is a compromise: 1. Use the current algorithm that does not hold the lock 2. If a port was found in first try, then exit (you have already incremented tcp_rover_next by 1 so this is up to date as per the old algorithm). 3. If more than one port try was necessary, compute the difference between the initial rover to the current unused port, and atomic_add() this to tcp_rover_next. The only drawback of this is, that tcp_rover_next may 'run' a little too fast in contention cases, which only has theoretical impact on performance. Also, this only happens when we meet a long-lived connection, which we usually do not have many of. From buytenh@wantstofly.org Fri Nov 5 02:15:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 02:15:47 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5AFVGA031969 for ; Fri, 5 Nov 2004 02:15:32 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 13F2B2B102; Fri, 5 Nov 2004 11:15:14 +0100 (MET) Date: Fri, 5 Nov 2004 11:15:13 +0100 From: Lennert Buytenhek To: Arnaldo Carvalho de Melo Cc: "David S. Miller" , hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-ID: <20041105101513.GA28779@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105091427.GB28112@xi.wantstofly.org> <418B4B1A.8@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418B4B1A.8@conectiva.com.br> User-Agent: Mutt/1.4.1i X-archive-position: 11473 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Content-Length: 294 Lines: 15 On Fri, Nov 05, 2004 at 07:42:50AM -0200, Arnaldo Carvalho de Melo wrote: > >IPSEC.. not that I know of. So unless my distro does stuff behind > >my back, no. How do I make sure? > > setkey -DP Thanks. Both machines I'm seeing this problem on have: # setkey -DP No SPD entries. # --L From tgr@reeler.org Fri Nov 5 04:20:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 04:20:11 -0800 (PST) Received: from rei.rakuen (217-162-107-144.dclient.hispeed.ch [217.162.107.144]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5CK4r6017687 for ; Fri, 5 Nov 2004 04:20:05 -0800 Received: from tgr by rei.rakuen with local (Exim 4.34) id 1CQ2fn-0006N7-5M; Fri, 05 Nov 2004 12:54:31 +0100 Date: Fri, 5 Nov 2004 12:54:31 +0100 From: Thomas Graf To: Szymon Miotk Cc: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-ID: <20041105115430.GP19714@rei.reeler.org> References: <418B4C7C.8000402@crocom.com.pl> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418B4C7C.8000402@crocom.com.pl> X-archive-position: 11475 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 2269 Lines: 54 > [2.] Full description of the problem/report: > I have a server with 3 links to ISPs and 1 link for internal network. > I shape my clients to certain speeds, depending on the time of the day. > I have HTB shaping on each interface, about 2250 classes and 2250 qdisc > on each, so it makes total ~9000 classes (HTB) and ~9000 qdisc (SFQ). > I run shaping scripts 4 times/day. Could you send me the rules via private email or explain the basic architecutre of it? My first thought was that you might run out of stack space while dumping the qdisc tree but it doesn't seem so regarding your oops reports. > Sometimes it makes a kernel oops, hangs at some 'tc ...' command (it > differs). > Then the shaping works so-so (usually it works, but doesn't fully > utilize the bandwidth) and every iproute command hangs. > Killing the hanging processes kills them, but still every iproute > command hangs, including ip and tc. > Sometimes the server stops forwarding, but usually it does so few hours > after kernel oops. > Reboot always helps.A There have been at least 2 slab corruptions in CBQ and some might have been ported over to HTB. I will look into it. > Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0x0/0x6e3 > Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0xf7/0x6e3 > Oct 31 15:02:38 cerber kernel: [] error_code+0x2d/0x38 > Oct 31 15:02:38 cerber kernel: [] tc_modify_qdisc+0x0/0x6e3 Something is wrong here and qdisc_lookup has something to do with it. I will audit qdisc_list changes. > my traffic shaping scripts are rather huge and they don't always cause > kernel oops. I tried to run them together (so classes and qdisc on every > interface were changed in parallel), but it didn't help. > I can send you them if you wish. My first guess is that something corrupts qdisc_list of the device. I'm not sure what causes this but I will look into it today. > The default kernel has serious problems with traffic shaping, that was > resolved in 2.6.9 kernel line. Can you be more exact? Those were different issues, right? > Without recompiling iproute, it hanged every time two iproute commands > were run in parallel. iproute2 problem or kernel problem? Can you give an example how to trigger it? From mic@maxipes.logix.cz Fri Nov 5 04:26:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 04:26:52 -0800 (PST) Received: from maxipes.logix.cz (maxipes.logix.cz [217.11.251.249]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5CQjfR018111 for ; Fri, 5 Nov 2004 04:26:46 -0800 Received: by maxipes.logix.cz (Postfix, from userid 500) id CD9541F9E2; Fri, 5 Nov 2004 11:27:40 +0100 (CET) Date: Fri, 5 Nov 2004 11:27:40 +0100 (CET) From: Michal Ludvig To: Aidas Kasparas Cc: Joy Latten , ipsec-tools-devel@lists.sourceforge.net, netdev@oss.sgi.com Subject: Re: [Ipsec-tools-devel] ipv4/ipv6 forwarding check In-Reply-To: <4181EBC3.3020507@gmc.lt> Message-ID: References: <200410300506.i9U56Yse005815@faith.austin.ibm.com> <4181EBC3.3020507@gmc.lt> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11476 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: michal@logix.cz Precedence: bulk X-list: netdev Content-Length: 621 Lines: 17 On Fri, 29 Oct 2004, Aidas Kasparas wrote: > 4) extend setkey's syntax to make explicit forward policy management > possible and write docs for all the admins to change policies. I have uploaded a tarball of IPsec-tools 0.5-preview to sf.net. Among other changes, setkey is now able (hopefully :-) to handle fwd policies. Please test and report any problems to the IPsec-tools list. Download here: https://sourceforge.net/project/showfiles.php?group_id=74601&package_id=133565 Michal Ludvig -- * A mouse is a device used to point at the xterm you want to type in. * Personal homepage - http://www.logix.cz/michal From util@deuroconsult.ro Fri Nov 5 04:26:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 04:27:06 -0800 (PST) Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5CQwxH018139 for ; Fri, 5 Nov 2004 04:26:59 -0800 Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by webhosting.rdsbv.ro (8.13.1/8.13.1) with ESMTP id iA5BcY2w021174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 5 Nov 2004 13:38:35 +0200 Date: Fri, 5 Nov 2004 13:38:33 +0200 (EET) From: "Catalin(ux aka Dino) BOIE" X-X-Sender: util@webhosting.rdsbv.ro To: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: [PATCH] Use nfmark as a key for u32 classifier Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1646943047-1849353369-1099654713=:19155" X-archive-position: 11477 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 6279 Lines: 123 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1646943047-1849353369-1099654713=:19155 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Hello! I am glad to announce a patch for u32 to allow matches on nfmark. The patch is non intrusive (few lines). Why I did this? Because fw classifier cannot be used together with u32. For example, now, you cannot match a mark of 0x90 and a destination port of 80. I know you can do it with iptables to do the marking, but if you use Jamal actions to apply mark to policed packets, you need this. All stuff can be found at http://kernel.umbrella.ro/ also. Dave, please consider adding this patch. Stephen, if Dave accepts the patch, please apply the iproute2 patch. Thank you. Signed-off-by: Catalin(ux aka Dino) BOIE Thank you for you time. --- Catalin(ux aka Dino) BOIE catab at deuroconsult.ro http://kernel.umbrella.ro/ ---1646943047-1849353369-1099654713=:19155 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="iproute2-match-mark-in-u32.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="iproute2-match-mark-in-u32.patch" LS0tIGlwcm91dGUyLTIuNi45L3RjL2ZfdTMyLmMub3JpZwkyMDA0LTExLTA0 IDE1OjM4OjUzLjAwMDAwMDAwMCArMDIwMA0KKysrIGlwcm91dGUyLTIuNi45 L3RjL2ZfdTMyLmMJMjAwNC0xMS0wNSAxMjoyMzo0NC4wMDAwMDAwMDAgKzAy MDANCkBAIC03LDYgKzcsNyBAQA0KICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBv ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICAqDQog ICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5y LmFjLnJ1Pg0KKyAqCQlNYXRjaCBtYXJrIGFkZGVkIGJ5IENhdGFsaW4odXgg YWthIERpbm8pIEJPSUUgPGNhdGFiIGF0IHVtYnJlbGxhLnJvPiBbNSBub3Yg MjAwNF0NCiAgKg0KICAqLw0KIA0KQEAgLTMzLDcgKzM0LDcgQEAgc3RhdGlj IHZvaWQgZXhwbGFpbih2b2lkKQ0KIAlmcHJpbnRmKHN0ZGVyciwgIm9yICAg ICAgICAgdTMyIGRpdmlzb3IgRElWSVNPUlxuIik7DQogCWZwcmludGYoc3Rk ZXJyLCAiXG4iKTsNCiAJZnByaW50ZihzdGRlcnIsICJXaGVyZTogU0VMRUNU T1IgOj0gU0FNUExFIFNBTVBMRSAuLi5cbiIpOw0KLQlmcHJpbnRmKHN0ZGVy ciwgIiAgICAgICBTQU1QTEUgOj0geyBpcCB8IGlwNiB8IHVkcCB8IHRjcCB8 IGljbXAgfCB1ezMyfDE2fDh9IH0gU0FNUExFX0FSR1NcbiIpOw0KKwlmcHJp bnRmKHN0ZGVyciwgIiAgICAgICBTQU1QTEUgOj0geyBpcCB8IGlwNiB8IHVk cCB8IHRjcCB8IGljbXAgfCB1ezMyfDE2fDh9IHwgbWFyayB9IFNBTVBMRV9B UkdTXG4iKTsNCiAJZnByaW50ZihzdGRlcnIsICIgICAgICAgRklMVEVSSUQg Oj0gWDpZOlpcbiIpOw0KIH0NCiANCkBAIC01OTAsNyArNTkxLDI3IEBAIGRv bmU6DQogCXJldHVybiByZXM7DQogfQ0KIA0KK3N0YXRpYyBpbnQgcGFyc2Vf bWFyayhpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191 MzJfc2VsICpzZWwpDQorew0KKwlpbnQgcmVzID0gLTE7DQorCWludCBhcmdj ID0gKmFyZ2NfcDsNCisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOw0KKw0KKwlp ZiAoYXJnYyA8PSAwKQ0KKwkJcmV0dXJuIC0xOw0KIA0KKwlpZiAoZ2V0X3Uz MigmcmVzLCAqYXJndiwgMCkpIHsNCisJCWZwcmludGYoc3RkZXJyLCAiSWxs ZWdhbCBcIm1hcmtcIlxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJTkVY VF9BUkcoKTsNCisJc2VsLT5tYXJrID0gcmVzOw0KKwlyZXMgPSAwOw0KKw0K KwkqYXJnY19wID0gYXJnYzsNCisJKmFyZ3ZfcCA9IGFyZ3Y7DQorCXJldHVy biByZXM7DQorfQ0KIA0KIHN0YXRpYyBpbnQgcGFyc2Vfc2VsZWN0b3IoaW50 ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBzdHJ1Y3QgdGNfdTMyX3NlbCAq c2VsKQ0KIHsNCkBAIC02NDEsNiArNjYyLDEyIEBAIHN0YXRpYyBpbnQgcGFy c2Vfc2VsZWN0b3IoaW50ICphcmdjX3AsIGMNCiAJCXJlcyA9IHBhcnNlX2lj bXAoJmFyZ2MsICZhcmd2LCBzZWwpOw0KIAkJZ290byBkb25lOw0KIAl9DQor CWlmIChtYXRjaGVzKCphcmd2LCAibWFyayIpID09IDApIHsNCisJCU5FWFRf QVJHKCk7DQorCQlyZXMgPSBwYXJzZV9tYXJrKCZhcmdjLCAmYXJndiwgc2Vs KTsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KIAlyZXR1cm4gLTE7DQogDQog ZG9uZToNCkBAIC05NjksNiArOTk2LDggQEAgc3RhdGljIGludCB1MzJfcHJp bnRfb3B0KHN0cnVjdCBmaWx0ZXJfdQ0KIAkJc3RydWN0IHRjX3UzMl9rZXkg KmtleSA9IHNlbC0+a2V5czsNCiAJCWlmIChzaG93X3N0YXRzICYmIE5VTEwg IT0gcGYpDQogCQkJZnByaW50ZihmLCAiIChydWxlIGhpdCAlbGx1IHN1Y2Nl c3MgJWxsdSkiLHBmLT5yY250LHBmLT5yaGl0KTsNCisJCWlmIChzZWwtPm1h cmspDQorCQkJZnByaW50ZihmLCAiIG1hcmsgMHgleCIsIHNlbC0+bWFyayk7 DQogCQlpZiAoc2VsLT5ua2V5cykgew0KIAkJCWZvciAoaT0wOyBpPHNlbC0+ bmtleXM7IGkrKywga2V5KyspIHsNCiAJCQkJZnByaW50ZihmLCAiXG4gIG1h dGNoICUwOHgvJTA4eCBhdCAlcyVkIiwNCi0tLSBpcHJvdXRlMi0yLjYuOS9p bmNsdWRlL2xpbnV4L3BrdF9jbHMuaC5vcmlnCTIwMDQtMTEtMDQgMTU6NDI6 MjcuMDAwMDAwMDAwICswMjAwDQorKysgaXByb3V0ZTItMi42LjkvaW5jbHVk ZS9saW51eC9wa3RfY2xzLmgJMjAwNC0xMS0wNSAxMToxMjoyMi4wMDAwMDAw MDAgKzAyMDANCkBAIC0yMDgsNiArMjA4LDcgQEAgc3RydWN0IHRjX3UzMl9z ZWwNCiAJdW5zaWduZWQgY2hhcgkJZmxhZ3M7DQogCXVuc2lnbmVkIGNoYXIJ CW9mZnNoaWZ0Ow0KIAl1bnNpZ25lZCBjaGFyCQlua2V5czsNCisJX191MzIJ CQltYXJrOw0KIA0KIAlfX3UxNgkJCW9mZm1hc2s7DQogCV9fdTE2CQkJb2Zm Ow0K ---1646943047-1849353369-1099654713=:19155 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="net-match-nfmark-in-u32.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="net-match-nfmark-in-u32.patch" LS0tIGxpbnV4Lm9yaWcvbmV0L3NjaGVkL2Nsc191MzIuYwkyMDA0LTEwLTE5 IDAwOjUzOjQ1LjAwMDAwMDAwMCArMDMwMA0KKysrIGxpbnV4L25ldC9zY2hl ZC9jbHNfdTMyLmMJMjAwNC0xMS0wNSAxMjoxNDozMS4wMDAwMDAwMDAgKzAy MDANCkBAIC0yNyw2ICsyNyw3IEBADQogICoJSkhTOiBXZSBzaG91bGQgcmVt b3ZlIHRoZSBDT05GSUdfTkVUX0NMU19JTkQgZnJvbSBoZXJlDQogICoJZXZl bnR1YWxseSB3aGVuIHRoZSBtZXRhIG1hdGNoIGV4dGVuc2lvbiBpcyBtYWRl IGF2YWlsYWJsZQ0KICAqDQorICoJbmZtYXJrIG1hdGNoIGFkZGVkIGJ5IENh dGFsaW4odXggYWthIERpbm8pIEJPSUUgPGNhdGFiIGF0IHVtYnJlbGxhLnJv Pg0KICAqLw0KIA0KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPg0KQEAgLTEz OSw2ICsxNDAsMTEgQEAgbmV4dF9rbm9kZToNCiAJCW4tPnBmLT5yY250ICs9 MTsNCiAJCWogPSAwOw0KICNlbmRpZg0KKwkJaWYgKChuLT5zZWwubWFyayA+ IDApICYmIChuLT5zZWwubWFyayAhPSBza2ItPm5mbWFyaykpIHsNCisJCQlu ID0gbi0+bmV4dDsNCisJCQlnb3RvIG5leHRfa25vZGU7DQorCQl9DQorDQog CQlmb3IgKGkgPSBuLT5zZWwubmtleXM7IGk+MDsgaS0tLCBrZXkrKykgew0K IA0KIAkJCWlmICgoKih1MzIqKShwdHIra2V5LT5vZmYrKG9mZjIma2V5LT5v ZmZtYXNrKSlea2V5LT52YWwpJmtleS0+bWFzaykgew0KLS0tIGxpbnV4Lm9y aWcvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgJMjAwNC0xMC0xOSAwMDo1Mzow Ny4wMDAwMDAwMDAgKzAzMDANCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4L3Br dF9jbHMuaAkyMDA0LTExLTA1IDExOjAwOjI3LjAwMDAwMDAwMCArMDIwMA0K QEAgLTIwOCw2ICsyMDgsNyBAQCBzdHJ1Y3QgdGNfdTMyX3NlbA0KIAl1bnNp Z25lZCBjaGFyCQlmbGFnczsNCiAJdW5zaWduZWQgY2hhcgkJb2Zmc2hpZnQ7 DQogCXVuc2lnbmVkIGNoYXIJCW5rZXlzOw0KKwl1MzIJCQltYXJrOw0KIA0K IAlfX3UxNgkJCW9mZm1hc2s7DQogCV9fdTE2CQkJb2ZmOw0K ---1646943047-1849353369-1099654713=:19155-- From tgr@reeler.org Fri Nov 5 06:17:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 06:17:18 -0800 (PST) Received: from rei.rakuen (217-162-107-144.dclient.hispeed.ch [217.162.107.144]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5EHBh5024835 for ; Fri, 5 Nov 2004 06:17:12 -0800 Received: from tgr by rei.rakuen with local (Exim 4.34) id 1CQ4tM-0000px-K4; Fri, 05 Nov 2004 15:16:40 +0100 Date: Fri, 5 Nov 2004 15:16:40 +0100 From: Thomas Graf To: davem@davemloft.net Cc: netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041105141640.GQ19714@rei.reeler.org> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> X-archive-position: 11479 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1344 Lines: 42 > Oct 31 15:02:38 cerber kernel: Unable to handle kernel paging request at > virtual address 00100100 The conversion to the generic list API was nice, it really helps in such a case when a poison value shows up in an oops. However it is not nice if new bugs are introduced with such changes. - if (dev) { - struct Qdisc *q, **qp; - for (qp = &qdisc->dev->qdisc_list; (q=*qp) != NULL; qp = &q->next) { - if (q == qdisc) { - *qp = q->next; - break; - } - } - } + list_del(&qdisc->list); Nice cleanup, although it assumes that everyone calling qdisc_destroy provides a Qdisc which is actually linked or at least has an initialized list node. This was not the true for noqueue and noop dummy qdiscs. Signed-off-by: Thomas Graf --- linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c 2004-11-05 01:11:17.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/sch_generic.c 2004-11-05 15:05:54.000000000 +0100 @@ -280,6 +280,7 @@ .dequeue = noop_dequeue, .flags = TCQ_F_BUILTIN, .ops = &noop_qdisc_ops, + .list = LIST_HEAD_INIT(noop_qdisc.list), }; struct Qdisc_ops noqueue_qdisc_ops = { @@ -298,6 +299,7 @@ .dequeue = noop_dequeue, .flags = TCQ_F_BUILTIN, .ops = &noqueue_qdisc_ops, + .list = LIST_HEAD_INIT(noqueue_qdisc.list), }; From tgraf@suug.ch Fri Nov 5 06:28:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 06:29:04 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5EStQ3025420 for ; Fri, 5 Nov 2004 06:28:56 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id C2D36F; Fri, 5 Nov 2004 15:28:14 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id B3F0F1C0E9; Fri, 5 Nov 2004 15:28:57 +0100 (CET) Date: Fri, 5 Nov 2004 15:28:57 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] PKT_SCHED: Remove old rate estimator and statistics bits Message-ID: <20041105142857.GW12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 11480 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 8609 Lines: 269 Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk14.orig/include/net/act_api.h linux-2.6.10-rc1-bk14/include/net/act_api.h --- linux-2.6.10-rc1-bk14.orig/include/net/act_api.h 2004-11-05 01:10:18.000000000 +0100 +++ linux-2.6.10-rc1-bk14/include/net/act_api.h 2004-11-05 01:42:00.000000000 +0100 @@ -99,7 +99,6 @@ #endif /* CONFIG_NET_CLS_ACT */ extern int tcf_police(struct sk_buff *skb, struct tcf_police *p); -extern int qdisc_copy_stats(struct sk_buff *skb, struct tc_stats *st, spinlock_t *lock); extern void tcf_police_destroy(struct tcf_police *p); extern struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est); extern int tcf_police_dump(struct sk_buff *skb, struct tcf_police *p); diff -Nru linux-2.6.10-rc1-bk14.orig/include/net/pkt_sched.h linux-2.6.10-rc1-bk14/include/net/pkt_sched.h --- linux-2.6.10-rc1-bk14.orig/include/net/pkt_sched.h 2004-11-05 01:10:18.000000000 +0100 +++ linux-2.6.10-rc1-bk14/include/net/pkt_sched.h 2004-11-05 01:42:25.000000000 +0100 @@ -222,9 +222,6 @@ extern void qdisc_destroy(struct Qdisc *qdisc); extern struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops); -extern int qdisc_new_estimator(struct tc_stats *stats, spinlock_t *stats_lock, - struct rtattr *opt); -extern void qdisc_kill_estimator(struct tc_stats *stats); extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, struct rtattr *tab); extern void qdisc_put_rtab(struct qdisc_rate_table *tab); diff -Nru linux-2.6.10-rc1-bk14.orig/net/sched/Makefile linux-2.6.10-rc1-bk14/net/sched/Makefile --- linux-2.6.10-rc1-bk14.orig/net/sched/Makefile 2004-11-05 01:11:17.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/Makefile 2004-11-05 01:41:51.000000000 +0100 @@ -5,7 +5,6 @@ obj-y := sch_generic.o obj-$(CONFIG_NET_SCHED) += sch_api.o sch_fifo.o -obj-$(CONFIG_NET_ESTIMATOR) += estimator.o obj-$(CONFIG_NET_CLS) += cls_api.o obj-$(CONFIG_NET_CLS_ACT) += act_api.o obj-$(CONFIG_NET_ACT_POLICE) += police.o diff -Nru linux-2.6.10-rc1-bk14.orig/net/sched/estimator.c linux-2.6.10-rc1-bk14/net/sched/estimator.c --- linux-2.6.10-rc1-bk14.orig/net/sched/estimator.c 2004-11-05 01:11:17.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/estimator.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,197 +0,0 @@ -/* - * net/sched/estimator.c Simple rate estimator. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Authors: Alexey Kuznetsov, - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - This code is NOT intended to be used for statistics collection, - its purpose is to provide a base for statistical multiplexing - for controlled load service. - If you need only statistics, run a user level daemon which - periodically reads byte counters. - - Unfortunately, rate estimation is not a very easy task. - F.e. I did not find a simple way to estimate the current peak rate - and even failed to formulate the problem 8)8) - - So I preferred not to built an estimator into the scheduler, - but run this task separately. - Ideally, it should be kernel thread(s), but for now it runs - from timers, which puts apparent top bounds on the number of rated - flows, has minimal overhead on small, but is enough - to handle controlled load service, sets of aggregates. - - We measure rate over A=(1<next) { - struct tc_stats *st = e->stats; - u64 nbytes; - u32 npackets; - u32 rate; - - spin_lock(e->stats_lock); - nbytes = st->bytes; - npackets = st->packets; - rate = (nbytes - e->last_bytes)<<(7 - idx); - e->last_bytes = nbytes; - e->avbps += ((long)rate - (long)e->avbps) >> e->ewma_log; - st->bps = (e->avbps+0xF)>>5; - - rate = (npackets - e->last_packets)<<(12 - idx); - e->last_packets = npackets; - e->avpps += ((long)rate - (long)e->avpps) >> e->ewma_log; - e->stats->pps = (e->avpps+0x1FF)>>10; - spin_unlock(e->stats_lock); - } - - mod_timer(&elist[idx].timer, jiffies + ((HZ<interval < -2 || parm->interval > 3) - return -EINVAL; - - est = kmalloc(sizeof(*est), GFP_KERNEL); - if (est == NULL) - return -ENOBUFS; - - memset(est, 0, sizeof(*est)); - est->interval = parm->interval + 2; - est->stats = stats; - est->stats_lock = stats_lock; - est->ewma_log = parm->ewma_log; - est->last_bytes = stats->bytes; - est->avbps = stats->bps<<5; - est->last_packets = stats->packets; - est->avpps = stats->pps<<10; - - est->next = elist[est->interval].list; - if (est->next == NULL) { - init_timer(&elist[est->interval].timer); - elist[est->interval].timer.data = est->interval; - elist[est->interval].timer.expires = jiffies + ((HZ<interval)/4); - elist[est->interval].timer.function = est_timer; - add_timer(&elist[est->interval].timer); - } - write_lock_bh(&est_lock); - elist[est->interval].list = est; - write_unlock_bh(&est_lock); - return 0; -} - -void qdisc_kill_estimator(struct tc_stats *stats) -{ - int idx; - struct qdisc_estimator *est, **pest; - - for (idx=0; idx <= EST_MAX_INTERVAL; idx++) { - int killed = 0; - pest = &elist[idx].list; - while ((est=*pest) != NULL) { - if (est->stats != stats) { - pest = &est->next; - continue; - } - - write_lock_bh(&est_lock); - *pest = est->next; - write_unlock_bh(&est_lock); - - kfree(est); - killed++; - } - if (killed && elist[idx].list == NULL) - del_timer(&elist[idx].timer); - } -} - -EXPORT_SYMBOL(qdisc_kill_estimator); -EXPORT_SYMBOL(qdisc_new_estimator); diff -Nru linux-2.6.10-rc1-bk14.orig/net/sched/sch_api.c linux-2.6.10-rc1-bk14/net/sched/sch_api.c --- linux-2.6.10-rc1-bk14.orig/net/sched/sch_api.c 2004-11-05 01:11:17.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/sch_api.c 2004-11-05 01:42:38.000000000 +0100 @@ -728,19 +728,6 @@ return 0; } -int qdisc_copy_stats(struct sk_buff *skb, struct tc_stats *st, spinlock_t *lock) -{ - spin_lock_bh(lock); - RTA_PUT(skb, TCA_STATS, sizeof(struct tc_stats), st); - spin_unlock_bh(lock); - return 0; - -rtattr_failure: - spin_unlock_bh(lock); - return -1; -} - - static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid, u32 pid, u32 seq, unsigned flags, int event) { @@ -1271,7 +1258,6 @@ subsys_initcall(pktsched_init); -EXPORT_SYMBOL(qdisc_copy_stats); EXPORT_SYMBOL(qdisc_get_rtab); EXPORT_SYMBOL(qdisc_put_rtab); EXPORT_SYMBOL(register_qdisc); From hadi@cyberus.ca Fri Nov 5 07:51:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 07:51:18 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5FpCEr029212 for ; Fri, 5 Nov 2004 07:51:12 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CQ6MX-0003Qs-AU for netdev@oss.sgi.com; Fri, 05 Nov 2004 10:50:53 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CQ6MR-0008Dd-1i; Fri, 05 Nov 2004 10:50:47 -0500 Subject: Re: [PATCH] Use nfmark as a key for u32 classifier From: jamal Reply-To: hadi@cyberus.ca To: "Catalin(ux aka Dino) "BOIE Cc: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com In-Reply-To: References: Content-Type: text/plain Organization: jamalopolous Message-Id: <1099669841.1026.18.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 05 Nov 2004 10:50:41 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11481 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1312 Lines: 39 I think this is an ok midterm solution and should be applied. One comment Catalin: Can you resend the patch make this a selectable choice via kconfig? Eventually - we should kill this + the indev choices on u32 and move it up one so that we can have all filters capable of following filters from other classifiers. As a matter of fact we already have this feature but it is a little on the inefficient side at the moment. cheers, jamal On Fri, 2004-11-05 at 06:38, Catalin(ux aka Dino) BOIE wrote: > Hello! > > I am glad to announce a patch for u32 to allow matches on nfmark. > The patch is non intrusive (few lines). > > Why I did this? Because fw classifier cannot be used together with u32. > For example, now, you cannot match a mark of 0x90 and a destination > port of 80. I know you can do it with iptables to do the marking, but if > you use Jamal actions to apply mark to policed packets, you need this. > > All stuff can be found at http://kernel.umbrella.ro/ also. > > Dave, please consider adding this patch. > > Stephen, if Dave accepts the patch, please apply the iproute2 patch. Thank > you. > > Signed-off-by: Catalin(ux aka Dino) BOIE > > Thank you for you time. > --- > Catalin(ux aka Dino) BOIE > catab at deuroconsult.ro > http://kernel.umbrella.ro/ From mcgrof@studorgs.rutgers.edu Fri Nov 5 08:20:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 08:21:01 -0800 (PST) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5GKsBv007162 for ; Fri, 5 Nov 2004 08:20:55 -0800 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 9FC25F9E04; Fri, 5 Nov 2004 11:20:37 -0500 (EST) Date: Fri, 5 Nov 2004 11:20:37 -0500 To: prism54-devel@prism54.org Cc: Netdev , Jouni Malinen Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041105162037.GN388@ruslug.rutgers.edu> Mail-Followup-To: prism54-devel@prism54.org, Netdev , Jouni Malinen References: <20041104032219.GU388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="QDd5rp1wjxlDmy9q" Content-Disposition: inline In-Reply-To: <20041104032219.GU388@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 11482 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev Content-Length: 2416 Lines: 75 --QDd5rp1wjxlDmy9q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Nov 03, 2004 at 10:22:19PM -0500, Luis R. Rodriguez wrote: >=20 > I'd like to announce we've received patches to allow for AP WPA > using hostap and complete WDS support. I'd like to thank Bell Kin from > PEK Inc. for contributing this. I'll be reviewing the code now and > integrating what needs to go into CVS. >=20 > WPA STA support is still there -- what can I say, I'm stuck. I believe I > have added most of what needs to be added to the driver for its support > but at this point am having trouble getting the device to work > appropritately. I do believe companies out there do have WPA STA support > for their FullMAC chipsets. I wanted to ask for their support in > reviewing what we have to see if we can finally get this through. >=20 > Thanks, >=20 > Luis Great news, I have reviewed, cleaned up and committed Bell Kin's patches into CVS. Prism54 AP WPA (Version 1) support and WDS support is now complete. I've updated the README and there two new sections: Access Point WPA support (NEW) (requires hostapd) Access Point WDS Support (NEW) I did not have time or a box available to test the code (even to compile). Please help with this. Please read the documentation, and test.= =20 If you find something broken please e-mail prism54-devel and if possible=20 send patches which fixes what's broken even if its documentation. After this has been tested we then can send patches upstream to netdev for kernel inclusion. Please note that Prism54 client/STA suppport has been added but its not yet working. We need help with this from experienced companies that have used the FullMAC and enabled STA WPA support. --- Left on our TODO list are: * fix WPA STA support * move to netif_msg, away from our nasty debug system I say let's work hard on these two and push a new driver release. --- Thanks once again to Bell Kin for from PEK Inc for his contributions. Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --QDd5rp1wjxlDmy9q Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBi6hVat1JN+IKUl4RAm2bAJ9UVWYY+5hTpHvVYsZ8L+8kzBY3ggCfdiss DTta2Avhs3ajwOPtSK+HVF4= =Zorm -----END PGP SIGNATURE----- --QDd5rp1wjxlDmy9q-- From akpm@osdl.org Fri Nov 5 15:29:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:30:14 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NTtC6023256 for ; Fri, 5 Nov 2004 15:29:55 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA5NQU930292 for ; Fri, 5 Nov 2004 15:26:30 -0800 Date: Fri, 5 Nov 2004 15:30:40 -0800 From: Andrew Morton To: netdev@oss.sgi.com Subject: Fw: [Bugme-new] [Bug 3706] New: Kernel build fails on sungem driver compile. Message-Id: <20041105153040.564f1c2a.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11483 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 25687 Lines: 1191 Begin forwarded message: Date: Fri, 5 Nov 2004 14:23:19 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3706] New: Kernel build fails on sungem driver compile. http://bugme.osdl.org/show_bug.cgi?id=3706 Summary: Kernel build fails on sungem driver compile. Kernel Version: 2.6.10-rc1 Status: NEW Severity: blocking Owner: jgarzik@pobox.com Submitter: jathan@gmail.com Distribution: Gentoo 2004.3 Hardware Environment: 2nd Gen PowerMac G5 (2 x 1.8GHz, 160GB HD, 1.5GB RAM) Software Environment: Linux rebot 2.6.9-gentoo-r1 #1 SMP Sat Oct 23 22:34:45 UTC 2004 ppc64 PPC970, altivec supported PowerMac7,3 GNU/Linux Problem Description: Make fails like so: rebot linux-2.6.10-rc1 # make CHK include/linux/version.h make[1]: `arch/ppc64/kernel/asm-offsets.s' is up to date. CHK include/linux/compile.h GEN_INITRAMFS_LIST usr/initramfs_list Using shipped usr/initramfs_list GEN .version CHK include/linux/compile.h UPD include/linux/compile.h CC init/version.o LD init/built-in.o LD .tmp_vmlinux1 drivers/built-in.o(.text+0xc3520): In function `.gem_init_one': : undefined reference to `.get_gem_mac_nonobp' make: *** [.tmp_vmlinux1] Error 1 Steps to reproduce: Try to make using this .config: rebot linux-2.6.10-rc1 # cat .config # # Automatically generated make config: don't edit # Linux kernel version: 2.6.10-rc1 # Fri Nov 5 17:08:31 2004 # CONFIG_64BIT=y CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_ISA_DMA=y CONFIG_HAVE_DEC_LOCK=y CONFIG_EARLY_PRINTK=y CONFIG_COMPAT=y CONFIG_FRAME_POINTER=y CONFIG_FORCE_MAX_ZONEORDER=13 # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y # # General setup # CONFIG_LOCALVERSION="" CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y # CONFIG_AUDIT is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_HOTPLUG=y CONFIG_KOBJECT_UEVENT=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_FUTEX=y CONFIG_EPOLL=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SHMEM=y # CONFIG_TINY_SHMEM is not set # # Loadable module support # # CONFIG_MODULES is not set CONFIG_SYSVIPC_COMPAT=y # # Platform support # # CONFIG_PPC_ISERIES is not set CONFIG_PPC_MULTIPLATFORM=y CONFIG_PPC_PSERIES=y # CONFIG_PPC_PMAC is not set CONFIG_PPC=y CONFIG_PPC64=y CONFIG_PPC_OF=y CONFIG_ALTIVEC=y # CONFIG_PPC_SPLPAR is not set # CONFIG_U3_DART is not set # CONFIG_BOOTX_TEXT is not set # CONFIG_POWER4_ONLY is not set # CONFIG_IOMMU_VMERGE is not set CONFIG_SMP=y CONFIG_IRQ_ALL_CPUS=y CONFIG_NR_CPUS=32 # CONFIG_HMT is not set # CONFIG_DISCONTIGMEM is not set # CONFIG_SCHED_SMT is not set # CONFIG_PREEMPT is not set CONFIG_GENERIC_HARDIRQS=y CONFIG_PPC_RTAS=y CONFIG_RTAS_FLASH=y CONFIG_SCANLOG=y CONFIG_LPARCFG=y # # General setup # CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y # CONFIG_HOTPLUG_CPU is not set # # PCCARD (PCMCIA/CardBus) support # # CONFIG_PCCARD is not set # # PC-card bridges # # # PCI Hotplug Support # CONFIG_HOTPLUG_PCI=y # CONFIG_HOTPLUG_PCI_FAKE is not set # CONFIG_HOTPLUG_PCI_CPCI is not set # CONFIG_HOTPLUG_PCI_PCIE is not set # CONFIG_HOTPLUG_PCI_SHPC is not set CONFIG_HOTPLUG_PCI_RPA=y CONFIG_HOTPLUG_PCI_RPA_DLPAR=y CONFIG_PROC_DEVICETREE=y # CONFIG_CMDLINE_BOOL is not set # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # # CONFIG_MTD is not set # # Parallel port support # # CONFIG_PARPORT is not set # # Plug and Play support # # # Block devices # CONFIG_BLK_DEV_FD=y # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_UB is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_CDROM_PKTCDVD is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set # CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_OFFBOARD is not set CONFIG_BLK_DEV_GENERIC=y # CONFIG_BLK_DEV_OPTI621 is not set CONFIG_BLK_DEV_SL82C105=y CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_TRIFLEX is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5520 is not set # CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_HPT34X is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_PIIX is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set # # SCSI Transport Attributes # CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_FC_ATTRS=y # # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_SCSI_SATA is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_IBMVSCSI is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLOGIC_1280_1040 is not set CONFIG_SCSI_QLA2XXX=y CONFIG_SCSI_QLA21XX=y CONFIG_SCSI_QLA22XX=y CONFIG_SCSI_QLA2300=y CONFIG_SCSI_QLA2322=y CONFIG_SCSI_QLA6312=y CONFIG_SCSI_QLA6322=y # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DEBUG is not set # # Multi-device support (RAID and LVM) # # CONFIG_MD is not set # # Fusion MPT device support # # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_IEEE1394 is not set # # I2O device support # # CONFIG_I2O is not set # # Macintosh device drivers # # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set # CONFIG_NETLINK_DEV is not set CONFIG_UNIX=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_TUNNEL=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set # CONFIG_IPV6 is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=y # CONFIG_IP_NF_CT_ACCT is not set # CONFIG_IP_NF_CONNTRACK_MARK is not set # CONFIG_IP_NF_CT_PROTO_SCTP is not set CONFIG_IP_NF_FTP=y CONFIG_IP_NF_IRC=y CONFIG_IP_NF_TFTP=y CONFIG_IP_NF_AMANDA=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_LIMIT=y CONFIG_IP_NF_MATCH_IPRANGE=y CONFIG_IP_NF_MATCH_MAC=y CONFIG_IP_NF_MATCH_PKTTYPE=y CONFIG_IP_NF_MATCH_MARK=y CONFIG_IP_NF_MATCH_MULTIPORT=y CONFIG_IP_NF_MATCH_TOS=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_DSCP=y CONFIG_IP_NF_MATCH_AH_ESP=y CONFIG_IP_NF_MATCH_LENGTH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_TCPMSS=y CONFIG_IP_NF_MATCH_HELPER=y CONFIG_IP_NF_MATCH_STATE=y CONFIG_IP_NF_MATCH_CONNTRACK=y CONFIG_IP_NF_MATCH_OWNER=y # CONFIG_IP_NF_MATCH_ADDRTYPE is not set # CONFIG_IP_NF_MATCH_REALM is not set # CONFIG_IP_NF_MATCH_SCTP is not set # CONFIG_IP_NF_MATCH_COMMENT is not set # CONFIG_IP_NF_MATCH_HASHLIMIT is not set CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_IP_NF_TARGET_TCPMSS=y CONFIG_IP_NF_NAT=y CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_SAME=y # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=y CONFIG_IP_NF_NAT_IRC=y CONFIG_IP_NF_NAT_FTP=y CONFIG_IP_NF_NAT_TFTP=y CONFIG_IP_NF_NAT_AMANDA=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_TOS=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_DSCP=y CONFIG_IP_NF_TARGET_MARK=y CONFIG_IP_NF_TARGET_CLASSIFY=y # CONFIG_IP_NF_RAW is not set CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_NET_HW_FLOWCONTROL is not set # # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set # CONFIG_NET_CLS_ROUTE is not set # # Network testing # # CONFIG_NET_PKTGEN is not set CONFIG_NETPOLL=y CONFIG_NETPOLL_RX=y CONFIG_NETPOLL_TRAP=y CONFIG_NET_POLL_CONTROLLER=y # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set # CONFIG_BT is not set CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_BONDING=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set CONFIG_SUNGEM=y # CONFIG_NET_VENDOR_3COM is not set # # Tulip family network device support # # CONFIG_NET_TULIP is not set # CONFIG_HP100 is not set # CONFIG_IBMVETH is not set CONFIG_NET_PCI=y CONFIG_PCNET32=y # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_B44 is not set # CONFIG_FORCEDETH is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set # CONFIG_FEALNX is not set # CONFIG_NATSEMI is not set # CONFIG_NE2K_PCI is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_SIS900 is not set # CONFIG_EPIC100 is not set # CONFIG_SUNDANCE is not set # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set # # Ethernet (1000 Mbit) # CONFIG_ACENIC=y CONFIG_ACENIC_OMIT_TIGON_I=y # CONFIG_DL2K is not set CONFIG_E1000=y # CONFIG_E1000_NAPI is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set # CONFIG_SK98LIN is not set CONFIG_TIGON3=y # # Ethernet (10000 Mbit) # CONFIG_IXGB=y # CONFIG_IXGB_NAPI is not set # CONFIG_S2IO is not set # # Token Ring devices # CONFIG_TR=y CONFIG_IBMOL=y # CONFIG_3C359 is not set # CONFIG_TMS380TR is not set # # Wireless LAN (non-hamradio) # # CONFIG_NET_RADIO is not set # # Wan interfaces # # CONFIG_WAN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set CONFIG_PPP_ASYNC=y CONFIG_PPP_SYNC_TTY=y CONFIG_PPP_DEFLATE=y CONFIG_PPP_BSDCOMP=y CONFIG_PPPOE=y # CONFIG_SLIP is not set # CONFIG_NET_FC is not set # CONFIG_SHAPER is not set CONFIG_NETCONSOLE=y # # ISDN subsystem # # CONFIG_ISDN is not set # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_TSDEV is not set # CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y CONFIG_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_RAW is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=y # CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_NONSTANDARD is not set # # Serial drivers # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_PMACZILOG is not set # CONFIG_SERIAL_ICOM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 CONFIG_HVC_CONSOLE=y # CONFIG_HVCS is not set # # IPMI # # CONFIG_IPMI_HANDLER is not set # # Watchdog Cards # # CONFIG_WATCHDOG is not set CONFIG_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_AGP is not set # CONFIG_DRM is not set CONFIG_RAW_DRIVER=y CONFIG_MAX_RAW_DEVS=256 # # I2C support # CONFIG_I2C=y # CONFIG_I2C_CHARDEV is not set # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_ALGOPCF is not set # CONFIG_I2C_ALGOPCA is not set # # I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set # CONFIG_I2C_ISA is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # # Hardware Sensors Chip support # # CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set # # Other I2C Chip support # # CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_RTC8564 is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # # # Multimedia devices # # CONFIG_VIDEO_DEV is not set # # Digital Video Broadcasting Devices # # CONFIG_DVB is not set # # Graphics support # CONFIG_FB=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y # CONFIG_FB_CT65550 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_RIVA is not set CONFIG_FB_MATROX=y CONFIG_FB_MATROX_MILLENIUM=y CONFIG_FB_MATROX_MYSTIQUE=y CONFIG_FB_MATROX_G450=y CONFIG_FB_MATROX_G100=y # CONFIG_FB_MATROX_I2C is not set CONFIG_FB_MATROX_MULTIHEAD=y # CONFIG_FB_RADEON_OLD is not set CONFIG_FB_RADEON=y CONFIG_FB_RADEON_I2C=y # CONFIG_FB_RADEON_DEBUG is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_VIRTUAL is not set # # Console display driver support # # CONFIG_VGA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # # Logo configuration # CONFIG_LOGO=y CONFIG_LOGO_LINUX_MONO=y CONFIG_LOGO_LINUX_VGA16=y CONFIG_LOGO_LINUX_CLUT224=y # # Sound # # CONFIG_SOUND is not set # # USB support # CONFIG_USB=y # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y # CONFIG_USB_BANDWIDTH is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_UHCI_HCD is not set # # USB Device Class drivers # # CONFIG_USB_BLUETOOTH_TTY is not set # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_RW_DETECT is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # # USB Human Interface Devices (HID) # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y # CONFIG_HID_FF is not set CONFIG_USB_HIDDEV=y # CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set # CONFIG_USB_MTOUCH is not set # CONFIG_USB_EGALAX is not set # CONFIG_USB_XPAD is not set # CONFIG_USB_ATI_REMOTE is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_HPUSBSCSI is not set # # USB Multimedia devices # # CONFIG_USB_DABUSB is not set # # Video4Linux support is needed for USB Multimedia device support # # # USB Network adaptors # # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_USBNET is not set # # USB port drivers # # # USB Serial Converter support # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_TEST is not set # # USB ATM/DSL drivers # # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y # CONFIG_EXT3_FS_SECURITY is not set CONFIG_JBD=y # CONFIG_JBD_DEBUG is not set CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_QUOTA is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y # CONFIG_JOLIET is not set # CONFIG_ZISOFS is not set CONFIG_UDF_FS=y CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS_XATTR=y # CONFIG_DEVPTS_FS_SECURITY is not set CONFIG_TMPFS=y # CONFIG_TMPFS_XATTR is not set CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set CONFIG_CRAMFS=y # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # # Network File Systems # # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_EXPORTFS is not set # CONFIG_SMB_FS is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # # Profiling support # CONFIG_PROFILING=y CONFIG_OPROFILE=y # # Kernel hacking # CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_INFO is not set CONFIG_DEBUG_STACKOVERFLOW=y CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUGGER=y CONFIG_XMON=y CONFIG_XMON_DEFAULT=y # CONFIG_PPCDBG is not set # CONFIG_IRQSTACKS is not set # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_WP512 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_KHAZAD is not set CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_TEST is not set # # Library routines # CONFIG_CRC_CCITT=y CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From raghavendra.koushik@s2io.com Fri Nov 5 15:33:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:33:28 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NXKFM023666 for ; Fri, 5 Nov 2004 15:33:21 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA5KPaje009834; Fri, 5 Nov 2004 15:25:36 -0500 (EST) Received: from [10.16.16.112] ([10.16.16.112]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA5KPW39002391; Fri, 5 Nov 2004 15:25:32 -0500 (EST) From: koushik Organization: S2IO To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Subject: Please ignore the corrupt patches sent earlier. Date: Fri, 5 Nov 2004 05:23:49 -0800 User-Agent: KMail/1.6.2 Cc: leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com MIME-Version: 1.0 Content-Disposition: inline X-PRIORITY: 2 (High) Priority: urgent Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200411050523.49239.raghavendra.koushik@s2io.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11484 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 282 Lines: 7 Hi All, I had sent five of my patches with the new mail client, but it seems to have introduced some series of '-' charecters at the end. So please ignore all those 5 mails, I will be sending the series of 12 patches again (hopefully for the last time :-)). With regards Koushik From raghavendra.koushik@s2io.com Fri Nov 5 15:33:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:33:32 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NXKFS023666 for ; Fri, 5 Nov 2004 15:33:23 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA5K9Cje009665; Fri, 5 Nov 2004 15:09:12 -0500 (EST) Received: from [10.16.16.112] ([10.16.16.112]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA5K9739027614; Fri, 5 Nov 2004 15:09:08 -0500 (EST) From: koushik Organization: S2IO Subject: [PATCH 2.6.9-rc2 4/12] S2io: hardware fixes Date: Fri, 5 Nov 2004 05:07:24 -0800 User-Agent: KMail/1.6.2 To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411050507.24903.raghavendra.koushik@s2io.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11485 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 10991 Lines: 334 Hi, Following are the code changes addressing the hardware errata mentioned in user guide. 1. Xena3's with a set of subsystem IDs had Link LED problems, fixed that specifically for them. 2. To write into the Keyed Mac_Cfg register to enable broadcast, writing two 32 bit writes into it along with a write to the key register rather than a single write to key and a 64 bit write to mac_cfg. This is necessary on 32 bit systems where a writeq(64 bit write) is actually two writel (32 bit writes). 3. Writes to some special registers mentioned in UG is being done by a special macro which defines which 32 bits of the 64 bit register is to be written first. Again this applies only on 32 bit systems. 4. Configured pause frame related water marks and a shared_split value which describes the Max TXDMA related split transaction that can be used without giving room for the Rx transactions. 5. The mac_rmac_err_reg R1 register will be cleared in the interrupt handler itself rather than in the scheduled task as was being done previously. 6. Even on PCC_FB_ECC error the card will be reset by disabling adapter enable bit. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-07 11:44:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-07 11:45:41.000000000 -0700 @@ -71,6 +71,15 @@ static char s2io_driver_name[] = "s2io"; static char s2io_driver_version[] = "Version 1.7.5.1"; +/* + * Cards with following subsystem_id have a link state indication + * problem, 600B, 600C, 600D, 640B, 640C and 640D. + * macro below identifies these cards given the subsystem_id. + */ +#define CARDS_WITH_FAULTY_LINK_INDICATORS(subid) \ + (((subid >= 0x600B) && (subid <= 0x600D)) || \ + ((subid >= 0x640B) && (subid <= 0x640D))) ? 1 : 0 + #define LINK_IS_UP(val64) (!(val64 & (ADAPTER_STATUS_RMAC_REMOTE_FAULT | \ ADAPTER_STATUS_RMAC_LOCAL_FAULT))) #define TASKLET_IN_USE test_and_set_bit(0, \ @@ -563,10 +572,13 @@ schedule_timeout(HZ / 2); /* Enable Receiving broadcasts */ + add = (void *) &bar0->mac_cfg; val64 = readq(&bar0->mac_cfg); val64 |= MAC_RMAC_BCAST_ENABLE; writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); - writeq(val64, &bar0->mac_cfg); + writel((u32) val64, add); + writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); + writel((u32) (val64 >> 32), (add + 4)); /* Read registers in all blocks */ val64 = readq(&bar0->mac_int_mask); @@ -598,8 +610,8 @@ dtx_cnt++; goto mdio_cfg; } - writeq(default_dtx_cfg[dtx_cnt], - &bar0->dtx_control); + SPECIAL_REG_WRITE(default_dtx_cfg[dtx_cnt], + &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); dtx_cnt++; } @@ -609,8 +621,8 @@ mdio_cnt++; goto dtx_cfg; } - writeq(default_mdio_cfg[mdio_cnt], - &bar0->mdio_control); + SPECIAL_REG_WRITE(default_mdio_cfg[mdio_cnt], + &bar0->mdio_control, UF); val64 = readq(&bar0->mdio_control); mdio_cnt++; } @@ -873,6 +885,47 @@ writel((u32) (val64 >> 32), (add + 4)); val64 = readq(&bar0->mac_cfg); + /* + * Set the time value to be inserted in the pause frame + * generated by xena. + */ + val64 = readq(&bar0->rmac_pause_cfg); + val64 &= ~(RMAC_PAUSE_HG_PTIME(0xffff)); + val64 |= RMAC_PAUSE_HG_PTIME(nic->mac_control.rmac_pause_time); + writeq(val64, &bar0->rmac_pause_cfg); + + /* + * Set the Threshold Limit for Generating the pause frame + * If the amount of data in any Queue exceeds ratio of + * (mac_control.mc_pause_threshold_q0q3 or q4q7)/256 + * pause frame is generated + */ + val64 = 0; + for (i = 0; i < 4; i++) { + val64 |= + (((u64) 0xFF00 | nic->mac_control. + mc_pause_threshold_q0q3) + << (i * 2 * 8)); + } + writeq(val64, &bar0->mc_pause_thresh_q0q3); + + val64 = 0; + for (i = 0; i < 4; i++) { + val64 |= + (((u64) 0xFF00 | nic->mac_control. + mc_pause_threshold_q4q7) + << (i * 2 * 8)); + } + writeq(val64, &bar0->mc_pause_thresh_q4q7); + + /* + * TxDMA will stop Read request if the number of read split has + * exceeded the limit pointed by shared_splits + */ + val64 = readq(&bar0->pic_control); + val64 |= PIC_CNTL_SHARED_SPLITS(0); + writeq(val64, &bar0->pic_control); + return SUCCESS; } @@ -1227,7 +1280,7 @@ */ val64 = readq(&bar0->mc_rldram_mrs); val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE | MC_RLDRAM_MRS_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); val64 = readq(&bar0->mc_rldram_mrs); set_current_state(TASK_UNINTERRUPTIBLE); @@ -1291,13 +1344,13 @@ * force link down. Since link is already up, we will get * link state change interrupt after this reset */ - writeq(0x80010515001E0000ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80010515001E0000ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); - writeq(0x80010515001E00E0ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80010515001E00E0ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); - writeq(0x80070515001F00E4ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80070515001F00E4ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); @@ -1884,6 +1937,7 @@ /* Handling link status change error Intr */ err_reg = readq(&bar0->mac_rmac_err_reg); + writeq(err_reg, &bar0->mac_rmac_err_reg); if (err_reg & RMAC_LINK_STATE_CHANGE_INT) { schedule_work(&nic->set_link_task); } @@ -1896,6 +1950,22 @@ schedule_work(&nic->rst_timer_task); } + /* + * Also as mentioned in the latest Errata sheets if the PCC_FB_ECC + * Error occurs, the adapter will be recycled by disabling the + * adapter enable bit and enabling it again after the device + * becomes Quiescent. + */ + val64 = readq(&bar0->pcc_err_reg); + writeq(val64, &bar0->pcc_err_reg); + if (val64 & PCC_FB_ECC_DB_ERR) { + u64 ac = readq(&bar0->adapter_control); + ac &= ~(ADAPTER_CNTL_EN); + writeq(ac, &bar0->adapter_control); + ac = readq(&bar0->adapter_control); + schedule_work(&nic->set_link_task); + } + /* Other type of interrupts are not being handled now, TODO */ } @@ -2870,12 +2940,13 @@ static int s2io_ethtool_idnic(struct net_device *dev, u32 data) { - u64 val64 = 0; + u64 val64 = 0, last_gpio_ctrl_val; nic_t *sp = dev->priv; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; u16 subid; subid = sp->pdev->subsystem_device; + last_gpio_ctrl_val = readq(&bar0->gpio_control); if ((subid & 0xFF) < 0x07) { val64 = readq(&bar0->adapter_control); if (!(val64 & ADAPTER_CNTL_EN)) { @@ -2897,6 +2968,11 @@ schedule_timeout(MAX_SCHEDULE_TIMEOUT); del_timer_sync(&sp->id_timer); + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + writeq(last_gpio_ctrl_val, &bar0->gpio_control); + last_gpio_ctrl_val = readq(&bar0->gpio_control); + } + return 0; } @@ -2983,7 +3059,7 @@ val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) | I2C_CONTROL_BYTE_CNT(0x3) | I2C_CONTROL_READ | I2C_CONTROL_CNTL_START; - writeq(val64, &bar0->i2c_control); + SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF); while (exit_cnt < 5) { val64 = readq(&bar0->i2c_control); @@ -3024,7 +3100,7 @@ val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) | I2C_CONTROL_BYTE_CNT(cnt) | I2C_CONTROL_SET_DATA(data) | I2C_CONTROL_CNTL_START; - writeq(val64, &bar0->i2c_control); + SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF); while (exit_cnt < 5) { val64 = readq(&bar0->i2c_control); @@ -3352,10 +3428,10 @@ val64 = readq(&bar0->mc_rldram_mrs); val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); val64 |= MC_RLDRAM_MRS_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); while (iteration < 2) { val64 = 0x55555555aaaa0000ULL; @@ -3757,8 +3833,10 @@ nic_t *nic = (nic_t *) data; struct net_device *dev = nic->dev; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; - register u64 val64, err_reg; + register u64 val64; + u16 subid; + subid = nic->pdev->subsystem_device; /* * Allow a small delay for the NICs self initiated * cleanup to complete. @@ -3768,16 +3846,19 @@ val64 = readq(&bar0->adapter_status); if (verify_xena_quiescence(val64, nic->device_enabled_once)) { - /* Acknowledge Intr and clear R1 register. */ - err_reg = readq(&bar0->mac_rmac_err_reg); - writeq(err_reg, &bar0->mac_rmac_err_reg); - if (LINK_IS_UP(val64)) { val64 = readq(&bar0->adapter_control); val64 |= ADAPTER_CNTL_EN; writeq(val64, &bar0->adapter_control); - val64 |= ADAPTER_LED_ON; - writeq(val64, &bar0->adapter_control); + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + val64 = readq(&bar0->gpio_control); + val64 |= GPIO_CTRL_GPIO_0; + writeq(val64, &bar0->gpio_control); + val64 = readq(&bar0->gpio_control); + } else { + val64 |= ADAPTER_LED_ON; + writeq(val64, &bar0->adapter_control); + } val64 = readq(&bar0->adapter_status); if (!LINK_IS_UP(val64)) { DBG_PRINT(ERR_DBG, "%s:", dev->name); @@ -3791,6 +3872,12 @@ } s2io_link(nic, LINK_UP); } else { + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + val64 = readq(&bar0->gpio_control); + val64 &= ~GPIO_CTRL_GPIO_0; + writeq(val64, &bar0->gpio_control); + val64 = readq(&bar0->gpio_control); + } s2io_link(nic, LINK_DOWN); } } else { /* NIC is not Quiescent. */ @@ -3917,6 +4004,7 @@ return SUCCESS; } + /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-07 11:44:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-08 15:20:09.316690064 -0700 @@ -693,6 +693,27 @@ writel((u32) (val), addr); writel((u32) (val >> 32), (addr + 4)); } + +/* In 32 bit modes, some registers have to be written in a + * particular order to expect correct hardware operation. The + * macro SPECIAL_REG_WRITE is used to perform such ordered + * writes. Defines UF (Upper First) and LF (Lower First) will + * be used to specify the required write order. + */ +#define UF 1 +#define LF 2 +static inline void SPECIAL_REG_WRITE(u64 val, void *addr, int order) +{ + if (order == LF) { + writel((u32) (val), addr); + writel((u32) (val >> 32), (addr + 4)); + } else { + writel((u32) (val >> 32), (addr + 4)); + writel((u32) (val), addr); + } +} +#else +#define SPECIAL_REG_WRITE(val, addr, dummy) writeq(val, addr) #endif /* Interrupt related values of Xena */ ------------------------------------------------------- From raghavendra.koushik@s2io.com Fri Nov 5 15:33:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:33:35 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NXKFU023666 for ; Fri, 5 Nov 2004 15:33:24 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA5K9lje009677; Fri, 5 Nov 2004 15:09:47 -0500 (EST) Received: from [10.16.16.112] ([10.16.16.112]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA5K9h39027735; Fri, 5 Nov 2004 15:09:43 -0500 (EST) From: koushik Organization: S2IO Subject: [PATCH 2.6.9-rc2 5/12] S2io: module loadable parameters Date: Fri, 5 Nov 2004 05:08:00 -0800 User-Agent: KMail/1.6.2 To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411050508.00919.raghavendra.koushik@s2io.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11488 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 21480 Lines: 672 Hi, This patch adds/modifies the following module loadable parameters. 1. Max Txds per List. 2. statistics refresh time 3. pause frame control parameters including gap between two successive frames, threshold watermarks 4. RTI and TTI configuration parameters including ranges, packet counts and timeout periods. For further information please read the section 3.5 of XFrame H/W spec. 5. PCI/PCI-X configuration variables latency_timer, MMRBC and OST. 6. OS offload features TSO (If support available) and checksum offload. 7. If NAPI is not in use, a variable indicate_max_pkts can be used to limit number of Rx side packets processed for one call to Rx Intr handler. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 15:33:35.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-11 15:34:23.000000000 -0700 @@ -223,14 +223,66 @@ }; /* Module Loadable parameters. */ -static u32 ring_num; static u32 frame_len[MAX_RX_RINGS]; -static u32 ring_len[MAX_RX_RINGS]; -static u32 fifo_num; -static u32 fifo_len[MAX_TX_FIFOS]; static u32 rx_prio; static u32 tx_prio; -static u8 latency_timer; + +static unsigned int lso_enable = 1; +#ifndef CONFIG_S2IO_NAPI +static unsigned int indicate_max_pkts; +#endif +static unsigned int cksum_offload_enable = 1; +static unsigned int tx_fifo_num = 1; +static unsigned int tx_fifo_len_0 = DEFAULT_FIFO_LEN; +static unsigned int tx_fifo_len_1; +static unsigned int tx_fifo_len_2; +static unsigned int tx_fifo_len_3; +static unsigned int tx_fifo_len_4; +static unsigned int tx_fifo_len_5; +static unsigned int tx_fifo_len_6; +static unsigned int tx_fifo_len_7; +static unsigned int max_txds = MAX_SKB_FRAGS; +static unsigned int rx_ring_num = 1; +static unsigned int rx_ring_sz_0 = SMALL_BLK_CNT; +static unsigned int rx_ring_sz_1; +static unsigned int rx_ring_sz_2; +static unsigned int rx_ring_sz_3; +static unsigned int rx_ring_sz_4; +static unsigned int rx_ring_sz_5; +static unsigned int rx_ring_sz_6; +static unsigned int rx_ring_sz_7; +static unsigned int Stats_refresh_time = 4; +static unsigned int rmac_pause_time = 65535; +static unsigned int mc_pause_threshold_q0q3 = 187; +static unsigned int mc_pause_threshold_q4q7 = 187; +static unsigned int shared_splits; +#if defined(__ia64__) +static unsigned int max_splits_trans = XENA_THREE_SPLIT_TRANSACTION; +#else +static unsigned int max_splits_trans = XENA_TWO_SPLIT_TRANSACTION; +#endif +static unsigned int tmac_util_period = 5; +static unsigned int rmac_util_period = 5; +static unsigned int tx_timer_val = 0xFFF; +static unsigned int tx_utilz_periodic = 1; +static unsigned int rx_timer_val = 0xFFF; +static unsigned int rx_utilz_periodic = 1; +static unsigned int tx_urange_a = 0xA; +static unsigned int tx_ufc_a = 0x10; +static unsigned int tx_urange_b = 0x10; +static unsigned int tx_ufc_b = 0x20; +static unsigned int tx_urange_c = 0x30; +static unsigned int tx_ufc_c = 0x40; +static unsigned int tx_ufc_d = 0x80; +static unsigned int rx_urange_a = 0xA; +static unsigned int rx_ufc_a = 0x1; +static unsigned int rx_urange_b = 0x10; +static unsigned int rx_ufc_b = 0x2; +static unsigned int rx_urange_c = 0x30; +static unsigned int rx_ufc_c = 0x40; +static unsigned int rx_ufc_d = 0x80; +static u8 latency_timer = 0xf8; +static u8 max_read_byte_cnt = 2; /* * S2IO device table. @@ -782,14 +834,16 @@ /* Enable statistics */ writeq(mac_control->stats_mem_phy, &bar0->stat_addr); - val64 = SET_UPDT_PERIOD(8) | STAT_CFG_STAT_RO | STAT_CFG_STAT_EN; + val64 = SET_UPDT_PERIOD(Stats_refresh_time) | + STAT_CFG_STAT_RO | STAT_CFG_STAT_EN; writeq(val64, &bar0->stat_cfg); /* * Initializing the sampling rate for the device to calculate the * bandwidth utilization. */ - val64 = MAC_TX_LINK_UTIL_VAL(0x5) | MAC_RX_LINK_UTIL_VAL(0x5); + val64 = MAC_TX_LINK_UTIL_VAL(tmac_util_period) | + MAC_RX_LINK_UTIL_VAL(rmac_util_period); writeq(val64, &bar0->mac_link_util); @@ -798,14 +852,18 @@ * Scheme. */ /* TTI Initialization */ - val64 = TTI_DATA1_MEM_TX_TIMER_VAL(0xFFF) | - TTI_DATA1_MEM_TX_URNG_A(0xA) | TTI_DATA1_MEM_TX_URNG_B(0x10) | - TTI_DATA1_MEM_TX_URNG_C(0x30) | TTI_DATA1_MEM_TX_TIMER_AC_EN; + val64 = TTI_DATA1_MEM_TX_TIMER_VAL(tx_timer_val) | + TTI_DATA1_MEM_TX_URNG_A(tx_urange_a) | + TTI_DATA1_MEM_TX_URNG_B(tx_urange_b) | + TTI_DATA1_MEM_TX_URNG_C(tx_urange_c); + if (tx_utilz_periodic) + val64 |= TTI_DATA1_MEM_TX_TIMER_AC_EN; writeq(val64, &bar0->tti_data1_mem); - val64 = - TTI_DATA2_MEM_TX_UFC_A(0x10) | TTI_DATA2_MEM_TX_UFC_B(0x20) | - TTI_DATA2_MEM_TX_UFC_C(0x40) | TTI_DATA2_MEM_TX_UFC_D(0x80); + val64 = TTI_DATA2_MEM_TX_UFC_A(tx_ufc_a) | + TTI_DATA2_MEM_TX_UFC_B(tx_ufc_b) | + TTI_DATA2_MEM_TX_UFC_C(tx_ufc_c) | + TTI_DATA2_MEM_TX_UFC_D(tx_ufc_d); writeq(val64, &bar0->tti_data2_mem); val64 = TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE_NEW_CMD; @@ -834,13 +892,19 @@ } /* RTI Initialization */ - val64 = RTI_DATA1_MEM_RX_TIMER_VAL(0xFFF) | - RTI_DATA1_MEM_RX_URNG_A(0xA) | RTI_DATA1_MEM_RX_URNG_B(0x10) | - RTI_DATA1_MEM_RX_URNG_C(0x30) | RTI_DATA1_MEM_RX_TIMER_AC_EN; + val64 = RTI_DATA1_MEM_RX_TIMER_VAL(rx_timer_val) | + RTI_DATA1_MEM_RX_URNG_A(rx_urange_a) | + RTI_DATA1_MEM_RX_URNG_B(rx_urange_b) | + RTI_DATA1_MEM_RX_URNG_C(rx_urange_c); + if (rx_utilz_periodic) + val64 |= RTI_DATA1_MEM_RX_TIMER_AC_EN; + writeq(val64, &bar0->rti_data1_mem); - val64 = RTI_DATA2_MEM_RX_UFC_A(0x1) | RTI_DATA2_MEM_RX_UFC_B(0x2) | - RTI_DATA2_MEM_RX_UFC_C(0x40) | RTI_DATA2_MEM_RX_UFC_D(0x80); + val64 = RTI_DATA2_MEM_RX_UFC_A(rx_ufc_a) | + RTI_DATA2_MEM_RX_UFC_B(rx_ufc_b) | + RTI_DATA2_MEM_RX_UFC_C(rx_ufc_c) | + RTI_DATA2_MEM_RX_UFC_D(rx_ufc_d); writeq(val64, &bar0->rti_data2_mem); val64 = RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE_NEW_CMD; @@ -923,7 +987,7 @@ * exceeded the limit pointed by shared_splits */ val64 = readq(&bar0->pic_control); - val64 |= PIC_CNTL_SHARED_SPLITS(0); + val64 |= PIC_CNTL_SHARED_SPLITS(shared_splits); writeq(val64, &bar0->pic_control); return SUCCESS; @@ -1381,7 +1445,7 @@ for (i = 0; i < config->tx_fifo_num; i++) { for (j = 0; j < config->tx_cfg[i].fifo_len - 1; j++) { txdp = mac_control->txdl_start[i] + - (config->max_txds * j); + (config->max_txds * j); skb = (struct sk_buff *) ((unsigned long) txdp-> Host_Control); @@ -1807,7 +1871,12 @@ mac_control->rx_curr_get_info[i].offset = offset_info.offset; pkt_cnt++; + if ((indicate_max_pkts) + && (pkt_cnt > indicate_max_pkts)) + break; } + if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) + break; } } #endif @@ -4004,7 +4073,6 @@ return SUCCESS; } - /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the @@ -4088,17 +4156,23 @@ &latency_timer); } - /* Set MMRB count to 4096 in PCI-X Command register. */ + /* Set MMRB count to 2048 in PCI-X Command register. */ + sp->pcix_cmd &= 0xFFF3; pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, - (sp->pcix_cmd | 0x0C)); + (sp->pcix_cmd | (max_read_byte_cnt << 2))); pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(sp->pcix_cmd)); /* Setting Maximum outstanding splits based on system type. */ sp->pcix_cmd &= 0xFF8F; - sp->pcix_cmd |= - XENA_MAX_OUTSTANDING_SPLITS(XENA_TWO_SPLIT_TRANSACTION); + sp->pcix_cmd |= XENA_MAX_OUTSTANDING_SPLITS(max_splits_trans); + pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, + sp->pcix_cmd); + pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, + &(sp->pcix_cmd)); + /* Forcibly disabling relaxed ordering capability of the card. */ + sp->pcix_cmd &= 0xfffd; pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, sp->pcix_cmd); pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, @@ -4107,14 +4181,58 @@ MODULE_AUTHOR("Raghavendra Koushik "); MODULE_LICENSE("GPL"); -MODULE_PARM(ring_num, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(frame_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(ring_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(fifo_num, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(fifo_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(rx_prio, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(tx_prio, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(latency_timer, "1-" __MODULE_STRING(1) "i"); +MODULE_PARM(lso_enable, "i"); +#ifndef CONFIG_S2IO_NAPI +MODULE_PARM(indicate_max_pkts, "i"); +#endif +MODULE_PARM(cksum_offload_enable, "i"); +MODULE_PARM(tx_fifo_num, "i"); +MODULE_PARM(tx_fifo_len_0, "i"); +MODULE_PARM(tx_fifo_len_1, "i"); +MODULE_PARM(tx_fifo_len_2, "i"); +MODULE_PARM(tx_fifo_len_3, "i"); +MODULE_PARM(tx_fifo_len_4, "i"); +MODULE_PARM(tx_fifo_len_5, "i"); +MODULE_PARM(tx_fifo_len_6, "i"); +MODULE_PARM(tx_fifo_len_7, "i"); +MODULE_PARM(max_txds, "i"); +MODULE_PARM(rx_ring_num, "i"); +MODULE_PARM(rx_ring_sz_0, "i"); +MODULE_PARM(rx_ring_sz_1, "i"); +MODULE_PARM(rx_ring_sz_2, "i"); +MODULE_PARM(rx_ring_sz_3, "i"); +MODULE_PARM(rx_ring_sz_4, "i"); +MODULE_PARM(rx_ring_sz_5, "i"); +MODULE_PARM(rx_ring_sz_6, "i"); +MODULE_PARM(rx_ring_sz_7, "i"); +MODULE_PARM(Stats_refresh_time, "i"); +MODULE_PARM(rmac_pause_time, "i"); +MODULE_PARM(mc_pause_threshold_q0q3, "i"); +MODULE_PARM(mc_pause_threshold_q4q7, "i"); +MODULE_PARM(shared_splits, "i"); +MODULE_PARM(max_splits_trans, "i"); +MODULE_PARM(tmac_util_period, "i"); +MODULE_PARM(rmac_util_period, "i"); +MODULE_PARM(tx_timer_val, "i"); +MODULE_PARM(tx_utilz_periodic, "i"); +MODULE_PARM(rx_timer_val, "i"); +MODULE_PARM(rx_utilz_periodic, "i"); +MODULE_PARM(tx_urange_a, "i"); +MODULE_PARM(tx_ufc_a, "i"); +MODULE_PARM(tx_urange_b, "i"); +MODULE_PARM(tx_ufc_b, "i"); +MODULE_PARM(tx_urange_c, "i"); +MODULE_PARM(tx_ufc_c, "i"); +MODULE_PARM(tx_ufc_d, "i"); +MODULE_PARM(rx_urange_a, "i"); +MODULE_PARM(rx_ufc_a, "i"); +MODULE_PARM(rx_urange_b, "i"); +MODULE_PARM(rx_ufc_b, "i"); +MODULE_PARM(rx_urange_c, "i"); +MODULE_PARM(rx_ufc_c, "i"); +MODULE_PARM(rx_ufc_d, "i"); +MODULE_PARM(latency_timer, "i"); +MODULE_PARM(max_read_byte_cnt, "i"); /** * s2io_init_nic - Initialization of the adapter . * @pdev : structure containing the PCI related information of the device. @@ -4215,33 +4333,23 @@ config = &sp->config; /* Tx side parameters. */ - config->tx_fifo_num = fifo_num ? fifo_num : 1; - - if (!fifo_len[0] && (fifo_num > 1)) { - printk(KERN_ERR "Fifo Lens not specified for all FIFOs\n"); - goto init_failed; - } - - if (fifo_len[0]) { - int cnt; - - for (cnt = 0; fifo_len[cnt]; cnt++); - if (fifo_num) { - if (cnt < fifo_num) { - printk(KERN_ERR - "Fifo Lens not specified for "); - printk(KERN_ERR "all FIFOs\n"); - goto init_failed; - } - } - for (cnt = 0; cnt < config->tx_fifo_num; cnt++) { - config->tx_cfg[cnt].fifo_len = fifo_len[cnt]; - config->tx_cfg[cnt].fifo_priority = cnt; - } - } else { - config->tx_cfg[0].fifo_len = DEFAULT_FIFO_LEN; - config->tx_cfg[0].fifo_priority = 0; - } + config->tx_fifo_num = tx_fifo_num; + config->tx_cfg[0].fifo_len = tx_fifo_len_0; + config->tx_cfg[0].fifo_priority = 0; + config->tx_cfg[1].fifo_len = tx_fifo_len_1; + config->tx_cfg[1].fifo_priority = 1; + config->tx_cfg[2].fifo_len = tx_fifo_len_2; + config->tx_cfg[2].fifo_priority = 2; + config->tx_cfg[3].fifo_len = tx_fifo_len_3; + config->tx_cfg[3].fifo_priority = 3; + config->tx_cfg[4].fifo_len = tx_fifo_len_4; + config->tx_cfg[4].fifo_priority = 4; + config->tx_cfg[5].fifo_len = tx_fifo_len_5; + config->tx_cfg[5].fifo_priority = 5; + config->tx_cfg[6].fifo_len = tx_fifo_len_6; + config->tx_cfg[6].fifo_priority = 6; + config->tx_cfg[7].fifo_len = tx_fifo_len_7; + config->tx_cfg[7].fifo_priority = 7; config->tx_intr_type = TXD_INT_TYPE_UTILZ; for (i = 0; i < config->tx_fifo_num; i++) { @@ -4255,27 +4363,34 @@ config->max_txds = MAX_SKB_FRAGS; /* Rx side parameters. */ - config->rx_ring_num = ring_num ? ring_num : 1; + config->rx_ring_num = rx_ring_num; + config->rx_cfg[0].num_rxd = rx_ring_sz_0 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[0].ring_priority = 0; + config->rx_cfg[1].num_rxd = rx_ring_sz_1 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[1].ring_priority = 1; + config->rx_cfg[2].num_rxd = rx_ring_sz_2 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[2].ring_priority = 2; + config->rx_cfg[3].num_rxd = rx_ring_sz_3 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[3].ring_priority = 3; + config->rx_cfg[4].num_rxd = rx_ring_sz_4 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[4].ring_priority = 4; + config->rx_cfg[5].num_rxd = rx_ring_sz_5 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[5].ring_priority = 5; + config->rx_cfg[6].num_rxd = rx_ring_sz_6 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[6].ring_priority = 6; + config->rx_cfg[7].num_rxd = rx_ring_sz_7 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[7].ring_priority = 7; - if (ring_len[0]) { - int cnt; - for (cnt = 0; cnt < config->rx_ring_num; cnt++) { - config->rx_cfg[cnt].num_rxd = ring_len[cnt]; - config->rx_cfg[cnt].ring_priority = cnt; - } - } else { - config->rx_cfg[0].num_rxd = SMALL_RXD_CNT; - config->rx_cfg[0].ring_priority = 0; - } - - for (i = 0; i < config->rx_ring_num; i++) { + for (i = 0; i < rx_ring_num; i++) { config->rx_cfg[i].ring_org = RING_ORG_BUFF1; config->rx_cfg[i].f_no_snoop = (NO_SNOOP_RXD | NO_SNOOP_RXD_BUFFER); } /* Setting Mac Control parameters */ - mac_control->rmac_pause_time = 0; + mac_control->rmac_pause_time = rmac_pause_time; + mac_control->mc_pause_threshold_q0q3 = mc_pause_threshold_q0q3; + mac_control->mc_pause_threshold_q4q7 = mc_pause_threshold_q4q7; /* Initialize Ring buffer parameters. */ @@ -4334,11 +4449,14 @@ dev->weight = 90; /* For now. */ #endif - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; + dev->features |= NETIF_F_SG; + if (cksum_offload_enable) + dev->features |= NETIF_F_IP_CSUM; if (sp->high_dma_flag == TRUE) dev->features |= NETIF_F_HIGHDMA; #ifdef NETIF_F_TSO - dev->features |= NETIF_F_TSO; + if (lso_enable) + dev->features |= NETIF_F_TSO; #endif dev->tx_timeout = &s2io_tx_watchdog; @@ -4453,7 +4571,6 @@ bar0_remap_failed: mem_alloc_failed: free_shared_mem(sp); - init_failed: pci_disable_device(pdev); pci_release_regions(pdev); pci_set_drvdata(pdev, NULL); @@ -4503,6 +4620,8 @@ int __init s2io_starter(void) { + if (verify_load_parm()) + return -ENODEV; return pci_module_init(&s2io_driver); } @@ -4519,3 +4638,223 @@ module_init(s2io_starter); module_exit(s2io_closer); +/** + * verify_load_parm - verifies the module loadable parameters + * Descriptions: Verifies the module loadable parameters and initializes the + * Tx Fifo, Rx Ring and other paramters. + */ + +int verify_load_parm() +{ + int fail = 0; + if (!((lso_enable == 0) || (lso_enable == 1))) { + printk("lso_enable can be either '1' or '0'\n"); + fail = 1; + } +#ifndef CONFIG_S2IO_NAPI + if ((indicate_max_pkts > (0xFFFFFFFF))) { + printk + ("indicate_max_pkts can take value greater than zero but less than 2power(32)\n"); + fail = 1; + } +#endif + if (!((cksum_offload_enable == 0) || (cksum_offload_enable == 1))) { + printk("cksum_offload_enable can be only '0' or '1' \n"); + fail = 1; + } + if ((tx_fifo_num == 0) || (tx_fifo_num > 8)) { + printk("tx_fifo_num can take value from 1 to 8\n"); + fail = 1; + } + switch (tx_fifo_num) { + case 8: + if ((tx_fifo_len_7 == 0) || tx_fifo_len_7 > 8192) { + printk + ("tx_fifo_len_7 can take value from 1 to 8192\n"); + fail = 1; + } + case 7: + if ((tx_fifo_len_6 == 0) || tx_fifo_len_6 > 8192) { + printk + ("tx_fifo_len_6 can take value from 1 to 8192\n"); + fail = 1; + } + case 6: + if ((tx_fifo_len_5 == 0) || tx_fifo_len_5 > 8192) { + printk + ("tx_fifo_len_5 can take value from 1 to 8192\n"); + fail = 1; + } + case 5: + if ((tx_fifo_len_4 == 0) || tx_fifo_len_4 > 8192) { + printk + ("tx_fifo_len_4 can take value from 1 to 8192\n"); + fail = 1; + } + case 4: + if ((tx_fifo_len_3 == 0) || tx_fifo_len_3 > 8192) { + printk + ("tx_fifo_len_3 can take value from 1 to 8192\n"); + fail = 1; + } + case 3: + if ((tx_fifo_len_2 == 0) || tx_fifo_len_2 > 8192) { + printk + ("tx_fifo_len_2 can take value from 1 to 8192\n"); + fail = 1; + } + case 2: + if ((tx_fifo_len_1 == 0) || tx_fifo_len_1 > 8192) { + printk + ("tx_fifo_len_1 can take value from 1 to 8192\n"); + fail = 1; + } + case 1: + if ((tx_fifo_len_0 == 0) || tx_fifo_len_0 > 8192) { + printk + ("tx_fifo_len_0 can take value from 1 to 8192\n"); + fail = 1; + } + } + if ((max_txds > 32) || (max_txds < 1)) { + printk("max_txds can take value from 1 to 32\n"); + fail = 1; + } + if ((rx_ring_num > 8) || (rx_ring_num < 1)) { + printk("rx_ring_num can take value from 1 to 8\n"); + fail = 1; + } + switch (rx_ring_num) { + case 8: + if (rx_ring_sz_7 < 1) { + printk + ("rx_ring_sz_7 can take value greater than 0\n"); + fail = 1; + } + case 7: + if (rx_ring_sz_6 < 1) { + printk + ("rx_ring_sz_6 can take value greater than 0\n"); + fail = 1; + } + case 6: + if (rx_ring_sz_5 < 1) { + printk + ("rx_ring_sz_5 can take value greater than 0\n"); + fail = 1; + } + case 5: + if (rx_ring_sz_4 < 1) { + printk + ("rx_ring_sz_4 can take value greater than 0\n"); + fail = 1; + } + case 4: + if (rx_ring_sz_3 < 1) { + printk + ("rx_ring_sz_3 can take value greater than 0\n"); + fail = 1; + } + case 3: + if (rx_ring_sz_2 < 1) { + printk + ("rx_ring_sz_2 can take value greater than 0\n"); + fail = 1; + } + case 2: + if (rx_ring_sz_1 < 1) { + printk + ("rx_ring_sz_1 can take value greater than 0\n"); + fail = 1; + } + case 1: + if (rx_ring_sz_0 < 1) { + printk + ("rx_ring_sz_0 can take value greater than 0\n"); + fail = 1; + } + } + if ((Stats_refresh_time < 1)) { + printk + ("Stats_refresh_time cannot be less than 1 second \n"); + fail = 1; + } + if (((rmac_pause_time < 0x10) && (rmac_pause_time != 0)) || + (rmac_pause_time > 0xFFFF)) { + printk + ("rmac_pause_time can take value from 16 to 65535\n"); + fail = 1; + } + if (max_splits_trans > 7) { + printk("max_splits_trans can take value from 0 to 7\n"); + fail = 1; + } + if ((mc_pause_threshold_q0q3 > 0xFE)) { + printk("mc_pause_threshold_q0q3 cannot exceed 254\n"); + fail = 1; + } + if ((mc_pause_threshold_q4q7 > 0xFE)) { + printk("mc_pause_threshold_q4q7 cannot exceed 254\n"); + fail = 1; + } + if ((latency_timer) + && ((latency_timer < 8) || (latency_timer > 255))) { + printk("latency_timer can take value from 8 to 255\n"); + fail = 1; + } + if (max_read_byte_cnt > 3) { + printk("max_read_byte_cnt can take value from 0 to 3\n"); + fail = 1; + } + if (shared_splits > 31) { + printk("shared_splits cannot exceed 31\n"); + fail = 1; + } + if (rmac_util_period > 0xF) { + printk("rmac_util_period cannot exceed 15\n"); + fail = 1; + } + if (tmac_util_period > 0xF) { + printk("tmac_util_period cannot exceed 15\n"); + fail = 1; + } + if ((tx_utilz_periodic > 1) || (rx_utilz_periodic > 1)) { + printk + ("tx_utilz_periodic & rx_utilz_periodic can be either " + "'0' or '1'\n"); + fail = 1; + } + if (((tx_urange_a > 100) || (tx_urange_b > 100) || + (tx_urange_c > 100)) || (tx_urange_a > tx_urange_b) + || (tx_urange_b > tx_urange_c)) { + printk + ("tx_urange_a, tx_urange_b & tx_urange_c can take value " + "from 0 to 100 and range_a can't exceed range_b " + "neither can range_b exceed range_c\n"); + fail = 1; + } + if (((rx_urange_a > 100) || (rx_urange_b > 100) || + (rx_urange_c > 100)) || (rx_urange_a > rx_urange_b) + || (rx_urange_b > rx_urange_c)) { + printk + ("rx_urange_a, rx_urange_b & rx_urange_c can take value " + "from 0 to 100 and range_a can't exceed range_b " + "neither can range_b exceed range_c\n"); + fail = 1; + } + if ((tx_ufc_a > 0xffff) || (tx_ufc_b > 0xffff) || + (tx_ufc_c > 0xffff) || (tx_ufc_d > 0xffff)) { + printk + (" tx_ufc_a, tx_ufc_b, tx_ufc_c, tx_ufc_d can take value" + "from 0 to 65535(0xFFFF)\n"); + fail = 1; + } + if ((rx_ufc_a > 0xffff) || (rx_ufc_b > 0xffff) || + (rx_ufc_c > 0xffff) || (rx_ufc_d > 0xffff)) { + printk + (" rx_ufc_a, rx_ufc_b, rx_ufc_c, rx_ufc_d can take value" + "from 0 to 65535(0xFFFF)\n"); + fail = 1; + } + return fail; +} diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 15:33:35.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 15:34:23.000000000 -0700 @@ -348,9 +348,9 @@ u8 ring_priority; /*Specifies service priority of ring */ /* OSM should not set any two rings with same priority */ u8 ring_org; /*Organization of ring */ -#define RING_ORG_BUFF1 0x01 -#define RX_RING_ORG_BUFF3 0x03 -#define RX_RING_ORG_BUFF5 0x05 +#define RING_ORG_BUFF1 0x01 +#define RX_RING_ORG_BUFF3 0x03 +#define RX_RING_ORG_BUFF5 0x05 u8 f_no_snoop; #define NO_SNOOP_RXD 0x01 ------------------------------------------------------- From raghavendra.koushik@s2io.com Fri Nov 5 15:33:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:33:33 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NXKFQ023666 for ; Fri, 5 Nov 2004 15:33:23 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA5K85je009652; Fri, 5 Nov 2004 15:08:05 -0500 (EST) Received: from [10.16.16.112] ([10.16.16.112]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA5K8139027510; Fri, 5 Nov 2004 15:08:01 -0500 (EST) From: koushik Organization: S2IO Subject: [PATCH 2.6.9-rc2 3/12] S2io: optimizations Date: Fri, 5 Nov 2004 05:06:18 -0800 User-Agent: KMail/1.6.2 To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411050506.18749.raghavendra.koushik@s2io.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11487 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 6893 Lines: 238 Hi, Following are the optimization-related changes made in this patch. 1. Definitions of LOW and PANIC levels of the Rx buffers have changed. 2. In wait_for_cmd_complete there is no longer a writeq but just a read and wait for strobe bit to reset. 3. In s2io_isr, the isr_lock has been done away with also the NICs interrupt are no longer disabled explicitly on entering the interrupt handler and re-enabled again before leaving it. 4. Also clearing the semaphore "tasklet_status" when exiting erroneously from s2io_isr after failing fill_rx_buffer call. 5. The set/reset Tx Csum function through ethtool was added to the ethtool_ops structure. 6. Added a Rx side error code in the rx_osm_handler function. 7. No longer stopping and waking Tx queue when link state changes in s2io_link function. 8. removed the isr_lock spinlock from the s2io_nic structure. 9. changed parameters which determine thresholds(LOW and PANIC) to replenish Rx buffers. This has been found to result in better performance. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-06 17:24:02.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-06 17:37:32.751003528 -0700 @@ -80,10 +80,11 @@ static inline int rx_buffer_level(nic_t * sp, int rxb_size, int ring) { int level = 0; - if ((sp->pkt_cnt[ring] - rxb_size) > 128) { + if ((sp->pkt_cnt[ring] - rxb_size) > 16) { level = LOW; - if (rxb_size < sp->pkt_cnt[ring] / 8) + if ((sp->pkt_cnt[ring] - rxb_size) < MAX_RXDS_PER_BLOCK) { level = PANIC; + } } return level; @@ -1916,12 +1917,8 @@ u64 val64; while (TRUE) { - val64 = - RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD - | RMAC_ADDR_CMD_MEM_OFFSET(0); - writeq(val64, &bar0->rmac_addr_cmd_mem); val64 = readq(&bar0->rmac_addr_cmd_mem); - if (!val64) { + if (!(val64 & RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { ret = SUCCESS; break; } @@ -2192,14 +2189,11 @@ register u64 val64 = 0; u16 cnt = 0; - spin_lock(&sp->isr_lock); netif_stop_queue(dev); /* disable Tx and Rx traffic on the NIC */ stop_nic(sp); - spin_unlock(&sp->isr_lock); - /* * If the device tasklet is running, wait till its done * before killing it @@ -2398,15 +2392,13 @@ struct net_device *dev = (struct net_device *) dev_id; nic_t *sp = dev->priv; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; - u64 reason = 0, general_mask = 0; + u64 reason = 0; mac_info_t *mac_control; struct config_param *config; mac_control = &sp->mac_control; config = &sp->config; - spin_lock(&sp->isr_lock); - /* * Identify the cause for interrupt and call the appropriate * interrupt handler. Causes for the interrupt could be; @@ -2419,14 +2411,9 @@ if (!reason) { /* The interrupt was not raised by Xena. */ - spin_unlock(&sp->isr_lock); return IRQ_NONE; } - /* Mask the Interrupts on the NIC. */ - general_mask = readq(&bar0->general_int_mask); - writeq(0xFFFFFFFFFFFFFFFFULL, &bar0->general_int_mask); - /* If Intr is because of Tx Traffic */ if (reason & GEN_INTR_TXTRAFFIC) { tx_intr_handler(sp); @@ -2441,11 +2428,6 @@ if (netif_rx_schedule_prep(dev)) { en_dis_able_nic_intrs(sp, RX_TRAFFIC_INTR, DISABLE_INTRS); - /* - * Here we take a snap shot of the general - * Intr Register. - */ - general_mask = readq(&bar0->general_int_mask); __netif_rx_schedule(dev); } } @@ -2481,9 +2463,9 @@ "%s:Out of memory", dev->name); DBG_PRINT(ERR_DBG, " in ISR!!\n"); - writeq(general_mask, - &bar0->general_int_mask); - spin_unlock(&sp->isr_lock); + clear_bit(0, + (unsigned long *) (&sp-> + tasklet_status)); return IRQ_HANDLED; } clear_bit(0, @@ -2501,10 +2483,6 @@ tasklet_schedule(&sp->task); #endif - /* Unmask all previously enabled interrupts on the NIC. */ - writeq(general_mask, &bar0->general_int_mask); - - spin_unlock(&sp->isr_lock); return IRQ_HANDLED; } @@ -3626,6 +3604,17 @@ return (S2IO_STAT_LEN); } +int s2io_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_IP_CSUM; + else + dev->features &= ~NETIF_F_IP_CSUM; + + return 0; +} + + static struct ethtool_ops netdev_ethtool_ops = { .get_settings = s2io_ethtool_gset, .set_settings = s2io_ethtool_sset, @@ -3641,7 +3630,7 @@ .get_rx_csum = s2io_ethtool_get_rx_csum, .set_rx_csum = s2io_ethtool_set_rx_csum, .get_tx_csum = ethtool_op_get_tx_csum, - .set_tx_csum = ethtool_op_set_tx_csum, + .set_tx_csum = s2io_ethtool_op_set_tx_csum, .get_sg = ethtool_op_get_sg, .set_sg = ethtool_op_set_sg, #ifdef NETIF_F_TSO @@ -3902,6 +3891,12 @@ skb->ip_summed = CHECKSUM_NONE; } + if (rxdp->Control_1 & RXD_T_CODE) { + unsigned long long err = rxdp->Control_1 & RXD_T_CODE; + DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", + dev->name, err); + } + skb->dev = dev; skb_put(skb, len); skb->protocol = eth_type_trans(skb, dev); @@ -3922,25 +3917,6 @@ return SUCCESS; } -int check_for_tx_space(nic_t * sp) -{ - u32 put_off, get_off, queue_len; - int ret = TRUE, i; - - for (i = 0; i < sp->config.tx_fifo_num; i++) { - queue_len = sp->mac_control.tx_curr_put_info[i].fifo_len - + 1; - put_off = sp->mac_control.tx_curr_put_info[i].offset; - get_off = sp->mac_control.tx_curr_get_info[i].offset; - if (((put_off + 1) % queue_len) == get_off) { - ret = FALSE; - break; - } - } - - return ret; -} - /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the @@ -3962,17 +3938,9 @@ if (link == LINK_DOWN) { DBG_PRINT(ERR_DBG, "%s: Link down\n", dev->name); netif_carrier_off(dev); - netif_stop_queue(dev); } else { DBG_PRINT(ERR_DBG, "%s: Link Up\n", dev->name); netif_carrier_on(dev); - if (check_for_tx_space(sp) == TRUE) { - /* - * Dont wake the queue if we know there - * are no free TxDs available. - */ - netif_wake_queue(dev); - } } } sp->last_link_state = link; @@ -4357,7 +4325,6 @@ /* Initialize spinlocks */ spin_lock_init(&sp->tx_lock); - spin_lock_init(&sp->isr_lock); /* * SXE-002: Configure link and activity LED to init state diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-06 17:24:05.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-06 17:37:47.532756360 -0700 @@ -612,7 +612,6 @@ atomic_t rx_bufs_left[MAX_RX_RINGS]; spinlock_t tx_lock; - spinlock_t isr_lock; #define PROMISC 1 #define ALL_MULTI 2 ------------------------------------------------------- From raghavendra.koushik@s2io.com Fri Nov 5 15:33:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:33:33 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NXKFO023666 for ; Fri, 5 Nov 2004 15:33:22 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA5K7Rje009648; Fri, 5 Nov 2004 15:07:27 -0500 (EST) Received: from [10.16.16.112] ([10.16.16.112]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA5K7O39027384; Fri, 5 Nov 2004 15:07:25 -0500 (EST) From: koushik Organization: S2IO Subject: [PATCH 2.6.9-rc2 2/12] S2io: sw bug fixes Date: Fri, 5 Nov 2004 05:05:41 -0800 User-Agent: KMail/1.6.2 To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200411050505.41343.raghavendra.koushik@s2io.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11486 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 6159 Lines: 216 Hi, Attached is the second patch in this submission. It contains the following software bug fixes. 1. In free_rx_buffers clearing out RxDs not owned by Xena. 2. In alarm_intr_handler, when a serr error occurs, schedule a task to reset the card rather than stopping Tx queue. 3. In s2io_close freeing IRQ before calling s2io_reset also added a new call to flush queued tasks. This is not done if the s2io_close itself is called from a queued task like s2io_restart_nic. 4. read_eeprom function has been changed such that data to be returned is sent as an input argument and the return value represents a pass/fail. The previous implementation as Randy had pointed out was error prone as on failure it returned -1 which can be interpreted as all ff's, so any data area which contained ff's in the eeprom was likely to be treated as an error. 5. Added a flag "task_flag" to track if the call to s2io_close is coming from the s2io_restart_nic function or from the ifconfig down called by user. 6. Moved register_netdev call from just after setting entry points to the end of the s2io_init_nic function. 7. In s2io.h field added a new member into the s2io_nic structure called "task_flag". Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-06 15:18:10.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-06 16:19:52.821420504 -0700 @@ -1525,6 +1525,11 @@ blk++; } + if (!(rxdp->Control_1 & RXD_OWN_XENA)) { + memset(rxdp, 0, sizeof(RxD_t)); + continue; + } + skb = (struct sk_buff *) ((unsigned long) rxdp-> Host_Control); @@ -1887,7 +1892,7 @@ if (val64 & SERR_SOURCE_ANY) { DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name); DBG_PRINT(ERR_DBG, "serious error!!\n"); - netif_stop_queue(dev); + schedule_work(&nic->rst_timer_task); } /* Other type of interrupts are not being handled now, TODO */ @@ -2205,6 +2210,17 @@ } tasklet_kill(&sp->task); + /* Free the Registered IRQ */ + free_irq(dev->irq, dev); + + /* Flush all scheduled tasks */ + if (sp->task_flag == 1) { + DBG_PRINT(INFO_DBG, "%s: Calling close from a task\n", + dev->name); + } else { + flush_scheduled_work(); + } + /* Check if the device is Quiescent and then Reset the NIC */ do { val64 = readq(&bar0->adapter_status); @@ -2225,9 +2241,6 @@ } while (1); s2io_reset(sp); - /* Free the Registered IRQ */ - free_irq(dev->irq, dev); - /* Free all Tx Buffers waiting for transmission */ free_tx_buffers(sp); @@ -2982,9 +2995,10 @@ */ #define S2IO_DEV_ID 5 -static u32 read_eeprom(nic_t * sp, int off) +static int read_eeprom(nic_t * sp, int off, u32 * data) { - u32 data = -1, exit_cnt = 0; + int ret = -1; + u32 exit_cnt = 0; u64 val64; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; @@ -2996,7 +3010,8 @@ while (exit_cnt < 5) { val64 = readq(&bar0->i2c_control); if (I2C_CONTROL_CNTL_END(val64)) { - data = I2C_CONTROL_GET_DATA(val64); + *data = I2C_CONTROL_GET_DATA(val64); + ret = 0; break; } set_current_state(TASK_UNINTERRUPTIBLE); @@ -3004,7 +3019,7 @@ exit_cnt++; } - return data; + return ret; } /** @@ -3073,8 +3088,7 @@ eeprom->len = XENA_EEPROM_SPACE - eeprom->offset; for (i = 0; i < eeprom->len; i += 4) { - data = read_eeprom(sp, eeprom->offset + i); - if (data < 0) { + if (read_eeprom(sp, (eeprom->offset + i), &data)) { DBG_PRINT(ERR_DBG, "Read of EEPROM failed\n"); return -EFAULT; } @@ -3213,7 +3227,8 @@ static int s2io_eeprom_test(nic_t * sp, uint64_t * data) { - int fail = 0, ret_data; + int fail = 0; + u32 ret_data; /* Test Write Error at offset 0 */ if (!write_eeprom(sp, 0, 0, 3)) @@ -3222,7 +3237,7 @@ /* Test Write at offset 4f0 */ if (write_eeprom(sp, 0x4F0, 0x01234567, 3)) fail = 1; - if ((ret_data = read_eeprom(sp, 0x4F0)) < 0) + if (read_eeprom(sp, 0x4F0, &ret_data)) fail = 1; if (ret_data != 0x01234567) @@ -3238,7 +3253,7 @@ /* Test Write Request at offset 0x7fc */ if (write_eeprom(sp, 0x7FC, 0x01234567, 3)) fail = 1; - if ((ret_data = read_eeprom(sp, 0x7FC)) < 0) + if (read_eeprom(sp, 0x7FC, &ret_data)) fail = 1; if (ret_data != 0x01234567) @@ -3811,7 +3826,9 @@ struct net_device *dev = (struct net_device *) data; nic_t *sp = dev->priv; + sp->task_flag = 1; s2io_close(dev); + sp->task_flag = 0; sp->device_close_flag = TRUE; s2io_open(dev); DBG_PRINT(ERR_DBG, @@ -4275,18 +4292,13 @@ INIT_WORK(&sp->set_link_task, (void (*)(void *)) s2io_set_link, sp); - if (register_netdev(dev)) { - DBG_PRINT(ERR_DBG, "Device registration failed\n"); - goto register_failed; - } - pci_save_state(sp->pdev, sp->config_space); /* Setting swapper control on the NIC, for proper reset operation */ if (s2io_set_swapper(sp)) { DBG_PRINT(ERR_DBG, "%s:swapper settings are wrong\n", dev->name); - goto register_failed; + goto set_swap_failed; } /* Fix for all "FFs" MAC address problems observed on Alpha platforms */ @@ -4363,6 +4375,11 @@ sp->rx_csum = 1; /* Rx chksum verify enabled by default */ + if (register_netdev(dev)) { + DBG_PRINT(ERR_DBG, "Device registration failed\n"); + goto register_failed; + } + /* * Make Link state as off at this point, when the Link change * interrupt comes the state will be automatically changed to @@ -4373,9 +4390,8 @@ return 0; - set_swap_failed: - unregister_netdev(dev); register_failed: + set_swap_failed: iounmap(sp->bar1); bar1_remap_failed: iounmap(sp->bar0); diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-06 15:15:03.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-06 16:19:52.829419288 -0700 @@ -668,6 +668,8 @@ u16 last_link_state; #define LINK_DOWN 1 #define LINK_UP 2 + + int task_flag; } nic_t; #define RESET_ERROR 1; ------------------------------------------------------- From herbert@gondor.apana.org.au Fri Nov 5 15:36:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:36:21 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NaAU1025365 for ; Fri, 5 Nov 2004 15:36:12 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQDcR-0003nT-00; Sat, 06 Nov 2004 10:35:47 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQDcP-0003ff-00; Sat, 06 Nov 2004 10:35:45 +1100 From: Herbert Xu To: kaber@trash.net (Patrick McHardy) Subject: Re: request_module while holding rtnl semaphore Cc: netdev@oss.sgi.com Organization: Core In-Reply-To: <41899DCF.3050804@trash.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Sat, 06 Nov 2004 10:35:45 +1100 X-archive-position: 11489 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1431 Lines: 33 Patrick McHardy wrote: > There are several instances of request_module beeing called while > holding the rtnl semaphore in net/sched. A pratical problem with > this is the teql scheduler which deadlocks when calling register_netdev > from its init function. A more far-fetched problem would be some crazy > person with their modules in a nfs-mounted directory on a server > reachable over a dial-on-demand link. I couldn't come up with a > solution except for refusing to autoload teql, maybe someone else has > an idea. There are a couple of causes for this problem: 1) Abuse of the rtnl. It's being used for too many things. It's basically the networking system's BKL. If the locking were more granular then this shouldn't occur. 2) Hooking random net/sched requests into rtnetlink. By being an rtnetlink user you pay the price of taking the rtnl. Most of the net/sched stuff has nothing to do with rtnetlink. You know it because they all live in AF_UNSPEC :) Tackling either problem would lead to a solution to the dead-lock. However, neither is trivial to solve. On a related note, I'm working on making it easier to add new netlink families which could lead to a solution to 2. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From kaber@trash.net Fri Nov 5 15:37:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:37:23 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NbGa7025696 for ; Fri, 5 Nov 2004 15:37:17 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQBty-0002o8-Kn; Fri, 05 Nov 2004 22:45:46 +0100 Message-ID: <418BF48A.5060707@trash.net> Date: Fri, 05 Nov 2004 22:45:46 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: [PATCH 2.6 PKT_SCHED]: Fix rcu_assign_pointer fallout, use it in the right place Content-Type: multipart/mixed; boundary="------------010107060405000301040302" X-archive-position: 11490 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2960 Lines: 90 This is a multi-part message in MIME format. --------------010107060405000301040302 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit The patch "RCU: use rcu_assign_pointer()" http://linux.bkbits.net:8080/linux-2.6/diffs/net/sched/sch_api.c@1.39?nav=index.html|src/net/|src/net|src/net/sched|related/net/sched/sch_api.c|cset@1.2287 changed a list_add_tail to list_add_tail_rcu in qdisc_create. It's dev->qdisc not dev->qdisc_list that is protected by RCU, this patch reverts that change. It also removes a misleading comment and replaces the smp_wmb in qdisc_create_dflt by rcu_assign_pointer in dev_activate to document more clearly what is protected. Regards Patrick --------------010107060405000301040302 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/05 22:14:18+01:00 kaber@coreworks.de # [PKT_SCHED]: Fix rcu_assign_pointer fallout, use it in the right place # # Signed-off-by: Patrick McHardy # # net/sched/sch_generic.c # 2004/11/05 22:14:08+01:00 kaber@coreworks.de +5 -7 # [PKT_SCHED]: Fix rcu_assign_pointer fallout, use it in the right place # # Signed-off-by: Patrick McHardy # # net/sched/sch_api.c # 2004/11/05 22:14:08+01:00 kaber@coreworks.de +2 -4 # [PKT_SCHED]: Fix rcu_assign_pointer fallout, use it in the right place # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/sch_api.c b/net/sched/sch_api.c --- a/net/sched/sch_api.c 2004-11-05 22:29:06 +01:00 +++ b/net/sched/sch_api.c 2004-11-05 22:29:06 +01:00 @@ -451,11 +451,9 @@ else sch->handle = handle; - /* enqueue is accessed locklessly - make sure it's visible - * before we set a netdevice's qdisc pointer to sch */ if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS-1])) == 0) { qdisc_lock_tree(dev); - list_add_tail_rcu(&sch->list, &dev->qdisc_list); + list_add_tail(&sch->list, &dev->qdisc_list); qdisc_unlock_tree(dev); #ifdef CONFIG_NET_ESTIMATOR diff -Nru a/net/sched/sch_generic.c b/net/sched/sch_generic.c --- a/net/sched/sch_generic.c 2004-11-05 22:29:06 +01:00 +++ b/net/sched/sch_generic.c 2004-11-05 22:29:06 +01:00 @@ -436,9 +436,6 @@ dev_hold(dev); sch->stats_lock = &dev->queue_lock; atomic_set(&sch->refcnt, 1); - /* enqueue is accessed locklessly - make sure it's visible - * before we set a netdevice's qdisc pointer to sch */ - smp_wmb(); if (!ops->init || ops->init(sch, NULL) == 0) return sch; @@ -519,7 +516,8 @@ } spin_lock_bh(&dev->queue_lock); - if ((dev->qdisc = dev->qdisc_sleeping) != &noqueue_qdisc) { + rcu_assign_pointer(dev->qdisc, dev->qdisc_sleeping); + if (dev->qdisc != &noqueue_qdisc) { dev->trans_start = jiffies; dev_watchdog_up(dev); } --------------010107060405000301040302-- From kaber@trash.net Fri Nov 5 15:37:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:37:31 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NbNUa025708 for ; Fri, 5 Nov 2004 15:37:24 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQ8fm-0000Qo-Vz; Fri, 05 Nov 2004 19:18:54 +0100 Message-ID: <418BC40E.8080402@trash.net> Date: Fri, 05 Nov 2004 19:18:54 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> In-Reply-To: <20041105175812.GZ12289@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11491 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2222 Lines: 76 Thomas Graf wrote: >* Patrick McHardy <418BB7D2.6060908@trash.net> 2004-11-05 18:26 > > >>ops->put seems to be safe even without holding dev->queue_lock. >>The class refcnt is only changed from userspace, and always under >>the rtnl semaphore. get/put are always balanced, so pratically a >>class can never get destroyed by put. >> >> > >You are right, this cannot be the problem. However, there is a >potential risk in qdisc_destroy if dev->queue_lock is not held. > > Yes, but there doesn't seem to be a path where this is true. >I'm not sure but aren't all callers to qdisc_destroy holding >qdisc_lock_tree(dev) such as dev_shutdown a potential risk to >deadlocks because __qdisc_destroy tries to lock again? > > __qdisc_destroy is called from a rcu-callback, not directly from qdisc_destroy. >>Either refcnt them or add add some kind of flag to qdiscs created >>by qdisc_create/qdisc_create_default and check for that flag. >>Initializing the lists doesn't fix all problems, directly using >>noop/noqueue doesn't increment the device refcnt, so is must not >>be dropped it __qdisc_destroy. >> >> > >I was irritated by the TCQ_F_BUILTIN check in __qdisc_destroy. None >of the code in __qdisc_destroy should be applied to a builtin qdisc >or am I missing something? > > No, your patch looks fine. Regards Patrick >The patch below prevents builtin qdiscs from being destroyed and >fixes a refcnt underflow whould lead to a bogus list unlinking >and dev_put. > >Signed-off-by: Thomas Graf > >--- linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c 2004-11-05 18:44:49.000000000 +0100 >+++ linux-2.6.10-rc1-bk14/net/sched/sch_generic.c 2004-11-05 18:43:52.000000000 +0100 >@@ -479,15 +479,15 @@ > module_put(ops->owner); > > dev_put(qdisc->dev); >- if (!(qdisc->flags&TCQ_F_BUILTIN)) >- kfree((char *) qdisc - qdisc->padded); >+ kfree((char *) qdisc - qdisc->padded); > } > > /* Under dev->queue_lock and BH! */ > > void qdisc_destroy(struct Qdisc *qdisc) > { >- if (!atomic_dec_and_test(&qdisc->refcnt)) >+ if (qdisc->flags & TCQ_F_BUILTIN || >+ !atomic_dec_and_test(&qdisc->refcnt)) > return; > list_del(&qdisc->list); > call_rcu(&qdisc->q_rcu, __qdisc_destroy); > > > > From kaber@trash.net Fri Nov 5 15:37:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:37:35 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NbUIl025731 for ; Fri, 5 Nov 2004 15:37:30 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQA2Z-0001yQ-Fg; Fri, 05 Nov 2004 20:46:31 +0100 Message-ID: <418BD897.5000409@trash.net> Date: Fri, 05 Nov 2004 20:46:31 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: Thomas Graf , netdev@oss.sgi.com Subject: [PATCH 2.4]: Don't try to destroy builtin qdiscs Content-Type: multipart/mixed; boundary="------------030606070008030700090802" X-archive-position: 11492 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1556 Lines: 61 This is a multi-part message in MIME format. --------------030606070008030700090802 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Backported from Thomas's patch, we also need this for 2.4. --------------030606070008030700090802 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/05 20:44:30+01:00 kaber@coreworks.de # [PKT_SCHED]: Don't try to destroy builtin qdiscs # # Backported from Thomas Graf's fix for 2.6. # # Signed-off-by: Patrick McHardy # # net/sched/sch_generic.c # 2004/11/05 20:44:28+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: Don't try to destroy builtin qdiscs # # Backported from Thomas Graf's fix for 2.6. # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/sch_generic.c b/net/sched/sch_generic.c --- a/net/sched/sch_generic.c 2004-11-05 20:44:43 +01:00 +++ b/net/sched/sch_generic.c 2004-11-05 20:44:43 +01:00 @@ -423,7 +423,8 @@ { struct Qdisc_ops *ops = qdisc->ops; - if (!atomic_dec_and_test(&qdisc->refcnt)) + if (qdisc->flags&TCQ_F_BUILTIN || + !atomic_dec_and_test(&qdisc->refcnt)) return; list_del(&qdisc->list); #ifdef CONFIG_NET_ESTIMATOR @@ -433,8 +434,7 @@ ops->reset(qdisc); if (ops->destroy) ops->destroy(qdisc); - if (!(qdisc->flags&TCQ_F_BUILTIN)) - kfree(qdisc); + kfree(qdisc); } --------------030606070008030700090802-- From shemminger@osdl.org Fri Nov 5 15:41:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:41:37 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NfUm0026712 for ; Fri, 5 Nov 2004 15:41:30 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iA5LkdPE013537 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 5 Nov 2004 13:46:39 -0800 Date: Fri, 5 Nov 2004 13:48:51 -0800 From: Stephen Hemminger To: netdev@oss.sgi.com Subject: Fw: [Bug 3692] New: The vsftpd reports an error when upgrading to 2.6.9 form 2.6.8.1 Message-Id: <20041105134851.6d2a7e52@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11493 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1035 Lines: 32 Has anybody else seen this? Begin forwarded message: Date: Wed, 3 Nov 2004 17:21:19 -0800 From: bugme-daemon@osdl.org To: shemminger@osdl.org Subject: [Bug 3692] New: The vsftpd reports an error when upgrading to 2.6.9 form 2.6.8.1 http://bugme.osdl.org/show_bug.cgi?id=3692 Summary: The vsftpd reports an error when upgrading to 2.6.9 form 2.6.8.1 Kernel Version: 2.6.9 Status: NEW Severity: normal Owner: shemminger@osdl.org Submitter: andrei@interchange.ubc.edu Distribution: Slackware 9 Hardware Environment: Pentium 3 / 256 RAM / i440BX / NIC Realtec Software Environment: Kernel 2.6.9 Problem Description: After upgrading the vsftpd does not work neither 2.01 nor any other version, reporting some strange error 50x. Steps to reproduce: Just upgrade to 2.6.9 and try vsftpd any version. with default configuration. ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee. From jgarzik@pobox.com Fri Nov 5 15:51:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:51:30 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NpPSD027335 for ; Fri, 5 Nov 2004 15:51:26 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CQAzy-0000eP-IE; Fri, 05 Nov 2004 20:47:54 +0000 Message-ID: <418BE6EC.3060103@pobox.com> Date: Fri, 05 Nov 2004 15:47:40 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: koushik CC: romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. References: <200411050523.49239.raghavendra.koushik@s2io.com> In-Reply-To: <200411050523.49239.raghavendra.koushik@s2io.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11494 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 829 Lines: 27 koushik wrote: > Hi All, > I had sent five of my patches with the new mail client, but it seems to have introduced > some series of '-' charecters at the end. So please ignore all those 5 mails, I will be sending > the series of 12 patches again (hopefully for the last time :-)). FWIW, I have found that use of "cat email-01.txt | sendmail -t" on a Unix system is the easiest way to send a large number of patches. You simply have to provide a minimal email header, a blank line, and then the patch content itself, in a single text file. Example: $ cat > email-01.txt To: jgarzik@pobox.com CC: netdev@oss.sgi.com From: koushik Subject: [patch 2.6.10-rc1-bk14 1/12] s2io: do something EOF $ cat patch-description >> email-01.txt $ cat patch >> email-01.txt $ sendmail -t < email-01.txt From tgraf@suug.ch Fri Nov 5 15:52:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:52:40 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NqYBZ027589 for ; Fri, 5 Nov 2004 15:52:34 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id AE851F; Fri, 5 Nov 2004 17:39:08 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 859421C0E9; Fri, 5 Nov 2004 17:39:51 +0100 (CET) Date: Fri, 5 Nov 2004 17:39:51 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041105163951.GY12289@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418BA66A.60804@trash.net> X-archive-position: 11496 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1253 Lines: 26 * Patrick McHardy <418BA66A.60804@trash.net> 2004-11-05 17:12 > Nice catch. I can't understand how you triggered that oops, > though. The noop- and noqueue-qdiscs used without qdisc_create_* > are not refcounted, so I would expect: > > void qdisc_destroy(struct Qdisc *qdisc) > { > if (!atomic_dec_and_test(&qdisc->refcnt)) > return; > > to underflow and return until refcnt finally reaches 0 again. > Can you explain, please ? Right, this is indeed the case. This doesn't fix the oops reported but will prevent the oops you are referring to which was triggerd after 2h stress testing on my machine. I haven't had the time to check if incrementing the refcnt of builtin qdiscs causes any problems but initializing the list is good in any case. I found huge locking problems from qidsc_destroy calling contexts though. Almost all calling paths to qdisc_destroy invoked from qdiscs are messed up. I am resolving those now. I have a theoretical path that could cause the reported oops which is htb_put -> htb_destroy_class -> qdisc_destroy not bh locking dev->queue_lock and thus the list unlinking could take place during a walk/lookup and thus lead to POISON value in the next pointer. I could not reproduce this so far though. From tgraf@suug.ch Fri Nov 5 15:52:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 15:52:39 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA5NqUBm027556 for ; Fri, 5 Nov 2004 15:52:30 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 2AF7495; Fri, 5 Nov 2004 18:57:30 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 8E03C1C0E9; Fri, 5 Nov 2004 18:58:12 +0100 (CET) Date: Fri, 5 Nov 2004 18:58:12 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041105175812.GZ12289@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418BB7D2.6060908@trash.net> X-archive-position: 11495 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1925 Lines: 51 * Patrick McHardy <418BB7D2.6060908@trash.net> 2004-11-05 18:26 > ops->put seems to be safe even without holding dev->queue_lock. > The class refcnt is only changed from userspace, and always under > the rtnl semaphore. get/put are always balanced, so pratically a > class can never get destroyed by put. You are right, this cannot be the problem. However, there is a potential risk in qdisc_destroy if dev->queue_lock is not held. I'm not sure but aren't all callers to qdisc_destroy holding qdisc_lock_tree(dev) such as dev_shutdown a potential risk to deadlocks because __qdisc_destroy tries to lock again? > Either refcnt them or add add some kind of flag to qdiscs created > by qdisc_create/qdisc_create_default and check for that flag. > Initializing the lists doesn't fix all problems, directly using > noop/noqueue doesn't increment the device refcnt, so is must not > be dropped it __qdisc_destroy. I was irritated by the TCQ_F_BUILTIN check in __qdisc_destroy. None of the code in __qdisc_destroy should be applied to a builtin qdisc or am I missing something? The patch below prevents builtin qdiscs from being destroyed and fixes a refcnt underflow whould lead to a bogus list unlinking and dev_put. Signed-off-by: Thomas Graf --- linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c 2004-11-05 18:44:49.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/sch_generic.c 2004-11-05 18:43:52.000000000 +0100 @@ -479,15 +479,15 @@ module_put(ops->owner); dev_put(qdisc->dev); - if (!(qdisc->flags&TCQ_F_BUILTIN)) - kfree((char *) qdisc - qdisc->padded); + kfree((char *) qdisc - qdisc->padded); } /* Under dev->queue_lock and BH! */ void qdisc_destroy(struct Qdisc *qdisc) { - if (!atomic_dec_and_test(&qdisc->refcnt)) + if (qdisc->flags & TCQ_F_BUILTIN || + !atomic_dec_and_test(&qdisc->refcnt)) return; list_del(&qdisc->list); call_rcu(&qdisc->q_rcu, __qdisc_destroy); From kaber@trash.net Fri Nov 5 16:01:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:01:04 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA600xA6028688 for ; Fri, 5 Nov 2004 16:01:00 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQ6hO-00009i-Ep; Fri, 05 Nov 2004 17:12:26 +0100 Message-ID: <418BA66A.60804@trash.net> Date: Fri, 05 Nov 2004 17:12:26 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> In-Reply-To: <20041105141640.GQ19714@rei.reeler.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11498 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1499 Lines: 54 Thomas Graf wrote: >- if (dev) { >- struct Qdisc *q, **qp; >- for (qp = &qdisc->dev->qdisc_list; (q=*qp) != NULL; qp = &q->next) { >- if (q == qdisc) { >- *qp = q->next; >- break; >- } >- } >- } >+ list_del(&qdisc->list); > >Nice cleanup, although it assumes that everyone calling qdisc_destroy provides a >Qdisc which is actually linked or at least has an initialized list node. This >was not the true for noqueue and noop dummy qdiscs. > Nice catch. I can't understand how you triggered that oops, though. The noop- and noqueue-qdiscs used without qdisc_create_* are not refcounted, so I would expect: void qdisc_destroy(struct Qdisc *qdisc) { if (!atomic_dec_and_test(&qdisc->refcnt)) return; to underflow and return until refcnt finally reaches 0 again. Can you explain, please ? Regards Patrick >Signed-off-by: Thomas Graf > >--- linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c 2004-11-05 01:11:17.000000000 +0100 >+++ linux-2.6.10-rc1-bk14/net/sched/sch_generic.c 2004-11-05 15:05:54.000000000 +0100 >@@ -280,6 +280,7 @@ > .dequeue = noop_dequeue, > .flags = TCQ_F_BUILTIN, > .ops = &noop_qdisc_ops, >+ .list = LIST_HEAD_INIT(noop_qdisc.list), > }; > > struct Qdisc_ops noqueue_qdisc_ops = { >@@ -298,6 +299,7 @@ > .dequeue = noop_dequeue, > .flags = TCQ_F_BUILTIN, > .ops = &noqueue_qdisc_ops, >+ .list = LIST_HEAD_INIT(noqueue_qdisc.list), > }; > > > > From nacc@us.ibm.com Fri Nov 5 16:00:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:01:03 -0800 (PST) Received: from over.ny.us.ibm.com (over.ny.us.ibm.com [32.97.182.111]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA600vVc028687 for ; Fri, 5 Nov 2004 16:00:58 -0800 Received: from e33.co.us.ibm.com (e33.esmtp.ibm.com [9.14.4.131]) by pokfb.esmtp.ibm.com (8.12.10/8.12.9) with ESMTP id iA5Hkdb8041894 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Fri, 5 Nov 2004 12:46:39 -0500 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA5HkW1p215094 for ; Fri, 5 Nov 2004 12:46:32 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA5HkVOF106096 for ; Fri, 5 Nov 2004 10:46:31 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA5HkTaq029482 for ; Fri, 5 Nov 2004 10:46:29 -0700 Received: from localhost.localdomain (DYN318967BLD.beaverton.ibm.com [9.47.21.82]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA5HkSYo029392; Fri, 5 Nov 2004 10:46:29 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iA5HkSIt001825; Fri, 5 Nov 2004 09:46:28 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iA5HkPXj001822; Fri, 5 Nov 2004 09:46:25 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Fri, 5 Nov 2004 09:46:25 -0800 From: Nishanth Aravamudan To: Jeff Garzik Cc: netdev@oss.sgi.com, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] net/gt96100eth: replace gt96100_delay() with msleep_interruptible() Message-ID: <20041105174625.GB1707@us.ibm.com> References: <4184C72F.8000905@pobox.com> <20041101190841.GB1730@us.ibm.com> <418B2FF6.8030907@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418B2FF6.8030907@pobox.com> X-Operating-System: Linux 2.6.9 (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11497 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3102 Lines: 100 On Fri, Nov 05, 2004 at 02:47:02AM -0500, Jeff Garzik wrote: > Nishanth Aravamudan wrote: > >On Sun, Oct 31, 2004 at 06:06:23AM -0500, Jeff Garzik wrote: > > > >>janitor@sternwelten.at wrote: > >> > >>>@@ -528,7 +517,7 @@ abort(struct net_device *dev, u32 abort_ > >>> // wait for abort to complete > >>> while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) { > >>> // snooze for 20 msec and check again > >>>- gt96100_delay(1); > >>>+ msleep_interruptible(20); > >>> > >>> if (--timedout == 0) { > >> > >> > >>don't change the behavior of the driver, even if it disagrees with the > >>comment. > > > > > >Ok, please find the corrected patch below. > > > >Description: Uses msleep_interruptible() instead of gt96100_delay() > >to guarantee the task delays as expected. Removes prototype and > >definition of now unused gt96100_delay() function. Corrects one comment > >to correspond to the code. > > > >Signed-off-by: Nishanth Aravamudan > > > > > >--- 2.6.10-rc1-vanilla/drivers/net/gt96100eth.c 2004-10-30 > >15:33:30.000000000 -0700 > >+++ 2.6.10-rc1/drivers/net/gt96100eth.c 2004-11-01 > >11:05:37.000000000 -0800 > >@@ -59,7 +59,6 @@ > > // prototypes > > static void* dmaalloc(size_t size, dma_addr_t *dma_handle); > > static void dmafree(size_t size, void *vaddr); > >-static void gt96100_delay(int msec); > > static int gt96100_add_hash_entry(struct net_device *dev, > > unsigned char* addr); > > static void read_mib_counters(struct gt96100_private *gp); > >@@ -183,16 +182,6 @@ static void dmafree(size_t size, void *v > > free_pages((unsigned long)vaddr, get_order(size)); > > } > > > >-static void gt96100_delay(int ms) > >-{ > >- if (in_interrupt()) > >- return; > >- else { > >- current->state = TASK_INTERRUPTIBLE; > >- schedule_timeout(ms*HZ/1000); > > I'm still worried about this patch, because > > 1) in_interrupt() check disappears, and This is true... I have changed the patch significantly, leaving the gt96100_delay() function intact and simply replacing the else result with msleep_interruptible(). Does this newer patch look better to you? Thanks for all the input! > 2) does driver already include linux/delay.h ? Yes, it does. Description: Uses msleep_interruptible() instead of schedule_timeout() in the gt96100_delay() function. Corrects one comment to correspond to the code. Signed-off-by: Nishanth Aravamudan --- 2.6.10-rc1-vanilla/drivers/net/gt96100eth.c 2004-11-05 09:42:37.000000000 -0800 +++ 2.6.10-rc1/drivers/net/gt96100eth.c 2004-11-05 09:45:48.000000000 -0800 @@ -187,10 +187,8 @@ static void gt96100_delay(int ms) { if (in_interrupt()) return; - else { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(ms*HZ/1000); - } + else + msleep_interruptible(ms); } static int @@ -527,7 +525,7 @@ abort(struct net_device *dev, u32 abort_ // wait for abort to complete while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) { - // snooze for 20 msec and check again + // snooze for 1 msec and check again gt96100_delay(1); if (--timedout == 0) { From mcgrof@studorgs.rutgers.edu Fri Nov 5 16:17:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:17:26 -0800 (PST) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60HIhG029674 for ; Fri, 5 Nov 2004 16:17:18 -0800 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id C154CF9E06; Fri, 5 Nov 2004 11:28:11 -0500 (EST) Date: Fri, 5 Nov 2004 11:28:11 -0500 To: prism54-devel@prism54.org, Netdev , Jouni Malinen Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041105162811.GP388@ruslug.rutgers.edu> Mail-Followup-To: prism54-devel@prism54.org, Netdev , Jouni Malinen References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="VSaCG/zfRnOiPJtU" Content-Disposition: inline In-Reply-To: <20041105162037.GN388@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 11501 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev Content-Length: 1011 Lines: 38 --VSaCG/zfRnOiPJtU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 05, 2004 at 11:20:37AM -0500, Luis R. Rodriguez wrote: <-- snip --> > Access Point WPA support (NEW) (requires hostapd) > Access Point WDS Support (NEW) For your convenience, here are some links for those of you wishing to test: http://prism54.org/pub/linux/snapshot/tars/prism54-cvs-latest.tar.bz2 http://prism54.org/pub/linux/snapshot/kernel/v2.6/patch-2.6-prism54-cvs-lat= est.bz2 http://prism54.org/pub/linux/snapshot/kernel/v2.4/patch-2.4-prism54-cvs-lat= est.bz2 Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --VSaCG/zfRnOiPJtU Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBi6obat1JN+IKUl4RAqooAJ4zSnv27HKugDBdQBvOVr+iRsBylQCbB6gE V7rpCSI8uI5utl1NNRE4wVI= =u+7S -----END PGP SIGNATURE----- --VSaCG/zfRnOiPJtU-- From kaber@trash.net Fri Nov 5 16:17:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:17:24 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60HGQe029669 for ; Fri, 5 Nov 2004 16:17:16 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQ7rG-0000KZ-6Z; Fri, 05 Nov 2004 18:26:42 +0100 Message-ID: <418BB7D2.6060908@trash.net> Date: Fri, 05 Nov 2004 18:26:42 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> In-Reply-To: <20041105163951.GY12289@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11500 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1854 Lines: 49 Thomas Graf wrote: >* Patrick McHardy <418BA66A.60804@trash.net> 2004-11-05 17:12 > > >>Nice catch. I can't understand how you triggered that oops, >>though. The noop- and noqueue-qdiscs used without qdisc_create_* >>are not refcounted, so I would expect: >> >>void qdisc_destroy(struct Qdisc *qdisc) >>{ >> if (!atomic_dec_and_test(&qdisc->refcnt)) >> return; >> >>to underflow and return until refcnt finally reaches 0 again. >>Can you explain, please ? >> >> > >Right, this is indeed the case. This doesn't fix the oops reported >but will prevent the oops you are referring to which was triggerd >after 2h stress testing on my machine. I haven't had the time to >check if incrementing the refcnt of builtin qdiscs causes >any problems but initializing the list is good in any case. > > Either refcnt them or add add some kind of flag to qdiscs created by qdisc_create/qdisc_create_default and check for that flag. Initializing the lists doesn't fix all problems, directly using noop/noqueue doesn't increment the device refcnt, so is must not be dropped it __qdisc_destroy. >I found huge locking problems from qidsc_destroy calling contexts though. >Almost all calling paths to qdisc_destroy invoked from qdiscs are messed up. >I am resolving those now. I have a theoretical path that could cause the >reported oops which is htb_put -> htb_destroy_class -> qdisc_destroy >not bh locking dev->queue_lock and thus the list unlinking could >take place during a walk/lookup and thus lead to POISON value in the >next pointer. I could not reproduce this so far though. > > ops->put seems to be safe even without holding dev->queue_lock. The class refcnt is only changed from userspace, and always under the rtnl semaphore. get/put are always balanced, so pratically a class can never get destroyed by put. Regards Patrick From mcgrof@studorgs.rutgers.edu Fri Nov 5 16:17:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:17:23 -0800 (PST) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60HIpt029675 for ; Fri, 5 Nov 2004 16:17:18 -0800 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id C9A94F9E04; Fri, 5 Nov 2004 11:25:07 -0500 (EST) Date: Fri, 5 Nov 2004 11:25:07 -0500 To: Jouni Malinen Cc: prism54-devel@prism54.org, Netdev Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041105162507.GO388@ruslug.rutgers.edu> Mail-Followup-To: Jouni Malinen , prism54-devel@prism54.org, Netdev References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="a7XSrSxqzVsaECgU" Content-Disposition: inline In-Reply-To: <20041105162037.GN388@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 11499 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev Content-Length: 1037 Lines: 40 --a7XSrSxqzVsaECgU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 05, 2004 at 11:20:37AM -0500, Luis R. Rodriguez wrote: >=20 > Great news, >=20 > I have reviewed, cleaned up and committed Bell Kin's patches into CVS. > Prism54 AP WPA (Version 1) support and WDS support is now > complete. I've updated the README and there two new sections: >=20 > Access Point WPA support (NEW) (requires hostapd) > Access Point WDS Support (NEW) <-- snip --> Jouni, Bell Kin sent you some prism54 hostapd patches. I believe you actually wrote the work. How are they looking ? Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --a7XSrSxqzVsaECgU Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBi6ljat1JN+IKUl4RAmZvAJ9jyXXbVaRhqu+OWtvpcxtwzKuuXACcDqDr lDxteG4sJJxKqzLUkGkFkBU= =yeeN -----END PGP SIGNATURE----- --a7XSrSxqzVsaECgU-- From davem@davemloft.net Fri Nov 5 16:21:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:21:26 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60LKXW001508 for ; Fri, 5 Nov 2004 16:21:20 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQE9W-0006lC-00; Fri, 05 Nov 2004 16:09:58 -0800 Date: Fri, 5 Nov 2004 16:09:58 -0800 From: "David S. Miller" To: Andrew Morton Cc: netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3706] New: Kernel build fails on sungem driver compile. Message-Id: <20041105160958.7e169484.davem@davemloft.net> In-Reply-To: <20041105153040.564f1c2a.akpm@osdl.org> References: <20041105153040.564f1c2a.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11502 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 934 Lines: 29 I fixed this in my tree as follows: # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/05 15:57:06-08:00 davem@nuts.davemloft.net # [SUNGEM]: Use CONFIG_PPC_PMAC throughout. # # Fixes some build failures ala bugme bugzilla #3706 # # Signed-off-by: David S. Miller # # drivers/net/sungem.c # 2004/11/05 15:56:15-08:00 davem@nuts.davemloft.net +1 -1 # [SUNGEM]: Use CONFIG_PPC_PMAC throughout. # diff -Nru a/drivers/net/sungem.c b/drivers/net/sungem.c --- a/drivers/net/sungem.c 2004-11-05 15:57:28 -08:00 +++ b/drivers/net/sungem.c 2004-11-05 15:57:28 -08:00 @@ -2681,7 +2681,7 @@ return rc; } -#if (!defined(__sparc__) && !defined(CONFIG_PPC)) +#if (!defined(__sparc__) && !defined(CONFIG_PPC_PMAC)) /* Fetch MAC address from vital product data of PCI ROM. */ static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr) { From tgraf@suug.ch Fri Nov 5 16:25:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:25:55 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60PnwZ001907 for ; Fri, 5 Nov 2004 16:25:49 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 28B4896; Fri, 5 Nov 2004 20:42:22 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id AA4871C0E9; Fri, 5 Nov 2004 20:43:03 +0100 (CET) Date: Fri, 5 Nov 2004 20:43:03 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041105194303.GA12289@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418BC40E.8080402@trash.net> X-archive-position: 11503 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 790 Lines: 20 * Patrick McHardy <418BC40E.8080402@trash.net> 2004-11-05 19:18 > Yes, but there doesn't seem to be a path where this is true. I will double check this, there must be something wrong with one of the callers to qdisc_destroy since it's the only way entries can be removed from qdisc_list and otherwise the oops wouldn't show up with the POISON1. > __qdisc_destroy is called from a rcu-callback, not directly from > qdisc_destroy. You're indeed right, I haven't noticed queue_lock being a softirq spinlock, stupid me. So to have qdisc_destroy be reliable we should either make sure dev->queue_lock is held for every call or switch to list_del_rcu. since qdisc_destroy might be called from bh context. I will audit all paths, I'm pretty sure the reported oops is somehow related to this. From davem@davemloft.net Fri Nov 5 16:29:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:30:00 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60TscC002295 for ; Fri, 5 Nov 2004 16:29:54 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEHc-0006mh-00; Fri, 05 Nov 2004 16:18:20 -0800 Date: Fri, 5 Nov 2004 16:18:20 -0800 From: "David S. Miller" To: Herbert Xu Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Fix memory leaks in TCP error path Message-Id: <20041105161820.5c9bd53b.davem@davemloft.net> In-Reply-To: <20041105084904.GA8253@gondor.apana.org.au> References: <20041105084904.GA8253@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11504 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 1256 Lines: 37 On Fri, 5 Nov 2004 19:49:04 +1100 Herbert Xu wrote: > I've gone through all the xfrm_lookup() calls in net/ipv6 and I haven't > seen anything that can cause an underflow. I did find a couple of > memory leaks though. > > In tcp_ipv6.c we may leak skb's if xfrm_lookup fails. This patch actually adds a leak with the way xfrm_lookup() is currently coded. /* sk = NULL, but it is safe for now. RST socket required. */ - if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { - - if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { - dst_release(buff->dst); - return; - } - + if (!ip6_dst_lookup(NULL, &buff->dst, &fl) && + !xfrm_lookup(&buff->dst, &fl, NULL, 0)) { To recount from yesterday's analysis, xfrm_lookup() behaves two different ways on error return: 1) Release 'dst' and set &dst to NULL 2) Leave 'dst' alone and also do not modify &dst This means that to cover all cases you have to have the dst_release() there in that "if (xfrm_lookup()<0)" code path in order to handle case #2 above. We can get rid of the dst_release() calls only once the xfrm_lookup() patch I posted yesterday is included, which as per your advice today I'm not going to include until we've figured out the dst underflow problem :-) From ravinandan.arakali@s2io.com Fri Nov 5 16:31:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:31:40 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60VY7Y002651 for ; Fri, 5 Nov 2004 16:31:35 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA60V5je011379; Fri, 5 Nov 2004 19:31:05 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iA60V239021551; Fri, 5 Nov 2004 19:31:03 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" , "'koushik'" Cc: , , , , Subject: RE: Please ignore the corrupt patches sent earlier. Date: Fri, 5 Nov 2004 16:30:33 -0800 Message-ID: <003201c4c397$d4885900$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) In-Reply-To: <418BE6EC.3060103@pobox.com> X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Importance: Normal X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11505 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Content-Length: 1428 Lines: 46 Jeff, Thanks for the excellent suggestion. We have used this method to send all the 12 patches. Note that since our mail server went down and came back up during this process, the mail containing patch3 has appeared twice. Pls ignore the duplicate. Thanks, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Friday, November 05, 2004 12:48 PM To: koushik Cc: romieu@fr.zoreil.com; netdev@oss.sgi.com; leonid.grossman@s2io.com; ravinandan.arakali@s2io.com; rapuru.sriram@s2io.com; alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. koushik wrote: > Hi All, > I had sent five of my patches with the new mail client, but it seems to have introduced > some series of '-' charecters at the end. So please ignore all those 5 mails, I will be sending > the series of 12 patches again (hopefully for the last time :-)). FWIW, I have found that use of "cat email-01.txt | sendmail -t" on a Unix system is the easiest way to send a large number of patches. You simply have to provide a minimal email header, a blank line, and then the patch content itself, in a single text file. Example: $ cat > email-01.txt To: jgarzik@pobox.com CC: netdev@oss.sgi.com From: koushik Subject: [patch 2.6.10-rc1-bk14 1/12] s2io: do something EOF $ cat patch-description >> email-01.txt $ cat patch >> email-01.txt $ sendmail -t < email-01.txt From herbert@gondor.apana.org.au Fri Nov 5 16:31:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:31:44 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60VZdx002652 for ; Fri, 5 Nov 2004 16:31:36 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQEU2-00049n-00; Sat, 06 Nov 2004 11:31:10 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQETz-0003oa-00; Sat, 06 Nov 2004 11:31:07 +1100 Date: Sat, 6 Nov 2004 11:31:07 +1100 To: "David S. Miller" Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Fix memory leaks in TCP error path Message-ID: <20041106003107.GA14649@gondor.apana.org.au> References: <20041105084904.GA8253@gondor.apana.org.au> <20041105161820.5c9bd53b.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105161820.5c9bd53b.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11506 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 582 Lines: 17 On Fri, Nov 05, 2004 at 04:18:20PM -0800, David S. Miller wrote: > > This patch actually adds a leak with the way xfrm_lookup() is currently > coded. > > This means that to cover all cases you have to have the dst_release() > there in that "if (xfrm_lookup()<0)" code path in order to handle > case #2 above. Not quite. kfree_skb will release the dst for you. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From davem@davemloft.net Fri Nov 5 16:35:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:35:08 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60Z2MB003345 for ; Fri, 5 Nov 2004 16:35:02 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEMS-0006ng-00; Fri, 05 Nov 2004 16:23:20 -0800 Date: Fri, 5 Nov 2004 16:23:19 -0800 From: "David S. Miller" To: Lennert Buytenhek Cc: acme@conectiva.com.br, hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-Id: <20041105162319.6e2917c5.davem@davemloft.net> In-Reply-To: <20041105101513.GA28779@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105091427.GB28112@xi.wantstofly.org> <418B4B1A.8@conectiva.com.br> <20041105101513.GA28779@xi.wantstofly.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11507 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 1812 Lines: 64 On Fri, 5 Nov 2004 11:15:13 +0100 Lennert Buytenhek wrote: > On Fri, Nov 05, 2004 at 07:42:50AM -0200, Arnaldo Carvalho de Melo wrote: > > > >IPSEC.. not that I know of. So unless my distro does stuff behind > > >my back, no. How do I make sure? > > > > setkey -DP > > Thanks. Both machines I'm seeing this problem on have: > > # setkey -DP > No SPD entries. > # Well, xfrm_lookup() is returning an error somehow, that's the only way to execute dst_release() in udpv6_sendmsg(). And xfrm_lookup() only returns errors if IPSEC policies have been configured either globally or locally for the socket. Full proof from xfrm_lookup(): policy = NULL; if (sk && sk->sk_policy[1]) policy = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl); Unless socket IPSEC policy has been set via setsockopt(), policy will be NULL here. if (!policy) { /* To accelerate a bit... */ if ((dst_orig->flags & DST_NOXFRM) || !xfrm_policy_list[XFRM_POLICY_OUT]) return 0; policy = flow_cache_lookup(fl, family, policy_to_flow_dir(XFRM_POLICY_OUT), xfrm_policy_lookup); } Unless some IPSEC policies have been installed, flow_cache_lookup() will return NULL, thus policy will be NULL here. if (!policy) return 0; And thus we always return zero. Back in udpv6_sendmsg() we have exactly one dst_release() call which is: if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) { dst_release(dst); goto out; } So, Lennert's traces make no sense, since without IPSEC policies installed xfrm_lookup() can never return non-zero. This could mean memory corruption or some kind, or perhaps something installed some IPSEC policies behind his back, but his setkey -DP command shows that this is not currently the case at least. I hope Jeff or Lennert get newer traces soon. From davem@davemloft.net Fri Nov 5 16:48:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:48:33 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60mSjH003875 for ; Fri, 5 Nov 2004 16:48:28 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEZW-0006oM-00; Fri, 05 Nov 2004 16:36:50 -0800 Date: Fri, 5 Nov 2004 16:36:50 -0800 From: "David S. Miller" To: Thomas Graf Cc: kaber@trash.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-Id: <20041105163650.19a487d6.davem@davemloft.net> In-Reply-To: <20041105175812.GZ12289@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11508 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 754 Lines: 21 On Fri, 5 Nov 2004 18:58:12 +0100 Thomas Graf wrote: > I was irritated by the TCQ_F_BUILTIN check in __qdisc_destroy. None > of the code in __qdisc_destroy should be applied to a builtin qdisc > or am I missing something? > > The patch below prevents builtin qdiscs from being destroyed and > fixes a refcnt underflow whould lead to a bogus list unlinking > and dev_put. > > Signed-off-by: Thomas Graf I'll apply this, along with the builting qdisc list initializer change too just for cleanliness, thanks Thomas. Ingo Molnar noticed this refcount underflow condition in qdisc_destroy() a couple weeks ago. At the time I didn't connect it to being a builting qdisc issue. Now we know the true cause. Thanks again. From penberg@cs.helsinki.fi Fri Nov 5 16:50:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:50:35 -0800 (PST) Received: from smtp1.pp.htv.fi (smtp1.pp.htv.fi [213.243.153.34]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60oQDJ004253 for ; Fri, 5 Nov 2004 16:50:27 -0800 Received: from cs181097056.pp.htv.fi (cs181097056.pp.htv.fi [82.181.97.56]) by smtp1.pp.htv.fi (Postfix) with ESMTP id 0E95D7FC78; Fri, 5 Nov 2004 23:24:18 +0200 (EET) Subject: [PATCH] 8139too: use iomap for pio/mmio From: Pekka Enberg To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Content-Type: text/plain Message-Id: <1099689836.5732.2.camel@cherry> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Fri, 05 Nov 2004 23:23:56 +0200 Content-Transfer-Encoding: 7bit X-archive-position: 11509 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: penberg@cs.helsinki.fi Precedence: bulk X-list: netdev Content-Length: 16232 Lines: 534 Hi, This patch converts the 8139too driver to use the iomap infrastructure for PIO and MMIO instead of playing macro tricks. I also had to fix read_eeprom(), mdio_sync(), mdio_read(), and mdio_write() to not pass PIO base address to MMIO read() and write() functions. In addition, the patch adds proper __iomem annotations for the driver. Both modes, PIO and MMIO, were tested with a RealTel RTL8139 card on an x86 box. The 8129 support remains untested due to lack of hardware. Signed-off-by: Pekka Enberg --- 8139too.c | 194 +++++++++++++++++++++++++++----------------------------------- 1 files changed, 87 insertions(+), 107 deletions(-) Index: 2.6.10-rc1-bk14-netdev1/drivers/net/8139too.c =================================================================== --- 2.6.10-rc1-bk14-netdev1.orig/drivers/net/8139too.c 2004-11-05 21:55:41.485808120 +0200 +++ 2.6.10-rc1-bk14-netdev1/drivers/net/8139too.c 2004-11-05 23:14:10.226970656 +0200 @@ -570,7 +570,7 @@ }; struct rtl8139_private { - void *mmio_addr; + void __iomem *mmio_addr; int drv_flags; struct pci_dev *pci_dev; u32 msg_enable; @@ -615,7 +615,7 @@ MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"); MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)"); -static int read_eeprom (void *ioaddr, int location, int addr_len); +static int read_eeprom (void __iomem *ioaddr, int location, int addr_len); static int rtl8139_open (struct net_device *dev); static int mdio_read (struct net_device *dev, int phy_id, int location); static void mdio_write (struct net_device *dev, int phy_id, int location, @@ -639,46 +639,20 @@ static void rtl8139_hw_start (struct net_device *dev); static struct ethtool_ops rtl8139_ethtool_ops; -#ifdef USE_IO_OPS - -#define RTL_R8(reg) inb (((unsigned long)ioaddr) + (reg)) -#define RTL_R16(reg) inw (((unsigned long)ioaddr) + (reg)) -#define RTL_R32(reg) ((unsigned long) inl (((unsigned long)ioaddr) + (reg))) -#define RTL_W8(reg, val8) outb ((val8), ((unsigned long)ioaddr) + (reg)) -#define RTL_W16(reg, val16) outw ((val16), ((unsigned long)ioaddr) + (reg)) -#define RTL_W32(reg, val32) outl ((val32), ((unsigned long)ioaddr) + (reg)) -#define RTL_W8_F RTL_W8 -#define RTL_W16_F RTL_W16 -#define RTL_W32_F RTL_W32 -#undef readb -#undef readw -#undef readl -#undef writeb -#undef writew -#undef writel -#define readb(addr) inb((unsigned long)(addr)) -#define readw(addr) inw((unsigned long)(addr)) -#define readl(addr) inl((unsigned long)(addr)) -#define writeb(val,addr) outb((val),(unsigned long)(addr)) -#define writew(val,addr) outw((val),(unsigned long)(addr)) -#define writel(val,addr) outl((val),(unsigned long)(addr)) - -#else - /* write MMIO register, with flush */ /* Flush avoids rtl8139 bug w/ posted MMIO writes */ -#define RTL_W8_F(reg, val8) do { writeb ((val8), ioaddr + (reg)); readb (ioaddr + (reg)); } while (0) -#define RTL_W16_F(reg, val16) do { writew ((val16), ioaddr + (reg)); readw (ioaddr + (reg)); } while (0) -#define RTL_W32_F(reg, val32) do { writel ((val32), ioaddr + (reg)); readl (ioaddr + (reg)); } while (0) +#define RTL_W8_F(reg, val8) do { iowrite8 ((val8), ioaddr + (reg)); ioread8 (ioaddr + (reg)); } while (0) +#define RTL_W16_F(reg, val16) do { iowrite16 ((val16), ioaddr + (reg)); ioread16 (ioaddr + (reg)); } while (0) +#define RTL_W32_F(reg, val32) do { iowrite32 ((val32), ioaddr + (reg)); ioread32 (ioaddr + (reg)); } while (0) #define MMIO_FLUSH_AUDIT_COMPLETE 1 #if MMIO_FLUSH_AUDIT_COMPLETE /* write MMIO register */ -#define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg)) -#define RTL_W16(reg, val16) writew ((val16), ioaddr + (reg)) -#define RTL_W32(reg, val32) writel ((val32), ioaddr + (reg)) +#define RTL_W8(reg, val8) iowrite8 ((val8), ioaddr + (reg)) +#define RTL_W16(reg, val16) iowrite16 ((val16), ioaddr + (reg)) +#define RTL_W32(reg, val32) iowrite32 ((val32), ioaddr + (reg)) #else @@ -690,11 +664,9 @@ #endif /* MMIO_FLUSH_AUDIT_COMPLETE */ /* read MMIO register */ -#define RTL_R8(reg) readb (ioaddr + (reg)) -#define RTL_R16(reg) readw (ioaddr + (reg)) -#define RTL_R32(reg) ((unsigned long) readl (ioaddr + (reg))) - -#endif /* USE_IO_OPS */ +#define RTL_R8(reg) ioread8 (ioaddr + (reg)) +#define RTL_R16(reg) ioread16 (ioaddr + (reg)) +#define RTL_R32(reg) ((unsigned long) ioread32 (ioaddr + (reg))) static const u16 rtl8139_intr_mask = @@ -741,10 +713,13 @@ assert (tp->pci_dev != NULL); pdev = tp->pci_dev; -#ifndef USE_IO_OPS +#ifdef USE_IO_OPS + if (tp->mmio_addr) + ioport_unmap (tp->mmio_addr); +#else if (tp->mmio_addr) - iounmap (tp->mmio_addr); -#endif /* !USE_IO_OPS */ + pci_iounmap (pdev, tp->mmio_addr); +#endif /* USE_IO_OPS */ /* it's ok to call this even if we have no regions to free */ pci_release_regions (pdev); @@ -755,7 +730,7 @@ } -static void rtl8139_chip_reset (void *ioaddr) +static void rtl8139_chip_reset (void __iomem *ioaddr) { int i; @@ -775,7 +750,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, struct net_device **dev_out) { - void *ioaddr; + void __iomem *ioaddr; struct net_device *dev; struct rtl8139_private *tp; u8 tmp8; @@ -856,13 +831,18 @@ pci_set_master (pdev); #ifdef USE_IO_OPS - ioaddr = (void *) pio_start; + ioaddr = ioport_map(pio_start, pio_len); + if (!ioaddr) { + printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev)); + rc = -EIO; + goto err_out; + } dev->base_addr = pio_start; tp->mmio_addr = ioaddr; tp->regs_len = pio_len; #else /* ioremap MMIO region */ - ioaddr = ioremap (mmio_start, mmio_len); + ioaddr = pci_iomap(pdev, 1, 0); if (ioaddr == NULL) { printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); rc = -EIO; @@ -946,7 +926,7 @@ struct net_device *dev = NULL; struct rtl8139_private *tp; int i, addr_len, option; - void *ioaddr; + void __iomem *ioaddr; static int board_idx = -1; u8 pci_rev; @@ -1144,47 +1124,46 @@ No extra delay is needed with 33Mhz PCI, but 66Mhz may change this. */ -#define eeprom_delay() readl(ee_addr) +#define eeprom_delay() RTL_R32(Cfg9346) /* The EEPROM commands include the alway-set leading bit. */ #define EE_WRITE_CMD (5) #define EE_READ_CMD (6) #define EE_ERASE_CMD (7) -static int __devinit read_eeprom (void *ioaddr, int location, int addr_len) +static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_len) { int i; unsigned retval = 0; - void *ee_addr = ioaddr + Cfg9346; int read_cmd = location | (EE_READ_CMD << addr_len); - writeb (EE_ENB & ~EE_CS, ee_addr); - writeb (EE_ENB, ee_addr); + RTL_W8 (Cfg9346, EE_ENB & ~EE_CS); + RTL_W8 (Cfg9346, EE_ENB); eeprom_delay (); /* Shift the read command bits out. */ for (i = 4 + addr_len; i >= 0; i--) { int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; - writeb (EE_ENB | dataval, ee_addr); + RTL_W8 (Cfg9346, EE_ENB | dataval); eeprom_delay (); - writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); + RTL_W8 (Cfg9346, EE_ENB | dataval | EE_SHIFT_CLK); eeprom_delay (); } - writeb (EE_ENB, ee_addr); + RTL_W8 (Cfg9346, EE_ENB); eeprom_delay (); for (i = 16; i > 0; i--) { - writeb (EE_ENB | EE_SHIFT_CLK, ee_addr); + RTL_W8 (Cfg9346, EE_ENB | EE_SHIFT_CLK); eeprom_delay (); retval = - (retval << 1) | ((readb (ee_addr) & EE_DATA_READ) ? 1 : + (retval << 1) | ((RTL_R8 (Cfg9346) & EE_DATA_READ) ? 1 : 0); - writeb (EE_ENB, ee_addr); + RTL_W8 (Cfg9346, EE_ENB); eeprom_delay (); } /* Terminate the EEPROM access. */ - writeb (~EE_CS, ee_addr); + RTL_W8 (Cfg9346, ~EE_CS); eeprom_delay (); return retval; @@ -1203,7 +1182,7 @@ #define MDIO_WRITE0 (MDIO_DIR) #define MDIO_WRITE1 (MDIO_DIR | MDIO_DATA_OUT) -#define mdio_delay(mdio_addr) readb(mdio_addr) +#define mdio_delay() RTL_R8(Config4) static char mii_2_8139_map[8] = { @@ -1220,15 +1199,15 @@ #ifdef CONFIG_8139TOO_8129 /* Syncronize the MII management interface by shifting 32 one bits out. */ -static void mdio_sync (void *mdio_addr) +static void mdio_sync (void __iomem *ioaddr) { int i; for (i = 32; i >= 0; i--) { - writeb (MDIO_WRITE1, mdio_addr); - mdio_delay (mdio_addr); - writeb (MDIO_WRITE1 | MDIO_CLK, mdio_addr); - mdio_delay (mdio_addr); + RTL_W8 (Config4, MDIO_WRITE1); + mdio_delay (); + RTL_W8 (Config4, MDIO_WRITE1 | MDIO_CLK); + mdio_delay (); } } #endif @@ -1238,35 +1217,36 @@ struct rtl8139_private *tp = netdev_priv(dev); int retval = 0; #ifdef CONFIG_8139TOO_8129 - void *mdio_addr = tp->mmio_addr + Config4; + void __iomem *ioaddr = tp->mmio_addr; int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location; int i; #endif if (phy_id > 31) { /* Really a 8139. Use internal registers. */ + void __iomem *ioaddr = tp->mmio_addr; return location < 8 && mii_2_8139_map[location] ? - readw (tp->mmio_addr + mii_2_8139_map[location]) : 0; + RTL_R16 (mii_2_8139_map[location]) : 0; } #ifdef CONFIG_8139TOO_8129 - mdio_sync (mdio_addr); + mdio_sync (ioaddr); /* Shift the read command bits out. */ for (i = 15; i >= 0; i--) { int dataval = (mii_cmd & (1 << i)) ? MDIO_DATA_OUT : 0; - writeb (MDIO_DIR | dataval, mdio_addr); - mdio_delay (mdio_addr); - writeb (MDIO_DIR | dataval | MDIO_CLK, mdio_addr); - mdio_delay (mdio_addr); + RTL_W8 (Config4, MDIO_DIR | dataval); + mdio_delay (); + RTL_W8 (Config4, MDIO_DIR | dataval | MDIO_CLK); + mdio_delay (); } /* Read the two transition, 16 data, and wire-idle bits. */ for (i = 19; i > 0; i--) { - writeb (0, mdio_addr); - mdio_delay (mdio_addr); - retval = (retval << 1) | ((readb (mdio_addr) & MDIO_DATA_IN) ? 1 : 0); - writeb (MDIO_CLK, mdio_addr); - mdio_delay (mdio_addr); + RTL_W8 (Config4, 0); + mdio_delay (); + retval = (retval << 1) | ((RTL_R8 (Config4) & MDIO_DATA_IN) ? 1 : 0); + RTL_W8 (Config4, MDIO_CLK); + mdio_delay (); } #endif @@ -1279,13 +1259,13 @@ { struct rtl8139_private *tp = netdev_priv(dev); #ifdef CONFIG_8139TOO_8129 - void *mdio_addr = tp->mmio_addr + Config4; + void __iomem *ioaddr = tp->mmio_addr; int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location << 18) | value; int i; #endif if (phy_id > 31) { /* Really a 8139. Use internal registers. */ - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; if (location == 0) { RTL_W8 (Cfg9346, Cfg9346_Unlock); RTL_W16 (BasicModeCtrl, value); @@ -1296,23 +1276,23 @@ } #ifdef CONFIG_8139TOO_8129 - mdio_sync (mdio_addr); + mdio_sync (ioaddr); /* Shift the command bits out. */ for (i = 31; i >= 0; i--) { int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; - writeb (dataval, mdio_addr); - mdio_delay (mdio_addr); - writeb (dataval | MDIO_CLK, mdio_addr); - mdio_delay (mdio_addr); + RTL_W8 (Config4, dataval); + mdio_delay (); + RTL_W8 (Config4, dataval | MDIO_CLK); + mdio_delay (); } /* Clear out extra bits. */ for (i = 2; i > 0; i--) { - writeb (0, mdio_addr); - mdio_delay (mdio_addr); - writeb (MDIO_CLK, mdio_addr); - mdio_delay (mdio_addr); + RTL_W8 (Config4, 0); + mdio_delay (); + RTL_W8 (Config4, MDIO_CLK); + mdio_delay (); } #endif } @@ -1322,7 +1302,7 @@ { struct rtl8139_private *tp = netdev_priv(dev); int retval; - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev); if (retval) @@ -1379,7 +1359,7 @@ static void rtl8139_hw_start (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; u32 i; u8 tmp; @@ -1481,7 +1461,7 @@ struct rtl8139_private *tp) { int linkcase; - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; /* This is a complicated state machine to configure the "twister" for impedance/echos based on the cable length. @@ -1565,7 +1545,7 @@ static inline void rtl8139_thread_iter (struct net_device *dev, struct rtl8139_private *tp, - void *ioaddr) + void __iomem *ioaddr) { int mii_lpa; @@ -1673,7 +1653,7 @@ static void rtl8139_tx_timeout (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; int i; u8 tmp8; unsigned long flags; @@ -1718,7 +1698,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; unsigned int entry; unsigned int len = skb->len; @@ -1760,7 +1740,7 @@ static void rtl8139_tx_interrupt (struct net_device *dev, struct rtl8139_private *tp, - void *ioaddr) + void __iomem *ioaddr) { unsigned long dirty_tx, tx_left; @@ -1830,7 +1810,7 @@ /* TODO: clean this up! Rx reset need not be this intensive */ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev, - struct rtl8139_private *tp, void *ioaddr) + struct rtl8139_private *tp, void __iomem *ioaddr) { u8 tmp8; #ifdef CONFIG_8139_OLD_RX_RESET @@ -1927,7 +1907,7 @@ static void rtl8139_isr_ack(struct rtl8139_private *tp) { - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; u16 status; status = RTL_R16 (IntrStatus) & RxAckBits; @@ -1946,7 +1926,7 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp, int budget) { - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; int received = 0; unsigned char *rx_ring = tp->rx_ring; unsigned int cur_rx = tp->cur_rx; @@ -2084,7 +2064,7 @@ static void rtl8139_weird_interrupt (struct net_device *dev, struct rtl8139_private *tp, - void *ioaddr, + void __iomem *ioaddr, int status, int link_changed) { DPRINTK ("%s: Abnormal interrupt, status %8.8x.\n", @@ -2124,7 +2104,7 @@ static int rtl8139_poll(struct net_device *dev, int *budget) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; int orig_budget = min(*budget, dev->quota); int done = 1; @@ -2162,7 +2142,7 @@ { struct net_device *dev = (struct net_device *) dev_instance; struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; u16 status, ackstat; int link_changed = 0; /* avoid bogus "uninit" warning */ int handled = 0; @@ -2238,7 +2218,7 @@ static int rtl8139_close (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; int ret = 0; unsigned long flags; @@ -2301,7 +2281,7 @@ static void rtl8139_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct rtl8139_private *np = netdev_priv(dev); - void *ioaddr = np->mmio_addr; + void __iomem *ioaddr = np->mmio_addr; spin_lock_irq(&np->lock); if (rtl_chip_info[np->chipset].flags & HasLWake) { @@ -2335,7 +2315,7 @@ static int rtl8139_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct rtl8139_private *np = netdev_priv(dev); - void *ioaddr = np->mmio_addr; + void __iomem *ioaddr = np->mmio_addr; u32 support; u8 cfg3, cfg5; @@ -2503,7 +2483,7 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; unsigned long flags; if (netif_running(dev)) { @@ -2522,7 +2502,7 @@ static void __set_rx_mode (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; u32 mc_filter[2]; /* Multicast hash filter */ int i, rx_mode; u32 tmp; @@ -2583,7 +2563,7 @@ { struct net_device *dev = pci_get_drvdata (pdev); struct rtl8139_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; + void __iomem *ioaddr = tp->mmio_addr; unsigned long flags; pci_save_state (pdev); From davem@davemloft.net Fri Nov 5 16:56:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:56:46 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60ufo9004682 for ; Fri, 5 Nov 2004 16:56:41 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEhj-0006pP-00; Fri, 05 Nov 2004 16:45:19 -0800 Date: Fri, 5 Nov 2004 16:45:19 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com Subject: Re: [PATCH] PKT_SCHED: Remove old rate estimator and statistics bits Message-Id: <20041105164519.2d44e814.davem@davemloft.net> In-Reply-To: <20041105142857.GW12289@postel.suug.ch> References: <20041105142857.GW12289@postel.suug.ch> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11510 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 140 Lines: 6 On Fri, 5 Nov 2004 15:28:57 +0100 Thomas Graf wrote: > Signed-off-by: Thomas Graf Applied, thanks Thomas. From davem@davemloft.net Fri Nov 5 16:58:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 16:58:25 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA60wJ77005039 for ; Fri, 5 Nov 2004 16:58:19 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEjH-0006pg-00; Fri, 05 Nov 2004 16:46:55 -0800 Date: Fri, 5 Nov 2004 16:46:55 -0800 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix rcu_assign_pointer fallout, use it in the right place Message-Id: <20041105164655.5d5639b8.davem@davemloft.net> In-Reply-To: <418BF48A.5060707@trash.net> References: <418BF48A.5060707@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11511 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 662 Lines: 14 On Fri, 05 Nov 2004 22:45:46 +0100 Patrick McHardy wrote: > The patch "RCU: use rcu_assign_pointer()" > http://linux.bkbits.net:8080/linux-2.6/diffs/net/sched/sch_api.c@1.39?nav=index.html|src/net/|src/net|src/net/sched|related/net/sched/sch_api.c|cset@1.2287 > changed a list_add_tail to list_add_tail_rcu in qdisc_create. It's > dev->qdisc not dev->qdisc_list that is protected by RCU, this patch > reverts that change. It also removes a misleading comment and replaces > the smp_wmb in qdisc_create_dflt by rcu_assign_pointer in dev_activate > to document more clearly what is protected. Good catch Patrick, patch applied. Thanks a lot. From davem@davemloft.net Fri Nov 5 17:00:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:00:54 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA610n0M005421 for ; Fri, 5 Nov 2004 17:00:49 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEld-0006q2-00; Fri, 05 Nov 2004 16:49:21 -0800 Date: Fri, 5 Nov 2004 16:49:20 -0800 From: "David S. Miller" To: Patrick McHardy Cc: tgraf@suug.ch, netdev@oss.sgi.com Subject: Re: [PATCH 2.4]: Don't try to destroy builtin qdiscs Message-Id: <20041105164920.34ecd937.davem@davemloft.net> In-Reply-To: <418BD897.5000409@trash.net> References: <418BD897.5000409@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11512 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 274 Lines: 10 On Fri, 05 Nov 2004 20:46:31 +0100 Patrick McHardy wrote: > Backported from Thomas's patch, we also need this for 2.4. Applied, thanks Patrick. (BTW, please use my davemloft.net email address, it is what I list in the MAINTAINERS and CREDITS file :-) From davem@davemloft.net Fri Nov 5 17:09:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:09:50 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA619ksr005915 for ; Fri, 5 Nov 2004 17:09:46 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQEtt-0006rT-00; Fri, 05 Nov 2004 16:57:53 -0800 Date: Fri, 5 Nov 2004 16:57:52 -0800 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com, hadi@cyberus.ca Subject: Re: [PATCH 2.6 4/4]: ipt: convert jiffie values to USER_HZ when dumping Message-Id: <20041105165752.3dee2876.davem@davemloft.net> In-Reply-To: <418ABA6C.8060402@trash.net> References: <418ABA6C.8060402@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11513 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 449 Lines: 13 All 4 patches applied, thanks Patrick. BTW, you don't need to split up changes like this with such high granularity. It's perfectly fine to lump these kinds of simple changes together as "Convert to USER_HZ when dumping in TC action modules". If the transformation is sizable or of non-trivial complexity, then yes splitting up the individual changes makes sense and makes it easier for people to review and verify the patches. Just a FYI. :-) From tgraf@suug.ch Fri Nov 5 17:18:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:18:49 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA61Igfp006399 for ; Fri, 5 Nov 2004 17:18:42 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 86C63F; Sat, 6 Nov 2004 02:18:01 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 1E0291C0EA; Sat, 6 Nov 2004 02:18:44 +0100 (CET) Date: Sat, 6 Nov 2004 02:18:43 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041106011843.GI12289@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105194303.GA12289@postel.suug.ch> X-archive-position: 11514 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1145 Lines: 22 * Thomas Graf <20041105194303.GA12289@postel.suug.ch> 2004-11-05 20:43 > * Patrick McHardy <418BC40E.8080402@trash.net> 2004-11-05 19:18 > > Yes, but there doesn't seem to be a path where this is true. > > I will double check this, there must be something wrong with > one of the callers to qdisc_destroy since it's the only way > entries can be removed from qdisc_list and otherwise the oops wouldn't > show up with the POISON1. I think I've found the problem and it sounds to banal to be true. qdisc_destroy uses list_del when it used to use a manual list management which would not interfer any list walkers. the list walkers are not protected on UP systems, that's why it was impossible to trigger it for me with SMP enabled. So a qdisc_list walker such as qdisc_lookup could have its next pointer overwritten with LIST_POISON1 while walking if qdisc_destroy is called in between? It sounds so right but on the other hand all the callers except dev_shutdown should be serialized with any of the list walkers by the rtnl sempaphore. I guess I'm missing that little bit of experience but it would help to use _rcu list variantes, would it? From jt@bougret.hpl.hp.com Fri Nov 5 17:31:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:32:04 -0800 (PST) Received: from palrel12.hp.com (atorelbas03.hp.com [156.153.255.237]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA61VxYh006972 for ; Fri, 5 Nov 2004 17:31:59 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel12.hp.com (Postfix) with ESMTP id ED31440262C; Fri, 5 Nov 2004 09:11:13 -0800 (PST) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id JAA18617; Fri, 5 Nov 2004 09:16:06 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1CQ7cH-0003fp-00; Fri, 05 Nov 2004 09:11:13 -0800 Date: Fri, 5 Nov 2004 09:11:13 -0800 To: Jeff Garzik Cc: Linux kernel mailing list , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] Wireless Extension dropped patchlet Message-ID: <20041105171113.GA14074@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <20041101225823.GA16560@bougret.hpl.hp.com> <418B2E51.9060108@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418B2E51.9060108@pobox.com> User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 11515 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev Content-Length: 115 Lines: 7 On Fri, Nov 05, 2004 at 02:40:01AM -0500, Jeff Garzik wrote: > applied Thanks a lot ! Have a good day... Jean From kaber@trash.net Fri Nov 5 17:48:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:48:13 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA61m84J007531 for ; Fri, 5 Nov 2004 17:48:09 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQFg8-0003k4-Q8; Sat, 06 Nov 2004 02:47:44 +0100 Message-ID: <418C2D40.9020300@trash.net> Date: Sat, 06 Nov 2004 02:47:44 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <418B4C7C.8000402@crocom.com.pl> <20041105115430.GP19714@rei.reeler.org> <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> In-Reply-To: <20041106011843.GI12289@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11516 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1076 Lines: 29 Thomas Graf wrote: >I think I've found the problem and it sounds to banal to be true. >qdisc_destroy uses list_del when it used to use a manual list >management which would not interfer any list walkers. > Nice work, I was really beginning to wonder. There's not that much that touches qdisc_list :) > the list >walkers are not protected on UP systems, that's why it was >impossible to trigger it for me with SMP enabled. So a qdisc_list >walker such as qdisc_lookup could have its next pointer overwritten >with LIST_POISON1 while walking if qdisc_destroy is called in between? >It sounds so right but on the other hand all the callers except >dev_shutdown should be serialized with any of the list walkers by the >rtnl sempaphore. > The __qdisc_destroy rcu-callback is called in softirq context, when destroying a classful qdisc the qdisc destroy function might call qdisc_destroy again for an inner class. >I guess I'm missing that little bit of experience but it would >help to use _rcu list variantes, would it? > Yes. Are you going to send a patch ? Regards Patrick From herbert@gondor.apana.org.au Fri Nov 5 17:54:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:54:34 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA61sO19007918 for ; Fri, 5 Nov 2004 17:54:25 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQFlb-0004TA-00; Sat, 06 Nov 2004 12:53:23 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQFlI-0003va-00; Sat, 06 Nov 2004 12:53:04 +1100 From: Herbert Xu To: davem@davemloft.net (David S. Miller) Subject: Re: BUG: dst underflow (again) Cc: buytenh@wantstofly.org, acme@conectiva.com.br, hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Organization: Core In-Reply-To: <20041105162319.6e2917c5.davem@davemloft.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Sat, 06 Nov 2004 12:53:04 +1100 X-archive-position: 11517 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 677 Lines: 17 David S. Miller wrote: > > Well, xfrm_lookup() is returning an error somehow, that's the only > way to execute dst_release() in udpv6_sendmsg(). And xfrm_lookup() Actually, there are other calls to dst_release in udpv6_sendmsg. For example, the inline function ip6_dst_store may call dst_release. I'm afraid that we really have to audit all dst_release callers, both direct and indirect, as well as all places where dst is stored. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From tgraf@suug.ch Fri Nov 5 17:59:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 17:59:36 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA61xSJx008427 for ; Fri, 5 Nov 2004 17:59:29 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id D5277F; Sat, 6 Nov 2004 02:58:48 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 123BC1C0E9; Sat, 6 Nov 2004 02:59:32 +0100 (CET) Date: Sat, 6 Nov 2004 02:59:31 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041106015931.GA28715@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418C2D40.9020300@trash.net> X-archive-position: 11518 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 916 Lines: 22 * Patrick McHardy <418C2D40.9020300@trash.net> 2004-11-06 02:47 > Nice work, I was really beginning to wonder. There's not that > much that touches qdisc_list :) Which might have been the problem, I've been focusing on this for hours overlooking the obvious. The bug report was very well done, maybe too good so I was at the root of the problem too fast. ;-> > The __qdisc_destroy rcu-callback is called in softirq context, when > destroying a classful qdisc the qdisc destroy function might call > qdisc_destroy again for an inner class. Ahh... of course. I was looking through all callers of destroy multiple times but somehow I managed to overlook the one in __qdisc_destroy over and over. Thanks! > >I guess I'm missing that little bit of experience but it would > >help to use _rcu list variantes, would it? > > > Yes. Are you going to send a patch ? Sure, tomorrow, if nobody preempts. I need some rest. From herbert@gondor.apana.org.au Fri Nov 5 20:41:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Nov 2004 20:42:02 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA64fr3k015104 for ; Fri, 5 Nov 2004 20:41:54 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQIOE-0004zW-00; Sat, 06 Nov 2004 15:41:26 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQIO9-0004Gr-00; Sat, 06 Nov 2004 15:41:21 +1100 Date: Sat, 6 Nov 2004 15:41:21 +1100 To: "David S. Miller" , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: [IPV6] Fix dst leak in ipv6_add_addr Message-ID: <20041106044121.GA16397@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="gKMricLos+KVdGMg" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11519 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1230 Lines: 48 --gKMricLos+KVdGMg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi: Found another error-path dst leak. If the idev->dead check is triggered in ipv6_add_addr the rt entry will leak. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --gKMricLos+KVdGMg Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv6/addrconf.c 1.115 vs edited ===== --- 1.115/net/ipv6/addrconf.c 2004-10-26 14:11:35 +10:00 +++ edited/net/ipv6/addrconf.c 2004-11-06 15:37:54 +11:00 @@ -484,7 +484,7 @@ int scope, unsigned flags) { struct inet6_ifaddr *ifa = NULL; - struct rt6_info *rt; + struct rt6_info *rt = NULL; int hash; static spinlock_t lock = SPIN_LOCK_UNLOCKED; int err = 0; @@ -572,6 +572,10 @@ if (unlikely(err == 0)) notifier_call_chain(&inet6addr_chain, NETDEV_UP, ifa); else { + if (rt) { + dst_release(&rt->u.dst); + dst_free(&rt->u.dst); + } kfree(ifa); ifa = ERR_PTR(err); } --gKMricLos+KVdGMg-- From davem@davemloft.net Sat Nov 6 00:16:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 00:17:06 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA68GxaC020463 for ; Sat, 6 Nov 2004 00:16:59 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CQLZW-0007C8-00; Sat, 06 Nov 2004 00:05:18 -0800 Date: Sat, 6 Nov 2004 00:05:18 -0800 From: "David S. Miller" To: Herbert Xu Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Fix dst leak in ipv6_add_addr Message-Id: <20041106000518.75eca9b2.davem@davemloft.net> In-Reply-To: <20041106044121.GA16397@gondor.apana.org.au> References: <20041106044121.GA16397@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11520 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 348 Lines: 10 On Sat, 6 Nov 2004 15:41:21 +1100 Herbert Xu wrote: > Found another error-path dst leak. If the idev->dead check is > triggered in ipv6_add_addr the rt entry will leak. This one was fixed in the xfrm_lookup() patch I sent yesterday :-) I guess it's good that multiple people are verifying all of these code paths. From herbert@gondor.apana.org.au Sat Nov 6 00:21:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 00:21:35 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA68LQfb024198 for ; Sat, 6 Nov 2004 00:21:27 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQLok-0005h0-00; Sat, 06 Nov 2004 19:21:02 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQLof-0004cd-00; Sat, 06 Nov 2004 19:20:57 +1100 Date: Sat, 6 Nov 2004 19:20:57 +1100 To: "David S. Miller" Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Fix dst leak in ipv6_add_addr Message-ID: <20041106082057.GA17707@gondor.apana.org.au> References: <20041106044121.GA16397@gondor.apana.org.au> <20041106000518.75eca9b2.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041106000518.75eca9b2.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11521 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 744 Lines: 20 On Sat, Nov 06, 2004 at 12:05:18AM -0800, David S. Miller wrote: > On Sat, 6 Nov 2004 15:41:21 +1100 > Herbert Xu wrote: > > > Found another error-path dst leak. If the idev->dead check is > > triggered in ipv6_add_addr the rt entry will leak. > > This one was fixed in the xfrm_lookup() patch I sent yesterday :-) Indeed, I overlooked that message :) However your version still leaks the rt since its refcnt is set to 1. It will also dereference an unitialised rt if allocating ifa fails. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From buytenh@wantstofly.org Sat Nov 6 01:02:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 01:02:35 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA692ToM025402 for ; Sat, 6 Nov 2004 01:02:30 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 45D6F2B105; Sat, 6 Nov 2004 10:02:11 +0100 (MET) Date: Sat, 6 Nov 2004 10:02:11 +0100 From: Lennert Buytenhek To: "David S. Miller" Cc: acme@conectiva.com.br, hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) Message-ID: <20041106090211.GA8106@xi.wantstofly.org> References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105091427.GB28112@xi.wantstofly.org> <418B4B1A.8@conectiva.com.br> <20041105101513.GA28779@xi.wantstofly.org> <20041105162319.6e2917c5.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105162319.6e2917c5.davem@davemloft.net> User-Agent: Mutt/1.4.1i X-archive-position: 11522 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Content-Length: 784 Lines: 26 On Fri, Nov 05, 2004 at 04:23:19PM -0800, David S. Miller wrote: > > > >IPSEC.. not that I know of. So unless my distro does stuff behind > > > >my back, no. How do I make sure? > > > > > > setkey -DP > > > > Thanks. Both machines I'm seeing this problem on have: > > > > # setkey -DP > > No SPD entries. > > # > > Well, xfrm_lookup() is returning an error somehow, that's the only > way to execute dst_release() in udpv6_sendmsg(). And xfrm_lookup() > only returns errors if IPSEC policies have been configured either > globally or locally for the socket. Please note that my traces were made on the Fedora Core 2 kernel ('2.6.8-1.521smp'), where these codepaths all look a bit different. I'm hoping to try a mainline kernel on one of these boxes soon. cheers, Lennert From acme@conectiva.com.br Sat Nov 6 01:17:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 01:17:27 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA69HJ7v026066 for ; Sat, 6 Nov 2004 01:17:20 -0800 Received: from [200.138.54.60] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CQMhG-0003ru-00; Sat, 06 Nov 2004 07:17:22 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id CA9DA1463C; Sat, 6 Nov 2004 07:16:54 -0200 (BRST) Message-ID: <418C888F.3060509@conectiva.com.br> Date: Sat, 06 Nov 2004 06:17:19 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Lennert Buytenhek Cc: "David S. Miller" , hadi@cyberus.ca, yoshfuji@linux-ipv6.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: BUG: dst underflow (again) References: <4178AB0D.6060107@pobox.com> <20041022.155159.98771450.yoshfuji@linux-ipv6.org> <20041022075947.GA15795@xi.wantstofly.org> <1099577717.1039.155.camel@jzny.localdomain> <20041104221801.584c8f11.davem@davemloft.net> <20041105091427.GB28112@xi.wantstofly.org> <418B4B1A.8@conectiva.com.br> <20041105101513.GA28779@xi.wantstofly.org> <20041105162319.6e2917c5.davem@davemloft.net> <20041106090211.GA8106@xi.wantstofly.org> In-Reply-To: <20041106090211.GA8106@xi.wantstofly.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11523 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3950 Lines: 103 Lennert Buytenhek wrote: > On Fri, Nov 05, 2004 at 04:23:19PM -0800, David S. Miller wrote: > > >>>>>IPSEC.. not that I know of. So unless my distro does stuff behind >>>>>my back, no. How do I make sure? >>>> >>>>setkey -DP >>> >>>Thanks. Both machines I'm seeing this problem on have: >>> >>># setkey -DP >>>No SPD entries. >>># >> >>Well, xfrm_lookup() is returning an error somehow, that's the only >>way to execute dst_release() in udpv6_sendmsg(). And xfrm_lookup() >>only returns errors if IPSEC policies have been configured either >>globally or locally for the socket. > > > Please note that my traces were made on the Fedora Core 2 kernel > ('2.6.8-1.521smp'), where these codepaths all look a bit different. > > I'm hoping to try a mainline kernel on one of these boxes soon. > Lennert, could you try to reproduce what I observed at Jeff Garzik's ipv6 gateway, running first: [acme@pretzel network-scripts]$ for a in $(seq 1 10) ; do dmesg | grep '^BUG: dst underf' | md5sum ; ping6 -c 1 www.linux-ipv6.org | head -2 ; sleep 2 ; done edc1a887cbd8ec99257c5b00a2b95b1e - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=302 ms 4b422fb5ef1abd2a9d7c0d2eac16ed95 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=308 ms 337774afcf7944ca6f8769b021890bfc - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=60 time=309 ms bfb23793729c27093f51f478ce524a15 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=308 ms 1fbef3369bdca718e6f59e9ec8ddb540 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=308 ms bd93a08ff06688789ab4e94b761571d6 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=60 time=308 ms cdc166d49c07b98a6668af21b7808107 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=308 ms b10df2f221b0a6b9cb80d511ddf0034f - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=307 ms 38748d154ea1cce6097221fa442daf57 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=61 time=307 ms 0d9ee97a76410ed20b2cb0dc958cd146 - PING www.linux-ipv6.org(pc14.fujisawa.wide.ad.jp) 56 data bytes 64 bytes from pc14.fujisawa.wide.ad.jp: icmp_seq=0 ttl=60 time=308 ms [acme@pretzel network-scripts]$ then: [acme@pretzel network-scripts]$ for a in $(seq 1 10) ; do dmesg | grep '^BUG: dst underf' | md5sum ; sleep 2 ; done 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - 3079d6c2a8c9be8b97fa31e91f8f37df - [acme@pretzel network-scripts]$ The md5sum is just a trick, using wc-l gives a false impression because the dmesg output wraps around and stays with just BUG underflow... messages. Another thing: can you try with IPv6 privacy extensions not built into the kernel/ipv6 module? I couldn't reproduce it here at home, not sure why, but I tried with 2.6.9-final (like Jeff's machine) and with latest Linus BK tree, couldn't reproduce. The problem (or part of it ;) ) lies in net/ipv6/datagram.c, ip6_datagram_connect and the functions it calls that end up calling dst_release, but I don't know that much this code and I'm almost falling asleep here. Thanks, - Arnaldo From herbert@gondor.apana.org.au Sat Nov 6 02:35:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 02:35:28 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6AZKHr028276 for ; Sat, 6 Nov 2004 02:35:21 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQNuH-0006H7-00; Sat, 06 Nov 2004 21:34:53 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQNuD-0004pm-00; Sat, 06 Nov 2004 21:34:49 +1100 Date: Sat, 6 Nov 2004 21:34:49 +1100 To: "David S. Miller" , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: [IPV6] Close small race in ip6_del_rt Message-ID: <20041106103449.GA18569@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Kj7319i9nmIyA2yE" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11524 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 976 Lines: 39 --Kj7319i9nmIyA2yE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi: There is a small SMP race in ip6_del_rt where we maybe dereferencing a dst that has been freed. This patch fixes it. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --Kj7319i9nmIyA2yE Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv6/route.c 1.99 vs edited ===== --- 1.99/net/ipv6/route.c 2004-10-26 14:27:49 +10:00 +++ edited/net/ipv6/route.c 2004-11-06 16:40:11 +11:00 @@ -979,9 +979,9 @@ rt6_reset_dflt_pointer(NULL); + err = fib6_del(rt, nlh, _rtattr); dst_release(&rt->u.dst); - err = fib6_del(rt, nlh, _rtattr); write_unlock_bh(&rt6_lock); return err; --Kj7319i9nmIyA2yE-- From chas@cmf.nrl.navy.mil Sat Nov 6 05:38:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 05:38:58 -0800 (PST) Received: from ginger.cmf.nrl.navy.mil (ginger.cmf.nrl.navy.mil [134.207.10.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6DcmZ2005592 for ; Sat, 6 Nov 2004 05:38:51 -0800 Received: from cmf.nrl.navy.mil (thirdoffive.cmf.nrl.navy.mil [134.207.10.180]) by ginger.cmf.nrl.navy.mil (8.12.11/8.12.11) with ESMTP id iA6DcJTO017887; Sat, 6 Nov 2004 08:38:19 -0500 (EST) Message-Id: <200411061338.iA6DcJTO017887@ginger.cmf.nrl.navy.mil> To: netdev@oss.sgi.com Cc: davem@redhat.com Subject: [PATCH][ATM]: [atmtcp] fix refcounting and vcc search Date: Sat, 06 Nov 2004 08:38:19 -0500 From: "chas williams (contractor)" X-Virus-Scanned: NAI Completed X-Scanned-By: MIMEDefang 2.30 (www . roaringpenguin . com / mimedefang) X-archive-position: 11525 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chas@cmf.nrl.navy.mil Precedence: bulk X-list: netdev Content-Length: 2227 Lines: 85 i must have been a bit confused when i originally converted this use the hash. please apply to 2.6. thanks! Signed-off-by: Chas Williams # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/06 08:21:01-05:00 chas@relax.cmf.nrl.navy.mil # atmtcp.c: # [ATM]: [atmtcp] fix refcounting and vcc search # # drivers/atm/atmtcp.c # 2004/11/06 08:16:23-05:00 chas@relax.cmf.nrl.navy.mil +25 -17 # [ATM]: [atmtcp] fix refcounting and vcc search # diff -Nru a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c --- a/drivers/atm/atmtcp.c 2004-11-06 08:22:42 -05:00 +++ b/drivers/atm/atmtcp.c 2004-11-06 08:22:42 -05:00 @@ -271,6 +271,28 @@ } } read_unlock(&vcc_sklist_lock); + module_put(THIS_MODULE); +} + + +static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci) +{ + struct hlist_head *head; + struct atm_vcc *vcc; + struct hlist_node *node; + struct sock *s; + + head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; + + sk_for_each(s, node, head) { + vcc = atm_sk(s); + if (vcc->dev == dev && + vcc->vci == vci && vcc->vpi == vpi && + vcc->qos.rxtp.traffic_class != ATM_NONE) { + return vcc; + } + } + return NULL; } @@ -278,11 +300,9 @@ { struct atm_dev *dev; struct atmtcp_hdr *hdr; - struct sock *s; - struct hlist_node *node; - struct atm_vcc *out_vcc = NULL; + struct atm_vcc *out_vcc; struct sk_buff *new_skb; - int i, result = 0; + int result = 0; if (!skb->len) return 0; dev = vcc->dev_data; @@ -293,19 +313,7 @@ goto done; } read_lock(&vcc_sklist_lock); - for(i = 0; i < VCC_HTABLE_SIZE; ++i) { - struct hlist_head *head = &vcc_hash[i]; - - sk_for_each(s, node, head) { - out_vcc = atm_sk(s); - if (out_vcc->dev != dev) - continue; - if (out_vcc->vpi == ntohs(hdr->vpi) && - out_vcc->vci == ntohs(hdr->vci) && - out_vcc->qos.rxtp.traffic_class != ATM_NONE) - break; - } - } + out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci)); read_unlock(&vcc_sklist_lock); if (!out_vcc) { atomic_inc(&vcc->stats->tx_err); From tgraf@suug.ch Sat Nov 6 06:50:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 06:50:47 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6EoaI4007538 for ; Sat, 6 Nov 2004 06:50:36 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id CBC3EF; Sat, 6 Nov 2004 15:49:54 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id CA1181C0E9; Sat, 6 Nov 2004 15:50:36 +0100 (CET) Date: Sat, 6 Nov 2004 15:50:36 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041106145036.GB28715@postel.suug.ch> References: <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041106015931.GA28715@postel.suug.ch> X-archive-position: 11526 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 4039 Lines: 120 The patch below transforms qdisc_list into a RCU protected list. However, this does not really fix the problem. The below example shows what can happen in case a qdisc is deleted which is classful and calls qdisc_destroy in its destroy handler. ---> RTM_DELQDISC message ... qdisc_destroy() sets up rcu callback __qdisc_destroy <--- ... ---> RCU callback __qdisc_destroy qdisc_destroy() sets up rcu callback __qdisc_destroy <--- ... ---> continueing RTM_DELQDISC message ... <--- message finished ---> RTM_GETQDISC ... <--- p = qdisc_lookup() (qdisc_lookup itself is not interrupted) ---> RCU callback __qdisc_destroy <--- May free p ---> continueing RTM_GETQDISC message use of p references freed memory --> oops So using the RCU protected list only enforces the unlinking to be safe while within a list walk and the rcu callback to be deferred until the list walk is complete but may be executed right after qdisc_lookup and then may free the entry that was returned. So we must either rcu_read_lock all codeblocks that use a result of a qdisc_lookup which is not trivial or ensure that all rcu callbacks have finished before the next rtnetlink message is processed. Maybe the easiest would be to have a refcnt which is incremented when a rcu callback is set up and decremented when it finishs and sleep on it after processing a rtnetlink message until it reaches 0 again. Thoughts? Anyway, here's the patch. It's relative to my earlier patch and Patrick's rcu_assign_ptr patch. Transform qdisc_list into a RCU protected list to avoid qdisc_destroy, which might be called from softirq context, to overwrite the next pointer while a user context list walking is taking place. Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc1-bk14.orig/net/sched/sch_api.c linux-2.6.10-rc1-bk14/net/sched/sch_api.c --- linux-2.6.10-rc1-bk14.orig/net/sched/sch_api.c 2004-11-06 14:57:44.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/sch_api.c 2004-11-06 14:52:22.000000000 +0100 @@ -196,10 +196,14 @@ { struct Qdisc *q; - list_for_each_entry(q, &dev->qdisc_list, list) { - if (q->handle == handle) + rcu_read_lock(); + list_for_each_entry_rcu(q, &dev->qdisc_list, list) { + if (q->handle == handle) { + rcu_read_unlock(); return q; + } } + rcu_read_unlock(); return NULL; } @@ -453,7 +457,7 @@ if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS-1])) == 0) { qdisc_lock_tree(dev); - list_add_tail(&sch->list, &dev->qdisc_list); + list_add_tail_rcu(&sch->list, &dev->qdisc_list); qdisc_unlock_tree(dev); #ifdef CONFIG_NET_ESTIMATOR @@ -817,7 +821,7 @@ s_q_idx = 0; read_lock_bh(&qdisc_tree_lock); q_idx = 0; - list_for_each_entry(q, &dev->qdisc_list, list) { + list_for_each_entry_rcu(q, &dev->qdisc_list, list) { if (q_idx < s_q_idx) { q_idx++; continue; @@ -1054,7 +1058,7 @@ t = 0; read_lock_bh(&qdisc_tree_lock); - list_for_each_entry(q, &dev->qdisc_list, list) { + list_for_each_entry_rcu(q, &dev->qdisc_list, list) { if (t < s_t || !q->ops->cl_ops || (tcm->tcm_parent && TC_H_MAJ(tcm->tcm_parent) != q->handle)) { diff -Nru linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c linux-2.6.10-rc1-bk14/net/sched/sch_generic.c --- linux-2.6.10-rc1-bk14.orig/net/sched/sch_generic.c 2004-11-06 14:57:44.000000000 +0100 +++ linux-2.6.10-rc1-bk14/net/sched/sch_generic.c 2004-11-06 15:16:16.000000000 +0100 @@ -486,7 +486,7 @@ if (qdisc->flags & TCQ_F_BUILTIN || !atomic_dec_and_test(&qdisc->refcnt)) return; - list_del(&qdisc->list); + list_del_rcu(&qdisc->list); call_rcu(&qdisc->q_rcu, __qdisc_destroy); } @@ -507,7 +507,7 @@ return; } write_lock_bh(&qdisc_tree_lock); - list_add_tail(&qdisc->list, &dev->qdisc_list); + list_add_tail_rcu(&qdisc->list, &dev->qdisc_list); write_unlock_bh(&qdisc_tree_lock); } else { qdisc = &noqueue_qdisc; From romieu@fr.zoreil.com Sat Nov 6 07:00:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 07:00:05 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6F00CD008165 for ; Sat, 6 Nov 2004 07:00:01 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA6EuTvr007029; Sat, 6 Nov 2004 15:56:29 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA6EuITI007028; Sat, 6 Nov 2004 15:56:18 +0100 Date: Sat, 6 Nov 2004 15:56:18 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 1/3] r8169: non-NAPI netif_poll_disable removal Message-ID: <20041106145618.GA4895@electric-eye.fr.zoreil.com> References: <200411021203.17013.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411021203.17013.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11527 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 2179 Lines: 55 Jon Mason : > rtl8169_close contains a call to netif_poll_disable. This call sets and spins > on the __LINK_STATE_RX_SCHED bit, which isn't really a problem if this > function is only called in close (as that bit is off with NAPI off). > However, if the driver hits a transmit timeout (or any other call that > references rtl8169_wait_for_quiescence), the the module will hang > indefinitely during any subsequent call to netif_poll_disable or dev_close > function call because this bit is now set. > > Since this function should not really be called with NAPI off, I chose to > remove the calls if NAPI is not defined (See patch below). The patch is > against the 2.6.10-rc1-mm2 version of the driver. I have verified that this > fixes the problem on ppc64 and x86_64. Yep but it seems to me that there is still a window for a race with NAPI if the relevant error path is taken: 1 - Tx timeout 2 - rtl8169_reset_task: netif_poll_disable is issued. Assume that the refilling of the Rx buffers fails -> rtl8169_reset_task schedules itself for later 3 - operator closes the device: netif_running(dev) == 0 and rtl8169_close() is issued 4 - rtl8169_close() loops on netif_poll_disable() Neither __netif_rx_schedule nor netif_poll_enable was issued. Deadlock. It should be enough to change rtl8169_wait_for_quiescence() for: static void rtl8169_wait_for_quiescence(struct net_device *dev) { synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ netif_poll_disable(dev); RTL_W16(IntrMask, 0x00); netif_poll_enable(dev); } There will be a few "interrupt XXX taken in poll" when it races with the irq handler but they are harmless anyway [*]. The lack of netif_poll_enable() after netif_wake_queue() in rtl8169_reset_task() which you suggested to me should also be fixed with this change. [*] Ok, it should be possible to have a BUG_ON due to the simultaneous invocation of rtl8169_reinit_task() and rtl8169_reset_task() under weird circumstances but this one will be easily fixed by an adequate netif_queue_stopped() in rtl8169_pcierr_interrupt(). -- Ueimor From jgarzik@pobox.com Sat Nov 6 09:11:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 09:11:30 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6HBOK9015018 for ; Sat, 6 Nov 2004 09:11:25 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CQU5h-0000cE-Kh; Sat, 06 Nov 2004 17:11:05 +0000 Message-ID: <418D059D.7010803@pobox.com> Date: Sat, 06 Nov 2004 12:10:53 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: ravinandan.arakali@s2io.com CC: "'koushik'" , romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. References: <003201c4c397$d4885900$9810100a@S2IOtech.com> In-Reply-To: <003201c4c397$d4885900$9810100a@S2IOtech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11528 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 394 Lines: 14 Ravinandan Arakali wrote: > Jeff, > Thanks for the excellent suggestion. We have used this method to send all > the 12 patches. Note that since our mail server went down and came back > up during this process, the mail containing patch3 has appeared twice. > Pls ignore the duplicate. Alas, I'm still waiting for the patches... Does 'mailq' show messages waiting to be delivered? Jeff From hch@lst.de Sat Nov 6 09:43:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 09:43:37 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6HhSKZ015840 for ; Sat, 6 Nov 2004 09:43:29 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iA6Hh7la019838 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Sat, 6 Nov 2004 18:43:07 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iA6Hh7H3019836; Sat, 6 Nov 2004 18:43:07 +0100 Date: Sat, 6 Nov 2004 18:43:07 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove dead exports from net/core/dev.c Message-ID: <20041106174307.GA19806@lst.de> References: <20041101114605.GA7507@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101114605.GA7507@lst.de> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11529 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 5490 Lines: 186 On Mon, Nov 01, 2004 at 12:46:05PM +0100, Christoph Hellwig wrote: > this also allows to kill some competely dead code, e.g. many of the > non-locked __foo routines. > > Signed-off-by: Christoph Hellwig rediffed against current BK: --- 1.91/include/linux/netdevice.h 2004-10-26 18:09:33 +02:00 +++ edited/include/linux/netdevice.h 2004-11-06 18:13:34 +01:00 @@ -526,20 +526,13 @@ extern int netdev_boot_setup_check(struct net_device *dev); extern unsigned long netdev_boot_base(const char *prefix, int unit); extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr); -extern struct net_device *__dev_getfirstbyhwtype(unsigned short type); extern struct net_device *dev_getfirstbyhwtype(unsigned short type); extern void dev_add_pack(struct packet_type *pt); extern void dev_remove_pack(struct packet_type *pt); extern void __dev_remove_pack(struct packet_type *pt); -extern int __dev_get(const char *name); -static inline int __deprecated dev_get(const char *name) -{ - return __dev_get(name); -} + extern struct net_device *dev_get_by_flags(unsigned short flags, unsigned short mask); -extern struct net_device *__dev_get_by_flags(unsigned short flags, - unsigned short mask); extern struct net_device *dev_get_by_name(const char *name); extern struct net_device *__dev_get_by_name(const char *name); extern int dev_alloc_name(struct net_device *dev, const char *name); @@ -553,7 +546,6 @@ extern int register_netdevice_notifier(struct notifier_block *nb); extern int unregister_netdevice_notifier(struct notifier_block *nb); extern int call_netdevice_notifiers(unsigned long val, void *v); -extern int dev_new_index(void); extern struct net_device *dev_get_by_index(int ifindex); extern struct net_device *__dev_get_by_index(int ifindex); extern int dev_restart(struct net_device *dev); --- 1.173/net/core/dev.c 2004-11-04 00:55:02 +01:00 +++ edited/net/core/dev.c 2004-11-06 18:32:30 +01:00 @@ -520,35 +520,6 @@ return dev; } -/* - Return value is changed to int to prevent illegal usage in future. - It is still legal to use to check for device existence. - - User should understand, that the result returned by this function - is meaningless, if it was not issued under rtnl semaphore. - */ - -/** - * dev_get - test if a device exists - * @name: name to test for - * - * Test if a name exists. Returns true if the name is found. In order - * to be sure the name is not allocated or removed during the test the - * caller must hold the rtnl semaphore. - * - * This function exists only for back compatibility with older - * drivers. - */ -int __dev_get(const char *name) -{ - struct net_device *dev; - - read_lock(&dev_base_lock); - dev = __dev_get_by_name(name); - read_unlock(&dev_base_lock); - return dev != NULL; -} - /** * __dev_get_by_index - find a device by its ifindex * @ifindex: index of device @@ -623,26 +594,17 @@ return dev; } -struct net_device *__dev_getfirstbyhwtype(unsigned short type) -{ - struct net_device *dev; - - for (dev = dev_base; dev; dev = dev->next) - if (dev->type == type) - break; - return dev; -} - -EXPORT_SYMBOL(__dev_getfirstbyhwtype); - struct net_device *dev_getfirstbyhwtype(unsigned short type) { struct net_device *dev; rtnl_lock(); - dev = __dev_getfirstbyhwtype(type); - if (dev) - dev_hold(dev); + for (dev = dev_base; dev; dev = dev->next) { + if (dev->type == type) { + dev_hold(dev); + break; + } + } rtnl_unlock(); return dev; } @@ -665,32 +627,14 @@ struct net_device *dev; read_lock(&dev_base_lock); - dev = __dev_get_by_flags(if_flags, mask); - if (dev) - dev_hold(dev); - read_unlock(&dev_base_lock); - return dev; -} - -/** - * __dev_get_by_flags - find any device with given flags - * @if_flags: IFF_* values - * @mask: bitmask of bits in if_flags to check - * - * Search for any interface with the given flags. Returns NULL if a device - * is not found or a pointer to the device. The caller must hold either - * the RTNL semaphore or @dev_base_lock. - */ - -struct net_device *__dev_get_by_flags(unsigned short if_flags, unsigned short mask) -{ - struct net_device *dev; - for (dev = dev_base; dev != NULL; dev = dev->next) { - if (((dev->flags ^ if_flags) & mask) == 0) - return dev; + if (((dev->flags ^ if_flags) & mask) == 0) { + dev_hold(dev); + break; + } } - return NULL; + read_unlock(&dev_base_lock); + return dev; } /** @@ -2700,7 +2644,7 @@ * number. The caller must hold the rtnl semaphore or the * dev_base_lock to be sure it remains unique. */ -int dev_new_index(void) +static int dev_new_index(void) { static int ifindex; for (;;) { @@ -3240,8 +3184,6 @@ subsys_initcall(net_dev_init); -EXPORT_SYMBOL(__dev_get); -EXPORT_SYMBOL(__dev_get_by_flags); EXPORT_SYMBOL(__dev_get_by_index); EXPORT_SYMBOL(__dev_get_by_name); EXPORT_SYMBOL(__dev_remove_pack); @@ -3252,17 +3194,13 @@ EXPORT_SYMBOL(dev_get_by_flags); EXPORT_SYMBOL(dev_get_by_index); EXPORT_SYMBOL(dev_get_by_name); -EXPORT_SYMBOL(dev_getbyhwaddr); EXPORT_SYMBOL(dev_ioctl); -EXPORT_SYMBOL(dev_new_index); EXPORT_SYMBOL(dev_open); EXPORT_SYMBOL(dev_queue_xmit); -EXPORT_SYMBOL(dev_queue_xmit_nit); EXPORT_SYMBOL(dev_remove_pack); EXPORT_SYMBOL(dev_set_allmulti); EXPORT_SYMBOL(dev_set_promiscuity); EXPORT_SYMBOL(dev_change_flags); -EXPORT_SYMBOL(dev_change_name); EXPORT_SYMBOL(dev_set_mtu); EXPORT_SYMBOL(free_netdev); EXPORT_SYMBOL(netdev_boot_setup_check); From simlo@phys.au.dk Sat Nov 6 12:15:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 12:15:23 -0800 (PST) Received: from lirs02.phys.au.dk (lirs02.phys.au.dk [130.225.28.43]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6KFF7R020686 for ; Sat, 6 Nov 2004 12:15:16 -0800 Received: from da410.ifa.au.dk (da410 [10.12.1.21]) by lirs02.phys.au.dk (8.12.6/8.12.6) with SMTP id iA6KEmsx010601; Sat, 6 Nov 2004 21:14:48 +0100 Received: from localhost by da410.ifa.au.dk (5.65v4.0/1.1.19.2/02Feb99-1132AM) id AA21829; Sat, 6 Nov 2004 21:14:50 +0100 Date: Sat, 6 Nov 2004 21:14:50 +0100 (MET) From: Esben Nielsen X-Sender: simlo@da410.ifa.au.dk To: Andrew Morton Cc: davem@redhat.com, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch 1/9] arcnet fixes In-Reply-To: <20041029133923.66dd719f.akpm@osdl.org> Message-Id: Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-DAIMI-Spam-Score: -2.82 () ALL_TRUSTED X-Scanned-By: MIMEDefang 2.44 X-archive-position: 11530 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: simlo@phys.au.dk Precedence: bulk X-list: netdev Content-Length: 2791 Lines: 65 Did you ever get the patch fixing the original patch? (I send it with command line mail a few days back, I am not so sure how master that...). Let me try to send it from within pine but I am afraid the lines can be bad ... Esben diff -Naur linux-2.6.9-arcnet/include/linux/if_ether.h linux-2.6.9-arcnet-fix/include/linux/if_ether.h --- linux-2.6.9-arcnet/include/linux/if_ether.h 2004-10-20 21:01:05.000000000 +0200 +++ linux-2.6.9-arcnet-fix/include/linux/if_ether.h 2004-10-29 23:26:03.0000 00000 +0200 @@ -91,7 +91,7 @@ #define ETH_P_IRDA 0x0017 /* Linux-IrDA */ #define ETH_P_ECONET 0x0018 /* Acorn Econet */ #define ETH_P_HDLC 0x0019 /* HDLC frames */ -#define ETH_P_ARCNET 0x0020 /* ArcNet */ +#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */ /* * This is an Ethernet frame header. diff -Naur linux-2.6.9-arcnet/include/linux/net.h linux-2.6.9-arcnet-fix/include/linux/net.h --- linux-2.6.9-arcnet/include/linux/net.h 2004-10-20 21:01:05.000000000 +0200 +++ linux-2.6.9-arcnet-fix/include/linux/net.h 2004-10-29 23:26:51.000000000 +0200 @@ -26,7 +26,7 @@ struct poll_table_struct; struct inode; -#define NPROTO 33 /* should be enough for now.. */ +#define NPROTO 32 /* should be enough for now.. */ #define SYS_SOCKET 1 /* sys_socket(2) */ #define SYS_BIND 2 /* sys_bind(2) */ On Fri, 29 Oct 2004, Andrew Morton wrote: > Esben Nielsen wrote: > > > > > One problem with the patch though. > > > > > > > diff -puN include/linux/if_ether.h~arcnet-fixes include/linux/if_ether.h > > > > --- 25/include/linux/if_ether.h~arcnet-fixes 2004-10-28 00:17:07.230704752 -0700 > > > > +++ 25-akpm/include/linux/if_ether.h 2004-10-28 00:17:07.247702168 -0700 > > > > @@ -91,6 +91,7 @@ > > > > #define ETH_P_IRDA 0x0017 /* Linux-IrDA */ > > > > #define ETH_P_ECONET 0x0018 /* Acorn Econet */ > > > > #define ETH_P_HDLC 0x0019 /* HDLC frames */ > > > > +#define ETH_P_ARCNET 0x0020 /* ArcNet */ > > > > > > You should use 0x001a or similar, so you don't have > > > to do this next part of your patch, bumping NPROTO > > > in net.h > > > > > > > Doh! I can't count in hex it seems. This would probably also mean I won't > > have to recompile the whole kernel but just the modules and I don't have > > to reboot to make it work on a new machine - but just until somebody else > > picks the same protocol number ofcourse. > > > > Do I have to fix the problem and resubmit? > > Yes please. A patch relative to the previous one would be nice. > From akpm@osdl.org Sat Nov 6 13:50:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 13:50:41 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6LoZc4026254 for ; Sat, 6 Nov 2004 13:50:35 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA6Lnd918791; Sat, 6 Nov 2004 13:49:39 -0800 Date: Sat, 6 Nov 2004 13:49:37 -0800 From: Andrew Morton To: Esben Nielsen Cc: davem@redhat.com, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch 1/9] arcnet fixes Message-Id: <20041106134937.331a0e6a.akpm@osdl.org> In-Reply-To: References: <20041029133923.66dd719f.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11531 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 194 Lines: 7 Esben Nielsen wrote: > > Did you ever get the patch fixing the original patch? I did, thanks. It's in -mm kernels. I'll respam Dave and Jeff with it on a regular basis ;) From jdmason@us.ibm.com Sat Nov 6 14:00:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 14:00:48 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6M0gi8026960 for ; Sat, 6 Nov 2004 14:00:43 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA6M0KAd633350 for ; Sat, 6 Nov 2004 17:00:20 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA6M0Kv5254114 for ; Sat, 6 Nov 2004 15:00:20 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA6M0JHx004370 for ; Sat, 6 Nov 2004 15:00:19 -0700 Received: from sig-9-65-57-66.mts.ibm.com (sig-9-65-57-66.mts.ibm.com [9.65.57.66]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA6M0JdE004360; Sat, 6 Nov 2004 15:00:19 -0700 From: Jon Mason Organization: IBM To: Francois Romieu Subject: Re: [PATCH 1/3] r8169: non-NAPI netif_poll_disable removal Date: Sat, 6 Nov 2004 09:30:27 +0000 User-Agent: KMail/1.7 Cc: netdev@oss.sgi.com, jgarzik@pobox.com References: <200411021203.17013.jdmason@us.ibm.com> <20041106145618.GA4895@electric-eye.fr.zoreil.com> In-Reply-To: <20041106145618.GA4895@electric-eye.fr.zoreil.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411060930.27106.jdmason@us.ibm.com> X-archive-position: 11532 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 950 Lines: 22 On Saturday 06 November 2004 02:56 pm, Francois Romieu wrote: [...] > Yep but it seems to me that there is still a window for a race with NAPI > if the relevant error path is taken: > > 1 - Tx timeout > 2 - rtl8169_reset_task: netif_poll_disable is issued. Assume that the > refilling of the Rx buffers fails -> rtl8169_reset_task schedules > itself for later > 3 - operator closes the device: netif_running(dev) == 0 and rtl8169_close() > is issued > 4 - rtl8169_close() loops on netif_poll_disable() There is an overall problem with the rtl8169_reset_task. While the driver continues to receive packets, can't allcate any new rx buffers, or the rx dma engine is hung and no rx buffers are processed, the rtl8169_reset_task will schedule itself and loop forever (as dirty_rx != cur_rx). It seems to me a better idea to just remove the dirty_rx == cur_rx check, and let the function clean-up the mess the driver/adapter is in. From romieu@fr.zoreil.com Sat Nov 6 15:40:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Nov 2004 15:40:15 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA6Ne3sW029400 for ; Sat, 6 Nov 2004 15:40:04 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA6Nc1vr012997; Sun, 7 Nov 2004 00:38:01 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA6Nc0gE012996; Sun, 7 Nov 2004 00:38:00 +0100 Date: Sun, 7 Nov 2004 00:38:00 +0100 From: Francois Romieu To: Jon Mason Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 1/3] r8169: non-NAPI netif_poll_disable removal Message-ID: <20041106233800.GB4895@electric-eye.fr.zoreil.com> References: <200411021203.17013.jdmason@us.ibm.com> <20041106145618.GA4895@electric-eye.fr.zoreil.com> <200411060930.27106.jdmason@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411060930.27106.jdmason@us.ibm.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11533 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 8160 Lines: 281 Jon Mason : [...] > There is an overall problem with the rtl8169_reset_task. While the driver > continues to receive packets, can't allcate any new rx buffers, or the rx dma > engine is hung and no rx buffers are processed, the rtl8169_reset_task will > schedule itself and loop forever (as dirty_rx != cur_rx). rtl8169_reset_task() is issued after a rtl8169_hw_reset() which should disable the Rx/Tx DMA activity. dirty_rx == cur_rx means a complete Rx ring refill. At first sight, I'd say that a partially refilled Rx ring is still usable if it verifies 0 < dirty_rx % NUM_RX_DESC < cur_rx % NUM_RX_DESC or cur_rx % NUM_RX_DESC == 0. I prefer to simply test for a complete refill. Regarding the initial issue, what about the second patch below (against 2.6.10-rc1-bk15 + latest Jeff's netdev + first patch) ? It is a bit paranoid but an user already reported a PCI error interruption on x86 so it should be possible to have a PCI error close to a Tx watchdog event. Despite what I claimed before, netif_queue_stopped() is not enough to synchronize the tasks. diff -puN drivers/net/r8169.c~r8169-250 drivers/net/r8169.c --- linux-2.6.10-rc1/drivers/net/r8169.c~r8169-250 2004-11-06 21:49:00.000000000 +0100 +++ linux-2.6.10-rc1-fr/drivers/net/r8169.c 2004-11-06 21:49:00.000000000 +0100 @@ -1742,10 +1742,17 @@ static void rtl8169_schedule_work(struct static void rtl8169_wait_for_quiescence(struct net_device *dev) { + struct rtl8169_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ netif_poll_disable(dev); + + RTL_W16(IntrMask, 0x0000); + + netif_poll_enable(dev); } static void rtl8169_reinit_task(void *_data) diff -puN drivers/net/r8169.c~r8169-260 drivers/net/r8169.c --- linux-2.6.10-rc1/drivers/net/r8169.c~r8169-260 2004-11-06 23:50:59.000000000 +0100 +++ linux-2.6.10-rc1-fr/drivers/net/r8169.c 2004-11-07 00:19:02.000000000 +0100 @@ -150,6 +150,12 @@ enum phy_version { RTL_GIGA_PHY_VER_G = 0x07, /* PHY Reg 0x03 bit0-3 == 0x0002 */ }; +enum drv_state { + R8169_STATE_NONE = 0, + R8169_STATE_UP, + R8169_STATE_DOWN, + R8169_STATE_TX_TIMEOUT, +}; #define _R(NAME,MAC,MASK) \ { .name = NAME, .mac_version = MAC, .RxConfigMask = MASK } @@ -403,6 +409,7 @@ struct rtl8169_private { unsigned int (*phy_reset_pending)(void __iomem *); unsigned int (*link_ok)(void __iomem *); struct work_struct task; + unsigned int state; }; MODULE_AUTHOR("Realtek"); @@ -423,6 +430,7 @@ static void rtl8169_hw_start(struct net_ static int rtl8169_close(struct net_device *dev); static void rtl8169_set_rx_mode(struct net_device *dev); static void rtl8169_tx_timeout(struct net_device *dev); +static void rtl8169_work(void *); static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); @@ -1480,13 +1488,15 @@ rtl8169_open(struct net_device *dev) if (retval < 0) goto err_free_rx; - INIT_WORK(&tp->task, NULL, dev); + INIT_WORK(&tp->task, rtl8169_work, dev); rtl8169_hw_start(dev); rtl8169_request_timer(dev); rtl8169_check_link_status(dev, tp, tp->mmio_addr); + + netif_poll_enable(dev); out: return retval; @@ -1506,6 +1516,8 @@ static void rtl8169_hw_reset(void __iome /* Disable interrupts */ RTL_W16(IntrMask, 0x0000); + RTL_W16(IntrStatus, 0x0000); + /* Reset the chipset */ RTL_W8(ChipCmd, CmdReset); @@ -1732,11 +1744,8 @@ static void rtl8169_tx_clear(struct rtl8 tp->cur_tx = tp->dirty_tx = 0; } -static void rtl8169_schedule_work(struct net_device *dev, void (*task)(void *)) +static void rtl8169_schedule_work(struct rtl8169_private *tp) { - struct rtl8169_private *tp = netdev_priv(dev); - - PREPARE_WORK(&tp->task, task, dev); schedule_delayed_work(&tp->task, 4); } @@ -1750,38 +1759,30 @@ static void rtl8169_wait_for_quiescence( /* Wait for any pending NAPI task to complete */ netif_poll_disable(dev); - RTL_W16(IntrMask, 0x0000); + RTL_W16(IntrMask, 0x00); netif_poll_enable(dev); } -static void rtl8169_reinit_task(void *_data) +static int rtl8169_down_task(struct net_device *dev) { - struct net_device *dev = _data; - int ret; + struct rtl8169_private *tp = netdev_priv(dev); + unsigned long flags; - if (netif_running(dev)) { - rtl8169_wait_for_quiescence(dev); - rtl8169_close(dev); - } + rtl8169_wait_for_quiescence(dev); + rtl8169_close(dev); - ret = rtl8169_open(dev); - if (unlikely(ret < 0)) { - if (net_ratelimit()) { - printk(PFX KERN_ERR "%s: reinit failure (status = %d)." - " Rescheduling.\n", dev->name, ret); - } - rtl8169_schedule_work(dev, rtl8169_reinit_task); - } + spin_lock_irqsave(&tp->lock, flags); + tp->state = R8169_STATE_UP; + spin_unlock_irqrestore(&tp->lock, flags); + + return 0; } -static void rtl8169_reset_task(void *_data) +static int rtl8169_reset_task(struct net_device *dev) { - struct net_device *dev = _data; struct rtl8169_private *tp = netdev_priv(dev); - - if (!netif_running(dev)) - return; + int ret = 0; rtl8169_wait_for_quiescence(dev); @@ -1792,23 +1793,81 @@ static void rtl8169_reset_task(void *_da rtl8169_init_ring_indexes(tp); rtl8169_hw_start(dev); netif_wake_queue(dev); + } else + ret = -EAGAIN; + + return ret; +} + +static void rtl8169_work(void *_data) +{ + struct net_device *dev = _data; + struct rtl8169_private *tp = netdev_priv(dev); + unsigned long flags; + static struct { + int (*action)(struct net_device *); + unsigned int state; + } rtl8169_recovery_task[] = { + { rtl8169_reset_task, R8169_STATE_TX_TIMEOUT }, + { rtl8169_down_task, R8169_STATE_DOWN }, + { rtl8169_open, R8169_STATE_UP }, + { NULL, R8169_STATE_NONE } + }, *p; + + if (!netif_running(dev)) + return; + + spin_lock_irqsave(&tp->lock, flags); + for (p = rtl8169_recovery_task; p->action; p++) { + if (p->state == tp->state) + break; + } + spin_unlock_irqrestore(&tp->lock, flags); + + if (likely(p->action)) { + int ret; + + ret = p->action(dev); + + spin_lock_irqsave(&tp->lock, flags); + + if ((ret < 0) || (p->state != tp->state)) { + if ((ret < 0) && net_ratelimit()) { + printk(PFX KERN_ERR + "%s: task failed (%p). Rescheduling.\n", + dev->name, p->action); + } + rtl8169_schedule_work(tp); + } else + tp->state = R8169_STATE_NONE; + + spin_unlock_irqrestore(&tp->lock, flags); } else { - if (net_ratelimit()) { - printk(PFX KERN_EMERG "%s: Rx buffers shortage\n", - dev->name); - } - rtl8169_schedule_work(dev, rtl8169_reset_task); + printk(PFX KERN_ERR "%s: nothing to do in delayed task.\n", + dev->name); } } static void rtl8169_tx_timeout(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); + unsigned long flags; rtl8169_hw_reset(tp->mmio_addr); - /* Let's wait a bit while any (async) irq lands on */ - rtl8169_schedule_work(dev, rtl8169_reset_task); + spin_lock_irqsave(&tp->lock, flags); + + /* + * Let's wait a bit while any (async) irq lands on. + * A racing pci error recovery task should be able to recover + * from a TX timeout as well: no need to insist. + */ + if (likely(tp->state == R8169_STATE_NONE)) { + tp->state = R8169_STATE_TX_TIMEOUT; + rtl8169_schedule_work(tp); + } + + spin_unlock_irqrestore(&tp->lock, flags); } static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb, @@ -1977,11 +2036,20 @@ static void rtl8169_pcierr_interrupt(str /* The infamous DAC f*ckup only happens at boot time */ if ((tp->cp_cmd & PCIDAC) && (tp->dirty_rx == tp->cur_rx == 0)) { + unsigned long flags; + printk(KERN_INFO PFX "%s: disabling PCI DAC.\n", dev->name); tp->cp_cmd &= ~PCIDAC; RTL_W16(CPlusCmd, tp->cp_cmd); dev->features &= ~NETIF_F_HIGHDMA; - rtl8169_schedule_work(dev, rtl8169_reinit_task); + + spin_lock_irqsave(&tp->lock, flags); + + if (likely(tp->state == R8169_STATE_NONE)) + rtl8169_schedule_work(tp); + tp->state = R8169_STATE_DOWN; + + spin_unlock_irqrestore(&tp->lock, flags); } rtl8169_hw_reset(ioaddr); _ From herbert@gondor.apana.org.au Sun Nov 7 00:09:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 00:09:38 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA789HOC016596 for ; Sun, 7 Nov 2004 00:09:18 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CQi6T-0003RF-00; Sun, 07 Nov 2004 19:08:49 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CQi6K-0006oK-00; Sun, 07 Nov 2004 19:08:40 +1100 Date: Sun, 7 Nov 2004 19:08:39 +1100 To: "David S. Miller" Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-ID: <20041107080839.GA26158@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041102220603.GA13312@gondor.apana.org.au> <20041103155438.07a219ad.davem@davemloft.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="HlL+5n6rz5pIUxbD" Content-Disposition: inline In-Reply-To: <20041103155438.07a219ad.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11534 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 3428 Lines: 111 --HlL+5n6rz5pIUxbD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 03, 2004 at 03:54:38PM -0800, David S. Miller wrote: > > Can you cook up a 2.4.x version of this Herbert? The new neighbour > code is now there too. Sure. BTW this bug is a lot older than the new neighbours code. It's in the very first revision of neighbour.c :) Here is a patch for 2.4. I simply used atomic_read instead of doing atomic_inc_return as in 2.6 since I thought that the downside of going a bit over gc_thresh3 wasn't worth the trouble of back-porting all the atomic_*_return work. Of course if that ever gets backported then we can do what 2.6 does here too. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --HlL+5n6rz5pIUxbD Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== include/net/neighbour.h 1.4 vs edited ===== --- 1.4/include/net/neighbour.h 2004-10-06 04:22:37 +10:00 +++ edited/include/net/neighbour.h 2004-11-07 19:03:05 +11:00 @@ -174,7 +174,7 @@ struct timer_list gc_timer; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; - int entries; + atomic_t entries; rwlock_t lock; unsigned long last_rand; struct neigh_parms *parms_list; ===== net/core/neighbour.c 1.14 vs edited ===== --- 1.14/net/core/neighbour.c 2004-10-06 04:40:25 +10:00 +++ edited/net/core/neighbour.c 2004-11-07 19:04:24 +11:00 @@ -257,11 +257,11 @@ struct neighbour *n; unsigned long now = jiffies; - if (tbl->entries > tbl->gc_thresh3 || - (tbl->entries > tbl->gc_thresh2 && + if (atomic_read(&tbl->entries) > tbl->gc_thresh3 || + (atomic_read(&tbl->entries) > tbl->gc_thresh2 && now - tbl->last_flush > 5*HZ)) { if (neigh_forced_gc(tbl) == 0 && - tbl->entries > tbl->gc_thresh3) + atomic_read(&tbl->entries) > tbl->gc_thresh3) return NULL; } @@ -282,7 +282,7 @@ n->timer.data = (unsigned long)n; NEIGH_CACHE_STAT_INC(tbl, allocs); neigh_glbl_allocs++; - tbl->entries++; + atomic_inc(&tbl->entries); n->tbl = tbl; atomic_set(&n->refcnt, 1); n->dead = 1; @@ -428,7 +428,7 @@ hash_val = tbl->hash(pkey, dev) & tbl->hash_mask; write_lock_bh(&tbl->lock); - if (tbl->entries > (tbl->hash_mask + 1)) + if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1)) neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1); for (n1 = tbl->hash_buckets[hash_val]; n1; n1 = n1->next) { if (dev == n1->dev && @@ -583,7 +583,7 @@ NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); neigh_glbl_allocs--; - neigh->tbl->entries--; + atomic_dec(&neigh->tbl->entries); kmem_cache_free(neigh->tbl->kmem_cachep, neigh); } @@ -1306,7 +1306,7 @@ del_timer_sync(&tbl->proxy_timer); pneigh_queue_purge(&tbl->proxy_queue); neigh_ifdown(tbl, NULL); - if (tbl->entries) + if (atomic_read(&tbl->entries)) printk(KERN_CRIT "neighbour leakage\n"); write_lock(&neigh_tbl_lock); for (tp = &neigh_tables; *tp; tp = &(*tp)->next) { @@ -1858,7 +1858,7 @@ seq_printf(seq, "%08x %08lx %08lx %08lx %08lx %08lx %08lx " "%08lx %08lx %08lx %08lx\n", - tbl->entries, + atomic_read(&tbl->entries), st->allocs, st->destroys, --HlL+5n6rz5pIUxbD-- From kaber@trash.net Sun Nov 7 00:58:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 00:58:09 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA78w4cs021405 for ; Sun, 7 Nov 2004 00:58:04 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQire-0002nI-Pf; Sun, 07 Nov 2004 09:57:34 +0100 Message-ID: <418DE37E.2050504@trash.net> Date: Sun, 07 Nov 2004 09:57:34 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <20041105141640.GQ19714@rei.reeler.org> <418BA66A.60804@trash.net> <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> In-Reply-To: <20041106145036.GB28715@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11535 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1868 Lines: 50 Thomas Graf wrote: >So using the RCU protected list only enforces the unlinking >to be safe while within a list walk and the rcu callback >to be deferred until the list walk is complete but may >be executed right after qdisc_lookup and then may free the >entry that was returned. > >So we must either rcu_read_lock all codeblocks that use >a result of a qdisc_lookup which is not trivial or ensure >that all rcu callbacks have finished before the next rtnetlink >message is processed. > >Maybe the easiest would be to have a refcnt which is >incremented when a rcu callback is set up and decremented >when it finishs and sleep on it after processing a >rtnetlink message until it reaches 0 again. > >Thoughts? > > Before the RCU change distruction of the qdisc and all inner qdiscs happend immediately and under the rtnl semaphore. This made sure nothing holding the rtnl semaphore could end up with invalid memory. This is not true anymore, qdiscs found on dev->qdisc_list can be suddenly destroyed. dev->qdisc_list is protected by qdisc_tree_lock everywhere but in qdisc_lookup, this is also the only structure that is consistently protected by this lock. To fix the list corruption we can either protect qdisc_lookup with qdisc_tree_lock or use rcu-list macros and remove all read_lock(&qdisc_tree_locks) (and replace it by a spinlock). Unfortunately, since we can not rely on the rtnl protection for memory anymore, it seems we need to refcount all uses of dev->qdisc_list that before relied on this protection and can't use rcu_read_lock. To make this safe, we need to atomically atomic_dec_and_test/list_del in qdisc_destroy and atomically do list_for_each_entry/atomic_inc in qdisc_lookup, so we should should simply keep the non-rcu lists and use qdisc_tree_lock in qdisc_lookup. I'm working on a patch, but it will take a few days. Regards Patrick From tgraf@suug.ch Sun Nov 7 06:00:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 06:00:19 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7E0DFs007295 for ; Sun, 7 Nov 2004 06:00:14 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 127ACF; Sun, 7 Nov 2004 14:59:33 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 95E771C0E9; Sun, 7 Nov 2004 15:00:15 +0100 (CET) Date: Sun, 7 Nov 2004 15:00:15 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041107140015.GA31969@postel.suug.ch> References: <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418DE37E.2050504@trash.net> X-archive-position: 11536 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 2556 Lines: 55 > Before the RCU change distruction of the qdisc and all inner > qdiscs happend immediately and under the rtnl semaphore. This > made sure nothing holding the rtnl semaphore could end up with > invalid memory. This is not true anymore, qdiscs found on > dev->qdisc_list can be suddenly destroyed. And we should switch back to this again if possible. I haven't audited all paths to dev_activate but we have at most a list addition which might not be protected with an rtnl semaphore. I'm not 100% sure about this yet. > dev->qdisc_list is protected by qdisc_tree_lock everywhere but in > qdisc_lookup, this is also the only structure that is consistently > protected by this lock. To fix the list corruption we can either > protect qdisc_lookup with qdisc_tree_lock or use rcu-list macros > and remove all read_lock(&qdisc_tree_locks) (and replace it by > a spinlock). qdisc_lookup was the only one not yet protected by a preempt disable. > Unfortunately, since we can not rely on the rtnl protection for > memory anymore, it seems we need to refcount all uses of > dev->qdisc_list that before relied on this protection and can't > use rcu_read_lock. There is no list iteration not yet protected by the rtnl semaphore and the only interruption is because of the rcu callback. > To make this safe, we need to atomically > atomic_dec_and_test/list_del in qdisc_destroy and atomically do > list_for_each_entry/atomic_inc in qdisc_lookup, so we should > should simply keep the non-rcu lists and use qdisc_tree_lock > in qdisc_lookup. You mean before qdisc_lookup and until the reference is released again? These are huge locking regions involving calls which might sleep and possible qdisc_destroy calling paths. So this won't work quite well. So in my opinion we should screw that call_rcu because it doesn't make much sense. In case dev_activate is not synchronized with rtnl sempaphore we have to make sure that qdisc_destroy always locks on qdisc_tree_lock which is not the case for a few paths as of now, although I'm not sure if any of those actually ever call qdisc_destroy with refcnt==1. If screwing call_rcu is not possible we can still do a refcnt incremented before call_rcu in qdisc_destroy and every base caller of qdisc_destroy (excluding those in qdisc destroy routines) sleeps on it after it invoked qdisc_destroy and reached a safe place to sleep. So we can make sure that the qdisc is really gone after invoking qdisc_destroy. Otherwise we will always run into troubles with new messages arriving and qdisc deletions still pending. From kaber@trash.net Sun Nov 7 08:20:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 08:20:31 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7GKPrW015103 for ; Sun, 7 Nov 2004 08:20:25 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQplm-0003Hy-GI; Sun, 07 Nov 2004 17:19:58 +0100 Message-ID: <418E4B2E.1070407@trash.net> Date: Sun, 07 Nov 2004 17:19:58 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <20041105163951.GY12289@postel.suug.ch> <418BB7D2.6060908@trash.net> <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> In-Reply-To: <20041107140015.GA31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11537 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 911 Lines: 25 Thomas Graf wrote: >You mean before qdisc_lookup and until the reference is released >again? These are huge locking regions involving calls which might >sleep and possible qdisc_destroy calling paths. So this won't >work quite well. > Who cares about huge sections while holding reference counts ? qdisc_destroy won't destroy the qdisc until all references have been dropped, that's the whole point of it. >So in my opinion we should screw that call_rcu because it doesn't >make much sense. In case dev_activate is not synchronized with >rtnl sempaphore we have to make sure that qdisc_destroy always >locks on qdisc_tree_lock which is not the case for a few paths as >of now, although I'm not sure if any of those actually ever call >qdisc_destroy with refcnt==1. > > I'm also fixing up the remaining locking bugs, so before we start reverting things lets just wait and see how it gets. Regards Patrick From tgraf@suug.ch Sun Nov 7 08:33:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 08:33:33 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7GXSqU015786 for ; Sun, 7 Nov 2004 08:33:29 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 99C92F; Sun, 7 Nov 2004 17:32:47 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 4542B1C0E9; Sun, 7 Nov 2004 17:33:30 +0100 (CET) Date: Sun, 7 Nov 2004 17:33:30 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041107163330.GB31969@postel.suug.ch> References: <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> <418E4B2E.1070407@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418E4B2E.1070407@trash.net> X-archive-position: 11538 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 898 Lines: 19 > Who cares about huge sections while holding reference counts ? > qdisc_destroy won't destroy the qdisc until all references have > been dropped, that's the whole point of it. I might have misunderstood you in this point, so you increment a refcnt in qdisc_lookup and decrement in once you're done with the reference? I thought you wanted to to bh spin locks. I'm not sure how you want to do this without creating races. Example: We get a RTM_DELQDISC request so you'll increment refcnt in qdisc_lookup and decrement it right before you call qdisc_destroy so it actually can be deleted. The rcu callback works fine and will set up a another rcu callback for the destroying of the inner qdiscs. Right at this time you get a RTM_GETQDISC for that inner qdisc so you'll lock on it, then the rcu callback comes in and cannot delete the inner qdisc anymore. Do you want to sleep in softirq context? From kaber@trash.net Sun Nov 7 09:03:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 09:03:22 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7H3Ibl017002 for ; Sun, 7 Nov 2004 09:03:18 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQqRI-0003Mx-RZ; Sun, 07 Nov 2004 18:02:52 +0100 Message-ID: <418E553C.2070006@trash.net> Date: Sun, 07 Nov 2004 18:02:52 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <20041105175812.GZ12289@postel.suug.ch> <418BC40E.8080402@trash.net> <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> <418E4B2E.1070407@trash.net> <20041107163330.GB31969@postel.suug.ch> In-Reply-To: <20041107163330.GB31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11539 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1349 Lines: 32 Thomas Graf wrote: >I might have misunderstood you in this point, so you increment a >refcnt in qdisc_lookup and decrement in once you're done with >the reference? I thought you wanted to to bh spin locks. I'm not >sure how you want to do this without creating races. > >Example: > >We get a RTM_DELQDISC request so you'll increment refcnt in >qdisc_lookup and decrement it right before you call qdisc_destroy >so it actually can be deleted. The rcu callback works fine >and will set up a another rcu callback for the destroying of >the inner qdiscs. Right at this time you get a RTM_GETQDISC for >that inner qdisc so you'll lock on it, then the rcu callback >comes in and cannot delete the inner qdisc anymore. Do you want >to sleep in softirq context? > This can't happen. Once the inner qdiscs refcnt drops to zero they are removed from the list, before the rcu callback is scheduled. Once the RCU callback is scheduled it can't be found anymore. BTW: An alternative, quite unintrusive solution is to prevent anyone from finding the inner qdiscs after the outer one has been destroyed. This can be done be keeping inner qdiscs on qdisc->qdisc_list and only keep the top-level qdisc in struct net_device. Of course, this makes walking all qdiscs more complicated. A generation counter for the top-level qdisc should also work. Regards Patrick From tgraf@suug.ch Sun Nov 7 09:49:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 09:49:21 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7Hn7MU018492 for ; Sun, 7 Nov 2004 09:49:16 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 21131F; Sun, 7 Nov 2004 18:48:27 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 19BDF1C0E9; Sun, 7 Nov 2004 18:49:10 +0100 (CET) Date: Sun, 7 Nov 2004 18:49:09 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041107174909.GC31969@postel.suug.ch> References: <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> <418E4B2E.1070407@trash.net> <20041107163330.GB31969@postel.suug.ch> <418E553C.2070006@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418E553C.2070006@trash.net> X-archive-position: 11540 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1958 Lines: 41 > >We get a RTM_DELQDISC request so you'll increment refcnt in > >qdisc_lookup and decrement it right before you call qdisc_destroy > >so it actually can be deleted. The rcu callback works fine > >and will set up a another rcu callback for the destroying of > >the inner qdiscs. Right at this time you get a RTM_GETQDISC for > >that inner qdisc so you'll lock on it, then the rcu callback > >comes in and cannot delete the inner qdisc anymore. Do you want > >to sleep in softirq context? > > > This can't happen. Once the inner qdiscs refcnt drops to zero > they are removed from the list, before the rcu callback is scheduled. > Once the RCU callback is scheduled it can't be found anymore. Right, but what about when the RTM_GETQDISC comes in before the first rcu callback is invoked? I'm not sure if this can happen in practice though. Anyways, I do think we should force the task to be completed, or at least all the list unlinking, before the rtnl semaphore is given back. I'm fine with postponing the deletion of the object but not to postpone list manipulations even if we cannot reproduce it now. We might be able to get a working solution for now but this unneeded async behaviour will definitely cause much troubles in the future. I think no function that can be invoked from softirq context should ever have the chance to sleep even if there is no path at the moment. Why bother about this when we can move the possible sleep into a user context only area? > BTW: An alternative, quite unintrusive solution is to prevent anyone > from finding the inner qdiscs after the outer one has been destroyed. > This can be done be keeping inner qdiscs on qdisc->qdisc_list and only > keep the top-level qdisc in struct net_device. Of course, this makes > walking all qdiscs more complicated. A generation counter for the > top-level qdisc should also work. I agree, that's rather non trivial. I'll wait for your patch but it's wrong in my eyes ;-> From kaber@trash.net Sun Nov 7 10:22:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 10:22:38 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7IMYTc019795 for ; Sun, 7 Nov 2004 10:22:35 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQrg0-0004gq-4A; Sun, 07 Nov 2004 19:22:08 +0100 Message-ID: <418E67D0.8010301@trash.net> Date: Sun, 07 Nov 2004 19:22:08 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs References: <20041105194303.GA12289@postel.suug.ch> <20041106011843.GI12289@postel.suug.ch> <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> <418E4B2E.1070407@trash.net> <20041107163330.GB31969@postel.suug.ch> <418E553C.2070006@trash.net> <20041107174909.GC31969@postel.suug.ch> In-Reply-To: <20041107174909.GC31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11541 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 536 Lines: 17 Thomas Graf wrote: >Anyways, I do think we should force the task to be completed, or >at least all the list unlinking, before the rtnl semaphore is given >back. I'm fine with postponing the deletion of the object but not >to postpone list manipulations even if we cannot reproduce it now. > > This is what I'm doing now, your patch to set qdisc->parent makes this very easy :) Simply remove all qdiscs with (TC_H_MAJ(q->parent) == TC_H_MAJ(qdisc->handle)) from dev->qdisc_list when a classful qdisc is destroyed. Regards Patrick From tgraf@suug.ch Sun Nov 7 11:08:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 11:08:44 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7J8d7B021416 for ; Sun, 7 Nov 2004 11:08:40 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id D390EF; Sun, 7 Nov 2004 20:07:59 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id B10EF1C0E9; Sun, 7 Nov 2004 20:08:41 +0100 (CET) Date: Sun, 7 Nov 2004 20:08:41 +0100 From: Thomas Graf To: Patrick McHardy Cc: davem@davemloft.net, netdev@oss.sgi.com, spam@crocom.com.pl, kuznet@ms2.inr.ac.ru, jmorris@redhat.com Subject: Re: [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Message-ID: <20041107190841.GD31969@postel.suug.ch> References: <418C2D40.9020300@trash.net> <20041106015931.GA28715@postel.suug.ch> <20041106145036.GB28715@postel.suug.ch> <418DE37E.2050504@trash.net> <20041107140015.GA31969@postel.suug.ch> <418E4B2E.1070407@trash.net> <20041107163330.GB31969@postel.suug.ch> <418E553C.2070006@trash.net> <20041107174909.GC31969@postel.suug.ch> <418E67D0.8010301@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418E67D0.8010301@trash.net> X-archive-position: 11542 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 585 Lines: 12 > >Anyways, I do think we should force the task to be completed, or > >at least all the list unlinking, before the rtnl semaphore is given > >back. I'm fine with postponing the deletion of the object but not > >to postpone list manipulations even if we cannot reproduce it now. > > This is what I'm doing now, your patch to set qdisc->parent makes > this very easy :) Simply remove all qdiscs with > (TC_H_MAJ(q->parent) == TC_H_MAJ(qdisc->handle)) from > dev->qdisc_list when a classful qdisc is destroyed. Great, that's even better, speeds up deletion of big class trees. Thanks. From kaber@trash.net Sun Nov 7 14:23:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 14:23:12 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7MN5DU030933 for ; Sun, 7 Nov 2004 14:23:06 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQvQo-000118-8S; Sun, 07 Nov 2004 23:22:42 +0100 Message-ID: <418EA032.7050507@trash.net> Date: Sun, 07 Nov 2004 23:22:42 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Szymon Miotk CC: netdev@oss.sgi.com, Thomas Graf Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> In-Reply-To: <418B4C7C.8000402@crocom.com.pl> Content-Type: multipart/mixed; boundary="------------090005050602060004080505" X-archive-position: 11544 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2625 Lines: 90 This is a multi-part message in MIME format. --------------090005050602060004080505 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Szymon Miotk wrote: > This mail was posted 02-11-2004 to linux-net@vger.kernel.org, but I > got no response at all, so I am resending it. > > [1.] One line summary of the problem: > IProute hangs after running traffic shaping scripts Can you test if this patch helps please ? It immediately removes all inner qdiscs of classful qdiscs from dev->qdisc_list, making it impossible for anyone to look up an inner qdisc that is about to get destroyed. Taking qdisc_tree_lock in qdisc_lookup is not really necessary with this patch anymore, since all changes to dev->qdisc_list happen under the rtnl again (which is also relied on for memory). I put it in anyways for now until I have fully analyzed locking. Regards Patrick --------------090005050602060004080505 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" ===== net/sched/sch_api.c 1.42 vs edited ===== --- 1.42/net/sched/sch_api.c 2004-11-07 05:03:04 +01:00 +++ edited/net/sched/sch_api.c 2004-11-07 22:59:52 +01:00 @@ -194,13 +194,15 @@ struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) { - struct Qdisc *q; + struct Qdisc *q = NULL; + read_lock_bh(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { if (q->handle == handle) - return q; + break; } - return NULL; + read_unlock_bh(&qdisc_tree_lock); + return q; } struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid) ===== net/sched/sch_generic.c 1.30 vs edited ===== --- 1.30/net/sched/sch_generic.c 2004-11-06 01:34:45 +01:00 +++ edited/net/sched/sch_generic.c 2004-11-07 22:37:55 +01:00 @@ -483,10 +483,30 @@ void qdisc_destroy(struct Qdisc *qdisc) { + struct list_head cql = LIST_HEAD_INIT(cql); + struct Qdisc *cq, *q, *n; + if (qdisc->flags & TCQ_F_BUILTIN || !atomic_dec_and_test(&qdisc->refcnt)) return; + list_del(&qdisc->list); + + /* unlink inner qdiscs from dev->qdisc_list immediately */ + if (qdisc->ops->cl_ops != NULL) + list_add(&qdisc->list, &cql); + list_for_each_entry(cq, &cql, list) { + list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list) + if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) { + if (q->ops->cl_ops != NULL) + list_move_tail(&q->list, &cql); + else + list_del_init(&q->list); + } + } + list_for_each_entry_safe(cq, n, &cql, list) + list_del_init(&cq->list); + call_rcu(&qdisc->q_rcu, __qdisc_destroy); } --------------090005050602060004080505-- From kaber@trash.net Sun Nov 7 14:41:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 14:41:58 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7MfoLs031651 for ; Sun, 7 Nov 2004 14:41:51 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQvix-00015N-LZ; Sun, 07 Nov 2004 23:41:27 +0100 Message-ID: <418EA497.10302@trash.net> Date: Sun, 07 Nov 2004 23:41:27 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: [PATCH 2.6 PKT_SCHED]: Fix scheduler/classifier module unload race Content-Type: multipart/mixed; boundary="------------090303090605070009050009" X-archive-position: 11545 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2699 Lines: 99 This is a multi-part message in MIME format. --------------090303090605070009050009 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit This patch fixes an scheduler/classifier module unload race. struct Qdisc_ops which includes the owner field is also part of the module's memory, so ops might already be freed when try_module_get(ops->owner) is called outside of the locked section. Regards Patrick --------------090303090605070009050009 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/07 05:03:11+01:00 kaber@coreworks.de # [PKT_SCHED]: Fix scheduler/classifier module unload race # # Signed-off-by: Patrick McHardy # # net/sched/sch_api.c # 2004/11/07 05:03:04+01:00 kaber@coreworks.de +4 -4 # [PKT_SCHED]: Fix scheduler/classifier module unload race # # Signed-off-by: Patrick McHardy # # net/sched/cls_api.c # 2004/11/07 05:03:04+01:00 kaber@coreworks.de +4 -6 # [PKT_SCHED]: Fix scheduler/classifier module unload race # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/cls_api.c b/net/sched/cls_api.c --- a/net/sched/cls_api.c 2004-11-07 23:32:50 +01:00 +++ b/net/sched/cls_api.c 2004-11-07 23:32:50 +01:00 @@ -60,8 +60,11 @@ if (kind) { read_lock(&cls_mod_lock); for (t = tcf_proto_base; t; t = t->next) { - if (rtattr_strcmp(kind, t->kind) == 0) + if (rtattr_strcmp(kind, t->kind) == 0) { + if (!try_module_get(t->owner)) + t = NULL; break; + } } read_unlock(&cls_mod_lock); } @@ -231,11 +234,6 @@ tp->q = q; tp->classify = tp_ops->classify; tp->classid = parent; - err = -EBUSY; - if (!try_module_get(tp_ops->owner)) { - kfree(tp); - goto errout; - } if ((err = tp_ops->init(tp)) != 0) { module_put(tp_ops->owner); kfree(tp); diff -Nru a/net/sched/sch_api.c b/net/sched/sch_api.c --- a/net/sched/sch_api.c 2004-11-07 23:32:50 +01:00 +++ b/net/sched/sch_api.c 2004-11-07 23:32:50 +01:00 @@ -229,8 +229,11 @@ if (kind) { read_lock(&qdisc_mod_lock); for (q = qdisc_base; q; q = q->next) { - if (rtattr_strcmp(kind, q->id) == 0) + if (rtattr_strcmp(kind, q->id) == 0) { + if (!try_module_get(q->owner)) + q = NULL; break; + } } read_unlock(&qdisc_mod_lock); } @@ -408,9 +411,6 @@ err = -EINVAL; if (ops == NULL) - goto err_out; - err = -EBUSY; - if (!try_module_get(ops->owner)) goto err_out; /* ensure that the Qdisc and the private data are 32-byte aligned */ --------------090303090605070009050009-- From romieu@fr.zoreil.com Sun Nov 7 14:52:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 14:52:14 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA7Mq7Xh032193 for ; Sun, 7 Nov 2004 14:52:08 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA7Mm3vr030644; Sun, 7 Nov 2004 23:48:03 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA7Mm3w0030643; Sun, 7 Nov 2004 23:48:03 +0100 Date: Sun, 7 Nov 2004 23:48:03 +0100 From: Francois Romieu To: seby@focomunicatii.ro Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: ZyXEL GN650-T Message-ID: <20041107224803.GA29248@electric-eye.fr.zoreil.com> References: <20041107214427.20301.qmail@focomunicatii.ro> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041107214427.20301.qmail@focomunicatii.ro> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11546 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 285 Lines: 9 seby@focomunicatii.ro : [...] > I just bouth a zyxel GN650T network card .. and it sems that vlan's don't > work on this card .. anybody had this problems with this card .. You are using the in-kernel via-velocity driver on 2.6.something, right ? -- Ueimor From kaber@trash.net Sun Nov 7 17:40:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 17:40:52 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA81ejF2008296 for ; Sun, 7 Nov 2004 17:40:46 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CQyW5-0001Zk-Te; Mon, 08 Nov 2004 02:40:21 +0100 Message-ID: <418ECE85.9090203@trash.net> Date: Mon, 08 Nov 2004 02:40:21 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Szymon Miotk CC: netdev@oss.sgi.com, Thomas Graf Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> In-Reply-To: <418EA032.7050507@trash.net> Content-Type: multipart/mixed; boundary="------------090809090908010403070105" X-archive-position: 11548 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2632 Lines: 92 This is a multi-part message in MIME format. --------------090809090908010403070105 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Patrick McHardy wrote: > Szymon Miotk wrote: > >> This mail was posted 02-11-2004 to linux-net@vger.kernel.org, but I >> got no response at all, so I am resending it. >> >> [1.] One line summary of the problem: >> IProute hangs after running traffic shaping scripts > > > Can you test if this patch helps please ? It immediately removes all > inner qdiscs of classful qdiscs from dev->qdisc_list, making it > impossible for anyone to look up an inner qdisc that is about to get > destroyed. Taking qdisc_tree_lock in qdisc_lookup is not really > necessary with this patch anymore, since all changes to dev->qdisc_list > happen under the rtnl again (which is also relied on for memory). I put > it in anyways for now until I have fully analyzed locking. Please test this patch, the last one had a bug. > > Regards > Patrick > --------------090809090908010403070105 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" ===== net/sched/sch_api.c 1.42 vs edited ===== --- 1.42/net/sched/sch_api.c 2004-11-07 05:03:04 +01:00 +++ edited/net/sched/sch_api.c 2004-11-08 02:38:04 +01:00 @@ -196,10 +196,14 @@ { struct Qdisc *q; + read_lock_bh(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { - if (q->handle == handle) + if (q->handle == handle) { + read_unlock_bh(&qdisc_tree_lock); return q; + } } + read_unlock_bh(&qdisc_tree_lock); return NULL; } ===== net/sched/sch_generic.c 1.30 vs edited ===== --- 1.30/net/sched/sch_generic.c 2004-11-06 01:34:45 +01:00 +++ edited/net/sched/sch_generic.c 2004-11-08 00:08:28 +01:00 @@ -483,10 +483,29 @@ void qdisc_destroy(struct Qdisc *qdisc) { + struct list_head cql = LIST_HEAD_INIT(cql); + struct Qdisc *cq, *q, *n; + if (qdisc->flags & TCQ_F_BUILTIN || !atomic_dec_and_test(&qdisc->refcnt)) return; + list_del(&qdisc->list); + + /* unlink inner qdiscs from dev->qdisc_list immediately */ + if (qdisc->ops->cl_ops != NULL) + list_add(&qdisc->list, &cql); + list_for_each_entry(cq, &cql, list) + list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list) + if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) { + if (q->ops->cl_ops != NULL) + list_move_tail(&q->list, &cql); + else + list_del_init(&q->list); + } + list_for_each_entry_safe(cq, n, &cql, list) + list_del_init(&cq->list); + call_rcu(&qdisc->q_rcu, __qdisc_destroy); } --------------090809090908010403070105-- From garzik@havoc.gtf.org Sun Nov 7 18:33:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 18:33:06 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA82X06X010513 for ; Sun, 7 Nov 2004 18:33:01 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id E9ED37712; Sun, 7 Nov 2004 21:32:36 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iA82WarT013450; Sun, 7 Nov 2004 21:32:36 -0500 Date: Sun, 7 Nov 2004 21:32:36 -0500 From: Jeff Garzik To: Andrew Morton , Linus Torvalds Cc: netdev@oss.sgi.com Subject: [BK PATCHES] 2.6.x net driver fixes Message-ID: <20041108023236.GA13437@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11549 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1316 Lines: 47 Please do a bk pull bk://gkernel.bkbits.net/net-drivers-2.6 This will update the following files: drivers/net/Kconfig | 2 +- drivers/net/hamradio/hdlcdrv.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) through these ChangeSets: (04/11/06 1.2473) [PATCH] hamradio/hdlcdrv: undo duplicat patch application Signed-off-by: Jeff Garzik (04/11/06 1.2472) [PATCH] net/Kconfig: undo duplicate patch application Signed-off-by: Jeff Garzik diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig --- a/drivers/net/Kconfig 2004-11-07 21:31:54 -05:00 +++ b/drivers/net/Kconfig 2004-11-07 21:31:54 -05:00 @@ -1681,7 +1681,7 @@ (e.g. VT8235). To compile this driver as a module, choose M here. The module - will be called via-velocity. + will be called via-rhine. config VIA_RHINE_MMIO bool "Use MMIO instead of PIO" diff -Nru a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c --- a/drivers/net/hamradio/hdlcdrv.c 2004-11-07 21:31:54 -05:00 +++ b/drivers/net/hamradio/hdlcdrv.c 2004-11-07 21:31:54 -05:00 @@ -549,8 +549,6 @@ netif_stop_queue(dev); - netif_stop_queue(dev); - if (s->ops && s->ops->close) i = s->ops->close(dev); if (s->skb) From jm@jm.kir.nu Sun Nov 7 18:36:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 18:36:22 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA82aHUp010931 for ; Sun, 7 Nov 2004 18:36:18 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CQzLC-0004Sd-7P; Sun, 07 Nov 2004 18:33:10 -0800 Date: Sun, 7 Nov 2004 18:33:08 -0800 From: Jouni Malinen To: "Luis R. Rodriguez" Cc: prism54-devel@prism54.org, netdev@oss.sgi.com Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041108023308.GA7425@jm.kir.nu> References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> <20041105162507.GO388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105162507.GO388@ruslug.rutgers.edu> User-Agent: Mutt/1.5.6i X-archive-position: 11550 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1197 Lines: 23 On Fri, Nov 05, 2004 at 11:25:07AM -0500, Luis R. Rodriguez wrote: > Jouni, Bell Kin sent you some prism54 hostapd patches. I believe you > actually wrote the work. How are they looking ? I did not write that code; the copyright notice in driver_prism54.c is not correct. The code seems to be for older version of hostapd driver interface API and as such does not work with the current development snapshot. driver_prism54.c seems to be implemented in a way that would remove support for Host AP driver, i.e., it does not follow the driver interface design to allow multiple interfaces and instead just overrides functions used for Host AP driver. In addition, I did not receive any patch file for integrating the driver interface code for Prism54. Someone, ideally the original author, would need to go through these and submit a proper patch to integrate this into the current development version of hostapd without breaking other driver interfaces. I'm not likely to have time to do this myself in the near future, but I'm willing to comment complete patches and answer questions to get this into suitable form.. -- Jouni Malinen PGP id EFC895FA From mcr@sandelman.ottawa.on.ca Sun Nov 7 21:02:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 21:02:37 -0800 (PST) Received: from noxmail.sandelman.ottawa.on.ca (cyphermail.sandelman.ottawa.on.ca [205.150.200.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA852POw020329 for ; Sun, 7 Nov 2004 21:02:29 -0800 Received: from road.marajade.sandelman.ca (road.marajade.sandelman.ca [205.150.200.163]) by noxmail.sandelman.ottawa.on.ca (8.11.6p3/8.11.6) with ESMTP id iA84x1u23084 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified OK); Sun, 7 Nov 2004 23:59:12 -0500 (EST) Received: from sandelman.ottawa.on.ca (marajade [127.0.0.1]) by road.marajade.sandelman.ca (8.12.11/8.12.3/Debian-6.6) with ESMTP id iA84VgTg001608 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 7 Nov 2004 23:59:00 -0500 Received: from marajade.sandelman.ottawa.on.ca (mcr@localhost) by sandelman.ottawa.on.ca (8.12.11/8.12.3/Debian-6.6) with ESMTP id iA7HgC43004043; Sun, 7 Nov 2004 12:42:12 -0500 To: hadi@cyberus.ca cc: KOVACS Krisztian , netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net, vpn-failover@lists.balabit.hu Subject: Re: [RFC] IPSEC failover and replay detection sequence numbers In-Reply-To: Message from jamal of "29 Oct 2004 08:58:41 EDT." <1099054721.1027.118.camel@jzny.localdomain> References: <1099045435.2888.47.camel@nienna.balabit> <1099054721.1027.118.camel@jzny.localdomain> X-Mailer: MH-E 7.4.2; nmh 1.0.4+dev; XEmacs 21.4 (patch 15) Mime-Version: 1.0 (generated by tm-edit 1.8) Content-Type: text/plain; charset=US-ASCII Date: Sun, 07 Nov 2004 12:42:12 -0500 Message-ID: <4042.1099849332@marajade.sandelman.ottawa.on.ca> From: Michael Richardson X-archive-position: 11551 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcr@sandelman.ottawa.on.ca Precedence: bulk X-list: netdev Content-Length: 2074 Lines: 51 -----BEGIN PGP SIGNED MESSAGE----- >>>>> "jamal" == jamal writes: jamal> Krisztian, jamal> To take a rough estimate of 5K users, how often do you think jamal> these replay messages will be generated? jamal> Is there a (clever) way to avoid transporting them and still jamal> achieve an accurate failover? Yes there are some heuristics one can apply. First, on receiver, if you are the slave, you need no information at all. Replay counters monotonically increase, so any packet you get > than you saw before is okay. As such, you can easily tradeoff risk of replay attack vs number of messages to carry. On transmit, you have to be accurate on the lower bound, but if your lower bound is *too high*, that's okay. there is just a hole in the replay counter, and that's okay too. So, once you decide on the update rate master->slave, and if you know approximately how many packets/second are going through on the master, you can take packets/second * 1/update-rate and tell the slave to start at that number if it has to take over. (Note that you have to acount for packets-in-flight, which may actually be substantial, and IPsec has no way to know what the RTT is, unlike TCP. It could steal the info from TCP, if TCP had a session open, which as a gateway, it would not do.. Some have suggested having IKE keep a TCP session up just for this information.) ] Train travel features AC outlets with no take-off restrictions| firewalls [ ] Michael Richardson, Sandelman Software Works, Ottawa, ON |net architect[ ] mcr@sandelman.ottawa.on.ca http://www.sandelman.ottawa.on.ca/ |device driver[ ] panic("Just another Debian/notebook using, kernel hacking, security guy"); [ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2 (GNU/Linux) Comment: Finger me for keys iQCVAwUBQY5ecIqHRg3pndX9AQEl6gP+OeX08RaO60c9BOXqNoqkb6PvUcBX1t9v mdaNpkUA+iy6RpYQwcBxfN4G4yvwwbO9JDgPRK/k/Wh6zmY4dBLgtiG1tlFaEUcf 6HRBmBSmIbDUpFkAYGdSJuQxhGDas6sxi4MF6tIsaZUtJzqO+Xp5HtrauzTH56VV vswtfMy8z7k= =FV58 -----END PGP SIGNATURE----- From jm@jm.kir.nu Sun Nov 7 21:28:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 21:28:56 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA85SnTF021434 for ; Sun, 7 Nov 2004 21:28:50 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR22G-0007sY-CK; Sun, 07 Nov 2004 21:25:48 -0800 Date: Sun, 7 Nov 2004 21:25:48 -0800 From: Jouni Malinen To: "Luis R. Rodriguez" Cc: prism54-devel@prism54.org, netdev@oss.sgi.com Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041108052548.GA30250@jm.kir.nu> References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> <20041105162507.GO388@ruslug.rutgers.edu> <20041108023308.GA7425@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108023308.GA7425@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11552 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 860 Lines: 17 On Sun, Nov 07, 2004 at 06:33:08PM -0800, Jouni Malinen wrote: > Someone, ideally the original author, would need to go through these and > submit a proper patch to integrate this into the current development > version of hostapd without breaking other driver interfaces. Thanks to quick reply from Bell Kin, I now have such a patch. I did some more cleanup and committed this to Host AP/hostapd CVS (development branch). I have not yet tested this apart from verifying that it compiles, so I may have broken something in the cleanup. Test reports using the latest CVS development snapshot from http://hostap.epitest.fi/ are welcome. Please note that you will need to make .config file with CONFIG_DRIVER_PRISM54=y in hostapd directory in order to build Prism54 driver interface. -- Jouni Malinen PGP id EFC895FA From herbert@gondor.apana.org.au Sun Nov 7 22:16:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 22:16:13 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA86G4pw022941 for ; Sun, 7 Nov 2004 22:16:05 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CR2oR-0001qO-00; Mon, 08 Nov 2004 17:15:35 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CR2oL-0000T9-00; Mon, 08 Nov 2004 17:15:29 +1100 Date: Mon, 8 Nov 2004 17:15:29 +1100 To: "David S. Miller" , Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: Bug in ipv6_ifa_notify? Message-ID: <20041108061529.GA1774@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11553 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1016 Lines: 28 Hi: I'm reviewing the changes between 2.6.8.1 and 2.6.9. The following change caught my eye: # ChangeSet # 2004/08/17 11:25:16+09:00 yoshfuji@linux-ipv6.org # [IPV6] refer inet6 device via corresponding local route from address structure. In particular, it changed the handling of RTM_NEWADDR in ipv6_ifa_notify. Previously if you received duplicate RTM_NEWADDR notifications ip6_rt_addr_add would allocate a new rt and then free it since ip6_ins_rt would fail. With the new code, it will call ip6_ins_rt on the *same* rt again which will cause it to be dst_free'd. I don't see any way for this to lead to dst underflows yet, but it'll certainly corrupt the routing table since dst_free modifies rt->u.next. Now the question is is it possible to get dupliate RTM_NEWADDR notifications? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From jm@jm.kir.nu Sun Nov 7 23:05:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:05:08 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8750Ww024490 for ; Sun, 7 Nov 2004 23:05:00 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3XJ-0000I3-48; Sun, 07 Nov 2004 23:01:57 -0800 Date: Sun, 7 Nov 2004 23:01:57 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com, jkmaline@cc.hut.fi Subject: [PATCH wireless-2.6 0/12] Host AP update Message-ID: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 11554 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 25701 Lines: 667 Jeff, Here's an update to Host AP code in wireless-2.6 tree. This brings in number of small fixes from my CVS repository. This messages has the changes in BitKeeper format from bksend and following 12 messages have the patches one by one as unified diffs. I have couple of additional patches pending for wireless-2.6 updates (wireless extensions 17 and 18; changes to PCI API in Linux 2.6.10-rc1). I'll send WE17 and PCI changes once you update wireless-2.6. WE18 change requires an update to wireless extensions, so it may need to wait somewhat longer or we could start testing WE18 in wireless-2.6 if that is desired. I keep getting questions about getting Host AP driver to linux-2.6 tree. What would be needed to make this happen? I would assume this would be easiest to do this from wireless-2.6 tree once the new patches are in. Any other changes that would be required to get the driver in suitable state for merging into Linux 2.6 releases? You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1873, 2004-11-07 22:28:31-08:00, jkmaline@cc.hut.fi Host AP: Fix netif_carrier_off() in non-client modes Connection status is reported properly only in client modes, so do not try to set netif_carrier_off() in non-client modes. Previously, Master mode may end up being in state where netif_carrier was left off and this may break things like bridging. Signed-off-by: Jouni Malinen ChangeSet@1.1872, 2004-11-07 22:25:11-08:00, jkmaline@cc.hut.fi Host AP: Fix PRISM2_IO_DEBUG From Mark Glines : I just noticed PRISM2_IO_DEBUG doesn't work. This patch gets it working again. I checked the development CVS snapshot, looks like its still broken there. jkm: in addition, fix the other PRISM2_IO_DEBUG function Signed-off-by: Jouni Malinen ChangeSet@1.1871, 2004-11-07 22:21:13-08:00, jkmaline@cc.hut.fi Host AP: Use void * instead of unsigned long with {read,write}{b,w} Start using void * instead of unsigned long with {read,write}{b,w} to silence compiler warning with Linux 2.6.9-rc2. Signed-off-by: Jouni Malinen ChangeSet@1.1870, 2004-11-07 22:17:27-08:00, jkmaline@cc.hut.fi Host AP: Fix card enabling after firmware download Fix card enabling after firmware download in case any of the netdevs were up when the download was started. Signed-off-by: Jouni Malinen ChangeSet@1.1869, 2004-11-07 22:13:57-08:00, jkmaline@cc.hut.fi Host AP: Do not bridge packets to unauthorized ports Fix inner-BSS bridge (ap_bridge_packets=1) not to bridge packets to unauthorized ports when IEEE 802.1X/WPA is used (i.e., require that the STA completes authentication before capturing packets in the inner bridge); previously, only association status was used and an attacker could have capture packets to any MAC address even without having proper credentials for using the network (although, the packets were dropped because the controlled port for the STA was unauthorized). Signed-off-by: Jouni Malinen ChangeSet@1.1868, 2004-11-07 22:10:36-08:00, jkmaline@cc.hut.fi Host AP: Fix compilation with PRISM2_NO_STATION_MODES defined. Signed-off-by: Jouni Malinen ChangeSet@1.1867, 2004-11-07 22:03:38-08:00, jkmaline@cc.hut.fi Host AP: Prevent STAs from associating using AP address Prevent STAs from authenticating with AP address (i.e., spoofing AP MAC address). The inner bridge implementation intercepts packets before they are passed to Linux net stack, so using AP MAC address would prevent AP from seeing the packet properly. Signed-off-by: Jouni Malinen ChangeSet@1.1866, 2004-11-07 21:59:51-08:00, jkmaline@cc.hut.fi Host AP: Fix hw address changing for wifi# interface Update wifi# interface MAC address when changing addresses. Without this, MAC address change does not work correctly with the new interface design (wifi#/wlan0#). Signed-off-by: Jouni Malinen ChangeSet@1.1865, 2004-11-07 21:56:29-08:00, jkmaline@cc.hut.fi Host AP: Remove ioctl debug messages Remove debug message from unsupported ioctls. Some of common ioctls triggered these (e.g., SIOCGMIIPHY, SIOCGMIIREG, SIOCSMIIREG, SIOCDEVPRIVATE) and filled debug logs with unwanted messages. Signed-off-by: Jouni Malinen ChangeSet@1.1864, 2004-11-07 21:49:46-08:00, jkmaline@cc.hut.fi Host AP: Ignore (Re)AssocResp messages silently Ignore (Re)AssocResp silently since these are not currently needed but are still received when WPA/RSN mode is enabled. Signed-off-by: Jouni Malinen ChangeSet@1.1863, 2004-11-07 21:34:28-08:00, jkmaline@cc.hut.fi Host AP: Fix interface packet counters Fix wlan#/wifi# interface packet counters (both are supposed to see data packets once; wlan# was counting TX twice and wifi# did not count TX or RX at all for most cases). Signed-off-by: Jouni Malinen ChangeSet@1.1862, 2004-11-07 20:24:23-08:00, jkmaline@cc.hut.fi Host AP: Disable EAPOL TX/RX debug messages Signed-off-by: Jouni Malinen hostap.c | 1 + hostap_80211_rx.c | 12 +++++++++++- hostap_80211_tx.c | 12 ++++++------ hostap_ap.c | 22 +++++++++++++++++++++- hostap_ap.h | 1 + hostap_hw.c | 12 +++++++++--- hostap_ioctl.c | 20 +++++++++++--------- hostap_pci.c | 22 ++++++++++++---------- hostap_plx.c | 19 +++++++++---------- hostap_wlan.h | 8 +++++--- 10 files changed, 86 insertions(+), 43 deletions(-) diff -Nru a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c --- a/drivers/net/wireless/hostap/hostap.c 2004-11-07 22:34:54 -08:00 +++ b/drivers/net/wireless/hostap/hostap.c 2004-11-07 22:34:54 -08:00 @@ -808,6 +808,7 @@ iface = list_entry(ptr, struct hostap_interface, list); memcpy(iface->dev->dev_addr, addr->sa_data, ETH_ALEN); } + memcpy(local->dev->dev_addr, addr->sa_data, ETH_ALEN); read_unlock_bh(&local->iface_lock); return 0; diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:34:54 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:34:54 -08:00 @@ -475,6 +475,13 @@ stype == WLAN_FC_STYPE_PROBE_RESP)) { hostap_rx_sta_beacon(local, skb, stype); return -1; + } else if (type == WLAN_FC_TYPE_MGMT && + (stype == WLAN_FC_STYPE_ASSOC_RESP || + stype == WLAN_FC_STYPE_REASSOC_RESP)) { + /* Ignore (Re)AssocResp silently since these are not currently + * needed but are still received when WPA/RSN mode is enabled. + */ + return -1; } else { printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: dropped unhandled" " management frame in non-Host AP mode (type=%d:%d)\n", @@ -689,6 +696,9 @@ void *sta = NULL; int keyidx = 0; + iface->stats.rx_packets++; + iface->stats.rx_bytes += skb->len; + /* dev is the master radio device; change this to be the default * virtual interface (this may be changed to WDS device below) */ dev = local->ddev; @@ -1025,7 +1035,7 @@ if (skb2 == NULL) printk(KERN_DEBUG "%s: skb_clone failed for " "multicast frame\n", dev->name); - } else if (hostap_is_sta_assoc(local->ap, dst)) { + } else if (hostap_is_sta_authorized(local->ap, dst)) { /* send frame directly to the associated STA using * wireless media and not passing to higher layers */ local->ap->bridged_unicast++; diff -Nru a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c --- a/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:34:54 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:34:54 -08:00 @@ -379,7 +379,7 @@ printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); ret = 0; - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; } @@ -405,13 +405,13 @@ hostap_dump_tx_80211(dev->name, skb); ret = 0; /* drop packet */ - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; } break; case AP_TX_DROP: ret = 0; /* drop packet */ - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; case AP_TX_RETRY: goto fail; @@ -488,11 +488,11 @@ if (local->func->tx == NULL || local->func->tx(skb, dev)) { ret = 0; - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; } else { ret = 0; - meta->iface->stats.tx_packets++; - meta->iface->stats.tx_bytes += skb->len; + iface->stats.tx_packets++; + iface->stats.tx_bytes += skb->len; } fail: diff -Nru a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c --- a/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:34:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:34:53 -08:00 @@ -1329,7 +1329,8 @@ status_code = __le16_to_cpu(*pos); pos++; - if (ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { + if (memcmp(dev->dev_addr, hdr->addr2, ETH_ALEN) == 0 || + ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { txt = "authentication denied"; resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; @@ -3060,6 +3061,24 @@ /* Called only as a tasklet (software IRQ) */ +int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr) +{ + struct sta_info *sta; + int ret = 0; + + spin_lock(&ap->sta_table_lock); + sta = ap_get_sta(ap, sta_addr); + if (sta != NULL && (sta->flags & WLAN_STA_ASSOC) && !sta->ap && + ((sta->flags & WLAN_STA_AUTHORIZED) || + ap->local->ieee_802_1x == 0)) + ret = 1; + spin_unlock(&ap->sta_table_lock); + + return ret; +} + + +/* Called only as a tasklet (software IRQ) */ int hostap_add_sta(struct ap_data *ap, u8 *sta_addr) { struct sta_info *sta; @@ -3218,6 +3237,7 @@ EXPORT_SYMBOL(hostap_update_sta_ps); EXPORT_SYMBOL(hostap_handle_sta_rx); EXPORT_SYMBOL(hostap_is_sta_assoc); +EXPORT_SYMBOL(hostap_is_sta_authorized); EXPORT_SYMBOL(hostap_add_sta); EXPORT_SYMBOL(hostap_update_rates); EXPORT_SYMBOL(hostap_add_wds_links); diff -Nru a/drivers/net/wireless/hostap/hostap_ap.h b/drivers/net/wireless/hostap/hostap_ap.h --- a/drivers/net/wireless/hostap/hostap_ap.h 2004-11-07 22:34:54 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.h 2004-11-07 22:34:54 -08:00 @@ -255,6 +255,7 @@ struct hostap_ieee80211_hdr *hdr, struct prism2_crypt_data **crypt, void **sta_ptr); int hostap_is_sta_assoc(struct ap_data *ap, u8 *sta_addr); +int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr); int hostap_add_sta(struct ap_data *ap, u8 *sta_addr); int hostap_update_rx_stats(struct ap_data *ap, struct hostap_ieee80211_hdr *hdr, diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:34:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:34:53 -08:00 @@ -1483,7 +1483,10 @@ if (prism2_hw_init2(dev, initial)) return 1; - if (!local->pri_only && !initial) { + /* Enable firmware if secondary image is loaded and at least one of the + * netdevices is up. */ + if (!local->pri_only && + (initial == 0 || (initial == 2 && local->num_dev_open > 0))) { if (!local->dev_enabled) prism2_callback(local, PRISM2_CALLBACK_ENABLE); local->dev_enabled = 1; @@ -3396,8 +3399,11 @@ "", dev_template); if (local->ddev) { - netif_carrier_off(local->dev); - netif_carrier_off(local->ddev); + if (local->iw_mode == IW_MODE_INFRA || + local->iw_mode == IW_MODE_ADHOC) { + netif_carrier_off(local->dev); + netif_carrier_off(local->ddev); + } hostap_init_proc(local); hostap_init_ap_proc(local); return 0; diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:34:54 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:34:54 -08:00 @@ -597,6 +597,7 @@ } +#ifndef PRISM2_NO_STATION_MODES static int hostap_join_ap(struct net_device *dev) { struct hostap_interface *iface = dev->priv; @@ -634,6 +635,7 @@ return 0; } +#endif /* PRISM2_NO_STATION_MODES */ static int prism2_ioctl_siwap(struct net_device *dev, @@ -1106,6 +1108,13 @@ if (double_reset && local->func->reset_port(dev)) return -EINVAL; + if (local->iw_mode != IW_MODE_INFRA && local->iw_mode != IW_MODE_ADHOC) + { + /* netif_carrier is used only in client modes for now, so make + * sure carrier is on when moving to non-client modes. */ + netif_carrier_on(local->dev); + netif_carrier_on(local->ddev); + } return 0; } @@ -1586,7 +1595,8 @@ #else /* !PRISM2_NO_STATION_MODES */ -static inline int prism2_request_hostscan(struct net_device *dev) +static inline int prism2_request_hostscan(struct net_device *dev, + u8 *ssid, u8 ssid_len) { return -EOPNOTSUPP; } @@ -3452,14 +3462,6 @@ break; default: - if (cmd >= SIOCSIWCOMMIT && cmd <= SIOCGIWPOWER) { - /* unsupport wireless extensions get through here - do - * not report these to debug log */ - ret = -EOPNOTSUPP; - break; - } - printk(KERN_DEBUG "%s unsupported ioctl(0x%04x)\n", - dev->name, cmd); ret = -EOPNOTSUPP; break; } diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:34:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:34:53 -08:00 @@ -56,7 +56,7 @@ spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); - writeb(v, dev->mem_start + a); + writeb(v, (void *) dev->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } @@ -68,7 +68,7 @@ u8 v; spin_lock_irqsave(&local->lock, flags); - v = readb(dev->mem_start + a); + v = readb((void *) dev->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -82,7 +82,7 @@ spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); - writew(v, dev->mem_start + a); + writew(v, (void *) dev->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } @@ -94,7 +94,7 @@ u16 v; spin_lock_irqsave(&local->lock, flags); - v = readw(dev->mem_start + a); + v = readw((void *) dev->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -109,12 +109,14 @@ #else /* PRISM2_IO_DEBUG */ -#define HFA384X_OUTB(v,a) writeb((v), dev->mem_start + (a)) -#define HFA384X_INB(a) (u8) readb(dev->mem_start + (a)) -#define HFA384X_OUTW(v,a) writew((v), dev->mem_start + (a)) -#define HFA384X_INW(a) (u16) readw(dev->mem_start + (a)) -#define HFA384X_OUTW_DATA(v,a) writew(cpu_to_le16(v), dev->mem_start + (a)) -#define HFA384X_INW_DATA(a) (u16) le16_to_cpu(readw(dev->mem_start + (a))) +#define HFA384X_OUTB(v,a) writeb((v), (void *) dev->mem_start + (a)) +#define HFA384X_INB(a) (u8) readb((void *) dev->mem_start + (a)) +#define HFA384X_OUTW(v,a) writew((v), (void *) dev->mem_start + (a)) +#define HFA384X_INW(a) (u16) readw((void *) dev->mem_start + (a)) +#define HFA384X_OUTW_DATA(v,a) \ + writew(cpu_to_le16(v), (void *) dev->mem_start + (a)) +#define HFA384X_INW_DATA(a) (u16) \ + le16_to_cpu(readw((void *) dev->mem_start + (a))) #endif /* PRISM2_IO_DEBUG */ diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:34:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:34:53 -08:00 @@ -247,7 +247,7 @@ /* Set sreset bit of COR and clear it after hold time */ - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -271,7 +271,7 @@ { unsigned char corsave; - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -306,7 +306,7 @@ }; -static int prism2_plx_check_cis(unsigned long attr_mem, int attr_len, +static int prism2_plx_check_cis(void *attr_mem, int attr_len, unsigned int *cor_offset, unsigned int *cor_index) { @@ -401,7 +401,7 @@ unsigned int pccard_ioaddr, plx_ioaddr; unsigned long pccard_attr_mem; unsigned int pccard_attr_len; - unsigned long attr_mem = 0; + void *attr_mem = NULL; unsigned int cor_offset, cor_index; u32 reg; local_info_t *local = NULL; @@ -422,7 +422,7 @@ if (tmd7160) { /* TMD7160 */ - attr_mem = 0; /* no access to PC Card attribute memory */ + attr_mem = NULL; /* no access to PC Card attribute memory */ printk(KERN_INFO "TMD7160 PCI/PCMCIA adapter: io=0x%x, " "irq=%d, pccard_io=0x%x\n", @@ -448,9 +448,8 @@ goto fail; - attr_mem = (unsigned long) ioremap(pccard_attr_mem, - pccard_attr_len); - if (!attr_mem) { + attr_mem = ioremap(pccard_attr_mem, pccard_attr_len); + if (attr_mem == NULL) { printk(KERN_ERR "%s: cannot remap attr_mem\n", dev_info); goto fail; @@ -532,7 +531,7 @@ free_irq(dev->irq, dev); if (attr_mem) - iounmap((void *) attr_mem); + iounmap(attr_mem); pci_disable_device(pdev); @@ -550,7 +549,7 @@ hfa384x_disable_interrupts(dev); if (iface->local->attr_mem) - iounmap((void *) iface->local->attr_mem); + iounmap(iface->local->attr_mem); if (dev->irq) free_irq(dev->irq, dev); diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:34:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:34:54 -08:00 @@ -895,7 +895,7 @@ #endif /* PRISM2_PCCARD */ #ifdef PRISM2_PLX - unsigned long attr_mem; + void *attr_mem; unsigned int cor_offset; #endif /* PRISM2_PLX */ @@ -1006,7 +1006,8 @@ static inline void prism2_io_debug_add(struct net_device *dev, int cmd, int reg, int value) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = dev->priv; + local_info_t *local = iface->local; if (!local->io_debug_enabled) return; @@ -1023,7 +1024,8 @@ static inline void prism2_io_debug_error(struct net_device *dev, int err) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = dev->priv; + local_info_t *local = iface->local; unsigned long flags; if (!local->io_debug_enabled) =================================================================== This BitKeeper patch contains the following changesets: 1.1862..1.1873 ## Wrapped with gzip_uu ## M'XL( (X3CT$ ^U=87/:1K?^#+]BV\S-A<1@[:XD)/PF4\=V$V[BV-=VFO1. M9S2+M!C5(/%*PL1OR7^_Y^P*# 9C#+:9-&T[R,!J=[5ZSG.><_:(/B.?4IG4 M"W]>=$4GC&3Q&7D7IUF]X/O5=C^KMD+XY"2.X9/M?V__V=UN7L!K91 FLB/3 MM,*J=A%:'(O,;Y-+F:3U JWR\2?954_6"R<';S]]V#TI%E^](GMM$9W+4YF1 M5Z^*69Q.JEDBHK0K,U'UX^YPW'3(#(/!OQ:M<<.RA]0VS-K0 MIP&EPJ0R,)CIV&;QSW.1_">\^*47-^.OLSV8AL,I=9AIN4/N<(<6]PFM4L=F MQ#"W*=TV:H09=6;6&:\83MTPR&A5?AFO!GG)2,4HOB$/._6]HJ_6G>P>U\E^ MF(IF1Y*#W>.C#^3LR_;)%Q+(9O^<=&')Q;E,H37\=QJ>1S*HQ*U6I7E5)_\3 M]Z.0'*H)1^1?LW-_77Q/N,.84SR^O@W%RCW_*18-811?D]%J)S)HBTQ==9"$ M"('M2&;;(X1LM^&R1"\_>([!*/42N#WZEM@&-SBM,7=(7=NPAZ9/>)\%.@(FL0) 9,4&1&= M#FG!NRY>CB]2F9:K:]DF_T%MT^(FY4/3XI;S/=JFGKYMF0#O)6T33F'.4-_R MW#;-*=LTW;II+[!-^NBVV3B/8K"ETHDL[Z9I[)_(M#=V020-.S+*.E<:[W/; MCIK 'V!P)&O+5"KS5/;43Q+];21E *;:[*-Y*>O-0C"L1/H2[@;881MLYO/Q M[O;)Z4C>#V1W?@2P!'[66>N8,H;3'U%6DG<)?U(>8PD [BI\],J.8V[DL0M(/YN M-X[RCZ&7+ G/SV6"SD4!NB2KY]4M_'9\T?ML].R@K5],"P$.'>F:=^#P%YP.NK!\-1(1S&EW'6G"G-;I!N*OU MNX%U;@P-Q^'V4!J6XW+NLI8C FK[*V)]<@R-6LNF;,B98[E+ ]VR&08(N%HY MT.UIH+MUBVX4Z*B(V@,B@B"!-2 ^]H7J!:7(#8T$IR%@/O5 _\B;7Y+#W;UQ M+XIEQUWEGP+BR&= 8JRX.6N'Z=;42:H]6%0,#@%)?1 G%V PP.P^,KL",5@) M4/P SK\>.) I0)B4U(2V48@9S]:33M38()?/D1R6:=2&MFT%PF5-G[*F:S"Y M&JRG >UR0"=0M[4\H%V+#O4*Y8"N30":U0U>YXNB@,<']'$B+T$+D-.SW503 MLD 1$0HEROLIONX>CU"G83+GG#Y #72\KT]3X+L^BY3"J@2>3GMQW-(=0B\3 M8"Y7R1E -8PBF9!F$@8 [+#;Z\@N= I=H@] /NR!R%$'DI %TW90ND#8U\I M]=*#N>O(XT,8];\"]C-0-- GEUP1?JRN"T 5;HP7E ML4XOB7LRZ5RM92L&MS?H".::"Z.6.>2UE@Q<"0X!-(_;FH?&>PV@X ^#,'L( M_H4M;3%P"D=MCNN46XPS93'4J//-:G-T =!)+^QH9"JP@Z0X/63>QR,/C.*L MIGM72N.QL'! 8$8I4J_;$.,AZ%='^DS9^M$_KL?*G85 M6H%()'P%_8[,0'5,DC[804[&ONAE_02YW)EP"3 ^"$(")*=O,H-9WX\75E$WF.GQY+N96 M;:B1J;FX9DQS<:W.%G'Q$WEQD00ZFZ7BKA8H3-(*D^X M600#Z).+()K)EZJ M.;(=IJ,5 <4M-'DX'18[D)>:+TB_I_D7V6!\&E("+#ZF0=8B \>Q-D@&[<$< MI6"9-3YL6;:TI67[IA\X9FU5I3 >(,=9C5I#P^3W@6:-(31QG7)HTBEH,@I* M8:,RX1.@YS(. _("P)1F$M !0.I'J0($@='R".NO!+[;&B1A)K_]U=P:?,N! M@S#*?=AJ_6C=H'+(OLS%+H =@!Z-PSL=8;&J774KB<_6 JWM;#(]UO/#6=12 MHT;MH3!;0;-IFL+P?=-P:BNB]GH$C4' @SNTF 7J=N5)=VYZ7)PT@_!I:+N< M4M\R.8"..J*YZJ0[7V;OFF(;P^:JS MGAAB:MJ6N?3^D U* ]R_0F5.$6R:(JPZW7P:,@\Y&T?>_L&;3V]S/X6YBT,! MBO4MSBHE_^K"FU_.U9MJG)R_KN.6$?FS#SU!S!#ZP 0W>E(YQ>B_=4JQ2LA9 M.\2D"Q:5G"L]GZFL27*AW."Y""-HU"!^6X(H#K1; [G=B7N8OB%[OYV2-!*] MM!UG6\ Z\45*.N$%NL4P2_,=IV827VB7F,B<2F!EZ^A-0<&'&!)L@;/]JGJ/ ML=G,K%O]R,=VZQ'1)K>E-F(>JB:'48#E6Q@OY]L&JI(=_( MIOAWLN$'YJNVLHY()1FH_\ @TQ0 M+QY>XY:ZTLKK5'A8,;9%#L[>>;L?#CZ6=Y9$[422:&7XWCN?];## *"YZ[C. M#*!5=:QQ1\4@>Q1 WUT4J]"DJCOOC::)A5@!5OLNKP&L&OI0*!2.E18LJ5?O MX,O9R2[;(C__5UHG)U_JDQEO4E&[A6A_/T,WMJVZ48=[==-*1%?^$?V\-5<^ M/4"]+ )AIG1T,QF*[ZT<]#W198U/#,J&[5+"BX40EP;X# 1;6DV^CG9K7K[< MF?VN>84[*B]?D?2B67G=D=%.\8^'1-1DE2&!L1RI%8L?".R Q<5MD@)G], ;T4^?]C]Z/VZYYW]?GS@';X]/"//GP,5 M$4)*Z)\HL$>_6S:U@1@E\S[<9X4\0_/:XK;45&W5 MX8ZF(-:QJ3K<*\-61X;Q+BEA[J_;*]U(^K4Q MYX=_LHF,'T8PAHIJ,*B!>>3BR^L*WP-E=U5Z+GJ5U_@.UB1+0K5WDT[VIE7, M0YX87-"G2*P&+DU;@#+Z_L9VJ=2 M*B\P@.@[Y(5J!DM;+OY5+.2-\+,P:L7J6\R 0<<)_A8%,3#754A[8>1!('*A M31N;9RB"U6?E'>Q'0&,8ZUQF.)$2CC8>:4=S##;ZZ17Y^.G#!_+\N7I?>=WJ MB/.4/-15+NO,R90&!\\.K'OPY?CHY,P[_?WPS=&'6Z.^Y;=5 ML(1U+06R9(7M0PT "L2R#=NC0JMGF;()'E:%3:P$;F(^9!WZZL]![SVT)>J1JO?JZIM!/3]/^6NN)>$GB*AL4\/HQ 981153'W 4 ;D M9T;]KH>1"3!)1%ZC$U\CB+B]5'TVB&!.G2XJ5K$>:V__ARY\>T]T3=33&08W M#0R'&W#DQ%)I(C+*OH<#3UT[8++Q63T^ZC4^_GJR>[VY=WO#W?UW*&AQ7Z\P MN_S7U38HDQ>UYMJPSR,OC5O<']ZKA>\@QP"LPNV;,JQRSZW31;KA!*LZC M&./?X4=2WA/]DQ_WMZG\+JUF5I9%YO\VV[H_73(GX8,;0QL3#?=^\!PKL_ Q MZJ>\(0W+=<'_/PM;$P'$+B1!I58G@- R4 M',8_O(Z,R@^&I'][4PN[BB*PE*]0KP4U_6;IT$J]?")7E%\.*;I3M.#)NU]WN6-^\8X^G;V!@469Y)=;NBPOFD9)E,LSG30^OH'/ M2:GOE.^\^+D=P"P^3\QBL.(L/NM94+M\Y\K<.@UO?_=L5\_EC_&=\7M]+XO! MPU-[Q9GI;L?3@ZZQ,^P4^BXM,]ORTK376:NLZAY/"#_<"'3(;.[:*]">^_=C M/?VP] JLUUFQFH99^)!-0Q\FE8;(LL0#(&+. /?&,%6PSVJJ2$8?[FS-#46I M^C!6WV/9#7/VU!/ GA^FN0&,^ME2#=4[6,$M+.71Y3GJ4)AN3/286&[#=*D9 MTZ5F-QM@P!#%1/@^;@J 3#G>(WN84\6&8;,/HA%:QZ!/,7PP+:S);Y@65[4[ M$YV%<2*[HE?J^9B1]:XG/?D!Q@0[>;YF[O)87$U6'Z!=W(^PTU%;Y&\+QL8F MZG#=)*\4NK'VR^?C]2.]J_/$?9XZ?L A@"E,[O)5!-)C!=@;) K\>8+[$X5> MUU68PG%5,9T^W+# E0OQ%_WVPIR XV.,,/[_JZ@;F?:[KX0%\!)!K?C_9BI#-M%E -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:13:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:13:42 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87DcCa025023 for ; Sun, 7 Nov 2004 23:13:39 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3fg-0000JO-V0; Sun, 07 Nov 2004 23:10:36 -0800 Date: Sun, 7 Nov 2004 23:10:36 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 1/12] Host AP: Disable EAPOL TX/RX debug messages Message-ID: <20041108071036.GB1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11555 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1780 Lines: 40 Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:37:51 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:37:51 -08:00 @@ -934,7 +934,7 @@ hostap_is_eapol_frame(local, skb)) { /* pass unencrypted EAPOL frames even if encryption is * configured */ - printk(KERN_DEBUG "%s: RX: IEEE 802.1X - passing " + PDEBUG(DEBUG_EXTRA2, "%s: RX: IEEE 802.1X - passing " "unencrypted EAPOL frame\n", local->dev->name); } else { printk(KERN_DEBUG "%s: encryption configured, but RX " @@ -963,7 +963,7 @@ * the received frame. */ if (local->ieee_802_1x && local->iw_mode == IW_MODE_MASTER) { if (ethertype == ETH_P_PAE) { - printk(KERN_DEBUG "%s: RX: IEEE 802.1X frame\n", + PDEBUG(DEBUG_EXTRA2, "%s: RX: IEEE 802.1X frame\n", dev->name); if (local->hostapd && local->apdev) { /* Send IEEE 802.1X frames to the user diff -Nru a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c --- a/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:37:51 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:37:51 -08:00 @@ -442,7 +442,7 @@ if (local->ieee_802_1x && meta->ethertype == ETH_P_PAE && tx.crypt && !(fc & WLAN_FC_ISWEP)) { no_encrypt = 1; - printk(KERN_DEBUG "%s: TX: IEEE 802.1X - passing " + PDEBUG(DEBUG_EXTRA2, "%s: TX: IEEE 802.1X - passing " "unencrypted EAPOL frame\n", dev->name); tx.crypt = NULL; /* no encryption for IEEE 802.1X frames */ } -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:14:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:14:40 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87EarS025346 for ; Sun, 7 Nov 2004 23:14:36 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3ga-0000JV-2L; Sun, 07 Nov 2004 23:11:32 -0800 Date: Sun, 7 Nov 2004 23:11:32 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 2/12] Host AP: Fix interface packet counters Message-ID: <20041108071132.GC1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11556 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 2051 Lines: 67 Fix wlan#/wifi# interface packet counters (both are supposed to see data packets once; wlan# was counting TX twice and wifi# did not count TX or RX at all for most cases). Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:37:59 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:37:59 -08:00 @@ -689,6 +689,9 @@ void *sta = NULL; int keyidx = 0; + iface->stats.rx_packets++; + iface->stats.rx_bytes += skb->len; + /* dev is the master radio device; change this to be the default * virtual interface (this may be changed to WDS device below) */ dev = local->ddev; diff -Nru a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c --- a/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:37:59 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-07 22:37:59 -08:00 @@ -379,7 +379,7 @@ printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); ret = 0; - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; } @@ -405,13 +405,13 @@ hostap_dump_tx_80211(dev->name, skb); ret = 0; /* drop packet */ - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; } break; case AP_TX_DROP: ret = 0; /* drop packet */ - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; goto fail; case AP_TX_RETRY: goto fail; @@ -488,11 +488,11 @@ if (local->func->tx == NULL || local->func->tx(skb, dev)) { ret = 0; - meta->iface->stats.tx_dropped++; + iface->stats.tx_dropped++; } else { ret = 0; - meta->iface->stats.tx_packets++; - meta->iface->stats.tx_bytes += skb->len; + iface->stats.tx_packets++; + iface->stats.tx_bytes += skb->len; } fail: -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:15:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:15:17 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87FDTo025653 for ; Sun, 7 Nov 2004 23:15:13 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3hD-0000Jf-4F; Sun, 07 Nov 2004 23:12:11 -0800 Date: Sun, 7 Nov 2004 23:12:11 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 3/12] Host AP: Ignore (Re)AssocResp messages silently Message-ID: <20041108071211.GD1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11557 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1070 Lines: 27 Ignore (Re)AssocResp silently since these are not currently needed but are still received when WPA/RSN mode is enabled. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:38:11 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:38:11 -08:00 @@ -475,6 +475,13 @@ stype == WLAN_FC_STYPE_PROBE_RESP)) { hostap_rx_sta_beacon(local, skb, stype); return -1; + } else if (type == WLAN_FC_TYPE_MGMT && + (stype == WLAN_FC_STYPE_ASSOC_RESP || + stype == WLAN_FC_STYPE_REASSOC_RESP)) { + /* Ignore (Re)AssocResp silently since these are not currently + * needed but are still received when WPA/RSN mode is enabled. + */ + return -1; } else { printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: dropped unhandled" " management frame in non-Host AP mode (type=%d:%d)\n", -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:15:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:15:48 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87FiYP025883 for ; Sun, 7 Nov 2004 23:15:44 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3hi-0000Jv-8E; Sun, 07 Nov 2004 23:12:42 -0800 Date: Sun, 7 Nov 2004 23:12:42 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 4/12] Host AP: Remove ioctl debug messages Message-ID: <20041108071242.GE1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11558 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 931 Lines: 28 Remove debug message from unsupported ioctls. Some of common ioctls triggered these (e.g., SIOCGMIIPHY, SIOCGMIIREG, SIOCSMIIREG, SIOCDEVPRIVATE) and filled debug logs with unwanted messages. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:38:18 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:38:18 -08:00 @@ -3452,14 +3452,6 @@ break; default: - if (cmd >= SIOCSIWCOMMIT && cmd <= SIOCGIWPOWER) { - /* unsupport wireless extensions get through here - do - * not report these to debug log */ - ret = -EOPNOTSUPP; - break; - } - printk(KERN_DEBUG "%s unsupported ioctl(0x%04x)\n", - dev->name, cmd); ret = -EOPNOTSUPP; break; } -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:16:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:16:19 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87GEqJ026212 for ; Sun, 7 Nov 2004 23:16:14 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3iC-0000K2-1A; Sun, 07 Nov 2004 23:13:12 -0800 Date: Sun, 7 Nov 2004 23:13:12 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 5/12] Host AP: Fix hw address changing for wifi# interface Message-ID: <20041108071312.GF1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11559 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 773 Lines: 22 Update wifi# interface MAC address when changing addresses. Without this, MAC address change does not work correctly with the new interface design (wifi#/wlan0#). Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c --- a/drivers/net/wireless/hostap/hostap.c 2004-11-07 22:38:26 -08:00 +++ b/drivers/net/wireless/hostap/hostap.c 2004-11-07 22:38:26 -08:00 @@ -808,6 +808,7 @@ iface = list_entry(ptr, struct hostap_interface, list); memcpy(iface->dev->dev_addr, addr->sa_data, ETH_ALEN); } + memcpy(local->dev->dev_addr, addr->sa_data, ETH_ALEN); read_unlock_bh(&local->iface_lock); return 0; -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:16:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:16:52 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87GlRE026586 for ; Sun, 7 Nov 2004 23:16:47 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3ij-0000KC-6n; Sun, 07 Nov 2004 23:13:45 -0800 Date: Sun, 7 Nov 2004 23:13:45 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 6/12] Host AP: Prevent STAs from associating using AP address Message-ID: <20041108071345.GG1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11560 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 969 Lines: 25 Prevent STAs from authenticating with AP address (i.e., spoofing AP MAC address). The inner bridge implementation intercepts packets before they are passed to Linux net stack, so using AP MAC address would prevent AP from seeing the packet properly. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c --- a/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:38:35 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:38:35 -08:00 @@ -1329,7 +1329,8 @@ status_code = __le16_to_cpu(*pos); pos++; - if (ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { + if (memcmp(dev->dev_addr, hdr->addr2, ETH_ALEN) == 0 || + ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { txt = "authentication denied"; resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:17:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:17:36 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87HTYG026914 for ; Sun, 7 Nov 2004 23:17:29 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3jP-0000KX-5p; Sun, 07 Nov 2004 23:14:27 -0800 Date: Sun, 7 Nov 2004 23:14:27 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 7/12] Host AP: Fix compilation with PRISM2_NO_STATION_MODES defined. Message-ID: <20041108071427.GH1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11561 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 934 Lines: 36 Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:38:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:38:44 -08:00 @@ -597,6 +597,7 @@ } +#ifndef PRISM2_NO_STATION_MODES static int hostap_join_ap(struct net_device *dev) { struct hostap_interface *iface = dev->priv; @@ -634,6 +635,7 @@ return 0; } +#endif /* PRISM2_NO_STATION_MODES */ static int prism2_ioctl_siwap(struct net_device *dev, @@ -1586,7 +1588,8 @@ #else /* !PRISM2_NO_STATION_MODES */ -static inline int prism2_request_hostscan(struct net_device *dev) +static inline int prism2_request_hostscan(struct net_device *dev, + u8 *ssid, u8 ssid_len) { return -EOPNOTSUPP; } -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:18:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:18:07 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87I1q9027217 for ; Sun, 7 Nov 2004 23:18:02 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3jv-0000Kn-R8; Sun, 07 Nov 2004 23:14:59 -0800 Date: Sun, 7 Nov 2004 23:14:59 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 8/12] Host AP: Do not bridge packets to unauthorized ports Message-ID: <20041108071459.GI1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11562 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 3027 Lines: 75 Fix inner-BSS bridge (ap_bridge_packets=1) not to bridge packets to unauthorized ports when IEEE 802.1X/WPA is used (i.e., require that the STA completes authentication before capturing packets in the inner bridge); previously, only association status was used and an attacker could have capture packets to any MAC address even without having proper credentials for using the network (although, the packets were dropped because the controlled port for the STA was unauthorized). Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:38:51 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-07 22:38:51 -08:00 @@ -1035,7 +1035,7 @@ if (skb2 == NULL) printk(KERN_DEBUG "%s: skb_clone failed for " "multicast frame\n", dev->name); - } else if (hostap_is_sta_assoc(local->ap, dst)) { + } else if (hostap_is_sta_authorized(local->ap, dst)) { /* send frame directly to the associated STA using * wireless media and not passing to higher layers */ local->ap->bridged_unicast++; diff -Nru a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c --- a/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:38:51 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.c 2004-11-07 22:38:51 -08:00 @@ -3061,6 +3061,24 @@ /* Called only as a tasklet (software IRQ) */ +int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr) +{ + struct sta_info *sta; + int ret = 0; + + spin_lock(&ap->sta_table_lock); + sta = ap_get_sta(ap, sta_addr); + if (sta != NULL && (sta->flags & WLAN_STA_ASSOC) && !sta->ap && + ((sta->flags & WLAN_STA_AUTHORIZED) || + ap->local->ieee_802_1x == 0)) + ret = 1; + spin_unlock(&ap->sta_table_lock); + + return ret; +} + + +/* Called only as a tasklet (software IRQ) */ int hostap_add_sta(struct ap_data *ap, u8 *sta_addr) { struct sta_info *sta; @@ -3219,6 +3237,7 @@ EXPORT_SYMBOL(hostap_update_sta_ps); EXPORT_SYMBOL(hostap_handle_sta_rx); EXPORT_SYMBOL(hostap_is_sta_assoc); +EXPORT_SYMBOL(hostap_is_sta_authorized); EXPORT_SYMBOL(hostap_add_sta); EXPORT_SYMBOL(hostap_update_rates); EXPORT_SYMBOL(hostap_add_wds_links); diff -Nru a/drivers/net/wireless/hostap/hostap_ap.h b/drivers/net/wireless/hostap/hostap_ap.h --- a/drivers/net/wireless/hostap/hostap_ap.h 2004-11-07 22:38:51 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.h 2004-11-07 22:38:51 -08:00 @@ -255,6 +255,7 @@ struct hostap_ieee80211_hdr *hdr, struct prism2_crypt_data **crypt, void **sta_ptr); int hostap_is_sta_assoc(struct ap_data *ap, u8 *sta_addr); +int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr); int hostap_add_sta(struct ap_data *ap, u8 *sta_addr); int hostap_update_rx_stats(struct ap_data *ap, struct hostap_ieee80211_hdr *hdr, -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:18:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:18:43 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87IcGo027594 for ; Sun, 7 Nov 2004 23:18:38 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3kW-0000Kx-IT; Sun, 07 Nov 2004 23:15:36 -0800 Date: Sun, 7 Nov 2004 23:15:36 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 9/12] Host AP: Fix card enabling after firmware download Message-ID: <20041108071536.GJ1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11563 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 895 Lines: 25 Fix card enabling after firmware download in case any of the netdevs were up when the download was started. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:39:00 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:39:00 -08:00 @@ -1483,7 +1483,10 @@ if (prism2_hw_init2(dev, initial)) return 1; - if (!local->pri_only && !initial) { + /* Enable firmware if secondary image is loaded and at least one of the + * netdevices is up. */ + if (!local->pri_only && + (initial == 0 || (initial == 2 && local->num_dev_open > 0))) { if (!local->dev_enabled) prism2_callback(local, PRISM2_CALLBACK_ENABLE); local->dev_enabled = 1; -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:19:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:19:37 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87JXuU027987 for ; Sun, 7 Nov 2004 23:19:33 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3lO-0000L4-W3; Sun, 07 Nov 2004 23:16:31 -0800 Date: Sun, 7 Nov 2004 23:16:30 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 10/12] Host AP: Use void * instead of unsigned long with {read,write}{b,w} Message-ID: <20041108071630.GK1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11564 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 5084 Lines: 160 Start using void * instead of unsigned long with {read,write}{b,w} to silence compiler warning with Linux 2.6.9-rc2. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:39:06 -08:00 +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:39:06 -08:00 @@ -56,7 +56,7 @@ spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); - writeb(v, dev->mem_start + a); + writeb(v, (void *) dev->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } @@ -68,7 +68,7 @@ u8 v; spin_lock_irqsave(&local->lock, flags); - v = readb(dev->mem_start + a); + v = readb((void *) dev->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -82,7 +82,7 @@ spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); - writew(v, dev->mem_start + a); + writew(v, (void *) dev->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } @@ -94,7 +94,7 @@ u16 v; spin_lock_irqsave(&local->lock, flags); - v = readw(dev->mem_start + a); + v = readw((void *) dev->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -109,12 +109,14 @@ #else /* PRISM2_IO_DEBUG */ -#define HFA384X_OUTB(v,a) writeb((v), dev->mem_start + (a)) -#define HFA384X_INB(a) (u8) readb(dev->mem_start + (a)) -#define HFA384X_OUTW(v,a) writew((v), dev->mem_start + (a)) -#define HFA384X_INW(a) (u16) readw(dev->mem_start + (a)) -#define HFA384X_OUTW_DATA(v,a) writew(cpu_to_le16(v), dev->mem_start + (a)) -#define HFA384X_INW_DATA(a) (u16) le16_to_cpu(readw(dev->mem_start + (a))) +#define HFA384X_OUTB(v,a) writeb((v), (void *) dev->mem_start + (a)) +#define HFA384X_INB(a) (u8) readb((void *) dev->mem_start + (a)) +#define HFA384X_OUTW(v,a) writew((v), (void *) dev->mem_start + (a)) +#define HFA384X_INW(a) (u16) readw((void *) dev->mem_start + (a)) +#define HFA384X_OUTW_DATA(v,a) \ + writew(cpu_to_le16(v), (void *) dev->mem_start + (a)) +#define HFA384X_INW_DATA(a) (u16) \ + le16_to_cpu(readw((void *) dev->mem_start + (a))) #endif /* PRISM2_IO_DEBUG */ diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:39:06 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:39:06 -08:00 @@ -247,7 +247,7 @@ /* Set sreset bit of COR and clear it after hold time */ - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -271,7 +271,7 @@ { unsigned char corsave; - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -306,7 +306,7 @@ }; -static int prism2_plx_check_cis(unsigned long attr_mem, int attr_len, +static int prism2_plx_check_cis(void *attr_mem, int attr_len, unsigned int *cor_offset, unsigned int *cor_index) { @@ -401,7 +401,7 @@ unsigned int pccard_ioaddr, plx_ioaddr; unsigned long pccard_attr_mem; unsigned int pccard_attr_len; - unsigned long attr_mem = 0; + void *attr_mem = NULL; unsigned int cor_offset, cor_index; u32 reg; local_info_t *local = NULL; @@ -422,7 +422,7 @@ if (tmd7160) { /* TMD7160 */ - attr_mem = 0; /* no access to PC Card attribute memory */ + attr_mem = NULL; /* no access to PC Card attribute memory */ printk(KERN_INFO "TMD7160 PCI/PCMCIA adapter: io=0x%x, " "irq=%d, pccard_io=0x%x\n", @@ -448,9 +448,8 @@ goto fail; - attr_mem = (unsigned long) ioremap(pccard_attr_mem, - pccard_attr_len); - if (!attr_mem) { + attr_mem = ioremap(pccard_attr_mem, pccard_attr_len); + if (attr_mem == NULL) { printk(KERN_ERR "%s: cannot remap attr_mem\n", dev_info); goto fail; @@ -532,7 +531,7 @@ free_irq(dev->irq, dev); if (attr_mem) - iounmap((void *) attr_mem); + iounmap(attr_mem); pci_disable_device(pdev); @@ -550,7 +549,7 @@ hfa384x_disable_interrupts(dev); if (iface->local->attr_mem) - iounmap((void *) iface->local->attr_mem); + iounmap(iface->local->attr_mem); if (dev->irq) free_irq(dev->irq, dev); diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:06 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:06 -08:00 @@ -895,7 +895,7 @@ #endif /* PRISM2_PCCARD */ #ifdef PRISM2_PLX - unsigned long attr_mem; + void *attr_mem; unsigned int cor_offset; #endif /* PRISM2_PLX */ -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:20:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:20:20 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87KCu6028246 for ; Sun, 7 Nov 2004 23:20:12 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3m2-0000LK-HD; Sun, 07 Nov 2004 23:17:10 -0800 Date: Sun, 7 Nov 2004 23:17:10 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 11/12] Host AP: Fix PRISM2_IO_DEBUG Message-ID: <20041108071710.GL1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11565 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1202 Lines: 37 From Mark Glines : I just noticed PRISM2_IO_DEBUG doesn't work. This patch gets it working again. I checked the development CVS snapshot, looks like its still broken there. jkm: in addition, fix the other PRISM2_IO_DEBUG function Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:16 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:16 -08:00 @@ -1006,7 +1006,8 @@ static inline void prism2_io_debug_add(struct net_device *dev, int cmd, int reg, int value) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = dev->priv; + local_info_t *local = iface->local; if (!local->io_debug_enabled) return; @@ -1023,7 +1024,8 @@ static inline void prism2_io_debug_error(struct net_device *dev, int err) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = dev->priv; + local_info_t *local = iface->local; unsigned long flags; if (!local->io_debug_enabled) -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sun Nov 7 23:20:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:21:01 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87KtKB028620 for ; Sun, 7 Nov 2004 23:20:55 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CR3mj-0000LU-QL; Sun, 07 Nov 2004 23:17:53 -0800 Date: Sun, 7 Nov 2004 23:17:53 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 12/12] Host AP: Fix netif_carrier_off() in non-client modes Message-ID: <20041108071753.GM1076@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11566 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1635 Lines: 46 Connection status is reported properly only in client modes, so do not try to set netif_carrier_off() in non-client modes. Previously, Master mode may end up being in state where netif_carrier was left off and this may break things like bridging. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:39:25 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-07 22:39:25 -08:00 @@ -3399,8 +3399,11 @@ "", dev_template); if (local->ddev) { - netif_carrier_off(local->dev); - netif_carrier_off(local->ddev); + if (local->iw_mode == IW_MODE_INFRA || + local->iw_mode == IW_MODE_ADHOC) { + netif_carrier_off(local->dev); + netif_carrier_off(local->ddev); + } hostap_init_proc(local); hostap_init_ap_proc(local); return 0; diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:39:25 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-07 22:39:25 -08:00 @@ -1108,6 +1108,13 @@ if (double_reset && local->func->reset_port(dev)) return -EINVAL; + if (local->iw_mode != IW_MODE_INFRA && local->iw_mode != IW_MODE_ADHOC) + { + /* netif_carrier is used only in client modes for now, so make + * sure carrier is on when moving to non-client modes. */ + netif_carrier_on(local->dev); + netif_carrier_on(local->ddev); + } return 0; } -- Jouni Malinen PGP id EFC895FA From herbert@gondor.apana.org.au Sun Nov 7 23:35:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Nov 2004 23:35:21 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA87ZD7s029430 for ; Sun, 7 Nov 2004 23:35:14 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CR433-0002Cs-00; Mon, 08 Nov 2004 18:34:45 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CR430-0000Zr-00; Mon, 08 Nov 2004 18:34:42 +1100 Date: Mon, 8 Nov 2004 18:34:42 +1100 To: "David S. Miller" , Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: Re: Bug in ipv6_ifa_notify? Message-ID: <20041108073441.GA2200@gondor.apana.org.au> References: <20041108061529.GA1774@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108061529.GA1774@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11567 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 828 Lines: 23 On Mon, Nov 08, 2004 at 05:15:29PM +1100, herbert wrote: > > Now the question is is it possible to get dupliate RTM_NEWADDR > notifications? Actually, it's easier than that. RTM_DELADDR will call ip6_del_rt which will free the rt using dst_free. Since it is still referenced it gets put on the gc list. The next RTM_NEWADDR will put it back in the table. From this point onwards anything that gets linked after it will be on the gc list! Jeff/Arnaldo, could you please try shutting down an interface with IPv6 addresses and bringing it back up a few times? This might be the trigger we are looking for. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From util@deuroconsult.ro Mon Nov 8 02:07:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 02:07:20 -0800 (PST) Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8A7EcQ008233 for ; Mon, 8 Nov 2004 02:07:15 -0800 Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by webhosting.rdsbv.ro (8.13.1/8.13.1) with ESMTP id iA8A6o26011789 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 8 Nov 2004 12:06:50 +0200 Date: Mon, 8 Nov 2004 12:06:50 +0200 (EET) From: "Catalin(ux aka Dino) BOIE" X-X-Sender: util@webhosting.rdsbv.ro To: jamal cc: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: Re: [PATCH] Use nfmark as a key for u32 classifier In-Reply-To: <1099669841.1026.18.camel@jzny.localdomain> Message-ID: References: <1099669841.1026.18.camel@jzny.localdomain> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 11569 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 1750 Lines: 57 > I think this is an ok midterm solution and should be applied. Thanks. > One comment Catalin: Can you resend the patch make this a selectable > choice via kconfig? Yes, of course. Also, as a bonus, I will add a mask. Something like this: tc filter add dev eth0 protocol ip parent 1:0 prio 5 u32 \ match mark 0x0090 0xffff \ ^^^^^^ flowid 1:90 It's ok? > Eventually - we should kill this + the indev choices on u32 and move it > up one so that we can have all filters capable of following filters from > other classifiers. As a matter of fact we already have this feature but > it is a little on the inefficient side at the moment. It will be very good. It will add the missing flexibility. I'll try to cook up something. > > cheers, > jamal > > On Fri, 2004-11-05 at 06:38, Catalin(ux aka Dino) BOIE wrote: >> Hello! >> >> I am glad to announce a patch for u32 to allow matches on nfmark. >> The patch is non intrusive (few lines). >> >> Why I did this? Because fw classifier cannot be used together with u32. >> For example, now, you cannot match a mark of 0x90 and a destination >> port of 80. I know you can do it with iptables to do the marking, but if >> you use Jamal actions to apply mark to policed packets, you need this. >> >> All stuff can be found at http://kernel.umbrella.ro/ also. >> >> Dave, please consider adding this patch. >> >> Stephen, if Dave accepts the patch, please apply the iproute2 patch. Thank >> you. >> >> Signed-off-by: Catalin(ux aka Dino) BOIE >> >> Thank you for you time. >> --- >> Catalin(ux aka Dino) BOIE >> catab at deuroconsult.ro >> http://kernel.umbrella.ro/ > --- Catalin(ux aka Dino) BOIE catab at deuroconsult.ro http://kernel.umbrella.ro/ From uweber@astaro.de Mon Nov 8 02:31:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 02:31:58 -0800 (PST) Received: from mail.astaro.com (mail.astaro.com [213.221.123.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8AVimg011015 for ; Mon, 8 Nov 2004 02:31:45 -0800 Received: from [192.168.2.219] (helo=[192.168.2.219]) by mail.astaro.com with esmtp (TLSv1:RC4-MD5:128) (Exim 4.30) id 1CR6Ut-0002ZT-NY; Mon, 08 Nov 2004 11:11:39 +0100 Message-ID: <418F4AF9.7050605@astaro.de> Date: Mon, 08 Nov 2004 11:31:21 +0100 From: Ulrich Weber User-Agent: Mozilla Thunderbird 0.8 (X11/20040926) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Patrick McHardy CC: vpn-failover@lists.balabit.hu, netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net Subject: Re: [Vpn-failover] [RFC] IPSEC failover - Netlink part References: <1099045435.2888.47.camel@nienna.balabit> <418A3630.1040900@astaro.de> <418A71DA.2090607@trash.net> In-Reply-To: <418A71DA.2090607@trash.net> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scan-Signature: 262107729ec67be2b400c3d0c54da46d X-archive-position: 11570 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: uweber@astaro.de Precedence: bulk X-list: netdev Content-Length: 2324 Lines: 79 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 what did you mean with "leaks xfrm_state reference"? The missing xfrm_state_put(x) ? I changed it (see below) to use Krisztian's xfrm_state_replay_update function. |> |> + struct xfrm_replay_state *replay; |> + + x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family); |> + if (x == NULL) { |> + printk(KERN_INFO "Found no xfrm state for sa seq update\n"); |> + return -ESRCH; |> + } |> + |> + if(xfrma[XFRMA_REPLAY-1]) { |> + replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); |> + x->replay = *replay; |> |> |> + } |> + else return -EINVAL; |> |> | ^^ leaks xfrm_state reference | |> + |> + return 0; |> |> | ^^ same here | |> +} + |> static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = { |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)), /* NEW SA */ |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)), /* DEL SA */ |> @@ -867,6 +897,7 @@ |> NLMSG_LENGTH(sizeof(struct xfrm_user_polexpire)), /* POLEXPIRE */ |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush)), /* FLUSH SA */ |> NLMSG_LENGTH(0), /* FLUSH POLICY */ |> + NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),/* UPD SEQ */ |> |> | ^^ what about struct xfrm_replay_state ? it's attached as rt attribute, so it should be ok. - --- static int xfrm_update_seq(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) { ~ struct xfrm_state *x; ~ struct xfrm_usersa_id *p = NLMSG_DATA(nlh); ~ struct xfrm_replay_state *replay; ~ x = xfrm_state_lookup(&p->daddr, p->spi, p->proto, p->family); ~ if (x == NULL) { ~ printk(KERN_INFO "Found no xfrm state for sa seq update\n"); ~ return -ESRCH; ~ } ~ if(xfrma[XFRMA_REPLAY-1]) { ~ replay = RTA_DATA(xfrma[XFRMA_REPLAY - 1]); ~ xfrm_state_replay_update(x, replay); ~ xfrm_state_put(x); ~ } ~ else return -EINVAL; ~ return 0; } -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBj0r522t2oTuElzoRAgBWAKCKSQXB2rX9DeMpMwVIMl9mXfmxUQCfeYYY 1d3V4P8C3+d5YgsYpwkFHPQ= =RihP -----END PGP SIGNATURE----- From SRS0+8d23e2fa27ba1b27467e+442+infradead.org+dwmw2@pentafluge.srs.infradead.org Mon Nov 8 03:57:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 03:57:41 -0800 (PST) Received: from pentafluge.infradead.org ([213.146.154.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8BvYIB017794 for ; Mon, 8 Nov 2004 03:57:35 -0800 Received: from [213.86.99.236] (helo=[172.16.18.64]) by pentafluge.infradead.org with esmtpsa (Exim 4.42 #1 (Red Hat Linux)) id 1CR891-0005NU-El; Mon, 08 Nov 2004 11:57:12 +0000 Subject: Re: Please ignore the corrupt patches sent earlier. From: David Woodhouse To: Jeff Garzik Cc: koushik , romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com, ravinandan.arakali@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com In-Reply-To: <418BE6EC.3060103@pobox.com> References: <200411050523.49239.raghavendra.koushik@s2io.com> <418BE6EC.3060103@pobox.com> Content-Type: text/plain Message-Id: <1099915029.4542.46.camel@hades.cambridge.redhat.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2.dwmw2.1) Date: Mon, 08 Nov 2004 11:57:10 +0000 Content-Transfer-Encoding: 7bit X-SRS-Rewrite: SMTP reverse-path rewritten from by pentafluge.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11571 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dwmw2@infradead.org Precedence: bulk X-list: netdev Content-Length: 410 Lines: 12 On Fri, 2004-11-05 at 15:47 -0500, Jeff Garzik wrote: > FWIW, I have found that use of "cat email-01.txt | sendmail -t" on a > Unix system is the easiest way to send a large number of patches. > > You simply have to provide a minimal email header, a blank line, and > then the patch content itself, in a single text file. And References: headers to keep the mails together in a thread, please. -- dwmw2 From herbert@gondor.apana.org.au Mon Nov 8 04:11:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 04:12:05 -0800 (PST) Received: from arnor.apana.org.au (c211-30-229-77.rivrw4.nsw.optusnet.com.au [211.30.229.77]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8CBuAG018936 for ; Mon, 8 Nov 2004 04:11:56 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CR8M8-0003IE-00; Mon, 08 Nov 2004 23:10:44 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CR8M5-0000wh-00; Mon, 08 Nov 2004 23:10:41 +1100 Date: Mon, 8 Nov 2004 23:10:40 +1100 To: "David S. Miller" , Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: Re: Bug in ipv6_ifa_notify? Message-ID: <20041108121040.GA3618@gondor.apana.org.au> References: <20041108061529.GA1774@gondor.apana.org.au> <20041108073441.GA2200@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108073441.GA2200@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11572 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 666 Lines: 15 On Mon, Nov 08, 2004 at 06:34:41PM +1100, herbert wrote: > > RTM_DELADDR will call ip6_del_rt which will free the rt using > dst_free. Since it is still referenced it gets put on the gc > list. The next RTM_NEWADDR will put it back in the table. > From this point onwards anything that gets linked after it will > be on the gc list! Actually, address objects dont't seem to be kept across interface down/up operations, so this probably can't happen... -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From mcgrof@studorgs.rutgers.edu Mon Nov 8 04:29:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 04:29:46 -0800 (PST) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8CTecd023207 for ; Mon, 8 Nov 2004 04:29:41 -0800 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 11120F99C1; Mon, 8 Nov 2004 07:29:23 -0500 (EST) Date: Mon, 8 Nov 2004 07:29:22 -0500 To: prism54-devel@prism54.org, Netdev , Jouni Malinen Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041108122922.GV388@ruslug.rutgers.edu> Mail-Followup-To: prism54-devel@prism54.org, Netdev , Jouni Malinen References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> <20041105162811.GP388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041105162811.GP388@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 11573 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev Content-Length: 838 Lines: 23 On Fri, Nov 05, 2004 at 11:28:11AM -0500, Luis R. Rodriguez wrote: > On Fri, Nov 05, 2004 at 11:20:37AM -0500, Luis R. Rodriguez wrote: > <-- snip --> > > > Access Point WPA support (NEW) (requires hostapd) > > Access Point WDS Support (NEW) > > For your convenience, here are some links for those of you wishing to test: > > http://prism54.org/pub/linux/snapshot/tars/prism54-cvs-latest.tar.bz2 > http://prism54.org/pub/linux/snapshot/kernel/v2.6/patch-2.6-prism54-cvs-latest.bz2 > http://prism54.org/pub/linux/snapshot/kernel/v2.4/patch-2.4-prism54-cvs-latest.bz2 > > Luis The kernel patches were broken for WDS support as I forgot to include isl_wds.[ch] in the patch process. I have now fixed this in my script. The patches should now work. Luis -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From linux-netdev@gmane.org Mon Nov 8 04:49:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 04:49:08 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.229.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8Cn0uO024920 for ; Mon, 8 Nov 2004 04:49:01 -0800 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 1CR8ws-0000iN-00 for ; Mon, 08 Nov 2004 13:48:42 +0100 Received: from 209.13.230.160 ([209.13.230.160]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 08 Nov 2004 13:48:41 +0100 Received: from javier by 209.13.230.160 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 08 Nov 2004 13:48:41 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com From: Javier Szyszlican Subject: Re: Outbound IPIP Tunnel Packets not shaped/policed Date: Mon, 08 Nov 2004 09:48:36 -0300 Message-ID: <418F6B24.2010200@szysz.com> References: <20041104004019.GO19714@rei.reeler.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@sea.gmane.org Cc: netdev@oss.sgi.com X-Gmane-NNTP-Posting-Host: 209.13.230.160 User-Agent: Mozilla Thunderbird 0.9 (X11/20041106) X-Accept-Language: en-us, en In-Reply-To: <20041104004019.GO19714@rei.reeler.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime X-archive-position: 11574 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: javier@szysz.com Precedence: bulk X-list: netdev Content-Length: 1907 Lines: 64 Thomas, Thanks for helping me. I can't seem to figure this out. The commands are (Generated via firehol) Iptables: -A FORWARD -p 4 -j mark.4 -A OUTPUT -p 4 -j mark.5 -A mark.4 -j MARK --set-mark 0x1 -A mark.5 -j MARK --set-mark 0x1 And in TC: tc qdisc add dev ppp0 root handle 2:0 htb default 22 tc class add dev ppp0 parent 2:0 classid 2:1 htb rate 128kbit ceil 128kbit tc class add dev ppp0 parent 2:1 classid 2:22 htb rate 32kbit ceil 128kbit prio 10 tc class add dev ppp0 parent 2:1 classid 2:21 htb rate 96kbit ceil 128kbit prio 1 tc filter add dev ppp0 protocol ip parent 2:0 prio 1 handle 1 fw flowid 2:21 What do you mean by "same device", all this is on my gateway host, that has the pptp connection (ppp0) and over that the IPIP tunnel. If the IPIP packets geneated by kernel are going to the shaping functions, how is that I don't see them in my tc -s ? Thanks you very much for helping me. Javier Thomas Graf wrote: > * Javier Szyszlican 2004-11-03 20:36 > >>filter parent 2: protocol ip pref 1 fw >>filter parent 2: protocol ip pref 1 fw handle 0x1 classid 2:21 >> >>Chain OUTPUT (policy ACCEPT 794K packets, 111M bytes) >> pkts bytes target prot opt in out source >> destination >> 4984 377K mark.4 4 -- * * 0.0.0.0/0 >> 0.0.0.0/0 >> >>Chain mark.4 (1 references) >> pkts bytes target prot opt in out source >> destination >> 4984 377K MARK all -- * * 0.0.0.0/0 >> 0.0.0.0/0 MARK set 0x1 > > > Is this on the same device? I have such a setup in my test suite > and it works fine with the latest bk snapshot. Can you show me > the actual commands you execute? > > >>So, I'm guessing that the IPIP packets generated by the kernel, are not >>going into the packet scheduling routines/functions. > > > They surely are. > > From yoshfuji@linux-ipv6.org Mon Nov 8 05:29:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 05:29:29 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8DTKTR026694 for ; Mon, 8 Nov 2004 05:29:21 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 6857133CE5; Mon, 8 Nov 2004 22:30:04 +0900 (JST) Date: Mon, 08 Nov 2004 08:30:03 -0500 (EST) Message-Id: <20041108.083003.119488506.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, acme@conectiva.com.br, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: Bug in ipv6_ifa_notify? From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041108061529.GA1774@gondor.apana.org.au> References: <20041108061529.GA1774@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11575 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1418 Lines: 35 In article <20041108061529.GA1774@gondor.apana.org.au> (at Mon, 8 Nov 2004 17:15:29 +1100), Herbert Xu says: > Hi: > > I'm reviewing the changes between 2.6.8.1 and 2.6.9. The following > change caught my eye: > > # ChangeSet > # 2004/08/17 11:25:16+09:00 yoshfuji@linux-ipv6.org > # [IPV6] refer inet6 device via corresponding local route from address structure. > > In particular, it changed the handling of RTM_NEWADDR in ipv6_ifa_notify. > Previously if you received duplicate RTM_NEWADDR notifications > ip6_rt_addr_add would allocate a new rt and then free it since > ip6_ins_rt would fail. > > With the new code, it will call ip6_ins_rt on the *same* rt > again which will cause it to be dst_free'd. I don't see any > way for this to lead to dst underflows yet, but it'll certainly > corrupt the routing table since dst_free modifies rt->u.next. > > Now the question is is it possible to get dupliate RTM_NEWADDR > notifications? It used to (before http://linux.bkbits.net:8080/linux-2.5/cset@41216bc8qWlBbT2LRIeGJegBQQxczg). But, it does not happen now; RTM_NEWADDR notification is called 1. when we has successfully finished DAD or 2. if the interface does not need DAD We've tested simple (but including multiple multiple) up/down case. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From tgraf@suug.ch Mon Nov 8 05:54:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 05:54:33 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8DsS0P028604 for ; Mon, 8 Nov 2004 05:54:29 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 9C744F; Mon, 8 Nov 2004 14:53:48 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 781BB1C0E8; Mon, 8 Nov 2004 14:54:31 +0100 (CET) Date: Mon, 8 Nov 2004 14:54:31 +0100 From: Thomas Graf To: Patrick McHardy Cc: Szymon Miotk , netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-ID: <20041108135431.GE31969@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418ECE85.9090203@trash.net> X-archive-position: 11576 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 425 Lines: 13 > + /* unlink inner qdiscs from dev->qdisc_list immediately */ > + if (qdisc->ops->cl_ops != NULL) > + list_add(&qdisc->list, &cql); I think you should extend the above to: if (qdisc->ops->cl_ops != NULL && !list_empty(&qdisc->list)) Otherwise you might unlink entries just added before the rcu callback and it prevents an unneeded attempt to delete qdiscs for inner classful qdiscs Otherwise the patch looks very good. From EAMONN.HAMILTON@saic.com Mon Nov 8 06:03:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 06:03:53 -0800 (PST) Received: from cpmx2.mail.saic.com (cpmx2.mail.saic.com [139.121.17.172]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8E3kWB029281 for ; Mon, 8 Nov 2004 06:03:46 -0800 Received: from cp-its-ieg01.mail.saic.com by cpmx2.mail.saic.com; Mon, 8 Nov 2004 06:03:16 -0800 Received: from cpmx.mail.saic.com ([139.121.17.160]) by cp-its-ieg01.mail.saic.com (SAVSMTP 3.1.6.45) with SMTP id M2004110806031628053 ; Mon, 08 Nov 2004 06:03:16 -0800 Received: from ukabzc383.uk.saic.com by cpmx.mail.saic.com with ESMTP; Mon, 8 Nov 2004 06:03:16 -0800 Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id DA38E2B028; Mon, 8 Nov 2004 14:03:10 +0000 (GMT) Received: from ukabzc383.uk.saic.com ([127.0.0.1]) by localhost (ukabzc383.uk.saic.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 23841-09; Mon, 8 Nov 2004 14:03:07 +0000 (GMT) Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id AB4A92B027; Mon, 8 Nov 2004 14:03:07 +0000 (GMT) Subject: Re: linux 2.6.9: r8169: eth0: PCI error (status: 0x8404). Device disabled. From: Eamonn Hamilton To: Francois Romieu Cc: Eamonn Hamilton , netdev In-Reply-To: <20041022105224.GA26714@electric-eye.fr.zoreil.com> References: <1098269117.6631.5.camel@ukabzc383.uk.saic.com> <20041020121520.GA4004@electric-eye.fr.zoreil.com> <1098282567.6631.10.camel@ukabzc383.uk.saic.com> <20041020201010.GA13023@electric-eye.fr.zoreil.com> <1098350743.15528.40.camel@ukabzc383.uk.saic.com> <20041021120208.GA752@electric-eye.fr.zoreil.com> <1098437493.5513.8.camel@ukabzc383.uk.saic.com> <20041022105224.GA26714@electric-eye.fr.zoreil.com> Content-Type: text/plain Date: Mon, 08 Nov 2004 14:03:06 +0000 Message-Id: <1099922587.16833.2.camel@ukabzc383.uk.saic.com> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at saic.com X-archive-position: 11577 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: EAMONN.HAMILTON@saic.com Precedence: bulk X-list: netdev Content-Length: 1044 Lines: 41 Hi Francois. Sorry for the delay in getting back to you - real life has a nasty habit of intruding :( Anyway, The device was brought back to functioning order by removing the module and re-inserting it. I have to confess, I forgot to try simply downing/upping it, I'll ask my friend to try that should it happen again. Bizarrely, the frequency of it happening seems to be down for whatever reason - it took ~12GB traffic to cause it to happen this afternoon. Anyway, hope this helps. Cheers, Eamonn On Fri, 2004-10-22 at 12:52 +0200, Francois Romieu wrote: > Eamonn Hamilton : > [...] > > Testing the kernel with the error reset disabled just causes networking > > to stop, with no reported error after copying data from the box for a > > bit ( < 1GB ) > > At this point, can you have network traffic again is the device goes > through closed/open or the module through rmmod/insmod ? > > > Hope this helps, > > Yes. > > -- > Ueimor -- Eamonn Hamilton Senior Systems Engineer SAIC Ltd Tel : 01224 333833 From joerg@dorchain.net Mon Nov 8 06:18:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 06:18:23 -0800 (PST) Received: from Redstar.dorchain.net (153-133-088-212.ip-addr.teresto.net [212.88.133.153]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8EIGmn030028 for ; Mon, 8 Nov 2004 06:18:17 -0800 Received: (from joerg@localhost) by Redstar.dorchain.net (8.13.1/8.13.1) id iA8EHpWE019077; Mon, 8 Nov 2004 15:17:51 +0100 Date: Mon, 8 Nov 2004 15:17:51 +0100 From: Joerg Dorchain To: prism54-devel@prism54.org, Netdev , Jouni Malinen Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041108141751.GM23338@Redstar.dorchain.net> References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> <20041105162811.GP388@ruslug.rutgers.edu> <20041108122922.GV388@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="L2zmpNdaDxUzilj2" Content-Disposition: inline In-Reply-To: <20041108122922.GV388@ruslug.rutgers.edu> X-message-flag: Formating hard disk. please wait... 10%... 20%... User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11578 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: joerg@dorchain.net Precedence: bulk X-list: netdev Content-Length: 1210 Lines: 42 --L2zmpNdaDxUzilj2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Nov 08, 2004 at 07:29:22AM -0500, Luis R. Rodriguez wrote: > >=20 > > > Access Point WPA support (NEW) (requires hostapd) > > > Access Point WDS Support (NEW) > >=20 > > For your convenience, here are some links for those of you wishing to t= est: > >=20 > > http://prism54.org/pub/linux/snapshot/tars/prism54-cvs-latest.tar.bz2 >=20 > The kernel patches were broken for WDS support as I forgot to include > isl_wds.[ch] in the patch process. I have now fixed this in my script. > The patches should now work. The built outside the kernel tree (linus 2.6.9) still has not changed. There is still a include for isl_wds.h missing in islpci_eth.c, and "dev_alloc" is still an undefined symbol. Bye, Joerg --L2zmpNdaDxUzilj2 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBj4APjY4+4PdzvOARAiZrAJ9hUBm3oetGO2rKL1TJ72/w8pGupgCfdtmY Fnv+BSCeD5HhSed0EdZkJEo= =M9TB -----END PGP SIGNATURE----- --L2zmpNdaDxUzilj2-- From mcgrof@studorgs.rutgers.edu Mon Nov 8 07:16:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 07:16:42 -0800 (PST) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8FGa3T032222 for ; Mon, 8 Nov 2004 07:16:37 -0800 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 101B4F99BE; Mon, 8 Nov 2004 10:16:18 -0500 (EST) Date: Mon, 8 Nov 2004 10:16:18 -0500 To: Joerg Dorchain Cc: prism54-devel@prism54.org, Netdev , Jouni Malinen Subject: Re: [Prism54-devel] Prism54 AP WPA using Hostap and WDS Message-ID: <20041108151618.GW388@ruslug.rutgers.edu> Mail-Followup-To: Joerg Dorchain , prism54-devel@prism54.org, Netdev , Jouni Malinen References: <20041104032219.GU388@ruslug.rutgers.edu> <20041105162037.GN388@ruslug.rutgers.edu> <20041105162811.GP388@ruslug.rutgers.edu> <20041108122922.GV388@ruslug.rutgers.edu> <20041108141751.GM23338@Redstar.dorchain.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108141751.GM23338@Redstar.dorchain.net> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 11579 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev Content-Length: 996 Lines: 31 On Mon, Nov 08, 2004 at 03:17:51PM +0100, Joerg Dorchain wrote: > On Mon, Nov 08, 2004 at 07:29:22AM -0500, Luis R. Rodriguez wrote: > > > > > > > Access Point WPA support (NEW) (requires hostapd) > > > > Access Point WDS Support (NEW) > > > > > > For your convenience, here are some links for those of you wishing to test: > > > > > > http://prism54.org/pub/linux/snapshot/tars/prism54-cvs-latest.tar.bz2 > > > > The kernel patches were broken for WDS support as I forgot to include > > isl_wds.[ch] in the patch process. I have now fixed this in my script. > > The patches should now work. > > The built outside the kernel tree (linus 2.6.9) still has not changed. > There is still a include for isl_wds.h missing in islpci_eth.c, and > "dev_alloc" is still an undefined symbol. > > Bye, > > Joerg Joerg, thanks yes this was the second thing I was going to look into. I'll work on it next. Thanks, Luis -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From kaber@trash.net Mon Nov 8 08:10:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 08:10:53 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8GAmTR002126 for ; Mon, 8 Nov 2004 08:10:49 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRC64-0005wE-8O; Mon, 08 Nov 2004 17:10:24 +0100 Message-ID: <418F9A70.7040400@trash.net> Date: Mon, 08 Nov 2004 17:10:24 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Ulrich Weber CC: vpn-failover@lists.balabit.hu, netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net Subject: Re: [Vpn-failover] [RFC] IPSEC failover - Netlink part References: <1099045435.2888.47.camel@nienna.balabit> <418A3630.1040900@astaro.de> <418A71DA.2090607@trash.net> <418F4AF9.7050605@astaro.de> In-Reply-To: <418F4AF9.7050605@astaro.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11580 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 952 Lines: 32 Ulrich Weber wrote: > what did you mean with "leaks xfrm_state reference"? The missing > xfrm_state_put(x) ? Yes. > I changed it (see below) to use Krisztian's xfrm_state_replay_update > function. Even better. > |> static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = { > |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)), /* NEW SA */ > |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)), /* DEL SA */ > |> @@ -867,6 +897,7 @@ > |> NLMSG_LENGTH(sizeof(struct xfrm_user_polexpire)), /* POLEXPIRE */ > |> NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush)), /* FLUSH SA */ > |> NLMSG_LENGTH(0), /* FLUSH POLICY */ > |> + NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),/* UPD SEQ */ > |> > |> > | ^^ what about struct xfrm_replay_state ? > it's attached as rt attribute, so it should be ok. But you don't check it's size. You need to include it here or check it when you use it. Regards Patrick From kaber@trash.net Mon Nov 8 08:12:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 08:12:29 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8GCO2w002532 for ; Mon, 8 Nov 2004 08:12:24 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRC7c-0005wS-B9; Mon, 08 Nov 2004 17:12:00 +0100 Message-ID: <418F9AD0.1040701@trash.net> Date: Mon, 08 Nov 2004 17:12:00 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: Szymon Miotk , netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> In-Reply-To: <20041108135431.GE31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11581 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 596 Lines: 24 Thomas Graf wrote: >>+ /* unlink inner qdiscs from dev->qdisc_list immediately */ >>+ if (qdisc->ops->cl_ops != NULL) >>+ list_add(&qdisc->list, &cql); >> >> > >I think you should extend the above to: > >if (qdisc->ops->cl_ops != NULL && !list_empty(&qdisc->list)) > >Otherwise you might unlink entries just added before the >rcu callback and it prevents an unneeded attempt to delete >qdiscs for inner classful qdiscs > > There is some optimization possible, I will do this for the final patch. But I don't understand the problem you refer to, can you please explain ? Regards Patrick From ravinandan.arakali@s2io.com Mon Nov 8 09:56:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 09:56:38 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8HuVI8012517 for ; Mon, 8 Nov 2004 09:56:32 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA8Htrje026152; Mon, 8 Nov 2004 12:55:53 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iA8Htm39028143; Mon, 8 Nov 2004 12:55:50 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" Cc: "'koushik'" , , , , , Subject: RE: Please ignore the corrupt patches sent earlier. Date: Mon, 8 Nov 2004 09:55:31 -0800 Message-ID: <000a01c4c5bc$241c8970$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 In-Reply-To: <418D059D.7010803@pobox.com> Importance: Normal X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11582 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Content-Length: 1068 Lines: 35 Jeff, All the 12 patches were sent by Koushik on Fri evening. We(Rapuru, myself) have received it. mailq shows the following error for your address "Sender address rejected: Domain not found". Is there an alternate address where we can send the patches ? Can anybody on the netdev list confirm if they got the patches ? Regards, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Saturday, November 06, 2004 9:11 AM To: ravinandan.arakali@s2io.com Cc: 'koushik'; romieu@fr.zoreil.com; netdev@oss.sgi.com; leonid.grossman@s2io.com; rapuru.sriram@s2io.com; alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. Ravinandan Arakali wrote: > Jeff, > Thanks for the excellent suggestion. We have used this method to send all > the 12 patches. Note that since our mail server went down and came back > up during this process, the mail containing patch3 has appeared twice. > Pls ignore the duplicate. Alas, I'm still waiting for the patches... Does 'mailq' show messages waiting to be delivered? Jeff From tgraf@suug.ch Mon Nov 8 10:32:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 10:33:05 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8IWwR1013813 for ; Mon, 8 Nov 2004 10:32:58 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 4399BF; Mon, 8 Nov 2004 19:32:17 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 817661C0E8; Mon, 8 Nov 2004 19:33:00 +0100 (CET) Date: Mon, 8 Nov 2004 19:33:00 +0100 From: Thomas Graf To: Patrick McHardy Cc: Szymon Miotk , netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-ID: <20041108183300.GF31969@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418F9AD0.1040701@trash.net> X-archive-position: 11583 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1117 Lines: 31 * Patrick McHardy <418F9AD0.1040701@trash.net> 2004-11-08 17:12 > Thomas Graf wrote: > > >>+ /* unlink inner qdiscs from dev->qdisc_list immediately */ > >>+ if (qdisc->ops->cl_ops != NULL) > >>+ list_add(&qdisc->list, &cql); > >> > >> > > > >I think you should extend the above to: > > > >if (qdisc->ops->cl_ops != NULL && !list_empty(&qdisc->list)) > > > >Otherwise you might unlink entries just added before the > >rcu callback and it prevents an unneeded attempt to delete > >qdiscs for inner classful qdiscs > > > > > There is some optimization possible, I will do this for the final > patch. But I don't understand the problem you refer to, can you > please explain ? I don't have the time to verify this at the moment but: 1) qdisc_destroy unlinking all the lists 2) RTM_NEWQDISC creating a new qdisc with the same major classid as the old one which will suceed since the old one cannot be found anymore. 3) rcu callback __qdisc_destroy -> qdisc_destroy looking through qdisc_list again and then deleting the new entries because their major classid matches. I might be missing something though. From ravinandan.arakali@s2io.com Mon Nov 8 11:09:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 11:09:12 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8J98CH015307 for ; Mon, 8 Nov 2004 11:09:08 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA8J8Pje026773; Mon, 8 Nov 2004 14:08:25 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iA8J8D39014420; Mon, 8 Nov 2004 14:08:23 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" Cc: "'koushik'" , , , , , Subject: RE: Please ignore the corrupt patches sent earlier. Date: Mon, 8 Nov 2004 11:07:56 -0800 Message-ID: <001f01c4c5c6$422f5050$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 In-Reply-To: Importance: Normal X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11585 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Content-Length: 1754 Lines: 56 Jeff, By default, sendmail puts the From: address as "root@linux.site". We suspect this may be causing your pobox domain to reject the message. We'll try sending the first patch to you with From: address set to Koushik's(using -f option of sendmail). Kindly ack if you get the patch and we'll send the rest of the patches. Thanks, Ravi -----Original Message----- From: Ravinandan Arakali [mailto:ravinandan.arakali@s2io.com] Sent: Monday, November 08, 2004 9:56 AM To: 'Jeff Garzik' Cc: 'koushik'; 'romieu@fr.zoreil.com'; 'netdev@oss.sgi.com'; 'leonid.grossman@s2io.com'; 'rapuru.sriram@s2io.com'; 'alicia.pena@s2io.com' Subject: RE: Please ignore the corrupt patches sent earlier. Jeff, All the 12 patches were sent by Koushik on Fri evening. We(Rapuru, myself) have received it. mailq shows the following error for your address "Sender address rejected: Domain not found". Is there an alternate address where we can send the patches ? Can anybody on the netdev list confirm if they got the patches ? Regards, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Saturday, November 06, 2004 9:11 AM To: ravinandan.arakali@s2io.com Cc: 'koushik'; romieu@fr.zoreil.com; netdev@oss.sgi.com; leonid.grossman@s2io.com; rapuru.sriram@s2io.com; alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. Ravinandan Arakali wrote: > Jeff, > Thanks for the excellent suggestion. We have used this method to send all > the 12 patches. Note that since our mail server went down and came back > up during this process, the mail containing patch3 has appeared twice. > Pls ignore the duplicate. Alas, I'm still waiting for the patches... Does 'mailq' show messages waiting to be delivered? Jeff From kaber@trash.net Mon Nov 8 11:46:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 11:46:49 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8Jkg5l016044 for ; Mon, 8 Nov 2004 11:46:43 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRFT0-0006Rk-Pt; Mon, 08 Nov 2004 20:46:18 +0100 Message-ID: <418FCD0A.4040202@trash.net> Date: Mon, 08 Nov 2004 20:46:18 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: Szymon Miotk , netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> In-Reply-To: <20041108183300.GF31969@postel.suug.ch> Content-Type: multipart/mixed; boundary="------------090707000604020204090600" X-archive-position: 11586 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2707 Lines: 97 This is a multi-part message in MIME format. --------------090707000604020204090600 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Thomas Graf wrote: >* Patrick McHardy <418F9AD0.1040701@trash.net> 2004-11-08 17:12 > > >>There is some optimization possible, I will do this for the final >>patch. But I don't understand the problem you refer to, can you >>please explain ? >> > >I don't have the time to verify this at the moment but: > >1) qdisc_destroy unlinking all the lists >2) RTM_NEWQDISC creating a new qdisc with the same major classid as the old one > which will suceed since the old one cannot be found anymore. >3) rcu callback __qdisc_destroy -> qdisc_destroy looking through qdisc_list > again and then deleting the new entries because their major classid matches. > >I might be missing something though. > You're right, thanks. The optimization already fixed this, but I wasn't aware of the bug :) New patch attached. Regards Patrick --------------090707000604020204090600 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" ===== net/sched/sch_api.c 1.42 vs edited ===== --- 1.42/net/sched/sch_api.c 2004-11-07 05:03:04 +01:00 +++ edited/net/sched/sch_api.c 2004-11-08 02:38:04 +01:00 @@ -196,10 +196,14 @@ { struct Qdisc *q; + read_lock_bh(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { - if (q->handle == handle) + if (q->handle == handle) { + read_unlock_bh(&qdisc_tree_lock); return q; + } } + read_unlock_bh(&qdisc_tree_lock); return NULL; } ===== net/sched/sch_generic.c 1.30 vs edited ===== --- 1.30/net/sched/sch_generic.c 2004-11-06 01:34:45 +01:00 +++ edited/net/sched/sch_generic.c 2004-11-08 20:41:58 +01:00 @@ -483,10 +483,32 @@ void qdisc_destroy(struct Qdisc *qdisc) { + struct list_head cql = LIST_HEAD_INIT(cql); + struct Qdisc *cq, *q, *n; + if (qdisc->flags & TCQ_F_BUILTIN || !atomic_dec_and_test(&qdisc->refcnt)) return; - list_del(&qdisc->list); + + if (!list_empty(&qdisc->list)) { + if (qdisc->ops->cl_ops == NULL) + list_del(&qdisc->list); + else + list_move(&qdisc->list, &cql); + } + + /* unlink inner qdiscs from dev->qdisc_list immediately */ + list_for_each_entry(cq, &cql, list) + list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list) + if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) { + if (q->ops->cl_ops != NULL) + list_move_tail(&q->list, &cql); + else + list_del_init(&q->list); + } + list_for_each_entry_safe(cq, n, &cql, list) + list_del_init(&cq->list); + call_rcu(&qdisc->q_rcu, __qdisc_destroy); } --------------090707000604020204090600-- From tgraf@suug.ch Mon Nov 8 12:15:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 12:15:49 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8KFgZq016824 for ; Mon, 8 Nov 2004 12:15:43 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 459AAF; Mon, 8 Nov 2004 21:15:02 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 070CA1C0EA; Mon, 8 Nov 2004 21:15:44 +0100 (CET) Date: Mon, 8 Nov 2004 21:15:44 +0100 From: Thomas Graf To: Patrick McHardy Cc: Szymon Miotk , netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-ID: <20041108201544.GG31969@postel.suug.ch> References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <418FCD0A.4040202@trash.net> X-archive-position: 11587 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 203 Lines: 5 * Patrick McHardy <418FCD0A.4040202@trash.net> 2004-11-08 20:46 > You're right, thanks. The optimization already fixed this, but I > wasn't aware of the bug :) New patch attached. Looks perfectly fine. From herbert@gondor.apana.org.au Mon Nov 8 12:38:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 12:38:34 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8KcQKr020735 for ; Mon, 8 Nov 2004 12:38:27 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRGGq-0003my-00; Tue, 09 Nov 2004 07:37:48 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRGGj-0000GI-00; Tue, 09 Nov 2004 07:37:41 +1100 Date: Tue, 9 Nov 2004 07:37:41 +1100 To: "David S. Miller" , Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , netdev@oss.sgi.com Subject: Re: Bug in ipv6_ifa_notify? Message-ID: <20041108203741.GA993@gondor.apana.org.au> References: <20041108061529.GA1774@gondor.apana.org.au> <20041108073441.GA2200@gondor.apana.org.au> <20041108121040.GA3618@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108121040.GA3618@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11588 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1091 Lines: 23 On Mon, Nov 08, 2004 at 11:10:40PM +1100, herbert wrote: > On Mon, Nov 08, 2004 at 06:34:41PM +1100, herbert wrote: > > > > RTM_DELADDR will call ip6_del_rt which will free the rt using > > dst_free. Since it is still referenced it gets put on the gc > > list. The next RTM_NEWADDR will put it back in the table. > > From this point onwards anything that gets linked after it will > > be on the gc list! > > Actually, address objects dont't seem to be kept across interface > down/up operations, so this probably can't happen... Well I've found a way for this to occur, but I must say that it is fairly unlikely. When you bring the interface down, addrconf_ifdown will try to to delete the addrconf timer and then notify DELADDR. Since it doesn't wait for the timer to complete, it might still be executing. Therefore it is possible to have a NEWADDR after a DELADDR event. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From jesse.brandeburg@intel.com Mon Nov 8 14:51:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 14:51:19 -0800 (PST) Received: from caduceus.jf.intel.com (fmr06.intel.com [134.134.136.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8MpE0g026011 for ; Mon, 8 Nov 2004 14:51:14 -0800 Received: from petasus.jf.intel.com (petasus.jf.intel.com [10.7.209.6]) by caduceus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iA8MoXUi005911; Mon, 8 Nov 2004 22:50:33 GMT Received: from nwlxmail01.jf.intel.com (nwlxmail01.jf.intel.com [10.7.171.40]) by petasus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with ESMTP id iA8MsaaU017597; Mon, 8 Nov 2004 22:54:36 GMT Received: from isotope.jf.intel.com (isotope.jf.intel.com [10.23.51.23]) by nwlxmail01.jf.intel.com (8.12.10/8.12.9/MailSET/Hub) with ESMTP id iA8MocgP022835; Mon, 8 Nov 2004 14:50:38 -0800 Date: Mon, 8 Nov 2004 14:50:38 -0800 (PST) From: Jesse Brandeburg X-X-Sender: jbrandeb@isotope.jf.intel.com To: Jeff Garzik cc: "Brandeburg, Jesse" , , Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks In-Reply-To: <418B2C3F.60107@pobox.com> Message-ID: ReplyTo: "Jesse Brandeburg" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 11590 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jesse.brandeburg@intel.com Precedence: bulk X-list: netdev Content-Length: 1284 Lines: 33 Try again: This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg ===== drivers/net/ixgb/ixgb_main.c 1.21 vs edited ===== --- 1.21/drivers/net/ixgb/ixgb_main.c 2004-11-04 21:00:33 -08:00 +++ edited/drivers/net/ixgb/ixgb_main.c 2004-11-08 13:58:01 -08:00 @@ -1613,13 +1613,14 @@ __netif_rx_schedule(netdev); } #else - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_rx_irq(adapter) == FALSE) + /* yes, that is actually a & and it is meant to make sure that + * every pass through this for loop checks both receive and + * transmit queues for completed descriptors, intended to + * avoid starvation issues and assist tx/rx fairness. */ + for(i = 0; i < IXGB_MAX_INTR; i++) + if(!ixgb_clean_rx_irq(adapter) & + !ixgb_clean_tx_irq(adapter)) break; - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_tx_irq(adapter) == FALSE) - break; - /* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to * set IMS:RXDMT0 to 1 to restart the RBD timer (POLL) */ From jgarzik@pobox.com Mon Nov 8 14:58:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 14:59:03 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8Mwtpt026701 for ; Mon, 8 Nov 2004 14:58:56 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRIT5-0003x6-S9; Mon, 08 Nov 2004 22:58:36 +0000 Message-ID: <418FFA0D.8080207@pobox.com> Date: Mon, 08 Nov 2004 17:58:21 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: ravinandan.arakali@s2io.com CC: "'koushik'" , romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com, rapuru.sriram@s2io.com, alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. References: <001f01c4c5c6$422f5050$9810100a@S2IOtech.com> In-Reply-To: <001f01c4c5c6$422f5050$9810100a@S2IOtech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11591 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 400 Lines: 15 Ravinandan Arakali wrote: > Jeff, > By default, sendmail puts the From: address as "root@linux.site". > We suspect this may be causing your pobox domain to reject the > message. We'll try sending the first patch to you with > From: address set to Koushik's(using -f option of sendmail). > Kindly ack if you get the patch and we'll send the rest of the > patches. I just received patch #1. Jeff From akpm@osdl.org Mon Nov 8 15:07:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:07:19 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8N7C3q027444 for ; Mon, 8 Nov 2004 15:07:13 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA8N6c918814; Mon, 8 Nov 2004 15:06:38 -0800 Date: Mon, 8 Nov 2004 15:10:48 -0800 From: Andrew Morton To: Jesse Brandeburg Cc: jgarzik@pobox.com, jesse.brandeburg@intel.com, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks Message-Id: <20041108151048.4bf605c1.akpm@osdl.org> In-Reply-To: References: <418B2C3F.60107@pobox.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11592 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 475 Lines: 10 Jesse Brandeburg wrote: > > This patch undoes a change that we believe will impact performance adversely, > by creating possibly too long a delay between servicing completions. Maybe. But now take a look at how much additional pointless work will be done in the common case. For instance, every tx completion will incur a call to ixgb_clean_rx_irq(), which then calls ixgb_alloc_rx_buffers(). There's quite a bit which can be optimised here. From raghavendra.koushik@s2io.com Mon Nov 8 15:16:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:16:18 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NGEpH028217 for ; Mon, 8 Nov 2004 15:16:14 -0800 Received: by linux.site (Postfix, from userid 0) id 557713290B; Mon, 8 Nov 2004 08:13:44 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 3/12] S2io: optimizations Message-Id: <20041108161344.557713290B@linux.site> Date: Mon, 8 Nov 2004 08:13:44 -0800 (PST) X-archive-position: 11593 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 6835 Lines: 235 Hi, Following are the optimization-related changes made in this patch. 1. Definitions of LOW and PANIC levels of the Rx buffers have changed. 2. In wait_for_cmd_complete there is no longer a writeq but just a read and wait for strobe bit to reset. 3. In s2io_isr, the isr_lock has been done away with also the NICs interrupt are no longer disabled explicitly on entering the interrupt handler and re-enabled again before leaving it. 4. Also clearing the semaphore "tasklet_status" when exiting erroneously from s2io_isr after failing fill_rx_buffer call. 5. The set/reset Tx Csum function through ethtool was added to the ethtool_ops structure. 6. Added a Rx side error code in the rx_osm_handler function. 7. No longer stopping and waking Tx queue when link state changes in s2io_link function. 8. removed the isr_lock spinlock from the s2io_nic structure. 9. changed parameters which determine thresholds(LOW and PANIC) to replenish Rx buffers. This has been found to result in better performance. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-06 17:24:02.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-06 17:37:32.751003528 -0700 @@ -80,10 +80,11 @@ static inline int rx_buffer_level(nic_t * sp, int rxb_size, int ring) { int level = 0; - if ((sp->pkt_cnt[ring] - rxb_size) > 128) { + if ((sp->pkt_cnt[ring] - rxb_size) > 16) { level = LOW; - if (rxb_size < sp->pkt_cnt[ring] / 8) + if ((sp->pkt_cnt[ring] - rxb_size) < MAX_RXDS_PER_BLOCK) { level = PANIC; + } } return level; @@ -1916,12 +1917,8 @@ u64 val64; while (TRUE) { - val64 = - RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD - | RMAC_ADDR_CMD_MEM_OFFSET(0); - writeq(val64, &bar0->rmac_addr_cmd_mem); val64 = readq(&bar0->rmac_addr_cmd_mem); - if (!val64) { + if (!(val64 & RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { ret = SUCCESS; break; } @@ -2192,14 +2189,11 @@ register u64 val64 = 0; u16 cnt = 0; - spin_lock(&sp->isr_lock); netif_stop_queue(dev); /* disable Tx and Rx traffic on the NIC */ stop_nic(sp); - spin_unlock(&sp->isr_lock); - /* * If the device tasklet is running, wait till its done * before killing it @@ -2398,15 +2392,13 @@ struct net_device *dev = (struct net_device *) dev_id; nic_t *sp = dev->priv; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; - u64 reason = 0, general_mask = 0; + u64 reason = 0; mac_info_t *mac_control; struct config_param *config; mac_control = &sp->mac_control; config = &sp->config; - spin_lock(&sp->isr_lock); - /* * Identify the cause for interrupt and call the appropriate * interrupt handler. Causes for the interrupt could be; @@ -2419,14 +2411,9 @@ if (!reason) { /* The interrupt was not raised by Xena. */ - spin_unlock(&sp->isr_lock); return IRQ_NONE; } - /* Mask the Interrupts on the NIC. */ - general_mask = readq(&bar0->general_int_mask); - writeq(0xFFFFFFFFFFFFFFFFULL, &bar0->general_int_mask); - /* If Intr is because of Tx Traffic */ if (reason & GEN_INTR_TXTRAFFIC) { tx_intr_handler(sp); @@ -2441,11 +2428,6 @@ if (netif_rx_schedule_prep(dev)) { en_dis_able_nic_intrs(sp, RX_TRAFFIC_INTR, DISABLE_INTRS); - /* - * Here we take a snap shot of the general - * Intr Register. - */ - general_mask = readq(&bar0->general_int_mask); __netif_rx_schedule(dev); } } @@ -2481,9 +2463,9 @@ "%s:Out of memory", dev->name); DBG_PRINT(ERR_DBG, " in ISR!!\n"); - writeq(general_mask, - &bar0->general_int_mask); - spin_unlock(&sp->isr_lock); + clear_bit(0, + (unsigned long *) (&sp-> + tasklet_status)); return IRQ_HANDLED; } clear_bit(0, @@ -2501,10 +2483,6 @@ tasklet_schedule(&sp->task); #endif - /* Unmask all previously enabled interrupts on the NIC. */ - writeq(general_mask, &bar0->general_int_mask); - - spin_unlock(&sp->isr_lock); return IRQ_HANDLED; } @@ -3626,6 +3604,17 @@ return (S2IO_STAT_LEN); } +int s2io_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_IP_CSUM; + else + dev->features &= ~NETIF_F_IP_CSUM; + + return 0; +} + + static struct ethtool_ops netdev_ethtool_ops = { .get_settings = s2io_ethtool_gset, .set_settings = s2io_ethtool_sset, @@ -3641,7 +3630,7 @@ .get_rx_csum = s2io_ethtool_get_rx_csum, .set_rx_csum = s2io_ethtool_set_rx_csum, .get_tx_csum = ethtool_op_get_tx_csum, - .set_tx_csum = ethtool_op_set_tx_csum, + .set_tx_csum = s2io_ethtool_op_set_tx_csum, .get_sg = ethtool_op_get_sg, .set_sg = ethtool_op_set_sg, #ifdef NETIF_F_TSO @@ -3902,6 +3891,12 @@ skb->ip_summed = CHECKSUM_NONE; } + if (rxdp->Control_1 & RXD_T_CODE) { + unsigned long long err = rxdp->Control_1 & RXD_T_CODE; + DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", + dev->name, err); + } + skb->dev = dev; skb_put(skb, len); skb->protocol = eth_type_trans(skb, dev); @@ -3922,25 +3917,6 @@ return SUCCESS; } -int check_for_tx_space(nic_t * sp) -{ - u32 put_off, get_off, queue_len; - int ret = TRUE, i; - - for (i = 0; i < sp->config.tx_fifo_num; i++) { - queue_len = sp->mac_control.tx_curr_put_info[i].fifo_len - + 1; - put_off = sp->mac_control.tx_curr_put_info[i].offset; - get_off = sp->mac_control.tx_curr_get_info[i].offset; - if (((put_off + 1) % queue_len) == get_off) { - ret = FALSE; - break; - } - } - - return ret; -} - /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the @@ -3962,17 +3938,9 @@ if (link == LINK_DOWN) { DBG_PRINT(ERR_DBG, "%s: Link down\n", dev->name); netif_carrier_off(dev); - netif_stop_queue(dev); } else { DBG_PRINT(ERR_DBG, "%s: Link Up\n", dev->name); netif_carrier_on(dev); - if (check_for_tx_space(sp) == TRUE) { - /* - * Dont wake the queue if we know there - * are no free TxDs available. - */ - netif_wake_queue(dev); - } } } sp->last_link_state = link; @@ -4357,7 +4325,6 @@ /* Initialize spinlocks */ spin_lock_init(&sp->tx_lock); - spin_lock_init(&sp->isr_lock); /* * SXE-002: Configure link and activity LED to init state diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-06 17:24:05.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-06 17:37:47.532756360 -0700 @@ -612,7 +612,6 @@ atomic_t rx_bufs_left[MAX_RX_RINGS]; spinlock_t tx_lock; - spinlock_t isr_lock; #define PROMISC 1 #define ALL_MULTI 2 From raghavendra.koushik@s2io.com Mon Nov 8 15:16:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:16:47 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NGhiB028299 for ; Mon, 8 Nov 2004 15:16:43 -0800 Received: by linux.site (Postfix, from userid 0) id 7513632905; Mon, 8 Nov 2004 08:14:13 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 4/12] S2io: hardware fixes Message-Id: <20041108161413.7513632905@linux.site> Date: Mon, 8 Nov 2004 08:14:13 -0800 (PST) X-archive-position: 11594 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 10933 Lines: 331 Hi, Following are the code changes addressing the hardware errata mentioned in user guide. 1. Xena3's with a set of subsystem IDs had Link LED problems, fixed that specifically for them. 2. To write into the Keyed Mac_Cfg register to enable broadcast, writing two 32 bit writes into it along with a write to the key register rather than a single write to key and a 64 bit write to mac_cfg. This is necessary on 32 bit systems where a writeq(64 bit write) is actually two writel (32 bit writes). 3. Writes to some special registers mentioned in UG is being done by a special macro which defines which 32 bits of the 64 bit register is to be written first. Again this applies only on 32 bit systems. 4. Configured pause frame related water marks and a shared_split value which describes the Max TXDMA related split transaction that can be used without giving room for the Rx transactions. 5. The mac_rmac_err_reg R1 register will be cleared in the interrupt handler itself rather than in the scheduled task as was being done previously. 6. Even on PCC_FB_ECC error the card will be reset by disabling adapter enable bit. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-07 11:44:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-07 11:45:41.000000000 -0700 @@ -71,6 +71,15 @@ static char s2io_driver_name[] = "s2io"; static char s2io_driver_version[] = "Version 1.7.5.1"; +/* + * Cards with following subsystem_id have a link state indication + * problem, 600B, 600C, 600D, 640B, 640C and 640D. + * macro below identifies these cards given the subsystem_id. + */ +#define CARDS_WITH_FAULTY_LINK_INDICATORS(subid) \ + (((subid >= 0x600B) && (subid <= 0x600D)) || \ + ((subid >= 0x640B) && (subid <= 0x640D))) ? 1 : 0 + #define LINK_IS_UP(val64) (!(val64 & (ADAPTER_STATUS_RMAC_REMOTE_FAULT | \ ADAPTER_STATUS_RMAC_LOCAL_FAULT))) #define TASKLET_IN_USE test_and_set_bit(0, \ @@ -563,10 +572,13 @@ schedule_timeout(HZ / 2); /* Enable Receiving broadcasts */ + add = (void *) &bar0->mac_cfg; val64 = readq(&bar0->mac_cfg); val64 |= MAC_RMAC_BCAST_ENABLE; writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); - writeq(val64, &bar0->mac_cfg); + writel((u32) val64, add); + writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); + writel((u32) (val64 >> 32), (add + 4)); /* Read registers in all blocks */ val64 = readq(&bar0->mac_int_mask); @@ -598,8 +610,8 @@ dtx_cnt++; goto mdio_cfg; } - writeq(default_dtx_cfg[dtx_cnt], - &bar0->dtx_control); + SPECIAL_REG_WRITE(default_dtx_cfg[dtx_cnt], + &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); dtx_cnt++; } @@ -609,8 +621,8 @@ mdio_cnt++; goto dtx_cfg; } - writeq(default_mdio_cfg[mdio_cnt], - &bar0->mdio_control); + SPECIAL_REG_WRITE(default_mdio_cfg[mdio_cnt], + &bar0->mdio_control, UF); val64 = readq(&bar0->mdio_control); mdio_cnt++; } @@ -873,6 +885,47 @@ writel((u32) (val64 >> 32), (add + 4)); val64 = readq(&bar0->mac_cfg); + /* + * Set the time value to be inserted in the pause frame + * generated by xena. + */ + val64 = readq(&bar0->rmac_pause_cfg); + val64 &= ~(RMAC_PAUSE_HG_PTIME(0xffff)); + val64 |= RMAC_PAUSE_HG_PTIME(nic->mac_control.rmac_pause_time); + writeq(val64, &bar0->rmac_pause_cfg); + + /* + * Set the Threshold Limit for Generating the pause frame + * If the amount of data in any Queue exceeds ratio of + * (mac_control.mc_pause_threshold_q0q3 or q4q7)/256 + * pause frame is generated + */ + val64 = 0; + for (i = 0; i < 4; i++) { + val64 |= + (((u64) 0xFF00 | nic->mac_control. + mc_pause_threshold_q0q3) + << (i * 2 * 8)); + } + writeq(val64, &bar0->mc_pause_thresh_q0q3); + + val64 = 0; + for (i = 0; i < 4; i++) { + val64 |= + (((u64) 0xFF00 | nic->mac_control. + mc_pause_threshold_q4q7) + << (i * 2 * 8)); + } + writeq(val64, &bar0->mc_pause_thresh_q4q7); + + /* + * TxDMA will stop Read request if the number of read split has + * exceeded the limit pointed by shared_splits + */ + val64 = readq(&bar0->pic_control); + val64 |= PIC_CNTL_SHARED_SPLITS(0); + writeq(val64, &bar0->pic_control); + return SUCCESS; } @@ -1227,7 +1280,7 @@ */ val64 = readq(&bar0->mc_rldram_mrs); val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE | MC_RLDRAM_MRS_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); val64 = readq(&bar0->mc_rldram_mrs); set_current_state(TASK_UNINTERRUPTIBLE); @@ -1291,13 +1344,13 @@ * force link down. Since link is already up, we will get * link state change interrupt after this reset */ - writeq(0x80010515001E0000ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80010515001E0000ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); - writeq(0x80010515001E00E0ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80010515001E00E0ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); - writeq(0x80070515001F00E4ULL, &bar0->dtx_control); + SPECIAL_REG_WRITE(0x80070515001F00E4ULL, &bar0->dtx_control, UF); val64 = readq(&bar0->dtx_control); udelay(50); @@ -1884,6 +1937,7 @@ /* Handling link status change error Intr */ err_reg = readq(&bar0->mac_rmac_err_reg); + writeq(err_reg, &bar0->mac_rmac_err_reg); if (err_reg & RMAC_LINK_STATE_CHANGE_INT) { schedule_work(&nic->set_link_task); } @@ -1896,6 +1950,22 @@ schedule_work(&nic->rst_timer_task); } + /* + * Also as mentioned in the latest Errata sheets if the PCC_FB_ECC + * Error occurs, the adapter will be recycled by disabling the + * adapter enable bit and enabling it again after the device + * becomes Quiescent. + */ + val64 = readq(&bar0->pcc_err_reg); + writeq(val64, &bar0->pcc_err_reg); + if (val64 & PCC_FB_ECC_DB_ERR) { + u64 ac = readq(&bar0->adapter_control); + ac &= ~(ADAPTER_CNTL_EN); + writeq(ac, &bar0->adapter_control); + ac = readq(&bar0->adapter_control); + schedule_work(&nic->set_link_task); + } + /* Other type of interrupts are not being handled now, TODO */ } @@ -2870,12 +2940,13 @@ static int s2io_ethtool_idnic(struct net_device *dev, u32 data) { - u64 val64 = 0; + u64 val64 = 0, last_gpio_ctrl_val; nic_t *sp = dev->priv; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; u16 subid; subid = sp->pdev->subsystem_device; + last_gpio_ctrl_val = readq(&bar0->gpio_control); if ((subid & 0xFF) < 0x07) { val64 = readq(&bar0->adapter_control); if (!(val64 & ADAPTER_CNTL_EN)) { @@ -2897,6 +2968,11 @@ schedule_timeout(MAX_SCHEDULE_TIMEOUT); del_timer_sync(&sp->id_timer); + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + writeq(last_gpio_ctrl_val, &bar0->gpio_control); + last_gpio_ctrl_val = readq(&bar0->gpio_control); + } + return 0; } @@ -2983,7 +3059,7 @@ val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) | I2C_CONTROL_BYTE_CNT(0x3) | I2C_CONTROL_READ | I2C_CONTROL_CNTL_START; - writeq(val64, &bar0->i2c_control); + SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF); while (exit_cnt < 5) { val64 = readq(&bar0->i2c_control); @@ -3024,7 +3100,7 @@ val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) | I2C_CONTROL_BYTE_CNT(cnt) | I2C_CONTROL_SET_DATA(data) | I2C_CONTROL_CNTL_START; - writeq(val64, &bar0->i2c_control); + SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF); while (exit_cnt < 5) { val64 = readq(&bar0->i2c_control); @@ -3352,10 +3428,10 @@ val64 = readq(&bar0->mc_rldram_mrs); val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); val64 |= MC_RLDRAM_MRS_ENABLE; - writeq(val64, &bar0->mc_rldram_mrs); + SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF); while (iteration < 2) { val64 = 0x55555555aaaa0000ULL; @@ -3757,8 +3833,10 @@ nic_t *nic = (nic_t *) data; struct net_device *dev = nic->dev; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; - register u64 val64, err_reg; + register u64 val64; + u16 subid; + subid = nic->pdev->subsystem_device; /* * Allow a small delay for the NICs self initiated * cleanup to complete. @@ -3768,16 +3846,19 @@ val64 = readq(&bar0->adapter_status); if (verify_xena_quiescence(val64, nic->device_enabled_once)) { - /* Acknowledge Intr and clear R1 register. */ - err_reg = readq(&bar0->mac_rmac_err_reg); - writeq(err_reg, &bar0->mac_rmac_err_reg); - if (LINK_IS_UP(val64)) { val64 = readq(&bar0->adapter_control); val64 |= ADAPTER_CNTL_EN; writeq(val64, &bar0->adapter_control); - val64 |= ADAPTER_LED_ON; - writeq(val64, &bar0->adapter_control); + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + val64 = readq(&bar0->gpio_control); + val64 |= GPIO_CTRL_GPIO_0; + writeq(val64, &bar0->gpio_control); + val64 = readq(&bar0->gpio_control); + } else { + val64 |= ADAPTER_LED_ON; + writeq(val64, &bar0->adapter_control); + } val64 = readq(&bar0->adapter_status); if (!LINK_IS_UP(val64)) { DBG_PRINT(ERR_DBG, "%s:", dev->name); @@ -3791,6 +3872,12 @@ } s2io_link(nic, LINK_UP); } else { + if (CARDS_WITH_FAULTY_LINK_INDICATORS(subid)) { + val64 = readq(&bar0->gpio_control); + val64 &= ~GPIO_CTRL_GPIO_0; + writeq(val64, &bar0->gpio_control); + val64 = readq(&bar0->gpio_control); + } s2io_link(nic, LINK_DOWN); } } else { /* NIC is not Quiescent. */ @@ -3917,6 +4004,7 @@ return SUCCESS; } + /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-07 11:44:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-08 15:20:09.316690064 -0700 @@ -693,6 +693,27 @@ writel((u32) (val), addr); writel((u32) (val >> 32), (addr + 4)); } + +/* In 32 bit modes, some registers have to be written in a + * particular order to expect correct hardware operation. The + * macro SPECIAL_REG_WRITE is used to perform such ordered + * writes. Defines UF (Upper First) and LF (Lower First) will + * be used to specify the required write order. + */ +#define UF 1 +#define LF 2 +static inline void SPECIAL_REG_WRITE(u64 val, void *addr, int order) +{ + if (order == LF) { + writel((u32) (val), addr); + writel((u32) (val >> 32), (addr + 4)); + } else { + writel((u32) (val >> 32), (addr + 4)); + writel((u32) (val), addr); + } +} +#else +#define SPECIAL_REG_WRITE(val, addr, dummy) writeq(val, addr) #endif /* Interrupt related values of Xena */ From raghavendra.koushik@s2io.com Mon Nov 8 15:17:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:17:25 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NHJ1Y028650 for ; Mon, 8 Nov 2004 15:17:19 -0800 Received: by linux.site (Postfix, from userid 0) id 38B0B32912; Mon, 8 Nov 2004 08:14:49 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 5/12] S2io: module loadable parameters Message-Id: <20041108161449.38B0B32912@linux.site> Date: Mon, 8 Nov 2004 08:14:49 -0800 (PST) X-archive-position: 11595 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 21422 Lines: 669 Hi, This patch adds/modifies the following module loadable parameters. 1. Max Txds per List. 2. statistics refresh time 3. pause frame control parameters including gap between two successive frames, threshold watermarks 4. RTI and TTI configuration parameters including ranges, packet counts and timeout periods. For further information please read the section 3.5 of XFrame H/W spec. 5. PCI/PCI-X configuration variables latency_timer, MMRBC and OST. 6. OS offload features TSO (If support available) and checksum offload. 7. If NAPI is not in use, a variable indicate_max_pkts can be used to limit number of Rx side packets processed for one call to Rx Intr handler. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 15:33:35.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-11 15:34:23.000000000 -0700 @@ -223,14 +223,66 @@ }; /* Module Loadable parameters. */ -static u32 ring_num; static u32 frame_len[MAX_RX_RINGS]; -static u32 ring_len[MAX_RX_RINGS]; -static u32 fifo_num; -static u32 fifo_len[MAX_TX_FIFOS]; static u32 rx_prio; static u32 tx_prio; -static u8 latency_timer; + +static unsigned int lso_enable = 1; +#ifndef CONFIG_S2IO_NAPI +static unsigned int indicate_max_pkts; +#endif +static unsigned int cksum_offload_enable = 1; +static unsigned int tx_fifo_num = 1; +static unsigned int tx_fifo_len_0 = DEFAULT_FIFO_LEN; +static unsigned int tx_fifo_len_1; +static unsigned int tx_fifo_len_2; +static unsigned int tx_fifo_len_3; +static unsigned int tx_fifo_len_4; +static unsigned int tx_fifo_len_5; +static unsigned int tx_fifo_len_6; +static unsigned int tx_fifo_len_7; +static unsigned int max_txds = MAX_SKB_FRAGS; +static unsigned int rx_ring_num = 1; +static unsigned int rx_ring_sz_0 = SMALL_BLK_CNT; +static unsigned int rx_ring_sz_1; +static unsigned int rx_ring_sz_2; +static unsigned int rx_ring_sz_3; +static unsigned int rx_ring_sz_4; +static unsigned int rx_ring_sz_5; +static unsigned int rx_ring_sz_6; +static unsigned int rx_ring_sz_7; +static unsigned int Stats_refresh_time = 4; +static unsigned int rmac_pause_time = 65535; +static unsigned int mc_pause_threshold_q0q3 = 187; +static unsigned int mc_pause_threshold_q4q7 = 187; +static unsigned int shared_splits; +#if defined(__ia64__) +static unsigned int max_splits_trans = XENA_THREE_SPLIT_TRANSACTION; +#else +static unsigned int max_splits_trans = XENA_TWO_SPLIT_TRANSACTION; +#endif +static unsigned int tmac_util_period = 5; +static unsigned int rmac_util_period = 5; +static unsigned int tx_timer_val = 0xFFF; +static unsigned int tx_utilz_periodic = 1; +static unsigned int rx_timer_val = 0xFFF; +static unsigned int rx_utilz_periodic = 1; +static unsigned int tx_urange_a = 0xA; +static unsigned int tx_ufc_a = 0x10; +static unsigned int tx_urange_b = 0x10; +static unsigned int tx_ufc_b = 0x20; +static unsigned int tx_urange_c = 0x30; +static unsigned int tx_ufc_c = 0x40; +static unsigned int tx_ufc_d = 0x80; +static unsigned int rx_urange_a = 0xA; +static unsigned int rx_ufc_a = 0x1; +static unsigned int rx_urange_b = 0x10; +static unsigned int rx_ufc_b = 0x2; +static unsigned int rx_urange_c = 0x30; +static unsigned int rx_ufc_c = 0x40; +static unsigned int rx_ufc_d = 0x80; +static u8 latency_timer = 0xf8; +static u8 max_read_byte_cnt = 2; /* * S2IO device table. @@ -782,14 +834,16 @@ /* Enable statistics */ writeq(mac_control->stats_mem_phy, &bar0->stat_addr); - val64 = SET_UPDT_PERIOD(8) | STAT_CFG_STAT_RO | STAT_CFG_STAT_EN; + val64 = SET_UPDT_PERIOD(Stats_refresh_time) | + STAT_CFG_STAT_RO | STAT_CFG_STAT_EN; writeq(val64, &bar0->stat_cfg); /* * Initializing the sampling rate for the device to calculate the * bandwidth utilization. */ - val64 = MAC_TX_LINK_UTIL_VAL(0x5) | MAC_RX_LINK_UTIL_VAL(0x5); + val64 = MAC_TX_LINK_UTIL_VAL(tmac_util_period) | + MAC_RX_LINK_UTIL_VAL(rmac_util_period); writeq(val64, &bar0->mac_link_util); @@ -798,14 +852,18 @@ * Scheme. */ /* TTI Initialization */ - val64 = TTI_DATA1_MEM_TX_TIMER_VAL(0xFFF) | - TTI_DATA1_MEM_TX_URNG_A(0xA) | TTI_DATA1_MEM_TX_URNG_B(0x10) | - TTI_DATA1_MEM_TX_URNG_C(0x30) | TTI_DATA1_MEM_TX_TIMER_AC_EN; + val64 = TTI_DATA1_MEM_TX_TIMER_VAL(tx_timer_val) | + TTI_DATA1_MEM_TX_URNG_A(tx_urange_a) | + TTI_DATA1_MEM_TX_URNG_B(tx_urange_b) | + TTI_DATA1_MEM_TX_URNG_C(tx_urange_c); + if (tx_utilz_periodic) + val64 |= TTI_DATA1_MEM_TX_TIMER_AC_EN; writeq(val64, &bar0->tti_data1_mem); - val64 = - TTI_DATA2_MEM_TX_UFC_A(0x10) | TTI_DATA2_MEM_TX_UFC_B(0x20) | - TTI_DATA2_MEM_TX_UFC_C(0x40) | TTI_DATA2_MEM_TX_UFC_D(0x80); + val64 = TTI_DATA2_MEM_TX_UFC_A(tx_ufc_a) | + TTI_DATA2_MEM_TX_UFC_B(tx_ufc_b) | + TTI_DATA2_MEM_TX_UFC_C(tx_ufc_c) | + TTI_DATA2_MEM_TX_UFC_D(tx_ufc_d); writeq(val64, &bar0->tti_data2_mem); val64 = TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE_NEW_CMD; @@ -834,13 +892,19 @@ } /* RTI Initialization */ - val64 = RTI_DATA1_MEM_RX_TIMER_VAL(0xFFF) | - RTI_DATA1_MEM_RX_URNG_A(0xA) | RTI_DATA1_MEM_RX_URNG_B(0x10) | - RTI_DATA1_MEM_RX_URNG_C(0x30) | RTI_DATA1_MEM_RX_TIMER_AC_EN; + val64 = RTI_DATA1_MEM_RX_TIMER_VAL(rx_timer_val) | + RTI_DATA1_MEM_RX_URNG_A(rx_urange_a) | + RTI_DATA1_MEM_RX_URNG_B(rx_urange_b) | + RTI_DATA1_MEM_RX_URNG_C(rx_urange_c); + if (rx_utilz_periodic) + val64 |= RTI_DATA1_MEM_RX_TIMER_AC_EN; + writeq(val64, &bar0->rti_data1_mem); - val64 = RTI_DATA2_MEM_RX_UFC_A(0x1) | RTI_DATA2_MEM_RX_UFC_B(0x2) | - RTI_DATA2_MEM_RX_UFC_C(0x40) | RTI_DATA2_MEM_RX_UFC_D(0x80); + val64 = RTI_DATA2_MEM_RX_UFC_A(rx_ufc_a) | + RTI_DATA2_MEM_RX_UFC_B(rx_ufc_b) | + RTI_DATA2_MEM_RX_UFC_C(rx_ufc_c) | + RTI_DATA2_MEM_RX_UFC_D(rx_ufc_d); writeq(val64, &bar0->rti_data2_mem); val64 = RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE_NEW_CMD; @@ -923,7 +987,7 @@ * exceeded the limit pointed by shared_splits */ val64 = readq(&bar0->pic_control); - val64 |= PIC_CNTL_SHARED_SPLITS(0); + val64 |= PIC_CNTL_SHARED_SPLITS(shared_splits); writeq(val64, &bar0->pic_control); return SUCCESS; @@ -1381,7 +1445,7 @@ for (i = 0; i < config->tx_fifo_num; i++) { for (j = 0; j < config->tx_cfg[i].fifo_len - 1; j++) { txdp = mac_control->txdl_start[i] + - (config->max_txds * j); + (config->max_txds * j); skb = (struct sk_buff *) ((unsigned long) txdp-> Host_Control); @@ -1807,7 +1871,12 @@ mac_control->rx_curr_get_info[i].offset = offset_info.offset; pkt_cnt++; + if ((indicate_max_pkts) + && (pkt_cnt > indicate_max_pkts)) + break; } + if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) + break; } } #endif @@ -4004,7 +4073,6 @@ return SUCCESS; } - /** * s2io_link - stops/starts the Tx queue. * @sp : private member of the device structure, which is a pointer to the @@ -4088,17 +4156,23 @@ &latency_timer); } - /* Set MMRB count to 4096 in PCI-X Command register. */ + /* Set MMRB count to 2048 in PCI-X Command register. */ + sp->pcix_cmd &= 0xFFF3; pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, - (sp->pcix_cmd | 0x0C)); + (sp->pcix_cmd | (max_read_byte_cnt << 2))); pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(sp->pcix_cmd)); /* Setting Maximum outstanding splits based on system type. */ sp->pcix_cmd &= 0xFF8F; - sp->pcix_cmd |= - XENA_MAX_OUTSTANDING_SPLITS(XENA_TWO_SPLIT_TRANSACTION); + sp->pcix_cmd |= XENA_MAX_OUTSTANDING_SPLITS(max_splits_trans); + pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, + sp->pcix_cmd); + pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, + &(sp->pcix_cmd)); + /* Forcibly disabling relaxed ordering capability of the card. */ + sp->pcix_cmd &= 0xfffd; pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, sp->pcix_cmd); pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, @@ -4107,14 +4181,58 @@ MODULE_AUTHOR("Raghavendra Koushik "); MODULE_LICENSE("GPL"); -MODULE_PARM(ring_num, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(frame_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(ring_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(fifo_num, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(fifo_len, "1-" __MODULE_STRING(8) "i"); -MODULE_PARM(rx_prio, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(tx_prio, "1-" __MODULE_STRING(1) "i"); -MODULE_PARM(latency_timer, "1-" __MODULE_STRING(1) "i"); +MODULE_PARM(lso_enable, "i"); +#ifndef CONFIG_S2IO_NAPI +MODULE_PARM(indicate_max_pkts, "i"); +#endif +MODULE_PARM(cksum_offload_enable, "i"); +MODULE_PARM(tx_fifo_num, "i"); +MODULE_PARM(tx_fifo_len_0, "i"); +MODULE_PARM(tx_fifo_len_1, "i"); +MODULE_PARM(tx_fifo_len_2, "i"); +MODULE_PARM(tx_fifo_len_3, "i"); +MODULE_PARM(tx_fifo_len_4, "i"); +MODULE_PARM(tx_fifo_len_5, "i"); +MODULE_PARM(tx_fifo_len_6, "i"); +MODULE_PARM(tx_fifo_len_7, "i"); +MODULE_PARM(max_txds, "i"); +MODULE_PARM(rx_ring_num, "i"); +MODULE_PARM(rx_ring_sz_0, "i"); +MODULE_PARM(rx_ring_sz_1, "i"); +MODULE_PARM(rx_ring_sz_2, "i"); +MODULE_PARM(rx_ring_sz_3, "i"); +MODULE_PARM(rx_ring_sz_4, "i"); +MODULE_PARM(rx_ring_sz_5, "i"); +MODULE_PARM(rx_ring_sz_6, "i"); +MODULE_PARM(rx_ring_sz_7, "i"); +MODULE_PARM(Stats_refresh_time, "i"); +MODULE_PARM(rmac_pause_time, "i"); +MODULE_PARM(mc_pause_threshold_q0q3, "i"); +MODULE_PARM(mc_pause_threshold_q4q7, "i"); +MODULE_PARM(shared_splits, "i"); +MODULE_PARM(max_splits_trans, "i"); +MODULE_PARM(tmac_util_period, "i"); +MODULE_PARM(rmac_util_period, "i"); +MODULE_PARM(tx_timer_val, "i"); +MODULE_PARM(tx_utilz_periodic, "i"); +MODULE_PARM(rx_timer_val, "i"); +MODULE_PARM(rx_utilz_periodic, "i"); +MODULE_PARM(tx_urange_a, "i"); +MODULE_PARM(tx_ufc_a, "i"); +MODULE_PARM(tx_urange_b, "i"); +MODULE_PARM(tx_ufc_b, "i"); +MODULE_PARM(tx_urange_c, "i"); +MODULE_PARM(tx_ufc_c, "i"); +MODULE_PARM(tx_ufc_d, "i"); +MODULE_PARM(rx_urange_a, "i"); +MODULE_PARM(rx_ufc_a, "i"); +MODULE_PARM(rx_urange_b, "i"); +MODULE_PARM(rx_ufc_b, "i"); +MODULE_PARM(rx_urange_c, "i"); +MODULE_PARM(rx_ufc_c, "i"); +MODULE_PARM(rx_ufc_d, "i"); +MODULE_PARM(latency_timer, "i"); +MODULE_PARM(max_read_byte_cnt, "i"); /** * s2io_init_nic - Initialization of the adapter . * @pdev : structure containing the PCI related information of the device. @@ -4215,33 +4333,23 @@ config = &sp->config; /* Tx side parameters. */ - config->tx_fifo_num = fifo_num ? fifo_num : 1; - - if (!fifo_len[0] && (fifo_num > 1)) { - printk(KERN_ERR "Fifo Lens not specified for all FIFOs\n"); - goto init_failed; - } - - if (fifo_len[0]) { - int cnt; - - for (cnt = 0; fifo_len[cnt]; cnt++); - if (fifo_num) { - if (cnt < fifo_num) { - printk(KERN_ERR - "Fifo Lens not specified for "); - printk(KERN_ERR "all FIFOs\n"); - goto init_failed; - } - } - for (cnt = 0; cnt < config->tx_fifo_num; cnt++) { - config->tx_cfg[cnt].fifo_len = fifo_len[cnt]; - config->tx_cfg[cnt].fifo_priority = cnt; - } - } else { - config->tx_cfg[0].fifo_len = DEFAULT_FIFO_LEN; - config->tx_cfg[0].fifo_priority = 0; - } + config->tx_fifo_num = tx_fifo_num; + config->tx_cfg[0].fifo_len = tx_fifo_len_0; + config->tx_cfg[0].fifo_priority = 0; + config->tx_cfg[1].fifo_len = tx_fifo_len_1; + config->tx_cfg[1].fifo_priority = 1; + config->tx_cfg[2].fifo_len = tx_fifo_len_2; + config->tx_cfg[2].fifo_priority = 2; + config->tx_cfg[3].fifo_len = tx_fifo_len_3; + config->tx_cfg[3].fifo_priority = 3; + config->tx_cfg[4].fifo_len = tx_fifo_len_4; + config->tx_cfg[4].fifo_priority = 4; + config->tx_cfg[5].fifo_len = tx_fifo_len_5; + config->tx_cfg[5].fifo_priority = 5; + config->tx_cfg[6].fifo_len = tx_fifo_len_6; + config->tx_cfg[6].fifo_priority = 6; + config->tx_cfg[7].fifo_len = tx_fifo_len_7; + config->tx_cfg[7].fifo_priority = 7; config->tx_intr_type = TXD_INT_TYPE_UTILZ; for (i = 0; i < config->tx_fifo_num; i++) { @@ -4255,27 +4363,34 @@ config->max_txds = MAX_SKB_FRAGS; /* Rx side parameters. */ - config->rx_ring_num = ring_num ? ring_num : 1; + config->rx_ring_num = rx_ring_num; + config->rx_cfg[0].num_rxd = rx_ring_sz_0 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[0].ring_priority = 0; + config->rx_cfg[1].num_rxd = rx_ring_sz_1 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[1].ring_priority = 1; + config->rx_cfg[2].num_rxd = rx_ring_sz_2 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[2].ring_priority = 2; + config->rx_cfg[3].num_rxd = rx_ring_sz_3 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[3].ring_priority = 3; + config->rx_cfg[4].num_rxd = rx_ring_sz_4 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[4].ring_priority = 4; + config->rx_cfg[5].num_rxd = rx_ring_sz_5 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[5].ring_priority = 5; + config->rx_cfg[6].num_rxd = rx_ring_sz_6 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[6].ring_priority = 6; + config->rx_cfg[7].num_rxd = rx_ring_sz_7 * (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[7].ring_priority = 7; - if (ring_len[0]) { - int cnt; - for (cnt = 0; cnt < config->rx_ring_num; cnt++) { - config->rx_cfg[cnt].num_rxd = ring_len[cnt]; - config->rx_cfg[cnt].ring_priority = cnt; - } - } else { - config->rx_cfg[0].num_rxd = SMALL_RXD_CNT; - config->rx_cfg[0].ring_priority = 0; - } - - for (i = 0; i < config->rx_ring_num; i++) { + for (i = 0; i < rx_ring_num; i++) { config->rx_cfg[i].ring_org = RING_ORG_BUFF1; config->rx_cfg[i].f_no_snoop = (NO_SNOOP_RXD | NO_SNOOP_RXD_BUFFER); } /* Setting Mac Control parameters */ - mac_control->rmac_pause_time = 0; + mac_control->rmac_pause_time = rmac_pause_time; + mac_control->mc_pause_threshold_q0q3 = mc_pause_threshold_q0q3; + mac_control->mc_pause_threshold_q4q7 = mc_pause_threshold_q4q7; /* Initialize Ring buffer parameters. */ @@ -4334,11 +4449,14 @@ dev->weight = 90; /* For now. */ #endif - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; + dev->features |= NETIF_F_SG; + if (cksum_offload_enable) + dev->features |= NETIF_F_IP_CSUM; if (sp->high_dma_flag == TRUE) dev->features |= NETIF_F_HIGHDMA; #ifdef NETIF_F_TSO - dev->features |= NETIF_F_TSO; + if (lso_enable) + dev->features |= NETIF_F_TSO; #endif dev->tx_timeout = &s2io_tx_watchdog; @@ -4453,7 +4571,6 @@ bar0_remap_failed: mem_alloc_failed: free_shared_mem(sp); - init_failed: pci_disable_device(pdev); pci_release_regions(pdev); pci_set_drvdata(pdev, NULL); @@ -4503,6 +4620,8 @@ int __init s2io_starter(void) { + if (verify_load_parm()) + return -ENODEV; return pci_module_init(&s2io_driver); } @@ -4519,3 +4638,223 @@ module_init(s2io_starter); module_exit(s2io_closer); +/** + * verify_load_parm - verifies the module loadable parameters + * Descriptions: Verifies the module loadable parameters and initializes the + * Tx Fifo, Rx Ring and other paramters. + */ + +int verify_load_parm() +{ + int fail = 0; + if (!((lso_enable == 0) || (lso_enable == 1))) { + printk("lso_enable can be either '1' or '0'\n"); + fail = 1; + } +#ifndef CONFIG_S2IO_NAPI + if ((indicate_max_pkts > (0xFFFFFFFF))) { + printk + ("indicate_max_pkts can take value greater than zero but less than 2power(32)\n"); + fail = 1; + } +#endif + if (!((cksum_offload_enable == 0) || (cksum_offload_enable == 1))) { + printk("cksum_offload_enable can be only '0' or '1' \n"); + fail = 1; + } + if ((tx_fifo_num == 0) || (tx_fifo_num > 8)) { + printk("tx_fifo_num can take value from 1 to 8\n"); + fail = 1; + } + switch (tx_fifo_num) { + case 8: + if ((tx_fifo_len_7 == 0) || tx_fifo_len_7 > 8192) { + printk + ("tx_fifo_len_7 can take value from 1 to 8192\n"); + fail = 1; + } + case 7: + if ((tx_fifo_len_6 == 0) || tx_fifo_len_6 > 8192) { + printk + ("tx_fifo_len_6 can take value from 1 to 8192\n"); + fail = 1; + } + case 6: + if ((tx_fifo_len_5 == 0) || tx_fifo_len_5 > 8192) { + printk + ("tx_fifo_len_5 can take value from 1 to 8192\n"); + fail = 1; + } + case 5: + if ((tx_fifo_len_4 == 0) || tx_fifo_len_4 > 8192) { + printk + ("tx_fifo_len_4 can take value from 1 to 8192\n"); + fail = 1; + } + case 4: + if ((tx_fifo_len_3 == 0) || tx_fifo_len_3 > 8192) { + printk + ("tx_fifo_len_3 can take value from 1 to 8192\n"); + fail = 1; + } + case 3: + if ((tx_fifo_len_2 == 0) || tx_fifo_len_2 > 8192) { + printk + ("tx_fifo_len_2 can take value from 1 to 8192\n"); + fail = 1; + } + case 2: + if ((tx_fifo_len_1 == 0) || tx_fifo_len_1 > 8192) { + printk + ("tx_fifo_len_1 can take value from 1 to 8192\n"); + fail = 1; + } + case 1: + if ((tx_fifo_len_0 == 0) || tx_fifo_len_0 > 8192) { + printk + ("tx_fifo_len_0 can take value from 1 to 8192\n"); + fail = 1; + } + } + if ((max_txds > 32) || (max_txds < 1)) { + printk("max_txds can take value from 1 to 32\n"); + fail = 1; + } + if ((rx_ring_num > 8) || (rx_ring_num < 1)) { + printk("rx_ring_num can take value from 1 to 8\n"); + fail = 1; + } + switch (rx_ring_num) { + case 8: + if (rx_ring_sz_7 < 1) { + printk + ("rx_ring_sz_7 can take value greater than 0\n"); + fail = 1; + } + case 7: + if (rx_ring_sz_6 < 1) { + printk + ("rx_ring_sz_6 can take value greater than 0\n"); + fail = 1; + } + case 6: + if (rx_ring_sz_5 < 1) { + printk + ("rx_ring_sz_5 can take value greater than 0\n"); + fail = 1; + } + case 5: + if (rx_ring_sz_4 < 1) { + printk + ("rx_ring_sz_4 can take value greater than 0\n"); + fail = 1; + } + case 4: + if (rx_ring_sz_3 < 1) { + printk + ("rx_ring_sz_3 can take value greater than 0\n"); + fail = 1; + } + case 3: + if (rx_ring_sz_2 < 1) { + printk + ("rx_ring_sz_2 can take value greater than 0\n"); + fail = 1; + } + case 2: + if (rx_ring_sz_1 < 1) { + printk + ("rx_ring_sz_1 can take value greater than 0\n"); + fail = 1; + } + case 1: + if (rx_ring_sz_0 < 1) { + printk + ("rx_ring_sz_0 can take value greater than 0\n"); + fail = 1; + } + } + if ((Stats_refresh_time < 1)) { + printk + ("Stats_refresh_time cannot be less than 1 second \n"); + fail = 1; + } + if (((rmac_pause_time < 0x10) && (rmac_pause_time != 0)) || + (rmac_pause_time > 0xFFFF)) { + printk + ("rmac_pause_time can take value from 16 to 65535\n"); + fail = 1; + } + if (max_splits_trans > 7) { + printk("max_splits_trans can take value from 0 to 7\n"); + fail = 1; + } + if ((mc_pause_threshold_q0q3 > 0xFE)) { + printk("mc_pause_threshold_q0q3 cannot exceed 254\n"); + fail = 1; + } + if ((mc_pause_threshold_q4q7 > 0xFE)) { + printk("mc_pause_threshold_q4q7 cannot exceed 254\n"); + fail = 1; + } + if ((latency_timer) + && ((latency_timer < 8) || (latency_timer > 255))) { + printk("latency_timer can take value from 8 to 255\n"); + fail = 1; + } + if (max_read_byte_cnt > 3) { + printk("max_read_byte_cnt can take value from 0 to 3\n"); + fail = 1; + } + if (shared_splits > 31) { + printk("shared_splits cannot exceed 31\n"); + fail = 1; + } + if (rmac_util_period > 0xF) { + printk("rmac_util_period cannot exceed 15\n"); + fail = 1; + } + if (tmac_util_period > 0xF) { + printk("tmac_util_period cannot exceed 15\n"); + fail = 1; + } + if ((tx_utilz_periodic > 1) || (rx_utilz_periodic > 1)) { + printk + ("tx_utilz_periodic & rx_utilz_periodic can be either " + "'0' or '1'\n"); + fail = 1; + } + if (((tx_urange_a > 100) || (tx_urange_b > 100) || + (tx_urange_c > 100)) || (tx_urange_a > tx_urange_b) + || (tx_urange_b > tx_urange_c)) { + printk + ("tx_urange_a, tx_urange_b & tx_urange_c can take value " + "from 0 to 100 and range_a can't exceed range_b " + "neither can range_b exceed range_c\n"); + fail = 1; + } + if (((rx_urange_a > 100) || (rx_urange_b > 100) || + (rx_urange_c > 100)) || (rx_urange_a > rx_urange_b) + || (rx_urange_b > rx_urange_c)) { + printk + ("rx_urange_a, rx_urange_b & rx_urange_c can take value " + "from 0 to 100 and range_a can't exceed range_b " + "neither can range_b exceed range_c\n"); + fail = 1; + } + if ((tx_ufc_a > 0xffff) || (tx_ufc_b > 0xffff) || + (tx_ufc_c > 0xffff) || (tx_ufc_d > 0xffff)) { + printk + (" tx_ufc_a, tx_ufc_b, tx_ufc_c, tx_ufc_d can take value" + "from 0 to 65535(0xFFFF)\n"); + fail = 1; + } + if ((rx_ufc_a > 0xffff) || (rx_ufc_b > 0xffff) || + (rx_ufc_c > 0xffff) || (rx_ufc_d > 0xffff)) { + printk + (" rx_ufc_a, rx_ufc_b, rx_ufc_c, rx_ufc_d can take value" + "from 0 to 65535(0xFFFF)\n"); + fail = 1; + } + return fail; +} diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 15:33:35.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 15:34:23.000000000 -0700 @@ -348,9 +348,9 @@ u8 ring_priority; /*Specifies service priority of ring */ /* OSM should not set any two rings with same priority */ u8 ring_org; /*Organization of ring */ -#define RING_ORG_BUFF1 0x01 -#define RX_RING_ORG_BUFF3 0x03 -#define RX_RING_ORG_BUFF5 0x05 +#define RING_ORG_BUFF1 0x01 +#define RX_RING_ORG_BUFF3 0x03 +#define RX_RING_ORG_BUFF5 0x05 u8 f_no_snoop; #define NO_SNOOP_RXD 0x01 From raghavendra.koushik@s2io.com Mon Nov 8 15:17:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:17:47 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NHfPB028871 for ; Mon, 8 Nov 2004 15:17:41 -0800 Received: by linux.site (Postfix, from userid 0) id 498D432905; Mon, 8 Nov 2004 08:15:11 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 6/12] S2io: new txd allocation Message-Id: <20041108161511.498D432905@linux.site> Date: Mon, 8 Nov 2004 08:15:11 -0800 (PST) X-archive-position: 11596 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 11877 Lines: 359 Hi, The attached patch contains a modified scheme for allocating Tx descriptor blocks. More description follows. In the old scheme, the entire Tx descriptor space was allocated in one go. This could cause driver load to fail on systems with low(or scattered) memory. The Tx descriptor blocks are now allocated on per-page basis. A new structure (list_info) has been introduced in nic_t structure to keep track of the physical and virtual addresses of every TxD allocated this way. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 16:49:34.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-11 17:20:24.000000000 -0700 @@ -305,6 +305,9 @@ remove:__devexit_p(s2io_rem_nic), }; +/* A simplifier macro used both by init and free shared_mem Fns(). */ +#define TXD_MEM_PAGE_CNT(len, per_each) ((len+per_each - 1) / per_each) + /** * init_shared_mem - Allocation and Initialization of Memory * @nic: Device private variable. @@ -320,6 +323,7 @@ dma_addr_t tmp_p_addr, tmp_p_addr_next; RxD_block_t *pre_rxd_blk = NULL; int i, j, blk_cnt; + int lst_size, lst_per_page; struct net_device *dev = nic->dev; mac_info_t *mac_control; @@ -341,39 +345,55 @@ DBG_PRINT(ERR_DBG, "that can be used\n"); return FAILURE; } - size *= (sizeof(TxD_t) * config->max_txds); - mac_control->txd_list_mem = pci_alloc_consistent - (nic->pdev, size, &mac_control->txd_list_mem_phy); - if (!mac_control->txd_list_mem) { - return -ENOMEM; - } - mac_control->txd_list_mem_sz = size; - - tmp_v_addr = mac_control->txd_list_mem; - tmp_p_addr = mac_control->txd_list_mem_phy; - memset(tmp_v_addr, 0, size); - - DBG_PRINT(INIT_DBG, "%s:List Mem PHY: 0x%llx\n", dev->name, - (unsigned long long) tmp_p_addr); + lst_size = (sizeof(TxD_t) * config->max_txds); + lst_per_page = PAGE_SIZE / lst_size; for (i = 0; i < config->tx_fifo_num; i++) { - mac_control->txdl_start_phy[i] = tmp_p_addr; - mac_control->txdl_start[i] = (TxD_t *) tmp_v_addr; + int fifo_len = config->tx_cfg[i].fifo_len; + int list_holder_size = fifo_len * sizeof(list_info_hold_t); + nic->list_info[i] = kmalloc(list_holder_size, GFP_KERNEL); + if (!nic->list_info[i]) { + DBG_PRINT(ERR_DBG, + "Malloc failed for list_info\n"); + return -ENOMEM; + } + memset(nic->list_info[i], 0, list_holder_size); + } + for (i = 0; i < config->tx_fifo_num; i++) { + int page_num = TXD_MEM_PAGE_CNT(config->tx_cfg[i].fifo_len, + lst_per_page); mac_control->tx_curr_put_info[i].offset = 0; mac_control->tx_curr_put_info[i].fifo_len = config->tx_cfg[i].fifo_len - 1; mac_control->tx_curr_get_info[i].offset = 0; mac_control->tx_curr_get_info[i].fifo_len = config->tx_cfg[i].fifo_len - 1; - - tmp_p_addr += - (config->tx_cfg[i].fifo_len * (sizeof(TxD_t)) * - config->max_txds); - tmp_v_addr += - (config->tx_cfg[i].fifo_len * (sizeof(TxD_t)) * - config->max_txds); + for (j = 0; j < page_num; j++) { + int k = 0; + dma_addr_t tmp_p; + void *tmp_v; + tmp_v = pci_alloc_consistent(nic->pdev, + PAGE_SIZE, &tmp_p); + if (!tmp_v) { + DBG_PRINT(ERR_DBG, + "pci_alloc_consistent "); + DBG_PRINT(ERR_DBG, "failed for TxDL\n"); + return -ENOMEM; + } + while (k < lst_per_page) { + int l = (j * lst_per_page) + k; + if (l == config->tx_cfg[i].fifo_len) + goto end_txd_alloc; + nic->list_info[i][l].list_virt_addr = + tmp_v + (k * lst_size); + nic->list_info[i][l].list_phy_addr = + tmp_p + (k * lst_size); + k++; + } + } } + end_txd_alloc: /* Allocation and initialization of RXDs in Rings */ size = 0; @@ -484,6 +504,7 @@ dma_addr_t tmp_p_addr; mac_info_t *mac_control; struct config_param *config; + int lst_size, lst_per_page; if (!nic) @@ -492,11 +513,23 @@ mac_control = &nic->mac_control; config = &nic->config; - if (mac_control->txd_list_mem) { - pci_free_consistent(nic->pdev, - mac_control->txd_list_mem_sz, - mac_control->txd_list_mem, - mac_control->txd_list_mem_phy); + lst_size = (sizeof(TxD_t) * config->max_txds); + lst_per_page = PAGE_SIZE / lst_size; + + for (i = 0; i < config->tx_fifo_num; i++) { + int page_num = TXD_MEM_PAGE_CNT(config->tx_cfg[i].fifo_len, + lst_per_page); + for (j = 0; j < page_num; j++) { + int mem_blks = (j * lst_per_page); + if (!nic->list_info[i][mem_blks].list_virt_addr) + break; + pci_free_consistent(nic->pdev, PAGE_SIZE, + nic->list_info[i][mem_blks]. + list_virt_addr, + nic->list_info[i][mem_blks]. + list_phy_addr); + } + kfree(nic->list_info[i]); } size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); @@ -1444,8 +1477,8 @@ for (i = 0; i < config->tx_fifo_num; i++) { for (j = 0; j < config->tx_cfg[i].fifo_len - 1; j++) { - txdp = mac_control->txdl_start[i] + - (config->max_txds * j); + txdp = (TxD_t *) nic->list_info[i][j]. + list_virt_addr; skb = (struct sk_buff *) ((unsigned long) txdp-> Host_Control); @@ -1460,6 +1493,8 @@ DBG_PRINT(INTR_DBG, "%s:forcibly freeing %d skbs on FIFO%d\n", dev->name, cnt, i); + mac_control->tx_curr_get_info[i].offset = 0; + mac_control->tx_curr_put_info[i].offset = 0; } } @@ -1896,7 +1931,7 @@ { XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; struct net_device *dev = (struct net_device *) nic->dev; - tx_curr_get_info_t offset_info, offset_info1; + tx_curr_get_info_t get_info, put_info; struct sk_buff *skb; TxD_t *txdlp; register u64 val64 = 0; @@ -1916,12 +1951,12 @@ writeq(val64, &bar0->tx_traffic_int); for (i = 0; i < config->tx_fifo_num; i++) { - offset_info = mac_control->tx_curr_get_info[i]; - offset_info1 = mac_control->tx_curr_put_info[i]; - txdlp = mac_control->txdl_start[i] + - (config->max_txds * offset_info.offset); + get_info = mac_control->tx_curr_get_info[i]; + put_info = mac_control->tx_curr_put_info[i]; + txdlp = (TxD_t *) nic->list_info[i][get_info.offset]. + list_virt_addr; while ((!(txdlp->Control_1 & TXD_LIST_OWN_XENA)) && - (offset_info.offset != offset_info1.offset) && + (get_info.offset != put_info.offset) && (txdlp->Host_Control)) { /* Check for TxD errors */ if (txdlp->Control_1 & TXD_T_CODE) { @@ -1971,12 +2006,12 @@ nic->stats.tx_bytes += skb->len; dev_kfree_skb_irq(skb); - offset_info.offset++; - offset_info.offset %= offset_info.fifo_len + 1; - txdlp = mac_control->txdl_start[i] + - (config->max_txds * offset_info.offset); + get_info.offset++; + get_info.offset %= get_info.fifo_len + 1; + txdlp = (TxD_t *) nic->list_info[i] + [get_info.offset].list_virt_addr; mac_control->tx_curr_get_info[i].offset = - offset_info.offset; + get_info.offset; } } @@ -2327,7 +2362,9 @@ XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; register u64 val64 = 0; u16 cnt = 0; + unsigned long flags; + spin_lock_irqsave(&sp->tx_lock, flags); netif_stop_queue(dev); /* disable Tx and Rx traffic on the NIC */ @@ -2381,6 +2418,7 @@ free_rx_buffers(sp); sp->device_close_flag = TRUE; /* Device is shut down. */ + spin_unlock_irqrestore(&sp->tx_lock, flags); return 0; } @@ -2401,7 +2439,7 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev) { nic_t *sp = dev->priv; - u16 off, txd_len, frg_cnt, frg_len, i, queue, off1, queue_len; + u16 frg_cnt, frg_len, i, queue, queue_len, put_off, get_off; register u64 val64; TxD_t *txdp; TxFIFO_element_t *tx_fifo; @@ -2419,6 +2457,14 @@ DBG_PRINT(TX_DBG, "%s: In S2IO Tx routine\n", dev->name); spin_lock_irqsave(&sp->tx_lock, flags); + if ((netif_queue_stopped(dev)) || (!netif_carrier_ok(dev))) { + DBG_PRINT(TX_DBG, "%s:s2io_xmit: Tx Queue stopped\n", + dev->name); + dev_kfree_skb(skb); + spin_unlock_irqrestore(&sp->tx_lock, flags); + return 0; + } + queue = 0; /* Multi FIFO Tx is disabled for now. */ if (!queue && tx_prio) { @@ -2427,14 +2473,13 @@ } - off = (u16) mac_control->tx_curr_put_info[queue].offset; - off1 = (u16) mac_control->tx_curr_get_info[queue].offset; - txd_len = config->max_txds; - txdp = mac_control->txdl_start[queue] + (config->max_txds * off); + put_off = (u16) mac_control->tx_curr_put_info[queue].offset; + get_off = (u16) mac_control->tx_curr_get_info[queue].offset; + txdp = (TxD_t *) sp->list_info[queue][put_off].list_virt_addr; queue_len = mac_control->tx_curr_put_info[queue].fifo_len + 1; /* Avoid "put" pointer going beyond "get" pointer */ - if (txdp->Host_Control || (((off + 1) % queue_len) == off1)) { + if (txdp->Host_Control || (((put_off + 1) % queue_len) == get_off)) { DBG_PRINT(ERR_DBG, "Error in xmit, No free TXDs.\n"); netif_stop_queue(dev); dev_kfree_skb(skb); @@ -2479,8 +2524,7 @@ txdp->Control_1 |= TXD_GATHER_CODE_LAST; tx_fifo = mac_control->tx_FIFO_start[queue]; - val64 = (mac_control->txdl_start_phy[queue] + - (sizeof(TxD_t) * txd_len * off)); + val64 = sp->list_info[queue][put_off].list_phy_addr; writeq(val64, &tx_fifo->TxDL_Pointer); val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | @@ -2494,15 +2538,15 @@ /* Perform a PCI read to flush previous writes */ val64 = readq(&bar0->general_int_status); - off++; - off %= mac_control->tx_curr_put_info[queue].fifo_len + 1; - mac_control->tx_curr_put_info[queue].offset = off; + put_off++; + put_off %= mac_control->tx_curr_put_info[queue].fifo_len + 1; + mac_control->tx_curr_put_info[queue].offset = put_off; /* Avoid "put" pointer going beyond "get" pointer */ - if (((off + 1) % queue_len) == off1) { + if (((put_off + 1) % queue_len) == get_off) { DBG_PRINT(TX_DBG, "No free TxDs for xmit, Put: 0x%x Get:0x%x\n", - off, off1); + put_off, get_off); netif_stop_queue(dev); } @@ -3070,7 +3114,7 @@ } /** - * s2io_ethtool-setpause_data - set/reset pause frame generation. + * s2io_ethtool_setpause_data - set/reset pause frame generation. * @sp : private member of the device structure, which is a pointer to the * s2io_nic structure. * @ep : pointer to the structure with pause parameters given by ethtool. diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 16:49:34.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 17:20:24.000000000 -0700 @@ -444,6 +444,12 @@ u64 Host_Control; /* reserved for host */ } TxD_t; +/* Structure to hold the phy and virt addr of every TxDL. */ +typedef struct list_info_hold { + dma_addr_t list_phy_addr; + void *list_virt_addr; +} list_info_hold_t; + /* Rx descriptor structure */ typedef struct _RxD_t { u64 Host_Control; /* reserved for host */ @@ -532,17 +538,9 @@ u16 mc_pause_threshold_q4q7; /* tx side stuff */ - void *txd_list_mem; /* original pointer to allocated mem */ - dma_addr_t txd_list_mem_phy; - u32 txd_list_mem_sz; - /* logical pointer of start of each Tx FIFO */ TxFIFO_element_t *tx_FIFO_start[MAX_TX_FIFOS]; - /* The Phy and virtual mem loactions of the Tx descriptors. */ - TxD_t *txdl_start[MAX_TX_FIFOS]; - dma_addr_t txdl_start_phy[MAX_TX_FIFOS]; - /* Current offset within tx_FIFO_start, where driver would write new Tx frame*/ tx_curr_put_info_t tx_curr_put_info[MAX_TX_FIFOS]; tx_curr_get_info_t tx_curr_get_info[MAX_TX_FIFOS]; @@ -638,6 +636,9 @@ int block_count[MAX_RX_RINGS]; int pkt_cnt[MAX_RX_RINGS]; + /* Place holder of all the TX List's Phy and Virt addresses. */ + list_info_hold_t *list_info[MAX_TX_FIFOS]; + /* Id timer, used to blink NIC to physically identify NIC. */ struct timer_list id_timer; From raghavendra.koushik@s2io.com Mon Nov 8 15:17:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:18:05 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NHwBC029147 for ; Mon, 8 Nov 2004 15:17:58 -0800 Received: by linux.site (Postfix, from userid 0) id B878332914; Mon, 8 Nov 2004 08:15:28 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 7/12] S2io: NAPI fix Message-Id: <20041108161528.B878332914@linux.site> Date: Mon, 8 Nov 2004 08:15:28 -0800 (PST) X-archive-position: 11597 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 11204 Lines: 366 Hi, This patch contains the following NAPI related fixes. 1. When processing Rx packets, making sure that get offset of ring does not cross the put offset. 2. when NAPI is not in use a new spinlock(put_lock) is used to make sure accessing put offset of ring is atomic. 3. Also introduced a new vaiable put_pos in nic_t to keep track of absolute position of the put pointer of Rx ring. 4. When NAPI is used, fill_rx_buffer is not called from the interrupt handler(s2io_isr) . 5. In s2io_poll, decrementing packets processed is done inside the while loop unlike out side it as was being done last time. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 21:19:25.051771008 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-11 21:19:44.674787856 -0700 @@ -1565,6 +1565,9 @@ atomic_read(&nic->rx_bufs_left[ring_no]); mac_info_t *mac_control; struct config_param *config; +#ifndef CONFIG_S2IO_NAPI + unsigned long flags; +#endif mac_control = &nic->mac_control; config = &nic->config; @@ -1612,6 +1615,12 @@ DBG_PRINT(INTR_DBG, "%s: Next block at: %p\n", dev->name, rxdp); } +#ifndef CONFIG_S2IO_NAPI + spin_lock_irqsave(&nic->put_lock, flags); + nic->put_pos[ring_no] = (block_no * + (MAX_RXDS_PER_BLOCK + 1)) + off; + spin_unlock_irqrestore(&nic->put_lock, flags); +#endif if (rxdp->Control_1 & RXD_OWN_XENA) { mac_control->rx_curr_put_info[ring_no]. @@ -1730,8 +1739,8 @@ XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; int pkts_to_process = *budget, pkt_cnt = 0; register u64 val64 = 0; - rx_curr_get_info_t offset_info; - int i, block_no; + rx_curr_get_info_t get_info, put_info; + int i, get_block, put_block, get_offset, put_offset, ring_bufs; u16 val16, cksum; struct sk_buff *skb; RxD_t *rxdp; @@ -1748,29 +1757,40 @@ writeq(val64, &bar0->rx_traffic_int); for (i = 0; i < config->rx_ring_num; i++) { - if (--pkts_to_process < 0) { - goto no_rx; - } - offset_info = mac_control->rx_curr_get_info[i]; - block_no = offset_info.block_index; - rxdp = nic->rx_blocks[i][block_no].block_virt_addr + - offset_info.offset; - while (!(rxdp->Control_1 & RXD_OWN_XENA)) { + get_info = mac_control->rx_curr_get_info[i]; + get_block = get_info.block_index; + put_info = mac_control->rx_curr_put_info[i]; + put_block = put_info.block_index; + ring_bufs = config->rx_cfg[i].num_rxd; + rxdp = nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + put_offset = (put_block * (MAX_RXDS_PER_BLOCK + 1)) + + put_info.offset; + while ((!(rxdp->Control_1 & RXD_OWN_XENA)) && + (((get_offset + 1) % ring_bufs) != put_offset)) { + if (--pkts_to_process < 0) { + goto no_rx; + } if (rxdp->Control_1 == END_OF_BLOCK) { rxdp = (RxD_t *) ((unsigned long) rxdp-> Control_2); - offset_info.offset++; - offset_info.offset %= + get_info.offset++; + get_info.offset %= (MAX_RXDS_PER_BLOCK + 1); - block_no++; - block_no %= nic->block_count[i]; + get_block++; + get_block %= nic->block_count[i]; mac_control->rx_curr_get_info[i]. - offset = offset_info.offset; + offset = get_info.offset; mac_control->rx_curr_get_info[i]. - block_index = block_no; + block_index = get_block; continue; } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; skb = (struct sk_buff *) ((unsigned long) rxdp-> Host_Control); @@ -1778,7 +1798,7 @@ DBG_PRINT(ERR_DBG, "%s: The skb is ", dev->name); DBG_PRINT(ERR_DBG, "Null in Rx Intr\n"); - return 0; + goto no_rx; } val64 = RXD_GET_BUFFER0_SIZE(rxdp->Control_2); val16 = (u16) (val64 >> 48); @@ -1792,34 +1812,44 @@ PCI_DMA_FROMDEVICE); rx_osm_handler(nic, val16, rxdp, i); pkt_cnt++; - offset_info.offset++; - offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1); + get_info.offset++; + get_info.offset %= (MAX_RXDS_PER_BLOCK + 1); rxdp = - nic->rx_blocks[i][block_no].block_virt_addr + - offset_info.offset; + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; mac_control->rx_curr_get_info[i].offset = - offset_info.offset; + get_info.offset; } } if (!pkt_cnt) pkt_cnt = 1; - for (i = 0; i < config->rx_ring_num; i++) - fill_rx_buffers(nic, i); - dev->quota -= pkt_cnt; *budget -= pkt_cnt; netif_rx_complete(dev); + for (i = 0; i < config->rx_ring_num; i++) { + if (fill_rx_buffers(nic, i) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); + DBG_PRINT(ERR_DBG, " in Rx Poll!!\n"); + break; + } + } /* Re enable the Rx interrupts. */ en_dis_able_nic_intrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS); return 0; no_rx: - for (i = 0; i < config->rx_ring_num; i++) - fill_rx_buffers(nic, i); dev->quota -= pkt_cnt; *budget -= pkt_cnt; + + for (i = 0; i < config->rx_ring_num; i++) { + if (fill_rx_buffers(nic, i) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); + DBG_PRINT(ERR_DBG, " in Rx Poll!!\n"); + break; + } + } return 1; } #else @@ -1840,12 +1870,13 @@ { struct net_device *dev = (struct net_device *) nic->dev; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; - rx_curr_get_info_t offset_info; + rx_curr_get_info_t get_info, put_info; RxD_t *rxdp; struct sk_buff *skb; u16 val16, cksum; register u64 val64 = 0; - int i, block_no, pkt_cnt = 0; + int get_block, get_offset, put_block, put_offset, ring_bufs; + int i, pkt_cnt = 0; mac_info_t *mac_control; struct config_param *config; @@ -1860,25 +1891,37 @@ writeq(val64, &bar0->rx_traffic_int); for (i = 0; i < config->rx_ring_num; i++) { - offset_info = mac_control->rx_curr_get_info[i]; - block_no = offset_info.block_index; - rxdp = nic->rx_blocks[i][block_no].block_virt_addr + - offset_info.offset; - while (!(rxdp->Control_1 & RXD_OWN_XENA)) { + get_info = mac_control->rx_curr_get_info[i]; + get_block = get_info.block_index; + put_info = mac_control->rx_curr_put_info[i]; + put_block = put_info.block_index; + ring_bufs = config->rx_cfg[i].num_rxd; + rxdp = nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + spin_lock(&nic->put_lock); + put_offset = nic->put_pos[i]; + spin_unlock(&nic->put_lock); + while ((!(rxdp->Control_1 & RXD_OWN_XENA)) && + (((get_offset + 1) % ring_bufs) != put_offset)) { if (rxdp->Control_1 == END_OF_BLOCK) { rxdp = (RxD_t *) ((unsigned long) rxdp->Control_2); - offset_info.offset++; - offset_info.offset %= + get_info.offset++; + get_info.offset %= (MAX_RXDS_PER_BLOCK + 1); - block_no++; - block_no %= nic->block_count[i]; + get_block++; + get_block %= nic->block_count[i]; mac_control->rx_curr_get_info[i]. - offset = offset_info.offset; + offset = get_info.offset; mac_control->rx_curr_get_info[i]. - block_index = block_no; + block_index = get_block; continue; } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; skb = (struct sk_buff *) ((unsigned long) rxdp->Host_Control); if (skb == NULL) { @@ -1898,13 +1941,13 @@ HEADER_SNAP_SIZE, PCI_DMA_FROMDEVICE); rx_osm_handler(nic, val16, rxdp, i); - offset_info.offset++; - offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1); + get_info.offset++; + get_info.offset %= (MAX_RXDS_PER_BLOCK + 1); rxdp = - nic->rx_blocks[i][block_no].block_virt_addr + - offset_info.offset; + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; mac_control->rx_curr_get_info[i].offset = - offset_info.offset; + get_info.offset; pkt_cnt++; if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) @@ -2575,6 +2618,9 @@ struct net_device *dev = (struct net_device *) dev_id; nic_t *sp = dev->priv; XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; +#ifndef CONFIG_S2IO_NAPI + int i, ret; +#endif u64 reason = 0; mac_info_t *mac_control; struct config_param *config; @@ -2626,44 +2672,31 @@ * reallocate the buffers from the interrupt handler itself, * else schedule a tasklet to reallocate the buffers. */ -#if 1 - { - int i; - - for (i = 0; i < config->rx_ring_num; i++) { - int rxb_size = atomic_read(&sp->rx_bufs_left[i]); - int level = rx_buffer_level(sp, rxb_size, i); - - if ((level == PANIC) && (!TASKLET_IN_USE)) { - int ret; +#ifndef CONFIG_S2IO_NAPI + for (i = 0; i < config->rx_ring_num; i++) { + int rxb_size = atomic_read(&sp->rx_bufs_left[i]); + int level = rx_buffer_level(sp, rxb_size, i); - DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", + if ((level == PANIC) && (!TASKLET_IN_USE)) { + DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", dev->name); + DBG_PRINT(INTR_DBG, "PANIC levels\n"); + if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); - DBG_PRINT(INTR_DBG, "PANIC levels\n"); - if ((ret = - fill_rx_buffers(sp, i)) == -ENOMEM) { - DBG_PRINT(ERR_DBG, - "%s:Out of memory", - dev->name); - DBG_PRINT(ERR_DBG, " in ISR!!\n"); - clear_bit(0, - (unsigned long *) (&sp-> - tasklet_status)); - return IRQ_HANDLED; - } + DBG_PRINT(ERR_DBG, " in ISR!!\n"); clear_bit(0, (unsigned long *) (&sp-> tasklet_status)); - } else if ((level == LOW) - && (!atomic_read(&sp->tasklet_status))) { - tasklet_schedule(&sp->task); + return IRQ_HANDLED; } - + clear_bit(0, + (unsigned long *) (&sp->tasklet_status)); + } else if ((level == LOW) + && (!atomic_read(&sp->tasklet_status))) { + tasklet_schedule(&sp->task); } } -#else - tasklet_schedule(&sp->task); #endif return IRQ_HANDLED; @@ -4583,6 +4616,9 @@ /* Initialize spinlocks */ spin_lock_init(&sp->tx_lock); +#ifndef CONFIG_S2IO_NAPI + spin_lock_init(&sp->put_lock); +#endif /* * SXE-002: Configure link and activity LED to init state diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 21:19:25.051771008 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 21:19:44.674787856 -0700 @@ -610,6 +610,9 @@ atomic_t rx_bufs_left[MAX_RX_RINGS]; spinlock_t tx_lock; +#ifndef CONFIG_S2IO_NAPI + spinlock_t put_lock; +#endif #define PROMISC 1 #define ALL_MULTI 2 @@ -628,6 +631,11 @@ u16 tx_err_count; u16 rx_err_count; +#ifndef CONFIG_S2IO_NAPI + /* Index to the absolute position of the put pointer of Rx ring. */ + int put_pos[MAX_RX_RINGS]; +#endif + /* * Place holders for the virtual and physical addresses of * all the Rx Blocks From raghavendra.koushik@s2io.com Mon Nov 8 15:19:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:19:10 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NJ4Li029913 for ; Mon, 8 Nov 2004 15:19:04 -0800 Received: by linux.site (Postfix, from userid 0) id D459A3291A; Mon, 8 Nov 2004 08:16:34 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 8/12] S2io: two buffer mode Message-Id: <20041108161634.D459A3291A@linux.site> Date: Mon, 8 Nov 2004 08:16:34 -0800 (PST) X-archive-position: 11598 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 22591 Lines: 768 Hi, Attached is the patch for implementing 2-buffer mode on Rx path. More description of this mode of operation follows. On certain systems when a DMA has to happen on an un-aligned memory location performance will take a significant hit. It's standard practice to offset the Rx buffer address by 2 (as Mac header is 14 bytes) so the IP header starts from an aligned location. Obviously using a single Rx buffer both cannot be achieved. Thus XFrame supports something called 2 buffer Rx mode, where in the Rx'ed frame is split into 2 parts, one is the Ethernet header and the other is the Ethernet payload. So now we can allocate proper aligned memory for both buffers, hence the DMA is not slowed down. Also, the Ethernet payload(starting from L3 header) is on an aligned location so OS need not have to do un-aligned accesses to process IP header. To achieve this, the kernel function eth_type_trans functionality has to be partially implemented in the driver itself. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/Kconfig linux-2.6.8.1/drivers/net/Kconfig --- vanilla-linux/drivers/net/Kconfig 2004-10-06 15:15:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/Kconfig 2004-10-11 20:06:36.000000000 -0700 @@ -2267,6 +2267,17 @@ If in doubt, say N. +config 2BUFF_MODE + bool "Use 2 Buffer Mode on Rx side." + depends on S2IO + ---help--- + On enabling the 2 buffer mode, the received frame will be + split into 2 parts before being DMA'ed to the hosts memory. + The parts are the ethernet header and ethernet payload. + This is useful on systems where DMA'ing to to unaligned + physical memory loactions comes with a heavy price. + If not sure please say N. + endmenu source "drivers/net/tokenring/Kconfig" diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-12 16:49:27.796331624 -0700 @@ -325,6 +325,10 @@ int i, j, blk_cnt; int lst_size, lst_per_page; struct net_device *dev = nic->dev; +#ifdef CONFIG_2BUFF_MODE + u64 tmp; + buffAdd_t *ba; +#endif mac_info_t *mac_control; struct config_param *config; @@ -425,7 +429,11 @@ config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); /* Allocating all the Rx blocks */ for (j = 0; j < blk_cnt; j++) { +#ifndef CONFIG_2BUFF_MODE size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); +#else + size = SIZE_OF_BLOCK; +#endif tmp_v_addr = pci_alloc_consistent(nic->pdev, size, &tmp_p_addr); if (tmp_v_addr == NULL) { @@ -458,13 +466,60 @@ pre_rxd_blk->reserved_1 = END_OF_BLOCK; /* last RxD * marker. */ +#ifndef CONFIG_2BUFF_MODE pre_rxd_blk->reserved_2_pNext_RxD_block = (unsigned long) tmp_v_addr_next; +#endif pre_rxd_blk->pNext_RxD_Blk_physical = (u64) tmp_p_addr_next; } } +#ifdef CONFIG_2BUFF_MODE + /* + * Allocation of Storages for buffer addresses in 2BUFF mode + * and the buffers as well. + */ + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + nic->ba[i] = kmalloc((sizeof(buffAdd_t *) * blk_cnt), + GFP_KERNEL); + if (!nic->ba[i]) + return -ENOMEM; + for (j = 0; j < blk_cnt; j++) { + int k = 0; + nic->ba[i][j] = kmalloc((sizeof(buffAdd_t) * + (MAX_RXDS_PER_BLOCK + 1)), + GFP_KERNEL); + if (!nic->ba[i][j]) + return -ENOMEM; + while (k != MAX_RXDS_PER_BLOCK) { + ba = &nic->ba[i][j][k]; + + ba->ba_0_org = (void *) kmalloc + (BUF0_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_0_org) + return -ENOMEM; + tmp = (u64) ba->ba_0_org; + tmp += ALIGN_SIZE; + tmp &= ~((u64) ALIGN_SIZE); + ba->ba_0 = (void *) tmp; + + ba->ba_1_org = (void *) kmalloc + (BUF1_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_1_org) + return -ENOMEM; + tmp = (u64) ba->ba_1_org; + tmp += ALIGN_SIZE; + tmp &= ~((u64) ALIGN_SIZE); + ba->ba_1 = (void *) tmp; + k++; + } + } + } +#endif + /* Allocation and initialization of Statistics block */ size = sizeof(StatInfo_t); mac_control->stats_mem = pci_alloc_consistent @@ -532,7 +587,11 @@ kfree(nic->list_info[i]); } +#ifndef CONFIG_2BUFF_MODE size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); +#else + size = SIZE_OF_BLOCK; +#endif for (i = 0; i < config->rx_ring_num; i++) { blk_cnt = nic->block_count[i]; for (j = 0; j < blk_cnt; j++) { @@ -545,6 +604,27 @@ } } +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j = 0; j < blk_cnt; j++) { + int k = 0; + if (!nic->ba[i][j]) + continue; + while (k != MAX_RXDS_PER_BLOCK) { + buffAdd_t *ba = &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); + k++; + } + kfree(nic->ba[i][j]); + } + if (nic->ba[i]) + kfree(nic->ba[i]); + } +#endif if (mac_control->stats_mem) { pci_free_consistent(nic->pdev, @@ -1366,10 +1446,21 @@ &bar0->prc_rxd0_n[i]); val64 = readq(&bar0->prc_ctrl_n[i]); +#ifndef CONFIG_2BUFF_MODE val64 |= PRC_CTRL_RC_ENABLED; +#else + val64 |= PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3; +#endif writeq(val64, &bar0->prc_ctrl_n[i]); } +#ifdef CONFIG_2BUFF_MODE + /* Enabling 2 buffer mode by writing into Rx_pa_cfg reg. */ + val64 = readq(&bar0->rx_pa_cfg); + val64 |= RX_PA_CFG_IGNORE_L2_ERR; + writeq(val64, &bar0->rx_pa_cfg); +#endif + /* * Enabling MC-RLDRAM. After enabling the device, we timeout * for around 100ms, which is approximately the time required @@ -1437,6 +1528,12 @@ } /* + * Don't see link state interrupts on certain switches, so + * directly scheduling a link state task from here. + */ + schedule_work(&nic->set_link_task); + + /* * Here we are performing soft reset on XGXS to * force link down. Since link is already up, we will get * link state change interrupt after this reset @@ -1565,6 +1662,13 @@ atomic_read(&nic->rx_bufs_left[ring_no]); mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + RxD_t *rxdpnext; + int nextblk; + u64 tmp; + buffAdd_t *ba; + dma_addr_t rxdpphys; +#endif #ifndef CONFIG_S2IO_NAPI unsigned long flags; #endif @@ -1589,10 +1693,14 @@ block_index; off = mac_control->rx_curr_put_info[ring_no].offset; off1 = mac_control->rx_curr_get_info[ring_no].offset; +#ifndef CONFIG_2BUFF_MODE offset = block_no * (MAX_RXDS_PER_BLOCK + 1) + off; offset1 = block_no1 * (MAX_RXDS_PER_BLOCK + 1) + off1; +#else offset = block_no * (MAX_RXDS_PER_BLOCK) + off; offset1 = block_no1 * (MAX_RXDS_PER_BLOCK) + off1; +#endif + rxdp = nic->rx_blocks[ring_no][block_no]. block_virt_addr + off; if ((offset == offset1) && (rxdp->Host_Control)) { @@ -1600,6 +1708,7 @@ DBG_PRINT(INTR_DBG, " info equated\n"); goto end; } +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 == END_OF_BLOCK) { mac_control->rx_curr_put_info[ring_no]. block_index++; @@ -1617,23 +1726,81 @@ } #ifndef CONFIG_S2IO_NAPI spin_lock_irqsave(&nic->put_lock, flags); + nic->put_pos[ring_no] = + (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off; + spin_unlock_irqrestore(&nic->put_lock, flags); +#endif +#else + if (rxdp->Host_Control == END_OF_BLOCK) { + mac_control->rx_curr_put_info[ring_no]. + block_index++; + mac_control->rx_curr_put_info[ring_no]. + block_index %= nic->block_count[ring_no]; + block_no = mac_control->rx_curr_put_info + [ring_no].block_index; + off = 0; + DBG_PRINT(INTR_DBG, "%s: block%d at: 0x%llx\n", + dev->name, block_no, + (unsigned long long) rxdp->Control_1); + mac_control->rx_curr_put_info[ring_no].offset = + off; + rxdp = nic->rx_blocks[ring_no][block_no]. + block_virt_addr; + } +#ifndef CONFIG_S2IO_NAPI + spin_lock_irqsave(&nic->put_lock, flags); nic->put_pos[ring_no] = (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off; spin_unlock_irqrestore(&nic->put_lock, flags); #endif +#endif - if (rxdp->Control_1 & RXD_OWN_XENA) { +#ifndef CONFIG_2BUFF_MODE + if (rxdp->Control_1 & RXD_OWN_XENA) +#else + if (rxdp->Control_2 & BIT(0)) +#endif + { mac_control->rx_curr_put_info[ring_no]. offset = off; goto end; } +#ifdef CONFIG_2BUFF_MODE + /* + * RxDs Spanning cache lines will be replenished only + * if the succeeding RxD is also owned by Host. It + * will always be the ((8*i)+3) and ((8*i)+6) + * descriptors for the 48 byte descriptor. The offending + * decsriptor is of-course the 3rd descriptor. + */ + rxdpphys = nic->rx_blocks[ring_no][block_no]. + block_dma_addr + (off * sizeof(RxD_t)); + if (((u64) (rxdpphys)) % 128 > 80) { + rxdpnext = nic->rx_blocks[ring_no][block_no]. + block_virt_addr + (off + 1); + if (rxdpnext->Host_Control == END_OF_BLOCK) { + nextblk = (block_no + 1) % + (nic->block_count[ring_no]); + rxdpnext = nic->rx_blocks[ring_no] + [nextblk].block_virt_addr; + } + if (rxdpnext->Control_2 & BIT(0)) + goto end; + } +#endif +#ifndef CONFIG_2BUFF_MODE skb = dev_alloc_skb(size + NET_IP_ALIGN); +#else + skb = dev_alloc_skb(dev->mtu + ALIGN_SIZE + + /*BUF0_LEN + */ 22); +#endif if (!skb) { DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); return -ENOMEM; } +#ifndef CONFIG_2BUFF_MODE skb_reserve(skb, NET_IP_ALIGN); memset(rxdp, 0, sizeof(RxD_t)); rxdp->Buffer0_ptr = pci_map_single @@ -1645,6 +1812,33 @@ off++; off %= (MAX_RXDS_PER_BLOCK + 1); mac_control->rx_curr_put_info[ring_no].offset = off; +#else + ba = &nic->ba[ring_no][block_no][off]; + tmp = (u64) skb->data; + tmp += ALIGN_SIZE; + tmp &= ~ALIGN_SIZE; + skb->data = (void *) tmp; + + memset(rxdp, 0, sizeof(RxD_t)); + rxdp->Buffer2_ptr = pci_map_single + (nic->pdev, skb->data, dev->mtu + 22, + PCI_DMA_FROMDEVICE); + rxdp->Buffer0_ptr = + pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, + PCI_DMA_FROMDEVICE); + rxdp->Buffer1_ptr = + pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, + PCI_DMA_FROMDEVICE); + + rxdp->Control_2 = SET_BUFFER2_SIZE(dev->mtu + 22); + rxdp->Control_2 |= SET_BUFFER0_SIZE(BUF0_LEN); + rxdp->Control_2 |= SET_BUFFER1_SIZE(1); /* dummy. */ + rxdp->Control_2 |= BIT(0); /* Set Buffer_Empty bit. */ + rxdp->Host_Control = (u64) ((unsigned long) (skb)); + rxdp->Control_1 |= RXD_OWN_XENA; + off++; + mac_control->rx_curr_put_info[ring_no].offset = off; +#endif atomic_inc(&nic->rx_bufs_left[ring_no]); alloc_tab++; } @@ -1670,6 +1864,9 @@ struct sk_buff *skb; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &sp->mac_control; config = &sp->config; @@ -1679,6 +1876,7 @@ off = j % (MAX_RXDS_PER_BLOCK + 1); rxdp = sp->rx_blocks[i][blk].block_virt_addr + off; +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 == END_OF_BLOCK) { rxdp = (RxD_t *) ((unsigned long) rxdp-> @@ -1686,6 +1884,12 @@ j++; blk++; } +#else + if (rxdp->Host_Control == END_OF_BLOCK) { + blk++; + continue; + } +#endif if (!(rxdp->Control_1 & RXD_OWN_XENA)) { memset(rxdp, 0, sizeof(RxD_t)); @@ -1696,6 +1900,7 @@ (struct sk_buff *) ((unsigned long) rxdp-> Host_Control); if (skb) { +#ifndef CONFIG_2BUFF_MODE pci_unmap_single(sp->pdev, (dma_addr_t) rxdp->Buffer0_ptr, dev->mtu + @@ -1703,6 +1908,21 @@ + HEADER_802_2_SIZE + HEADER_SNAP_SIZE, PCI_DMA_FROMDEVICE); +#else + ba = &sp->ba[i][blk][off]; + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); +#endif dev_kfree_skb(skb); atomic_dec(&sp->rx_bufs_left[i]); buf_cnt++; @@ -1741,11 +1961,16 @@ register u64 val64 = 0; rx_curr_get_info_t get_info, put_info; int i, get_block, put_block, get_offset, put_offset, ring_bufs; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif struct sk_buff *skb; RxD_t *rxdp; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &nic->mac_control; config = &nic->config; @@ -1764,6 +1989,7 @@ ring_bufs = config->rx_cfg[i].num_rxd; rxdp = nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + get_info.offset; put_offset = (put_block * (MAX_RXDS_PER_BLOCK + 1)) + @@ -1820,6 +2046,66 @@ mac_control->rx_curr_get_info[i].offset = get_info.offset; } +#else + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + put_offset = (put_block * (MAX_RXDS_PER_BLOCK + 1)) + + put_info.offset; + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) != put_offset)) { + if (--pkts_to_process < 0) { + goto no_rx; + } + skb = (struct sk_buff *) ((unsigned long) + rxdp->Host_Control); + if (skb == NULL) { + DBG_PRINT(ERR_DBG, "%s: The skb is ", + dev->name); + DBG_PRINT(ERR_DBG, "Null in Rx Intr\n"); + goto no_rx; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); + ba = &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset = + get_info.offset; + rxdp = + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset = 0; + mac_control->rx_curr_get_info[i]. + offset = get_info.offset; + get_block++; + get_block %= nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index = get_block; + rxdp = + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + pkt_cnt++; + } +#endif } if (!pkt_cnt) pkt_cnt = 1; @@ -1873,12 +2159,17 @@ rx_curr_get_info_t get_info, put_info; RxD_t *rxdp; struct sk_buff *skb; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif register u64 val64 = 0; int get_block, get_offset, put_block, put_offset, ring_bufs; int i, pkt_cnt = 0; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &nic->mac_control; config = &nic->config; @@ -1898,6 +2189,7 @@ ring_bufs = config->rx_cfg[i].num_rxd; rxdp = nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + get_info.offset; spin_lock(&nic->put_lock); @@ -1953,6 +2245,67 @@ && (pkt_cnt > indicate_max_pkts)) break; } +#else + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + spin_lock(&nic->put_lock); + put_offset = nic->put_pos[i]; + spin_unlock(&nic->put_lock); + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) != put_offset)) { + skb = (struct sk_buff *) ((unsigned long) + rxdp->Host_Control); + if (skb == NULL) { + DBG_PRINT(ERR_DBG, "%s: The skb is ", + dev->name); + DBG_PRINT(ERR_DBG, "Null in Rx Intr\n"); + return; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); + ba = &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset = + get_info.offset; + rxdp = + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset = 0; + mac_control->rx_curr_get_info[i]. + offset = get_info.offset; + get_block++; + get_block %= nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index = get_block; + rxdp = + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + pkt_cnt++; + if ((indicate_max_pkts) + && (pkt_cnt > indicate_max_pkts)) + break; + } +#endif if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) break; } @@ -4096,12 +4449,21 @@ * Return value: * SUCCESS on success and -1 on failure. */ +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no) +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba) +#endif { struct net_device *dev = (struct net_device *) sp->dev; struct sk_buff *skb = (struct sk_buff *) ((unsigned long) rxdp->Host_Control); u16 l3_csum, l4_csum; +#ifdef CONFIG_2BUFF_MODE + int buf0_len, buf2_len; + struct ethhdr *eth = (struct ethhdr *) ba->ba_0; +#endif l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1); if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->rx_csum)) { @@ -4129,10 +4491,32 @@ DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", dev->name, err); } +#ifdef CONFIG_2BUFF_MODE + buf0_len = RXD_GET_BUFFER0_SIZE(rxdp->Control_2); + buf2_len = RXD_GET_BUFFER2_SIZE(rxdp->Control_2); +#endif skb->dev = dev; +#ifndef CONFIG_2BUFF_MODE skb_put(skb, len); skb->protocol = eth_type_trans(skb, dev); +#else + skb_put(skb, buf2_len); + /* + * Reproducing eth_type_trans functionality and running + * on the ethernet header 'eth' stripped and given to us + * by the hardware in 2Buff mode. + */ + if (*eth->h_dest & 1) { + if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN)) + skb->pkt_type = PACKET_BROADCAST; + else + skb->pkt_type = PACKET_MULTICAST; + } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) { + skb->pkt_type = PACKET_OTHERHOST; + } + skb->protocol = eth->h_proto; +#endif #ifdef CONFIG_S2IO_NAPI netif_receive_skb(skb); @@ -4143,7 +4527,11 @@ dev->last_rx = jiffies; sp->rx_pkt_count++; sp->stats.rx_packets++; +#ifndef CONFIG_2BUFF_MODE sp->stats.rx_bytes += len; +#else + sp->stats.rx_bytes += buf0_len + buf2_len; +#endif atomic_dec(&sp->rx_bufs_left[ring_no]); rxdp->Host_Control = 0; diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 21:22:23.000000000 -0700 @@ -466,19 +466,46 @@ #define RXD_GET_L4_CKSUM(val) ((u16)(val) & 0xFFFF) u64 Control_2; +#ifndef CONFIG_2BUFF_MODE #define MASK_BUFFER0_SIZE vBIT(0xFFFF,0,16) #define SET_BUFFER0_SIZE(val) vBIT(val,0,16) +#else +#define MASK_BUFFER0_SIZE vBIT(0xFF,0,16) +#define MASK_BUFFER1_SIZE vBIT(0xFFFF,16,16) +#define MASK_BUFFER2_SIZE vBIT(0xFFFF,32,16) +#define SET_BUFFER0_SIZE(val) vBIT(val,8,8) +#define SET_BUFFER1_SIZE(val) vBIT(val,16,16) +#define SET_BUFFER2_SIZE(val) vBIT(val,32,16) +#endif + #define MASK_VLAN_TAG vBIT(0xFFFF,48,16) #define SET_VLAN_TAG(val) vBIT(val,48,16) #define SET_NUM_TAG(val) vBIT(val,16,32) +#ifndef CONFIG_2BUFF_MODE #define RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 & vBIT(0xFFFF,0,16))) +#else +#define RXD_GET_BUFFER0_SIZE(Control_2) (u8)((Control_2 & MASK_BUFFER0_SIZE) \ + >> 48) +#define RXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER1_SIZE) \ + >> 32) +#define RXD_GET_BUFFER2_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER2_SIZE) \ + >> 16) +#define BUF0_LEN 40 +#define BUF1_LEN 1 +#endif + u64 Buffer0_ptr; +#ifdef CONFIG_2BUFF_MODE + u64 Buffer1_ptr; + u64 Buffer2_ptr; +#endif } RxD_t; /* Structure that represents the Rx descriptor block which contains * 128 Rx descriptors. */ +#ifndef CONFIG_2BUFF_MODE typedef struct _RxD_block { #define MAX_RXDS_PER_BLOCK 127 RxD_t rxd[MAX_RXDS_PER_BLOCK]; @@ -492,6 +519,27 @@ * the upper 32 bits should * be 0 */ } RxD_block_t; +#else +typedef struct _RxD_block { +#define MAX_RXDS_PER_BLOCK 85 + RxD_t rxd[MAX_RXDS_PER_BLOCK]; + +#define END_OF_BLOCK 0xFEFFFFFFFFFFFFFFULL + u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF to mark last Rxd + * in this blk */ + u64 pNext_RxD_Blk_physical; /* Phy ponter to next blk. */ +} RxD_block_t; +#define SIZE_OF_BLOCK 4096 + +/* Structure to hold virtual addresses of Buf0 and Buf1 in + * 2buf mode. */ +typedef struct bufAdd { + void *ba_0_org; + void *ba_1_org; + void *ba_0; + void *ba_1; +} buffAdd_t; +#endif /* Structure which stores all the MAC control parameters */ @@ -677,6 +725,10 @@ #define LINK_DOWN 1 #define LINK_UP 2 +#ifdef CONFIG_2BUFF_MODE + /* Buffer Address store. */ + buffAdd_t **ba[MAX_RX_RINGS]; +#endif int task_flag; } nic_t; @@ -802,7 +854,12 @@ static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tasklet(unsigned long dev_addr); static void s2io_set_multicast(struct net_device *dev); +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no); +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba); +#endif void s2io_link(nic_t * sp, int link); void s2io_reset(nic_t * sp); #ifdef CONFIG_S2IO_NAPI From raghavendra.koushik@s2io.com Mon Nov 8 15:19:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:19:22 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NJHcW029954 for ; Mon, 8 Nov 2004 15:19:17 -0800 Received: by linux.site (Postfix, from userid 0) id 1101D3291D; Mon, 8 Nov 2004 08:16:48 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 9/12] S2io: new functions for card restart Message-Id: <20041108161648.1101D3291D@linux.site> Date: Mon, 8 Nov 2004 08:16:48 -0800 (PST) X-archive-position: 11599 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 12511 Lines: 459 Hi, The attached patch incorporates Jeff's comments related to creating separate functions for restarting the NIC(without using close and open entry points) and few other comments. Complete list of changes are as follows: 1. Two new functions s2io_card_down() and s2io_card_up() are defined and are called during reset procedure instead of close and open routines. 2. tasklet_status field is now made as unsigned long. 3. On getting serious error, queue is stopped before resetting the card. 4. Removed the check for "queue stopped" in xmit routine. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-26 16:36:28.024066008 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-26 16:36:16.682790144 -0700 @@ -82,8 +82,7 @@ #define LINK_IS_UP(val64) (!(val64 & (ADAPTER_STATUS_RMAC_REMOTE_FAULT | \ ADAPTER_STATUS_RMAC_LOCAL_FAULT))) -#define TASKLET_IN_USE test_and_set_bit(0, \ - (unsigned long *)(&sp->tasklet_status)) +#define TASKLET_IN_USE test_and_set_bit(0, (&sp->tasklet_status)) #define PANIC 1 #define LOW 2 static inline int rx_buffer_level(nic_t * sp, int rxb_size, int ring) @@ -2447,6 +2446,7 @@ if (val64 & SERR_SOURCE_ANY) { DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name); DBG_PRINT(ERR_DBG, "serious error!!\n"); + netif_stop_queue(dev); schedule_work(&nic->rst_timer_task); } @@ -2648,7 +2648,7 @@ * ********************************************************* */ /** - * s2io-open - open entry point of the driver + * s2io_open - open entry point of the driver * @dev : pointer to the device structure. * Description: * This function is the open entry point of the driver. It mainly calls a @@ -2662,10 +2662,7 @@ int s2io_open(struct net_device *dev) { nic_t *sp = dev->priv; - int i, ret = 0, err = 0; - mac_info_t *mac_control; - struct config_param *config; - + int err = 0; /* * Make sure you have link off by default every time @@ -2674,68 +2671,30 @@ netif_carrier_off(dev); sp->last_link_state = LINK_DOWN; - /* Initialize the H/W I/O registers */ - if (init_nic(sp) != 0) { + /* Initialize H/W and enable interrupts */ + if (s2io_card_up(sp)) { DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", dev->name); return -ENODEV; } /* After proper initialization of H/W, register ISR */ - err = - request_irq((int) sp->irq, s2io_isr, SA_SHIRQ, sp->name, dev); + err = request_irq((int) sp->irq, s2io_isr, SA_SHIRQ, + sp->name, dev); if (err) { s2io_reset(sp); DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n", dev->name); return err; } + if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n"); s2io_reset(sp); return -ENODEV; } - - /* Setting its receive mode */ - s2io_set_multicast(dev); - - /* - * Initializing the Rx buffers. For now we are considering only 1 - * Rx ring and initializing buffers into 1016 RxDs or 8 Rx blocks - */ - mac_control = &sp->mac_control; - config = &sp->config; - - for (i = 0; i < config->rx_ring_num; i++) { - if ((ret = fill_rx_buffers(sp, i))) { - DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n", - dev->name); - s2io_reset(sp); - free_irq(dev->irq, dev); - free_rx_buffers(sp); - return -ENOMEM; - } - DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i, - atomic_read(&sp->rx_bufs_left[i])); - } - - /* Enable tasklet for the device */ - tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); - - /* Enable Rx Traffic and interrupts on the NIC */ - if (start_nic(sp)) { - DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name); - tasklet_kill(&sp->task); - s2io_reset(sp); - free_irq(dev->irq, dev); - free_rx_buffers(sp); - return -ENODEV; - } - - sp->device_close_flag = FALSE; /* Device is up and running. */ netif_start_queue(dev); - return 0; } @@ -2755,67 +2714,14 @@ int s2io_close(struct net_device *dev) { nic_t *sp = dev->priv; - XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; - register u64 val64 = 0; - u16 cnt = 0; - unsigned long flags; - spin_lock_irqsave(&sp->tx_lock, flags); + flush_scheduled_work(); netif_stop_queue(dev); + /* Reset card, kill tasklet and free Tx and Rx buffers. */ + s2io_card_down(sp); - /* disable Tx and Rx traffic on the NIC */ - stop_nic(sp); - - /* - * If the device tasklet is running, wait till its done - * before killing it - */ - while (atomic_read(&(sp->tasklet_status))) { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 10); - } - tasklet_kill(&sp->task); - - /* Free the Registered IRQ */ free_irq(dev->irq, dev); - - /* Flush all scheduled tasks */ - if (sp->task_flag == 1) { - DBG_PRINT(INFO_DBG, "%s: Calling close from a task\n", - dev->name); - } else { - flush_scheduled_work(); - } - - /* Check if the device is Quiescent and then Reset the NIC */ - do { - val64 = readq(&bar0->adapter_status); - if (verify_xena_quiescence(val64, sp->device_enabled_once)) { - break; - } - - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 20); - cnt++; - if (cnt == 10) { - DBG_PRINT(ERR_DBG, - "s2io_close:Device not Quiescent "); - DBG_PRINT(ERR_DBG, "adaper status reads 0x%llx\n", - (unsigned long long) val64); - break; - } - } while (1); - s2io_reset(sp); - - /* Free all Tx Buffers waiting for transmission */ - free_tx_buffers(sp); - - /* Free all Rx buffers allocated by host */ - free_rx_buffers(sp); - sp->device_close_flag = TRUE; /* Device is shut down. */ - spin_unlock_irqrestore(&sp->tx_lock, flags); - return 0; } @@ -2851,14 +2757,13 @@ config = &sp->config; DBG_PRINT(TX_DBG, "%s: In S2IO Tx routine\n", dev->name); - spin_lock_irqsave(&sp->tx_lock, flags); - if ((netif_queue_stopped(dev)) || (!netif_carrier_ok(dev))) { - DBG_PRINT(TX_DBG, "%s:s2io_xmit: Tx Queue stopped\n", + + if (atomic_read(&sp->card_state) == CARD_DOWN) { + DBG_PRINT(ERR_DBG, "%s: Card going down for reset\n", dev->name); - dev_kfree_skb(skb); spin_unlock_irqrestore(&sp->tx_lock, flags); - return 0; + return 1; } queue = 0; @@ -3037,18 +2942,13 @@ DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); DBG_PRINT(ERR_DBG, " in ISR!!\n"); - clear_bit(0, - (unsigned long *) (&sp-> - tasklet_status)); + clear_bit(0, (&sp->tasklet_status)); return IRQ_HANDLED; } - clear_bit(0, - (unsigned long *) (&sp->tasklet_status)); - } else if ((level == LOW) - && (!atomic_read(&sp->tasklet_status))) { + clear_bit(0, (&sp->tasklet_status)); + } else if (level == LOW) { tasklet_schedule(&sp->task); } - } #endif @@ -4317,7 +4217,7 @@ break; } } - clear_bit(0, (unsigned long *) (&sp->tasklet_status)); + clear_bit(0, (&sp->tasklet_status)); } } @@ -4335,6 +4235,11 @@ register u64 val64; u16 subid; + if (test_and_set_bit(0, &(nic->link_state))) { + /* The card is being reset, no point doing anything */ + return; + } + subid = nic->pdev->subsystem_device; /* * Allow a small delay for the NICs self initiated @@ -4384,6 +4289,109 @@ DBG_PRINT(ERR_DBG, "device is not Quiescent\n"); netif_stop_queue(dev); } + clear_bit(0, &(nic->link_state)); +} + +static void s2io_card_down(nic_t * sp) +{ + int cnt = 0; + XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0; + unsigned long flags; + register u64 val64 = 0; + + /* If s2io_set_link task is executing, wait till it completes. */ + while (test_and_set_bit(0, &(sp->link_state))) { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ / 20); + } + atomic_set(&sp->card_state, CARD_DOWN); + + /* disable Tx and Rx traffic on the NIC */ + stop_nic(sp); + + /* Kill tasklet. */ + tasklet_kill(&sp->task); + + /* Check if the device is Quiescent and then Reset the NIC */ + do { + val64 = readq(&bar0->adapter_status); + if (verify_xena_quiescence(val64, sp->device_enabled_once)) { + break; + } + + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ / 20); + cnt++; + if (cnt == 10) { + DBG_PRINT(ERR_DBG, + "s2io_close:Device not Quiescent "); + DBG_PRINT(ERR_DBG, "adaper status reads 0x%llx\n", + (unsigned long long) val64); + break; + } + } while (1); + spin_lock_irqsave(&sp->tx_lock, flags); + s2io_reset(sp); + + /* Free all unused Tx and Rx buffers */ + free_tx_buffers(sp); + free_rx_buffers(sp); + + spin_unlock_irqrestore(&sp->tx_lock, flags); + clear_bit(0, &(sp->link_state)); +} + +static int s2io_card_up(nic_t * sp) +{ + int i, ret; + mac_info_t *mac_control; + struct config_param *config; + struct net_device *dev = (struct net_device *) sp->dev; + + /* Initialize the H/W I/O registers */ + if (init_nic(sp) != 0) { + DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", + dev->name); + return -ENODEV; + } + + /* + * Initializing the Rx buffers. For now we are considering only 1 + * Rx ring and initializing buffers into 30 Rx blocks + */ + mac_control = &sp->mac_control; + config = &sp->config; + + for (i = 0; i < config->rx_ring_num; i++) { + if ((ret = fill_rx_buffers(sp, i))) { + DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n", + dev->name); + s2io_reset(sp); + free_rx_buffers(sp); + return -ENOMEM; + } + DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i, + atomic_read(&sp->rx_bufs_left[i])); + } + + /* Setting its receive mode */ + s2io_set_multicast(dev); + + /* Enable tasklet for the device */ + tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); + + /* Enable Rx Traffic and interrupts on the NIC */ + if (start_nic(sp)) { + DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name); + tasklet_kill(&sp->task); + s2io_reset(sp); + free_irq(dev->irq, dev); + free_rx_buffers(sp); + return -ENODEV; + } + + atomic_set(&sp->card_state, CARD_UP); + return 0; } /** @@ -4401,13 +4409,14 @@ struct net_device *dev = (struct net_device *) data; nic_t *sp = dev->priv; - sp->task_flag = 1; - s2io_close(dev); - sp->task_flag = 0; - sp->device_close_flag = TRUE; - s2io_open(dev); - DBG_PRINT(ERR_DBG, - "%s: was reset by Tx watchdog timer.\n", dev->name); + s2io_card_down(sp); + if (s2io_card_up(sp)) { + DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", + dev->name); + } + netif_wake_queue(dev); + DBG_PRINT(ERR_DBG, "%s: was reset by Tx watchdog timer\n", + dev->name); } /** @@ -4990,8 +4999,13 @@ dev->addr_len = ETH_ALEN; memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); - /* Initialize the tasklet status flag */ - atomic_set(&(sp->tasklet_status), 0); + /* + * Initialize the tasklet status and link state flags + * and the card statte parameter + */ + atomic_set(&(sp->card_state), 0); + sp->tasklet_status = 0; + sp->link_state = 0; /* Initialize spinlocks */ @@ -5298,7 +5312,7 @@ printk ("tx_urange_a, tx_urange_b & tx_urange_c can take value " "from 0 to 100 and range_a can't exceed range_b " - "neither can range_b exceed range_c\n"); + "neither can range_b exceed range_c\n"); fail = 1; } if (((rx_urange_a > 100) || (rx_urange_b > 100) || @@ -5307,7 +5321,7 @@ printk ("rx_urange_a, rx_urange_b & rx_urange_c can take value " "from 0 to 100 and range_a can't exceed range_b " - "neither can range_b exceed range_c\n"); + "neither can range_b exceed range_c\n"); fail = 1; } if ((tx_ufc_a > 0xffff) || (tx_ufc_b > 0xffff) || diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-26 16:36:28.244032568 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-26 16:36:16.893758072 -0700 @@ -637,7 +637,7 @@ char name[32]; struct tasklet_struct task; - atomic_t tasklet_status; + volatile unsigned long tasklet_status; struct timer_list timer; struct net_device *dev; struct pci_dev *pdev; @@ -730,6 +730,10 @@ buffAdd_t **ba[MAX_RX_RINGS]; #endif int task_flag; +#define CARD_DOWN 1 +#define CARD_UP 2 + atomic_t card_state; + volatile unsigned long link_state; } nic_t; #define RESET_ERROR 1; @@ -874,5 +878,7 @@ static struct ethtool_ops netdev_ethtool_ops; #endif static void s2io_set_link(unsigned long data); +static void s2io_card_down(nic_t * nic); +static int s2io_card_up(nic_t * nic); #endif /* _S2IO_H */ From raghavendra.koushik@s2io.com Mon Nov 8 15:19:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:19:54 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NJowd030385 for ; Mon, 8 Nov 2004 15:19:50 -0800 Received: by linux.site (Postfix, from userid 0) id 48E3D3291D; Mon, 8 Nov 2004 08:17:20 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 10/12] S2io: 2 buffer mode with copy Message-Id: <20041108161720.48E3D3291D@linux.site> Date: Mon, 8 Nov 2004 08:17:20 -0800 (PST) X-archive-position: 11600 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 4297 Lines: 131 Hi All, This patch addresses the comments by Chris Leech about skb->mac.ethernet resulting in NULL dereference with the old method of implementing 2 buffer mode. The new method performs a copy of the MAC header to the head of the payload. This is a stop-gap measure till the fragmented skb receive feature in the kernel is made functional. Also, using GFP_KERNEL flag for buffer0, buffer1 memory allocation instead of GFP_ATOMIC. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-26 16:40:58.271982080 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-26 16:40:42.944312240 -0700 @@ -497,7 +497,7 @@ ba = &nic->ba[i][j][k]; ba->ba_0_org = (void *) kmalloc - (BUF0_LEN + ALIGN_SIZE, GFP_ATOMIC); + (BUF0_LEN + ALIGN_SIZE, GFP_KERNEL); if (!ba->ba_0_org) return -ENOMEM; tmp = (u64) ba->ba_0_org; @@ -506,7 +506,7 @@ ba->ba_0 = (void *) tmp; ba->ba_1_org = (void *) kmalloc - (BUF1_LEN + ALIGN_SIZE, GFP_ATOMIC); + (BUF1_LEN + ALIGN_SIZE, GFP_KERNEL); if (!ba->ba_1_org) return -ENOMEM; tmp = (u64) ba->ba_1_org; @@ -1791,8 +1791,7 @@ #ifndef CONFIG_2BUFF_MODE skb = dev_alloc_skb(size + NET_IP_ALIGN); #else - skb = dev_alloc_skb(dev->mtu + ALIGN_SIZE + - /*BUF0_LEN + */ 22); + skb = dev_alloc_skb(dev->mtu + ALIGN_SIZE + BUF0_LEN + 4); #endif if (!skb) { DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); @@ -1813,14 +1812,16 @@ mac_control->rx_curr_put_info[ring_no].offset = off; #else ba = &nic->ba[ring_no][block_no][off]; + skb_reserve(skb, BUF0_LEN); tmp = (u64) skb->data; tmp += ALIGN_SIZE; tmp &= ~ALIGN_SIZE; skb->data = (void *) tmp; + skb->tail = (void *) tmp; memset(rxdp, 0, sizeof(RxD_t)); rxdp->Buffer2_ptr = pci_map_single - (nic->pdev, skb->data, dev->mtu + 22, + (nic->pdev, skb->data, dev->mtu + BUF0_LEN + 4, PCI_DMA_FROMDEVICE); rxdp->Buffer0_ptr = pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, @@ -1829,7 +1830,7 @@ pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, PCI_DMA_FROMDEVICE); - rxdp->Control_2 = SET_BUFFER2_SIZE(dev->mtu + 22); + rxdp->Control_2 = SET_BUFFER2_SIZE(dev->mtu + 4); rxdp->Control_2 |= SET_BUFFER0_SIZE(BUF0_LEN); rxdp->Control_2 |= SET_BUFFER1_SIZE(1); /* dummy. */ rxdp->Control_2 |= BIT(0); /* Set Buffer_Empty bit. */ @@ -1919,7 +1920,7 @@ PCI_DMA_FROMDEVICE); pci_unmap_single(sp->pdev, (dma_addr_t) rxdp->Buffer2_ptr, - dev->mtu + 22, + dev->mtu + BUF0_LEN + 4, PCI_DMA_FROMDEVICE); #endif dev_kfree_skb(skb); @@ -2073,7 +2074,7 @@ BUF1_LEN, PCI_DMA_FROMDEVICE); pci_unmap_single(nic->pdev, (dma_addr_t) rxdp->Buffer2_ptr, - dev->mtu + 22, + dev->mtu + BUF0_LEN + 4, PCI_DMA_FROMDEVICE); ba = &nic->ba[i][get_block][get_info.offset]; @@ -2270,7 +2271,7 @@ BUF1_LEN, PCI_DMA_FROMDEVICE); pci_unmap_single(nic->pdev, (dma_addr_t) rxdp->Buffer2_ptr, - dev->mtu + 22, + dev->mtu + BUF0_LEN + 4, PCI_DMA_FROMDEVICE); ba = &nic->ba[i][get_block][get_info.offset]; @@ -4471,7 +4472,7 @@ u16 l3_csum, l4_csum; #ifdef CONFIG_2BUFF_MODE int buf0_len, buf2_len; - struct ethhdr *eth = (struct ethhdr *) ba->ba_0; + unsigned char *buff; #endif l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1); @@ -4510,21 +4511,10 @@ skb_put(skb, len); skb->protocol = eth_type_trans(skb, dev); #else + buff = skb_push(skb, buf0_len); + memcpy(buff, ba->ba_0, buf0_len); skb_put(skb, buf2_len); - /* - * Reproducing eth_type_trans functionality and running - * on the ethernet header 'eth' stripped and given to us - * by the hardware in 2Buff mode. - */ - if (*eth->h_dest & 1) { - if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN)) - skb->pkt_type = PACKET_BROADCAST; - else - skb->pkt_type = PACKET_MULTICAST; - } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) { - skb->pkt_type = PACKET_OTHERHOST; - } - skb->protocol = eth->h_proto; + skb->protocol = eth_type_trans(skb, dev); #endif #ifdef CONFIG_S2IO_NAPI From raghavendra.koushik@s2io.com Mon Nov 8 15:20:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:20:23 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NKHQa030716 for ; Mon, 8 Nov 2004 15:20:17 -0800 Received: by linux.site (Postfix, from userid 0) id A84A53291E; Mon, 8 Nov 2004 08:17:46 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 11/12] S2io: modified loadable parameters Message-Id: <20041108161746.A84A53291E@linux.site> Date: Mon, 8 Nov 2004 08:17:46 -0800 (PST) X-archive-position: 11601 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 21748 Lines: 648 Hi, Attached is the patch to implement module loadable parameters as per new API. Following is the list of changes. 1. Used new module_param() API. 2. List of variables for tx_fifo_len and rx_ring_sz replaced with array. 3. Some of the module parameters which can be set thru setpci command have been removed, such as latency_timer, max_read_byte_cnt, max_split_transactions. 4. Other parameters which were felt to be not required, such as rx_prio, tx_prio have been removed. 5. Interrupt moderation parameters(such as tx_urange_*) are no longer module loadable parameters since they can be configured thru' a separate patch available to customers. 6. Changed default max_read_byte_count to 1024. 7. If scatter-gather is enabled, checksum is enabled too. 8. Not verifying if module loadable parameters are within valid range (verify_load_param() removed). Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-26 16:43:26.315476048 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-26 16:43:19.561502808 -0700 @@ -26,17 +26,13 @@ * * The module loadable parameters that are supported by the driver and a brief * explaination of all the variables. - * ring_num : This can be used to program the number of receive rings used + * rx_ring_num : This can be used to program the number of receive rings used * in the driver. - * frame_len: This is an array of size 8. Using this we can set the maximum - * size of the received frame that can be steered into the corrsponding - * receive ring. - * ring_len: This defines the number of descriptors each ring can have. This + * rx_ring_len: This defines the number of descriptors each ring can have. This * is also an array of size 8. - * fifo_num: This defines the number of Tx FIFOs thats used int the driver. - * fifo_len: This too is an array of 8. Each element defines the number of + * tx_fifo_num: This defines the number of Tx FIFOs thats used int the driver. + * tx_fifo_len: This too is an array of 8. Each element defines the number of * Tx descriptors that can be associated with each corresponding FIFO. - * latency_timer: This input is programmed into the Latency timer register * in PCI Configuration space. ************************************************************************/ @@ -222,66 +218,22 @@ }; /* Module Loadable parameters. */ -static u32 frame_len[MAX_RX_RINGS]; -static u32 rx_prio; -static u32 tx_prio; - -static unsigned int lso_enable = 1; -#ifndef CONFIG_S2IO_NAPI -static unsigned int indicate_max_pkts; -#endif -static unsigned int cksum_offload_enable = 1; static unsigned int tx_fifo_num = 1; -static unsigned int tx_fifo_len_0 = DEFAULT_FIFO_LEN; -static unsigned int tx_fifo_len_1; -static unsigned int tx_fifo_len_2; -static unsigned int tx_fifo_len_3; -static unsigned int tx_fifo_len_4; -static unsigned int tx_fifo_len_5; -static unsigned int tx_fifo_len_6; -static unsigned int tx_fifo_len_7; -static unsigned int max_txds = MAX_SKB_FRAGS; +static unsigned int tx_fifo_len[MAX_TX_FIFOS] = + {[0 ...(MAX_TX_FIFOS - 1)] = 0 }; static unsigned int rx_ring_num = 1; -static unsigned int rx_ring_sz_0 = SMALL_BLK_CNT; -static unsigned int rx_ring_sz_1; -static unsigned int rx_ring_sz_2; -static unsigned int rx_ring_sz_3; -static unsigned int rx_ring_sz_4; -static unsigned int rx_ring_sz_5; -static unsigned int rx_ring_sz_6; -static unsigned int rx_ring_sz_7; +static unsigned int rx_ring_sz[MAX_RX_RINGS] = + {[0 ...(MAX_RX_RINGS - 1)] = 0 }; static unsigned int Stats_refresh_time = 4; static unsigned int rmac_pause_time = 65535; static unsigned int mc_pause_threshold_q0q3 = 187; static unsigned int mc_pause_threshold_q4q7 = 187; static unsigned int shared_splits; -#if defined(__ia64__) -static unsigned int max_splits_trans = XENA_THREE_SPLIT_TRANSACTION; -#else -static unsigned int max_splits_trans = XENA_TWO_SPLIT_TRANSACTION; -#endif static unsigned int tmac_util_period = 5; static unsigned int rmac_util_period = 5; -static unsigned int tx_timer_val = 0xFFF; -static unsigned int tx_utilz_periodic = 1; -static unsigned int rx_timer_val = 0xFFF; -static unsigned int rx_utilz_periodic = 1; -static unsigned int tx_urange_a = 0xA; -static unsigned int tx_ufc_a = 0x10; -static unsigned int tx_urange_b = 0x10; -static unsigned int tx_ufc_b = 0x20; -static unsigned int tx_urange_c = 0x30; -static unsigned int tx_ufc_c = 0x40; -static unsigned int tx_ufc_d = 0x80; -static unsigned int rx_urange_a = 0xA; -static unsigned int rx_ufc_a = 0x1; -static unsigned int rx_urange_b = 0x10; -static unsigned int rx_ufc_b = 0x2; -static unsigned int rx_urange_c = 0x30; -static unsigned int rx_ufc_c = 0x40; -static unsigned int rx_ufc_d = 0x80; -static u8 latency_timer = 0xf8; -static u8 max_read_byte_cnt = 2; +#ifndef CONFIG_S2IO_NAPI +static unsigned int indicate_max_pkts; +#endif /* * S2IO device table. @@ -923,17 +875,8 @@ * Disable Rx steering. Hard coding all packets be steered to * Queue 0 for now. */ - if (rx_prio) { - u64 def = 0x8000000000000000ULL, tmp; - for (i = 0; i < MAX_RX_RINGS; i++) { - tmp = (u64) (def >> (i % config->rx_ring_num)); - val64 |= (u64) (tmp >> (i * 8)); - } - writeq(val64, &bar0->rts_qos_steering); - } else { - val64 = 0x8080808080808080ULL; - writeq(val64, &bar0->rts_qos_steering); - } + val64 = 0x8080808080808080ULL; + writeq(val64, &bar0->rts_qos_steering); /* UDP Fix */ val64 = 0; @@ -964,18 +907,15 @@ * Scheme. */ /* TTI Initialization */ - val64 = TTI_DATA1_MEM_TX_TIMER_VAL(tx_timer_val) | - TTI_DATA1_MEM_TX_URNG_A(tx_urange_a) | - TTI_DATA1_MEM_TX_URNG_B(tx_urange_b) | - TTI_DATA1_MEM_TX_URNG_C(tx_urange_c); - if (tx_utilz_periodic) - val64 |= TTI_DATA1_MEM_TX_TIMER_AC_EN; + val64 = TTI_DATA1_MEM_TX_TIMER_VAL(0xFFF) | + TTI_DATA1_MEM_TX_URNG_A(0xA) | + TTI_DATA1_MEM_TX_URNG_B(0x10) | + TTI_DATA1_MEM_TX_URNG_C(0x30) | TTI_DATA1_MEM_TX_TIMER_AC_EN; writeq(val64, &bar0->tti_data1_mem); - val64 = TTI_DATA2_MEM_TX_UFC_A(tx_ufc_a) | - TTI_DATA2_MEM_TX_UFC_B(tx_ufc_b) | - TTI_DATA2_MEM_TX_UFC_C(tx_ufc_c) | - TTI_DATA2_MEM_TX_UFC_D(tx_ufc_d); + val64 = TTI_DATA2_MEM_TX_UFC_A(0x10) | + TTI_DATA2_MEM_TX_UFC_B(0x20) | + TTI_DATA2_MEM_TX_UFC_C(0x40) | TTI_DATA2_MEM_TX_UFC_D(0x80); writeq(val64, &bar0->tti_data2_mem); val64 = TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE_NEW_CMD; @@ -1004,19 +944,16 @@ } /* RTI Initialization */ - val64 = RTI_DATA1_MEM_RX_TIMER_VAL(rx_timer_val) | - RTI_DATA1_MEM_RX_URNG_A(rx_urange_a) | - RTI_DATA1_MEM_RX_URNG_B(rx_urange_b) | - RTI_DATA1_MEM_RX_URNG_C(rx_urange_c); - if (rx_utilz_periodic) - val64 |= RTI_DATA1_MEM_RX_TIMER_AC_EN; + val64 = RTI_DATA1_MEM_RX_TIMER_VAL(0xFFF) | + RTI_DATA1_MEM_RX_URNG_A(0xA) | + RTI_DATA1_MEM_RX_URNG_B(0x10) | + RTI_DATA1_MEM_RX_URNG_C(0x30) | RTI_DATA1_MEM_RX_TIMER_AC_EN; writeq(val64, &bar0->rti_data1_mem); - val64 = RTI_DATA2_MEM_RX_UFC_A(rx_ufc_a) | - RTI_DATA2_MEM_RX_UFC_B(rx_ufc_b) | - RTI_DATA2_MEM_RX_UFC_C(rx_ufc_c) | - RTI_DATA2_MEM_RX_UFC_D(rx_ufc_d); + val64 = RTI_DATA2_MEM_RX_UFC_A(0x1) | + RTI_DATA2_MEM_RX_UFC_B(0x2) | + RTI_DATA2_MEM_RX_UFC_C(0x40) | RTI_DATA2_MEM_RX_UFC_D(0x80); writeq(val64, &bar0->rti_data2_mem); val64 = RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE_NEW_CMD; @@ -1675,15 +1612,8 @@ mac_control = &nic->mac_control; config = &nic->config; - if (frame_len[ring_no]) { - if (frame_len[ring_no] > dev->mtu) - dev->mtu = frame_len[ring_no]; - size = frame_len[ring_no] + HEADER_ETHERNET_II_802_3_SIZE + - HEADER_802_2_SIZE + HEADER_SNAP_SIZE; - } else { - size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE + - HEADER_802_2_SIZE + HEADER_SNAP_SIZE; - } + size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE + + HEADER_802_2_SIZE + HEADER_SNAP_SIZE; while (alloc_tab < alloc_cnt) { block_no = mac_control->rx_curr_put_info[ring_no]. @@ -2768,13 +2698,6 @@ } queue = 0; - /* Multi FIFO Tx is disabled for now. */ - if (!queue && tx_prio) { - u8 x = (skb->data)[5]; - queue = x % config->tx_fifo_num; - } - - put_off = (u16) mac_control->tx_curr_put_info[queue].offset; get_off = (u16) mac_control->tx_curr_get_info[queue].offset; txdp = (TxD_t *) sp->list_info[queue][put_off].list_virt_addr; @@ -4612,25 +4535,16 @@ (pci_cmd | PCI_COMMAND_PARITY)); pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); - /* Set user specified value in Latency Timer */ - if (latency_timer) { - pci_write_config_byte(sp->pdev, PCI_LATENCY_TIMER, - latency_timer); - pci_read_config_byte(sp->pdev, PCI_LATENCY_TIMER, - &latency_timer); - } - - /* Set MMRB count to 2048 in PCI-X Command register. */ + /* Set MMRB count to 1024 in PCI-X Command register. */ sp->pcix_cmd &= 0xFFF3; - pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, - (sp->pcix_cmd | (max_read_byte_cnt << 2))); + pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, (sp->pcix_cmd | (0x1 << 2))); /* MMRBC 1K */ pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(sp->pcix_cmd)); /* Setting Maximum outstanding splits based on system type. */ sp->pcix_cmd &= 0xFF8F; - sp->pcix_cmd |= XENA_MAX_OUTSTANDING_SPLITS(max_splits_trans); + sp->pcix_cmd |= XENA_MAX_OUTSTANDING_SPLITS(0x1); /* 2 splits. */ pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, sp->pcix_cmd); pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, @@ -4645,58 +4559,20 @@ MODULE_AUTHOR("Raghavendra Koushik "); MODULE_LICENSE("GPL"); -MODULE_PARM(lso_enable, "i"); +module_param(tx_fifo_num, int, 0); +module_param_array(tx_fifo_len, int, tx_fifo_num, 0); +module_param(rx_ring_num, int, 0); +module_param_array(rx_ring_sz, int, rx_ring_num, 0); +module_param(Stats_refresh_time, int, 0); +module_param(rmac_pause_time, int, 0); +module_param(mc_pause_threshold_q0q3, int, 0); +module_param(mc_pause_threshold_q4q7, int, 0); +module_param(shared_splits, int, 0); +module_param(tmac_util_period, int, 0); +module_param(rmac_util_period, int, 0); #ifndef CONFIG_S2IO_NAPI -MODULE_PARM(indicate_max_pkts, "i"); +module_param(indicate_max_pkts, int, 0); #endif -MODULE_PARM(cksum_offload_enable, "i"); -MODULE_PARM(tx_fifo_num, "i"); -MODULE_PARM(tx_fifo_len_0, "i"); -MODULE_PARM(tx_fifo_len_1, "i"); -MODULE_PARM(tx_fifo_len_2, "i"); -MODULE_PARM(tx_fifo_len_3, "i"); -MODULE_PARM(tx_fifo_len_4, "i"); -MODULE_PARM(tx_fifo_len_5, "i"); -MODULE_PARM(tx_fifo_len_6, "i"); -MODULE_PARM(tx_fifo_len_7, "i"); -MODULE_PARM(max_txds, "i"); -MODULE_PARM(rx_ring_num, "i"); -MODULE_PARM(rx_ring_sz_0, "i"); -MODULE_PARM(rx_ring_sz_1, "i"); -MODULE_PARM(rx_ring_sz_2, "i"); -MODULE_PARM(rx_ring_sz_3, "i"); -MODULE_PARM(rx_ring_sz_4, "i"); -MODULE_PARM(rx_ring_sz_5, "i"); -MODULE_PARM(rx_ring_sz_6, "i"); -MODULE_PARM(rx_ring_sz_7, "i"); -MODULE_PARM(Stats_refresh_time, "i"); -MODULE_PARM(rmac_pause_time, "i"); -MODULE_PARM(mc_pause_threshold_q0q3, "i"); -MODULE_PARM(mc_pause_threshold_q4q7, "i"); -MODULE_PARM(shared_splits, "i"); -MODULE_PARM(max_splits_trans, "i"); -MODULE_PARM(tmac_util_period, "i"); -MODULE_PARM(rmac_util_period, "i"); -MODULE_PARM(tx_timer_val, "i"); -MODULE_PARM(tx_utilz_periodic, "i"); -MODULE_PARM(rx_timer_val, "i"); -MODULE_PARM(rx_utilz_periodic, "i"); -MODULE_PARM(tx_urange_a, "i"); -MODULE_PARM(tx_ufc_a, "i"); -MODULE_PARM(tx_urange_b, "i"); -MODULE_PARM(tx_ufc_b, "i"); -MODULE_PARM(tx_urange_c, "i"); -MODULE_PARM(tx_ufc_c, "i"); -MODULE_PARM(tx_ufc_d, "i"); -MODULE_PARM(rx_urange_a, "i"); -MODULE_PARM(rx_ufc_a, "i"); -MODULE_PARM(rx_urange_b, "i"); -MODULE_PARM(rx_ufc_b, "i"); -MODULE_PARM(rx_urange_c, "i"); -MODULE_PARM(rx_ufc_c, "i"); -MODULE_PARM(rx_ufc_d, "i"); -MODULE_PARM(latency_timer, "i"); -MODULE_PARM(max_read_byte_cnt, "i"); /** * s2io_init_nic - Initialization of the adapter . * @pdev : structure containing the PCI related information of the device. @@ -4797,23 +4673,12 @@ config = &sp->config; /* Tx side parameters. */ + tx_fifo_len[0] = DEFAULT_FIFO_LEN; /* Default value. */ config->tx_fifo_num = tx_fifo_num; - config->tx_cfg[0].fifo_len = tx_fifo_len_0; - config->tx_cfg[0].fifo_priority = 0; - config->tx_cfg[1].fifo_len = tx_fifo_len_1; - config->tx_cfg[1].fifo_priority = 1; - config->tx_cfg[2].fifo_len = tx_fifo_len_2; - config->tx_cfg[2].fifo_priority = 2; - config->tx_cfg[3].fifo_len = tx_fifo_len_3; - config->tx_cfg[3].fifo_priority = 3; - config->tx_cfg[4].fifo_len = tx_fifo_len_4; - config->tx_cfg[4].fifo_priority = 4; - config->tx_cfg[5].fifo_len = tx_fifo_len_5; - config->tx_cfg[5].fifo_priority = 5; - config->tx_cfg[6].fifo_len = tx_fifo_len_6; - config->tx_cfg[6].fifo_priority = 6; - config->tx_cfg[7].fifo_len = tx_fifo_len_7; - config->tx_cfg[7].fifo_priority = 7; + for (i = 0; i < MAX_TX_FIFOS; i++) { + config->tx_cfg[i].fifo_len = tx_fifo_len[i]; + config->tx_cfg[i].fifo_priority = i; + } config->tx_intr_type = TXD_INT_TYPE_UTILZ; for (i = 0; i < config->tx_fifo_num; i++) { @@ -4827,23 +4692,13 @@ config->max_txds = MAX_SKB_FRAGS; /* Rx side parameters. */ + rx_ring_sz[0] = SMALL_BLK_CNT; /* Default value. */ config->rx_ring_num = rx_ring_num; - config->rx_cfg[0].num_rxd = rx_ring_sz_0 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[0].ring_priority = 0; - config->rx_cfg[1].num_rxd = rx_ring_sz_1 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[1].ring_priority = 1; - config->rx_cfg[2].num_rxd = rx_ring_sz_2 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[2].ring_priority = 2; - config->rx_cfg[3].num_rxd = rx_ring_sz_3 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[3].ring_priority = 3; - config->rx_cfg[4].num_rxd = rx_ring_sz_4 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[4].ring_priority = 4; - config->rx_cfg[5].num_rxd = rx_ring_sz_5 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[5].ring_priority = 5; - config->rx_cfg[6].num_rxd = rx_ring_sz_6 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[6].ring_priority = 6; - config->rx_cfg[7].num_rxd = rx_ring_sz_7 * (MAX_RXDS_PER_BLOCK + 1); - config->rx_cfg[7].ring_priority = 7; + for (i = 0; i < MAX_RX_RINGS; i++) { + config->rx_cfg[i].num_rxd = rx_ring_sz[i] * + (MAX_RXDS_PER_BLOCK + 1); + config->rx_cfg[i].ring_priority = i; + } for (i = 0; i < rx_ring_num; i++) { config->rx_cfg[i].ring_org = RING_ORG_BUFF1; @@ -4910,17 +4765,14 @@ */ #ifdef CONFIG_S2IO_NAPI dev->poll = s2io_poll; - dev->weight = 90; /* For now. */ + dev->weight = 90; #endif - dev->features |= NETIF_F_SG; - if (cksum_offload_enable) - dev->features |= NETIF_F_IP_CSUM; + dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; if (sp->high_dma_flag == TRUE) dev->features |= NETIF_F_HIGHDMA; #ifdef NETIF_F_TSO - if (lso_enable) - dev->features |= NETIF_F_TSO; + dev->features |= NETIF_F_TSO; #endif dev->tx_timeout = &s2io_tx_watchdog; @@ -5092,8 +4944,6 @@ int __init s2io_starter(void) { - if (verify_load_parm()) - return -ENODEV; return pci_module_init(&s2io_driver); } @@ -5110,223 +4960,3 @@ module_init(s2io_starter); module_exit(s2io_closer); -/** - * verify_load_parm - verifies the module loadable parameters - * Descriptions: Verifies the module loadable parameters and initializes the - * Tx Fifo, Rx Ring and other paramters. - */ - -int verify_load_parm() -{ - int fail = 0; - if (!((lso_enable == 0) || (lso_enable == 1))) { - printk("lso_enable can be either '1' or '0'\n"); - fail = 1; - } -#ifndef CONFIG_S2IO_NAPI - if ((indicate_max_pkts > (0xFFFFFFFF))) { - printk - ("indicate_max_pkts can take value greater than zero but less than 2power(32)\n"); - fail = 1; - } -#endif - if (!((cksum_offload_enable == 0) || (cksum_offload_enable == 1))) { - printk("cksum_offload_enable can be only '0' or '1' \n"); - fail = 1; - } - if ((tx_fifo_num == 0) || (tx_fifo_num > 8)) { - printk("tx_fifo_num can take value from 1 to 8\n"); - fail = 1; - } - switch (tx_fifo_num) { - case 8: - if ((tx_fifo_len_7 == 0) || tx_fifo_len_7 > 8192) { - printk - ("tx_fifo_len_7 can take value from 1 to 8192\n"); - fail = 1; - } - case 7: - if ((tx_fifo_len_6 == 0) || tx_fifo_len_6 > 8192) { - printk - ("tx_fifo_len_6 can take value from 1 to 8192\n"); - fail = 1; - } - case 6: - if ((tx_fifo_len_5 == 0) || tx_fifo_len_5 > 8192) { - printk - ("tx_fifo_len_5 can take value from 1 to 8192\n"); - fail = 1; - } - case 5: - if ((tx_fifo_len_4 == 0) || tx_fifo_len_4 > 8192) { - printk - ("tx_fifo_len_4 can take value from 1 to 8192\n"); - fail = 1; - } - case 4: - if ((tx_fifo_len_3 == 0) || tx_fifo_len_3 > 8192) { - printk - ("tx_fifo_len_3 can take value from 1 to 8192\n"); - fail = 1; - } - case 3: - if ((tx_fifo_len_2 == 0) || tx_fifo_len_2 > 8192) { - printk - ("tx_fifo_len_2 can take value from 1 to 8192\n"); - fail = 1; - } - case 2: - if ((tx_fifo_len_1 == 0) || tx_fifo_len_1 > 8192) { - printk - ("tx_fifo_len_1 can take value from 1 to 8192\n"); - fail = 1; - } - case 1: - if ((tx_fifo_len_0 == 0) || tx_fifo_len_0 > 8192) { - printk - ("tx_fifo_len_0 can take value from 1 to 8192\n"); - fail = 1; - } - } - if ((max_txds > 32) || (max_txds < 1)) { - printk("max_txds can take value from 1 to 32\n"); - fail = 1; - } - if ((rx_ring_num > 8) || (rx_ring_num < 1)) { - printk("rx_ring_num can take value from 1 to 8\n"); - fail = 1; - } - switch (rx_ring_num) { - case 8: - if (rx_ring_sz_7 < 1) { - printk - ("rx_ring_sz_7 can take value greater than 0\n"); - fail = 1; - } - case 7: - if (rx_ring_sz_6 < 1) { - printk - ("rx_ring_sz_6 can take value greater than 0\n"); - fail = 1; - } - case 6: - if (rx_ring_sz_5 < 1) { - printk - ("rx_ring_sz_5 can take value greater than 0\n"); - fail = 1; - } - case 5: - if (rx_ring_sz_4 < 1) { - printk - ("rx_ring_sz_4 can take value greater than 0\n"); - fail = 1; - } - case 4: - if (rx_ring_sz_3 < 1) { - printk - ("rx_ring_sz_3 can take value greater than 0\n"); - fail = 1; - } - case 3: - if (rx_ring_sz_2 < 1) { - printk - ("rx_ring_sz_2 can take value greater than 0\n"); - fail = 1; - } - case 2: - if (rx_ring_sz_1 < 1) { - printk - ("rx_ring_sz_1 can take value greater than 0\n"); - fail = 1; - } - case 1: - if (rx_ring_sz_0 < 1) { - printk - ("rx_ring_sz_0 can take value greater than 0\n"); - fail = 1; - } - } - if ((Stats_refresh_time < 1)) { - printk - ("Stats_refresh_time cannot be less than 1 second \n"); - fail = 1; - } - if (((rmac_pause_time < 0x10) && (rmac_pause_time != 0)) || - (rmac_pause_time > 0xFFFF)) { - printk - ("rmac_pause_time can take value from 16 to 65535\n"); - fail = 1; - } - if (max_splits_trans > 7) { - printk("max_splits_trans can take value from 0 to 7\n"); - fail = 1; - } - if ((mc_pause_threshold_q0q3 > 0xFE)) { - printk("mc_pause_threshold_q0q3 cannot exceed 254\n"); - fail = 1; - } - if ((mc_pause_threshold_q4q7 > 0xFE)) { - printk("mc_pause_threshold_q4q7 cannot exceed 254\n"); - fail = 1; - } - if ((latency_timer) - && ((latency_timer < 8) || (latency_timer > 255))) { - printk("latency_timer can take value from 8 to 255\n"); - fail = 1; - } - if (max_read_byte_cnt > 3) { - printk("max_read_byte_cnt can take value from 0 to 3\n"); - fail = 1; - } - if (shared_splits > 31) { - printk("shared_splits cannot exceed 31\n"); - fail = 1; - } - if (rmac_util_period > 0xF) { - printk("rmac_util_period cannot exceed 15\n"); - fail = 1; - } - if (tmac_util_period > 0xF) { - printk("tmac_util_period cannot exceed 15\n"); - fail = 1; - } - if ((tx_utilz_periodic > 1) || (rx_utilz_periodic > 1)) { - printk - ("tx_utilz_periodic & rx_utilz_periodic can be either " - "'0' or '1'\n"); - fail = 1; - } - if (((tx_urange_a > 100) || (tx_urange_b > 100) || - (tx_urange_c > 100)) || (tx_urange_a > tx_urange_b) - || (tx_urange_b > tx_urange_c)) { - printk - ("tx_urange_a, tx_urange_b & tx_urange_c can take value " - "from 0 to 100 and range_a can't exceed range_b " - "neither can range_b exceed range_c\n"); - fail = 1; - } - if (((rx_urange_a > 100) || (rx_urange_b > 100) || - (rx_urange_c > 100)) || (rx_urange_a > rx_urange_b) - || (rx_urange_b > rx_urange_c)) { - printk - ("rx_urange_a, rx_urange_b & rx_urange_c can take value " - "from 0 to 100 and range_a can't exceed range_b " - "neither can range_b exceed range_c\n"); - fail = 1; - } - if ((tx_ufc_a > 0xffff) || (tx_ufc_b > 0xffff) || - (tx_ufc_c > 0xffff) || (tx_ufc_d > 0xffff)) { - printk - (" tx_ufc_a, tx_ufc_b, tx_ufc_c, tx_ufc_d can take value" - "from 0 to 65535(0xFFFF)\n"); - fail = 1; - } - if ((rx_ufc_a > 0xffff) || (rx_ufc_b > 0xffff) || - (rx_ufc_c > 0xffff) || (rx_ufc_d > 0xffff)) { - printk - (" rx_ufc_a, rx_ufc_b, rx_ufc_c, rx_ufc_d can take value" - "from 0 to 65535(0xFFFF)\n"); - fail = 1; - } - return fail; -} diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-26 16:43:26.556439416 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-26 16:43:19.800466480 -0700 @@ -873,7 +873,6 @@ int s2io_set_mac_addr(struct net_device *dev, u8 * addr); static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs); static int verify_xena_quiescence(u64 val64, int flag); -int verify_load_parm(void); #ifdef SET_ETHTOOL_OPS static struct ethtool_ops netdev_ethtool_ops; #endif From raghavendra.koushik@s2io.com Mon Nov 8 15:20:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:20:39 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NKZiv030939 for ; Mon, 8 Nov 2004 15:20:35 -0800 Received: by linux.site (Postfix, from userid 0) id 5DB33328FC; Mon, 8 Nov 2004 08:18:05 -0800 (PST) To: jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com Cc: ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: raghavendra.koushik@s2io.com Subject: [PATCH 2.6.9-rc2 12/12] S2io: styling Message-Id: <20041108161805.5DB33328FC@linux.site> Date: Mon, 8 Nov 2004 08:18:05 -0800 (PST) X-archive-position: 11602 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 3731 Lines: 133 Hi, Attached is the patch to implement comments about styling and few other changes. Following is list of changes. 1. Incorporated Randy's comment about C99 format for s2io_driver structure initialization. 2. Driver version displayed at load time. 3. If initialization failed in s2io_init_nic(), appropriate error codes are returned. 4. #ifdef SET_ETHTOOL_OPS removed in couple of places. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-26 16:45:59.090250752 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-26 16:45:47.840960904 -0700 @@ -250,10 +250,10 @@ MODULE_DEVICE_TABLE(pci, s2io_tbl); static struct pci_driver s2io_driver = { - name:"S2IO", - id_table:s2io_tbl, - probe:s2io_init_nic, - remove:__devexit_p(s2io_rem_nic), + .name = "S2IO", + .id_table = s2io_tbl, + .probe = s2io_init_nic, + .remove = __devexit_p(s2io_rem_nic), }; /* A simplifier macro used both by init and free shared_mem Fns(). */ @@ -4603,6 +4603,9 @@ struct config_param *config; + DBG_PRINT(ERR_DBG, "Loading S2IO driver with %s\n", + s2io_driver_version); + if ((ret = pci_enable_device(pdev))) { DBG_PRINT(ERR_DBG, "s2io_init_nic: pci_enable_device failed\n"); @@ -4720,6 +4723,7 @@ if (init_shared_mem(sp)) { DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", dev->name); + ret = -ENOMEM; goto mem_alloc_failed; } @@ -4728,6 +4732,7 @@ if (!sp->bar0) { DBG_PRINT(ERR_DBG, "%s: S2IO: cannot remap io mem1\n", dev->name); + ret = -ENOMEM; goto bar0_remap_failed; } @@ -4736,6 +4741,7 @@ if (!sp->bar1) { DBG_PRINT(ERR_DBG, "%s: S2IO: cannot remap io mem2\n", dev->name); + ret = -ENOMEM; goto bar1_remap_failed; } @@ -4756,9 +4762,7 @@ dev->set_multicast_list = &s2io_set_multicast; dev->do_ioctl = &s2io_ioctl; dev->change_mtu = &s2io_change_mtu; -#ifdef SET_ETHTOOL_OPS SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); -#endif /* * will use eth_mac_addr() for dev->set_mac_address * mac address will be set every time dev->open() is called @@ -4788,6 +4792,7 @@ if (s2io_set_swapper(sp)) { DBG_PRINT(ERR_DBG, "%s:swapper settings are wrong\n", dev->name); + ret = -EAGAIN; goto set_swap_failed; } @@ -4802,6 +4807,7 @@ DBG_PRINT(ERR_DBG, "%s: S2IO: swapper settings are wrong\n", dev->name); + ret = -EAGAIN; goto set_swap_failed; } @@ -4874,6 +4880,7 @@ if (register_netdev(dev)) { DBG_PRINT(ERR_DBG, "Device registration failed\n"); + ret = -ENODEV; goto register_failed; } @@ -4900,7 +4907,7 @@ pci_set_drvdata(pdev, NULL); free_netdev(dev); - return -ENODEV; + return ret; } /** diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-26 16:45:59.329214424 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-26 16:45:48.079924576 -0700 @@ -50,10 +50,6 @@ #define ALIGN_SIZE 127 #define PCIX_COMMAND_REGISTER 0x62 -#ifndef SET_ETHTOOL_OPS -#define SUPPORTED_10000baseT_Full (1 << 12) -#endif - /* * Debug related variables. */ @@ -873,9 +869,7 @@ int s2io_set_mac_addr(struct net_device *dev, u8 * addr); static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs); static int verify_xena_quiescence(u64 val64, int flag); -#ifdef SET_ETHTOOL_OPS static struct ethtool_ops netdev_ethtool_ops; -#endif static void s2io_set_link(unsigned long data); static void s2io_card_down(nic_t * nic); static int s2io_card_up(nic_t * nic); From ravinandan.arakali@s2io.com Mon Nov 8 15:25:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 15:25:35 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA8NPUDH031771 for ; Mon, 8 Nov 2004 15:25:30 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA8NOwje028750; Mon, 8 Nov 2004 18:24:58 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iA8NOs39007650; Mon, 8 Nov 2004 18:24:54 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" Cc: "'koushik'" , , , , , Subject: RE: Please ignore the corrupt patches sent earlier. Date: Mon, 8 Nov 2004 15:24:38 -0800 Message-ID: <003001c4c5ea$1e2f4510$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 In-Reply-To: <418FFA0D.8080207@pobox.com> Importance: Normal X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11603 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Content-Length: 835 Lines: 31 Jeff, Remaining 11 patches have also been sent. Pls ack and review the code changes. Thanks, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Monday, November 08, 2004 2:58 PM To: ravinandan.arakali@s2io.com Cc: 'koushik'; romieu@fr.zoreil.com; netdev@oss.sgi.com; leonid.grossman@s2io.com; rapuru.sriram@s2io.com; alicia.pena@s2io.com Subject: Re: Please ignore the corrupt patches sent earlier. Ravinandan Arakali wrote: > Jeff, > By default, sendmail puts the From: address as "root@linux.site". > We suspect this may be causing your pobox domain to reject the > message. We'll try sending the first patch to you with > From: address set to Koushik's(using -f option of sendmail). > Kindly ack if you get the patch and we'll send the rest of the > patches. I just received patch #1. Jeff From romieu@fr.zoreil.com Mon Nov 8 16:04:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 16:04:23 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA904Ef5001166 for ; Mon, 8 Nov 2004 16:04:15 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA9007vr020504; Tue, 9 Nov 2004 01:00:07 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA9007xg020503; Tue, 9 Nov 2004 01:00:07 +0100 Date: Tue, 9 Nov 2004 01:00:06 +0100 From: Francois Romieu To: seby@focomunicatii.ro Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Message-ID: <20041109000006.GA14911@electric-eye.fr.zoreil.com> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041107224803.GA29248@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11604 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 10396 Lines: 340 seby@focomunicatii.ro : [...] > I just bouth a zyxel GN650T network card .. and it sems that vlan's don't > work on this card .. anybody had this problems with this card .. Patch below against 2.6.10-rc1-bk15 + Jeff's netdev should convert the driver to the in-kernel vlan API. I'd be surprized it does from the first try though. Please keep netdev CCed. diff -puN drivers/net/via-velocity.c~via-velocity-300 drivers/net/via-velocity.c --- linux-2.6.10-rc1/drivers/net/via-velocity.c~via-velocity-300 2004-11-08 00:59:23.000000000 +0100 +++ linux-2.6.10-rc1-fr/drivers/net/via-velocity.c 2004-11-09 00:56:08.000000000 +0100 @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -114,15 +115,6 @@ VELOCITY_PARAM(RxDescriptors, "Number of #define TX_DESC_DEF 64 VELOCITY_PARAM(TxDescriptors, "Number of transmit descriptors"); -#define VLAN_ID_MIN 0 -#define VLAN_ID_MAX 4095 -#define VLAN_ID_DEF 0 -/* VID_setting[] is used for setting the VID of NIC. - 0: default VID. - 1-4094: other VIDs. -*/ -VELOCITY_PARAM(VID_setting, "802.1Q VLAN ID"); - #define RX_THRESH_MIN 0 #define RX_THRESH_MAX 3 #define RX_THRESH_DEF 0 @@ -150,13 +142,6 @@ VELOCITY_PARAM(rx_thresh, "Receive fifo */ VELOCITY_PARAM(DMA_length, "DMA length"); -#define TAGGING_DEF 0 -/* enable_tagging[] is used for enabling 802.1Q VID tagging. - 0: disable VID seeting(default). - 1: enable VID setting. -*/ -VELOCITY_PARAM(enable_tagging, "Enable 802.1Q tagging"); - #define IP_ALIG_DEF 0 /* IP_byte_align[] is used for IP header DWORD byte aligned 0: indicate the IP header won't be DWORD byte aligned.(Default) . @@ -275,6 +260,130 @@ static struct notifier_block velocity_in static spinlock_t velocity_dev_list_lock = SPIN_LOCK_UNLOCKED; static LIST_HEAD(velocity_dev_list); +#ifdef CONFIG_VIA_VELOCITY_VLAN + +static inline u16 velocity_tx_vlan_tag(struct velocity_info *vptr, + struct sk_buff *skb) +{ + return (vptr->vlgrp && vlan_tx_tag_present(skb)) ? + vlan_tx_tag_get(skb) : 0x00; +} + +static void velocity_vlan_rx_register(struct net_device *dev, + struct vlan_group *grp) +{ + struct velocity_info *vptr = netdev_priv(dev); + struct mac_regs __iomem *regs = vptr->mac_regs; + unsigned long flags; + + spin_lock_irqsave(&vptr->lock, flags); + vptr->vlgrp = grp; + if (vptr->vlgrp) + WORD_REG_BITS_ON(MCFG_RTGOPT, ®s->MCFG); + else + WORD_REG_BITS_OFF(MCFG_RTGOPT, ®s->MCFG); + spin_unlock_irqrestore(&vptr->lock, flags); +} + +static void velocity_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) +{ + struct velocity_info *vptr = netdev_priv(dev); + struct mac_regs __iomem *regs = vptr->mac_regs; + unsigned long flags; + u16 slot; + + spin_lock_irqsave(&vptr->lock, flags); + + for (slot = 0; slot < VCAM_SIZE; slot++) { + u8 bit = vptr->mCAMmask[slot / 8] & (1 << (slot & 7)); + + if (!bit) + break; + } + + if (slot == VCAM_SIZE) { + printk(KERN_ERR "%s: no free hardware filter for VLAN %04d\n", + dev->name, vid); + goto out_unlock; + } + + vptr->mCAMmask[slot / 8] |= 1 << (slot & 7); + + mac_set_cam(regs, slot, (u8 *) &vid, VELOCITY_VLAN_ID_CAM); + mac_set_cam_mask(regs, vptr->vCAMmask, VELOCITY_VLAN_ID_CAM); + +out_unlock: + spin_unlock_irqrestore(&vptr->lock, flags); +} + +static void velocity_vlan_rx_kill_vid(struct net_device *dev, + unsigned short vid) +{ + struct velocity_info *vptr = netdev_priv(dev); + struct mac_regs __iomem *regs = vptr->mac_regs; + unsigned long flags; + u16 slot, hw_vid; + + spin_lock_irqsave(&vptr->lock, flags); + if (!vptr->vlgrp) + goto out_unlock; + + vptr->vlgrp->vlan_devices[vid] = NULL; + + for (slot = 0; slot < VCAM_SIZE; slot++) { + u8 bit = vptr->mCAMmask[slot / 8] & (1 << (slot & 7)); + + if (!bit) + continue; + mac_get_cam(regs, slot, (u8 *) &hw_vid, VELOCITY_VLAN_ID_CAM); + if (hw_vid == vid) + break; + } + + if (slot == VCAM_SIZE) { + printk(KERN_ERR "%s: no hardware filter found for VLAN %04d\n", + dev->name, vid); + goto out_unlock; + } + + vptr->mCAMmask[slot / 8] &= ~(1 << (slot & 7)); + mac_set_cam_mask(regs, vptr->vCAMmask, VELOCITY_VLAN_ID_CAM); + +out_unlock: + spin_unlock_irqrestore(&vptr->lock, flags); +} + +static int velocity_rx_vlan_skb(struct velocity_info *vptr, struct rx_desc *rd, + struct sk_buff *skb) +{ + int ret; + + if (vptr->vlgrp && (rd->rdesc0.RSR & RSR_VTAG)) { + u16 vlan_tag = rd->rdesc1.u.pqinf.VID; + + /* FIXME: should be NAPI dependant */ + vlan_hwaccel_receive_skb(skb, vptr->vlgrp, vlan_tag); + ret = 0; + } else + ret = -1; + return ret; +} + +#else + +static inline u16 velocity_tx_vlan_tag(struct velocity_info *vptr, + struct sk_buff *skb) +{ + return 0; +} + +static int velocity_rx_vlan_skb(struct velocity_info *vptr, struct sk_buff *skb) +{ + return -1; +} + +#endif + static void velocity_register_notifier(void) { register_inetaddr_notifier(&velocity_inetaddr_notifier); @@ -440,8 +549,6 @@ static void __devinit velocity_get_optio velocity_set_int_opt(&opts->DMA_length, DMA_length[index], DMA_LENGTH_MIN, DMA_LENGTH_MAX, DMA_LENGTH_DEF, "DMA_length", devname); velocity_set_int_opt(&opts->numrx, RxDescriptors[index], RX_DESC_MIN, RX_DESC_MAX, RX_DESC_DEF, "RxDescriptors", devname); velocity_set_int_opt(&opts->numtx, TxDescriptors[index], TX_DESC_MIN, TX_DESC_MAX, TX_DESC_DEF, "TxDescriptors", devname); - velocity_set_int_opt(&opts->vid, VID_setting[index], VLAN_ID_MIN, VLAN_ID_MAX, VLAN_ID_DEF, "VID_setting", devname); - velocity_set_bool_opt(&opts->flags, enable_tagging[index], TAGGING_DEF, VELOCITY_FLAGS_TAGGING, "enable_tagging", devname); velocity_set_bool_opt(&opts->flags, txcsum_offload[index], TX_CSUM_DEF, VELOCITY_FLAGS_TX_CSUM, "txcsum_offload", devname); velocity_set_int_opt(&opts->flow_cntl, flow_control[index], FLOW_CNTL_MIN, FLOW_CNTL_MAX, FLOW_CNTL_DEF, "flow_control", devname); velocity_set_bool_opt(&opts->flags, IP_byte_align[index], IP_ALIG_DEF, VELOCITY_FLAGS_IP_ALIGN, "IP_byte_align", devname); @@ -463,6 +570,7 @@ static void __devinit velocity_get_optio static void velocity_init_cam_filter(struct velocity_info *vptr) { struct mac_regs __iomem * regs = vptr->mac_regs; + u16 temp = 0; /* Turn on MCFG_PQEN, turn off MCFG_RTGOPT */ WORD_REG_BITS_SET(MCFG_PQEN, MCFG_RTGOPT, ®s->MCFG); @@ -475,21 +583,9 @@ static void velocity_init_cam_filter(str mac_set_cam_mask(regs, vptr->mCAMmask, VELOCITY_MULTICAST_CAM); /* Enable first VCAM */ - if (vptr->flags & VELOCITY_FLAGS_TAGGING) { - /* If Tagging option is enabled and VLAN ID is not zero, then - turn on MCFG_RTGOPT also */ - if (vptr->options.vid != 0) - WORD_REG_BITS_ON(MCFG_RTGOPT, ®s->MCFG); - - mac_set_cam(regs, 0, (u8 *) & (vptr->options.vid), VELOCITY_VLAN_ID_CAM); - vptr->vCAMmask[0] |= 1; - mac_set_cam_mask(regs, vptr->vCAMmask, VELOCITY_VLAN_ID_CAM); - } else { - u16 temp = 0; - mac_set_cam(regs, 0, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); - temp = 1; - mac_set_cam_mask(regs, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); - } + mac_set_cam(regs, 0, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); + temp++; + mac_set_cam_mask(regs, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); } /** @@ -791,6 +887,13 @@ static int __devinit velocity_found1(str dev->features |= NETIF_F_SG; #endif +#ifdef CONFIG_VIA_VELOCITY_VLAN + dev->vlan_rx_register = velocity_vlan_rx_register; + dev->vlan_rx_kill_vid = velocity_vlan_rx_kill_vid; + dev->vlan_rx_add_vid = velocity_vlan_rx_add_vid; + dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; +#endif + if (vptr->flags & VELOCITY_FLAGS_TX_CSUM) { dev->features |= NETIF_F_HW_CSUM; } @@ -1427,7 +1530,8 @@ static int velocity_receive_frame(struct skb->protocol = eth_type_trans(skb, skb->dev); stats->rx_bytes += pkt_len; - netif_rx(skb); + if (velocity_rx_vlan_skb(vptr, rd, skb) < 0) + netif_rx(skb); return 0; } @@ -1985,12 +2089,10 @@ static int velocity_xmit(struct sk_buff td_ptr->tdesc1.CMDZ = 2; } - if (vptr->flags & VELOCITY_FLAGS_TAGGING) { - td_ptr->tdesc1.pqinf.VID = (vptr->options.vid & 0xfff); - td_ptr->tdesc1.pqinf.priority = 0; - td_ptr->tdesc1.pqinf.CFI = 0; - td_ptr->tdesc1.TCR |= TCR0_VETAG; - } + td_ptr->tdesc1.u.pqinf.VID = velocity_tx_vlan_tag(vptr, skb); + td_ptr->tdesc1.u.pqinf.CFI = 0; + td_ptr->tdesc1.u.pqinf.priority = 0; + td_ptr->tdesc1.TCR |= vlan_tx_tag_present(skb) ? TCR0_VETAG : 0x00; /* * Handle hardware checksum diff -puN drivers/net/via-velocity.h~via-velocity-300 drivers/net/via-velocity.h --- linux-2.6.10-rc1/drivers/net/via-velocity.h~via-velocity-300 2004-11-08 00:59:23.000000000 +0100 +++ linux-2.6.10-rc1-fr/drivers/net/via-velocity.h 2004-11-09 00:57:13.000000000 +0100 @@ -201,8 +201,17 @@ struct rdesc0 { u16 owner:1; /* Who owns this buffer ? */ }; +struct pqinf { /* Priority queue info */ + u16 VID:12; + u16 CFI:1; + u16 priority:3; +} __attribute__ ((__packed__)); + struct rdesc1 { - u16 PQTAG; + union { + u16 vlan_tag; + struct pqinf pqinf; + } u; u8 CSM; u8 IPKT; }; @@ -227,14 +236,11 @@ struct tdesc0 { u16 owner:1; /* Who owns the buffer */ }; -struct pqinf { /* Priority queue info */ - u16 VID:12; - u16 CFI:1; - u16 priority:3; -} __attribute__ ((__packed__)); - struct tdesc1 { - struct pqinf pqinf; + union { + u16 vlan_tag; + struct pqinf pqinf; + } u; u8 TCR; u8 TCPLS:2; u8 reserved:2; @@ -1796,7 +1802,9 @@ struct velocity_info { u32 ticks; u32 rx_bytes; - +#ifdef CONFIG_VIA_VELOCITY_VLAN + struct vlan_group *vlgrp; +#endif }; /** diff -puN drivers/net/Kconfig~via-velocity-300 drivers/net/Kconfig --- linux-2.6.10-rc1/drivers/net/Kconfig~via-velocity-300 2004-11-08 00:59:23.000000000 +0100 +++ linux-2.6.10-rc1-fr/drivers/net/Kconfig 2004-11-08 01:00:20.000000000 +0100 @@ -2070,6 +2070,15 @@ config VIA_VELOCITY To compile this driver as a module, choose M here. The module will be called via-velocity. +config VIA_VELOCITY_VLAN + bool "VLAN support" + depends on VIA_VELOCITY && VLAN_8021Q + ---help--- + Say Y here for the via-velocity driver to support the functions + required by the kernel 802.1Q code. + + If in doubt, say Y. + config TIGON3 tristate "Broadcom Tigon3 support" depends on PCI _ From kumarkr@us.ibm.com Mon Nov 8 16:43:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 16:43:24 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA90hDIp005997 for ; Mon, 8 Nov 2004 16:43:14 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA90gpLv163856 for ; Mon, 8 Nov 2004 19:42:51 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA90gpf5266800 for ; Mon, 8 Nov 2004 17:42:51 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA90goYH007090 for ; Mon, 8 Nov 2004 17:42:50 -0700 Received: from d03nm132.boulder.ibm.com (d03nm132.boulder.ibm.com [9.17.195.172]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA90goOO007081; Mon, 8 Nov 2004 17:42:50 -0700 In-Reply-To: <20041108161634.D459A3291A@linux.site> Subject: Re: [PATCH 2.6.9-rc2 8/12] S2io: two buffer mode To: raghavendra.koushik@s2io.com Cc: jgarzik@pobox.com, netdev@oss.sgi.com, raghavendra.koushik@s2io.com, ravinandan.arakali@s2io.com, romieu@fr.zoreil.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Krishna Kumar Date: Mon, 8 Nov 2004 16:41:01 -0800 X-MIMETrack: Serialize by Router on D03NM132/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/08/2004 17:42:49 MIME-Version: 1.0 Content-type: multipart/related; Boundary="0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88" X-archive-position: 11605 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kumarkr@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 78333 Lines: 2199 --0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: multipart/alternative; Boundary="1__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88" --1__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: quoted-printable Sorry if my mailer mangles the mail, but ... This code looks like it can cause an oops on failure to alloc cases. I havent read the code very much other than the init and the free routines. +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i =3D 0; i < config->rx_ring_num; i++) { + blk_cnt =3D + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j =3D 0; j < blk_cnt; j++) { + int k =3D 0; + if (!nic->ba[i][j]) + continue; + while (k !=3D MAX_RXDS_PER_BLOCK) = { + buffAdd_t *ba =3D &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); + k++; + } + kfree(nic->ba[i][j]); + } + if (nic->ba[i]) + kfree(nic->ba[i]); + } +#endif Shouldn't this be something like (check ba[i] at the top to avoid MMU) = : +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i =3D 0; i < config->rx_ring_num; i++) { + if (!nic->ba[i]) /* if there are no holes, we = are done */ + break; + blk_cnt =3D + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j =3D 0; j < blk_cnt; j++) { + int k =3D 0; + if (!nic->ba[i][j]) + continue; >> Should this be a break ? Can you have holes in the middle ? + while (k !=3D MAX_RXDS_PER_BLOCK) = { + buffAdd_t *ba =3D &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); >> Actually if no holes are allowed, you can break out if the above pointers become >> NULL instead of iterating MAX_RXDS_PER_BLOCK (127) times. + k++; + } + kfree(nic->ba[i][j]); + } + kfree(nic->ba[i]); + } +#endif thx, - KK = raghavendra.koush = ik@s2io.com = Sent by: = To netdev-bounce@oss jgarzik@pobox.com, = .sgi.com romieu@fr.zoreil.com, = netdev@oss.sgi.com = = cc 11/08/2004 08:16 ravinandan.arakali@s2io.com, = AM raghavendra.koushik@s2io.com = Subj= ect [PATCH 2.6.9-rc2 8/12] S2io: two= buffer mode = = = = = = = Hi, Attached is the patch for implementing 2-buffer mode on Rx path. More description of this mode of operation follows. On certain systems when a DMA has to happen on an un-aligned memory location performance will take a significant hit. It's standard practice to offset the Rx buffer address by 2 (as Mac header is 14 byte= s) so the IP header starts from an aligned location. Obviously using a single Rx buffer both cannot be achieved. Thus XFrame= supports something called 2 buffer Rx mode, where in the Rx'ed frame is split into 2 parts, one is the Ethernet header and the o= ther is the Ethernet payload. So now we can allocate proper aligned memory for both buffers, hence the DMA is not slowed down. Also= , the Ethernet payload(starting from L3 header) is on an aligned location so OS need not have to do un-aligned accesses to proce= ss IP header. To achieve this, the kernel function eth_type_trans functionality has to be partially implemented in the dri= ver itself. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/Kconfig linux-2.6.8.1 /drivers/net/Kconfig --- vanilla-linux/drivers/net/Kconfig 2004-10-06 15:15:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/Kconfig 2004-10-11 20:06:36.000000000 -0700 @@ -2267,6 +2267,17 @@ If in doubt, say N. +config 2BUFF_MODE + bool "Use 2 Buffer Mode on Rx side." + depends on S2IO + ---help--- + On enabling the 2 buffer mode, the received frame will be + split into 2 parts before being DMA'ed to the hosts memory= . + The parts are the ethernet header and ethernet payload. + This is useful on systems where DMA'ing to to unaligned + physical memory loactions comes with a heavy price. + If not sure please say N. + endmenu source "drivers/net/tokenring/Kconfig" diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2= io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-12 16:49:27.796331624 -0700 @@ -325,6 +325,10 @@ int i, j, blk_cnt; int lst_size, lst_per_page; struct net_device *dev =3D nic->dev; +#ifdef CONFIG_2BUFF_MODE + u64 tmp; + buffAdd_t *ba; +#endif mac_info_t *mac_control; struct config_param *config; @@ -425,7 +429,11 @@ config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); /* Allocating all the Rx blocks */ for (j =3D 0; j < blk_cnt; j++) { +#ifndef CONFIG_2BUFF_MODE size =3D (MAX_RXDS_PER_BLOCK + 1) = * (sizeof(RxD_t)); +#else + size =3D SIZE_OF_BLOCK; +#endif tmp_v_addr =3D pci_alloc_consistent(nic->pdev, size, &tmp_p_addr); if (tmp_v_addr =3D=3D NULL) { @@ -458,13 +466,60 @@ pre_rxd_blk->reserved_1 =3D END_OF_BLOCK; /* last RxD * marker. */ +#ifndef CONFIG_2BUFF_MODE pre_rxd_blk->reserved_2_pNext_RxD_block =3D (unsigned long) tmp_v_addr_nex= t; +#endif pre_rxd_blk->pNext_RxD_Blk_physica= l =3D (u64) tmp_p_addr_next; } } +#ifdef CONFIG_2BUFF_MODE + /* + * Allocation of Storages for buffer addresses in 2BUFF mo= de + * and the buffers as well. + */ + for (i =3D 0; i < config->rx_ring_num; i++) { + blk_cnt =3D + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + nic->ba[i] =3D kmalloc((sizeof(buffAdd_t *) * blk_cnt), + GFP_KERNEL); + if (!nic->ba[i]) + return -ENOMEM; + for (j =3D 0; j < blk_cnt; j++) { + int k =3D 0; + nic->ba[i][j] =3D kmalloc((sizeof(buffAdd_t) * + (MAX_RXDS_PER_BLOCK + 1)), + GFP_KERNEL); + if (!nic->ba[i][j]) + return -ENOMEM; + while (k !=3D MAX_RXDS_PER_BLOCK) = { + ba =3D &nic->ba[i][j][= k]; + + ba->ba_0_org =3D (void= *) kmalloc + (BUF0_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_0_org) + return -ENOMEM; + tmp =3D (u64) ba->ba_0= _org; + tmp +=3D ALIGN_SIZE; + tmp &=3D ~((u64) ALIGN_SIZE); + ba->ba_0 =3D (void *) = tmp; + + ba->ba_1_org =3D (void= *) kmalloc + (BUF1_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_1_org) + return -ENOMEM; + tmp =3D (u64) ba->ba_1= _org; + tmp +=3D ALIGN_SIZE; + tmp &=3D ~((u64) ALIGN_SIZE); + ba->ba_1 =3D (void *) = tmp; + k++; + } + } + } +#endif + /* Allocation and initialization of Statistics block */ size =3D sizeof(StatInfo_t); mac_control->stats_mem =3D pci_alloc_consistent @@ -532,7 +587,11 @@ kfree(nic->list_info[i]); } +#ifndef CONFIG_2BUFF_MODE size =3D (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); +#else + size =3D SIZE_OF_BLOCK; +#endif for (i =3D 0; i < config->rx_ring_num; i++) { blk_cnt =3D nic->block_count[i]; for (j =3D 0; j < blk_cnt; j++) { @@ -545,6 +604,27 @@ } } +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i =3D 0; i < config->rx_ring_num; i++) { + blk_cnt =3D + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j =3D 0; j < blk_cnt; j++) { + int k =3D 0; + if (!nic->ba[i][j]) + continue; + while (k !=3D MAX_RXDS_PER_BLOCK) = { + buffAdd_t *ba =3D &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); + k++; + } + kfree(nic->ba[i][j]); + } + if (nic->ba[i]) + kfree(nic->ba[i]); + } +#endif if (mac_control->stats_mem) { pci_free_consistent(nic->pdev, @@ -1366,10 +1446,21 @@ &bar0->prc_rxd0_n[i]); val64 =3D readq(&bar0->prc_ctrl_n[i]); +#ifndef CONFIG_2BUFF_MODE val64 |=3D PRC_CTRL_RC_ENABLED; +#else + val64 |=3D PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3; +#endif writeq(val64, &bar0->prc_ctrl_n[i]); } +#ifdef CONFIG_2BUFF_MODE + /* Enabling 2 buffer mode by writing into Rx_pa_cfg reg. *= / + val64 =3D readq(&bar0->rx_pa_cfg); + val64 |=3D RX_PA_CFG_IGNORE_L2_ERR; + writeq(val64, &bar0->rx_pa_cfg); +#endif + /* * Enabling MC-RLDRAM. After enabling the device, we timeo= ut * for around 100ms, which is approximately the time requi= red @@ -1437,6 +1528,12 @@ } /* + * Don't see link state interrupts on certain switches, so= + * directly scheduling a link state task from here. + */ + schedule_work(&nic->set_link_task); + + /* * Here we are performing soft reset on XGXS to * force link down. Since link is already up, we will get * link state change interrupt after this reset @@ -1565,6 +1662,13 @@ atomic_read(&nic->rx_bufs_left[ring_no]); mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + RxD_t *rxdpnext; + int nextblk; + u64 tmp; + buffAdd_t *ba; + dma_addr_t rxdpphys; +#endif #ifndef CONFIG_S2IO_NAPI unsigned long flags; #endif @@ -1589,10 +1693,14 @@ block_index; off =3D mac_control->rx_curr_put_info[ring_no].offset; off1 =3D mac_control->rx_curr_get_info[ring_no].offset; +#ifndef CONFIG_2BUFF_MODE offset =3D block_no * (MAX_RXDS_PER_BLOCK + 1)= + off; offset1 =3D block_no1 * (MAX_RXDS_PER_BLOCK + = 1) + off1; +#else offset =3D block_no * (MAX_RXDS_PER_BLOCK) + o= ff; offset1 =3D block_no1 * (MAX_RXDS_PER_BLOCK) += off1; +#endif + rxdp =3D nic->rx_blocks[ring_no][block_no]. block_virt_addr + off; if ((offset =3D=3D offset1) && (rxdp->Host_Con= trol)) { @@ -1600,6 +1708,7 @@ DBG_PRINT(INTR_DBG, " info equated\n"); goto end; } +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 =3D=3D END_OF_BLOCK) { mac_control->rx_curr_put_info[ring_no]. block_index++; @@ -1617,23 +1726,81 @@ } #ifndef CONFIG_S2IO_NAPI spin_lock_irqsave(&nic->put_lock, flags); + nic->put_pos[ring_no] =3D + (block_no * (MAX_RXDS_PER_BLOCK + 1)) + of= f; + spin_unlock_irqrestore(&nic->put_lock, flags);= +#endif +#else + if (rxdp->Host_Control =3D=3D END_OF_BLOCK) { + mac_control->rx_curr_put_info[ring_no]. + block_index++; + mac_control->rx_curr_put_info[ring_no]. + block_index %=3D nic->block_count[ring_no]; + block_no =3D mac_control->rx_curr_put_info + [ring_no].block_index; + off =3D 0; + DBG_PRINT(INTR_DBG, "%s: block%d a= t: 0x%llx\n", + dev->name, block_no,= + (unsigned long long)= rxdp->Control_1); + mac_control->rx_curr_put_info[ring_no].offset =3D + off; + rxdp =3D nic->rx_blocks[ring_no][block_no]. + block_virt_addr; + } +#ifndef CONFIG_S2IO_NAPI + spin_lock_irqsave(&nic->put_lock, flags); nic->put_pos[ring_no] =3D (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off; spin_unlock_irqrestore(&nic->put_lock, flags);= #endif +#endif - if (rxdp->Control_1 & RXD_OWN_XENA) { +#ifndef CONFIG_2BUFF_MODE + if (rxdp->Control_1 & RXD_OWN_XENA) +#else + if (rxdp->Control_2 & BIT(0)) +#endif + { mac_control->rx_curr_put_info[ring_no]. offset =3D off; goto end; } +#ifdef CONFIG_2BUFF_MODE + /* + * RxDs Spanning cache lines will be replenish= ed only + * if the succeeding RxD is also owned by Host= . It + * will always be the ((8*i)+3) and ((8*i)+6) + * descriptors for the 48 byte descriptor. The= offending + * decsriptor is of-course the 3rd descriptor.= + */ + rxdpphys =3D nic->rx_blocks[ring_no][block_no]= . + block_dma_addr + (off * sizeof(RxD_t)); + if (((u64) (rxdpphys)) % 128 > 80) { + rxdpnext =3D nic->rx_blocks[ring_no][block_no]. + block_virt_addr + (off + 1); + if (rxdpnext->Host_Control =3D=3D END_OF_BLOCK) { + nextblk =3D (block_no = + 1) % + (nic->block_count[ring_no]); + rxdpnext =3D nic->rx_blocks[ring_no] + [nextblk].block_virt_addr; + } + if (rxdpnext->Control_2 & BIT(0)) + goto end; + } +#endif +#ifndef CONFIG_2BUFF_MODE skb =3D dev_alloc_skb(size + NET_IP_ALIGN); +#else + skb =3D dev_alloc_skb(dev->mtu + ALIGN_SIZE + + /*BUF0_LEN + */ 22= ); +#endif if (!skb) { DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); DBG_PRINT(ERR_DBG, "memory to allo= cate SKBs\n"); return -ENOMEM; } +#ifndef CONFIG_2BUFF_MODE skb_reserve(skb, NET_IP_ALIGN); memset(rxdp, 0, sizeof(RxD_t)); rxdp->Buffer0_ptr =3D pci_map_single @@ -1645,6 +1812,33 @@ off++; off %=3D (MAX_RXDS_PER_BLOCK + 1); mac_control->rx_curr_put_info[ring_no].offset = =3D off; +#else + ba =3D &nic->ba[ring_no][block_no][off]; + tmp =3D (u64) skb->data; + tmp +=3D ALIGN_SIZE; + tmp &=3D ~ALIGN_SIZE; + skb->data =3D (void *) tmp; + + memset(rxdp, 0, sizeof(RxD_t)); + rxdp->Buffer2_ptr =3D pci_map_single + (nic->pdev, skb->data, dev->mtu + 22, + PCI_DMA_FROMDEVICE); + rxdp->Buffer0_ptr =3D + pci_map_single(nic->pdev, ba->ba_0, BUF0_L= EN, + PCI_DMA_FROMDEVICE)= ; + rxdp->Buffer1_ptr =3D + pci_map_single(nic->pdev, ba->ba_1, BUF1_L= EN, + PCI_DMA_FROMDEVICE)= ; + + rxdp->Control_2 =3D SET_BUFFER2_SIZE(dev->mtu = + 22); + rxdp->Control_2 |=3D SET_BUFFER0_SIZE(BUF0_LEN= ); + rxdp->Control_2 |=3D SET_BUFFER1_SIZE(1); = /* dummy. */ + rxdp->Control_2 |=3D BIT(0); /* Set Buffer_Empty bit. */ + rxdp->Host_Control =3D (u64) ((unsigned long) (skb)); + rxdp->Control_1 |=3D RXD_OWN_XENA; + off++; + mac_control->rx_curr_put_info[ring_no].offset = =3D off; +#endif atomic_inc(&nic->rx_bufs_left[ring_no]); alloc_tab++; } @@ -1670,6 +1864,9 @@ struct sk_buff *skb; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control =3D &sp->mac_control; config =3D &sp->config; @@ -1679,6 +1876,7 @@ off =3D j % (MAX_RXDS_PER_BLOCK + = 1); rxdp =3D sp->rx_blocks[i][blk].block_virt_addr + off; +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 =3D=3D END_OF_= BLOCK) { rxdp =3D (RxD_t *) ((unsign= ed long) rxdp-> @@ -1686,6 +1884,12 @@ j++; blk++; } +#else + if (rxdp->Host_Control =3D=3D END_OF_BLOCK) { + blk++; + continue; + } +#endif if (!(rxdp->Control_1 & RXD_OWN_XE= NA)) { memset(rxdp, 0, sizeof(RxD_t)); @@ -1696,6 +1900,7 @@ (struct sk_buff *) ((unsigned long) rxdp-> Host_Control); if (skb) { +#ifndef CONFIG_2BUFF_MODE pci_unmap_single(sp->p= dev, (dma_addr_t) rxdp->Buffer0_ptr, dev->mtu + @@ -1703,6 +1908,21 @@ = + HEADER_802_2_SIZE + HEADER_SNAP_SIZE, PCI_DMA_FROMDEVICE); +#else + ba =3D &sp->ba[i][blk]= [off]; + pci_unmap_single(sp->p= dev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->p= dev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->p= dev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); +#endif dev_kfree_skb(skb); atomic_dec(&sp->rx_bufs_left[i]); buf_cnt++; @@ -1741,11 +1961,16 @@ register u64 val64 =3D 0; rx_curr_get_info_t get_info, put_info; int i, get_block, put_block, get_offset, put_offset, ring_bufs; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif struct sk_buff *skb; RxD_t *rxdp; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control =3D &nic->mac_control; config =3D &nic->config; @@ -1764,6 +1989,7 @@ ring_bufs =3D config->rx_cfg[i].num_rxd; rxdp =3D nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset =3D (get_block * (MAX_RXDS_PER_BLOC= K + 1)) + get_info.offset; put_offset =3D (put_block * (MAX_RXDS_PER_BLOC= K + 1)) + @@ -1820,6 +2046,66 @@ mac_control->rx_curr_get_info[i].offset =3D get_info.offset; } +#else + get_offset =3D (get_block * (MAX_RXDS_PER_BLOC= K + 1)) + + get_info.offset; + put_offset =3D (put_block * (MAX_RXDS_PER_BLOC= K + 1)) + + put_info.offset; + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) &&= + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) !=3D put_offset)) { + if (--pkts_to_process < 0) { + goto no_rx; + } + skb =3D (struct sk_buff *) ((unsig= ned long) + rxdp->Host_Control); + if (skb =3D=3D NULL) { + DBG_PRINT(ERR_DBG, "%s= : The skb is ", + dev->nam= e); + DBG_PRINT(ERR_DBG, "Nu= ll in Rx Intr\n"); + goto no_rx; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN,= PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN,= PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu = + 22, + PCI_DMA_FROMDEVICE); + ba =3D &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset =3D + get_info.offset; + rxdp =3D + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset =3D 0;= + mac_control->rx_curr_get_info[i]. + offset =3D get_info.offset; + get_block++; + get_block %=3D nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index =3D get_block; + rxdp =3D + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset =3D + (get_block * (MAX_RXDS_PER_BLO= CK + 1)) + + get_info.offset; + pkt_cnt++; + } +#endif } if (!pkt_cnt) pkt_cnt =3D 1; @@ -1873,12 +2159,17 @@ rx_curr_get_info_t get_info, put_info; RxD_t *rxdp; struct sk_buff *skb; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif register u64 val64 =3D 0; int get_block, get_offset, put_block, put_offset, ring_buf= s; int i, pkt_cnt =3D 0; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control =3D &nic->mac_control; config =3D &nic->config; @@ -1898,6 +2189,7 @@ ring_bufs =3D config->rx_cfg[i].num_rxd; rxdp =3D nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset =3D (get_block * (MAX_RXDS_PER_BLOC= K + 1)) + get_info.offset; spin_lock(&nic->put_lock); @@ -1953,6 +2245,67 @@ && (pkt_cnt > indicate_max_pkt= s)) break; } +#else + get_offset =3D (get_block * (MAX_RXDS_PER_BLOC= K + 1)) + + get_info.offset; + spin_lock(&nic->put_lock); + put_offset =3D nic->put_pos[i]; + spin_unlock(&nic->put_lock); + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) &&= + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) !=3D put_offset)) { + skb =3D (struct sk_buff *) ((unsig= ned long) + rxdp->Host_Control); + if (skb =3D=3D NULL) { + DBG_PRINT(ERR_DBG, "%s= : The skb is ", + dev->nam= e); + DBG_PRINT(ERR_DBG, "Nu= ll in Rx Intr\n"); + return; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN,= PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN,= PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu = + 22, + PCI_DMA_FROMDEVICE); + ba =3D &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset =3D + get_info.offset; + rxdp =3D + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset =3D 0;= + mac_control->rx_curr_get_info[i]. + offset =3D get_info.offset; + get_block++; + get_block %=3D nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index =3D get_block; + rxdp =3D + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset =3D= + (get_block * (MAX_RXDS_PER_BLO= CK + 1)) + + get_info.offset; + pkt_cnt++; + if ((indicate_max_pkts) + && (pkt_cnt > indicate_max_pkt= s)) + break; + } +#endif if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) break; } @@ -4096,12 +4449,21 @@ * Return value: * SUCCESS on success and -1 on failure. */ +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_= no) +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba) +#endif { struct net_device *dev =3D (struct net_device *) sp->dev; struct sk_buff *skb =3D (struct sk_buff *) ((unsigned long) rxdp->Host_Control= ); u16 l3_csum, l4_csum; +#ifdef CONFIG_2BUFF_MODE + int buf0_len, buf2_len; + struct ethhdr *eth =3D (struct ethhdr *) ba->ba_0; +#endif l3_csum =3D RXD_GET_L3_CKSUM(rxdp->Control_1); if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->rx_csum))= { @@ -4129,10 +4491,32 @@ DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx= \n", dev->name, err); } +#ifdef CONFIG_2BUFF_MODE + buf0_len =3D RXD_GET_BUFFER0_SIZE(rxdp->Control_2); + buf2_len =3D RXD_GET_BUFFER2_SIZE(rxdp->Control_2); +#endif skb->dev =3D dev; +#ifndef CONFIG_2BUFF_MODE skb_put(skb, len); skb->protocol =3D eth_type_trans(skb, dev); +#else + skb_put(skb, buf2_len); + /* + * Reproducing eth_type_trans functionality and running + * on the ethernet header 'eth' stripped and given to us + * by the hardware in 2Buff mode. + */ + if (*eth->h_dest & 1) { + if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN)) + skb->pkt_type =3D PACKET_BROADCAST= ; + else + skb->pkt_type =3D PACKET_MULTICAST= ; + } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) {= + skb->pkt_type =3D PACKET_OTHERHOST; + } + skb->protocol =3D eth->h_proto; +#endif #ifdef CONFIG_S2IO_NAPI netif_receive_skb(skb); @@ -4143,7 +4527,11 @@ dev->last_rx =3D jiffies; sp->rx_pkt_count++; sp->stats.rx_packets++; +#ifndef CONFIG_2BUFF_MODE sp->stats.rx_bytes +=3D len; +#else + sp->stats.rx_bytes +=3D buf0_len + buf2_len; +#endif atomic_dec(&sp->rx_bufs_left[ring_no]); rxdp->Host_Control =3D 0; diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2= io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 21:22:23.000000000 -0700 @@ -466,19 +466,46 @@ #define RXD_GET_L4_CKSUM(val) ((u16)(val) & 0xFFFF) u64 Control_2; +#ifndef CONFIG_2BUFF_MODE #define MASK_BUFFER0_SIZE vBIT(0xFFFF,0,16) #define SET_BUFFER0_SIZE(val) vBIT(val,0,16) +#else +#define MASK_BUFFER0_SIZE vBIT(0xFF,0,16) +#define MASK_BUFFER1_SIZE vBIT(0xFFFF,16,16) +#define MASK_BUFFER2_SIZE vBIT(0xFFFF,32,16) +#define SET_BUFFER0_SIZE(val) vBIT(val,8,8) +#define SET_BUFFER1_SIZE(val) vBIT(val,16,16) +#define SET_BUFFER2_SIZE(val) vBIT(val,32,16) +#endif + #define MASK_VLAN_TAG vBIT(0xFFFF,48,16) #define SET_VLAN_TAG(val) vBIT(val,48,16) #define SET_NUM_TAG(val) vBIT(val,16,32) +#ifndef CONFIG_2BUFF_MODE #define RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 & vBIT(0xFFFF,0,16))) +#else +#define RXD_GET_BUFFER0_SIZE(Control_2) (u8)((Control_2 & MASK_BUFFER0_SIZE) \ + >> 48) +#define RXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER1_SIZE) \ + >> 32) +#define RXD_GET_BUFFER2_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER2_SIZE) \ + >> 16) +#define BUF0_LEN 40 +#define BUF1_LEN 1 +#endif + u64 Buffer0_ptr; +#ifdef CONFIG_2BUFF_MODE + u64 Buffer1_ptr; + u64 Buffer2_ptr; +#endif } RxD_t; /* Structure that represents the Rx descriptor block which contains * 128 Rx descriptors. */ +#ifndef CONFIG_2BUFF_MODE typedef struct _RxD_block { #define MAX_RXDS_PER_BLOCK 127 RxD_t rxd[MAX_RXDS_PER_BLOCK]; @@ -492,6 +519,27 @@ * the upp= er 32 bits should * be 0 */= } RxD_block_t; +#else +typedef struct _RxD_block { +#define MAX_RXDS_PER_BLOCK 85 + RxD_t rxd[MAX_RXDS_PER_BLOCK]; + +#define END_OF_BLOCK 0xFEFFFFFFFFFFFFFFULL + u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF = to mark last Rxd + * in this blk */ + u64 pNext_RxD_Blk_physical; /* Phy ponter to next = blk. */ +} RxD_block_t; +#define SIZE_OF_BLOCK 4096 + +/* Structure to hold virtual addresses of Buf0 and Buf1 in + * 2buf mode. */ +typedef struct bufAdd { + void *ba_0_org; + void *ba_1_org; + void *ba_0; + void *ba_1; +} buffAdd_t; +#endif /* Structure which stores all the MAC control parameters */ @@ -677,6 +725,10 @@ #define LINK_DOWN 1 #define LINK_UP 2 +#ifdef CONFIG_2BUFF_MODE + /* Buffer Address store. */ + buffAdd_t **ba[MAX_RX_RINGS]; +#endif int task_flag; } nic_t; @@ -802,7 +854,12 @@ static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tasklet(unsigned long dev_addr); static void s2io_set_multicast(struct net_device *dev); +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_= no); +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba); +#endif void s2io_link(nic_t * sp, int link); void s2io_reset(nic_t * sp); #ifdef CONFIG_S2IO_NAPI = --1__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: text/html; charset=US-ASCII Content-Disposition: inline Content-transfer-encoding: quoted-printable

Sorry if my mailer mangles the mail, but ...

This code looks like it can cause an oops on failure to alloc cases. I = havent read the code very much other than the
init and the free routines.

+#ifdef CONFIG_2BUFF_MODE
+ /* Freeing buffer storage addresses in 2BUFF mode. */
+ for (i =3D 0; i < config->rx_ring_num; i++) {
+ blk_cnt =3D
+     config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK= + 1);
+ for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ if (!nic->ba[i][j])
+ continue;
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ buffAdd_t *ba =3D &nic->ba[i][j][k];
+ kfree(ba->ba_0_org);
+ kfree(ba->ba_1_org);
+ k++;
+ }
+ kfree(nic->ba[i][j]);
+ }
+ if (nic->ba[i])
+ kfree(nic->ba[i]);
+ }
+#endif


Shouldn't this be something like (check ba[i] at the top to avoid MMU) = :

+#ifdef CONFIG_2BUFF_MODE
+ /* Freeing buffer storage addresses in 2BUFF mode. */
+ for (i =3D 0; i < config->rx_ring_num; i++) {

+ if (!nic->ba[i]) /* if there are no holes, we are done */<= /tt>
+ break;
+ blk_cnt =3D
+     config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK= + 1);
+ for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ if (!nic->ba[i][j])
+ continue;

>> Should this be a break ? Can you have holes in the middle = ?
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ buffAdd_t *ba =3D &nic->ba[i][j][k];
+ kfree(ba->ba_0_org);
+ kfree(ba->ba_1_org);

>> Actually if no holes are allowed, you can break out if the= above pointers become
>> NULL instead of iterating MAX_RXDS_PER_BLOCK (127) times.<= br> + k++;
+ }
+ kfree(nic->ba[i][j]);
+ }
+ kfree(nic->ba[i]);
+ }
+#endif


thx,

- KK

3D"Inactiveraghavendra.koushik@s2io.com


=
          raghavendra.koushik@s2io.com
          Sent by: netdev-bounce@oss.sgi.com

          11/08/2004 08:16 AM

=
3D""
To
3D""
jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sg= i.com
3D""
cc
3D""
ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.= com
3D""
Subject
3D""
[PATCH 2.6.9-rc2 8/12] S2io: two buffer mode
=3D""3D""<= /td>

Hi,
Attached is the patch for implementing 2-buffer mode on Rx path.
More description of this mode of operation follows.

On certain systems when a DMA has to happen on an un-aligned memory loc= ation performance will take a significant hit. It's standard
practice to offset the Rx buffer address by 2 (as Mac header is 14 byte= s) so the IP header starts from an aligned location.
Obviously using a single Rx buffer both cannot be achieved. Thus XFrame= supports something called 2 buffer Rx mode, where in the
Rx'ed frame is split into 2 parts, one is the Ethernet header and the o= ther is the Ethernet payload. So now we can allocate proper
aligned memory for both buffers, hence the DMA is not slowed down. Also= , the Ethernet payload(starting from L3 header) is on an
aligned location so OS need not have to do un-aligned accesses to proce= ss IP header. To achieve this, the kernel function
eth_type_trans functionality has to be partially implemented in the dri= ver itself.

Signed-off-by: Raghavendra Koushik <raghavendra.koushik@s2io.com>=
Signed-off-by: Ravinandan Arakali <ravinandan.arakali@s2io.com> ---
diff -urN vanilla-linux/drivers/net/Kconfig linux-2.6.8.1/drivers/net/K= config
--- vanilla-linux/drivers/net/Kconfig 2004-10-06 15:15:04.000000000 -= 0700
+++ linux-2.6.8.1/drivers/net/Kconfig 2004-10-11 20:06:36.000000000 -= 0700
@@ -2267,6 +2267,17 @@

  If in doubt, say N.

+config 2BUFF_MODE
+ bool "Use 2 Buffer Mode on Rx side."
+ depends on S2IO
+ ---help---
+ On enabling the 2 buffer mode, the received frame will be
+ split into 2 parts before being DMA'ed to the hosts memory.
+ The parts are the ethernet header and ethernet payload.
+ This is useful on systems where DMA'ing to to unaligned
+ physical memory loactions comes with a heavy price.
+ If not sure please say N.
+
endmenu

source "drivers/net/tokenring/Kconfig"
diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2= io.c
--- vanilla-linux/drivers/net/s2io.c 2004-10-11 21:21:49.000000000 -0= 700
+++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-12 16:49:27.796331624 -0= 700
@@ -325,6 +325,10 @@
int i, j, blk_cnt;
int lst_size, lst_per_page;
struct net_device *dev =3D nic->dev;
+#ifdef CONFIG_2BUFF_MODE
+ u64 tmp;
+ buffAdd_t *ba;
+#endif

mac_info_t *mac_control;
struct config_param *config;
@@ -425,7 +429,11 @@
    config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK= + 1);
/*  Allocating all the Rx blocks */
for (j =3D 0; j < blk_cnt; j++) {
+#ifndef CONFIG_2BUFF_MODE
size =3D (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t));
+#else
+ size =3D SIZE_OF_BLOCK;
+#endif
tmp_v_addr =3D pci_alloc_consistent(nic->pdev, size,
  &tmp_p_addr);
if (tmp_v_addr =3D=3D NULL) {
@@ -458,13 +466,60 @@
pre_rxd_blk->reserved_1 =3D END_OF_BLOCK; /* last RxD  * marker.
 */
+#ifndef CONFIG_2BUFF_MODE
pre_rxd_blk->reserved_2_pNext_RxD_block =3D
    (unsigned long) tmp_v_addr_next;
+#endif
pre_rxd_blk->pNext_RxD_Blk_physical =3D
    (u64) tmp_p_addr_next;
}
}

+#ifdef CONFIG_2BUFF_MODE
+ /*
+  * Allocation of Storages for buffer addresses in 2BUFF mode +  * and the buffers as well.
+  */
+ for (i =3D 0; i < config->rx_ring_num; i++) {
+ blk_cnt =3D
+     config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK= + 1);
+ nic->ba[i] =3D kmalloc((sizeof(buffAdd_t *) * blk_cnt),
+      GFP_KERNEL);
+ if (!nic->ba[i])
+ return -ENOMEM;
+ for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ nic->ba[i][j] =3D kmalloc((sizeof(buffAdd_t) *
+  (MAX_RXDS_PER_BLOCK + 1)),
+ GFP_KERNEL);
+ if (!nic->ba[i][j])
+ return -ENOMEM;
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ ba =3D &nic->ba[i][j][k];
+
+ ba->ba_0_org =3D (void *) kmalloc
+     (BUF0_LEN + ALIGN_SIZE, GFP_ATOMIC);
+ if (!ba->ba_0_org)
+ return -ENOMEM;
+ tmp =3D (u64) ba->ba_0_org;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D ~((u64) ALIGN_SIZE);
+ ba->ba_0 =3D (void *) tmp;
+
+ ba->ba_1_org =3D (void *) kmalloc
+     (BUF1_LEN + ALIGN_SIZE, GFP_ATOMIC);
+ if (!ba->ba_1_org)
+ return -ENOMEM;
+ tmp =3D (u64) ba->ba_1_org;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D ~((u64) ALIGN_SIZE);
+ ba->ba_1 =3D (void *) tmp;
+ k++;
+ }
+ }
+ }
+#endif
+
/* Allocation and initialization of Statistics block */
size =3D sizeof(StatInfo_t);
mac_control->stats_mem =3D pci_alloc_consistent
@@ -532,7 +587,11 @@
kfree(nic->list_info[i]);
}

+#ifndef CONFIG_2BUFF_MODE
size =3D (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t));
+#else
+ size =3D SIZE_OF_BLOCK;
+#endif
for (i =3D 0; i < config->rx_ring_num; i++) {
blk_cnt =3D nic->block_count[i];
for (j =3D 0; j < blk_cnt; j++) {
@@ -545,6 +604,27 @@
}
}

+#ifdef CONFIG_2BUFF_MODE
+ /* Freeing buffer storage addresses in 2BUFF mode. */
+ for (i =3D 0; i < config->rx_ring_num; i++) {
+ blk_cnt =3D
+     config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK= + 1);
+ for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ if (!nic->ba[i][j])
+ continue;
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ buffAdd_t *ba =3D &nic->ba[i][j][k];
+ kfree(ba->ba_0_org);
+ kfree(ba->ba_1_org);
+ k++;
+ }
+ kfree(nic->ba[i][j]);
+ }
+ if (nic->ba[i])
+ kfree(nic->ba[i]);
+ }
+#endif

if (mac_control->stats_mem) {
pci_free_consistent(nic->pdev,
@@ -1366,10 +1446,21 @@
       &bar0->prc_rxd0_n[i]);

val64 =3D readq(&bar0->prc_ctrl_n[i]);
+#ifndef CONFIG_2BUFF_MODE
val64 |=3D PRC_CTRL_RC_ENABLED;
+#else
+ val64 |=3D PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3;
+#endif
writeq(val64, &bar0->prc_ctrl_n[i]);
}

+#ifdef CONFIG_2BUFF_MODE
+ /* Enabling 2 buffer mode by writing into Rx_pa_cfg reg. */
+ val64 =3D readq(&bar0->rx_pa_cfg);
+ val64 |=3D RX_PA_CFG_IGNORE_L2_ERR;
+ writeq(val64, &bar0->rx_pa_cfg);
+#endif
+
/*
 * Enabling MC-RLDRAM. After enabling the device, we timeout  * for around 100ms, which is approximately the time required<= br> @@ -1437,6 +1528,12 @@
}

/*
+  * Don't see link state interrupts on certain switches, so +  * directly scheduling a link state task from here.
+  */
+ schedule_work(&nic->set_link_task);
+
+ /*
 * Here we are performing soft reset on XGXS to
 * force link down. Since link is already up, we will get
 * link state change interrupt after this reset
@@ -1565,6 +1662,13 @@
    atomic_read(&nic->rx_bufs_left[ring_no]);
mac_info_t *mac_control;
struct config_param *config;
+#ifdef CONFIG_2BUFF_MODE
+ RxD_t *rxdpnext;
+ int nextblk;
+ u64 tmp;
+ buffAdd_t *ba;
+ dma_addr_t rxdpphys;
+#endif
#ifndef CONFIG_S2IO_NAPI
unsigned long flags;
#endif
@@ -1589,10 +1693,14 @@
    block_index;
off =3D mac_control->rx_curr_put_info[ring_no].offset;
off1 =3D mac_control->rx_curr_get_info[ring_no].offset;
+#ifndef CONFIG_2BUFF_MODE
offset =3D block_no * (MAX_RXDS_PER_BLOCK + 1) + off;
offset1 =3D block_no1 * (MAX_RXDS_PER_BLOCK + 1) + off1;
+#else
offset =3D block_no * (MAX_RXDS_PER_BLOCK) + off;
offset1 =3D block_no1 * (MAX_RXDS_PER_BLOCK) + off1;
+#endif
+
rxdp =3D nic->rx_blocks[ring_no][block_no].
    block_virt_addr + off;
if ((offset =3D=3D offset1) && (rxdp->Host_Control)) = {
@@ -1600,6 +1708,7 @@
DBG_PRINT(INTR_DBG, " info equated\n");
goto end;
}
+#ifndef CONFIG_2BUFF_MODE
if (rxdp->Control_1 =3D=3D END_OF_BLOCK) {
mac_control->rx_curr_put_info[ring_no].
    block_index++;
@@ -1617,23 +1726,81 @@
}
#ifndef CONFIG_S2IO_NAPI
spin_lock_irqsave(&nic->put_lock, flags);
+ nic->put_pos[ring_no] =3D
+     (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off;
+ spin_unlock_irqrestore(&nic->put_lock, flags);
+#endif
+#else
+ if (rxdp->Host_Control =3D=3D END_OF_BLOCK) {
+ mac_control->rx_curr_put_info[ring_no].
+     block_index++;
+ mac_control->rx_curr_put_info[ring_no].
+     block_index %=3D nic->block_count[ring_no];<= br> + block_no =3D mac_control->rx_curr_put_info
+     [ring_no].block_index;
+ off =3D 0;
+ DBG_PRINT(INTR_DBG, "%s: block%d at: 0x%llx\n",
= +   dev->name, block_no,
+   (unsigned long long) rxdp->Control_1);
+ mac_control->rx_curr_put_info[ring_no].offset =3D
+     off;
+ rxdp =3D nic->rx_blocks[ring_no][block_no].
+     block_virt_addr;
+ }
+#ifndef CONFIG_S2IO_NAPI
+ spin_lock_irqsave(&nic->put_lock, flags);
nic->put_pos[ring_no] =3D (block_no *
 (MAX_RXDS_PER_BLOCK + 1)) + off;
spin_unlock_irqrestore(&nic->put_lock, flags);
#endif
+#endif

- if (rxdp->Control_1 & RXD_OWN_XENA) {
+#ifndef CONFIG_2BUFF_MODE
+ if (rxdp->Control_1 & RXD_OWN_XENA)
+#else
+ if (rxdp->Control_2 & BIT(0))
+#endif
+ {
mac_control->rx_curr_put_info[ring_no].
    offset =3D off;
goto end;
}
+#ifdef CONFIG_2BUFF_MODE
+ /*
+  * RxDs Spanning cache lines will be replenished only
+  * if the succeeding RxD is also owned by Host. It
+  * will always be the ((8*i)+3) and ((8*i)+6)
+  * descriptors for the 48 byte descriptor. The offending +  * decsriptor is of-course the 3rd descriptor.
+  */
+ rxdpphys =3D nic->rx_blocks[ring_no][block_no].
+     block_dma_addr + (off * sizeof(RxD_t));
+ if (((u64) (rxdpphys)) % 128 > 80) {
+ rxdpnext =3D nic->rx_blocks[ring_no][block_no].
+     block_virt_addr + (off + 1);
+ if (rxdpnext->Host_Control =3D=3D END_OF_BLOCK) {
+ nextblk =3D (block_no + 1) %
+     (nic->block_count[ring_no]);
+ rxdpnext =3D nic->rx_blocks[ring_no]
+     [nextblk].block_virt_addr;
+ }
+ if (rxdpnext->Control_2 & BIT(0))
+ goto end;
+ }
+#endif

+#ifndef CONFIG_2BUFF_MODE
skb =3D dev_alloc_skb(size + NET_IP_ALIGN);
+#else
+ skb =3D dev_alloc_skb(dev->mtu + ALIGN_SIZE +
+     /*BUF0_LEN + */ 22);
+#endif
if (!skb) {
DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); return -ENOMEM;
}
+#ifndef CONFIG_2BUFF_MODE
skb_reserve(skb, NET_IP_ALIGN);
memset(rxdp, 0, sizeof(RxD_t));
rxdp->Buffer0_ptr =3D pci_map_single
@@ -1645,6 +1812,33 @@
off++;
off %=3D (MAX_RXDS_PER_BLOCK + 1);
mac_control->rx_curr_put_info[ring_no].offset =3D off;
+#else
+ ba =3D &nic->ba[ring_no][block_no][off];
+ tmp =3D (u64) skb->data;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D ~ALIGN_SIZE;
+ skb->data =3D (void *) tmp;
+
+ memset(rxdp, 0, sizeof(RxD_t));
+ rxdp->Buffer2_ptr =3D pci_map_single
+     (nic->pdev, skb->data, dev->mtu + 22,
= +      PCI_DMA_FROMDEVICE);
+ rxdp->Buffer0_ptr =3D
+     pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN= ,
+    PCI_DMA_FROMDEVICE);
+ rxdp->Buffer1_ptr =3D
+     pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN= ,
+    PCI_DMA_FROMDEVICE);
+
+ rxdp->Control_2 =3D SET_BUFFER2_SIZE(dev->mtu + 22);
+ rxdp->Control_2 |=3D SET_BUFFER0_SIZE(BUF0_LEN);
+ rxdp->Control_2 |=3D SET_BUFFER1_SIZE(1); /* dummy. */
+ rxdp->Control_2 |=3D BIT(0); /* Set Buffer_Empty bit. */ + rxdp->Host_Control =3D (u64) ((unsigned long) (skb));
+ rxdp->Control_1 |=3D RXD_OWN_XENA;
+ off++;
+ mac_control->rx_curr_put_info[ring_no].offset =3D off;
+#endif
atomic_inc(&nic->rx_bufs_left[ring_no]);
alloc_tab++;
}
@@ -1670,6 +1864,9 @@
struct sk_buff *skb;
mac_info_t *mac_control;
struct config_param *config;
+#ifdef CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control =3D &sp->mac_control;
config =3D &sp->config;
@@ -1679,6 +1876,7 @@
off =3D j % (MAX_RXDS_PER_BLOCK + 1);
rxdp =3D sp->rx_blocks[i][blk].block_virt_addr + off;

+#ifndef CONFIG_2BUFF_MODE
if (rxdp->Control_1 =3D=3D END_OF_BLOCK) {
rxdp =3D
    (RxD_t *) ((unsigned long) rxdp->
@@ -1686,6 +1884,12 @@
j++;
blk++;
}
+#else
+ if (rxdp->Host_Control =3D=3D END_OF_BLOCK) {
+ blk++;
+ continue;
+ }
+#endif

if (!(rxdp->Control_1 & RXD_OWN_XENA)) {
memset(rxdp, 0, sizeof(RxD_t));
@@ -1696,6 +1900,7 @@
    (struct sk_buff *) ((unsigned long) rxdp-> Host_Control);
if (skb) {
+#ifndef CONFIG_2BUFF_MODE
pci_unmap_single(sp->pdev, (dma_addr_t)
 rxdp->Buffer0_ptr,
 dev->mtu +
@@ -1703,6 +1908,21 @@
 + HEADER_802_2_SIZE +
 HEADER_SNAP_SIZE,
 PCI_DMA_FROMDEVICE);
+#else
+ ba =3D &sp->ba[i][blk][off];
+ pci_unmap_single(sp->pdev, (dma_addr_t)
+  rxdp->Buffer0_ptr,
+  BUF0_LEN,
+  PCI_DMA_FROMDEVICE);
+ pci_unmap_single(sp->pdev, (dma_addr_t)
+  rxdp->Buffer1_ptr,
+  BUF1_LEN,
+  PCI_DMA_FROMDEVICE);
+ pci_unmap_single(sp->pdev, (dma_addr_t)
+  rxdp->Buffer2_ptr,
+  dev->mtu + 22,
+  PCI_DMA_FROMDEVICE);
+#endif
dev_kfree_skb(skb);
atomic_dec(&sp->rx_bufs_left[i]);
buf_cnt++;
@@ -1741,11 +1961,16 @@
register u64 val64 =3D 0;
rx_curr_get_info_t get_info, put_info;
int i, get_block, put_block, get_offset, put_offset, ring_bufs;
= +#ifndef CONFIG_2BUFF_MODE
u16 val16, cksum;
+#endif
struct sk_buff *skb;
RxD_t *rxdp;
mac_info_t *mac_control;
struct config_param *config;
+#ifdef CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control =3D &nic->mac_control;
config =3D &nic->config;
@@ -1764,6 +1989,7 @@
ring_bufs =3D config->rx_cfg[i].num_rxd;
rxdp =3D nic->rx_blocks[i][get_block].block_virt_addr +
    get_info.offset;
+#ifndef CONFIG_2BUFF_MODE
get_offset =3D (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
    get_info.offset;
put_offset =3D (put_block * (MAX_RXDS_PER_BLOCK + 1)) +
@@ -1820,6 +2046,66 @@
mac_control->rx_curr_get_info[i].offset =3D
    get_info.offset;
}
+#else
+ get_offset =3D (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+ put_offset =3D (put_block * (MAX_RXDS_PER_BLOCK + 1)) +
+     put_info.offset;
+ while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) &&
+        (((get_offset + 1) % ring_bufs) !=3D = put_offset)) {
+ if (--pkts_to_process < 0) {
+ goto no_rx;
+ }
+ skb =3D (struct sk_buff *) ((unsigned long)
+   rxdp->Host_Control);
+ if (skb =3D=3D NULL) {
+ DBG_PRINT(ERR_DBG, "%s: The skb is ",
+   dev->name);
+ DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");
+ goto no_rx;
+ }
+
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer0_ptr,
+  BUF0_LEN, PCI_DMA_FROMDEVICE);
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer1_ptr,
+  BUF1_LEN, PCI_DMA_FROMDEVICE);
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer2_ptr,
+  dev->mtu + 22,
+  PCI_DMA_FROMDEVICE);
+ ba =3D &nic->ba[i][get_block][get_info.offset];
+
+ rx_osm_handler(nic, rxdp, i, ba);
+
+ get_info.offset++;
+ mac_control->rx_curr_get_info[i].offset =3D
+     get_info.offset;
+ rxdp =3D
+     nic->rx_blocks[i][get_block].block_virt_addr= +
+     get_info.offset;
+
+ if (get_info.offset &&
+     (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset =3D 0;
+ mac_control->rx_curr_get_info[i].
+     offset =3D get_info.offset;
+ get_block++;
+ get_block %=3D nic->block_count[i];
+ mac_control->rx_curr_get_info[i].
+     block_index =3D get_block;
+ rxdp =3D
+     nic->rx_blocks[i][get_block].
+     block_virt_addr;
+ }
+ get_offset =3D
+     (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+ pkt_cnt++;
+ }
+#endif
}
if (!pkt_cnt)
pkt_cnt =3D 1;
@@ -1873,12 +2159,17 @@
rx_curr_get_info_t get_info, put_info;
RxD_t *rxdp;
struct sk_buff *skb;
+#ifndef CONFIG_2BUFF_MODE
u16 val16, cksum;
+#endif
register u64 val64 =3D 0;
int get_block, get_offset, put_block, put_offset, ring_bufs;
int i, pkt_cnt =3D 0;
mac_info_t *mac_control;
struct config_param *config;
+#ifdef CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control =3D &nic->mac_control;
config =3D &nic->config;
@@ -1898,6 +2189,7 @@
ring_bufs =3D config->rx_cfg[i].num_rxd;
rxdp =3D nic->rx_blocks[i][get_block].block_virt_addr +
    get_info.offset;
+#ifndef CONFIG_2BUFF_MODE
get_offset =3D (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
    get_info.offset;
spin_lock(&nic->put_lock);
@@ -1953,6 +2245,67 @@
    && (pkt_cnt > indicate_max_pkts)) break;
}
+#else
+ get_offset =3D (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+ spin_lock(&nic->put_lock);
+ put_offset =3D nic->put_pos[i];
+ spin_unlock(&nic->put_lock);
+ while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) &&
+        (((get_offset + 1) % ring_bufs) !=3D = put_offset)) {
+ skb =3D (struct sk_buff *) ((unsigned long)
+   rxdp->Host_Control);
+ if (skb =3D=3D NULL) {
+ DBG_PRINT(ERR_DBG, "%s: The skb is ",
+   dev->name);
+ DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");
+ return;
+ }
+
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer0_ptr,
+  BUF0_LEN, PCI_DMA_FROMDEVICE);
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer1_ptr,
+  BUF1_LEN, PCI_DMA_FROMDEVICE);
+ pci_unmap_single(nic->pdev, (dma_addr_t)
+  rxdp->Buffer2_ptr,
+  dev->mtu + 22,
+  PCI_DMA_FROMDEVICE);
+ ba =3D &nic->ba[i][get_block][get_info.offset];
+
+ rx_osm_handler(nic, rxdp, i, ba);
+
+ get_info.offset++;
+ mac_control->rx_curr_get_info[i].offset =3D
+     get_info.offset;
+ rxdp =3D
+     nic->rx_blocks[i][get_block].block_virt_addr= +
+     get_info.offset;
+
+ if (get_info.offset &&
+     (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset =3D 0;
+ mac_control->rx_curr_get_info[i].
+     offset =3D get_info.offset;
+ get_block++;
+ get_block %=3D nic->block_count[i];
+ mac_control->rx_curr_get_info[i].
+     block_index =3D get_block;
+ rxdp =3D
+     nic->rx_blocks[i][get_block].
+     block_virt_addr;
+ }
+ get_offset =3D
+     (get_block * (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+ pkt_cnt++;
+ if ((indicate_max_pkts)
+     && (pkt_cnt > indicate_max_pkts)) + break;
+ }
+#endif
if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pk= ts))
break;
}
@@ -4096,12 +4449,21 @@

 *   Return value:
 *   SUCCESS on success and -1 on failure.
 */
+#ifndef CONFIG_2BUFF_MODE
static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_= no)
+#else
+static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no,
+   buffAdd_t * ba)
+#endif
{
struct net_device *dev =3D (struct net_device *) sp->dev;
struct sk_buff *skb =3D
    (struct sk_buff *) ((unsigned long) rxdp->Host_Con= trol);
u16 l3_csum, l4_csum;
+#ifdef CONFIG_2BUFF_MODE
+ int buf0_len, buf2_len;
+ struct ethhdr *eth =3D (struct ethhdr *) ba->ba_0;
+#endif

l3_csum =3D RXD_GET_L3_CKSUM(rxdp->Control_1);
if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->= rx_csum)) {
@@ -4129,10 +4491,32 @@
DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n",
=   dev->name, err);
}
+#ifdef CONFIG_2BUFF_MODE
+ buf0_len =3D RXD_GET_BUFFER0_SIZE(rxdp->Control_2);
+ buf2_len =3D RXD_GET_BUFFER2_SIZE(rxdp->Control_2);
+#endif

skb->dev =3D dev;
+#ifndef CONFIG_2BUFF_MODE
skb_put(skb, len);
skb->protocol =3D eth_type_trans(skb, dev);
+#else
+ skb_put(skb, buf2_len);
+ /*
+  * Reproducing eth_type_trans functionality and running
+  * on the ethernet header 'eth' stripped and given to us
+  * by the hardware in 2Buff mode.
+  */
+ if (*eth->h_dest & 1) {
+ if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN))
+ skb->pkt_type =3D PACKET_BROADCAST;
+ else
+ skb->pkt_type =3D PACKET_MULTICAST;
+ } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) { + skb->pkt_type =3D PACKET_OTHERHOST;
+ }
+ skb->protocol =3D eth->h_proto;
+#endif

#ifdef CONFIG_S2IO_NAPI
netif_receive_skb(skb);
@@ -4143,7 +4527,11 @@
dev->last_rx =3D jiffies;
sp->rx_pkt_count++;
sp->stats.rx_packets++;
+#ifndef CONFIG_2BUFF_MODE
sp->stats.rx_bytes +=3D len;
+#else
+ sp->stats.rx_bytes +=3D buf0_len + buf2_len;
+#endif

atomic_dec(&sp->rx_bufs_left[ring_no]);
rxdp->Host_Control =3D 0;
diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2= io.h
--- vanilla-linux/drivers/net/s2io.h 2004-10-11 21:21:49.000000000 -0= 700
+++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 21:22:23.000000000 -0= 700
@@ -466,19 +466,46 @@
#define RXD_GET_L4_CKSUM(val)   ((u16)(val) & 0xFFFF)

u64 Control_2;
+#ifndef CONFIG_2BUFF_MODE
#define MASK_BUFFER0_SIZE       vBIT(0xFFFF,0,16)
#define SET_BUFFER0_SIZE(val)   vBIT(val,0,16)
+#else
+#define MASK_BUFFER0_SIZE       vBIT(0xFF,0,16)
+#define MASK_BUFFER1_SIZE       vBIT(0xFFFF,16,16)
+#define MASK_BUFFER2_SIZE       vBIT(0xFFFF,32,16)
+#define SET_BUFFER0_SIZE(val)   vBIT(val,8,8)
+#define SET_BUFFER1_SIZE(val)   vBIT(val,16,16)
+#define SET_BUFFER2_SIZE(val)   vBIT(val,32,16)
+#endif
+
#define MASK_VLAN_TAG           vBIT(0xFFFF,4= 8,16)
#define SET_VLAN_TAG(val)       vBIT(val,48,16)
#define SET_NUM_TAG(val)       vBIT(val,16,32)

+#ifndef CONFIG_2BUFF_MODE
#define RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 & vBIT(0x= FFFF,0,16)))
+#else
+#define RXD_GET_BUFFER0_SIZE(Control_2) (u8)((Control_2 & MASK_BUF= FER0_SIZE) \
+ >> 48)
+#define RXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & MASK_BU= FFER1_SIZE) \
+ >> 32)
+#define RXD_GET_BUFFER2_SIZE(Control_2) (u16)((Control_2 & MASK_BU= FFER2_SIZE) \
+ >> 16)
+#define BUF0_LEN 40
+#define BUF1_LEN 1
+#endif
+
u64 Buffer0_ptr;
+#ifdef CONFIG_2BUFF_MODE
+ u64 Buffer1_ptr;
+ u64 Buffer2_ptr;
+#endif
} RxD_t;

/* Structure that represents the Rx descriptor block which contains  * 128 Rx descriptors.
 */
+#ifndef CONFIG_2BUFF_MODE
typedef struct _RxD_block {
#define MAX_RXDS_PER_BLOCK             1= 27
RxD_t rxd[MAX_RXDS_PER_BLOCK];
@@ -492,6 +519,27 @@
 * the upper 32 bits should
 * be 0 */
} RxD_block_t;
+#else
+typedef struct _RxD_block {
+#define MAX_RXDS_PER_BLOCK             8= 5
+ RxD_t rxd[MAX_RXDS_PER_BLOCK];
+
+#define END_OF_BLOCK    0xFEFFFFFFFFFFFFFFULL
+ u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF to mark last Rxd
+  * in this blk */
+ u64 pNext_RxD_Blk_physical; /* Phy ponter to next blk. */
+} RxD_block_t;
+#define SIZE_OF_BLOCK 4096
+
+/* Structure to hold virtual addresses of Buf0 and Buf1 in
+ * 2buf mode. */
+typedef struct bufAdd {
+ void *ba_0_org;
+ void *ba_1_org;
+ void *ba_0;
+ void *ba_1;
+} buffAdd_t;
+#endif

/* Structure which stores all the MAC control parameters */

@@ -677,6 +725,10 @@
#define LINK_DOWN 1
#define LINK_UP 2

+#ifdef CONFIG_2BUFF_MODE
+ /* Buffer Address store. */
+ buffAdd_t **ba[MAX_RX_RINGS];
+#endif
int task_flag;
} nic_t;

@@ -802,7 +854,12 @@
static void s2io_tx_watchdog(struct net_device *dev);
static void s2io_tasklet(unsigned long dev_addr);
static void s2io_set_multicast(struct net_device *dev);
+#ifndef CONFIG_2BUFF_MODE
static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_= no);
+#else
+static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no,
+   buffAdd_t * ba);
+#endif
void s2io_link(nic_t * sp, int link);
void s2io_reset(nic_t * sp);
#ifdef CONFIG_S2IO_NAPI


= --1__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88-- --0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: image/gif; name="graycol.gif" Content-Disposition: inline; filename="graycol.gif" Content-ID: <20__=07BBE5D4DF915B888f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhEAAQAKECAMzMzAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIXlI+py+0PopwxUbpu ZRfKZ2zgSJbmSRYAIf4fT3B0aW1pemVkIGJ5IFVsZWFkIFNtYXJ0U2F2ZXIhAAA7 --0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: image/gif; name="pic05579.gif" Content-Disposition: inline; filename="pic05579.gif" Content-ID: <30__=07BBE5D4DF915B888f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhWABDALP/AAAAAK04Qf79/o+Gm7WuwlNObwoJFCsoSMDAwGFsmIuezf///wAAAAAAAAAA AAAAACH5BAEAAAgALAAAAABYAEMAQAT/EMlJq704682770RiFMRinqggEUNSHIchG0BCfHhOjAuh EDeUqTASLCbBhQrhG7xis2j0lssNDopE4jfIJhDaggI8YB1sZeZgLVA9YVCpnGagVjV171aRVrYR RghXcAGFhoUETwYxcXNyADJ3GlcSKGAwLwllVC1vjIUHBWsFilKQdI8GA5IcpApeJQt8L09lmgkH LZikoU5wjqcyAMMFrJIDPAKvCFletKSev1HBw8KrxtjZ2tvc3d5VyKtCKW3jfz4uMKmq3xu4N0nK BVoJQmx2LGVOmrqNjjJf2hHAQo/eDwJGTKhQMcgQEEAnEjFS98+RnW3smGkZU6ncCWav/4wYOnAI TihRL/4FEwbp28BXMMcoscQCVxlepL4IGDSCyJyVQOu0o7CjmLN50OZlqWmyFy5/6yBBuji0AxFR M00oQAqNIstqI6qKHUsWRAEAvagsmfUEAImyxgbmUpJk3IklNUtJOUAVLoUr1+wqDGTE4zk+T6FG uQb3SizBCwatiiUgCBN8vrz+zFjVyQ8FWkOlg4NQiZMB5QS8QO3mpOaKnL0Z2EKvNMSILEThKhCg zMKPVxYJh23qm9KNW7pArPynMqZDiErsTMqI+LRi3QAgkFUbXpuFKhSYZALd0O5RKa2z9EYKBbpb qxIKsjUPRgD7I2XYV6wyrOw92ykExP8NW4URhknC5dKGE4v4NENQj2jXjmfNgOZDaXb5glRmXQ33 YEWQYNcZFnrYcIQLNzyTFDQNkXIff0ExVlY4srziQk43inZgL4rwxxINMvpFFAz1KOODHiu+4aEw NEjFl5B3JIKWKF3k6I9bfUGp5ZZcdunll5IA4cuHvQQJ5gcsoCWOOUwgltIwAKRxJgbIkJAQZEq0 2YliZnpZZ4BH3CnYOXldOUOfQoYDqF1LFHbXCrO8xmRsfoXDXJ6ChjCAH3QlhJcT6VWE6FCkfCco CgrMFsROrIEX3o2whVjWDjoJccN3LdggSGXLCdLEgHr1lyU3O3QxhgohNKXJCWv8JQr/PDdaqd6w 2rj1inLiGeiCJoDspAoQlYE6QWLSECehcWIYxIQES6zhbn1iImTHEQyqJ4eIxJJoUBc+3CbBuwZE V5cJPPkIjFDdeEabQbd6WgICTxiiz0f5dBKquXF6k4senwEhYGnKEFJeGrxUZy8dB8gmAXI/sPvH ESfCwVt5hTgYiqQqtdRNHQIU1PJ33ZqmzgE90OwLaoJcnMop1WiMmgkPHQRIrwgFuNV90A3doNKT mrKIN07AnGcI9BQjhCBN4RfA1qIZnMqorJCogKfGQnxSCDilTVIA0yl5ciTovgLuBDKFUDE9aQcw 9SA+rjSNf9/M1gxrj6VwDTS0IUSElMzBfsj0NFXR2kwsV1A5IF1grLgLL/r1R40BZEnuBWgmQEyb jqRwSAt6bqMCOFkvKFN2GPPkUzIm/SCF8z8pVzpbjVnMsy0vOr1hw3SaSRUhpY09v0z0J1FnwzPl fmh+xl4WtR0zGu24I4KbMQm3lnVu2oNWxI9W/lcyzA+mCKF4DBikxb/+UWtOGRiFP8qEwAayIgIA Ow== --0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88 Content-type: image/gif; name="ecblank.gif" Content-Disposition: inline; filename="ecblank.gif" Content-ID: <40__=07BBE5D4DF915B888f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhEAABAIAAAAAAAP///yH5BAEAAAEALAAAAAAQAAEAAAIEjI8ZBQA7 --0__=07BBE5D4DF915B888f9e8a93df938690918c07BBE5D4DF915B88-- From ralf@linux-mips.org Mon Nov 8 19:38:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 19:38:25 -0800 (PST) Received: from mail.linux-mips.net (p508B66AC.dip.t-dialin.net [80.139.102.172]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA93bsjs015003 for ; Mon, 8 Nov 2004 19:38:11 -0800 Received: from fluff.linux-mips.net (localhost [127.0.0.1]) by mail.linux-mips.net (8.12.11/8.12.8) with ESMTP id iA93ailB016735; Tue, 9 Nov 2004 04:36:44 +0100 Received: (from ralf@localhost) by fluff.linux-mips.net (8.12.11/8.12.11/Submit) id iA93aIql016730; Tue, 9 Nov 2004 04:36:18 +0100 Date: Tue, 9 Nov 2004 04:36:18 +0100 From: Ralf Baechle To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: AX.25 cb lookup patch Message-ID: <20041109033617.GB621@linux-mips.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11606 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ralf@linux-mips.org Precedence: bulk X-list: netdev Content-Length: 1143 Lines: 32 Ax AX.25 connection is identified only by it's source and destination, not by the device it's routed through, so fix the connection block lookup to ignore the device of a connection. This fixes dying connections in case of an AX.25 routing flap. Index: net/ax25/af_ax25.c =================================================================== RCS file: /home/cvs/linux/net/ax25/af_ax25.c,v retrieving revision 1.59 diff -u -r1.59 af_ax25.c --- net/ax25/af_ax25.c 12 Oct 2004 01:45:52 -0000 1.59 +++ net/ax25/af_ax25.c 3 Nov 2004 03:23:53 -0000 @@ -207,16 +207,8 @@ continue; if (s->ax25_dev == NULL) continue; - if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) { - if (digi != NULL && digi->ndigi != 0) { - if (s->digipeat == NULL) - continue; - if (ax25digicmp(s->digipeat, digi) != 0) - continue; - } else { - if (s->digipeat != NULL && s->digipeat->ndigi != 0) - continue; - } + if (ax25cmp(&s->source_addr, src_addr) == 0 && + ax25cmp(&s->dest_addr, dest_addr) == 0) { ax25_cb_hold(s); spin_unlock_bh(&ax25_list_lock); From jgarzik@pobox.com Mon Nov 8 20:23:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 20:23:29 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA94NPIn025805 for ; Mon, 8 Nov 2004 20:23:25 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRNX8-0000eO-6P; Tue, 09 Nov 2004 04:23:06 +0000 Message-ID: <41904619.2020206@pobox.com> Date: Mon, 08 Nov 2004 23:22:49 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: raghavendra.koushik@s2io.com CC: romieu@fr.zoreil.com, netdev@oss.sgi.com, ravinandan.arakali@s2io.com Subject: Re: [PATCH 2.6.9-rc2 12/12] S2io: styling References: <20041108161805.5DB33328FC@linux.site> In-Reply-To: <20041108161805.5DB33328FC@linux.site> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11607 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 140 Lines: 7 It is my pleasure to report that I successfully applied all 12 patches from the most recent batch sent, to the netdev-2.6 queue. Jeff From kaber@trash.net Mon Nov 8 21:42:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 21:42:11 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA95g60U030546 for ; Mon, 8 Nov 2004 21:42:06 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CROlB-0001NZ-0F; Tue, 09 Nov 2004 06:41:41 +0100 Message-ID: <41905894.7030809@trash.net> Date: Tue, 09 Nov 2004 06:41:40 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "Catalin(ux aka Dino) BOIE" CC: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: Re: [PATCH] Use nfmark as a key for u32 classifier References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11609 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 877 Lines: 32 Catalin(ux aka Dino) BOIE wrote: > Hello! > > I am glad to announce a patch for u32 to allow matches on nfmark. > The patch is non intrusive (few lines). > >------------------------------------------------------------------------ > > if ((*(u32*)(ptr+key->off+(off2&key->offmask))^key->val)&key->mask) { >--- linux.orig/include/linux/pkt_cls.h 2004-10-19 00:53:07.000000000 +0300 >+++ linux/include/linux/pkt_cls.h 2004-11-05 11:00:27.000000000 +0200 >@@ -208,6 +208,7 @@ struct tc_u32_sel > unsigned char flags; > unsigned char offshift; > unsigned char nkeys; >+ u32 mark; > > ^^ Please put this at the end to avoid breaking compatibility with old tc binaries. BTW, nfmark if unsigned long, which is 64 bit on 64-bit architectures. Probably not worth fixing though, everyone else got it wrong too. > > __u16 offmask; > __u16 off; > > Regards Patrick From akpm@osdl.org Mon Nov 8 21:42:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 21:42:36 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA95gQVb030580 for ; Mon, 8 Nov 2004 21:42:27 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iA95g3913209; Mon, 8 Nov 2004 21:42:03 -0800 Date: Mon, 8 Nov 2004 21:41:59 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: Bernhard Rosenkraenzer Subject: Fw: BUG: atomic counter underflow when running "rmmod tg3" on 2.6.10-rc1-mm3 Message-Id: <20041108214159.6400e8de.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11610 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 1568 Lines: 41 There's a debug patch in -mm which generates a trace when someone does atomic_dec_and_test() on an atomic_t which already has a value of zero. ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.10-rc1/2.6.10-rc1-mm3/broken-out/detect-atomic-counter-underflows.patch It looks like it has found a problem in qdisc_destroy(). Begin forwarded message: Date: Tue, 9 Nov 2004 03:33:36 +0100 From: Bernhard Rosenkraenzer To: linux-kernel@vger.kernel.org Subject: BUG: atomic counter underflow when running "rmmod tg3" on 2.6.10-rc1-mm3 BUG: atomic counter underflow at: [] qdisc_destroy+0x66/0x80 [] dev_shutdown+0x32/0x90 [] __down_failed_trylock+0x7/0xc [] unregister_netdevice+0x142/0x29e [] handle_mm_fault+0xf1/0x510 [] unregister_netdev+0x15/0x20 [] tg3_remove_one+0x25/0x70 [tg3] [] pci_device_remove+0x69/0x70 [] device_release_driver+0x86/0x90 [] bus_remove_driver+0x5b/0x100 [] tg3_cleanup+0x0/0x13 [tg3] [] driver_unregister+0x10/0x20 [] pci_unregister_driver+0x14/0xa0 [] tg3_cleanup+0xf/0x13 [tg3] [] sys_delete_module+0x17b/0x1e0 [] sysenter_past_esp+0x52/0x71 divert: freeing divert_blk for eth0 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ From kaber@trash.net Mon Nov 8 21:51:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 21:52:04 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA95ptFB031595 for ; Mon, 8 Nov 2004 21:51:58 -0800 Received: from localhost ([127.0.0.1] ident=kaber) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CROuh-0001PI-PY; Tue, 09 Nov 2004 06:51:31 +0100 Message-ID: <41905AE3.8040509@trash.net> Date: Tue, 09 Nov 2004 06:51:31 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Andrew Morton CC: netdev@oss.sgi.com, Bernhard Rosenkraenzer Subject: Re: Fw: BUG: atomic counter underflow when running "rmmod tg3" on 2.6.10-rc1-mm3 References: <20041108214159.6400e8de.akpm@osdl.org> In-Reply-To: <20041108214159.6400e8de.akpm@osdl.org> Content-Type: multipart/mixed; boundary="------------010708020604060505080903" X-archive-position: 11611 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 2670 Lines: 83 This is a multi-part message in MIME format. --------------010708020604060505080903 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Andrew Morton wrote: >There's a debug patch in -mm which generates a trace when someone does >atomic_dec_and_test() on an atomic_t which already has a value of zero. > >ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.10-rc1/2.6.10-rc1-mm3/broken-out/detect-atomic-counter-underflows.patch > >It looks like it has found a problem in qdisc_destroy(). > > Already fixed in latest -bk by the attached patch. The builtin qdiscs are not refcounted, but qdisc_destroy treated them as other qdiscs. Regards Patrick --------------010708020604060505080903 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/05 16:30:34-08:00 tgraf@suug.ch # [PKT_SCHED]: Builtin qdiscs should avoid all qdisc_destroy() processing. # # None of the code in __qdisc_destroy should be applied to a builtin qdisc # or am I missing something? # # The patch below prevents builtin qdiscs from being destroyed and # fixes a refcnt underflow whould lead to a bogus list unlinking # and dev_put. # # Signed-off-by: Thomas Graf # Signed-off-by: David S. Miller # # net/sched/sch_generic.c # 2004/11/05 16:30:14-08:00 tgraf@suug.ch +3 -3 # [PKT_SCHED]: Builtin qdiscs should avoid all qdisc_destroy() processing. # # None of the code in __qdisc_destroy should be applied to a builtin qdisc # or am I missing something? # # The patch below prevents builtin qdiscs from being destroyed and # fixes a refcnt underflow whould lead to a bogus list unlinking # and dev_put. # # Signed-off-by: Thomas Graf # Signed-off-by: David S. Miller # diff -Nru a/net/sched/sch_generic.c b/net/sched/sch_generic.c --- a/net/sched/sch_generic.c 2004-11-09 06:50:10 +01:00 +++ b/net/sched/sch_generic.c 2004-11-09 06:50:10 +01:00 @@ -479,15 +479,15 @@ module_put(ops->owner); dev_put(qdisc->dev); - if (!(qdisc->flags&TCQ_F_BUILTIN)) - kfree((char *) qdisc - qdisc->padded); + kfree((char *) qdisc - qdisc->padded); } /* Under dev->queue_lock and BH! */ void qdisc_destroy(struct Qdisc *qdisc) { - if (!atomic_dec_and_test(&qdisc->refcnt)) + if (qdisc->flags & TCQ_F_BUILTIN || + !atomic_dec_and_test(&qdisc->refcnt)) return; list_del(&qdisc->list); call_rcu(&qdisc->q_rcu, __qdisc_destroy); --------------010708020604060505080903-- From jgarzik@pobox.com Mon Nov 8 23:30:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 23:30:30 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA97UM7q002499 for ; Mon, 8 Nov 2004 23:30:22 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRQS4-00037S-8n; Tue, 09 Nov 2004 07:30:04 +0000 Message-ID: <419071F0.6030602@pobox.com> Date: Tue, 09 Nov 2004 02:29:52 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jouni Malinen CC: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 11/12] Host AP: Fix PRISM2_IO_DEBUG References: <20041108070156.GA1076@jm.kir.nu> <20041108071710.GL1076@jm.kir.nu> In-Reply-To: <20041108071710.GL1076@jm.kir.nu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11613 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1266 Lines: 40 Jouni Malinen wrote: >>From Mark Glines : > I just noticed PRISM2_IO_DEBUG doesn't work. This patch gets it > working again. I checked the development CVS snapshot, looks like > its still broken there. > > jkm: in addition, fix the other PRISM2_IO_DEBUG function > > Signed-off-by: Jouni Malinen > > > diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h > --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:16 -08:00 > +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:16 -08:00 > @@ -1006,7 +1006,8 @@ > static inline void prism2_io_debug_add(struct net_device *dev, int cmd, > int reg, int value) > { > - local_info_t *local = dev->priv; > + struct hostap_interface *iface = dev->priv; > + local_info_t *local = iface->local; > > if (!local->io_debug_enabled) > return; > @@ -1023,7 +1024,8 @@ > > static inline void prism2_io_debug_error(struct net_device *dev, int err) > { > - local_info_t *local = dev->priv; > + struct hostap_interface *iface = dev->priv; > + local_info_t *local = iface->local; > unsigned long flags; it is preferred to use netdev_priv() rather than directly referring to dev->priv. Jeff From jgarzik@pobox.com Mon Nov 8 23:30:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 23:30:08 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA97U1TX002474 for ; Mon, 8 Nov 2004 23:30:01 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRQRi-00036s-Te; Tue, 09 Nov 2004 07:29:43 +0000 Message-ID: <419071D5.8070208@pobox.com> Date: Tue, 09 Nov 2004 02:29:25 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jouni Malinen CC: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 10/12] Host AP: Use void * instead of unsigned long with {read,write}{b,w} References: <20041108070156.GA1076@jm.kir.nu> <20041108071630.GK1076@jm.kir.nu> In-Reply-To: <20041108071630.GK1076@jm.kir.nu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11612 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 5636 Lines: 171 Jouni Malinen wrote: > Start using void * instead of unsigned long with {read,write}{b,w} to > silence compiler warning with Linux 2.6.9-rc2. > > Signed-off-by: Jouni Malinen > > > diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c > --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:39:06 -08:00 > +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-07 22:39:06 -08:00 > @@ -56,7 +56,7 @@ > > spin_lock_irqsave(&local->lock, flags); > prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); > - writeb(v, dev->mem_start + a); > + writeb(v, (void *) dev->mem_start + a); > spin_unlock_irqrestore(&local->lock, flags); > } > > @@ -68,7 +68,7 @@ > u8 v; > > spin_lock_irqsave(&local->lock, flags); > - v = readb(dev->mem_start + a); > + v = readb((void *) dev->mem_start + a); > prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); > spin_unlock_irqrestore(&local->lock, flags); > return v; > @@ -82,7 +82,7 @@ > > spin_lock_irqsave(&local->lock, flags); > prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); > - writew(v, dev->mem_start + a); > + writew(v, (void *) dev->mem_start + a); > spin_unlock_irqrestore(&local->lock, flags); > } > > @@ -94,7 +94,7 @@ > u16 v; > > spin_lock_irqsave(&local->lock, flags); > - v = readw(dev->mem_start + a); > + v = readw((void *) dev->mem_start + a); > prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); > spin_unlock_irqrestore(&local->lock, flags); > return v; > @@ -109,12 +109,14 @@ > > #else /* PRISM2_IO_DEBUG */ > > -#define HFA384X_OUTB(v,a) writeb((v), dev->mem_start + (a)) > -#define HFA384X_INB(a) (u8) readb(dev->mem_start + (a)) > -#define HFA384X_OUTW(v,a) writew((v), dev->mem_start + (a)) > -#define HFA384X_INW(a) (u16) readw(dev->mem_start + (a)) > -#define HFA384X_OUTW_DATA(v,a) writew(cpu_to_le16(v), dev->mem_start + (a)) > -#define HFA384X_INW_DATA(a) (u16) le16_to_cpu(readw(dev->mem_start + (a))) > +#define HFA384X_OUTB(v,a) writeb((v), (void *) dev->mem_start + (a)) > +#define HFA384X_INB(a) (u8) readb((void *) dev->mem_start + (a)) > +#define HFA384X_OUTW(v,a) writew((v), (void *) dev->mem_start + (a)) > +#define HFA384X_INW(a) (u16) readw((void *) dev->mem_start + (a)) > +#define HFA384X_OUTW_DATA(v,a) \ > + writew(cpu_to_le16(v), (void *) dev->mem_start + (a)) > +#define HFA384X_INW_DATA(a) (u16) \ > + le16_to_cpu(readw((void *) dev->mem_start + (a))) Two comments: 1) that should be "void __iomem *" not "void *" for MMIO memory pointers 2) don't bother using dev->mem_start, that is normally used for passing options or an ISA memory address from userland to the kernel. Store the result of ioremap() in a private 'void __iomem *' pointer instead. > diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c > --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:39:06 -08:00 > +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-07 22:39:06 -08:00 > @@ -247,7 +247,7 @@ > > /* Set sreset bit of COR and clear it after hold time */ > > - if (local->attr_mem == 0) { > + if (local->attr_mem == NULL) { > /* TMD7160 - COR at card's first I/O addr */ > corsave = inb(local->cor_offset); > outb(corsave | COR_SRESET, local->cor_offset); > @@ -271,7 +271,7 @@ > { > unsigned char corsave; > > - if (local->attr_mem == 0) { > + if (local->attr_mem == NULL) { > /* TMD7160 - COR at card's first I/O addr */ > corsave = inb(local->cor_offset); > outb(corsave | COR_SRESET, local->cor_offset); > @@ -306,7 +306,7 @@ > }; > > > -static int prism2_plx_check_cis(unsigned long attr_mem, int attr_len, > +static int prism2_plx_check_cis(void *attr_mem, int attr_len, > unsigned int *cor_offset, > unsigned int *cor_index) > { > @@ -401,7 +401,7 @@ > unsigned int pccard_ioaddr, plx_ioaddr; > unsigned long pccard_attr_mem; > unsigned int pccard_attr_len; > - unsigned long attr_mem = 0; > + void *attr_mem = NULL; > unsigned int cor_offset, cor_index; > u32 reg; > local_info_t *local = NULL; void __iomem * > @@ -422,7 +422,7 @@ > > if (tmd7160) { > /* TMD7160 */ > - attr_mem = 0; /* no access to PC Card attribute memory */ > + attr_mem = NULL; /* no access to PC Card attribute memory */ > > printk(KERN_INFO "TMD7160 PCI/PCMCIA adapter: io=0x%x, " > "irq=%d, pccard_io=0x%x\n", > @@ -448,9 +448,8 @@ > goto fail; > > > - attr_mem = (unsigned long) ioremap(pccard_attr_mem, > - pccard_attr_len); > - if (!attr_mem) { > + attr_mem = ioremap(pccard_attr_mem, pccard_attr_len); > + if (attr_mem == NULL) { > printk(KERN_ERR "%s: cannot remap attr_mem\n", > dev_info); > goto fail; > @@ -532,7 +531,7 @@ > free_irq(dev->irq, dev); > > if (attr_mem) > - iounmap((void *) attr_mem); > + iounmap(attr_mem); > > pci_disable_device(pdev); > > @@ -550,7 +549,7 @@ > hfa384x_disable_interrupts(dev); > > if (iface->local->attr_mem) > - iounmap((void *) iface->local->attr_mem); > + iounmap(iface->local->attr_mem); > if (dev->irq) > free_irq(dev->irq, dev); > > diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h > --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:06 -08:00 > +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-07 22:39:06 -08:00 > @@ -895,7 +895,7 @@ > #endif /* PRISM2_PCCARD */ > > #ifdef PRISM2_PLX > - unsigned long attr_mem; > + void *attr_mem; > unsigned int cor_offset; > #endif /* PRISM2_PLX */ void __iomem * From jgarzik@pobox.com Mon Nov 8 23:59:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Nov 2004 23:59:53 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA97xmFQ009609 for ; Mon, 8 Nov 2004 23:59:49 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRQcF-0003Fq-Aa; Tue, 09 Nov 2004 07:40:35 +0000 Message-ID: <41907466.10008@pobox.com> Date: Tue, 09 Nov 2004 02:40:22 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jouni Malinen CC: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 1/12] Host AP: Disable EAPOL TX/RX debug messages References: <20041108070156.GA1076@jm.kir.nu> <20041108071036.GB1076@jm.kir.nu> In-Reply-To: <20041108071036.GB1076@jm.kir.nu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11614 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 21 Lines: 2 applied patches 1-9 From jgarzik@pobox.com Tue Nov 9 00:04:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 00:04:58 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA984rHg010179 for ; Tue, 9 Nov 2004 00:04:53 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRQzS-0003tc-NU; Tue, 09 Nov 2004 08:04:34 +0000 Message-ID: <41907A06.2040702@pobox.com> Date: Tue, 09 Nov 2004 03:04:22 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jouni Malinen CC: netdev@oss.sgi.com, Andrew Morton , James Ketrenos Subject: Re: [PATCH wireless-2.6 0/12] Host AP update References: <20041108070156.GA1076@jm.kir.nu> In-Reply-To: <20041108070156.GA1076@jm.kir.nu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11615 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 2651 Lines: 62 Jouni Malinen wrote: > Jeff, > > Here's an update to Host AP code in wireless-2.6 tree. This brings in > number of small fixes from my CVS repository. This messages has the > changes in BitKeeper format from bksend and following 12 messages have > the patches one by one as unified diffs. > > I have couple of additional patches pending for wireless-2.6 updates > (wireless extensions 17 and 18; changes to PCI API in Linux > 2.6.10-rc1). I'll send WE17 and PCI changes once you update > wireless-2.6. WE18 change requires an update to wireless extensions, > so it may need to wait somewhat longer or we could start testing WE18 > in wireless-2.6 if that is desired. Feel free to push experimental (but tested!) code to wireless-2.6. > I keep getting questions about getting Host AP driver to linux-2.6 > tree. What would be needed to make this happen? I would assume this Andrew Morton's "-mm" kernels are essentially a staging area for pushing changes to the upstream kernel. I pulled the latest wireless-2.6 tree (includes your latest patches #1 - #9) into my netdev-2.6 queue. netdev-2.6, in turn, is automatically pulled by Andrew, into his -mm tree. It will get wider review and testing here. > would be easiest to do this from wireless-2.6 tree once the new > patches are in. Any other changes that would be required to get the > driver in suitable state for merging into Linux 2.6 releases? A key goal I have for HostAP is that portions of HostAP code should be bundled into a generic "lib80211" kernel module, for use by various low-level and "softmac" 802.11 device drivers. The Intel Centrino driver folks are already using HostAP in this capacity, and I _think_ their changes were fairly minimal and cosmetic. If the changes are indeed minimal, I think it's better to merge those changes before sending HostAP stuff upstream. To emphasize that the upstream-bound HostAP code is a generic library (well, parts of it), I would prefer that the kernel module name, and API prefixes, use some name other than 'hostap_'. 'wifi_' or 'ieee80211_' or whatever, I don't care. Just something "more generic". I would rather perform mass renaming of functions and files before merging upstream. > You can import this changeset into BK by piping this whole message to: > '| bk receive [path to repository]' or apply the patch as usual. IMHO the bksend stuff is useless. I prefer "plain ole patches", like the ones you sent in emails '1/12' through '12/12' in this thread. WRT the patches you sent, as I mentioned, #1 - #9 were applied. Please update #10 and #11 per comments, and then resend #10 - #12. Jeff From uweber@astaro.de Tue Nov 9 00:55:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 00:55:36 -0800 (PST) Received: from mail.astaro.com (mail.astaro.com [213.221.123.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA98tTbD016978 for ; Tue, 9 Nov 2004 00:55:30 -0800 Received: from [192.168.2.219] (helo=[192.168.2.219]) by mail.astaro.com with esmtp (TLSv1:RC4-MD5:128) (Exim 4.30) id 1CRRTU-0003LS-K1; Tue, 09 Nov 2004 09:35:36 +0100 Message-ID: <419085E9.4060209@astaro.de> Date: Tue, 09 Nov 2004 09:55:05 +0100 From: Ulrich Weber User-Agent: Mozilla Thunderbird 0.8 (X11/20040926) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Patrick McHardy CC: vpn-failover@lists.balabit.hu, netdev@oss.sgi.com, ipsec-tools-devel@lists.sourceforge.net Subject: Re: [Vpn-failover] [RFC] IPSEC failover - Netlink part References: <1099045435.2888.47.camel@nienna.balabit> <418A3630.1040900@astaro.de> <418A71DA.2090607@trash.net> <418F4AF9.7050605@astaro.de> <418F9A70.7040400@trash.net> In-Reply-To: <418F9A70.7040400@trash.net> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scan-Signature: 334ab6053db942c8e3378dddd6d2dbd5 X-archive-position: 11616 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: uweber@astaro.de Precedence: bulk X-list: netdev Content-Length: 931 Lines: 33 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 |> |> + NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),/* UPD SEQ */ |> |> |> |> |> | ^^ what about struct xfrm_replay_state ? |> it's attached as rt attribute, so it should be ok. | | But you don't check it's size. You need to include it here or check it | when you use it. ok i added the following checkt to ensure the right size. If i add the size of the xfrm_replay_state struct to the above array, the rt attribute macros wouldnt work anymore. Cheers ~ Ulrich - ---- struct rtattr *rt = xfrma[XFRMA_REPLAY-1]; if( xfrma[XFRMA_REPLAY-1] && (rt->rta_len == (sizeof(struct xfrm_replay_state) + sizeof(struct rtattr)))) { -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBkIXp22t2oTuElzoRAqsnAJ9QlZuU6wBWtmkzcT8aeb9+AL3nfQCfZUeI EJh0+e8EOS4/HKiP2Ylu02k= =roZY -----END PGP SIGNATURE----- From kaber@trash.net Tue Nov 9 01:01:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 01:01:43 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA991aGc017548 for ; Tue, 9 Nov 2004 01:01:37 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRRs7-00059j-0s; Tue, 09 Nov 2004 10:01:03 +0100 Message-ID: <4190874E.7040202@trash.net> Date: Tue, 09 Nov 2004 10:01:02 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: Jamal Hadi Salim , netdev@oss.sgi.com Subject: [PATCH 2.6 PKT_SCHED]: Clean up tcf_action_init memory handling Content-Type: multipart/mixed; boundary="------------030300010803030906060309" X-archive-position: 11617 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 8414 Lines: 296 This is a multi-part message in MIME format. --------------030300010803030906060309 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit This patch moves memory allocation for tc_actions to tcf_action_init_1 and fixes multiple bugs in error paths: - when memory allocation fails in tcf_action_init, the action is destroyed twice, once in tcf_action_init and once in tcf_action_add/tcf_change_act - when tcf_action_init_1 fails for the first action, the action is passed to tcf_action_destroy in an undefined state by tcf_action_add/tcf_change_act/tcf_change_act_police - when tcf_action_init_1 fails for any but the first action, the action leaks in tcf_action_init Regards Patrick --------------030300010803030906060309 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/09 07:31:03+01:00 kaber@coreworks.de # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # net/sched/act_api.c # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +47 -57 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # include/net/pkt_cls.h # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +6 -20 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # include/net/act_api.h # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +2 -2 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # diff -Nru a/include/net/act_api.h b/include/net/act_api.h --- a/include/net/act_api.h 2004-11-09 09:31:36 +01:00 +++ b/include/net/act_api.h 2004-11-09 09:31:36 +01:00 @@ -87,8 +87,8 @@ extern int tcf_unregister_action(struct tc_action_ops *a); extern void tcf_action_destroy(struct tc_action *a, int bind); extern int tcf_action_exec(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res); -extern int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,char *n, int ovr, int bind); -extern int tcf_action_init_1(struct rtattr *rta, struct rtattr *est, struct tc_action *a,char *n, int ovr, int bind); +extern struct tc_action *tcf_action_init(struct rtattr *rta, struct rtattr *est, char *n, int ovr, int bind, int *err); +extern struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est, char *n, int ovr, int bind, int *err); extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int); extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); diff -Nru a/include/net/pkt_cls.h b/include/net/pkt_cls.h --- a/include/net/pkt_cls.h 2004-11-09 09:31:36 +01:00 +++ b/include/net/pkt_cls.h 2004-11-09 09:31:36 +01:00 @@ -70,17 +70,10 @@ int ret; struct tc_action *act; - act = kmalloc(sizeof(*act), GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init_1(act_police_tlv, rate_tlv, act, "police", - TCA_ACT_NOREPLACE, TCA_ACT_BIND); - if (ret < 0) { - tcf_action_destroy(act, TCA_ACT_UNBIND); + act = tcf_action_init_1(act_police_tlv, rate_tlv, "police", + TCA_ACT_NOREPLACE, TCA_ACT_BIND, &ret); + if (act == NULL) return ret; - } act->type = TCA_OLD_COMPAT; @@ -103,17 +96,10 @@ int ret; struct tc_action *act; - act = kmalloc(sizeof(*act), GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init(act_tlv, rate_tlv, act, NULL, - TCA_ACT_NOREPLACE, TCA_ACT_BIND); - if (ret < 0) { - tcf_action_destroy(act, TCA_ACT_UNBIND); + act = tcf_action_init(act_tlv, rate_tlv, NULL, + TCA_ACT_NOREPLACE, TCA_ACT_BIND, &ret); + if (act == NULL) return ret; - } if (*action) { tcf_tree_lock(tp); diff -Nru a/net/sched/act_api.c b/net/sched/act_api.c --- a/net/sched/act_api.c 2004-11-09 09:31:36 +01:00 +++ b/net/sched/act_api.c 2004-11-09 09:31:36 +01:00 @@ -294,14 +294,16 @@ } -int tcf_action_init_1(struct rtattr *rta, struct rtattr *est, struct tc_action *a, char *name, int ovr, int bind ) +struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est, + char *name, int ovr, int bind, int *err) { + struct tc_action *a; struct tc_action_ops *a_o; char act_name[4 + IFNAMSIZ + 1]; struct rtattr *tb[TCA_ACT_MAX+1]; struct rtattr *kind = NULL; - int err = -EINVAL; + *err = -EINVAL; if (NULL == name) { if (rtattr_parse(tb, TCA_ACT_MAX, RTA_DATA(rta), RTA_PAYLOAD(rta))<0) @@ -337,22 +339,25 @@ goto err_out; } - if (NULL == a) { + a = kmalloc(sizeof(*a), GFP_KERNEL); + if (a == NULL) { + *err = -ENOMEM; goto err_mod; } + memset(a, 0, sizeof(*a)); /* backward compatibility for policer */ if (NULL == name) { - err = a_o->init(tb[TCA_ACT_OPTIONS-1], est, a, ovr, bind); - if (0 > err ) { - err = -EINVAL; - goto err_mod; + *err = a_o->init(tb[TCA_ACT_OPTIONS-1], est, a, ovr, bind); + if (*err < 0) { + *err = -EINVAL; + goto err_free; } } else { - err = a_o->init(rta, est, a, ovr, bind); - if (0 > err ) { - err = -EINVAL; - goto err_mod; + *err = a_o->init(rta, est, a, ovr, bind); + if (*err < 0) { + *err = -EINVAL; + goto err_free; } } @@ -360,60 +365,58 @@ if it exists and is only bound to in a_o->init() then ACT_P_CREATED is not returned (a zero is). */ - if (ACT_P_CREATED != err) { + if (*err != ACT_P_CREATED) module_put(a_o->owner); - } a->ops = a_o; DPRINTK("tcf_action_init_1: successfull %s \n",act_name); - return 0; + *err = 0; + return a; + +err_free: + kfree(a); err_mod: module_put(a_o->owner); err_out: - return err; + return NULL; } -int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a, char *name, int ovr , int bind) +struct tc_action *tcf_action_init(struct rtattr *rta, struct rtattr *est, + char *name, int ovr, int bind, int *err) { struct rtattr *tb[TCA_ACT_MAX_PRIO+1]; + struct tc_action *a = NULL, *act, *act_prev = NULL; int i; - struct tc_action *act = a, *a_s = a; - - int err = -EINVAL; - if (rtattr_parse(tb, TCA_ACT_MAX_PRIO, RTA_DATA(rta), RTA_PAYLOAD(rta))<0) - return err; + if (rtattr_parse(tb, TCA_ACT_MAX_PRIO, RTA_DATA(rta), + RTA_PAYLOAD(rta)) < 0) { + *err = -EINVAL; + return a; + } - for (i=0; i < TCA_ACT_MAX_PRIO ; i++) { + for (i=0; i < TCA_ACT_MAX_PRIO; i++) { if (tb[i]) { - if (NULL == act) { - act = kmalloc(sizeof(*act),GFP_KERNEL); - if (NULL == act) { - err = -ENOMEM; - goto bad_ret; - } - memset(act, 0,sizeof(*act)); - } - act->next = NULL; - if (0 > tcf_action_init_1(tb[i],est,act,name,ovr,bind)) { - printk("Error processing action order %d\n",i); - return err; + act = tcf_action_init_1(tb[i], est, name, ovr, bind, err); + if (act == NULL) { + printk("Error processing action order %d\n", i); + goto bad_ret; } act->order = i+1; - if (a_s != act) { - a_s->next = act; - a_s = act; - } - act = NULL; + if (a == NULL) + a = act; + else + act_prev->next = act; + act_prev = act; } } + return a; - return 0; bad_ret: - tcf_action_destroy(a, bind); - return err; + if (a != NULL) + tcf_action_destroy(a, bind); + return NULL; } int tcf_action_copy_stats (struct sk_buff *skb,struct tc_action *a) @@ -849,21 +852,9 @@ struct tc_action *a = NULL; u32 seq = n->nlmsg_seq; - act = kmalloc(sizeof(*act),GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init(rta, NULL,act,NULL,ovr,0); - /* NOTE: We have an all-or-none model - * This means that of any of the actions fail - * to update then all are undone. - * */ - if (0 > ret) { - tcf_action_destroy(act, 0); + act = tcf_action_init(rta, NULL, NULL, ovr, 0, &ret); + if (act == NULL) goto done; - } /* dump then free all the actions after update; inserted policy * stays intact @@ -880,7 +871,6 @@ } } done: - return ret; } --------------030300010803030906060309-- From mrenzmann@web.de Tue Nov 9 01:09:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 01:09:18 -0800 (PST) Received: from smtp07.web.de (smtp07.web.de [217.72.192.225]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA999DL8018122 for ; Tue, 9 Nov 2004 01:09:14 -0800 Received: from [195.14.200.179] (helo=[192.168.2.42]) by smtp07.web.de with asmtp (TLSv1:RC4-MD5:128) (WEB.DE 4.101 #44) id 1CRRze-0000df-00 for netdev@oss.sgi.com; Tue, 09 Nov 2004 10:08:50 +0100 Message-ID: <41908932.6070900@web.de> Date: Tue, 09 Nov 2004 10:09:06 +0100 From: Michael Renzmann User-Agent: Mozilla Thunderbird 0.8 (X11/20040916) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 0/12] Host AP update References: <20041108070156.GA1076@jm.kir.nu> <41907A06.2040702@pobox.com> In-Reply-To: <41907A06.2040702@pobox.com> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Sender: mrenzmann@web.de X-archive-position: 11618 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mrenzmann@web.de Precedence: bulk X-list: netdev Content-Length: 500 Lines: 15 Hi. (I cutted down the CC list.) Jeff Garzik wrote: > A key goal I have for HostAP is that portions of HostAP code should be > bundled into a generic "lib80211" kernel module, for use by various > low-level and "softmac" 802.11 device drivers. This sentence made me curious... does that mean the efforts which recently have been discussed here (to bring a generic 802.11 stack to the kernel) are going to be replaced by the described goal? Or is it an addition to Vladimir's work? Bye, Mike From kaber@trash.net Tue Nov 9 01:26:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 01:26:52 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA99QjEB018857 for ; Tue, 9 Nov 2004 01:26:45 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRSG5-0005Cq-Ek; Tue, 09 Nov 2004 10:25:49 +0100 Message-ID: <41908D1D.50405@trash.net> Date: Tue, 09 Nov 2004 10:25:49 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: jamal , netdev@oss.sgi.com Subject: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions Content-Type: multipart/mixed; boundary="------------090002060207010401000005" X-archive-position: 11619 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1977 Lines: 63 This is a multi-part message in MIME format. --------------090002060207010401000005 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit This patch fixes on overflow in tc actions times reported to userspace on 64 bit architectures. struct tcf_t only contains 32-bit timestamps, but they are initialized to jiffies. When jiffies is larger than 2^32-1 only the low 32 bit are saved, and the diff between jiffies and the current timestamp becomes very large. This happens immediately after boottime since jiffies is initialized to 2^32-300. It was invisible until now because only the lower 32bit were reported to userspace, but with the USER_HZ conversion the reported times start somewhere around 4294967s. This patch extends the timestamps to 64bit. It breaks userspace compatibility for actions, but considering that most of this is not even in iproute yet this should be acceptable. Regards Patrick --------------090002060207010401000005 Content-Type: text/plain; name="y" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="y" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/09 09:30:28+01:00 kaber@coreworks.de # [PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions # # Signed-off-by: Patrick McHardy # # include/linux/pkt_cls.h # 2004/11/09 09:30:21+01:00 kaber@coreworks.de +3 -3 # [PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions # # Signed-off-by: Patrick McHardy # diff -Nru a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h --- a/include/linux/pkt_cls.h 2004-11-09 09:31:44 +01:00 +++ b/include/linux/pkt_cls.h 2004-11-09 09:31:44 +01:00 @@ -138,9 +138,9 @@ struct tcf_t { - __u32 install; - __u32 lastuse; - __u32 expires; + __u64 install; + __u64 lastuse; + __u64 expires; }; struct tc_cnt --------------090002060207010401000005-- From mark@mwborst.com Tue Nov 9 02:22:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 02:22:35 -0800 (PST) Received: from mn-2 (mn-2.atm.tut.fi [130.230.52.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9AMUNw028446 for ; Tue, 9 Nov 2004 02:22:30 -0800 Received: from mark by mn-2 with local (Exim 3.36 #1 (Debian)) id 1CRT89-0005ZS-00; Tue, 09 Nov 2004 12:21:41 +0200 Subject: node-local multicast issues From: Mark Borst To: netdev@oss.sgi.com Cc: hessu@cs.tut.fi Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Tue, 09 Nov 2004 12:21:40 +0200 Message-Id: <1099995700.21310.8.camel@mn-2> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 X-archive-position: 11621 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mark@borst.org Precedence: bulk X-list: netdev Content-Length: 1713 Lines: 45 Hello all I am doing some experiments with node-local multicasting as a means of inter-process communication. I am using debian unstable with linux kernel 2.6.8 with MIPL 2.0 patches. Now I am running into some problems. I want to keep the node-local packets on the 'lo' interface. I do that by setting socket option IPV6_MULTICAST_IF to the 'lo' ifindex. Then I use sendmsg() to send the message. As a result I get the error "Network is unreachable". When I started analyzing it, I found the following: The default routing table in my system includes this route: ff00::/8 :: U 256 0 0 eth0 There is no route for this to 'lo'. Which makes all attempts to send nodelocal (ff01::/8) multicast packets to 'lo' go wrong. When I add the following routes, it works: ff01::/16 :: U 1 0 0 eth0 ff01::/16 :: U 1 0 0 lo When I don't use IPV6_MULTICAST_IF, the packets get sent to 'eth0', but when I set it to 'lo' the packets get sent to 'lo'. So far so good. The next thing I notice is that I see the ff01::/8 packets on eth0 with ethereal. Does that mean that they are actually sent out on the wire? If so, then this would violate the semantics of nodelocal multicast. So the question rises: what is the intended behaviour here? As I understand it, ff01::/8 traffic is interface local, and you should use IPV6_MULTICAST_IF to select which interface you want to use. Traffic sent to ff01::/8 on 'eth0' will not be seen on 'lo'. This is however prevented by not having a route to 'lo'. Should these routes be set per interface by default? Please enlighten me. Regards, -- Mark Borst Researcher Network and Protocols Group Tampere University of Technology, Finland From xose@wanadoo.es Tue Nov 9 03:02:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 03:02:09 -0800 (PST) Received: from smtp1.jazztel.es (smtp1.jazztel.es [62.14.3.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9B23K7031532 for ; Tue, 9 Nov 2004 03:02:04 -0800 Received: from antivirus by smtp1.jazztel.es with antivirus id 1CRTl5-0002pI-00 Tue, 09 Nov 2004 12:01:55 +0100 Received: from [212.106.244.29] (helo=wanadoo.es) by smtp1.jazztel.es with esmtp id 1CRTku-0002i0-00 Tue, 09 Nov 2004 12:01:44 +0100 Message-ID: <4190A32E.6090200@wanadoo.es> Date: Tue, 09 Nov 2004 11:59:58 +0100 From: Xose Vazquez Perez User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.4.3) Gecko/20041005 X-Accept-Language: gl, es, en MIME-Version: 1.0 To: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, "David S. Miller" , Jeff Garzik Subject: [PATCH 2.6-bk 1/1] tg3: add license Content-Type: multipart/mixed; boundary="------------000508030809010109000007" X-Virus-Scanned: by antivirus X-archive-position: 11622 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xose@wanadoo.es Precedence: bulk X-list: netdev Content-Length: 2643 Lines: 89 This is a multi-part message in MIME format. --------------000508030809010109000007 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit hi, there is no license, yes it's GPL but... -thanks- --------------000508030809010109000007 Content-Type: text/plain; name="tg3_license.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tg3_license.diff" diff -Nuar o/drivers/net/tg3.c n/drivers/net/tg3.c --- o/drivers/net/tg3.c 2004-11-09 11:49:06.000000000 +0100 +++ n/drivers/net/tg3.c 2004-11-09 11:43:23.000000000 +0100 @@ -9,6 +9,26 @@ * Copyright (C) 2000-2003 Broadcom Corporation. */ +/* + * This file is part of Linux. + * + * Linux is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License Version 2 + * as published by the Free Software Foundation. + * + * Linux is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Linux; if not, write to: + * + * Free Software Foundation Inc. + * 59 Temple Place, Suite 330 + * Boston MA 02111-1307 USA + */ + #include #include diff -Nuar o/drivers/net/tg3.h n/drivers/net/tg3.h --- o/drivers/net/tg3.h 2004-11-09 11:49:06.000000000 +0100 +++ n/drivers/net/tg3.h 2004-11-09 11:46:41.000000000 +0100 @@ -1,4 +1,4 @@ -/* $Id: tg3.h,v 1.37.2.32 2002/03/11 12:18:18 davem Exp $ +/* * tg3.h: Definitions for Broadcom Tigon3 ethernet driver. * * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com) @@ -6,6 +6,26 @@ * Copyright (C) 2004 Sun Microsystems Inc. */ +/* + * This file is part of Linux. + * + * Linux is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License Version 2 + * as published by the Free Software Foundation. + * + * Linux is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Linux; if not, write to: + * + * Free Software Foundation Inc. + * 59 Temple Place, Suite 330 + * Boston MA 02111-1307 USA + */ + #ifndef _T3_H #define _T3_H --------------000508030809010109000007-- From herbert@gondor.apana.org.au Tue Nov 9 04:23:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 04:23:29 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9CNKD0007457 for ; Tue, 9 Nov 2004 04:23:21 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRUUU-0005MW-00; Tue, 09 Nov 2004 22:48:50 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRUUK-0000Vc-00; Tue, 09 Nov 2004 22:48:40 +1100 Date: Tue, 9 Nov 2004 22:48:39 +1100 To: "David S. Miller" , Arnaldo Carvalho de Melo , YOSHIFUJI Hideaki , netdev@oss.sgi.com Cc: Jeff Garzik , Lennert Buytenhek Subject: Re: Bug in ipv6_ifa_notify? Message-ID: <20041109114839.GA1942@gondor.apana.org.au> References: <20041108061529.GA1774@gondor.apana.org.au> <20041108073441.GA2200@gondor.apana.org.au> <20041108121040.GA3618@gondor.apana.org.au> <20041108203741.GA993@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="YZ5djTAD1cGYuMQK" Content-Disposition: inline In-Reply-To: <20041108203741.GA993@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11624 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1517 Lines: 45 --YZ5djTAD1cGYuMQK Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Nov 09, 2004 at 07:37:41AM +1100, herbert wrote: > > Well I've found a way for this to occur, but I must say that it is > fairly unlikely. When you bring the interface down, addrconf_ifdown > will try to to delete the addrconf timer and then notify DELADDR. > Since it doesn't wait for the timer to complete, it might still be > executing. Therefore it is possible to have a NEWADDR after a DELADDR > event. The attractive thing about this theory is that it is an SMP-only race. This could explain why only Jeff/Lennert are seeing it. Jeff/Lennert, could you please go back to 2.6.9, and then apply this patch? If this warning triggers, then that would confirm this theory. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --YZ5djTAD1cGYuMQK Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv6/addrconf.c 1.115 vs edited ===== --- 1.115/net/ipv6/addrconf.c 2004-10-26 14:11:35 +10:00 +++ edited/net/ipv6/addrconf.c 2004-11-09 22:44:35 +11:00 @@ -2989,6 +2989,7 @@ dst_hold(&ifp->rt->u.dst); if (ip6_ins_rt(ifp->rt, NULL, NULL)) dst_release(&ifp->rt->u.dst); + WARN_ON(ifp->dead); if (ifp->idev->cnf.forwarding) addrconf_join_anycast(ifp); break; --YZ5djTAD1cGYuMQK-- From util@deuroconsult.ro Tue Nov 9 04:28:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 04:28:28 -0800 (PST) Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9CSKQD007947 for ; Tue, 9 Nov 2004 04:28:21 -0800 Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by webhosting.rdsbv.ro (8.13.1/8.13.1) with ESMTP id iA9CRxrP021889 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 9 Nov 2004 14:28:00 +0200 Date: Tue, 9 Nov 2004 14:27:59 +0200 (EET) From: "Catalin(ux aka Dino) BOIE" X-X-Sender: util@webhosting.rdsbv.ro To: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: [PATCH] [TRY2] Use nfmark as a key in u32 classifier Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1646943047-59964173-1100002178=:20094" Content-ID: X-archive-position: 11625 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 11792 Lines: 213 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1646943047-59964173-1100002178=:20094 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; format=flowed Content-ID: Hello! This is the try number two. What was changed: - Added selectable choice in Kconfig file (thanks Jamal!) - Don't abuse tc_u32_sel to not break backward compatibility (thanks Patrick!). Stephen, do you have any comments on iproute2 part? I know it's not perfect but this is the best way, I think. "u32 match mark vvvv mmmm" it's intuitive but breaks a little the levels, "u32 mark vvvv mmmm" it's ok but not intuitive.... If you want I can rewrite it if you want. Thank you for your time. Signed-off-by: Catalin(ux aka Dino) --- Catalin(ux aka Dino) BOIE catab at deuroconsult.ro http://kernel.umbrella.ro/ ---1646943047-59964173-1100002178=:20094 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="net-match-nfmark-in-u32-try2.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="net-match-nfmark-in-u32-try2.patch" LS0tIGxpbnV4Lm9yaWcvbmV0L3NjaGVkL0tjb25maWcJMjAwNC0xMC0xOSAw MDo1NTowNi4wMDAwMDAwMDAgKzAzMDANCisrKyBsaW51eC9uZXQvc2NoZWQv S2NvbmZpZwkyMDA0LTExLTA5IDEyOjQ3OjM2LjAwMDAwMDAwMCArMDIwMA0K QEAgLTMzNCw2ICszMzQsMTggQEAgY29uZmlnIE5FVF9DTFNfSU5EDQogCSAg UmVxdWlyZXMgYSBuZXcgaXByb3V0ZTINCiAJICBZb3UgTVVTVCBOT1QgdHVy biB0aGlzIG9uIGlmIHlvdSBkb250IGhhdmUgYW4gdXBkYXRlIGlwcm91dGUy Lg0KIA0KK2NvbmZpZyBDTFNfVTMyX01BUksNCisJYm9vbCAiVXNlIG5mbWFy ayBhcyBhIGtleSBpbiBVMzIgY2xhc3NpZmllciINCisJZGVwZW5kcyBvbiBO RVRfQ0xTX1UzMg0KKwloZWxwDQorCSAgVGhpcyBhbGxvd3MgeW91IHRvIG1h dGNoIG1hcmsgaW4gYSB1MzIgZmlsdGVyLg0KKwkgIEV4YW1wbGU6DQorCSAg dGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwcm90b2NvbCBpcCBwYXJlbnQgMTow IHByaW8gNSB1MzIgXA0KKwkJbWF0Y2ggbWFyayAweDAwOTAgMHhmZmZmIFwN CisJCW1hdGNoIGlwIGRzdCA0LjQuNC40IFwNCisJCWZsb3dpZCAxOjkwDQor CSAgWW91IG11c3QgdXNlIGEgbmV3IGlwcm91dGUyIHRvIHVzZSB0aGlzIGZl YXR1cmUuDQorDQogY29uZmlnIE5FVF9DTFNfUlNWUA0KIAl0cmlzdGF0ZSAi U3BlY2lhbCBSU1ZQIGNsYXNzaWZpZXIiDQogCWRlcGVuZHMgb24gTkVUX0NM UyAmJiBORVRfUU9TDQotLS0gbGludXgub3JpZy9uZXQvc2NoZWQvY2xzX3Uz Mi5jCTIwMDQtMTAtMTkgMDA6NTM6NDUuMDAwMDAwMDAwICswMzAwDQorKysg bGludXgvbmV0L3NjaGVkL2Nsc191MzIuYwkyMDA0LTExLTA5IDEzOjU2OjQy LjAwMDAwMDAwMCArMDIwMA0KQEAgLTI3LDYgKzI3LDcgQEANCiAgKglKSFM6 IFdlIHNob3VsZCByZW1vdmUgdGhlIENPTkZJR19ORVRfQ0xTX0lORCBmcm9t IGhlcmUNCiAgKglldmVudHVhbGx5IHdoZW4gdGhlIG1ldGEgbWF0Y2ggZXh0 ZW5zaW9uIGlzIG1hZGUgYXZhaWxhYmxlDQogICoNCisgKgluZm1hcmsgbWF0 Y2ggYWRkZWQgYnkgQ2F0YWxpbih1eCBha2EgRGlubykgQk9JRSA8Y2F0YWIg YXQgdW1icmVsbGEucm8+DQogICovDQogDQogI2luY2x1ZGUgPGFzbS91YWNj ZXNzLmg+DQpAQCAtNTcsNiArNTgsMTMgQEANCiAjaW5jbHVkZSA8bmV0L3Br dF9zY2hlZC5oPg0KIA0KIA0KK3N0cnVjdCB0Y191MzJfbWFyaw0KK3sNCisJ X191MzIJCXZhbDsNCisJX191MzIJCW1hc2s7DQorCV9fdTMyCQlzdWNjZXNz Ow0KK307DQorDQogc3RydWN0IHRjX3Vfa25vZGUNCiB7DQogCXN0cnVjdCB0 Y191X2tub2RlCSpuZXh0Ow0KQEAgLTc4LDYgKzg2LDkgQEAgc3RydWN0IHRj X3Vfa25vZGUNCiAjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRg0KIAlzdHJ1 Y3QgdGNfdTMyX3BjbnQJKnBmOw0KICNlbmRpZg0KKyNpZmRlZiBDT05GSUdf Q0xTX1UzMl9NQVJLDQorCXN0cnVjdCB0Y191MzJfbWFyawltYXJrOw0KKyNl bmRpZg0KIAlzdHJ1Y3QgdGNfdTMyX3NlbAlzZWw7DQogfTsNCiANCkBAIC0x MzksNiArMTUwLDE2IEBAIG5leHRfa25vZGU6DQogCQluLT5wZi0+cmNudCAr PTE7DQogCQlqID0gMDsNCiAjZW5kaWYNCisNCisjaWZkZWYgQ09ORklHX0NM U19VMzJfTUFSSw0KKwkJaWYgKChza2ItPm5mbWFyayAmIG4tPm1hcmsubWFz aykgIT0gbi0+bWFyay52YWwpIHsNCisJCQluID0gbi0+bmV4dDsNCisJCQln b3RvIG5leHRfa25vZGU7DQorCQl9IGVsc2Ugew0KKwkJCW4tPm1hcmsuc3Vj Y2VzcysrOw0KKwkJfQ0KKyNlbmRpZg0KKw0KIAkJZm9yIChpID0gbi0+c2Vs Lm5rZXlzOyBpPjA7IGktLSwga2V5KyspIHsNCiANCiAJCQlpZiAoKCoodTMy KikocHRyK2tleS0+b2ZmKyhvZmYyJmtleS0+b2ZmbWFzaykpXmtleS0+dmFs KSZrZXktPm1hc2spIHsNCkBAIC02MTUsNiArNjM2LDcgQEAgc3RhdGljIGlu dCB1MzJfY2hhbmdlKHN0cnVjdCB0Y2ZfcHJvdG8gKg0KIAlzdHJ1Y3QgdGNf dV9obm9kZSAqaHQ7DQogCXN0cnVjdCB0Y191X2tub2RlICpuOw0KIAlzdHJ1 Y3QgdGNfdTMyX3NlbCAqczsNCisJc3RydWN0IHRjX3UzMl9tYXJrICptYXJr Ow0KIAlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07 DQogCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9VMzJfTUFYXTsNCiAJdTMyIGh0 aWQ7DQpAQCAtNzE4LDYgKzc0MCwxNiBAQCBzdGF0aWMgaW50IHUzMl9jaGFu Z2Uoc3RydWN0IHRjZl9wcm90byAqDQogCX0NCiAJbi0+ZnNoaWZ0ID0gaTsN CiB9DQorDQorI2lmZGVmIENPTkZJR19DTFNfVTMyX01BUksNCisJaWYgKHRi W1RDQV9VMzJfTUFSSy0xXSA9PSAwIHx8DQorCQlSVEFfUEFZTE9BRCh0YltU Q0FfVTMyX01BUkstMV0pIDwgc2l6ZW9mKHN0cnVjdCB0Y191MzJfbWFyaykp DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJbWFyayA9IFJUQV9EQVRBKHRiW1RD QV9VMzJfTUFSSy0xXSk7DQorCW1lbWNweSgmbi0+bWFyaywgbWFyaywgc2l6 ZW9mKHN0cnVjdCB0Y191MzJfbWFyaykpOw0KKwluLT5tYXJrLnN1Y2Nlc3Mg PSAwOw0KKyNlbmRpZg0KKw0KIAllcnIgPSB1MzJfc2V0X3Bhcm1zKHRwLT5x LCBiYXNlLCBodCwgbiwgdGIsIHRjYVtUQ0FfUkFURS0xXSk7DQogCWlmIChl cnIgPT0gMCkgew0KIAkJc3RydWN0IHRjX3Vfa25vZGUgKippbnM7DQpAQCAt ODA1LDYgKzgzNywxMiBAQCBzdGF0aWMgaW50IHUzMl9kdW1wKHN0cnVjdCB0 Y2ZfcHJvdG8gKnRwDQogCQkJUlRBX1BVVChza2IsIFRDQV9VMzJfQ0xBU1NJ RCwgNCwgJm4tPnJlcy5jbGFzc2lkKTsNCiAJCWlmIChuLT5odF9kb3duKQ0K IAkJCVJUQV9QVVQoc2tiLCBUQ0FfVTMyX0xJTkssIDQsICZuLT5odF9kb3du LT5oYW5kbGUpOw0KKw0KKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9NQVJLDQor CQlpZiAobi0+bWFyay52YWwgfHwgbi0+bWFyay5tYXNrKQ0KKwkJCVJUQV9Q VVQoc2tiLCBUQ0FfVTMyX01BUkssIHNpemVvZihuLT5tYXJrKSwgJm4tPm1h cmspOw0KKyNlbmRpZg0KKw0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QN CiAJCS8qIGFnYWluIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG1vZGUgLSB3 ZSB3YW50DQogCQkqICB0byB3b3JrIHdpdGggYm90aCBvbGQgYW5kIG5ldyBt b2RlcyBvZiBlbnRlcmluZw0KLS0tIGxpbnV4Lm9yaWcvaW5jbHVkZS9saW51 eC9wa3RfY2xzLmgJMjAwNC0xMC0xOSAwMDo1MzowNy4wMDAwMDAwMDAgKzAz MDANCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaAkyMDA0LTEx LTA5IDA5OjUwOjQ1LjAwMDAwMDAwMCArMDIwMA0KQEAgLTE5MCw2ICsxOTAs NyBAQCBlbnVtDQogCVRDQV9VMzJfQUNULCAgIA0KIAlUQ0FfVTMyX0lOREVW LA0KIAlUQ0FfVTMyX1BDTlQsDQorCVRDQV9VMzJfTUFSSywNCiAJX19UQ0Ff VTMyX01BWA0KIH07DQogDQo= ---1646943047-59964173-1100002178=:20094 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="iproute2-match-mark-in-u32-try2.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="iproute2-match-mark-in-u32-try2.patch" LS0tIGlwcm91dGUyLTIuNi45L3RjL2ZfdTMyLmMub3JpZwkyMDA0LTExLTA0 IDE1OjM4OjUzLjAwMDAwMDAwMCArMDIwMA0KKysrIGlwcm91dGUyLTIuNi45 L3RjL2ZfdTMyLmMJMjAwNC0xMS0wOSAxMzo1OTowMC4wMDAwMDAwMDAgKzAy MDANCkBAIC03LDYgKzcsNyBAQA0KICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBv ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICAqDQog ICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5y LmFjLnJ1Pg0KKyAqCQlNYXRjaCBtYXJrIGFkZGVkIGJ5IENhdGFsaW4odXgg YWthIERpbm8pIEJPSUUgPGNhdGFiIGF0IHVtYnJlbGxhLnJvPiBbNSBub3Yg MjAwNF0NCiAgKg0KICAqLw0KIA0KQEAgLTMzLDcgKzM0LDcgQEAgc3RhdGlj IHZvaWQgZXhwbGFpbih2b2lkKQ0KIAlmcHJpbnRmKHN0ZGVyciwgIm9yICAg ICAgICAgdTMyIGRpdmlzb3IgRElWSVNPUlxuIik7DQogCWZwcmludGYoc3Rk ZXJyLCAiXG4iKTsNCiAJZnByaW50ZihzdGRlcnIsICJXaGVyZTogU0VMRUNU T1IgOj0gU0FNUExFIFNBTVBMRSAuLi5cbiIpOw0KLQlmcHJpbnRmKHN0ZGVy ciwgIiAgICAgICBTQU1QTEUgOj0geyBpcCB8IGlwNiB8IHVkcCB8IHRjcCB8 IGljbXAgfCB1ezMyfDE2fDh9IH0gU0FNUExFX0FSR1NcbiIpOw0KKwlmcHJp bnRmKHN0ZGVyciwgIiAgICAgICBTQU1QTEUgOj0geyBpcCB8IGlwNiB8IHVk cCB8IHRjcCB8IGljbXAgfCB1ezMyfDE2fDh9IHwgbWFyayB9IFNBTVBMRV9B UkdTXG4iKTsNCiAJZnByaW50ZihzdGRlcnIsICIgICAgICAgRklMVEVSSUQg Oj0gWDpZOlpcbiIpOw0KIH0NCiANCkBAIC01OTAsOSArNTkxLDQyIEBAIGRv bmU6DQogCXJldHVybiByZXM7DQogfQ0KIA0KK3N0YXRpYyBpbnQgcGFyc2Vf bWFyayhpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCBubG1z Z2hkciAqbikNCit7DQorCWludCByZXMgPSAtMTsNCisJaW50IGFyZ2MgPSAq YXJnY19wOw0KKwljaGFyICoqYXJndiA9ICphcmd2X3A7DQorCXN0cnVjdCB0 Y191MzJfbWFyayBtYXJrOw0KKw0KKwlpZiAoYXJnYyA8PSAxKQ0KKwkJcmV0 dXJuIC0xOw0KKw0KKwlpZiAoZ2V0X3UzMigmbWFyay52YWwsICphcmd2LCAw KSkgew0KKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWFya1wiIHZh bHVlXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlORVhUX0FSRygpOw0K Kw0KKwlpZiAoZ2V0X3UzMigmbWFyay5tYXNrLCAqYXJndiwgMCkpIHsNCisJ CWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm1hcmtcIiBtYXNrXG4iKTsN CisJCXJldHVybiAtMTsNCisJfQ0KKwlORVhUX0FSRygpOw0KKw0KKwlpZiAo KG1hcmsudmFsICYgbWFyay5tYXNrKSAhPSBtYXJrLnZhbCkgew0KKwkJZnBy aW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWFya1wiIChpbXBvc3NpYmxlIGNv bWJpbmF0aW9uKVxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCiANCisJYWRk YXR0cl9sKG4sIE1BWF9NU0csIFRDQV9VMzJfTUFSSywgJm1hcmssIHNpemVv ZihtYXJrKSk7DQorCXJlcyA9IDA7DQorDQorCSphcmdjX3AgPSBhcmdjOw0K KwkqYXJndl9wID0gYXJndjsNCisJcmV0dXJuIHJlczsNCit9DQogDQotc3Rh dGljIGludCBwYXJzZV9zZWxlY3RvcihpbnQgKmFyZ2NfcCwgY2hhciAqKiph cmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpDQorc3RhdGljIGludCBw YXJzZV9zZWxlY3RvcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0 cnVjdCB0Y191MzJfc2VsICpzZWwsIHN0cnVjdCBubG1zZ2hkciAqbikNCiB7 DQogCWludCBhcmdjID0gKmFyZ2NfcDsNCiAJY2hhciAqKmFyZ3YgPSAqYXJn dl9wOw0KQEAgLTY0MSw2ICs2NzUsMTIgQEAgc3RhdGljIGludCBwYXJzZV9z ZWxlY3RvcihpbnQgKmFyZ2NfcCwgYw0KIAkJcmVzID0gcGFyc2VfaWNtcCgm YXJnYywgJmFyZ3YsIHNlbCk7DQogCQlnb3RvIGRvbmU7DQogCX0NCisJaWYg KG1hdGNoZXMoKmFyZ3YsICJtYXJrIikgPT0gMCkgew0KKwkJTkVYVF9BUkco KTsNCisJCXJlcyA9IHBhcnNlX21hcmsoJmFyZ2MsICZhcmd2LCBuKTsNCisJ CWdvdG8gZG9uZTsNCisJfQ0KKw0KIAlyZXR1cm4gLTE7DQogDQogZG9uZToN CkBAIC03NjAsNyArODAwLDcgQEAgc3RhdGljIGludCB1MzJfcGFyc2Vfb3B0 KHN0cnVjdCBmaWx0ZXJfdQ0KIAl3aGlsZSAoYXJnYyA+IDApIHsNCiAJCWlm IChtYXRjaGVzKCphcmd2LCAibWF0Y2giKSA9PSAwKSB7DQogCQkJTkVYVF9B UkcoKTsNCi0JCQlpZiAocGFyc2Vfc2VsZWN0b3IoJmFyZ2MsICZhcmd2LCAm c2VsLnNlbCkpIHsNCisJCQlpZiAocGFyc2Vfc2VsZWN0b3IoJmFyZ2MsICZh cmd2LCAmc2VsLnNlbCwgbikpIHsNCiAJCQkJZnByaW50ZihzdGRlcnIsICJJ bGxlZ2FsIFwibWF0Y2hcIlxuIik7DQogCQkJCXJldHVybiAtMTsNCiAJCQl9 DQpAQCAtODM5LDcgKzg3OSw3IEBAIHN0YXRpYyBpbnQgdTMyX3BhcnNlX29w dChzdHJ1Y3QgZmlsdGVyX3UNCiAJCQkJc3RydWN0IHRjX3UzMl9rZXkga2V5 c1s0XTsNCiAJCQl9IHNlbDI7DQogCQkJTkVYVF9BUkcoKTsNCi0JCQlpZiAo cGFyc2Vfc2VsZWN0b3IoJmFyZ2MsICZhcmd2LCAmc2VsMi5zZWwpKSB7DQor CQkJaWYgKHBhcnNlX3NlbGVjdG9yKCZhcmdjLCAmYXJndiwgJnNlbDIuc2Vs LCBuKSkgew0KIAkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJzYW1w bGVcIlxuIik7DQogCQkJCXJldHVybiAtMTsNCiAJCQl9DQpAQCAtOTY0LDEx ICsxMDA0LDIyIEBAIHN0YXRpYyBpbnQgdTMyX3ByaW50X29wdChzdHJ1Y3Qg ZmlsdGVyX3UNCiAJCXBmID0gUlRBX0RBVEEodGJbVENBX1UzMl9QQ05UXSk7 DQogCX0NCiANCisJaWYgKHNlbCAmJiBzaG93X3N0YXRzICYmIE5VTEwgIT0g cGYpDQorCQlmcHJpbnRmKGYsICIgKHJ1bGUgaGl0ICVsbHUgc3VjY2VzcyAl bGx1KSIscGYtPnJjbnQscGYtPnJoaXQpOw0KKw0KKwlpZiAodGJbVENBX1Uz Ml9NQVJLXSkgew0KKwkJc3RydWN0IHRjX3UzMl9tYXJrICptYXJrID0gUlRB X0RBVEEodGJbVENBX1UzMl9NQVJLXSk7DQorCQlpZiAoUlRBX1BBWUxPQUQo dGJbVENBX1UzMl9NQVJLXSkgPCBzaXplb2YoKm1hcmspKSB7DQorCQkJZnBy aW50ZihmLCAiXG4gIEludmFsaWQgbWFyayAoa2VybmVsJmlwcm91dGUyIG1p c21hdGNoKVxuIik7DQorCQl9IGVsc2Ugew0KKwkJCWZwcmludGYoZiwgIlxu ICBtYXJrIDB4JTA0eCAweCUwNHggKHN1Y2Nlc3MgJWQpIiwNCisJCQkJbWFy ay0+dmFsLCBtYXJrLT5tYXNrLCBtYXJrLT5zdWNjZXNzKTsNCisJCX0NCisJ fQ0KKw0KIAlpZiAoc2VsKSB7DQogCQlpbnQgaTsNCiAJCXN0cnVjdCB0Y191 MzJfa2V5ICprZXkgPSBzZWwtPmtleXM7DQotCQlpZiAoc2hvd19zdGF0cyAm JiBOVUxMICE9IHBmKQ0KLQkJCWZwcmludGYoZiwgIiAocnVsZSBoaXQgJWxs dSBzdWNjZXNzICVsbHUpIixwZi0+cmNudCxwZi0+cmhpdCk7DQogCQlpZiAo c2VsLT5ua2V5cykgew0KIAkJCWZvciAoaT0wOyBpPHNlbC0+bmtleXM7IGkr Kywga2V5KyspIHsNCiAJCQkJZnByaW50ZihmLCAiXG4gIG1hdGNoICUwOHgv JTA4eCBhdCAlcyVkIiwNCi0tLSBpcHJvdXRlMi0yLjYuOS9pbmNsdWRlL2xp bnV4L3BrdF9jbHMuaC5vcmlnCTIwMDQtMTEtMDQgMTU6NDI6MjcuMDAwMDAw MDAwICswMjAwDQorKysgaXByb3V0ZTItMi42LjkvaW5jbHVkZS9saW51eC9w a3RfY2xzLmgJMjAwNC0xMS0wOSAxMzo1ODoxNS4wMDAwMDAwMDAgKzAyMDAN CkBAIC0xOTAsNiArMTkwLDcgQEAgZW51bQ0KIAlUQ0FfVTMyX0FDVCwgICAN CiAJVENBX1UzMl9JTkRFViwNCiAJVENBX1UzMl9QQ05ULA0KKwlUQ0FfVTMy X01BUkssDQogCV9fVENBX1UzMl9NQVgNCiB9Ow0KIA0KQEAgLTIyNCw2ICsy MjUsMTQgQEAgc3RydWN0IHRjX3UzMl9wY250DQogCV9fdTY0IHJoaXQ7DQog CV9fdTY0IGtjbnRzWzBdOw0KIH07DQorDQorc3RydWN0IHRjX3UzMl9tYXJr DQorew0KKwlfX3UzMgl2YWw7DQorCV9fdTMyCW1hc2s7DQorCV9fdTMyCXN1 Y2Nlc3M7DQorfTsNCisNCiAvKiBGbGFncyAqLw0KIA0KICNkZWZpbmUgVENf VTMyX1RFUk1JTkFMCQkxDQo= ---1646943047-59964173-1100002178=:20094-- From hadi@znyx.com Tue Nov 9 04:30:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 04:30:05 -0800 (PST) Received: from lotus.znyx.com (znx208-2-156-007.znyx.com [208.2.156.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9CU1Gr008314 for ; Tue, 9 Nov 2004 04:30:01 -0800 Received: from localhost ([208.2.156.2]) by lotus.znyx.com (Lotus Domino Release 5.0.11) with ESMTP id 2004110904333228:15861 ; Tue, 9 Nov 2004 04:33:32 -0800 Subject: Re: [PATCH 2.6 PKT_SCHED]: Clean up tcf_action_init memory handling From: Jamal Hadi Salim Reply-To: hadi@znyx.com To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <4190874E.7040202@trash.net> References: <4190874E.7040202@trash.net> Organization: ZNYX Networks Message-Id: <1100003381.1118.53.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 09 Nov 2004 07:29:41 -0500 X-MIMETrack: Itemize by SMTP Server on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/09/2004 04:33:32 AM, Serialize by Router on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/09/2004 04:33:34 AM, Serialize complete at 11/09/2004 04:33:34 AM Content-Transfer-Encoding: 7bit Content-Type: text/plain X-archive-position: 11626 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@znyx.com Precedence: bulk X-list: netdev Content-Length: 403 Lines: 13 Dave, the first patch from Patrick on u64 times is fine to apply. This one i need to review and i am too occupied at the moment to spend more than a minute on it. So dont apply it. Patrick: I would prefer such patches be sent to me first for approval before going to Dave. Not that i question your skills (based on history of your previous patches), it just makes me less nervous ;-> cheers, jamal From hadi@cyberus.ca Tue Nov 9 04:36:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 04:37:00 -0800 (PST) Received: from lotus.znyx.com (znx208-2-156-007.znyx.com [208.2.156.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9Cas3T008855 for ; Tue, 9 Nov 2004 04:36:54 -0800 Received: from localhost ([208.2.156.2]) by lotus.znyx.com (Lotus Domino Release 5.0.11) with ESMTP id 2004110904402481:15867 ; Tue, 9 Nov 2004 04:40:24 -0800 Subject: Re: [PATCH] [TRY2] Use nfmark as a key in u32 classifier From: jamal Reply-To: hadi@cyberus.ca To: "Catalin(ux aka Dino) "BOIE Cc: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com In-Reply-To: References: Organization: jamalopolis Message-Id: <1100003794.1114.61.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 09 Nov 2004 07:36:34 -0500 X-MIMETrack: Itemize by SMTP Server on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/09/2004 04:40:24 AM, Serialize by Router on Lotus/Znyx(Release 5.0.11 |July 24, 2002) at 11/09/2004 04:40:27 AM, Serialize complete at 11/09/2004 04:40:27 AM Content-Transfer-Encoding: 7bit Content-Type: text/plain X-archive-position: 11627 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 823 Lines: 30 Looks quiet palatable. You didnt CC Dave for inclusion cheers, jamal On Tue, 2004-11-09 at 07:27, Catalin(ux aka Dino) BOIE wrote: > Hello! > > This is the try number two. > What was changed: > - Added selectable choice in Kconfig file (thanks Jamal!) > - Don't abuse tc_u32_sel to not break backward compatibility (thanks > Patrick!). > > Stephen, do you have any comments on iproute2 part? I know it's not > perfect but this is the best way, I think. "u32 match mark vvvv mmmm" it's > intuitive but breaks a little the levels, "u32 mark vvvv mmmm" it's ok > but not intuitive.... > If you want I can rewrite it if you want. > > Thank you for your time. > > Signed-off-by: Catalin(ux aka Dino) > > --- > Catalin(ux aka Dino) BOIE > catab at deuroconsult.ro > http://kernel.umbrella.ro/ From util@deuroconsult.ro Tue Nov 9 05:00:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 05:01:02 -0800 (PST) Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9D0u0v020846 for ; Tue, 9 Nov 2004 05:00:57 -0800 Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by webhosting.rdsbv.ro (8.13.1/8.13.1) with ESMTP id iA9D0URN004349 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 9 Nov 2004 15:00:30 +0200 Date: Tue, 9 Nov 2004 15:00:30 +0200 (EET) From: "Catalin(ux aka Dino) BOIE" X-X-Sender: util@webhosting.rdsbv.ro To: jamal cc: davem@davemloft.net, linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: Re: [PATCH] [TRY2] Use nfmark as a key in u32 classifier In-Reply-To: <1100003794.1114.61.camel@jzny.localdomain> Message-ID: References: <1100003794.1114.61.camel@jzny.localdomain> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 11628 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 1096 Lines: 44 On Tue, 9 Nov 2004, jamal wrote: > > Looks quiet palatable. You didnt CC Dave for inclusion Yes, I tought that he reads evry message on netdev... I added him, thanks. Dave, please, include it in next release. Thank you. > > cheers, > jamal > > On Tue, 2004-11-09 at 07:27, Catalin(ux aka Dino) BOIE wrote: >> Hello! >> >> This is the try number two. >> What was changed: >> - Added selectable choice in Kconfig file (thanks Jamal!) >> - Don't abuse tc_u32_sel to not break backward compatibility (thanks >> Patrick!). >> >> Stephen, do you have any comments on iproute2 part? I know it's not >> perfect but this is the best way, I think. "u32 match mark vvvv mmmm" it's >> intuitive but breaks a little the levels, "u32 mark vvvv mmmm" it's ok >> but not intuitive.... >> If you want I can rewrite it if you want. >> >> Thank you for your time. >> >> Signed-off-by: Catalin(ux aka Dino) >> >> --- >> Catalin(ux aka Dino) BOIE >> catab at deuroconsult.ro >> http://kernel.umbrella.ro/ > --- Catalin(ux aka Dino) BOIE catab at deuroconsult.ro http://kernel.umbrella.ro/ From tgraf@suug.ch Tue Nov 9 05:30:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 05:30:44 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9DUb8E023996 for ; Tue, 9 Nov 2004 05:30:37 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 2494CF; Tue, 9 Nov 2004 14:29:53 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 573681C0EA; Tue, 9 Nov 2004 14:30:35 +0100 (CET) Date: Tue, 9 Nov 2004 14:30:35 +0100 From: Thomas Graf To: "Catalin(ux aka Dino) BOIE" Cc: linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: Re: [PATCH] [TRY2] Use nfmark as a key in u32 classifier Message-ID: <20041109133035.GH31969@postel.suug.ch> Mail-Followup-To: "Catalin(ux aka Dino) BOIE" , linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-archive-position: 11629 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 567 Lines: 15 * Catalin(ux aka Dino) BOIE 2004-11-09 14:27 > This is the try number two. > What was changed: > - Added selectable choice in Kconfig file (thanks Jamal!) > - Don't abuse tc_u32_sel to not break backward compatibility (thanks > Patrick!). Your patchs looks fine except for missing dependcy on CONFIG_NETFILTER. Either make CLS_U32_MARK dependant on it or #ifdef the references to skb->nfmark. It might be fair to tell you that this code is likely to be removed again once we have the metadata match. Cheers From util@deuroconsult.ro Tue Nov 9 05:46:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 05:46:49 -0800 (PST) Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9Dkg3l025991 for ; Tue, 9 Nov 2004 05:46:43 -0800 Received: from webhosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by webhosting.rdsbv.ro (8.13.1/8.13.1) with ESMTP id iA9DkLOl007649 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 9 Nov 2004 15:46:22 +0200 Date: Tue, 9 Nov 2004 15:46:21 +0200 (EET) From: "Catalin(ux aka Dino) BOIE" X-X-Sender: util@webhosting.rdsbv.ro To: Thomas Graf cc: davem@davemloft.net, linux-net@vger.kernel.org, lartc@mailman.ds9a.nl, netdev@oss.sgi.com Subject: Re: [PATCH] [TRY2] Use nfmark as a key in u32 classifier In-Reply-To: <20041109133035.GH31969@postel.suug.ch> Message-ID: References: <20041109133035.GH31969@postel.suug.ch> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1646943047-193533873-1100007861=:7366" Content-ID: X-archive-position: 11630 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 6090 Lines: 118 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1646943047-193533873-1100007861=:7366 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; format=flowed Content-ID: > * Catalin(ux aka Dino) BOIE 2004-11-09 14:27 >> This is the try number two. >> What was changed: >> - Added selectable choice in Kconfig file (thanks Jamal!) >> - Don't abuse tc_u32_sel to not break backward compatibility (thanks >> Patrick!). > > Your patchs looks fine except for missing dependcy on CONFIG_NETFILTER. > Either make CLS_U32_MARK dependant on it or #ifdef the references > to skb->nfmark. Patch updated and attached. > It might be fair to tell you that this code is likely to be removed > again once we have the metadata match. Jamal already warned me about this. Is somebody already working on it? > Cheers Thank you! --- Catalin(ux aka Dino) BOIE catab at deuroconsult.ro http://kernel.umbrella.ro/ ---1646943047-193533873-1100007861=:7366 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="net-match-nfmark-in-u32-try3.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="net-match-nfmark-in-u32-try3.patch" LS0tIGxpbnV4Lm9yaWcvbmV0L3NjaGVkL0tjb25maWcJMjAwNC0xMC0xOSAw MDo1NTowNi4wMDAwMDAwMDAgKzAzMDANCisrKyBsaW51eC9uZXQvc2NoZWQv S2NvbmZpZwkyMDA0LTExLTA5IDE1OjM5OjQ3LjAwMDAwMDAwMCArMDIwMA0K QEAgLTMzNCw2ICszMzQsMTggQEAgY29uZmlnIE5FVF9DTFNfSU5EDQogCSAg UmVxdWlyZXMgYSBuZXcgaXByb3V0ZTINCiAJICBZb3UgTVVTVCBOT1QgdHVy biB0aGlzIG9uIGlmIHlvdSBkb250IGhhdmUgYW4gdXBkYXRlIGlwcm91dGUy Lg0KIA0KK2NvbmZpZyBDTFNfVTMyX01BUksNCisJYm9vbCAiVXNlIG5mbWFy ayBhcyBhIGtleSBpbiBVMzIgY2xhc3NpZmllciINCisJZGVwZW5kcyBvbiBO RVRfQ0xTX1UzMiAmJiBORVRGSUxURVINCisJaGVscA0KKwkgIFRoaXMgYWxs b3dzIHlvdSB0byBtYXRjaCBtYXJrIGluIGEgdTMyIGZpbHRlci4NCisJICBF eGFtcGxlOg0KKwkgIHRjIGZpbHRlciBhZGQgZGV2IGV0aDAgcHJvdG9jb2wg aXAgcGFyZW50IDE6MCBwcmlvIDUgdTMyIFwNCisJCW1hdGNoIG1hcmsgMHgw MDkwIDB4ZmZmZiBcDQorCQltYXRjaCBpcCBkc3QgNC40LjQuNCBcDQorCQlm bG93aWQgMTo5MA0KKwkgIFlvdSBtdXN0IHVzZSBhIG5ldyBpcHJvdXRlMiB0 byB1c2UgdGhpcyBmZWF0dXJlLg0KKw0KIGNvbmZpZyBORVRfQ0xTX1JTVlAN CiAJdHJpc3RhdGUgIlNwZWNpYWwgUlNWUCBjbGFzc2lmaWVyIg0KIAlkZXBl bmRzIG9uIE5FVF9DTFMgJiYgTkVUX1FPUw0KLS0tIGxpbnV4Lm9yaWcvbmV0 L3NjaGVkL2Nsc191MzIuYwkyMDA0LTEwLTE5IDAwOjUzOjQ1LjAwMDAwMDAw MCArMDMwMA0KKysrIGxpbnV4L25ldC9zY2hlZC9jbHNfdTMyLmMJMjAwNC0x MS0wOSAxMzo1Njo0Mi4wMDAwMDAwMDAgKzAyMDANCkBAIC0yNyw2ICsyNyw3 IEBADQogICoJSkhTOiBXZSBzaG91bGQgcmVtb3ZlIHRoZSBDT05GSUdfTkVU X0NMU19JTkQgZnJvbSBoZXJlDQogICoJZXZlbnR1YWxseSB3aGVuIHRoZSBt ZXRhIG1hdGNoIGV4dGVuc2lvbiBpcyBtYWRlIGF2YWlsYWJsZQ0KICAqDQor ICoJbmZtYXJrIG1hdGNoIGFkZGVkIGJ5IENhdGFsaW4odXggYWthIERpbm8p IEJPSUUgPGNhdGFiIGF0IHVtYnJlbGxhLnJvPg0KICAqLw0KIA0KICNpbmNs dWRlIDxhc20vdWFjY2Vzcy5oPg0KQEAgLTU3LDYgKzU4LDEzIEBADQogI2lu Y2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4NCiANCiANCitzdHJ1Y3QgdGNfdTMy X21hcmsNCit7DQorCV9fdTMyCQl2YWw7DQorCV9fdTMyCQltYXNrOw0KKwlf X3UzMgkJc3VjY2VzczsNCit9Ow0KKw0KIHN0cnVjdCB0Y191X2tub2RlDQog ew0KIAlzdHJ1Y3QgdGNfdV9rbm9kZQkqbmV4dDsNCkBAIC03OCw2ICs4Niw5 IEBAIHN0cnVjdCB0Y191X2tub2RlDQogI2lmZGVmIENPTkZJR19DTFNfVTMy X1BFUkYNCiAJc3RydWN0IHRjX3UzMl9wY250CSpwZjsNCiAjZW5kaWYNCisj aWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSw0KKwlzdHJ1Y3QgdGNfdTMyX21h cmsJbWFyazsNCisjZW5kaWYNCiAJc3RydWN0IHRjX3UzMl9zZWwJc2VsOw0K IH07DQogDQpAQCAtMTM5LDYgKzE1MCwxNiBAQCBuZXh0X2tub2RlOg0KIAkJ bi0+cGYtPnJjbnQgKz0xOw0KIAkJaiA9IDA7DQogI2VuZGlmDQorDQorI2lm ZGVmIENPTkZJR19DTFNfVTMyX01BUksNCisJCWlmICgoc2tiLT5uZm1hcmsg JiBuLT5tYXJrLm1hc2spICE9IG4tPm1hcmsudmFsKSB7DQorCQkJbiA9IG4t Pm5leHQ7DQorCQkJZ290byBuZXh0X2tub2RlOw0KKwkJfSBlbHNlIHsNCisJ CQluLT5tYXJrLnN1Y2Nlc3MrKzsNCisJCX0NCisjZW5kaWYNCisNCiAJCWZv ciAoaSA9IG4tPnNlbC5ua2V5czsgaT4wOyBpLS0sIGtleSsrKSB7DQogDQog CQkJaWYgKCgqKHUzMiopKHB0citrZXktPm9mZisob2ZmMiZrZXktPm9mZm1h c2spKV5rZXktPnZhbCkma2V5LT5tYXNrKSB7DQpAQCAtNjE1LDYgKzYzNiw3 IEBAIHN0YXRpYyBpbnQgdTMyX2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICoN CiAJc3RydWN0IHRjX3VfaG5vZGUgKmh0Ow0KIAlzdHJ1Y3QgdGNfdV9rbm9k ZSAqbjsNCiAJc3RydWN0IHRjX3UzMl9zZWwgKnM7DQorCXN0cnVjdCB0Y191 MzJfbWFyayAqbWFyazsNCiAJc3RydWN0IHJ0YXR0ciAqb3B0ID0gdGNhW1RD QV9PUFRJT05TLTFdOw0KIAlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfVTMyX01B WF07DQogCXUzMiBodGlkOw0KQEAgLTcxOCw2ICs3NDAsMTYgQEAgc3RhdGlj IGludCB1MzJfY2hhbmdlKHN0cnVjdCB0Y2ZfcHJvdG8gKg0KIAl9DQogCW4t PmZzaGlmdCA9IGk7DQogfQ0KKw0KKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9N QVJLDQorCWlmICh0YltUQ0FfVTMyX01BUkstMV0gPT0gMCB8fA0KKwkJUlRB X1BBWUxPQUQodGJbVENBX1UzMl9NQVJLLTFdKSA8IHNpemVvZihzdHJ1Y3Qg dGNfdTMyX21hcmspKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCW1hcmsgPSBS VEFfREFUQSh0YltUQ0FfVTMyX01BUkstMV0pOw0KKwltZW1jcHkoJm4tPm1h cmssIG1hcmssIHNpemVvZihzdHJ1Y3QgdGNfdTMyX21hcmspKTsNCisJbi0+ bWFyay5zdWNjZXNzID0gMDsNCisjZW5kaWYNCisNCiAJZXJyID0gdTMyX3Nl dF9wYXJtcyh0cC0+cSwgYmFzZSwgaHQsIG4sIHRiLCB0Y2FbVENBX1JBVEUt MV0pOw0KIAlpZiAoZXJyID09IDApIHsNCiAJCXN0cnVjdCB0Y191X2tub2Rl ICoqaW5zOw0KQEAgLTgwNSw2ICs4MzcsMTIgQEAgc3RhdGljIGludCB1MzJf ZHVtcChzdHJ1Y3QgdGNmX3Byb3RvICp0cA0KIAkJCVJUQV9QVVQoc2tiLCBU Q0FfVTMyX0NMQVNTSUQsIDQsICZuLT5yZXMuY2xhc3NpZCk7DQogCQlpZiAo bi0+aHRfZG93bikNCiAJCQlSVEFfUFVUKHNrYiwgVENBX1UzMl9MSU5LLCA0 LCAmbi0+aHRfZG93bi0+aGFuZGxlKTsNCisNCisjaWZkZWYgQ09ORklHX0NM U19VMzJfTUFSSw0KKwkJaWYgKG4tPm1hcmsudmFsIHx8IG4tPm1hcmsubWFz aykNCisJCQlSVEFfUFVUKHNrYiwgVENBX1UzMl9NQVJLLCBzaXplb2Yobi0+ bWFyayksICZuLT5tYXJrKTsNCisjZW5kaWYNCisNCiAjaWZkZWYgQ09ORklH X05FVF9DTFNfQUNUDQogCQkvKiBhZ2FpbiBmb3IgYmFja3dhcmQgY29tcGF0 aWJsZSBtb2RlIC0gd2Ugd2FudA0KIAkJKiAgdG8gd29yayB3aXRoIGJvdGgg b2xkIGFuZCBuZXcgbW9kZXMgb2YgZW50ZXJpbmcNCi0tLSBsaW51eC5vcmln L2luY2x1ZGUvbGludXgvcGt0X2Nscy5oCTIwMDQtMTAtMTkgMDA6NTM6MDcu MDAwMDAwMDAwICswMzAwDQorKysgbGludXgvaW5jbHVkZS9saW51eC9wa3Rf Y2xzLmgJMjAwNC0xMS0wOSAwOTo1MDo0NS4wMDAwMDAwMDAgKzAyMDANCkBA IC0xOTAsNiArMTkwLDcgQEAgZW51bQ0KIAlUQ0FfVTMyX0FDVCwgICANCiAJ VENBX1UzMl9JTkRFViwNCiAJVENBX1UzMl9QQ05ULA0KKwlUQ0FfVTMyX01B UkssDQogCV9fVENBX1UzMl9NQVgNCiB9Ow0KIA0K ---1646943047-193533873-1100007861=:7366-- From colin.lkml@colino.net Tue Nov 9 06:13:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 06:13:32 -0800 (PST) Received: from paperstreet.colino.net (colino.net [213.41.131.56]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9EDRlO026922 for ; Tue, 9 Nov 2004 06:13:27 -0800 Received: by paperstreet.colino.net (Postfix, from userid 1015) id 7AD0073F5; Tue, 9 Nov 2004 15:13:00 +0100 (CET) Received: from pirandello (asap.atchik.net [195.167.234.210]) by paperstreet.colino.net (Postfix) with ESMTP id 9A32373F1; Tue, 9 Nov 2004 15:12:05 +0100 (CET) Date: Tue, 9 Nov 2004 15:11:54 +0100 From: Colin Leroy To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com Subject: [(broken) PATCH] Sungem and wake_on_lan Message-ID: <20041109151154.43c897dd.colin.lkml@colino.net> X-Mailer: Sylpheed-Claws 0.9.12cvs142.2 (GTK+ 2.4.0; i686-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11631 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: colin.lkml@colino.net Precedence: bulk X-list: netdev Content-Length: 4530 Lines: 137 Hi everyone, I'm trying to implement wake_on_lan in sungem. I did it by mimicking the Darwin AppleGMACEthernet driver. I have some problems with it; not only it doesn't work (pinging the target machine does not wake it up, nor does ether-wake.c), but also the normal resume crashes instead of working - before powering screen up, so no log available... My laptop has a BCM5221 PHY, I suppose it supports WOL but did not check. Anyway it shouldn't crash on normal resume, as Darwin's driver doesn't seem to have special cases depending on PHYs. Before putting the laptop to sleep, I issue a 'sudo ethtool -s eth0 wol p' to enable gp->wake_on_lan. Here's the patch, in case anyone (BenH, David Miller ? :)) has an idea about something i do wrong. Thanks, -- Colin diff -ur /tmp/linux-2.6.9/drivers/net/sungem.c drivers/net/sungem.c --- /tmp/linux-2.6.9/drivers/net/sungem.c 2004-10-18 23:55:28.000000000 +0200 +++ drivers/net/sungem.c 2004-11-09 14:40:04.000000000 +0100 @@ -2132,7 +2132,29 @@ writel(mifcfg, gp->regs + MIF_CFG); if (gp->wake_on_lan) { - /* Setup wake-on-lan */ + u32 val_wake_up; + u32 xif_cfg = readl(gp->regs + MAC_XIFCFG); + unsigned char *e = &gp->dev->dev_addr[0]; + + /* set these bits for multicast filtering */ + writel(MAC_RXCFG_HFE|MAC_RXCFG_SFCS|MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); + + /* write our MAC address */ + writel((e[0] << 8) | e[1], gp->regs + MAC_WOL_MAGIC2); + writel((e[2] << 8) | e[3], gp->regs + MAC_WOL_MAGIC1); + writel((e[4] << 8) | e[5], gp->regs + MAC_WOL_MAGIC0); + + /* write the pattern match count */ + writel(PAT_MATCH_M | PAT_MATCH_N, gp->regs + PAT_MATCH_CFG); + + /* enable WOL */ + val_wake_up = WOL_ENABLE; + if (!(xif_cfg & MAC_XIFCFG_GMII)) + val_wake_up |= WOL_MODE_MII; + writel(val_wake_up, gp->regs + WOL_CSR_CFG); + + /* sleep a bit, just to be sure */ + msleep(10); } else { writel(0, gp->regs + MAC_RXCFG); (void)readl(gp->regs + MAC_RXCFG); @@ -2159,7 +2181,7 @@ } if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) - gp->phy_mii.def->ops->suspend(&gp->phy_mii, 0 /* wake on lan options */); + gp->phy_mii.def->ops->suspend(&gp->phy_mii, gp->wake_on_lan); if (!gp->wake_on_lan) { /* According to Apple, we must set the MDIO pins to this begnign @@ -2622,13 +2644,30 @@ struct gem *gp = dev->priv; return gp->msg_enable; } - + static void gem_set_msglevel(struct net_device *dev, u32 value) { struct gem *gp = dev->priv; gp->msg_enable = value; } - + +static void gem_get_wol (struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct gem *gp = dev->priv; + wol->wolopts = 0; + /* let's say we support this, altough I don't know what it is */ + wol->supported = WAKE_PHY|WAKE_UCAST; + if (gp->wake_on_lan == 1) + wol->wolopts = wol->supported; +} + +static int gem_set_wol (struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct gem *gp = dev->priv; + gp->wake_on_lan = (wol->wolopts != 0); + return 0; +} + static struct ethtool_ops gem_ethtool_ops = { .get_drvinfo = gem_get_drvinfo, .get_link = ethtool_op_get_link, @@ -2637,6 +2676,8 @@ .nway_reset = gem_nway_reset, .get_msglevel = gem_get_msglevel, .set_msglevel = gem_set_msglevel, + .get_wol = gem_get_wol, + .set_wol = gem_set_wol, }; static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) diff -ur /tmp/linux-2.6.9/drivers/net/sungem.h drivers/net/sungem.h --- /tmp/linux-2.6.9/drivers/net/sungem.h 2004-10-18 23:54:32.000000000 +0200 +++ drivers/net/sungem.h 2004-11-09 10:10:46.000000000 +0100 @@ -276,6 +276,9 @@ */ /* MAC Registers */ +#define MAC_WOL_MAGIC0 0x3000UL /* six address bytes */ +#define MAC_WOL_MAGIC1 0x3004UL +#define MAC_WOL_MAGIC2 0x3008UL #define MAC_TXRST 0x6000UL /* TX MAC Software Reset Command*/ #define MAC_RXRST 0x6004UL /* RX MAC Software Reset Command*/ #define MAC_SNDPAUSE 0x6008UL /* Send Pause Command Register */ @@ -750,6 +753,16 @@ #define PCS_SCTRL_TXZ 0x0000c000 /* PLL input to Serialink */ #define PCS_SCTRL_TXP 0x00030000 /* PLL input to Serialink */ +/* Pattern Match Count register. */ +#define PAT_MATCH_CFG 0x300CUL +#define PAT_MATCH_N 0x0010UL +#define PAT_MATCH_M 0x0000UL /* Darwin source notes (0<<8) !?*/ + +/* Wake on Lan CSR Register */ +#define WOL_CSR_CFG 0x3010UL +#define WOL_ENABLE 0x0001UL +#define WOL_MODE_MII 0x0002UL + /* Shared Output Select Register. For test and debug, allows multiplexing * test outputs into the PROM address pins. Set to zero for normal * operation. From yoshfuji@linux-ipv6.org Tue Nov 9 06:57:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 06:57:23 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9EvEuw028387 for ; Tue, 9 Nov 2004 06:57:15 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id C8DFA33CE5; Tue, 9 Nov 2004 23:57:59 +0900 (JST) Date: Tue, 09 Nov 2004 09:57:59 -0500 (EST) Message-Id: <20041109.095759.109272072.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, acme@conectiva.com.br, netdev@oss.sgi.com, jgarzik@pobox.com, buytenh@wantstofly.org, yoshfuji@linux-ipv6.org Subject: Re: Bug in ipv6_ifa_notify? From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041109114839.GA1942@gondor.apana.org.au> References: <20041108121040.GA3618@gondor.apana.org.au> <20041108203741.GA993@gondor.apana.org.au> <20041109114839.GA1942@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11632 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1002 Lines: 23 In article <20041109114839.GA1942@gondor.apana.org.au> (at Tue, 9 Nov 2004 22:48:39 +1100), Herbert Xu says: > On Tue, Nov 09, 2004 at 07:37:41AM +1100, herbert wrote: > > > > Well I've found a way for this to occur, but I must say that it is > > fairly unlikely. When you bring the interface down, addrconf_ifdown > > will try to to delete the addrconf timer and then notify DELADDR. > > Since it doesn't wait for the timer to complete, it might still be > > executing. Therefore it is possible to have a NEWADDR after a DELADDR > > event. > > The attractive thing about this theory is that it is an SMP-only > race. This could explain why only Jeff/Lennert are seeing it. > > Jeff/Lennert, could you please go back to 2.6.9, and then apply > this patch? If this warning triggers, then that would confirm > this theory. I think this only happens when you shut down interface while DAD; for example, "ifup eth0 &; ifdown eth0" or something like that. --yoshfuji From jgarzik@pobox.com Tue Nov 9 07:27:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 07:27:14 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9FR83X029663 for ; Tue, 9 Nov 2004 07:27:09 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CRXtR-0005W6-UI; Tue, 09 Nov 2004 15:26:50 +0000 Message-ID: <4190E1AD.8000405@pobox.com> Date: Tue, 09 Nov 2004 10:26:37 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Michael Renzmann CC: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 0/12] Host AP update References: <20041108070156.GA1076@jm.kir.nu> <41907A06.2040702@pobox.com> <41908932.6070900@web.de> In-Reply-To: <41908932.6070900@web.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11633 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 634 Lines: 24 Michael Renzmann wrote: > Hi. > > (I cutted down the CC list.) > > Jeff Garzik wrote: > >> A key goal I have for HostAP is that portions of HostAP code should be >> bundled into a generic "lib80211" kernel module, for use by various >> low-level and "softmac" 802.11 device drivers. > > > This sentence made me curious... does that mean the efforts which > recently have been discussed here (to bring a generic 802.11 stack to > the kernel) are going to be replaced by the described goal? Or is it an > addition to Vladimir's work? Hopefully Vladmir's work will plug right in.. I hope he's still working on it! Jeff From kaber@trash.net Tue Nov 9 09:39:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 09:39:48 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9HdcKQ009911 for ; Tue, 9 Nov 2004 09:39:39 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRZxT-00063l-LW; Tue, 09 Nov 2004 18:39:07 +0100 Message-ID: <419100BB.9070300@trash.net> Date: Tue, 09 Nov 2004 18:39:07 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@znyx.com CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Clean up tcf_action_init memory handling References: <4190874E.7040202@trash.net> <1100003381.1118.53.camel@jzny.localdomain> In-Reply-To: <1100003381.1118.53.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11634 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 459 Lines: 18 Jamal Hadi Salim wrote: >Dave, > >the first patch from Patrick on u64 times is fine to apply. > >This one i need to review and i am too occupied at the moment to spend >more than a minute on it. So dont apply it. >Patrick: I would prefer such patches be sent to me first for approval >before going to Dave. Not that i question your skills (based on history >of your previous patches), it just makes me less nervous ;-> > > Fine with me. Regards Patrick From raghavendra.koushik@s2io.com Tue Nov 9 10:50:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 10:50:31 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9IoFUF012501 for ; Tue, 9 Nov 2004 10:50:16 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iA9InQje004759; Tue, 9 Nov 2004 13:49:26 -0500 (EST) Received: from rkoushik ([10.16.16.57]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id iA9InK39016733; Tue, 9 Nov 2004 13:49:21 -0500 (EST) Message-Id: <200411091849.iA9InK39016733@guinness.s2io.com> From: "Raghavendra Koushik" To: "'Krishna Kumar'" Cc: , , , Subject: RE: [PATCH 2.6.9-rc2 8/12] S2io: two buffer mode Date: Tue, 9 Nov 2004 10:49:15 -0800 MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_001A_01C4C649.C6321620" X-Mailer: Microsoft Office Outlook, Build 11.0.5510 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 In-Reply-To: Thread-Index: AcTF9RE7Fihm0YQRTfeR1dU/kvXv+wAlQuBQ X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11635 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Content-Length: 60381 Lines: 1705 This is a multi-part message in MIME format. ------=_NextPart_000_001A_01C4C649.C6321620 Content-Type: multipart/alternative; boundary="----=_NextPart_001_001B_01C4C649.C6348720" ------=_NextPart_001_001B_01C4C649.C6348720 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit You are right a check for ba[i] at the top is necessary. Also your second observation is valid, there's no chance of discontinuous chunks of memory within the ba block. Thanks Koushik _____ From: Krishna Kumar [mailto:kumarkr@us.ibm.com] Sent: Monday, November 08, 2004 4:41 PM To: raghavendra.koushik@s2io.com Cc: jgarzik@pobox.com; netdev@oss.sgi.com; raghavendra.koushik@s2io.com; ravinandan.arakali@s2io.com; romieu@fr.zoreil.com Subject: Re: [PATCH 2.6.9-rc2 8/12] S2io: two buffer mode Sorry if my mailer mangles the mail, but ... This code looks like it can cause an oops on failure to alloc cases. I havent read the code very much other than the init and the free routines. +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j = 0; j < blk_cnt; j++) { + int k = 0; + if (!nic->ba[i][j]) + continue; + while (k != MAX_RXDS_PER_BLOCK) { + buffAdd_t *ba = &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); + k++; + } + kfree(nic->ba[i][j]); + } + if (nic->ba[i]) + kfree(nic->ba[i]); + } +#endif Shouldn't this be something like (check ba[i] at the top to avoid MMU) : +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i = 0; i < config->rx_ring_num; i++) { + if (!nic->ba[i]) /* if there are no holes, we are done */ + break; + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j = 0; j < blk_cnt; j++) { + int k = 0; + if (!nic->ba[i][j]) + continue; >> Should this be a break ? Can you have holes in the middle ? + while (k != MAX_RXDS_PER_BLOCK) { + buffAdd_t *ba = &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); >> Actually if no holes are allowed, you can break out if the above pointers become >> NULL instead of iterating MAX_RXDS_PER_BLOCK (127) times. + k++; + } + kfree(nic->ba[i][j]); + } + kfree(nic->ba[i]); + } +#endif thx, - KK Inactive hide details for raghavendra.koushik@s2io.comraghavendra.koushik@s2io.com raghavendra.koushik@s2io.com Sent by: netdev-bounce@oss.sgi.com 11/08/2004 08:16 AM To jgarzik@pobox.com, romieu@fr.zoreil.com, netdev@oss.sgi.com cc ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com Subject [PATCH 2.6.9-rc2 8/12] S2io: two buffer mode Hi, Attached is the patch for implementing 2-buffer mode on Rx path. More description of this mode of operation follows. On certain systems when a DMA has to happen on an un-aligned memory location performance will take a significant hit. It's standard practice to offset the Rx buffer address by 2 (as Mac header is 14 bytes) so the IP header starts from an aligned location. Obviously using a single Rx buffer both cannot be achieved. Thus XFrame supports something called 2 buffer Rx mode, where in the Rx'ed frame is split into 2 parts, one is the Ethernet header and the other is the Ethernet payload. So now we can allocate proper aligned memory for both buffers, hence the DMA is not slowed down. Also, the Ethernet payload(starting from L3 header) is on an aligned location so OS need not have to do un-aligned accesses to process IP header. To achieve this, the kernel function eth_type_trans functionality has to be partially implemented in the driver itself. Signed-off-by: Raghavendra Koushik Signed-off-by: Ravinandan Arakali --- diff -urN vanilla-linux/drivers/net/Kconfig linux-2.6.8.1/drivers/net/Kconfig --- vanilla-linux/drivers/net/Kconfig 2004-10-06 15:15:04.000000000 -0700 +++ linux-2.6.8.1/drivers/net/Kconfig 2004-10-11 20:06:36.000000000 -0700 @@ -2267,6 +2267,17 @@ If in doubt, say N. +config 2BUFF_MODE + bool "Use 2 Buffer Mode on Rx side." + depends on S2IO + ---help--- + On enabling the 2 buffer mode, the received frame will be + split into 2 parts before being DMA'ed to the hosts memory. + The parts are the ethernet header and ethernet payload. + This is useful on systems where DMA'ing to to unaligned + physical memory loactions comes with a heavy price. + If not sure please say N. + endmenu source "drivers/net/tokenring/Kconfig" diff -urN vanilla-linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla-linux/drivers/net/s2io.c 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-10-12 16:49:27.796331624 -0700 @@ -325,6 +325,10 @@ int i, j, blk_cnt; int lst_size, lst_per_page; struct net_device *dev = nic->dev; +#ifdef CONFIG_2BUFF_MODE + u64 tmp; + buffAdd_t *ba; +#endif mac_info_t *mac_control; struct config_param *config; @@ -425,7 +429,11 @@ config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); /* Allocating all the Rx blocks */ for (j = 0; j < blk_cnt; j++) { +#ifndef CONFIG_2BUFF_MODE size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); +#else + size = SIZE_OF_BLOCK; +#endif tmp_v_addr = pci_alloc_consistent(nic->pdev, size, &tmp_p_addr); if (tmp_v_addr == NULL) { @@ -458,13 +466,60 @@ pre_rxd_blk->reserved_1 = END_OF_BLOCK; /* last RxD * marker. */ +#ifndef CONFIG_2BUFF_MODE pre_rxd_blk->reserved_2_pNext_RxD_block = (unsigned long) tmp_v_addr_next; +#endif pre_rxd_blk->pNext_RxD_Blk_physical = (u64) tmp_p_addr_next; } } +#ifdef CONFIG_2BUFF_MODE + /* + * Allocation of Storages for buffer addresses in 2BUFF mode + * and the buffers as well. + */ + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + nic->ba[i] = kmalloc((sizeof(buffAdd_t *) * blk_cnt), + GFP_KERNEL); + if (!nic->ba[i]) + return -ENOMEM; + for (j = 0; j < blk_cnt; j++) { + int k = 0; + nic->ba[i][j] = kmalloc((sizeof(buffAdd_t) * + (MAX_RXDS_PER_BLOCK + 1)), + GFP_KERNEL); + if (!nic->ba[i][j]) + return -ENOMEM; + while (k != MAX_RXDS_PER_BLOCK) { + ba = &nic->ba[i][j][k]; + + ba->ba_0_org = (void *) kmalloc + (BUF0_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_0_org) + return -ENOMEM; + tmp = (u64) ba->ba_0_org; + tmp += ALIGN_SIZE; + tmp &= ~((u64) ALIGN_SIZE); + ba->ba_0 = (void *) tmp; + + ba->ba_1_org = (void *) kmalloc + (BUF1_LEN + ALIGN_SIZE, GFP_ATOMIC); + if (!ba->ba_1_org) + return -ENOMEM; + tmp = (u64) ba->ba_1_org; + tmp += ALIGN_SIZE; + tmp &= ~((u64) ALIGN_SIZE); + ba->ba_1 = (void *) tmp; + k++; + } + } + } +#endif + /* Allocation and initialization of Statistics block */ size = sizeof(StatInfo_t); mac_control->stats_mem = pci_alloc_consistent @@ -532,7 +587,11 @@ kfree(nic->list_info[i]); } +#ifndef CONFIG_2BUFF_MODE size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t)); +#else + size = SIZE_OF_BLOCK; +#endif for (i = 0; i < config->rx_ring_num; i++) { blk_cnt = nic->block_count[i]; for (j = 0; j < blk_cnt; j++) { @@ -545,6 +604,27 @@ } } +#ifdef CONFIG_2BUFF_MODE + /* Freeing buffer storage addresses in 2BUFF mode. */ + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = + config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + for (j = 0; j < blk_cnt; j++) { + int k = 0; + if (!nic->ba[i][j]) + continue; + while (k != MAX_RXDS_PER_BLOCK) { + buffAdd_t *ba = &nic->ba[i][j][k]; + kfree(ba->ba_0_org); + kfree(ba->ba_1_org); + k++; + } + kfree(nic->ba[i][j]); + } + if (nic->ba[i]) + kfree(nic->ba[i]); + } +#endif if (mac_control->stats_mem) { pci_free_consistent(nic->pdev, @@ -1366,10 +1446,21 @@ &bar0->prc_rxd0_n[i]); val64 = readq(&bar0->prc_ctrl_n[i]); +#ifndef CONFIG_2BUFF_MODE val64 |= PRC_CTRL_RC_ENABLED; +#else + val64 |= PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3; +#endif writeq(val64, &bar0->prc_ctrl_n[i]); } +#ifdef CONFIG_2BUFF_MODE + /* Enabling 2 buffer mode by writing into Rx_pa_cfg reg. */ + val64 = readq(&bar0->rx_pa_cfg); + val64 |= RX_PA_CFG_IGNORE_L2_ERR; + writeq(val64, &bar0->rx_pa_cfg); +#endif + /* * Enabling MC-RLDRAM. After enabling the device, we timeout * for around 100ms, which is approximately the time required @@ -1437,6 +1528,12 @@ } /* + * Don't see link state interrupts on certain switches, so + * directly scheduling a link state task from here. + */ + schedule_work(&nic->set_link_task); + + /* * Here we are performing soft reset on XGXS to * force link down. Since link is already up, we will get * link state change interrupt after this reset @@ -1565,6 +1662,13 @@ atomic_read(&nic->rx_bufs_left[ring_no]); mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + RxD_t *rxdpnext; + int nextblk; + u64 tmp; + buffAdd_t *ba; + dma_addr_t rxdpphys; +#endif #ifndef CONFIG_S2IO_NAPI unsigned long flags; #endif @@ -1589,10 +1693,14 @@ block_index; off = mac_control->rx_curr_put_info[ring_no].offset; off1 = mac_control->rx_curr_get_info[ring_no].offset; +#ifndef CONFIG_2BUFF_MODE offset = block_no * (MAX_RXDS_PER_BLOCK + 1) + off; offset1 = block_no1 * (MAX_RXDS_PER_BLOCK + 1) + off1; +#else offset = block_no * (MAX_RXDS_PER_BLOCK) + off; offset1 = block_no1 * (MAX_RXDS_PER_BLOCK) + off1; +#endif + rxdp = nic->rx_blocks[ring_no][block_no]. block_virt_addr + off; if ((offset == offset1) && (rxdp->Host_Control)) { @@ -1600,6 +1708,7 @@ DBG_PRINT(INTR_DBG, " info equated\n"); goto end; } +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 == END_OF_BLOCK) { mac_control->rx_curr_put_info[ring_no]. block_index++; @@ -1617,23 +1726,81 @@ } #ifndef CONFIG_S2IO_NAPI spin_lock_irqsave(&nic->put_lock, flags); + nic->put_pos[ring_no] = + (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off; + spin_unlock_irqrestore(&nic->put_lock, flags); +#endif +#else + if (rxdp->Host_Control == END_OF_BLOCK) { + mac_control->rx_curr_put_info[ring_no]. + block_index++; + mac_control->rx_curr_put_info[ring_no]. + block_index %= nic->block_count[ring_no]; + block_no = mac_control->rx_curr_put_info + [ring_no].block_index; + off = 0; + DBG_PRINT(INTR_DBG, "%s: block%d at: 0x%llx\n", + dev->name, block_no, + (unsigned long long) rxdp->Control_1); + mac_control->rx_curr_put_info[ring_no].offset = + off; + rxdp = nic->rx_blocks[ring_no][block_no]. + block_virt_addr; + } +#ifndef CONFIG_S2IO_NAPI + spin_lock_irqsave(&nic->put_lock, flags); nic->put_pos[ring_no] = (block_no * (MAX_RXDS_PER_BLOCK + 1)) + off; spin_unlock_irqrestore(&nic->put_lock, flags); #endif +#endif - if (rxdp->Control_1 & RXD_OWN_XENA) { +#ifndef CONFIG_2BUFF_MODE + if (rxdp->Control_1 & RXD_OWN_XENA) +#else + if (rxdp->Control_2 & BIT(0)) +#endif + { mac_control->rx_curr_put_info[ring_no]. offset = off; goto end; } +#ifdef CONFIG_2BUFF_MODE + /* + * RxDs Spanning cache lines will be replenished only + * if the succeeding RxD is also owned by Host. It + * will always be the ((8*i)+3) and ((8*i)+6) + * descriptors for the 48 byte descriptor. The offending + * decsriptor is of-course the 3rd descriptor. + */ + rxdpphys = nic->rx_blocks[ring_no][block_no]. + block_dma_addr + (off * sizeof(RxD_t)); + if (((u64) (rxdpphys)) % 128 > 80) { + rxdpnext = nic->rx_blocks[ring_no][block_no]. + block_virt_addr + (off + 1); + if (rxdpnext->Host_Control == END_OF_BLOCK) { + nextblk = (block_no + 1) % + (nic->block_count[ring_no]); + rxdpnext = nic->rx_blocks[ring_no] + [nextblk].block_virt_addr; + } + if (rxdpnext->Control_2 & BIT(0)) + goto end; + } +#endif +#ifndef CONFIG_2BUFF_MODE skb = dev_alloc_skb(size + NET_IP_ALIGN); +#else + skb = dev_alloc_skb(dev->mtu + ALIGN_SIZE + + /*BUF0_LEN + */ 22); +#endif if (!skb) { DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); return -ENOMEM; } +#ifndef CONFIG_2BUFF_MODE skb_reserve(skb, NET_IP_ALIGN); memset(rxdp, 0, sizeof(RxD_t)); rxdp->Buffer0_ptr = pci_map_single @@ -1645,6 +1812,33 @@ off++; off %= (MAX_RXDS_PER_BLOCK + 1); mac_control->rx_curr_put_info[ring_no].offset = off; +#else + ba = &nic->ba[ring_no][block_no][off]; + tmp = (u64) skb->data; + tmp += ALIGN_SIZE; + tmp &= ~ALIGN_SIZE; + skb->data = (void *) tmp; + + memset(rxdp, 0, sizeof(RxD_t)); + rxdp->Buffer2_ptr = pci_map_single + (nic->pdev, skb->data, dev->mtu + 22, + PCI_DMA_FROMDEVICE); + rxdp->Buffer0_ptr = + pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, + PCI_DMA_FROMDEVICE); + rxdp->Buffer1_ptr = + pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, + PCI_DMA_FROMDEVICE); + + rxdp->Control_2 = SET_BUFFER2_SIZE(dev->mtu + 22); + rxdp->Control_2 |= SET_BUFFER0_SIZE(BUF0_LEN); + rxdp->Control_2 |= SET_BUFFER1_SIZE(1); /* dummy. */ + rxdp->Control_2 |= BIT(0); /* Set Buffer_Empty bit. */ + rxdp->Host_Control = (u64) ((unsigned long) (skb)); + rxdp->Control_1 |= RXD_OWN_XENA; + off++; + mac_control->rx_curr_put_info[ring_no].offset = off; +#endif atomic_inc(&nic->rx_bufs_left[ring_no]); alloc_tab++; } @@ -1670,6 +1864,9 @@ struct sk_buff *skb; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &sp->mac_control; config = &sp->config; @@ -1679,6 +1876,7 @@ off = j % (MAX_RXDS_PER_BLOCK + 1); rxdp = sp->rx_blocks[i][blk].block_virt_addr + off; +#ifndef CONFIG_2BUFF_MODE if (rxdp->Control_1 == END_OF_BLOCK) { rxdp = (RxD_t *) ((unsigned long) rxdp-> @@ -1686,6 +1884,12 @@ j++; blk++; } +#else + if (rxdp->Host_Control == END_OF_BLOCK) { + blk++; + continue; + } +#endif if (!(rxdp->Control_1 & RXD_OWN_XENA)) { memset(rxdp, 0, sizeof(RxD_t)); @@ -1696,6 +1900,7 @@ (struct sk_buff *) ((unsigned long) rxdp-> Host_Control); if (skb) { +#ifndef CONFIG_2BUFF_MODE pci_unmap_single(sp->pdev, (dma_addr_t) rxdp->Buffer0_ptr, dev->mtu + @@ -1703,6 +1908,21 @@ + HEADER_802_2_SIZE + HEADER_SNAP_SIZE, PCI_DMA_FROMDEVICE); +#else + ba = &sp->ba[i][blk][off]; + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, + PCI_DMA_FROMDEVICE); + pci_unmap_single(sp->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); +#endif dev_kfree_skb(skb); atomic_dec(&sp->rx_bufs_left[i]); buf_cnt++; @@ -1741,11 +1961,16 @@ register u64 val64 = 0; rx_curr_get_info_t get_info, put_info; int i, get_block, put_block, get_offset, put_offset, ring_bufs; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif struct sk_buff *skb; RxD_t *rxdp; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &nic->mac_control; config = &nic->config; @@ -1764,6 +1989,7 @@ ring_bufs = config->rx_cfg[i].num_rxd; rxdp = nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + get_info.offset; put_offset = (put_block * (MAX_RXDS_PER_BLOCK + 1)) + @@ -1820,6 +2046,66 @@ mac_control->rx_curr_get_info[i].offset = get_info.offset; } +#else + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + put_offset = (put_block * (MAX_RXDS_PER_BLOCK + 1)) + + put_info.offset; + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) != put_offset)) { + if (--pkts_to_process < 0) { + goto no_rx; + } + skb = (struct sk_buff *) ((unsigned long) + rxdp->Host_Control); + if (skb == NULL) { + DBG_PRINT(ERR_DBG, "%s: The skb is ", + dev->name); + DBG_PRINT(ERR_DBG, "Null in Rx Intr\n"); + goto no_rx; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); + ba = &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset = + get_info.offset; + rxdp = + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset = 0; + mac_control->rx_curr_get_info[i]. + offset = get_info.offset; + get_block++; + get_block %= nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index = get_block; + rxdp = + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + pkt_cnt++; + } +#endif } if (!pkt_cnt) pkt_cnt = 1; @@ -1873,12 +2159,17 @@ rx_curr_get_info_t get_info, put_info; RxD_t *rxdp; struct sk_buff *skb; +#ifndef CONFIG_2BUFF_MODE u16 val16, cksum; +#endif register u64 val64 = 0; int get_block, get_offset, put_block, put_offset, ring_bufs; int i, pkt_cnt = 0; mac_info_t *mac_control; struct config_param *config; +#ifdef CONFIG_2BUFF_MODE + buffAdd_t *ba; +#endif mac_control = &nic->mac_control; config = &nic->config; @@ -1898,6 +2189,7 @@ ring_bufs = config->rx_cfg[i].num_rxd; rxdp = nic->rx_blocks[i][get_block].block_virt_addr + get_info.offset; +#ifndef CONFIG_2BUFF_MODE get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + get_info.offset; spin_lock(&nic->put_lock); @@ -1953,6 +2245,67 @@ && (pkt_cnt > indicate_max_pkts)) break; } +#else + get_offset = (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + spin_lock(&nic->put_lock); + put_offset = nic->put_pos[i]; + spin_unlock(&nic->put_lock); + while (((!(rxdp->Control_1 & RXD_OWN_XENA)) && + !(rxdp->Control_2 & BIT(0))) && + (((get_offset + 1) % ring_bufs) != put_offset)) { + skb = (struct sk_buff *) ((unsigned long) + rxdp->Host_Control); + if (skb == NULL) { + DBG_PRINT(ERR_DBG, "%s: The skb is ", + dev->name); + DBG_PRINT(ERR_DBG, "Null in Rx Intr\n"); + return; + } + + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer0_ptr, + BUF0_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer1_ptr, + BUF1_LEN, PCI_DMA_FROMDEVICE); + pci_unmap_single(nic->pdev, (dma_addr_t) + rxdp->Buffer2_ptr, + dev->mtu + 22, + PCI_DMA_FROMDEVICE); + ba = &nic->ba[i][get_block][get_info.offset]; + + rx_osm_handler(nic, rxdp, i, ba); + + get_info.offset++; + mac_control->rx_curr_get_info[i].offset = + get_info.offset; + rxdp = + nic->rx_blocks[i][get_block].block_virt_addr + + get_info.offset; + + if (get_info.offset && + (!(get_info.offset % MAX_RXDS_PER_BLOCK))) { + get_info.offset = 0; + mac_control->rx_curr_get_info[i]. + offset = get_info.offset; + get_block++; + get_block %= nic->block_count[i]; + mac_control->rx_curr_get_info[i]. + block_index = get_block; + rxdp = + nic->rx_blocks[i][get_block]. + block_virt_addr; + } + get_offset = + (get_block * (MAX_RXDS_PER_BLOCK + 1)) + + get_info.offset; + pkt_cnt++; + if ((indicate_max_pkts) + && (pkt_cnt > indicate_max_pkts)) + break; + } +#endif if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts)) break; } @@ -4096,12 +4449,21 @@ * Return value: * SUCCESS on success and -1 on failure. */ +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no) +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba) +#endif { struct net_device *dev = (struct net_device *) sp->dev; struct sk_buff *skb = (struct sk_buff *) ((unsigned long) rxdp->Host_Control); u16 l3_csum, l4_csum; +#ifdef CONFIG_2BUFF_MODE + int buf0_len, buf2_len; + struct ethhdr *eth = (struct ethhdr *) ba->ba_0; +#endif l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1); if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->rx_csum)) { @@ -4129,10 +4491,32 @@ DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", dev->name, err); } +#ifdef CONFIG_2BUFF_MODE + buf0_len = RXD_GET_BUFFER0_SIZE(rxdp->Control_2); + buf2_len = RXD_GET_BUFFER2_SIZE(rxdp->Control_2); +#endif skb->dev = dev; +#ifndef CONFIG_2BUFF_MODE skb_put(skb, len); skb->protocol = eth_type_trans(skb, dev); +#else + skb_put(skb, buf2_len); + /* + * Reproducing eth_type_trans functionality and running + * on the ethernet header 'eth' stripped and given to us + * by the hardware in 2Buff mode. + */ + if (*eth->h_dest & 1) { + if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN)) + skb->pkt_type = PACKET_BROADCAST; + else + skb->pkt_type = PACKET_MULTICAST; + } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) { + skb->pkt_type = PACKET_OTHERHOST; + } + skb->protocol = eth->h_proto; +#endif #ifdef CONFIG_S2IO_NAPI netif_receive_skb(skb); @@ -4143,7 +4527,11 @@ dev->last_rx = jiffies; sp->rx_pkt_count++; sp->stats.rx_packets++; +#ifndef CONFIG_2BUFF_MODE sp->stats.rx_bytes += len; +#else + sp->stats.rx_bytes += buf0_len + buf2_len; +#endif atomic_dec(&sp->rx_bufs_left[ring_no]); rxdp->Host_Control = 0; diff -urN vanilla-linux/drivers/net/s2io.h linux-2.6.8.1/drivers/net/s2io.h --- vanilla-linux/drivers/net/s2io.h 2004-10-11 21:21:49.000000000 -0700 +++ linux-2.6.8.1/drivers/net/s2io.h 2004-10-11 21:22:23.000000000 -0700 @@ -466,19 +466,46 @@ #define RXD_GET_L4_CKSUM(val) ((u16)(val) & 0xFFFF) u64 Control_2; +#ifndef CONFIG_2BUFF_MODE #define MASK_BUFFER0_SIZE vBIT(0xFFFF,0,16) #define SET_BUFFER0_SIZE(val) vBIT(val,0,16) +#else +#define MASK_BUFFER0_SIZE vBIT(0xFF,0,16) +#define MASK_BUFFER1_SIZE vBIT(0xFFFF,16,16) +#define MASK_BUFFER2_SIZE vBIT(0xFFFF,32,16) +#define SET_BUFFER0_SIZE(val) vBIT(val,8,8) +#define SET_BUFFER1_SIZE(val) vBIT(val,16,16) +#define SET_BUFFER2_SIZE(val) vBIT(val,32,16) +#endif + #define MASK_VLAN_TAG vBIT(0xFFFF,48,16) #define SET_VLAN_TAG(val) vBIT(val,48,16) #define SET_NUM_TAG(val) vBIT(val,16,32) +#ifndef CONFIG_2BUFF_MODE #define RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 & vBIT(0xFFFF,0,16))) +#else +#define RXD_GET_BUFFER0_SIZE(Control_2) (u8)((Control_2 & MASK_BUFFER0_SIZE) \ + >> 48) +#define RXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER1_SIZE) \ + >> 32) +#define RXD_GET_BUFFER2_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER2_SIZE) \ + >> 16) +#define BUF0_LEN 40 +#define BUF1_LEN 1 +#endif + u64 Buffer0_ptr; +#ifdef CONFIG_2BUFF_MODE + u64 Buffer1_ptr; + u64 Buffer2_ptr; +#endif } RxD_t; /* Structure that represents the Rx descriptor block which contains * 128 Rx descriptors. */ +#ifndef CONFIG_2BUFF_MODE typedef struct _RxD_block { #define MAX_RXDS_PER_BLOCK 127 RxD_t rxd[MAX_RXDS_PER_BLOCK]; @@ -492,6 +519,27 @@ * the upper 32 bits should * be 0 */ } RxD_block_t; +#else +typedef struct _RxD_block { +#define MAX_RXDS_PER_BLOCK 85 + RxD_t rxd[MAX_RXDS_PER_BLOCK]; + +#define END_OF_BLOCK 0xFEFFFFFFFFFFFFFFULL + u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF to mark last Rxd + * in this blk */ + u64 pNext_RxD_Blk_physical; /* Phy ponter to next blk. */ +} RxD_block_t; +#define SIZE_OF_BLOCK 4096 + +/* Structure to hold virtual addresses of Buf0 and Buf1 in + * 2buf mode. */ +typedef struct bufAdd { + void *ba_0_org; + void *ba_1_org; + void *ba_0; + void *ba_1; +} buffAdd_t; +#endif /* Structure which stores all the MAC control parameters */ @@ -677,6 +725,10 @@ #define LINK_DOWN 1 #define LINK_UP 2 +#ifdef CONFIG_2BUFF_MODE + /* Buffer Address store. */ + buffAdd_t **ba[MAX_RX_RINGS]; +#endif int task_flag; } nic_t; @@ -802,7 +854,12 @@ static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tasklet(unsigned long dev_addr); static void s2io_set_multicast(struct net_device *dev); +#ifndef CONFIG_2BUFF_MODE static int rx_osm_handler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no); +#else +static int rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no, + buffAdd_t * ba); +#endif void s2io_link(nic_t * sp, int link); void s2io_reset(nic_t * sp); #ifdef CONFIG_S2IO_NAPI ------=_NextPart_001_001B_01C4C649.C6348720 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

You are right a check for ba[i] at the top is = necessary. Also your second observation
is valid, there's no chance of discontinuous = chunks=20 of memory  within the ba block. 
 
Thanks
Koushik
 


From: Krishna Kumar=20 [mailto:kumarkr@us.ibm.com]
Sent: Monday, November 08, 2004 = 4:41=20 PM
To: raghavendra.koushik@s2io.com
Cc: = jgarzik@pobox.com;=20 netdev@oss.sgi.com; raghavendra.koushik@s2io.com; = ravinandan.arakali@s2io.com;=20 romieu@fr.zoreil.com
Subject: Re: [PATCH 2.6.9-rc2 8/12] = S2io: two=20 buffer mode

Sorry if my mailer mangles the mail, but ...

This code looks = like it=20 can cause an oops on failure to alloc cases. I havent read the code = very much=20 other than the
init and the free routines.

+#ifdef=20 CONFIG_2BUFF_MODE
+ /* Freeing buffer storage addresses in 2BUFF = mode.=20 */
+ for (i =3D 0; i < config->rx_ring_num; i++) {
+ = blk_cnt =3D
+=20     config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + = 1);
+=20 for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ if=20 (!nic->ba[i][j])
+ continue;
+ while (k !=3D = MAX_RXDS_PER_BLOCK) {
+=20 buffAdd_t *ba =3D &nic->ba[i][j][k];
+ = kfree(ba->ba_0_org);
+=20 kfree(ba->ba_1_org);
+ k++;
+ }
+ = kfree(nic->ba[i][j]);
+=20 }
+ if (nic->ba[i])
+ kfree(nic->ba[i]);
+=20 }
+#endif


Shouldn't this be something like (check ba[i] = at the=20 top to avoid MMU) :

+#ifdef CONFIG_2BUFF_MODE
+ /* = Freeing=20 buffer storage addresses in 2BUFF mode. */
+ for (i =3D 0; i <=20 config->rx_ring_num; i++) {

+ if (!nic->ba[i]) /* if = there=20 are no holes, we are done */
+ break;
+ blk_cnt = =3D
+  =20   config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1);
+ = for (j =3D=20 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ if = (!nic->ba[i][j])
+=20 continue;

>> Should this be a break ? Can you have = holes in=20 the middle ?
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ = buffAdd_t=20 *ba =3D &nic->ba[i][j][k];
+ kfree(ba->ba_0_org);
+=20 kfree(ba->ba_1_org);

>> Actually if no holes are = allowed,=20 you can break out if the above pointers become
>> = NULL=20 instead of iterating MAX_RXDS_PER_BLOCK (127) times.
+ k++;
+ = }
+=20 kfree(nic->ba[i][j]);
+ }
+ kfree(nic->ba[i]);
+=20 }
+#endif


thx,

- KK

3D"Inactiveraghavendra.koushik@s2io.com


          raghavendra.koushik@s2io.com
          Sent by:=20 netdev-bounce@oss.sgi.com=20

          11/08/2004 08:16 = AM

3D""=20
To
3D""=20
jgarzik@pobox.com, romieu@fr.zoreil.com,=20 netdev@oss.sgi.com
3D""=20
cc
3D""=20
ravinandan.arakali@s2io.com,=20 raghavendra.koushik@s2io.com
3D""=20
Subject
3D""=20
[PATCH 2.6.9-rc2 8/12] S2io: two buffer=20 mode
3D""=20 3D""=20

Hi= ,
Attached=20 is the patch for implementing 2-buffer mode on Rx path.
More = description of=20 this mode of operation follows.

On certain systems when a DMA = has to=20 happen on an un-aligned memory location performance will take a = significant=20 hit. It's standard
practice to offset the Rx buffer address by 2 = (as Mac=20 header is 14 bytes) so the IP header starts from an aligned=20 location.
Obviously using a single Rx buffer both cannot be = achieved. Thus=20 XFrame supports something called 2 buffer Rx mode, where in = the
Rx'ed frame=20 is split into 2 parts, one is the Ethernet header and the other is the = Ethernet payload. So now we can allocate proper
aligned memory for = both=20 buffers, hence the DMA is not slowed down. Also, the Ethernet = payload(starting=20 from L3 header) is on an
aligned location so OS need not have to do = un-aligned accesses to process IP header. To achieve this, the kernel=20 function
eth_type_trans functionality has to be partially = implemented in=20 the driver itself.

Signed-off-by: Raghavendra Koushik=20 <raghavendra.koushik@s2io.com>
Signed-off-by: Ravinandan = Arakali=20 <ravinandan.arakali@s2io.com>
---
diff -urN=20 vanilla-linux/drivers/net/Kconfig = linux-2.6.8.1/drivers/net/Kconfig
---=20 vanilla-linux/drivers/net/Kconfig 2004-10-06 15:15:04.000000000 = -0700
+++=20 linux-2.6.8.1/drivers/net/Kconfig 2004-10-11 20:06:36.000000000 = -0700
@@=20 -2267,6 +2267,17 @@

  If in doubt, say N.

+config=20 2BUFF_MODE
+ bool "Use 2 Buffer Mode on Rx side."
+ depends on = S2IO
+=20 ---help---
+ On enabling the 2 buffer mode, the received frame will = be
+=20 split into 2 parts before being DMA'ed to the hosts memory.
+ The = parts are=20 the ethernet header and ethernet payload.
+ This is useful on = systems=20 where DMA'ing to to unaligned
+ physical memory loactions comes = with a=20 heavy price.
+ If not sure please say = N.
+
endmenu

source=20 "drivers/net/tokenring/Kconfig"
diff -urN = vanilla-linux/drivers/net/s2io.c=20 linux-2.6.8.1/drivers/net/s2io.c
--- = vanilla-linux/drivers/net/s2io.c=20 2004-10-11 21:21:49.000000000 -0700
+++ = linux-2.6.8.1/drivers/net/s2io.c=20 2004-10-12 16:49:27.796331624 -0700
@@ -325,6 +325,10 @@
int i, = j,=20 blk_cnt;
int lst_size, lst_per_page;
struct net_device *dev =3D=20 nic->dev;
+#ifdef CONFIG_2BUFF_MODE
+ u64 tmp;
+ buffAdd_t = *ba;
+#endif

mac_info_t *mac_control;
struct config_param = *config;
@@ -425,7 +429,11 @@
    = config->rx_cfg[i].num_rxd=20 / (MAX_RXDS_PER_BLOCK + 1);
/*  Allocating all the Rx blocks = */
for=20 (j =3D 0; j < blk_cnt; j++) {
+#ifndef CONFIG_2BUFF_MODE
size = =3D=20 (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t));
+#else
+ size =3D=20 SIZE_OF_BLOCK;
+#endif
tmp_v_addr =3D = pci_alloc_consistent(nic->pdev,=20 size,
  &tmp_p_addr);
if (tmp_v_addr =3D=3D NULL) = {
@@ -458,13=20 +466,60 @@
pre_rxd_blk->reserved_1 =3D END_OF_BLOCK; /* last RxD =
 * marker.
 */
+#ifndef=20 CONFIG_2BUFF_MODE
pre_rxd_blk->reserved_2_pNext_RxD_block = =3D
 =20   (unsigned long)=20 tmp_v_addr_next;
+#endif
pre_rxd_blk->pNext_RxD_Blk_physical=20 =3D
    (u64) tmp_p_addr_next;
}
}

+#ifdef=20 CONFIG_2BUFF_MODE
+ /*
+  * Allocation of Storages for = buffer=20 addresses in 2BUFF mode
+  * and the buffers as well.
+=20  */
+ for (i =3D 0; i < config->rx_ring_num; i++) {
+ = blk_cnt=20 =3D
+     config->rx_cfg[i].num_rxd / = (MAX_RXDS_PER_BLOCK +=20 1);
+ nic->ba[i] =3D kmalloc((sizeof(buffAdd_t *) * = blk_cnt),
+  =20    GFP_KERNEL);
+ if (!nic->ba[i])
+ return = -ENOMEM;
+=20 for (j =3D 0; j < blk_cnt; j++) {
+ int k =3D 0;
+ = nic->ba[i][j] =3D=20 kmalloc((sizeof(buffAdd_t) *
+  (MAX_RXDS_PER_BLOCK + = 1)),
+=20 GFP_KERNEL);
+ if (!nic->ba[i][j])
+ return -ENOMEM;
+ = while (k !=3D=20 MAX_RXDS_PER_BLOCK) {
+ ba =3D &nic->ba[i][j][k];
+
+=20 ba->ba_0_org =3D (void *) kmalloc
+     (BUF0_LEN + = ALIGN_SIZE,=20 GFP_ATOMIC);
+ if (!ba->ba_0_org)
+ return -ENOMEM;
+ tmp = =3D (u64)=20 ba->ba_0_org;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D ~((u64)=20 ALIGN_SIZE);
+ ba->ba_0 =3D (void *) tmp;
+
+ = ba->ba_1_org =3D=20 (void *) kmalloc
+     (BUF1_LEN + ALIGN_SIZE, = GFP_ATOMIC);
+=20 if (!ba->ba_1_org)
+ return -ENOMEM;
+ tmp =3D (u64)=20 ba->ba_1_org;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D ~((u64)=20 ALIGN_SIZE);
+ ba->ba_1 =3D (void *) tmp;
+ k++;
+ }
+ = }
+=20 }
+#endif
+
/* Allocation and initialization of Statistics = block=20 */
size =3D sizeof(StatInfo_t);
mac_control->stats_mem =3D=20 pci_alloc_consistent
@@ -532,7 +587,11=20 @@
kfree(nic->list_info[i]);
}

+#ifndef=20 CONFIG_2BUFF_MODE
size =3D (MAX_RXDS_PER_BLOCK + 1) *=20 (sizeof(RxD_t));
+#else
+ size =3D = SIZE_OF_BLOCK;
+#endif
for (i =3D=20 0; i < config->rx_ring_num; i++) {
blk_cnt =3D=20 nic->block_count[i];
for (j =3D 0; j < blk_cnt; j++) {
@@ = -545,6=20 +604,27 @@
}
}

+#ifdef CONFIG_2BUFF_MODE
+ /* Freeing = buffer=20 storage addresses in 2BUFF mode. */
+ for (i =3D 0; i <=20 config->rx_ring_num; i++) {
+ blk_cnt =3D
+    =20 config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1);
+ for (j = =3D 0; j=20 < blk_cnt; j++) {
+ int k =3D 0;
+ if = (!nic->ba[i][j])
+=20 continue;
+ while (k !=3D MAX_RXDS_PER_BLOCK) {
+ buffAdd_t *ba = =3D=20 &nic->ba[i][j][k];
+ kfree(ba->ba_0_org);
+=20 kfree(ba->ba_1_org);
+ k++;
+ }
+ = kfree(nic->ba[i][j]);
+=20 }
+ if (nic->ba[i])
+ kfree(nic->ba[i]);
+=20 }
+#endif

if (mac_control->stats_mem)=20 {
pci_free_consistent(nic->pdev,
@@ -1366,10 +1446,21 = @@
 =20      &bar0->prc_rxd0_n[i]);

val64 =3D=20 readq(&bar0->prc_ctrl_n[i]);
+#ifndef = CONFIG_2BUFF_MODE
val64 |=3D=20 PRC_CTRL_RC_ENABLED;
+#else
+ val64 |=3D PRC_CTRL_RC_ENABLED |=20 PRC_CTRL_RING_MODE_3;
+#endif
writeq(val64,=20 &bar0->prc_ctrl_n[i]);
}

+#ifdef = CONFIG_2BUFF_MODE
+ /*=20 Enabling 2 buffer mode by writing into Rx_pa_cfg reg. */
+ val64 = =3D=20 readq(&bar0->rx_pa_cfg);
+ val64 |=3D = RX_PA_CFG_IGNORE_L2_ERR;
+=20 writeq(val64, &bar0->rx_pa_cfg);
+#endif
+
/* =
 *=20 Enabling MC-RLDRAM. After enabling the device, we timeout
 * = for=20 around 100ms, which is approximately the time required
@@ -1437,6 = +1528,12=20 @@
}

/*
+  * Don't see link state interrupts on = certain=20 switches, so
+  * directly scheduling a link state task from=20 here.
+  */
+ = schedule_work(&nic->set_link_task);
+
+=20 /*
 * Here we are performing soft reset on XGXS to =
 * force=20 link down. Since link is already up, we will get
 * link state = change=20 interrupt after this reset
@@ -1565,6 +1662,13 @@
   =20 atomic_read(&nic->rx_bufs_left[ring_no]);
mac_info_t=20 *mac_control;
struct config_param *config;
+#ifdef=20 CONFIG_2BUFF_MODE
+ RxD_t *rxdpnext;
+ int nextblk;
+ u64 = tmp;
+=20 buffAdd_t *ba;
+ dma_addr_t rxdpphys;
+#endif
#ifndef=20 CONFIG_S2IO_NAPI
unsigned long flags;
#endif
@@ -1589,10 = +1693,14=20 @@
    block_index;
off =3D=20 mac_control->rx_curr_put_info[ring_no].offset;
off1 =3D=20 mac_control->rx_curr_get_info[ring_no].offset;
+#ifndef=20 CONFIG_2BUFF_MODE
offset =3D block_no * (MAX_RXDS_PER_BLOCK + 1) +=20 off;
offset1 =3D block_no1 * (MAX_RXDS_PER_BLOCK + 1) +=20 off1;
+#else
offset =3D block_no * (MAX_RXDS_PER_BLOCK) + = off;
offset1=20 =3D block_no1 * (MAX_RXDS_PER_BLOCK) + off1;
+#endif
+
rxdp = =3D=20 nic->rx_blocks[ring_no][block_no].
    block_virt_addr = +=20 off;
if ((offset =3D=3D offset1) && = (rxdp->Host_Control)) {
@@=20 -1600,6 +1708,7 @@
DBG_PRINT(INTR_DBG, " info equated\n");
goto=20 end;
}
+#ifndef CONFIG_2BUFF_MODE
if (rxdp->Control_1 = =3D=3D=20 END_OF_BLOCK) = {
mac_control->rx_curr_put_info[ring_no].
   =20 block_index++;
@@ -1617,23 +1726,81 @@
}
#ifndef=20 CONFIG_S2IO_NAPI
spin_lock_irqsave(&nic->put_lock, = flags);
+=20 nic->put_pos[ring_no] =3D
+     (block_no * = (MAX_RXDS_PER_BLOCK=20 + 1)) + off;
+ spin_unlock_irqrestore(&nic->put_lock,=20 flags);
+#endif
+#else
+ if (rxdp->Host_Control =3D=3D = END_OF_BLOCK)=20 {
+ mac_control->rx_curr_put_info[ring_no].
+    =20 block_index++;
+ mac_control->rx_curr_put_info[ring_no].
+ =  =20   block_index %=3D nic->block_count[ring_no];
+ block_no = =3D=20 mac_control->rx_curr_put_info
+    =20 [ring_no].block_index;
+ off =3D 0;
+ DBG_PRINT(INTR_DBG, "%s: = block%d at:=20 0x%llx\n",
+   dev->name, block_no,
+   (unsigned = long=20 long) rxdp->Control_1);
+=20 mac_control->rx_curr_put_info[ring_no].offset =3D
+   =  =20 off;
+ rxdp =3D nic->rx_blocks[ring_no][block_no].
+   =  =20 block_virt_addr;
+ }
+#ifndef CONFIG_S2IO_NAPI
+=20 spin_lock_irqsave(&nic->put_lock, = flags);
nic->put_pos[ring_no] =3D=20 (block_no *
 (MAX_RXDS_PER_BLOCK + 1)) +=20 off;
spin_unlock_irqrestore(&nic->put_lock,=20 flags);
#endif
+#endif

- if (rxdp->Control_1 &=20 RXD_OWN_XENA) {
+#ifndef CONFIG_2BUFF_MODE
+ if = (rxdp->Control_1=20 & RXD_OWN_XENA)
+#else
+ if (rxdp->Control_2 &=20 BIT(0))
+#endif
+=20 {
mac_control->rx_curr_put_info[ring_no].
    = offset =3D=20 off;
goto end;
}
+#ifdef CONFIG_2BUFF_MODE
+ /*
+ =  * RxDs=20 Spanning cache lines will be replenished only
+  * if the = succeeding=20 RxD is also owned by Host. It
+  * will always be the = ((8*i)+3) and=20 ((8*i)+6)
+  * descriptors for the 48 byte descriptor. The = offending=20
+  * decsriptor is of-course the 3rd descriptor.
+ =  */
+=20 rxdpphys =3D nic->rx_blocks[ring_no][block_no].
+    =20 block_dma_addr + (off * sizeof(RxD_t));
+ if (((u64) (rxdpphys)) % = 128 >=20 80) {
+ rxdpnext =3D nic->rx_blocks[ring_no][block_no].
+ =    =20 block_virt_addr + (off + 1);
+ if (rxdpnext->Host_Control =3D=3D = END_OF_BLOCK) {
+ nextblk =3D (block_no + 1) %
+    =20 (nic->block_count[ring_no]);
+ rxdpnext =3D=20 nic->rx_blocks[ring_no]
+     = [nextblk].block_virt_addr;
+=20 }
+ if (rxdpnext->Control_2 & BIT(0))
+ goto end;
+=20 }
+#endif

+#ifndef CONFIG_2BUFF_MODE
skb =3D = dev_alloc_skb(size +=20 NET_IP_ALIGN);
+#else
+ skb =3D dev_alloc_skb(dev->mtu + = ALIGN_SIZE=20 +
+     /*BUF0_LEN + */ 22);
+#endif
if (!skb)=20 {
DBG_PRINT(ERR_DBG, "%s: Out of ", = dev->name);
DBG_PRINT(ERR_DBG,=20 "memory to allocate SKBs\n");
return -ENOMEM;
}
+#ifndef=20 CONFIG_2BUFF_MODE
skb_reserve(skb, NET_IP_ALIGN);
memset(rxdp, = 0,=20 sizeof(RxD_t));
rxdp->Buffer0_ptr =3D pci_map_single
@@ = -1645,6=20 +1812,33 @@
off++;
off %=3D (MAX_RXDS_PER_BLOCK +=20 1);
mac_control->rx_curr_put_info[ring_no].offset =3D = off;
+#else
+=20 ba =3D &nic->ba[ring_no][block_no][off];
+ tmp =3D (u64)=20 skb->data;
+ tmp +=3D ALIGN_SIZE;
+ tmp &=3D = ~ALIGN_SIZE;
+=20 skb->data =3D (void *) tmp;
+
+ memset(rxdp, 0, = sizeof(RxD_t));
+=20 rxdp->Buffer2_ptr =3D pci_map_single
+     = (nic->pdev,=20 skb->data, dev->mtu + 22,
+    =20  PCI_DMA_FROMDEVICE);
+ rxdp->Buffer0_ptr =3D
+   =  =20 pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN,
+  =20  PCI_DMA_FROMDEVICE);
+ rxdp->Buffer1_ptr =3D
+   =  =20 pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN,
+  =20  PCI_DMA_FROMDEVICE);
+
+ rxdp->Control_2 =3D=20 SET_BUFFER2_SIZE(dev->mtu + 22);
+ rxdp->Control_2 |=3D=20 SET_BUFFER0_SIZE(BUF0_LEN);
+ rxdp->Control_2 |=3D = SET_BUFFER1_SIZE(1); /*=20 dummy. */
+ rxdp->Control_2 |=3D BIT(0); /* Set Buffer_Empty = bit. */
+=20 rxdp->Host_Control =3D (u64) ((unsigned long) (skb));
+ = rxdp->Control_1=20 |=3D RXD_OWN_XENA;
+ off++;
+=20 mac_control->rx_curr_put_info[ring_no].offset =3D=20 = off;
+#endif
atomic_inc(&nic->rx_bufs_left[ring_no]);
all= oc_tab++;
}
@@=20 -1670,6 +1864,9 @@
struct sk_buff *skb;
mac_info_t=20 *mac_control;
struct config_param *config;
+#ifdef=20 CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control = =3D=20 &sp->mac_control;
config =3D &sp->config;
@@ = -1679,6 +1876,7=20 @@
off =3D j % (MAX_RXDS_PER_BLOCK + 1);
rxdp =3D=20 sp->rx_blocks[i][blk].block_virt_addr + off;

+#ifndef=20 CONFIG_2BUFF_MODE
if (rxdp->Control_1 =3D=3D END_OF_BLOCK) = {
rxdp=20 =3D
    (RxD_t *) ((unsigned long) rxdp->
@@ = -1686,6 +1884,12=20 @@
j++;
blk++;
}
+#else
+ if (rxdp->Host_Control = =3D=3D=20 END_OF_BLOCK) {
+ blk++;
+ continue;
+ }
+#endif

if = (!(rxdp->Control_1 & RXD_OWN_XENA)) {
memset(rxdp, 0,=20 sizeof(RxD_t));
@@ -1696,6 +1900,7 @@
    (struct = sk_buff *)=20 ((unsigned long) rxdp->
Host_Control);
if (skb) {
+#ifndef = CONFIG_2BUFF_MODE
pci_unmap_single(sp->pdev,=20 (dma_addr_t)
 rxdp->Buffer0_ptr,
 dev->mtu = +
@@=20 -1703,6 +1908,21 @@
 + HEADER_802_2_SIZE=20 = +
 HEADER_SNAP_SIZE,
 PCI_DMA_FROMDEVICE);
+#else
+= ba =3D=20 &sp->ba[i][blk][off];
+ pci_unmap_single(sp->pdev,=20 (dma_addr_t)
+  rxdp->Buffer0_ptr,
+ =  BUF0_LEN,
+=20  PCI_DMA_FROMDEVICE);
+ pci_unmap_single(sp->pdev,=20 (dma_addr_t)
+  rxdp->Buffer1_ptr,
+ =  BUF1_LEN,
+=20  PCI_DMA_FROMDEVICE);
+ pci_unmap_single(sp->pdev,=20 (dma_addr_t)
+  rxdp->Buffer2_ptr,
+  dev->mtu + = 22,
+=20 =  PCI_DMA_FROMDEVICE);
+#endif
dev_kfree_skb(skb);
atomic_de= c(&sp->rx_bufs_left[i]);
buf_cnt++;
@@=20 -1741,11 +1961,16 @@
register u64 val64 =3D = 0;
rx_curr_get_info_t=20 get_info, put_info;
int i, get_block, put_block, get_offset, = put_offset,=20 ring_bufs;
+#ifndef CONFIG_2BUFF_MODE
u16 val16,=20 cksum;
+#endif
struct sk_buff *skb;
RxD_t = *rxdp;
mac_info_t=20 *mac_control;
struct config_param *config;
+#ifdef=20 CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control = =3D=20 &nic->mac_control;
config =3D &nic->config;
@@ = -1764,6=20 +1989,7 @@
ring_bufs =3D config->rx_cfg[i].num_rxd;
rxdp =3D=20 nic->rx_blocks[i][get_block].block_virt_addr +
   =20 get_info.offset;
+#ifndef CONFIG_2BUFF_MODE
get_offset =3D = (get_block *=20 (MAX_RXDS_PER_BLOCK + 1)) +
    = get_info.offset;
put_offset =3D=20 (put_block * (MAX_RXDS_PER_BLOCK + 1)) +
@@ -1820,6 +2046,66=20 @@
mac_control->rx_curr_get_info[i].offset =3D
   =20 get_info.offset;
}
+#else
+ get_offset =3D (get_block *=20 (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+=20 put_offset =3D (put_block * (MAX_RXDS_PER_BLOCK + 1)) +
+   =  =20 put_info.offset;
+ while (((!(rxdp->Control_1 & = RXD_OWN_XENA))=20 &&
+ !(rxdp->Control_2 & BIT(0))) &&
+ =  =20      (((get_offset + 1) % ring_bufs) !=3D put_offset)) = {
+ if=20 (--pkts_to_process < 0) {
+ goto no_rx;
+ }
+ skb =3D = (struct=20 sk_buff *) ((unsigned long)
+   rxdp->Host_Control);
+ = if (skb=20 =3D=3D NULL) {
+ DBG_PRINT(ERR_DBG, "%s: The skb is ",
+  =20 dev->name);
+ DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");
+ goto = no_rx;
+ }
+
+ pci_unmap_single(nic->pdev, = (dma_addr_t)
+=20  rxdp->Buffer0_ptr,
+  BUF0_LEN, = PCI_DMA_FROMDEVICE);
+=20 pci_unmap_single(nic->pdev, (dma_addr_t)
+=20  rxdp->Buffer1_ptr,
+  BUF1_LEN, = PCI_DMA_FROMDEVICE);
+=20 pci_unmap_single(nic->pdev, (dma_addr_t)
+=20  rxdp->Buffer2_ptr,
+  dev->mtu + 22,
+=20  PCI_DMA_FROMDEVICE);
+ ba =3D=20 &nic->ba[i][get_block][get_info.offset];
+
+ = rx_osm_handler(nic,=20 rxdp, i, ba);
+
+ get_info.offset++;
+=20 mac_control->rx_curr_get_info[i].offset =3D
+    =20 get_info.offset;
+ rxdp =3D
+    =20 nic->rx_blocks[i][get_block].block_virt_addr +
+    =20 get_info.offset;
+
+ if (get_info.offset &&
+   =  =20 (!(get_info.offset % MAX_RXDS_PER_BLOCK))) {
+ get_info.offset =3D = 0;
+=20 mac_control->rx_curr_get_info[i].
+     offset =3D=20 get_info.offset;
+ get_block++;
+ get_block %=3D=20 nic->block_count[i];
+ mac_control->rx_curr_get_info[i].
+ =  =20   block_index =3D get_block;
+ rxdp =3D
+    =20 nic->rx_blocks[i][get_block].
+     = block_virt_addr;
+=20 }
+ get_offset =3D
+     (get_block * = (MAX_RXDS_PER_BLOCK + 1))=20 +
+     get_info.offset;
+ pkt_cnt++;
+=20 }
+#endif
}
if (!pkt_cnt)
pkt_cnt =3D 1;
@@ -1873,12 = +2159,17=20 @@
rx_curr_get_info_t get_info, put_info;
RxD_t *rxdp;
struct = sk_buff=20 *skb;
+#ifndef CONFIG_2BUFF_MODE
u16 val16,=20 cksum;
+#endif
register u64 val64 =3D 0;
int get_block, = get_offset,=20 put_block, put_offset, ring_bufs;
int i, pkt_cnt =3D = 0;
mac_info_t=20 *mac_control;
struct config_param *config;
+#ifdef=20 CONFIG_2BUFF_MODE
+ buffAdd_t *ba;
+#endif

mac_control = =3D=20 &nic->mac_control;
config =3D &nic->config;
@@ = -1898,6=20 +2189,7 @@
ring_bufs =3D config->rx_cfg[i].num_rxd;
rxdp =3D=20 nic->rx_blocks[i][get_block].block_virt_addr +
   =20 get_info.offset;
+#ifndef CONFIG_2BUFF_MODE
get_offset =3D = (get_block *=20 (MAX_RXDS_PER_BLOCK + 1)) +
   =20 get_info.offset;
spin_lock(&nic->put_lock);
@@ -1953,6 = +2245,67=20 @@
    && (pkt_cnt >=20 indicate_max_pkts))
break;
}
+#else
+ get_offset =3D = (get_block *=20 (MAX_RXDS_PER_BLOCK + 1)) +
+     get_info.offset;
+=20 spin_lock(&nic->put_lock);
+ put_offset =3D = nic->put_pos[i];
+=20 spin_unlock(&nic->put_lock);
+ while (((!(rxdp->Control_1 = &=20 RXD_OWN_XENA)) &&
+ !(rxdp->Control_2 & BIT(0)))=20 &&
+        (((get_offset + 1) % = ring_bufs) !=3D=20 put_offset)) {
+ skb =3D (struct sk_buff *) ((unsigned long)
+ =  =20 rxdp->Host_Control);
+ if (skb =3D=3D NULL) {
+ = DBG_PRINT(ERR_DBG, "%s:=20 The skb is ",
+   dev->name);
+ DBG_PRINT(ERR_DBG, "Null = in Rx=20 Intr\n");
+ return;
+ }
+
+ pci_unmap_single(nic->pdev, = (dma_addr_t)
+  rxdp->Buffer0_ptr,
+  BUF0_LEN,=20 PCI_DMA_FROMDEVICE);
+ pci_unmap_single(nic->pdev, = (dma_addr_t)
+=20  rxdp->Buffer1_ptr,
+  BUF1_LEN, = PCI_DMA_FROMDEVICE);
+=20 pci_unmap_single(nic->pdev, (dma_addr_t)
+=20  rxdp->Buffer2_ptr,
+  dev->mtu + 22,
+=20  PCI_DMA_FROMDEVICE);
+ ba =3D=20 &nic->ba[i][get_block][get_info.offset];
+
+ = rx_osm_handler(nic,=20 rxdp, i, ba);
+
+ get_info.offset++;
+=20 mac_control->rx_curr_get_info[i].offset =3D
+    =20 get_info.offset;
+ rxdp =3D
+    =20 nic->rx_blocks[i][get_block].block_virt_addr +
+    =20 get_info.offset;
+
+ if (get_info.offset &&
+   =  =20 (!(get_info.offset % MAX_RXDS_PER_BLOCK))) {
+ get_info.offset =3D = 0;
+=20 mac_control->rx_curr_get_info[i].
+     offset =3D=20 get_info.offset;
+ get_block++;
+ get_block %=3D=20 nic->block_count[i];
+ mac_control->rx_curr_get_info[i].
+ =  =20   block_index =3D get_block;
+ rxdp =3D
+    =20 nic->rx_blocks[i][get_block].
+     = block_virt_addr;
+=20 }
+ get_offset =3D
+     (get_block * = (MAX_RXDS_PER_BLOCK + 1))=20 +
+     get_info.offset;
+ pkt_cnt++;
+ if=20 ((indicate_max_pkts)
+     && (pkt_cnt >=20 indicate_max_pkts))
+ break;
+ }
+#endif
if = ((indicate_max_pkts)=20 && (pkt_cnt > indicate_max_pkts))
break;
}
@@ = -4096,12=20 +4449,21 @@

 *   Return value:
 *   = SUCCESS=20 on success and -1 on failure.
 */
+#ifndef=20 CONFIG_2BUFF_MODE
static int rx_osm_handler(nic_t * sp, u16 len, = RxD_t *=20 rxdp, int ring_no)
+#else
+static int rx_osm_handler(nic_t * sp, = RxD_t *=20 rxdp, int ring_no,
+   buffAdd_t * = ba)
+#endif
{
struct=20 net_device *dev =3D (struct net_device *) sp->dev;
struct = sk_buff *skb=20 =3D
    (struct sk_buff *) ((unsigned long)=20 rxdp->Host_Control);
u16 l3_csum, l4_csum;
+#ifdef=20 CONFIG_2BUFF_MODE
+ int buf0_len, buf2_len;
+ struct ethhdr *eth = =3D=20 (struct ethhdr *) ba->ba_0;
+#endif

l3_csum =3D=20 RXD_GET_L3_CKSUM(rxdp->Control_1);
if ((rxdp->Control_1 & = TCP_OR_UDP_FRAME) && (sp->rx_csum)) {
@@ -4129,10 = +4491,32=20 @@
DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n",
 =20 dev->name, err);
}
+#ifdef CONFIG_2BUFF_MODE
+ buf0_len = =3D=20 RXD_GET_BUFFER0_SIZE(rxdp->Control_2);
+ buf2_len =3D=20 = RXD_GET_BUFFER2_SIZE(rxdp->Control_2);
+#endif

skb->dev = =3D=20 dev;
+#ifndef CONFIG_2BUFF_MODE
skb_put(skb, = len);
skb->protocol =3D=20 eth_type_trans(skb, dev);
+#else
+ skb_put(skb, buf2_len);
+ = /*
+=20  * Reproducing eth_type_trans functionality and running
+ =  * on=20 the ethernet header 'eth' stripped and given to us
+  * by the = hardware in 2Buff mode.
+  */
+ if (*eth->h_dest & = 1) {
+=20 if (!memcmp(eth->h_dest, dev->broadcast, ETH_ALEN))
+=20 skb->pkt_type =3D PACKET_BROADCAST;
+ else
+ skb->pkt_type = =3D=20 PACKET_MULTICAST;
+ } else if (memcmp(eth->h_dest, = dev->dev_addr,=20 ETH_ALEN)) {
+ skb->pkt_type =3D PACKET_OTHERHOST;
+ }
+=20 skb->protocol =3D eth->h_proto;
+#endif

#ifdef=20 CONFIG_S2IO_NAPI
netif_receive_skb(skb);
@@ -4143,7 +4527,11=20 @@
dev->last_rx =3D=20 = jiffies;
sp->rx_pkt_count++;
sp->stats.rx_packets++;
+#ifn= def=20 CONFIG_2BUFF_MODE
sp->stats.rx_bytes +=3D len;
+#else
+=20 sp->stats.rx_bytes +=3D buf0_len +=20 = buf2_len;
+#endif

atomic_dec(&sp->rx_bufs_left[ring_no])= ;
rxdp->Host_Control=20 =3D 0;
diff -urN vanilla-linux/drivers/net/s2io.h=20 linux-2.6.8.1/drivers/net/s2io.h
--- = vanilla-linux/drivers/net/s2io.h=20 2004-10-11 21:21:49.000000000 -0700
+++ = linux-2.6.8.1/drivers/net/s2io.h=20 2004-10-11 21:22:23.000000000 -0700
@@ -466,19 +466,46 = @@
#define=20 RXD_GET_L4_CKSUM(val)   ((u16)(val) & 0xFFFF)

u64=20 Control_2;
+#ifndef CONFIG_2BUFF_MODE
#define MASK_BUFFER0_SIZE =  =20     vBIT(0xFFFF,0,16)
#define SET_BUFFER0_SIZE(val) =  =20 vBIT(val,0,16)
+#else
+#define MASK_BUFFER0_SIZE     =  =20 vBIT(0xFF,0,16)
+#define MASK_BUFFER1_SIZE      =20 vBIT(0xFFFF,16,16)
+#define MASK_BUFFER2_SIZE      =20 vBIT(0xFFFF,32,16)
+#define SET_BUFFER0_SIZE(val)  =20 vBIT(val,8,8)
+#define SET_BUFFER1_SIZE(val)  =20 vBIT(val,16,16)
+#define SET_BUFFER2_SIZE(val)  =20 vBIT(val,32,16)
+#endif
+
#define MASK_VLAN_TAG     =  =20     vBIT(0xFFFF,48,16)
#define SET_VLAN_TAG(val)   =  =20   vBIT(val,48,16)
#define SET_NUM_TAG(val)     =  =20 vBIT(val,16,32)

+#ifndef CONFIG_2BUFF_MODE
#define=20 RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 &=20 vBIT(0xFFFF,0,16)))
+#else
+#define = RXD_GET_BUFFER0_SIZE(Control_2)=20 (u8)((Control_2 & MASK_BUFFER0_SIZE) \
+ >> = 48)
+#define=20 RXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & = MASK_BUFFER1_SIZE)=20 \
+ >> 32)
+#define RXD_GET_BUFFER2_SIZE(Control_2)=20 (u16)((Control_2 & MASK_BUFFER2_SIZE) \
+ >> = 16)
+#define=20 BUF0_LEN 40
+#define BUF1_LEN 1
+#endif
+
u64=20 Buffer0_ptr;
+#ifdef CONFIG_2BUFF_MODE
+ u64 Buffer1_ptr;
+ = u64=20 Buffer2_ptr;
+#endif
} RxD_t;

/* Structure that = represents the Rx=20 descriptor block which contains
 * 128 Rx=20 descriptors.
 */
+#ifndef CONFIG_2BUFF_MODE
typedef = struct=20 _RxD_block {
#define MAX_RXDS_PER_BLOCK         =  =20   127
RxD_t rxd[MAX_RXDS_PER_BLOCK];
@@ -492,6 +519,27=20 @@
 * the upper 32 bits should
 * be 0 */
}=20 RxD_block_t;
+#else
+typedef struct _RxD_block {
+#define=20 MAX_RXDS_PER_BLOCK             85
+ = RxD_t=20 rxd[MAX_RXDS_PER_BLOCK];
+
+#define END_OF_BLOCK  =20  0xFEFFFFFFFFFFFFFFULL
+ u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF = to mark=20 last Rxd
+  * in this blk */
+ u64 pNext_RxD_Blk_physical; = /* Phy=20 ponter to next blk. */
+} RxD_block_t;
+#define SIZE_OF_BLOCK=20 4096
+
+/* Structure to hold virtual addresses of Buf0 and Buf1 = in
+=20 * 2buf mode. */
+typedef struct bufAdd {
+ void *ba_0_org;
+ = void=20 *ba_1_org;
+ void *ba_0;
+ void *ba_1;
+}=20 buffAdd_t;
+#endif

/* Structure which stores all the MAC = control=20 parameters */

@@ -677,6 +725,10 @@
#define LINK_DOWN = 1
#define=20 LINK_UP 2

+#ifdef CONFIG_2BUFF_MODE
+ /* Buffer Address = store.=20 */
+ buffAdd_t **ba[MAX_RX_RINGS];
+#endif
int = task_flag;
}=20 nic_t;

@@ -802,7 +854,12 @@
static void = s2io_tx_watchdog(struct=20 net_device *dev);
static void s2io_tasklet(unsigned long=20 dev_addr);
static void s2io_set_multicast(struct net_device=20 *dev);
+#ifndef CONFIG_2BUFF_MODE
static int = rx_osm_handler(nic_t * sp,=20 u16 len, RxD_t * rxdp, int ring_no);
+#else
+static int=20 rx_osm_handler(nic_t * sp, RxD_t * rxdp, int ring_no,
+   = buffAdd_t *=20 ba);
+#endif
void s2io_link(nic_t * sp, int link);
void=20 s2io_reset(nic_t * sp);
#ifdef=20 CONFIG_S2IO_NAPI


------=_NextPart_001_001B_01C4C649.C6348720-- ------=_NextPart_000_001A_01C4C649.C6321620 Content-Type: image/gif; name="graycol.gif" Content-Transfer-Encoding: base64 Content-ID: <343562918@09112004-2616> R0lGODlhEAAQAKECAMzMzAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIXlI+py+0PopwxUbpu ZRfKZ2zgSJbmSRYAIf4fT3B0aW1pemVkIGJ5IFVsZWFkIFNtYXJ0U2F2ZXIhAAA7 ------=_NextPart_000_001A_01C4C649.C6321620 Content-Type: image/gif; name="ecblank.gif" Content-Transfer-Encoding: base64 Content-ID: <343562918@09112004-261D> R0lGODlhEAABAIAAAAAAAP///yH5BAEAAAEALAAAAAAQAAEAAAIEjI8ZBQA7 ------=_NextPart_000_001A_01C4C649.C6321620-- From herbert@gondor.apana.org.au Tue Nov 9 12:35:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 12:35:59 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9KZoUG018964 for ; Tue, 9 Nov 2004 12:35:51 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRci1-0001Qj-00; Wed, 10 Nov 2004 07:35:21 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRchp-0001Kh-00; Wed, 10 Nov 2004 07:35:09 +1100 Date: Wed, 10 Nov 2004 07:35:09 +1100 To: "YOSHIFUJI Hideaki / ?$B5HF#1QL@" Cc: davem@davemloft.net, acme@conectiva.com.br, netdev@oss.sgi.com, jgarzik@pobox.com, buytenh@wantstofly.org Subject: Re: Bug in ipv6_ifa_notify? Message-ID: <20041109203509.GA5109@gondor.apana.org.au> References: <20041108121040.GA3618@gondor.apana.org.au> <20041108203741.GA993@gondor.apana.org.au> <20041109114839.GA1942@gondor.apana.org.au> <20041109.095759.109272072.yoshfuji@linux-ipv6.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109.095759.109272072.yoshfuji@linux-ipv6.org> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11636 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 628 Lines: 17 On Tue, Nov 09, 2004 at 09:57:59AM -0500, YOSHIFUJI Hideaki / ?$B5HF#1QL@ wrote: > > I think this only happens when you shut down interface while DAD; > for example, "ifup eth0 &; ifdown eth0" or something like that. Exactly. However, since ifup doesn't wait for DAD to complete, you need something like 'ifup eth0; sleep 3; ifdown eth0' to trigger it. BTW, couldn't we move stuff like DAD to user-space? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From ctindel@calma.pair.com Tue Nov 9 12:54:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 12:54:21 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA9KsGA2019609 for ; Tue, 9 Nov 2004 12:54:17 -0800 Received: (qmail 66780 invoked by uid 3059); 9 Nov 2004 20:53:58 -0000 Date: Tue, 9 Nov 2004 15:53:58 -0500 From: "Chad N. Tindel" To: netdev@oss.sgi.com Cc: linux-net@vger.kernel.org Subject: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109205358.GA64015@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i X-archive-position: 11637 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev Content-Length: 2254 Lines: 47 Hello- In our testing we've found some occurrences of identd reporting back the wrong username for the owner of a socket. We added some instrumentation to identd so that we can tell it what we expect the username to be, and when what it discovers doesn't match what we expect, it logs a message. Sometimes non-root users appear as root, and sometimes the root user appears as a non-root user. Here's an example log message from our instrumented identd: Nov 9 00:55:11 rock identd[4139]: ERROR: Expected username 'root' but got 'ident'. Proc line was ' 299: AFAF0D0F:CEE1 ACAF0D0F:14B6 01 00000000:00000000 00:00000000 00000000 100 0 880370 1 f22bb980 21 4 8 3 -1 '. EUID was 100 As you can see, our client was running as root, but identd reported that the username was "ident". /proc/net/tcp reported that the EUID was 100. Clearly it isn't correct that the ident user is associated with a socket that doesn't have port 113 as one of the endpoints. Here's another example: Nov 8 17:19:06 rock identd[4139]: ERROR: Expected username 'rba0001f' but got 'root'. Proc line was ' 19: AFAF0D0F:8FFD AFAF0D0F:14B6 01 00000000:00000000 02:000AFC6F 00000000 0 0 0 2 f04ed980 '. EUID was 0 The user rba0001f has a UID of 65535 on this system. We have seen this problem on RH3u3 as well as SLES9, so our current thoughts are that it is a generic kernel issue. We're starting to dive down in the code to look for possible problems, but I wanted to bring it up to the list and see if anybody had any ideas. In our cursory analysis of the code, we've seen that the inode structure which holds the user id comes out of a cache. In the function sock_alloc(), the UID gets assigned as: inode->i_uid = current->fsuid; Is it possible for this code to be invoked in a context where current doesn't actually point to the right task structure? Is it possible for the socket to get added to the established hash table before the uid pointer gets initialized, thus causing /proc/net/tcp to report the UID of whoever used this socket memory earlier? We can reproduce this problem fairly easily here, so if anybody has any ideas or suggestions on kernel instrumentation that would help track this down, I'm all ears. Regards, Chad From davem@redhat.com Tue Nov 9 12:59:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 12:59:52 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9KxkM6020143 for ; Tue, 9 Nov 2004 12:59:46 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iA9KxRQE015525; Tue, 9 Nov 2004 15:59:27 -0500 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iA9KxRr10484; Tue, 9 Nov 2004 15:59:27 -0500 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id iA9KxM48027120; Tue, 9 Nov 2004 15:59:23 -0500 Date: Tue, 9 Nov 2004 12:47:04 -0800 From: "David S. Miller" To: Xose Vazquez Perez Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, jgarzik@pobox.com Subject: Re: [PATCH 2.6-bk 1/1] tg3: add license Message-Id: <20041109124704.1f8cb3ad.davem@redhat.com> In-Reply-To: <4190A32E.6090200@wanadoo.es> References: <4190A32E.6090200@wanadoo.es> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11638 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 308 Lines: 9 On Tue, 09 Nov 2004 11:59:58 +0100 Xose Vazquez Perez wrote: > there is no license, yes it's GPL but... Why add this, it's basically implied? We have a copy of the file "COPYING" at the top of the source tree, which is why we don't duplicate it's contents nor excerpts all over the tree. From yoshfuji@linux-ipv6.org Tue Nov 9 13:03:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 13:03:48 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9L3fjr020568 for ; Tue, 9 Nov 2004 13:03:41 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 08DEF33CE5; Wed, 10 Nov 2004 06:04:27 +0900 (JST) Date: Tue, 09 Nov 2004 16:04:26 -0500 (EST) Message-Id: <20041109.160426.65371988.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, acme@conectiva.com.br, netdev@oss.sgi.com, jgarzik@pobox.com, buytenh@wantstofly.org, yoshfuji@linux-ipv6.org Subject: Re: Bug in ipv6_ifa_notify? From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041109203509.GA5109@gondor.apana.org.au> References: <20041109114839.GA1942@gondor.apana.org.au> <20041109.095759.109272072.yoshfuji@linux-ipv6.org> <20041109203509.GA5109@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11639 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 243 Lines: 7 In article <20041109203509.GA5109@gondor.apana.org.au> (at Wed, 10 Nov 2004 07:35:09 +1100), Herbert Xu says: > BTW, couldn't we move stuff like DAD to user-space? I don't think it is the right way. --yoshfuji From herbert@gondor.apana.org.au Tue Nov 9 13:06:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 13:06:44 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9L6Zm2020947 for ; Tue, 9 Nov 2004 13:06:36 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRdBt-0001iE-00; Wed, 10 Nov 2004 08:06:13 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRdBr-0001P2-00; Wed, 10 Nov 2004 08:06:11 +1100 From: Herbert Xu To: chad@tindel.net (Chad N. Tindel) Subject: Re: Wrong UIDs reported in /proc/net/tcp Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Organization: Core In-Reply-To: <20041109205358.GA64015@calma.pair.com> X-Newsgroups: apana.lists.os.linux.net,apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 10 Nov 2004 08:06:11 +1100 X-archive-position: 11640 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 670 Lines: 17 Chad N. Tindel wrote: > > In our testing we've found some occurrences of identd reporting back the > wrong username for the owner of a socket. We added some instrumentation /proc/net/tcp is an obsolete interface. It is inherently unreliable in that a record may be read using two read(2) calls. Those two calls may end up looking at two different records. So please use the netlink interface or ss(8) from the iproute package. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From akepner@sgi.com Tue Nov 9 13:12:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 13:12:24 -0800 (PST) Received: from omx1.americas.sgi.com (omx1-ext.sgi.com [192.48.179.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9LCJ9j021318 for ; Tue, 9 Nov 2004 13:12:20 -0800 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with ESMTP id iA9LC2xT003817 for ; Tue, 9 Nov 2004 15:12:02 -0600 From: akepner@sgi.com Received: from [192.168.2.3] (mtv-vpn-sw-corp-0-10.corp.sgi.com [134.15.0.10]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id iA9LBgLH8513772; Tue, 9 Nov 2004 13:11:57 -0800 (PST) Date: Tue, 9 Nov 2004 13:11:42 -0800 (PST) X-X-Sender: To: "Chad N. Tindel" cc: , Subject: Re: Wrong UIDs reported in /proc/net/tcp In-Reply-To: <20041109205358.GA64015@calma.pair.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11641 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akepner@sgi.com Precedence: bulk X-list: netdev Content-Length: 278 Lines: 13 On Tue, 9 Nov 2004, Chad N. Tindel wrote: > .... > In our testing we've found some occurrences of identd reporting back the > wrong username for the owner of a socket. ..... The following may be of interest: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=44854 -- Arthur From vkondra@mail.ru Tue Nov 9 13:33:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 13:33:58 -0800 (PST) Received: from mx1.mail.ru (mx1.mail.ru [194.67.23.121]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9LXr0d022045 for ; Tue, 9 Nov 2004 13:33:53 -0800 Received: from [212.179.188.182] (port=29986 helo=[192.168.10.2]) by mx1.mail.ru with esmtp id 1CRdcL-000AK5-00; Wed, 10 Nov 2004 00:33:34 +0300 From: Vladimir Kondratiev To: Jeff Garzik Subject: Re: [PATCH wireless-2.6 0/12] Host AP update Date: Tue, 9 Nov 2004 23:32:03 +0200 User-Agent: KMail/1.7 Cc: Michael Renzmann , netdev@oss.sgi.com References: <20041108070156.GA1076@jm.kir.nu> <41908932.6070900@web.de> <4190E1AD.8000405@pobox.com> In-Reply-To: <4190E1AD.8000405@pobox.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart6384805.RhrWYBfgch"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <200411092332.11537.vkondra@mail.ru> X-Spam: Not detected X-archive-position: 11642 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vkondra@mail.ru Precedence: bulk X-list: netdev Content-Length: 1315 Lines: 46 --nextPart6384805.RhrWYBfgch Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Tuesday 09 November 2004 17:26, Jeff Garzik wrote: JG> Michael Renzmann wrote: JG> > Hi. JG> > JG> > (I cutted down the CC list.) JG> > JG> > Jeff Garzik wrote: JG> > JG> >> A key goal I have for HostAP is that portions of HostAP code should = be JG> >> bundled into a generic "lib80211" kernel module, for use by various JG> >> low-level and "softmac" 802.11 device drivers. JG> > JG> > JG> > This sentence made me curious... does that mean the efforts which JG> > recently have been discussed here (to bring a generic 802.11 stack to JG> > the kernel) are going to be replaced by the described goal? Or is it = an JG> > addition to Vladimir's work? JG> JG> Hopefully Vladmir's work will plug right in.. I hope he's still working JG> on it! JG> JG> Jeff I do, but I had some very long interrupt - sometimes I should also do my=20 primary job. I'll be back shortly. --nextPart6384805.RhrWYBfgch Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.6 (GNU/Linux) iD8DBQBBkTdbqxdj7mhC6o0RAlJmAKCPjcag212ihVt+c2KvRaezn9hKjACfQg+Q iPiOKWKiYbyMOHn4hCKNX0g= =YAPK -----END PGP SIGNATURE----- --nextPart6384805.RhrWYBfgch-- From ctindel@calma.pair.com Tue Nov 9 14:41:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 14:41:43 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA9MfcdX024596 for ; Tue, 9 Nov 2004 14:41:38 -0800 Received: (qmail 88328 invoked by uid 3059); 9 Nov 2004 22:41:20 -0000 Date: Tue, 9 Nov 2004 17:41:20 -0500 From: "Chad N. Tindel" To: akepner@sgi.com Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109224120.GA87321@calma.pair.com> References: <20041109205358.GA64015@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-archive-position: 11643 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev Content-Length: 324 Lines: 11 > The following may be of interest: > > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=44854 This isn't really the same issue. This looks like an euid vs. uid problem that reproduces every time. The problem we are seeing is a timing-window-race-condition kind of problem that happens maybe 1 in 100,000 times. Chad From ctindel@calma.pair.com Tue Nov 9 14:43:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 14:43:59 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA9Mhsov024995 for ; Tue, 9 Nov 2004 14:43:54 -0800 Received: (qmail 88796 invoked by uid 3059); 9 Nov 2004 22:43:37 -0000 Date: Tue, 9 Nov 2004 17:43:37 -0500 From: "Chad N. Tindel" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109224337.GB87321@calma.pair.com> References: <20041109205358.GA64015@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-archive-position: 11644 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev Content-Length: 476 Lines: 11 > > In our testing we've found some occurrences of identd reporting back the > > wrong username for the owner of a socket. We added some instrumentation > > /proc/net/tcp is an obsolete interface. It is inherently unreliable > in that a record may be read using two read(2) calls. Those two calls > may end up looking at two different records. Is it unreliable in that the wrong user id will get returned for an established socket? How could such a thing happen? Chad From xose@wanadoo.es Tue Nov 9 14:46:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 14:46:16 -0800 (PST) Received: from smtp1.jazztel.es (smtp1.jazztel.es [62.14.3.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9MkAUl025378 for ; Tue, 9 Nov 2004 14:46:11 -0800 Received: from antivirus by smtp1.jazztel.es with antivirus id 1CRekG-00011R-00 Tue, 09 Nov 2004 23:45:48 +0100 Received: from [212.106.244.29] (helo=wanadoo.es) by smtp1.jazztel.es with esmtp id 1CRekF-00011B-00 Tue, 09 Nov 2004 23:45:48 +0100 Message-ID: <41914889.7060308@wanadoo.es> Date: Tue, 09 Nov 2004 23:45:29 +0100 From: Xose Vazquez Perez User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.4.3) Gecko/20041005 X-Accept-Language: gl, es, en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, jgarzik@pobox.com Subject: Re: [PATCH 2.6-bk 1/1] tg3: add license References: <4190A32E.6090200@wanadoo.es> <20041109124704.1f8cb3ad.davem@redhat.com> In-Reply-To: <20041109124704.1f8cb3ad.davem@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by antivirus X-archive-position: 11645 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xose@wanadoo.es Precedence: bulk X-list: netdev Content-Length: 861 Lines: 39 David S. Miller wrote: > Why add this, it's basically implied? Maybe it should be answered by a lawyer, but it's better to protect our freedom because law is very 'variable'. > We have a copy of the file "COPYING" at the top > of the source tree, which is why we don't duplicate > it's contents nor excerpts all over the tree. This is not a duplicate, it's only an advertisement. Long time ago Torvalds wrote at COPYING: "[...] Also note that the only valid version of the GPL as far as the kernel is concerned is _this_ particular version of the license (ie v2, not v2.2 or v3.x or whatever), unless explicitly otherwise stated. [...]" what does MODULE_LICENSE("GPL") mean at tg3.c ? GPL 1.0 ? GPL 2 ? any GPL ? only 'GPL' ? Is possible to write BSD or BSD/GPL or GPLv2 or GPL drivers/code *inside* Linux kernel ? -- TLOZ OOT: worse than drugs. From herbert@gondor.apana.org.au Tue Nov 9 14:58:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 14:58:45 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9MwacB026222 for ; Tue, 9 Nov 2004 14:58:37 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRewJ-0002kp-00; Wed, 10 Nov 2004 09:58:15 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRewG-0001ZN-00; Wed, 10 Nov 2004 09:58:12 +1100 Date: Wed, 10 Nov 2004 09:58:12 +1100 To: "Chad N. Tindel" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109225812.GA6001@gondor.apana.org.au> References: <20041109205358.GA64015@calma.pair.com> <20041109224337.GB87321@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109224337.GB87321@calma.pair.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11646 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 751 Lines: 17 On Tue, Nov 09, 2004 at 05:43:37PM -0500, Chad N. Tindel wrote: > > > /proc/net/tcp is an obsolete interface. It is inherently unreliable > > in that a record may be read using two read(2) calls. Those two calls > > may end up looking at two different records. > > Is it unreliable in that the wrong user id will get returned for an > established socket? How could such a thing happen? In 2.4 it is entirely possible to have a record broken up into two reads. There is no guarantee that the two reads will be reading the same record. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From ctindel@calma.pair.com Tue Nov 9 15:04:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 15:04:33 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iA9N4S2k026691 for ; Tue, 9 Nov 2004 15:04:29 -0800 Received: (qmail 93203 invoked by uid 3059); 9 Nov 2004 23:04:11 -0000 Date: Tue, 9 Nov 2004 18:04:11 -0500 From: "Chad N. Tindel" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109230411.GA91891@calma.pair.com> References: <20041109205358.GA64015@calma.pair.com> <20041109224337.GB87321@calma.pair.com> <20041109225812.GA6001@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109225812.GA6001@gondor.apana.org.au> User-Agent: Mutt/1.4.2.1i X-archive-position: 11647 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev Content-Length: 507 Lines: 12 > In 2.4 it is entirely possible to have a record broken up into two > reads. There is no guarantee that the two reads will be reading the > same record. Let me make sure I understand what you're saying here... You're saying that since pidentd is calling fgets(), that can actually result in multiple read() calls. Because of this, the first half of the line containing the address:port pairs can be with respect to one socket, and the second half containing the euid can be from another socket? Chad From herbert@gondor.apana.org.au Tue Nov 9 15:19:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 15:19:29 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9NJLKw027578 for ; Tue, 9 Nov 2004 15:19:22 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRfGO-0002sr-00; Wed, 10 Nov 2004 10:19:00 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRfGK-0001bq-00; Wed, 10 Nov 2004 10:18:56 +1100 Date: Wed, 10 Nov 2004 10:18:56 +1100 To: "Chad N. Tindel" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041109231856.GA6152@gondor.apana.org.au> References: <20041109205358.GA64015@calma.pair.com> <20041109224337.GB87321@calma.pair.com> <20041109225812.GA6001@gondor.apana.org.au> <20041109230411.GA91891@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109230411.GA91891@calma.pair.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11648 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 701 Lines: 14 On Tue, Nov 09, 2004 at 06:04:11PM -0500, Chad N. Tindel wrote: > > You're saying that since pidentd is calling fgets(), that can actually result > in multiple read() calls. Because of this, the first half of the line fgets() is implemented on top of a buffered read, with my glibc it reads 4096 bytes. Whatever that size is, the second read is most likely going to be reading a partial record. There is no guarantee that the partial record is going to match the end of the first read. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From dlstevens@us.ibm.com Tue Nov 9 15:22:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 15:22:29 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9NMOl8027982 for ; Tue, 9 Nov 2004 15:22:24 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iA9NLvLv515176 for ; Tue, 9 Nov 2004 18:21:57 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iA9NLuxs213462 for ; Tue, 9 Nov 2004 16:21:56 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA9NLuJ0024721 for ; Tue, 9 Nov 2004 16:21:56 -0700 Received: from d03nm121.boulder.ibm.com (d03nm121.boulder.ibm.com [9.17.195.147]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iA9NLuvi024718; Tue, 9 Nov 2004 16:21:56 -0700 In-Reply-To: <1099995700.21310.8.camel@mn-2> To: Mark Borst Cc: hessu@cs.tut.fi, netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: node-local multicast issues X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Tue, 9 Nov 2004 15:21:54 -0800 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/09/2004 16:21:55, Serialize complete at 11/09/2004 16:21:55 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 11649 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 813 Lines: 20 The loopback device doesn't have IFF_MULTICAST set, so technically it is not a multicast-capable device, and you shouldn't be able to join a group on it. I think the way it ought to work is that you join the group on any device, with IPV6_MULTICAST_LOOP set and local guys should hear the node-local multicasts, but it shouldn't be sent on the wire. Multicasting could be supported on loopback, too, but it doesn't matter all that much unless there are no multicast-capable real devices. However, it appears that node-local multicasts are being sent out the device, at least on an early 2.6 kernel I did a quick test with. There probably isn't anything enforcing the node-locality in the send path, which I would consider a bug. :-) +-DLS From romieu@fr.zoreil.com Tue Nov 9 15:28:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 15:28:27 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9NSJnq028428 for ; Tue, 9 Nov 2004 15:28:20 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA9NPAvr007956; Wed, 10 Nov 2004 00:25:11 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA9NPAoc007955; Wed, 10 Nov 2004 00:25:10 +0100 Date: Wed, 10 Nov 2004 00:25:10 +0100 From: Francois Romieu To: seby@focomunicatii.ro Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Message-ID: <20041109232510.GA5582@electric-eye.fr.zoreil.com> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109000006.GA14911@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11650 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 577 Lines: 15 Francois Romieu : > seby@focomunicatii.ro : > [...] > > I just bouth a zyxel GN650T network card .. and it sems that vlan's don't > > work on this card .. anybody had this problems with this card .. > > Patch below against 2.6.10-rc1-bk15 + Jeff's netdev should convert the driver > to the in-kernel vlan API. Cr*p, the driver had not been backported to 2.4.x. Ok, instant patch (155 ko) against 2.4.28-rc2 available at: http://www.fr.zoreil.com/people/francois/misc/20041110-2.4.28-rc2-via-velocity-backport.patch -- Ueimor From romieu@fr.zoreil.com Tue Nov 9 15:44:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 15:44:26 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iA9NiJhG029691 for ; Tue, 9 Nov 2004 15:44:20 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iA9Nhvvr008355; Wed, 10 Nov 2004 00:43:58 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iA9Nhr0w008354; Wed, 10 Nov 2004 00:43:53 +0100 Date: Wed, 10 Nov 2004 00:43:53 +0100 From: Francois Romieu To: Eamonn Hamilton Cc: netdev Subject: Re: linux 2.6.9: r8169: eth0: PCI error (status: 0x8404). Device disabled. Message-ID: <20041109234353.GA6020@electric-eye.fr.zoreil.com> References: <1098269117.6631.5.camel@ukabzc383.uk.saic.com> <20041020121520.GA4004@electric-eye.fr.zoreil.com> <1098282567.6631.10.camel@ukabzc383.uk.saic.com> <20041020201010.GA13023@electric-eye.fr.zoreil.com> <1098350743.15528.40.camel@ukabzc383.uk.saic.com> <20041021120208.GA752@electric-eye.fr.zoreil.com> <1098437493.5513.8.camel@ukabzc383.uk.saic.com> <20041022105224.GA26714@electric-eye.fr.zoreil.com> <1099922587.16833.2.camel@ukabzc383.uk.saic.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1099922587.16833.2.camel@ukabzc383.uk.saic.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11651 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 594 Lines: 17 Eamonn Hamilton : [...] > Anyway, The device was brought back to functioning order by removing the > module and re-inserting it. I have to confess, I forgot to try simply > downing/upping it, I'll ask my friend to try that should it happen > again. Bizarrely, the frequency of it happening seems to be down for > whatever reason - it took ~12GB traffic to cause it to happen this > afternoon. > > Anyway, hope this helps. Yes. It suggests that it should not be too hard to add a hack for recovery. I am a bit surprized with this isolated report though. -- Ueimor From davem@davemloft.net Tue Nov 9 16:24:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:24:29 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0OMM9002280 for ; Tue, 9 Nov 2004 16:24:22 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRg58-00074h-00; Tue, 09 Nov 2004 16:11:26 -0800 Date: Tue, 9 Nov 2004 16:11:26 -0800 From: "David S. Miller" To: Herbert Xu Cc: kaber@trash.net, netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-Id: <20041109161126.376f755c.davem@davemloft.net> In-Reply-To: References: <41899DCF.3050804@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11652 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 3553 Lines: 119 On Sat, 06 Nov 2004 10:35:45 +1100 Herbert Xu wrote: > 1) Abuse of the rtnl. It's being used for too many things. It's > basically the networking system's BKL. If the locking were more > granular then this shouldn't occur. I totally disagree. The use of rtnl for all networking configuration changes is a virtue of our current setup. All of these actions want to make sure devices don't disappear from underneath them while verifying a configuration change. In fact one of the first things the packet scheduler config change code does is: if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) return -ENODEV; and it expects the state of that device to not change throughout the rest of the config change verification and decision making. > 2) Hooking random net/sched requests into rtnetlink. By being an > rtnetlink user you pay the price of taking the rtnl. Most of the > net/sched stuff has nothing to do with rtnetlink. I believe this is a false statement. Every single networking config change depends upon device existence and state in some way. By virtue of that, they really depend upon the RTNL being held during the duration of their execution. Only the actual implementations know when and where such a dependency on device state et al. does not exist, and therefore where RTNL holding is not necessary. Therefore I suggest we just implement the fix for this inside of the packet scheduler layer itself. Simply by dropping the RTNL semaphore during the module request, and then regrabbing the RTNL semaphore and replaying the request from the beginning. The net/sched/sch_api.c version of the fix would look like the following. The act_api.c case would require a bit more surgery, but with the right restructuring it can be done too. ===== net/sched/sch_api.c 1.41 vs edited ===== --- 1.41/net/sched/sch_api.c 2004-11-05 16:34:45 -08:00 +++ edited/net/sched/sch_api.c 2004-11-09 15:57:19 -08:00 @@ -396,17 +396,30 @@ struct Qdisc_ops *ops; int size; + err = -EINVAL; ops = qdisc_lookup_ops(kind); #ifdef CONFIG_KMOD if (ops==NULL && tca[TCA_KIND-1] != NULL) { if (RTA_PAYLOAD(kind) <= IFNAMSIZ) { + rtnl_unlock(); request_module("sch_%s", (char*)RTA_DATA(kind)); + rtnl_lock(); + ops = qdisc_lookup_ops(kind); + + /* We dropped the RTNL semaphore in order to + * perform the module load. So, even if we + * succeeded in loading the module we have to + * tell the caller to replay the request. We + * indicate this using -EAGAIN. + */ + if (ops != NULL) + err = -EAGAIN; + goto err_out; } } #endif - err = -EINVAL; if (ops == NULL) goto err_out; err = -EBUSY; @@ -600,14 +613,19 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg) { - struct tcmsg *tcm = NLMSG_DATA(n); - struct rtattr **tca = arg; + struct tcmsg *tcm; + struct rtattr **tca; struct net_device *dev; - u32 clid = tcm->tcm_parent; - struct Qdisc *q = NULL; - struct Qdisc *p = NULL; + u32 clid; + struct Qdisc *q, *p; int err; +replay: + tcm = NLMSG_DATA(n); + tca = arg; + clid = tcm->tcm_parent; + q = p = NULL; + if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) return -ENODEV; @@ -701,8 +719,14 @@ q = qdisc_create(dev, tcm->tcm_parent, tca, &err); else q = qdisc_create(dev, tcm->tcm_handle, tca, &err); - if (q == NULL) + if (q == NULL) { + if (err == -EAGAIN) { + /* Replay the request. */ + dev_put(dev); + goto replay; + } return err; + } graft: if (1) { From davem@davemloft.net Tue Nov 9 16:31:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:31:15 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0V90V002794 for ; Tue, 9 Nov 2004 16:31:09 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRgBk-00075j-00; Tue, 09 Nov 2004 16:18:16 -0800 Date: Tue, 9 Nov 2004 16:18:16 -0800 From: "David S. Miller" To: Patrick McHardy Cc: tgraf@suug.ch, spam@crocom.com.pl, netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-Id: <20041109161816.425ad7d6.davem@davemloft.net> In-Reply-To: <418FCD0A.4040202@trash.net> References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11653 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 269 Lines: 8 On Mon, 08 Nov 2004 20:46:18 +0100 Patrick McHardy wrote: > New patch attached. How do these child qdiscs get destroyed at all if you just remove them from the lists they are on? How will the rest of destroy processing find them and clean them up? From davem@davemloft.net Tue Nov 9 16:33:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:33:07 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0X0Pq003156 for ; Tue, 9 Nov 2004 16:33:00 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRgDP-000768-00; Tue, 09 Nov 2004 16:19:59 -0800 Date: Tue, 9 Nov 2004 16:19:59 -0800 From: "David S. Miller" To: "chas williams (contractor)" Cc: netdev@oss.sgi.com, davem@redhat.com Subject: Re: [PATCH][ATM]: [atmtcp] fix refcounting and vcc search Message-Id: <20041109161959.5ee5ad70.davem@davemloft.net> In-Reply-To: <200411061338.iA6DcJTO017887@ginger.cmf.nrl.navy.mil> References: <200411061338.iA6DcJTO017887@ginger.cmf.nrl.navy.mil> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11654 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 435 Lines: 14 On Sat, 06 Nov 2004 08:38:19 -0500 "chas williams (contractor)" wrote: > i must have been a bit confused when i originally converted this use > the hash. please apply to 2.6. ... > Signed-off-by: Chas Williams ... > # ChangeSet > # 2004/11/06 08:21:01-05:00 chas@relax.cmf.nrl.navy.mil > # atmtcp.c: > # [ATM]: [atmtcp] fix refcounting and vcc search Applied, thanks Chas. From davem@davemloft.net Tue Nov 9 16:36:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:36:17 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0aCFn003556 for ; Tue, 9 Nov 2004 16:36:12 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRgGk-00076r-00; Tue, 09 Nov 2004 16:23:26 -0800 Date: Tue, 9 Nov 2004 16:23:25 -0800 From: "David S. Miller" To: Christoph Hellwig Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove dead exports from net/core/dev.c Message-Id: <20041109162325.18d2e282.davem@davemloft.net> In-Reply-To: <20041106174307.GA19806@lst.de> References: <20041101114605.GA7507@lst.de> <20041106174307.GA19806@lst.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11655 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 362 Lines: 12 On Sat, 6 Nov 2004 18:43:07 +0100 Christoph Hellwig wrote: > On Mon, Nov 01, 2004 at 12:46:05PM +0100, Christoph Hellwig wrote: > > this also allows to kill some competely dead code, e.g. many of the > > non-locked __foo routines. > > > > Signed-off-by: Christoph Hellwig > > rediffed against current BK: Applied, thanks Christoph. From kaber@trash.net Tue Nov 9 16:39:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:39:11 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0d3lS004235 for ; Tue, 9 Nov 2004 16:39:03 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRgUx-0006yI-S2; Wed, 10 Nov 2004 01:38:07 +0100 Message-ID: <419162EF.5000601@trash.net> Date: Wed, 10 Nov 2004 01:38:07 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> In-Reply-To: <20041109161126.376f755c.davem@davemloft.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11656 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 3250 Lines: 123 David S. Miller wrote: >On Sat, 06 Nov 2004 10:35:45 +1100 >Herbert Xu wrote: > > >>2) Hooking random net/sched requests into rtnetlink. By being an >>rtnetlink user you pay the price of taking the rtnl. Most of the >>net/sched stuff has nothing to do with rtnetlink. >> >> > >I believe this is a false statement. Every single networking >config change depends upon device existence and state in some >way. By virtue of that, they really depend upon the RTNL being >held during the duration of their execution. > >Only the actual implementations know when and where such a >dependency on device state et al. does not exist, and therefore >where RTNL holding is not necessary. > Agreed. Restructuring only net/sched to be independant of the rtnl requires alot of non-trivial work, with not much to gain. >Therefore I suggest we just implement the fix for this inside of >the packet scheduler layer itself. Simply by dropping the RTNL >semaphore during the module request, and then regrabbing the RTNL >semaphore and replaying the request from the beginning. > Nicely done. I feel smarter just by looking at it :) > >The net/sched/sch_api.c version of the fix would look like the >following. The act_api.c case would require a bit more surgery, >but with the right restructuring it can be done too. > I'll have a look at this while cleaning up the code. Regards Patrick >===== net/sched/sch_api.c 1.41 vs edited ===== >--- 1.41/net/sched/sch_api.c 2004-11-05 16:34:45 -08:00 >+++ edited/net/sched/sch_api.c 2004-11-09 15:57:19 -08:00 >@@ -396,17 +396,30 @@ > struct Qdisc_ops *ops; > int size; > >+ err = -EINVAL; > ops = qdisc_lookup_ops(kind); > #ifdef CONFIG_KMOD > if (ops==NULL && tca[TCA_KIND-1] != NULL) { > if (RTA_PAYLOAD(kind) <= IFNAMSIZ) { >+ rtnl_unlock(); > request_module("sch_%s", (char*)RTA_DATA(kind)); >+ rtnl_lock(); >+ > ops = qdisc_lookup_ops(kind); >+ >+ /* We dropped the RTNL semaphore in order to >+ * perform the module load. So, even if we >+ * succeeded in loading the module we have to >+ * tell the caller to replay the request. We >+ * indicate this using -EAGAIN. >+ */ >+ if (ops != NULL) >+ err = -EAGAIN; >+ goto err_out; > } > } > #endif > >- err = -EINVAL; > if (ops == NULL) > goto err_out; > err = -EBUSY; >@@ -600,14 +613,19 @@ > > static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg) > { >- struct tcmsg *tcm = NLMSG_DATA(n); >- struct rtattr **tca = arg; >+ struct tcmsg *tcm; >+ struct rtattr **tca; > struct net_device *dev; >- u32 clid = tcm->tcm_parent; >- struct Qdisc *q = NULL; >- struct Qdisc *p = NULL; >+ u32 clid; >+ struct Qdisc *q, *p; > int err; > >+replay: >+ tcm = NLMSG_DATA(n); >+ tca = arg; >+ clid = tcm->tcm_parent; >+ q = p = NULL; >+ > if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) > return -ENODEV; > >@@ -701,8 +719,14 @@ > q = qdisc_create(dev, tcm->tcm_parent, tca, &err); > else > q = qdisc_create(dev, tcm->tcm_handle, tca, &err); >- if (q == NULL) >+ if (q == NULL) { >+ if (err == -EAGAIN) { >+ /* Replay the request. */ >+ dev_put(dev); >+ goto replay; >+ } > return err; >+ } > > graft: > if (1) { > > > From kaber@trash.net Tue Nov 9 16:40:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:40:40 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0eZNd005535 for ; Tue, 9 Nov 2004 16:40:35 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRgWv-0006z1-6s; Wed, 10 Nov 2004 01:40:09 +0100 Message-ID: <41916369.7020901@trash.net> Date: Wed, 10 Nov 2004 01:40:09 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: tgraf@suug.ch, spam@crocom.com.pl, netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> <20041109161816.425ad7d6.davem@davemloft.net> In-Reply-To: <20041109161816.425ad7d6.davem@davemloft.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11657 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 552 Lines: 24 David S. Miller wrote: >On Mon, 08 Nov 2004 20:46:18 +0100 >Patrick McHardy wrote: > > > >>New patch attached. >> >> > >How do these child qdiscs get destroyed at all if you just >remove them from the lists they are on? How will the rest >of destroy processing find them and clean them up? > > > The RCU-callback calls ops->destroy. The qdisc knows about it's inner structure and destroys all classes and the inner qdiscs. dev->qdisc_list is just a flat list containing all qdiscs of the tree for lookups. Regards Patrick From kaber@trash.net Tue Nov 9 16:56:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 16:56:11 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA0u2ZU006473 for ; Tue, 9 Nov 2004 16:56:02 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRglt-00071j-PK; Wed, 10 Nov 2004 01:55:37 +0100 Message-ID: <41916709.8020402@trash.net> Date: Wed, 10 Nov 2004 01:55:37 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: tgraf@suug.ch, spam@crocom.com.pl, netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> <20041109161816.425ad7d6.davem@davemloft.net> <41916369.7020901@trash.net> In-Reply-To: <41916369.7020901@trash.net> Content-Type: multipart/mixed; boundary="------------030408030203090309070206" X-archive-position: 11658 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 5723 Lines: 162 This is a multi-part message in MIME format. --------------030408030203090309070206 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Patrick McHardy wrote: > David S. Miller wrote: > >> How do these child qdiscs get destroyed at all if you just >> remove them from the lists they are on? How will the rest >> of destroy processing find them and clean them up? >> >> > > The RCU-callback calls ops->destroy. The qdisc knows about it's inner > structure and destroys all classes and the inner qdiscs. dev->qdisc_list > is just a flat list containing all qdiscs of the tree for lookups. This is the final patch: # [PKT_SCHED]: Unlink inner qdiscs immediately in qdisc_destroy # # Before the RCU change distruction of the qdisc and all inner # qdiscs happend immediately and under the rtnl semaphore. This # made sure nothing holding the rtnl semaphore could end up with # invalid memory. This is not true anymore, inner qdiscs found on # dev->qdisc_list can be suddenly destroyed by the RCU callback. # Unlink them immediately when the outer qdisc is destroyed so # nothing can find them until they get destroyed. This also makes semantics sane again, an inner qdiscs should not be user-visible once the containing qdisc has been destroyed. The second part (locking in qdisc_lookup) is not really required, but currently the only purpose of qdisc_tree_lock seems to be to protect dev->qdisc_list, which is also protected by the rtnl. The rtnl is especially relied on for making sure nobody frees a qdisc while it is used in user-context, so qdisc_tree_lock looks unnecessary. I'm currently reviewing all qdisc locking, if this turns out to be right I will remove qdisc_tree_lock entirely in a follow-up patch, but for now I left it in for consistency. Regards Patrick --------------030408030203090309070206 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/09 07:46:48+01:00 kaber@coreworks.de # [PKT_SCHED]: Unlink inner qdiscs immediately in qdisc_destroy # # Before the RCU change distruction of the qdisc and all inner # qdiscs happend immediately and under the rtnl semaphore. This # made sure nothing holding the rtnl semaphore could end up with # invalid memory. This is not true anymore, inner qdiscs found on # dev->qdisc_list can be suddenly destroyed by the RCU callback. # Unlink them immediately when the outer qdisc is destroyed so # nothing can find them until they get destroyed. # # With help from Thomas Graf # # Signed-off-by: Patrick McHardy # # net/sched/sch_generic.c # 2004/11/09 07:46:39+01:00 kaber@coreworks.de +23 -1 # [PKT_SCHED]: Unlink inner qdiscs immediately in qdisc_destroy # # Before the RCU change distruction of the qdisc and all inner # qdiscs happend immediately and under the rtnl semaphore. This # made sure nothing holding the rtnl semaphore could end up with # invalid memory. This is not true anymore, inner qdiscs found on # dev->qdisc_list can be suddenly destroyed by the RCU callback. # Unlink them immediately when the outer qdisc is destroyed so # nothing can find them until they get destroyed. # # With help from Thomas Graf # # Signed-off-by: Patrick McHardy # # net/sched/sch_api.c # 2004/11/09 07:46:39+01:00 kaber@coreworks.de +5 -1 # [PKT_SCHED]: Unlink inner qdiscs immediately in qdisc_destroy # # Before the RCU change distruction of the qdisc and all inner # qdiscs happend immediately and under the rtnl semaphore. This # made sure nothing holding the rtnl semaphore could end up with # invalid memory. This is not true anymore, inner qdiscs found on # dev->qdisc_list can be suddenly destroyed by the RCU callback. # Unlink them immediately when the outer qdisc is destroyed so # nothing can find them until they get destroyed. # # With help from Thomas Graf # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sched/sch_api.c b/net/sched/sch_api.c --- a/net/sched/sch_api.c 2004-11-10 01:45:31 +01:00 +++ b/net/sched/sch_api.c 2004-11-10 01:45:31 +01:00 @@ -196,10 +196,14 @@ { struct Qdisc *q; + read_lock_bh(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { - if (q->handle == handle) + if (q->handle == handle) { + read_unlock_bh(&qdisc_tree_lock); return q; + } } + read_unlock_bh(&qdisc_tree_lock); return NULL; } diff -Nru a/net/sched/sch_generic.c b/net/sched/sch_generic.c --- a/net/sched/sch_generic.c 2004-11-10 01:45:31 +01:00 +++ b/net/sched/sch_generic.c 2004-11-10 01:45:31 +01:00 @@ -483,10 +483,32 @@ void qdisc_destroy(struct Qdisc *qdisc) { + struct list_head cql = LIST_HEAD_INIT(cql); + struct Qdisc *cq, *q, *n; + if (qdisc->flags & TCQ_F_BUILTIN || !atomic_dec_and_test(&qdisc->refcnt)) return; - list_del(&qdisc->list); + + if (!list_empty(&qdisc->list)) { + if (qdisc->ops->cl_ops == NULL) + list_del(&qdisc->list); + else + list_move(&qdisc->list, &cql); + } + + /* unlink inner qdiscs from dev->qdisc_list immediately */ + list_for_each_entry(cq, &cql, list) + list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list) + if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) { + if (q->ops->cl_ops == NULL) + list_del_init(&q->list); + else + list_move_tail(&q->list, &cql); + } + list_for_each_entry_safe(cq, n, &cql, list) + list_del_init(&cq->list); + call_rcu(&qdisc->q_rcu, __qdisc_destroy); } --------------030408030203090309070206-- From tgraf@suug.ch Tue Nov 9 17:01:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:01:20 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA11Cob006920 for ; Tue, 9 Nov 2004 17:01:13 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 32C8CF; Wed, 10 Nov 2004 02:00:31 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 093EF1C0EA; Wed, 10 Nov 2004 02:01:13 +0100 (CET) Date: Wed, 10 Nov 2004 02:01:13 +0100 From: Thomas Graf To: "David S. Miller" Cc: Herbert Xu , kaber@trash.net, netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110010113.GJ31969@postel.suug.ch> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109161126.376f755c.davem@davemloft.net> X-archive-position: 11659 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1617 Lines: 34 * David S. Miller <20041109161126.376f755c.davem@davemloft.net> 2004-11-09 16:11 > On Sat, 06 Nov 2004 10:35:45 +1100 > Herbert Xu wrote: > > 2) Hooking random net/sched requests into rtnetlink. By being an > > rtnetlink user you pay the price of taking the rtnl. Most of the > > net/sched stuff has nothing to do with rtnetlink. > > I believe this is a false statement. Every single networking > config change depends upon device existence and state in some > way. By virtue of that, they really depend upon the RTNL being > held during the duration of their execution. > > Only the actual implementations know when and where such a > dependency on device state et al. does not exist, and therefore > where RTNL holding is not necessary. > > Therefore I suggest we just implement the fix for this inside of > the packet scheduler layer itself. Simply by dropping the RTNL > semaphore during the module request, and then regrabbing the RTNL > semaphore and replaying the request from the beginning. Sounds reasonable for the sch_api.c and cls_api.c case but will get very nasty for act_api as you noted and any further sub layers that might be added in the future. (The classifier I'm working on is such a case.) I suggest to add TCA_PRELOAD being an array of module names to be preloaded so userspace can tell us what modules might be needed. Those modules would get loaded at the same spot while rtnl semaphore is dropped. I think the fix is fine for cls/qdisc to fix it for older iproute2 versions but it might be worth to make the action code use it right away. Thoughts? From kaber@trash.net Tue Nov 9 17:11:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:11:40 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1BZCs007573 for ; Tue, 9 Nov 2004 17:11:36 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRh0T-00074D-So; Wed, 10 Nov 2004 02:10:41 +0100 Message-ID: <41916A91.3080107@trash.net> Date: Wed, 10 Nov 2004 02:10:41 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: "David S. Miller" , Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> In-Reply-To: <20041110010113.GJ31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11660 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 350 Lines: 13 Thomas Graf wrote: >Sounds reasonable for the sch_api.c and cls_api.c case but >will get very nasty for act_api as you noted and any further sub >layers that might be added in the future. (The classifier I'm >working on is such a case.) > Can you please show an example of a case where this is needed ? Just to help me understand. Regards Patrick From herbert@gondor.apana.org.au Tue Nov 9 17:16:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:16:35 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1GP97008035 for ; Tue, 9 Nov 2004 17:16:26 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRh5a-0003i9-00; Wed, 10 Nov 2004 12:15:58 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRh5Y-0001oK-00; Wed, 10 Nov 2004 12:15:56 +1100 Date: Wed, 10 Nov 2004 12:15:56 +1100 To: "David S. Miller" Cc: kaber@trash.net, netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110011556.GA6853@gondor.apana.org.au> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041109161126.376f755c.davem@davemloft.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11661 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1519 Lines: 36 On Tue, Nov 09, 2004 at 04:11:26PM -0800, David S. Miller wrote: > > I totally disagree. The use of rtnl for all networking configuration > changes is a virtue of our current setup. I agree with that. However, my point is that the RTNL is used for a lot more than that. > Only the actual implementations know when and where such a > dependency on device state et al. does not exist, and therefore > where RTNL holding is not necessary. You could do that if the RTNL was exclusively used for protecting net_device. As it is it protects RTNETLINK and other things too. > Therefore I suggest we just implement the fix for this inside of > the packet scheduler layer itself. Simply by dropping the RTNL > semaphore during the module request, and then regrabbing the RTNL > semaphore and replaying the request from the beginning. I agree that this will probably the simplest fix. However, I'd like to see some evidence that this is actually safe. For example, rtnetlink_rcv relies on the RTNL to ensure ordering between requests. Dropping the RTNL may cause the receive queue to be processed by another process. Now as it is I don't think it's a huge problem since we process requests as soon as they come in. But if we ever allow requests to be queued for RTNETLINK this may come back to bite us. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From tgraf@suug.ch Tue Nov 9 17:22:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:22:59 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1MqY3008597 for ; Tue, 9 Nov 2004 17:22:52 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 67FEBF; Wed, 10 Nov 2004 02:22:11 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 962401C0EA; Wed, 10 Nov 2004 02:22:51 +0100 (CET) Date: Wed, 10 Nov 2004 02:22:51 +0100 From: Thomas Graf To: Patrick McHardy Cc: "David S. Miller" , Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110012251.GK31969@postel.suug.ch> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41916A91.3080107@trash.net> X-archive-position: 11662 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 1110 Lines: 23 * Patrick McHardy <41916A91.3080107@trash.net> 2004-11-10 02:10 > Thomas Graf wrote: > > >Sounds reasonable for the sch_api.c and cls_api.c case but > >will get very nasty for act_api as you noted and any further sub > >layers that might be added in the future. (The classifier I'm > >working on is such a case.) > > > Can you please show an example of a case where this is needed ? > Just to help me understand. The action code might load modules in the middle of a classifier configuration and it will be very hard to reverse those changes. Right now we could move it to the top of all configurations and it would probably be possible to get back where we fetch the device but it will get impossible once a classifier requires module loading which is not unlikely. Well, it's not impossible but it would mean to have the action code parse the TLV and just try to load the module, then report to the classifier so it can try to load its own modules and then do the actual action and classifier configuration. I don't even want to think of how nasty it gets once a action module requests modules itself ;-> From kaber@trash.net Tue Nov 9 17:30:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:30:46 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1UfQO009130 for ; Tue, 9 Nov 2004 17:30:41 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRhIx-000770-Ht; Wed, 10 Nov 2004 02:29:47 +0100 Message-ID: <41916F0B.5010809@trash.net> Date: Wed, 10 Nov 2004 02:29:47 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: "David S. Miller" , Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> In-Reply-To: <20041110012251.GK31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11663 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1205 Lines: 36 Thomas Graf wrote: >* Patrick McHardy <41916A91.3080107@trash.net> 2004-11-10 02:10 > > >>Can you please show an example of a case where this is needed ? >>Just to help me understand. >> >> > >The action code might load modules in the middle of a classifier >configuration and it will be very hard to reverse those changes. >Right now we could move it to the top of all configurations and it >would probably be possible to get back where we fetch the device >but it will get impossible once a classifier requires module >loading which is not unlikely. > > Assuming all error-paths do proper cleanup, returning -EAGAIN should always result in the same configuration state as before. Module-loading as a side-effect is exactly why this is done, the replay will have all modules available. >Well, it's not impossible but it would mean to have the action >code parse the TLV and just try to load the module, then report >to the classifier so it can try to load its own modules and then do >the actual action and classifier configuration. I don't even want to >think of how nasty it gets once a action module requests modules itself ;-> > > I still don't understand the problem. Regards Patrick From tgraf@suug.ch Tue Nov 9 17:39:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:39:45 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1dcLs009732 for ; Tue, 9 Nov 2004 17:39:39 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 966DFF; Wed, 10 Nov 2004 02:38:58 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id C45C11C0EA; Wed, 10 Nov 2004 02:39:41 +0100 (CET) Date: Wed, 10 Nov 2004 02:39:41 +0100 From: Thomas Graf To: Patrick McHardy Cc: "David S. Miller" , Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110013941.GL31969@postel.suug.ch> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41916F0B.5010809@trash.net> X-archive-position: 11664 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 799 Lines: 17 * Patrick McHardy <41916F0B.5010809@trash.net> 2004-11-10 02:29 > Thomas Graf wrote: > >The action code might load modules in the middle of a classifier > >configuration and it will be very hard to reverse those changes. > >Right now we could move it to the top of all configurations and it > >would probably be possible to get back where we fetch the device > >but it will get impossible once a classifier requires module > >loading which is not unlikely. > > > > > Assuming all error-paths do proper cleanup, returning -EAGAIN > should always result in the same configuration state as before. I agree but this assumption is wrong, at least for u32. I agree that once this is true it would work perfectly fine, however I think it would be inefficient to parse the whole TLV tree multiple times. From akpm@osdl.org Tue Nov 9 17:40:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:40:17 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1eA4Z009847 for ; Tue, 9 Nov 2004 17:40:10 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAA1dQ919412; Tue, 9 Nov 2004 17:39:26 -0800 Date: Tue, 9 Nov 2004 17:39:20 -0800 From: Andrew Morton To: Stefan Schmidt Cc: marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, piggin@cyberone.com.au, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-Id: <20041109173920.08746dbd.akpm@osdl.org> In-Reply-To: <20041110012733.GD20754@zaphods.net> References: <20041103222447.GD28163@zaphods.net> <20041104121722.GB8537@logos.cnet> <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11665 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 6911 Lines: 122 Added netdev to Cc. Full cite. Stefan Schmidt wrote: > > Alright, i got a funny thing here that i suspect to be an(other?) vm issue: > > We are running a third-party closed source software which handles many tcp > sessions and reads and writes that to/from several disks/partitions. > With 2.6.10-rc1-mm4 it is the first time we notice that, right after the kernel > throws a swapper: page allocation error thread (just like the ones you already > know), the interrupt rate, connection count and traffic decreases subsequently. > > Here is part of a vmstat 10: > procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- > r b swpd free buff cache si so bi bo in cs us sy id wa > 1 0 11312 19404 268 1896896 0 0 1091 17578 25463 1225 7 38 37 18 > 0 0 11312 26372 180 1892836 0 0 1182 21433 25576 1216 7 38 31 24 > 1 2 11308 23784 608 1890168 0 0 1252 20667 25532 1243 7 40 24 29 > 0 2 11308 23304 428 1890552 0 0 1174 20363 25948 1332 7 40 32 21 > 1 1 11304 18496 444 1893328 0 0 1630 20506 25840 1322 7 38 30 26 > 1 1 11304 8712 232 1905508 0 0 1528 19662 26245 1305 7 40 25 28 > 1 0 11304 18952 180 1894000 0 0 1595 19680 26275 1215 7 38 27 28 > 1 0 11304 22404 132 1896632 0 0 369 17724 24072 1045 7 37 49 7 > 1 0 11304 23956 492 1899876 0 0 504 19609 20829 1151 9 34 49 7 > 1 0 11304 25380 460 1908340 0 0 424 17983 16964 927 9 28 55 8 > 1 0 11304 18244 464 1922140 0 0 309 14431 13417 836 10 27 60 3 > 0 0 11304 17720 472 1928388 0 0 224 11868 9933 607 11 23 63 3 > 1 0 11304 25720 476 1924440 0 0 133 7663 6780 504 10 20 68 2 > 1 0 11304 24156 488 1928168 0 0 107 6244 5011 315 8 18 73 1 > 0 0 11304 19544 712 1934268 0 0 76 3191 4464 299 8 18 73 1 > 0 0 11304 19248 728 1936564 0 0 23 1802 4002 249 7 17 76 0 > 1 0 11304 27092 736 1929892 0 0 16 1336 3655 284 6 16 78 0 > 0 0 11304 26472 752 1931984 0 0 19 1508 3408 248 5 16 78 1 > 0 0 11304 19000 768 1940944 0 0 20 1398 3195 226 5 14 81 0 > 1 0 11304 21460 776 1938896 0 0 14 1084 3057 241 5 14 82 0 > 0 0 11304 26268 848 1934608 0 0 12 927 2906 218 5 13 82 0 > 1 1 11304 22076 900 1939860 0 0 18 679 2897 215 5 11 84 1 > 0 0 11304 25880 952 1936748 0 0 17 653 2713 251 4 13 82 1 > 0 0 11304 20436 976 1942368 0 0 8 1117 2703 229 5 11 83 1 > ... > > strace shows: > 01:38:50.316041 gettimeofday({1100047130, 316054}, NULL) = 0 > 01:38:50.316188 poll([{fd=5671, events=POLLIN}, {fd=2727, events=POLLIN}, {fd=6663, events=POLLIN}, {fd=197, events=POLLIN}, {fd=3978, events=POLLIN}, {fd=779, events=POLLIN}, ...{line continues like this}... > ... > 01:38:50.328056 accept(5, 0xbffd4ab8, [16]) = -1 EAGAIN (Resource temporarily unavailable) ...{an awful lot of these}... > ... > 01:38:50.329585 futex(0xaf1a698, FUTEX_WAIT, 92828, {0, 9964000}) = -1 ETIMEDOUT (Connection timed out) ...{some of these}... > ... > Application says: > "n.n.n.n:p Client closed connection in body read" > > To me it seems like suddently all those open sockets are suddenly 'temporarily > unavailable' to the application and so the connections time out. > I have not (yet?) seen this behaviour on 2.6.9, 2.6.9-mm1, 2.6.10-rc1-bk12 or > 2.6.10-rc1-mm3. > I am able to reproduce the behaviour if under the same load iptraf or > tethereal are started. (First thought it might be because of the promisc mode.) > > This seems to be what _might_ have triggered this although it was logged > happened 5m earlier than the traffic decay: > > printk: 36 messages suppressed. > swapper: page allocation failure. order:0, mode:0x20 > [__alloc_pages+525/912] __alloc_pages+0x20d/0x390 > [__get_free_pages+24/48] __get_free_pages+0x18/0x30 > [kmem_getpages+24/192] kmem_getpages+0x18/0xc0 > [cache_grow+157/304] cache_grow+0x9d/0x130 > [cache_alloc_refill+380/576] cache_alloc_refill+0x17c/0x240 > [__kmalloc+122/144] __kmalloc+0x7a/0x90 > [alloc_skb+50/208] alloc_skb+0x32/0xd0 > [tg3_alloc_rx_skb+112/304] tg3_alloc_rx_skb+0x70/0x130 > [tg3_rx+518/944] tg3_rx+0x206/0x3b0 > [tg3_poll+139/336] tg3_poll+0x8b/0x150 > [net_rx_action+125/288] net_rx_action+0x7d/0x120 > [__do_softirq+184/208] __do_softirq+0xb8/0xd0 > [do_softirq+45/48] do_softirq+0x2d/0x30 > [do_IRQ+30/48] do_IRQ+0x1e/0x30 > [common_interrupt+26/32] common_interrupt+0x1a/0x20 > [default_idle+0/64] default_idle+0x0/0x40 > [default_idle+44/64] default_idle+0x2c/0x40 > [cpu_idle+51/64] cpu_idle+0x33/0x40 > [start_kernel+331/368] start_kernel+0x14b/0x170 > [unknown_bootoption+0/432] unknown_bootoption+0x0/0x1b0 > DMA per-cpu: > cpu 0 hot: low 2, high 6, batch 1 > cpu 0 cold: low 0, high 2, batch 1 > cpu 1 hot: low 2, high 6, batch 1 > cpu 1 cold: low 0, high 2, batch 1 > Normal per-cpu: > cpu 0 hot: low 32, high 96, batch 16 > cpu 0 cold: low 0, high 32, batch 16 > cpu 1 hot: low 32, high 96, batch 16 > cpu 1 cold: low 0, high 32, batch 16 > HighMem per-cpu: > cpu 0 hot: low 32, high 96, batch 16 > cpu 0 cold: low 0, high 32, batch 16 > cpu 1 hot: low 32, high 96, batch 16 > cpu 1 cold: low 0, high 32, batch 16 > > Free pages: 4616kB (1600kB HighMem) > Active:504159 inactive:454759 dirty:20020 writeback:115 unstable:0 free:1154 slab:50758 mapped:489095 pagetables:1222 > DMA free:56kB min:144kB low:288kB high:432kB active:1936kB inactive:4932kB present:16384kB pages_scanned:32 all_unreclaimable? no > protections[]: 0 0 0 > Normal free:2960kB min:8044kB low:16088kB high:24132kB active:492320kB inactive:166992kB present:901120kB pages_scanned:62 all_unreclaimable? no > protections[]: 0 0 0 > HighMem free:1600kB min:512kB low:1024kB high:1536kB active:1522380kB inactive:1647112kB present:3178432kB pages_scanned:0 all_unreclaimable? no > protections[]: 0 0 0 > DMA: 0*4kB 1*8kB 1*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 56kB > Normal: 0*4kB 0*8kB 1*16kB 0*32kB 2*64kB 0*128kB 1*256kB 1*512kB 0*1024kB 1*2048kB 0*4096kB = 2960kB > HighMem: 6*4kB 3*8kB 41*16kB 0*32kB 6*64kB 0*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 1600kB > Swap cache: add 154147, delete 151810, find 29532/39794, race 0+0 > Well you've definitely used up all the memory which is available for atomic allocations. Are you using an increased /proc/sys/vm/min_free_kbytes there? As for the application collapse: dunno. Maybe networking broke. It would be interesting to test Linus's current tree, at ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.10-rc1-bk19.gz From herbert@gondor.apana.org.au Tue Nov 9 17:41:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:42:03 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1ftq0010405 for ; Tue, 9 Nov 2004 17:41:56 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRhUG-0003uW-00; Wed, 10 Nov 2004 12:41:28 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRhUE-0001tz-00; Wed, 10 Nov 2004 12:41:26 +1100 Date: Wed, 10 Nov 2004 12:41:25 +1100 To: Thomas Graf Cc: Patrick McHardy , "David S. Miller" , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110014125.GA7302@gondor.apana.org.au> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> <20041110013941.GL31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110013941.GL31969@postel.suug.ch> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11666 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 494 Lines: 13 On Wed, Nov 10, 2004 at 02:39:41AM +0100, Thomas Graf wrote: > > that once this is true it would work perfectly fine, however I > think it would be inefficient to parse the whole TLV tree multiple > times. Well it's only going to happen once for each module so that's no big deal. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From kaber@trash.net Tue Nov 9 17:48:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 17:48:28 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA1mMPX010909 for ; Tue, 9 Nov 2004 17:48:23 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CRha4-00079c-UA; Wed, 10 Nov 2004 02:47:28 +0100 Message-ID: <41917330.6090002@trash.net> Date: Wed, 10 Nov 2004 02:47:28 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Thomas Graf CC: "David S. Miller" , Herbert Xu , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> <20041110013941.GL31969@postel.suug.ch> In-Reply-To: <20041110013941.GL31969@postel.suug.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11667 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 685 Lines: 28 Thomas Graf wrote: >* Patrick McHardy <41916F0B.5010809@trash.net> 2004-11-10 02:29 > > >>Assuming all error-paths do proper cleanup, returning -EAGAIN >>should always result in the same configuration state as before. >> >> > >I agree but this assumption is wrong, at least for u32. > It will be true soon :) Anything else is a bug, and a nice side-effect of this change is that all those dusty error-paths actually get used. >I agree >that once this is true it would work perfectly fine, however I >think it would be inefficient to parse the whole TLV tree multiple >times. > > It will only happen once for every module, so I don't think it's a big deal. Regards Patrick From zaphodb@boombox.zaphods.net Tue Nov 9 18:04:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 18:04:09 -0800 (PST) Received: from shinjuku.zaphods.net (shinjuku.zaphods.net [194.97.108.52]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA243Vj012103 for ; Tue, 9 Nov 2004 18:04:04 -0800 Received: from gatekeeper.research.zaphods.net ([194.97.1.3] helo=boombox) by shinjuku.zaphods.net with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CRhpT-0008Kq-7r; Wed, 10 Nov 2004 03:03:23 +0100 Received: from zaphodb by boombox with local (Exim 4.34) id 1CRhpX-00032O-HO; Wed, 10 Nov 2004 03:03:27 +0100 Date: Wed, 10 Nov 2004 03:03:27 +0100 From: Stefan Schmidt To: Andrew Morton Cc: marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, piggin@cyberone.com.au, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110020327.GE20754@zaphods.net> References: <20041103222447.GD28163@zaphods.net> <20041104121722.GB8537@logos.cnet> <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="WhfpMioaduB5tiZL" Content-Disposition: inline In-Reply-To: <20041109173920.08746dbd.akpm@osdl.org> User-Agent: Mutt/1.5.6+20040907i X-SA-Exim-Connect-IP: 194.97.1.3 X-SA-Exim-Mail-From: zaphodb@boombox.zaphods.net X-SA-Exim-Scanned: No (on shinjuku.zaphods.net); SAEximRunCond expanded to false X-archive-position: 11668 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zaphodb@zaphods.net Precedence: bulk X-list: netdev Content-Length: 2432 Lines: 77 --WhfpMioaduB5tiZL Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Nov 09, 2004 at 05:39:20PM -0800, Andrew Morton wrote: > Well you've definitely used up all the memory which is available for atomic > allocations. Are you using an increased /proc/sys/vm/min_free_kbytes there? Yes, vm.min_free_kbytes=8192. For other vm-settings find sysctl.conf attached. Netdev: tg3 BCM5704r03, TSO off, ~32kpps rx, ~35kpps tx, ~2 rx errors/s > As for the application collapse: dunno. Maybe networking broke. It would > be interesting to test Linus's current tree, at > ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.10-rc1-bk19.gz Will try that tomorrow. Would you suggest printing out show_free_areas(); there too? I don't know what kind of an overhead that will generate on subsequent stack traces. Stefan --WhfpMioaduB5tiZL Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="sysctl.conf" # # /etc/sysctl.conf - Configuration file for setting system variables # See sysctl.conf (5) for information. # #kernel.domainname = example.com #net/ipv4/icmp_echo_ignore_broadcasts=1 vm.min_free_kbytes=8192 vm.dirty_expire_centisecs=1000 #vm.dirty_expire_centisecs=3000 vm.dirty_writeback_centisecs=250 #vm.dirty_writeback_centisecs=500 vm.dirty_ratio=10 #vm.dirty_ratio=40 vm.dirty_background_ratio=2 #vm.dirty_background_ratio=10 vm.swappiness=0 #vm.swappiness=60 vm.overcommit_ratio=0 #vm.overcommit_ratio=50 #default: #vm.bdflush=30 500 0 0 500 3000 60 20 0 #vm.bdflush=10 500 0 0 500 1500 60 5 0 net.ipv4.tcp_rmem=4096 87380 174760 net.ipv4.tcp_wmem=4096 16384 131072 net.core.rmem_default=108544 net.core.wmem_default=108544 net.core.wmem_max=1048576 #net.core.wmem_max=131071 net.core.rmem_max=1048576 #net.core.rmem_max=131071 net.core.somaxconn=1024 #net.core.somaxconn=128 net.ipv4.tcp_max_syn_backlog=2048 #net.ipv4.tcp_max_syn_backlog=1024 net.ipv4.tcp_ecn=0 net.ipv4.tcp_abort_on_overflow=1 #net.ipv4.tcp_abort_on_overflow=0 et.core.netdev_max_backlog=300 #net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_moderate_rcvbuf=1 net.ipv4.netfilter.ip_conntrack_max=65536 fs.xfs.age_buffer_centisecs=300 #fs.xfs.age_buffer_centisecs=1500 fs.xfs.xfsbufd_centisecs=200 #fs.xfs.xfsbufd_centisecs=100 fs.xfs.xfssyncd_centisecs=600 #fs.xfs.xfssyncd_centisecs=3000 fs.aio-max-nr=131072 #fs.aio-max-nr=65536 --WhfpMioaduB5tiZL-- From akpm@osdl.org Tue Nov 9 18:22:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 18:22:12 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA2M73g013480 for ; Tue, 9 Nov 2004 18:22:08 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAA2LZ926447; Tue, 9 Nov 2004 18:21:35 -0800 Date: Tue, 9 Nov 2004 18:21:29 -0800 From: Andrew Morton To: Stefan Schmidt Cc: marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, piggin@cyberone.com.au, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-Id: <20041109182129.22a4e9a3.akpm@osdl.org> In-Reply-To: <20041110020327.GE20754@zaphods.net> References: <20041103222447.GD28163@zaphods.net> <20041104121722.GB8537@logos.cnet> <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11669 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 626 Lines: 13 Stefan Schmidt wrote: > > > As for the application collapse: dunno. Maybe networking broke. It would > > be interesting to test Linus's current tree, at > > ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.10-rc1-bk19.gz > Will try that tomorrow. Would you suggest printing out show_free_areas(); > there too? I don't know what kind of an overhead that will generate on > subsequent stack traces. I don't think it'd help much - we know what's happening. It would be interesting to keep increasing min_free_kbytes, see if you can characterise the system's response to this setting. From piggin@cyberone.com.au Tue Nov 9 20:27:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 20:27:21 -0800 (PST) Received: from mail.iinet.net.au (mail-03.iinet.net.au [203.59.3.35]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAA4RESn020154 for ; Tue, 9 Nov 2004 20:27:15 -0800 Received: (qmail 5501 invoked from network); 10 Nov 2004 04:24:12 -0000 Received: from unknown (HELO chimp.local.net) (203.173.7.228) by mail.iinet.net.au with SMTP; 10 Nov 2004 04:24:11 -0000 Received: from didi.local.net ([192.168.0.1]) by chimp.local.net with esmtp (Exim 4.34) id 1CRk1j-0000Dc-1F; Wed, 10 Nov 2004 15:24:11 +1100 Message-ID: <419197EA.9090809@cyberone.com.au> Date: Wed, 10 Nov 2004 15:24:10 +1100 From: Nick Piggin User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040820 Debian/1.7.2-4 X-Accept-Language: en MIME-Version: 1.0 To: Stefan Schmidt CC: Andrew Morton , marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures References: <20041103222447.GD28163@zaphods.net> <20041104121722.GB8537@logos.cnet> <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> In-Reply-To: <20041110020327.GE20754@zaphods.net> Content-Type: multipart/mixed; boundary="------------080307060904030302030206" X-archive-position: 11670 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: piggin@cyberone.com.au Precedence: bulk X-list: netdev Content-Length: 4119 Lines: 136 This is a multi-part message in MIME format. --------------080307060904030302030206 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Stefan Schmidt wrote: >On Tue, Nov 09, 2004 at 05:39:20PM -0800, Andrew Morton wrote: > >>Well you've definitely used up all the memory which is available for atomic >>allocations. Are you using an increased /proc/sys/vm/min_free_kbytes there? >> >Yes, vm.min_free_kbytes=8192. >For other vm-settings find sysctl.conf attached. > >Netdev: tg3 BCM5704r03, TSO off, ~32kpps rx, ~35kpps tx, ~2 rx errors/s > > >>As for the application collapse: dunno. Maybe networking broke. It would >>be interesting to test Linus's current tree, at >>ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.10-rc1-bk19.gz >> >Will try that tomorrow. Would you suggest printing out show_free_areas(); >there too? I don't know what kind of an overhead that will generate on >subsequent stack traces. > > Stefan, Can you try the following patch, please? It is diffed against 2.6.10-rc1, but I think it should apply to -mm kernels as well. Basically 2.6.8 and earlier kernels had some quirks in the page allocator that would allow for example, a large portion of "DMA" memory to be reserved for network memory allocations (atomic allocations). After 'fixing' this problem, 2.6.9 is effectively left with about a quarter the amount of memory reserved for network allocations compared with 2.6.8. The following patch roughly restores parity there. Thanks. Nick --------------080307060904030302030206 Content-Type: text/x-patch; name="mm-restore-atomic-buffer.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mm-restore-atomic-buffer.patch" --- linux-2.6-npiggin/mm/page_alloc.c | 41 +++++++++++++++++++++----------------- 1 files changed, 23 insertions(+), 18 deletions(-) diff -puN mm/page_alloc.c~mm-restore-atomic-buffer mm/page_alloc.c --- linux-2.6/mm/page_alloc.c~mm-restore-atomic-buffer 2004-11-10 15:13:33.000000000 +1100 +++ linux-2.6-npiggin/mm/page_alloc.c 2004-11-10 14:57:54.000000000 +1100 @@ -1935,8 +1935,12 @@ static void setup_per_zone_pages_min(voi lowmem_pages; } - zone->pages_low = zone->pages_min * 2; - zone->pages_high = zone->pages_min * 3; + /* + * When interpreting these watermarks, just keep in mind that: + * zone->pages_min == (zone->pages_min * 4) / 4; + */ + zone->pages_low = (zone->pages_min * 5) / 4; + zone->pages_high = (zone->pages_min * 6) / 4; spin_unlock_irqrestore(&zone->lru_lock, flags); } } @@ -1945,24 +1949,25 @@ static void setup_per_zone_pages_min(voi * Initialise min_free_kbytes. * * For small machines we want it small (128k min). For large machines - * we want it large (16MB max). But it is not linear, because network + * we want it large (64MB max). But it is not linear, because network * bandwidth does not increase linearly with machine size. We use * - * min_free_kbytes = sqrt(lowmem_kbytes) + * min_free_kbytes = 4 * sqrt(lowmem_kbytes), for better accuracy: + * min_free_kbytes = sqrt(lowmem_kbytes * 16) * * which yields * - * 16MB: 128k - * 32MB: 181k - * 64MB: 256k - * 128MB: 362k - * 256MB: 512k - * 512MB: 724k - * 1024MB: 1024k - * 2048MB: 1448k - * 4096MB: 2048k - * 8192MB: 2896k - * 16384MB: 4096k + * 16MB: 512k + * 32MB: 724k + * 64MB: 1024k + * 128MB: 1448k + * 256MB: 2048k + * 512MB: 2896k + * 1024MB: 4096k + * 2048MB: 5792k + * 4096MB: 8192k + * 8192MB: 11584k + * 16384MB: 16384k */ static int __init init_per_zone_pages_min(void) { @@ -1970,11 +1975,11 @@ static int __init init_per_zone_pages_mi lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10); - min_free_kbytes = int_sqrt(lowmem_kbytes); + min_free_kbytes = int_sqrt(lowmem_kbytes * 16); if (min_free_kbytes < 128) min_free_kbytes = 128; - if (min_free_kbytes > 16384) - min_free_kbytes = 16384; + if (min_free_kbytes > 65536) + min_free_kbytes = 65536; setup_per_zone_pages_min(); setup_per_zone_protection(); return 0; _ --------------080307060904030302030206-- From davem@davemloft.net Tue Nov 9 21:48:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 21:48:17 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA5mADZ023772 for ; Tue, 9 Nov 2004 21:48:11 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRl8P-0007ZR-00; Tue, 09 Nov 2004 21:35:09 -0800 Date: Tue, 9 Nov 2004 21:35:09 -0800 From: "David S. Miller" To: Herbert Xu Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Fix dst leak in ipv6_add_addr Message-Id: <20041109213509.38135698.davem@davemloft.net> In-Reply-To: <20041106044121.GA16397@gondor.apana.org.au> References: <20041106044121.GA16397@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11671 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 246 Lines: 9 On Sat, 6 Nov 2004 15:41:21 +1100 Herbert Xu wrote: > Found another error-path dst leak. If the idev->dead check is > triggered in ipv6_add_addr the rt entry will leak. Good catch, patch applied. Thanks Herbert. From davem@davemloft.net Tue Nov 9 21:51:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 21:51:23 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA5pH5s024165 for ; Tue, 9 Nov 2004 21:51:17 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRlBT-0007a3-00; Tue, 09 Nov 2004 21:38:19 -0800 Date: Tue, 9 Nov 2004 21:38:19 -0800 From: "David S. Miller" To: Herbert Xu Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [IPV6] Close small race in ip6_del_rt Message-Id: <20041109213819.1e996045.davem@davemloft.net> In-Reply-To: <20041106103449.GA18569@gondor.apana.org.au> References: <20041106103449.GA18569@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11672 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 630 Lines: 18 On Sat, 6 Nov 2004 21:34:49 +1100 Herbert Xu wrote: > There is a small SMP race in ip6_del_rt where we maybe dereferencing a dst > that has been freed. This patch fixes it. Looks good, applied. Thanks. There are certain routines, such as fib6_add() and fib_del() for which it would be nice to have dst/rt refcounting descriptions in comments. Then we could: 1) Verify they actually provide that behavior. 2) Make sure callers handle this behavior properly. I mention this because I had to read the entirety of fib6_add() to verify some dst refcounting code paths in the ipv6 stack last week. From davem@davemloft.net Tue Nov 9 21:54:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 21:54:18 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA5sEQO024553 for ; Tue, 9 Nov 2004 21:54:14 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRlEF-0007ad-00; Tue, 09 Nov 2004 21:41:11 -0800 Date: Tue, 9 Nov 2004 21:41:11 -0800 From: "David S. Miller" To: Herbert Xu Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [NET] Fix neighbour tbl->entries race Message-Id: <20041109214111.59be601f.davem@davemloft.net> In-Reply-To: <20041107080839.GA26158@gondor.apana.org.au> References: <20041102112651.GA8633@gondor.apana.org.au> <1099404823.1021.15.camel@jzny.localdomain> <20041102203720.GA12108@gondor.apana.org.au> <20041102210259.GA12642@gondor.apana.org.au> <20041102220603.GA13312@gondor.apana.org.au> <20041103155438.07a219ad.davem@davemloft.net> <20041107080839.GA26158@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11673 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 253 Lines: 9 On Sun, 7 Nov 2004 19:08:39 +1100 Herbert Xu wrote: > Sure. BTW this bug is a lot older than the new neighbours code. > It's in the very first revision of neighbour.c :) Indeed. :-) Patch applied, thanks a lot Herbert. From davem@davemloft.net Tue Nov 9 21:59:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 21:59:16 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA5x9NF025158 for ; Tue, 9 Nov 2004 21:59:10 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRlJ6-0007bW-00; Tue, 09 Nov 2004 21:46:12 -0800 Date: Tue, 9 Nov 2004 21:46:11 -0800 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix scheduler/classifier module unload race Message-Id: <20041109214611.267a79d5.davem@davemloft.net> In-Reply-To: <418EA497.10302@trash.net> References: <418EA497.10302@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11674 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 368 Lines: 10 On Sun, 07 Nov 2004 23:41:27 +0100 Patrick McHardy wrote: > This patch fixes an scheduler/classifier module unload race. > struct Qdisc_ops which includes the owner field is also part > of the module's memory, so ops might already be freed when > try_module_get(ops->owner) is called outside of the locked > section. Applied, thanks a lot Patrick. From davem@davemloft.net Tue Nov 9 22:18:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 22:18:44 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA6IdMU025963 for ; Tue, 9 Nov 2004 22:18:39 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRlc0-0007do-00; Tue, 09 Nov 2004 22:05:44 -0800 Date: Tue, 9 Nov 2004 22:05:44 -0800 From: "David S. Miller" To: Ralf Baechle Cc: netdev@oss.sgi.com Subject: Re: AX.25 cb lookup patch Message-Id: <20041109220544.5841b9b7.davem@davemloft.net> In-Reply-To: <20041109033617.GB621@linux-mips.org> References: <20041109033617.GB621@linux-mips.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11675 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 355 Lines: 9 On Tue, 9 Nov 2004 04:36:18 +0100 Ralf Baechle wrote: > Ax AX.25 connection is identified only by it's source and destination, > not by the device it's routed through, so fix the connection block > lookup to ignore the device of a connection. This fixes dying connections > in case of an AX.25 routing flap. Applied, thanks Ralf. From davem@davemloft.net Tue Nov 9 22:26:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 22:26:13 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA6Q7ie026441 for ; Tue, 9 Nov 2004 22:26:07 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CRlj6-0007es-00; Tue, 09 Nov 2004 22:13:04 -0800 Date: Tue, 9 Nov 2004 22:13:04 -0800 From: "David S. Miller" To: Patrick McHardy Cc: tgraf@suug.ch, spam@crocom.com.pl, netdev@oss.sgi.com Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts Message-Id: <20041109221304.7f9c17af.davem@davemloft.net> In-Reply-To: <41916709.8020402@trash.net> References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> <20041109161816.425ad7d6.davem@davemloft.net> <41916369.7020901@trash.net> <41916709.8020402@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11676 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 267 Lines: 11 On Wed, 10 Nov 2004 01:55:37 +0100 Patrick McHardy wrote: > This is the final patch: ... > # [PKT_SCHED]: Unlink inner qdiscs immediately in qdisc_destroy I understand how this work now. Thanks for the explanation and updated patch. Applied. From yoshfuji@linux-ipv6.org Tue Nov 9 23:59:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 09 Nov 2004 23:59:50 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA7xfwD029056 for ; Tue, 9 Nov 2004 23:59:41 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 3D9AE33CE5; Wed, 10 Nov 2004 17:00:27 +0900 (JST) Date: Wed, 10 Nov 2004 03:00:26 -0500 (EST) Message-Id: <20041110.030026.29809367.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: [BK PATCH] Misc IPv6 Updates From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11677 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 27697 Lines: 831 Hello. Here're changeset at: bk://bk.skbuff.net:20610/linux-2.6-inet6-misc/ Note: 1. Bug#3717 will be closed next week, after my returning to Japan. 2. Since there're some points to retain ipv6_addr_cmp(), let's introduce fast ipv6_addr_equal() and use it where appropriate. (please double check.) 3. I'm not so worring about alignment because we already have ipv6_addr_any() etc. If you're unhappy with this, let me re-create changesets. Thank you. HEADLINES --------- ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg. ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function. ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate. DIFFSTATS --------- include/net/ipv6.h | 9 +++++++++ include/net/tcp.h | 16 +++++++++++----- net/ipv4/tcp_timer.c | 7 ++++++- net/ipv6/addrconf.c | 10 +++++----- net/ipv6/anycast.c | 10 +++++----- net/ipv6/datagram.c | 2 +- net/ipv6/ip6_fib.c | 4 ++-- net/ipv6/ip6_flowlabel.c | 2 +- net/ipv6/ip6_output.c | 4 ++-- net/ipv6/ip6_tunnel.c | 10 +++++----- net/ipv6/mcast.c | 37 ++++++++++++++++++------------------- net/ipv6/ndisc.c | 2 +- net/ipv6/netfilter/ip6_queue.c | 4 ++-- net/ipv6/netfilter/ip6t_rt.c | 4 ++-- net/ipv6/raw.c | 8 ++++---- net/ipv6/reassembly.c | 8 ++++---- net/ipv6/route.c | 8 ++++---- net/ipv6/tcp_ipv6.c | 16 ++++++++-------- net/ipv6/udp.c | 12 ++++++------ net/ipv6/xfrm6_policy.c | 6 +++--- net/ipv6/xfrm6_state.c | 6 +++--- net/sctp/ipv6.c | 2 +- 22 files changed, 103 insertions(+), 84 deletions(-) CHANGESETS ---------- ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg. Closed: Bug#3717 (by John Goerzen ) Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h 2004-11-10 16:44:58 +09:00 +++ b/include/net/tcp.h 2004-11-10 16:44:58 +09:00 @@ -965,7 +965,9 @@ extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu); extern unsigned int tcp_current_mss(struct sock *sk, int large); -extern const char timer_bug_msg[]; +#ifdef TCP_DEBUG +extern const char tcp_timer_bug_msg[]; +#endif /* tcp_diag.c */ extern void tcp_get_info(struct sock *, struct tcp_info *); @@ -998,7 +1000,9 @@ #endif break; default: - printk(timer_bug_msg); +#ifdef TCP_DEBUG + printk(tcp_timer_bug_msg); +#endif return; }; @@ -1033,7 +1037,9 @@ break; default: - printk(timer_bug_msg); +#ifdef TCP_DEBUG + printk(tcp_timer_bug_msg); +#endif }; } diff -Nru a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c --- a/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00 +++ b/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00 @@ -36,7 +36,9 @@ static void tcp_delack_timer(unsigned long); static void tcp_keepalive_timer (unsigned long data); -const char timer_bug_msg[] = KERN_DEBUG "tcpbug: unknown timer value\n"; +#ifdef TCP_DEBUG +const char tcp_timer_bug_msg[] = KERN_DEBUG "tcpbug: unknown timer value\n"; +#endif /* * Using different timers for retransmit, delayed acks and probes @@ -651,3 +653,6 @@ EXPORT_SYMBOL(tcp_delete_keepalive_timer); EXPORT_SYMBOL(tcp_init_xmit_timers); EXPORT_SYMBOL(tcp_reset_keepalive_timer); +#ifdef TCP_DEBUG +EXPORT_SYMBOL(tcp_timer_bug_msg); +#endif ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function. It is not optimal to use ipv6_addr_cmp() for simple address comparison, which checks if two addresses are equal. Based on idea from Dave Craig . Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/ipv6.h b/include/net/ipv6.h --- a/include/net/ipv6.h 2004-11-10 16:45:02 +09:00 +++ b/include/net/ipv6.h 2004-11-10 16:45:02 +09:00 @@ -296,6 +296,15 @@ } #endif +static inline int ipv6_addr_equal(const struct in6_addr *a1, + const struct in6_addr *a2) +{ + return (a1->s6_addr32[0] == a2->s6_addr32[0] && + a1->s6_addr32[1] == a2->s6_addr32[1] && + a1->s6_addr32[2] == a2->s6_addr32[2] && + a1->s6_addr32[3] == a2->s6_addr32[3]); +} + static inline int ipv6_addr_any(const struct in6_addr *a) { return ((a->s6_addr32[0] | a->s6_addr32[1] | ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate. Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h 2004-11-10 16:45:07 +09:00 +++ b/include/net/tcp.h 2004-11-10 16:45:07 +09:00 @@ -361,8 +361,8 @@ #define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif) \ (((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \ ((__sk)->sk_family == AF_INET6) && \ - !ipv6_addr_cmp(&inet6_sk(__sk)->daddr, (__saddr)) && \ - !ipv6_addr_cmp(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ + ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ + ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) /* These can have wildcards, don't try too hard. */ diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00 @@ -921,7 +921,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) == 0 && + if (ipv6_addr_equal(&ifp->addr, addr) && !(ifp->flags&IFA_F_TENTATIVE)) { if (dev == NULL || ifp->idev->dev == dev || !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) @@ -940,7 +940,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) == 0) { + if (ipv6_addr_equal(&ifp->addr, addr)) { if (dev == NULL || ifp->idev->dev == dev) break; } @@ -956,7 +956,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) == 0) { + if (ipv6_addr_equal(&ifp->addr, addr)) { if (dev == NULL || ifp->idev->dev == dev || !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in6_ifa_hold(ifp); @@ -992,7 +992,7 @@ return 1; if (sk2_rcv_saddr6 && - !ipv6_addr_cmp(sk_rcv_saddr6, sk2_rcv_saddr6)) + ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6)) return 1; if (addr_type == IPV6_ADDR_MAPPED && @@ -1630,7 +1630,7 @@ read_lock_bh(&idev->lock); for (ifp = idev->addr_list; ifp; ifp=ifp->if_next) { if (ifp->prefix_len == plen && - (!memcmp(pfx, &ifp->addr, sizeof(struct in6_addr)))) { + ipv6_addr_equal(pfx, &ifp->addr)) { in6_ifa_hold(ifp); read_unlock_bh(&idev->lock); diff -Nru a/net/ipv6/anycast.c b/net/ipv6/anycast.c --- a/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00 @@ -205,7 +205,7 @@ prev_pac = NULL; for (pac = np->ipv6_ac_list; pac; pac = pac->acl_next) { if ((ifindex == 0 || pac->acl_ifindex == ifindex) && - ipv6_addr_cmp(&pac->acl_addr, addr) == 0) + ipv6_addr_equal(&pac->acl_addr, addr)) break; prev_pac = pac; } @@ -278,7 +278,7 @@ for (pac=np->ipv6_ac_list; pac; pac=pac->acl_next) { if (ifindex && pac->acl_ifindex != ifindex) continue; - found = ipv6_addr_cmp(&pac->acl_addr, addr) == 0; + found = ipv6_addr_equal(&pac->acl_addr, addr); if (found) break; } @@ -320,7 +320,7 @@ } for (aca = idev->ac_list; aca; aca = aca->aca_next) { - if (ipv6_addr_cmp(&aca->aca_addr, addr) == 0) { + if (ipv6_addr_equal(&aca->aca_addr, addr)) { aca->aca_users++; err = 0; goto out; @@ -384,7 +384,7 @@ write_lock_bh(&idev->lock); prev_aca = NULL; for (aca = idev->ac_list; aca; aca = aca->aca_next) { - if (ipv6_addr_cmp(&aca->aca_addr, addr) == 0) + if (ipv6_addr_equal(&aca->aca_addr, addr)) break; prev_aca = aca; } @@ -436,7 +436,7 @@ if (idev) { read_lock_bh(&idev->lock); for (aca = idev->ac_list; aca; aca = aca->aca_next) - if (ipv6_addr_cmp(&aca->aca_addr, addr) == 0) + if (ipv6_addr_equal(&aca->aca_addr, addr)) break; read_unlock_bh(&idev->lock); in6_dev_put(idev); diff -Nru a/net/ipv6/datagram.c b/net/ipv6/datagram.c --- a/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00 @@ -190,7 +190,7 @@ } ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) ? + ipv6_addr_equal(&fl.fl6_dst, &np->daddr) ? &np->daddr : NULL); sk->sk_state = TCP_ESTABLISHED; diff -Nru a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c --- a/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00 @@ -451,8 +451,8 @@ if (iter->rt6i_dev == rt->rt6i_dev && iter->rt6i_idev == rt->rt6i_idev && - ipv6_addr_cmp(&iter->rt6i_gateway, - &rt->rt6i_gateway) == 0) { + ipv6_addr_equal(&iter->rt6i_gateway, + &rt->rt6i_gateway)) { if (!(iter->rt6i_flags&RTF_EXPIRES)) return -EEXIST; iter->rt6i_expires = rt->rt6i_expires; diff -Nru a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c --- a/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00 @@ -500,7 +500,7 @@ goto release; err = -EINVAL; - if (ipv6_addr_cmp(&fl1->dst, &fl->dst) || + if (!ipv6_addr_equal(&fl1->dst, &fl->dst) || ipv6_opt_cmp(fl1->opt, fl->opt)) goto release; diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c --- a/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00 @@ -768,9 +768,9 @@ */ if (((rt->rt6i_dst.plen != 128 || - ipv6_addr_cmp(&fl->fl6_dst, &rt->rt6i_dst.addr)) + !ipv6_addr_equal(&fl->fl6_dst, &rt->rt6i_dst.addr)) && (np->daddr_cache == NULL || - ipv6_addr_cmp(&fl->fl6_dst, np->daddr_cache))) + !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache))) || (fl->oif && fl->oif != (*dst)->dev->ifindex)) { *dst = NULL; } else diff -Nru a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c --- a/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00 @@ -133,8 +133,8 @@ struct ip6_tnl *t; for (t = tnls_r_l[h0 ^ h1]; t; t = t->next) { - if (!ipv6_addr_cmp(local, &t->parms.laddr) && - !ipv6_addr_cmp(remote, &t->parms.raddr) && + if (ipv6_addr_equal(local, &t->parms.laddr) && + ipv6_addr_equal(remote, &t->parms.raddr) && (t->dev->flags & IFF_UP)) return t; } @@ -284,8 +284,8 @@ return -EINVAL; for (t = *ip6ip6_bucket(p); t; t = t->next) { - if (!ipv6_addr_cmp(local, &t->parms.laddr) && - !ipv6_addr_cmp(remote, &t->parms.raddr)) { + if (ipv6_addr_equal(local, &t->parms.laddr) && + ipv6_addr_equal(remote, &t->parms.raddr)) { *pt = t; return (create ? -EEXIST : 0); } @@ -602,7 +602,7 @@ static inline int ip6ip6_tnl_addr_conflict(struct ip6_tnl *t, struct ipv6hdr *hdr) { - return !ipv6_addr_cmp(&t->parms.raddr, &hdr->saddr); + return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); } /** diff -Nru a/net/ipv6/mcast.c b/net/ipv6/mcast.c --- a/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00 @@ -247,7 +247,7 @@ write_lock_bh(&ipv6_sk_mc_lock); for (lnk = &np->ipv6_mc_list; (mc_lst = *lnk) !=NULL ; lnk = &mc_lst->next) { if ((ifindex == 0 || mc_lst->ifindex == ifindex) && - ipv6_addr_cmp(&mc_lst->addr, addr) == 0) { + ipv6_addr_equal(&mc_lst->addr, addr)) { struct net_device *dev; *lnk = mc_lst->next; @@ -369,7 +369,7 @@ for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) { if (pgsr->gsr_interface && pmc->ifindex != pgsr->gsr_interface) continue; - if (ipv6_addr_cmp(&pmc->addr, group) == 0) + if (ipv6_addr_equal(&pmc->addr, group)) break; } if (!pmc) /* must have a prior join */ @@ -485,7 +485,7 @@ for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) { if (pmc->ifindex != gsf->gf_interface) continue; - if (ipv6_addr_cmp(&pmc->addr, group) == 0) + if (ipv6_addr_equal(&pmc->addr, group)) break; } if (!pmc) /* must have a prior join */ @@ -556,7 +556,7 @@ for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) { if (pmc->ifindex != gsf->gf_interface) continue; - if (ipv6_addr_cmp(group, &pmc->addr) == 0) + if (ipv6_addr_equal(group, &pmc->addr)) break; } if (!pmc) /* must have a prior join */ @@ -603,7 +603,7 @@ read_lock(&ipv6_sk_mc_lock); for (mc = np->ipv6_mc_list; mc; mc = mc->next) { - if (ipv6_addr_cmp(&mc->addr, mc_addr) == 0) + if (ipv6_addr_equal(&mc->addr, mc_addr)) break; } if (!mc) { @@ -617,7 +617,7 @@ int i; for (i=0; isl_count; i++) { - if (ipv6_addr_cmp(&psl->sl_addr[i], src_addr) == 0) + if (ipv6_addr_equal(&psl->sl_addr[i], src_addr)) break; } if (mc->sfmode == MCAST_INCLUDE && i >= psl->sl_count) @@ -740,7 +740,7 @@ write_lock_bh(&idev->mc_lock); pmc_prev = NULL; for (pmc=idev->mc_tomb; pmc; pmc=pmc->next) { - if (ipv6_addr_cmp(&pmc->mca_addr, pmca) == 0) + if (ipv6_addr_equal(&pmc->mca_addr, pmca)) break; pmc_prev = pmc; } @@ -816,7 +816,7 @@ } for (mc = idev->mc_list; mc; mc = mc->next) { - if (ipv6_addr_cmp(&mc->mca_addr, addr) == 0) { + if (ipv6_addr_equal(&mc->mca_addr, addr)) { mc->mca_users++; write_unlock_bh(&idev->lock); ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0, @@ -878,7 +878,7 @@ write_lock_bh(&idev->lock); for (map = &idev->mc_list; (ma=*map) != NULL; map = &ma->next) { - if (ipv6_addr_cmp(&ma->mca_addr, addr) == 0) { + if (ipv6_addr_equal(&ma->mca_addr, addr)) { if (--ma->mca_users == 0) { *map = ma->next; write_unlock_bh(&idev->lock); @@ -953,7 +953,7 @@ if (idev) { read_lock_bh(&idev->lock); for (mc = idev->mc_list; mc; mc=mc->next) { - if (ipv6_addr_cmp(&mc->mca_addr, group) == 0) + if (ipv6_addr_equal(&mc->mca_addr, group)) break; } if (mc) { @@ -962,8 +962,7 @@ spin_lock_bh(&mc->mca_lock); for (psf=mc->mca_sources;psf;psf=psf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, - src_addr) == 0) + if (ipv6_addr_equal(&psf->sf_addr, src_addr)) break; } if (psf) @@ -1040,7 +1039,7 @@ if (scount == nsrcs) break; for (i=0; isf_addr) == 0) { + if (ipv6_addr_equal(&srcs[i], &psf->sf_addr)) { psf->sf_gsresp = 1; scount++; break; @@ -1135,7 +1134,7 @@ } else { for (ma = idev->mc_list; ma; ma=ma->next) { if (group_type != IPV6_ADDR_ANY && - ipv6_addr_cmp(group, &ma->mca_addr) != 0) + !ipv6_addr_equal(group, &ma->mca_addr)) continue; spin_lock_bh(&ma->mca_lock); if (ma->mca_flags & MAF_TIMER_RUNNING) { @@ -1200,7 +1199,7 @@ read_lock_bh(&idev->lock); for (ma = idev->mc_list; ma; ma=ma->next) { - if (ipv6_addr_cmp(&ma->mca_addr, addrp) == 0) { + if (ipv6_addr_equal(&ma->mca_addr, addrp)) { spin_lock(&ma->mca_lock); if (del_timer(&ma->mca_timer)) atomic_dec(&ma->mca_refcnt); @@ -1695,7 +1694,7 @@ psf_prev = NULL; for (psf=pmc->mca_sources; psf; psf=psf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) == 0) + if (ipv6_addr_equal(&psf->sf_addr, psfsrc)) break; psf_prev = psf; } @@ -1735,7 +1734,7 @@ return -ENODEV; read_lock_bh(&idev->lock); for (pmc=idev->mc_list; pmc; pmc=pmc->next) { - if (ipv6_addr_cmp(pmca, &pmc->mca_addr) == 0) + if (ipv6_addr_equal(pmca, &pmc->mca_addr)) break; } if (!pmc) { @@ -1790,7 +1789,7 @@ psf_prev = NULL; for (psf=pmc->mca_sources; psf; psf=psf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) == 0) + if (ipv6_addr_equal(&psf->sf_addr, psfsrc)) break; psf_prev = psf; } @@ -1859,7 +1858,7 @@ return -ENODEV; read_lock_bh(&idev->lock); for (pmc=idev->mc_list; pmc; pmc=pmc->next) { - if (ipv6_addr_cmp(pmca, &pmc->mca_addr) == 0) + if (ipv6_addr_equal(pmca, &pmc->mca_addr)) break; } if (!pmc) { diff -Nru a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c --- a/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00 @@ -1219,7 +1219,7 @@ return; } - if (ipv6_addr_cmp(dest, target) == 0) { + if (ipv6_addr_equal(dest, target)) { on_link = 1; } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) { ND_PRINTK2(KERN_WARNING diff -Nru a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c --- a/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +09:00 @@ -376,8 +376,8 @@ */ if (e->info->hook == NF_IP_LOCAL_OUT) { struct ipv6hdr *iph = e->skb->nh.ipv6h; - if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) || - ipv6_addr_cmp(&iph->saddr, &e->rt_info.saddr)) + if (!ipv6_addr_equal(&iph->daddr, &e->rt_info.daddr) || + !ipv6_addr_equal(&iph->saddr, &e->rt_info.saddr)) return ip6_route_me_harder(e->skb); } return 0; diff -Nru a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c --- a/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00 @@ -209,7 +209,7 @@ BUG_ON(ap == NULL); - if (!ipv6_addr_cmp(ap, &rtinfo->addrs[i])) { + if (ipv6_addr_equal(ap, &rtinfo->addrs[i])) { DEBUGP("i=%d temp=%d;\n",i,temp); i++; } @@ -236,7 +236,7 @@ &_addr); BUG_ON(ap == NULL); - if (ipv6_addr_cmp(ap, &rtinfo->addrs[temp])) + if (!ipv6_addr_equal(ap, &rtinfo->addrs[temp])) break; } DEBUGP("temp=%d #%d\n", temp, rtinfo->addrnr); diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00 @@ -90,11 +90,11 @@ struct ipv6_pinfo *np = inet6_sk(sk); if (!ipv6_addr_any(&np->daddr) && - ipv6_addr_cmp(&np->daddr, rmt_addr)) + !ipv6_addr_equal(&np->daddr, rmt_addr)) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { - if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr)) + if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) goto found; if (is_multicast && inet6_mc_check(sk, loc_addr, rmt_addr)) @@ -668,7 +668,7 @@ * sk->sk_dst_cache. */ if (sk->sk_state == TCP_ESTABLISHED && - !ipv6_addr_cmp(daddr, &np->daddr)) + ipv6_addr_equal(daddr, &np->daddr)) daddr = &np->daddr; if (addr_len >= sizeof(struct sockaddr_in6) && @@ -775,7 +775,7 @@ } done: ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) ? + ipv6_addr_equal(&fl.fl6_dst, &np->daddr) ? &np->daddr : NULL); if (err > 0) err = np->recverr ? net_xmit_errno(err) : 0; diff -Nru a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c --- a/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00 @@ -342,8 +342,8 @@ #ifdef CONFIG_SMP for (fq = ip6_frag_hash[hash]; fq; fq = fq->next) { if (fq->id == fq_in->id && - !ipv6_addr_cmp(&fq_in->saddr, &fq->saddr) && - !ipv6_addr_cmp(&fq_in->daddr, &fq->daddr)) { + ipv6_addr_equal(&fq_in->saddr, &fq->saddr) && + ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) { atomic_inc(&fq->refcnt); write_unlock(&ip6_frag_lock); fq_in->last_in |= COMPLETE; @@ -406,8 +406,8 @@ read_lock(&ip6_frag_lock); for(fq = ip6_frag_hash[hash]; fq; fq = fq->next) { if (fq->id == id && - !ipv6_addr_cmp(src, &fq->saddr) && - !ipv6_addr_cmp(dst, &fq->daddr)) { + ipv6_addr_equal(src, &fq->saddr) && + ipv6_addr_equal(dst, &fq->daddr)) { atomic_inc(&fq->refcnt); read_unlock(&ip6_frag_lock); return fq; diff -Nru a/net/ipv6/route.c b/net/ipv6/route.c --- a/net/ipv6/route.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/route.c 2004-11-10 16:45:07 +09:00 @@ -1006,7 +1006,7 @@ rt->rt6i_dev->ifindex != rtmsg->rtmsg_ifindex)) continue; if (rtmsg->rtmsg_flags&RTF_GATEWAY && - ipv6_addr_cmp(&rtmsg->rtmsg_gateway, &rt->rt6i_gateway)) + !ipv6_addr_equal(&rtmsg->rtmsg_gateway, &rt->rt6i_gateway)) continue; if (rtmsg->rtmsg_metric && rtmsg->rtmsg_metric != rt->rt6i_metric) @@ -1057,13 +1057,13 @@ * is a bit fuzzy and one might need to check all default * routers. */ - if (ipv6_addr_cmp(saddr, &rt->rt6i_gateway)) { + if (!ipv6_addr_equal(saddr, &rt->rt6i_gateway)) { if (rt->rt6i_flags & RTF_DEFAULT) { struct rt6_info *rt1; read_lock(&rt6_lock); for (rt1 = ip6_routing_table.leaf; rt1; rt1 = rt1->u.next) { - if (!ipv6_addr_cmp(saddr, &rt1->rt6i_gateway)) { + if (ipv6_addr_equal(saddr, &rt1->rt6i_gateway)) { dst_hold(&rt1->u.dst); dst_release(&rt->u.dst); read_unlock(&rt6_lock); @@ -1262,7 +1262,7 @@ write_lock_bh(&rt6_lock); for (rt = fn->leaf; rt; rt=rt->u.next) { if (dev == rt->rt6i_dev && - ipv6_addr_cmp(&rt->rt6i_gateway, addr) == 0) + ipv6_addr_equal(&rt->rt6i_gateway, addr)) break; } if (rt) diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c --- a/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00 @@ -262,7 +262,7 @@ score = 1; if (!ipv6_addr_any(&np->rcv_saddr)) { - if (ipv6_addr_cmp(&np->rcv_saddr, daddr)) + if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) continue; score++; } @@ -321,8 +321,8 @@ if(*((__u32 *)&(tw->tw_dport)) == ports && sk->sk_family == PF_INET6) { - if(!ipv6_addr_cmp(&tw->tw_v6_daddr, saddr) && - !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr) && + if(ipv6_addr_equal(&tw->tw_v6_daddr, saddr) && + ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) && (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif)) goto hit; } @@ -406,8 +406,8 @@ prev = &req->dl_next) { if (req->rmt_port == rport && req->class->family == AF_INET6 && - !ipv6_addr_cmp(&req->af.v6_req.rmt_addr, raddr) && - !ipv6_addr_cmp(&req->af.v6_req.loc_addr, laddr) && + ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) && + ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) && (!req->af.v6_req.iif || req->af.v6_req.iif == iif)) { BUG_TRAP(req->sk == NULL); *prevp = prev; @@ -463,8 +463,8 @@ if(*((__u32 *)&(tw->tw_dport)) == ports && sk2->sk_family == PF_INET6 && - !ipv6_addr_cmp(&tw->tw_v6_daddr, saddr) && - !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr) && + ipv6_addr_equal(&tw->tw_v6_daddr, saddr) && + ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) && sk2->sk_bound_dev_if == sk->sk_bound_dev_if) { struct tcp_opt *tp = tcp_sk(sk); @@ -610,7 +610,7 @@ } if (tp->ts_recent_stamp && - ipv6_addr_cmp(&np->daddr, &usin->sin6_addr)) { + !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) { tp->ts_recent = 0; tp->ts_recent_stamp = 0; tp->write_seq = 0; diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c --- a/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00 @@ -171,12 +171,12 @@ score++; } if (!ipv6_addr_any(&np->rcv_saddr)) { - if (ipv6_addr_cmp(&np->rcv_saddr, daddr)) + if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) continue; score++; } if (!ipv6_addr_any(&np->daddr)) { - if (ipv6_addr_cmp(&np->daddr, saddr)) + if (!ipv6_addr_equal(&np->daddr, saddr)) continue; score++; } @@ -395,14 +395,14 @@ continue; } if (!ipv6_addr_any(&np->daddr) && - ipv6_addr_cmp(&np->daddr, rmt_addr)) + !ipv6_addr_equal(&np->daddr, rmt_addr)) continue; if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { - if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr)) + if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) return s; continue; } @@ -732,7 +732,7 @@ * sk->sk_dst_cache. */ if (sk->sk_state == TCP_ESTABLISHED && - !ipv6_addr_cmp(daddr, &np->daddr)) + ipv6_addr_equal(daddr, &np->daddr)) daddr = &np->daddr; if (addr_len >= sizeof(struct sockaddr_in6) && @@ -840,7 +840,7 @@ if (dst) ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl->fl6_dst, &np->daddr) ? + ipv6_addr_equal(&fl->fl6_dst, &np->daddr) ? &np->daddr : NULL); if (err > 0) err = np->recverr ? net_xmit_errno(err) : 0; diff -Nru a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c --- a/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00 @@ -68,8 +68,8 @@ ipv6_addr_prefix(&fl_src_prefix, &fl->fl6_src, xdst->u.rt6.rt6i_src.plen); - if (!ipv6_addr_cmp(&xdst->u.rt6.rt6i_dst.addr, &fl_dst_prefix) && - !ipv6_addr_cmp(&xdst->u.rt6.rt6i_src.addr, &fl_src_prefix) && + if (ipv6_addr_equal(&xdst->u.rt6.rt6i_dst.addr, &fl_dst_prefix) && + ipv6_addr_equal(&xdst->u.rt6.rt6i_src.addr, &fl_src_prefix) && __xfrm6_bundle_ok(xdst, fl)) { dst_clone(dst); break; @@ -123,7 +123,7 @@ trailer_len += xfrm[i]->props.trailer_len; } - if (ipv6_addr_cmp(remote, &fl->fl6_dst)) { + if (!ipv6_addr_equal(remote, &fl->fl6_dst)) { struct flowi fl_tunnel; memset(&fl_tunnel, 0, sizeof(fl_tunnel)); diff -Nru a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c --- a/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00 @@ -55,7 +55,7 @@ list_for_each_entry(x, xfrm6_state_afinfo.state_byspi+h, byspi) { if (x->props.family == AF_INET6 && spi == x->id.spi && - !ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && + ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && proto == x->id.proto) { xfrm_state_hold(x); return x; @@ -76,10 +76,10 @@ list_for_each_entry(x, xfrm6_state_afinfo.state_bydst+h, bydst) { if (x->props.family == AF_INET6 && - !ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && + ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && mode == x->props.mode && proto == x->id.proto && - !ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)x->props.saddr.a6) && + ipv6_addr_equal((struct in6_addr *)saddr, (struct in6_addr *)x->props.saddr.a6) && reqid == x->props.reqid && x->km.state == XFRM_STATE_ACQ && !x->id.spi) { diff -Nru a/net/sctp/ipv6.c b/net/sctp/ipv6.c --- a/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00 +++ b/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00 @@ -461,7 +461,7 @@ } return 0; } - if (ipv6_addr_cmp(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr)) + if (!ipv6_addr_equal(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr)) return 0; /* If this is a linklocal address, compare the scope_id. */ if (ipv6_addr_type(&addr1->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) { -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From colin@colino.net Wed Nov 10 00:28:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 00:28:33 -0800 (PST) Received: from paperstreet.colino.net (colino.net [213.41.131.56]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA8SPjR001205 for ; Wed, 10 Nov 2004 00:28:26 -0800 Received: by paperstreet.colino.net (Postfix, from userid 1015) id 8068F73EF; Wed, 10 Nov 2004 09:28:00 +0100 (CET) Received: from pirandello (asap.atchik.net [195.167.234.210]) by paperstreet.colino.net (Postfix) with ESMTP id 2507973EC; Wed, 10 Nov 2004 09:27:41 +0100 (CET) Date: Wed, 10 Nov 2004 09:27:31 +0100 From: Colin Leroy To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [PATCH] sungem: Fix stop_phy Message-ID: <20041110092731.230719cb.colin@colino.net> X-Mailer: Sylpheed-Claws 0.9.12cvs142.2 (GTK+ 2.4.0; i686-redhat-linux-gnu) X-Face: Fy:*XpRna1/tz}cJ@O'0^:qYs:8b[Rg`*8,+o^[fI?<%5LeB,Xz8ZJK[r7V0hBs8G)*&C+XA0qHoR=LoTohe@7X5K$A-@cN6n~~J/]+{[)E4h'lK$13WQf$.R+Pi;E09tk&{t|;~dakRD%CLHrk6m!?gA,5|Sb=fJ=>[9#n1Bu8?VngkVM4{'^'V_qgdA.8yn3) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11678 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: colin@colino.net Precedence: bulk X-list: netdev Content-Length: 3900 Lines: 122 Hi, sungem driver's stop_phy differs quite a lot from Darwin's driver: In darwin, the hack consisting in reading and writing the same from/to MII_LPA is applied to every sungem card, not only bcm5201. Also, it is done before the rest of the stuff, not after. Maybe order matters. In Linux sungem's driver, the BCM5221 phy is suspended as the BCM5201. It is (completely) different in darwin. The patch following this follows OS X a bit more closely. It works on iBook G4 with a BCM5221, it would be nice if users of other PHYs could test it. If I'm correct, stop_phy is called once during boot (I had an oops from it during boot while hacking on it), so booting and checking that network works should be enough. Signed-off-by: Colin Leroy diff -ur a/drivers/net/sungem.c b/drivers/net/sungem.c --- a/drivers/net/sungem.c 2004-10-18 23:55:28.000000000 +0200 +++ b/drivers/net/sungem.c 2004-11-10 09:16:55.660896544 +0100 @@ -2124,6 +2124,8 @@ */ msleep(10); + /* FIXME OS X starts with disabling interrupts for BCM5201 */ + /* Make sure we aren't polling PHY status change. We * don't currently use that feature though */ @@ -2131,6 +2133,8 @@ mifcfg &= ~MIF_CFG_POLL; writel(mifcfg, gp->regs + MIF_CFG); + bcm_link_partner_hack(&gp->phy_mii); + if (gp->wake_on_lan) { /* Setup wake-on-lan */ } else { @@ -2159,7 +2163,7 @@ } if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) - gp->phy_mii.def->ops->suspend(&gp->phy_mii, 0 /* wake on lan options */); + gp->phy_mii.def->ops->suspend(&gp->phy_mii, gp->wake_on_lan); if (!gp->wake_on_lan) { /* According to Apple, we must set the MDIO pins to this begnign diff -ur a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c --- a/drivers/net/sungem_phy.c 2004-10-18 23:53:45.000000000 +0200 +++ b/drivers/net/sungem_phy.c 2004-11-10 08:59:20.000000000 +0100 @@ -101,15 +101,17 @@ return 0; } -static int bcm5201_suspend(struct mii_phy* phy, int wol_options) +void bcm_link_partner_hack(struct mii_phy *phy) { - if (!wol_options) - phy_write(phy, MII_BCM5201_INTERRUPT, 0); - /* Here's a strange hack used by both MacOS 9 and X */ phy_write(phy, MII_LPA, phy_read(phy, MII_LPA)); - +} + +static int bcm5201_suspend(struct mii_phy* phy, int wol_options) +{ if (!wol_options) { + phy_write(phy, MII_BCM5201_INTERRUPT, 0); + #if 0 /* Commented out in Darwin... someone has those dawn docs ? */ u16 val = phy_read(phy, MII_BCM5201_AUXMODE2) phy_write(phy, MII_BCM5201_AUXMODE2, @@ -144,6 +146,20 @@ return 0; } +static int bcm5221_suspend(struct mii_phy* phy, int wol_options) +{ + if (!wol_options) { + u16 data = phy_read(phy, MII_BCM5221_TEST); + phy_write(phy, MII_BCM5221_TEST, + data | MII_BCM5221_TEST_ENABLE_SHADOWS); + + data = phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); + phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, + data | MII_BCM5221_IDDQ); + } + return 0; +} + static int bcm5400_init(struct mii_phy* phy) { u16 data; @@ -662,7 +678,7 @@ /* Broadcom BCM 5221 */ static struct mii_phy_ops bcm5221_phy_ops = { - .suspend = bcm5201_suspend, + .suspend = bcm5221_suspend, .init = bcm5221_init, .setup_aneg = genmii_setup_aneg, .setup_forced = genmii_setup_forced, diff -ur a/drivers/net/sungem_phy.h b/drivers/net/sungem_phy.h --- a/drivers/net/sungem_phy.h 2004-10-18 23:54:40.000000000 +0200 +++ b/drivers/net/sungem_phy.h 2004-11-10 08:59:53.000000000 +0100 @@ -53,6 +53,7 @@ */ extern int mii_phy_probe(struct mii_phy *phy, int mii_id); +void bcm_link_partner_hack(struct mii_phy *phy); /* MII definitions missing from mii.h */ @@ -81,6 +82,7 @@ #define MII_BCM5221_SHDOW_AUX_STAT2_APD 0x0020 #define MII_BCM5221_SHDOW_AUX_MODE4 0x1a #define MII_BCM5221_SHDOW_AUX_MODE4_CLKLOPWR 0x0004 +#define MII_BCM5221_IDDQ 0x0001 /* MII BCM5400 1000-BASET Control register */ #define MII_BCM5400_GB_CONTROL 0x09 From EAMONN.HAMILTON@saic.com Wed Nov 10 01:29:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 01:29:27 -0800 (PST) Received: from cpmx.mail.saic.com (cpmx.mail.saic.com [139.121.17.160]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAA9TLtS015095 for ; Wed, 10 Nov 2004 01:29:21 -0800 Received: from cp-its-ieg01.mail.saic.com by cpmx.mail.saic.com; Wed, 10 Nov 2004 01:28:45 -0800 Received: from cpmx.mail.saic.com ([139.121.17.160]) by cp-its-ieg01.mail.saic.com (SAVSMTP 3.1.6.45) with SMTP id M2004111001284424620 ; Wed, 10 Nov 2004 01:28:44 -0800 Received: from ukabzc383.uk.saic.com by cpmx.mail.saic.com with ESMTP; Wed, 10 Nov 2004 01:28:45 -0800 Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id 4ADA02B029; Wed, 10 Nov 2004 09:28:40 +0000 (GMT) Received: from ukabzc383.uk.saic.com ([127.0.0.1]) by localhost (ukabzc383.uk.saic.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 23684-09-2; Wed, 10 Nov 2004 09:28:38 +0000 (GMT) Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id 52DC62B027; Wed, 10 Nov 2004 09:28:38 +0000 (GMT) Subject: Re: linux 2.6.9: r8169: eth0: PCI error (status: 0x8404). Device disabled. From: Eamonn Hamilton To: Francois Romieu Cc: Eamonn Hamilton , netdev In-Reply-To: <20041109234353.GA6020@electric-eye.fr.zoreil.com> References: <1098269117.6631.5.camel@ukabzc383.uk.saic.com> <20041020121520.GA4004@electric-eye.fr.zoreil.com> <1098282567.6631.10.camel@ukabzc383.uk.saic.com> <20041020201010.GA13023@electric-eye.fr.zoreil.com> <1098350743.15528.40.camel@ukabzc383.uk.saic.com> <20041021120208.GA752@electric-eye.fr.zoreil.com> <1098437493.5513.8.camel@ukabzc383.uk.saic.com> <20041022105224.GA26714@electric-eye.fr.zoreil.com> <1099922587.16833.2.camel@ukabzc383.uk.saic.com> <20041109234353.GA6020@electric-eye.fr.zoreil.com> Content-Type: text/plain Date: Wed, 10 Nov 2004 09:28:37 +0000 Message-Id: <1100078917.31904.3.camel@ukabzc383.uk.saic.com> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at saic.com X-archive-position: 11679 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: EAMONN.HAMILTON@saic.com Precedence: bulk X-list: netdev Content-Length: 1004 Lines: 34 I'm getting rather distrustful of this motherboard - it's an A7N8X-X, the NForce2 chipset. I'm sure I've seen some reports regarding DMS oddities with it, but PCI errors? Anyway, thanks for your help, it's much appreciated :) Cheers, Eamonn On Wed, 2004-11-10 at 00:43 +0100, Francois Romieu wrote: > Eamonn Hamilton : > [...] > > Anyway, The device was brought back to functioning order by removing the > > module and re-inserting it. I have to confess, I forgot to try simply > > downing/upping it, I'll ask my friend to try that should it happen > > again. Bizarrely, the frequency of it happening seems to be down for > > whatever reason - it took ~12GB traffic to cause it to happen this > > afternoon. > > > > Anyway, hope this helps. > > Yes. It suggests that it should not be too hard to add a hack for recovery. > > I am a bit surprized with this isolated report though. > > -- > Ueimor -- Eamonn Hamilton Senior Systems Engineer SAIC Ltd Tel : 01224 333833 From EAMONN.HAMILTON@saic.com Wed Nov 10 02:04:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 02:05:01 -0800 (PST) Received: from cpmx2.mail.saic.com (cpmx2.mail.saic.com [139.121.17.172]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAA4thZ016528 for ; Wed, 10 Nov 2004 02:04:55 -0800 Received: from cp-its-ieg02.mail.saic.com by cpmx2.mail.saic.com; Wed, 10 Nov 2004 02:04:18 -0800 Received: from cpmx.mail.saic.com ([139.121.17.160]) by cp-its-ieg02.mail.saic.com (SAVSMTP 3.1.6.45) with SMTP id M2004111002041815322 ; Wed, 10 Nov 2004 02:04:18 -0800 Received: from ukabzc383.uk.saic.com by cpmx.mail.saic.com with ESMTP; Wed, 10 Nov 2004 02:04:18 -0800 Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id D7CB92B028; Wed, 10 Nov 2004 10:04:13 +0000 (GMT) Received: from ukabzc383.uk.saic.com ([127.0.0.1]) by localhost (ukabzc383.uk.saic.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 00387-02; Wed, 10 Nov 2004 10:04:10 +0000 (GMT) Received: from localhost (localhost [127.0.0.1]) by ukabzc383.uk.saic.com (Postfix) with ESMTP id 1A3B22B027; Wed, 10 Nov 2004 10:04:10 +0000 (GMT) Subject: Re: linux 2.6.9: r8169: eth0: PCI error (status: 0x8404). Device disabled. From: Eamonn Hamilton To: Francois Romieu Cc: netdev In-Reply-To: <20041109234353.GA6020@electric-eye.fr.zoreil.com> References: <1098269117.6631.5.camel@ukabzc383.uk.saic.com> <20041020121520.GA4004@electric-eye.fr.zoreil.com> <1098282567.6631.10.camel@ukabzc383.uk.saic.com> <20041020201010.GA13023@electric-eye.fr.zoreil.com> <1098350743.15528.40.camel@ukabzc383.uk.saic.com> <20041021120208.GA752@electric-eye.fr.zoreil.com> <1098437493.5513.8.camel@ukabzc383.uk.saic.com> <20041022105224.GA26714@electric-eye.fr.zoreil.com> <1099922587.16833.2.camel@ukabzc383.uk.saic.com> <20041109234353.GA6020@electric-eye.fr.zoreil.com> Content-Type: text/plain Date: Wed, 10 Nov 2004 10:04:09 +0000 Message-Id: <1100081049.31904.8.camel@ukabzc383.uk.saic.com> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at saic.com X-archive-position: 11680 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: EAMONN.HAMILTON@saic.com Precedence: bulk X-list: netdev Content-Length: 1014 Lines: 38 On Wed, 2004-11-10 at 00:43 +0100, Francois Romieu wrote: > Eamonn Hamilton : > [...] > > Anyway, The device was brought back to functioning order by removing the > > module and re-inserting it. I have to confess, I forgot to try simply > > downing/upping it, I'll ask my friend to try that should it happen > > again. Bizarrely, the frequency of it happening seems to be down for > > whatever reason - it took ~12GB traffic to cause it to happen this > > afternoon. > > > > Anyway, hope this helps. > > Yes. It suggests that it should not be too hard to add a hack for recovery. > > I am a bit surprized with this isolated report though. Arghh. The guy whose computer it is has just told me that he was getting weird errors until he rebooted it after reinserting the module, which makes me very suspicious of DMA/PCI issues on this board. Ho-hum, more testing required. Cheers, Eamonn > > -- > Ueimor -- Eamonn Hamilton Senior Systems Engineer SAIC Ltd Tel : 01224 333833 From zaphodb@boombox.zaphods.net Wed Nov 10 02:29:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 02:29:43 -0800 (PST) Received: from shinjuku.zaphods.net (shinjuku.zaphods.net [194.97.108.52]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAATbdJ017602 for ; Wed, 10 Nov 2004 02:29:38 -0800 Received: from gatekeeper.research.zaphods.net ([194.97.1.3] helo=boombox) by shinjuku.zaphods.net with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CRpiZ-0000RJ-Ew; Wed, 10 Nov 2004 11:28:47 +0100 Received: from zaphodb by boombox with local (Exim 4.34) id 1CRpig-0004lB-83; Wed, 10 Nov 2004 11:28:54 +0100 Date: Wed, 10 Nov 2004 11:28:54 +0100 From: Stefan Schmidt To: Nick Piggin Cc: Andrew Morton , marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110102854.GI20754@zaphods.net> References: <20041104121722.GB8537@logos.cnet> <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419197EA.9090809@cyberone.com.au> User-Agent: Mutt/1.5.6+20040907i X-SA-Exim-Connect-IP: 194.97.1.3 X-SA-Exim-Mail-From: zaphodb@boombox.zaphods.net X-SA-Exim-Scanned: No (on shinjuku.zaphods.net); SAEximRunCond expanded to false X-archive-position: 11681 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zaphodb@zaphods.net Precedence: bulk X-list: netdev Content-Length: 1204 Lines: 25 On Wed, Nov 10, 2004 at 03:24:10PM +1100, Nick Piggin wrote: > Can you try the following patch, please? It is diffed against 2.6.10-rc1, > but I think it should apply to -mm kernels as well. > > Basically 2.6.8 and earlier kernels had some quirks in the page allocator > that would allow for example, a large portion of "DMA" memory to be reserved > for network memory allocations (atomic allocations). After 'fixing' this > problem, 2.6.9 is effectively left with about a quarter the amount of memory > reserved for network allocations compared with 2.6.8. > > The following patch roughly restores parity there. Thanks. I applied the patch to 2.6.10-rc1-mm4 and the application froze again, but i just remembered that i changed a kernel-option in mm4 and forgot about that yesterday: I unset CONFIG_PACKET_MMAP and i suppose this could have this kind of effect on high connection rates. I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze for some hours at this load we can blame at least this issue (-1 EAGAIN) on that parameter. My variation of Harrisberger's Fourth Law of the Lab: Experience is directly proportional to the amount of braincells ruined. *ouch*, Stefan From tgraf@suug.ch Wed Nov 10 03:32:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 03:32:43 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAABWaT6022071 for ; Wed, 10 Nov 2004 03:32:37 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id AA7BCF; Wed, 10 Nov 2004 12:31:55 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 1EBDD1C0EA; Wed, 10 Nov 2004 12:32:37 +0100 (CET) Date: Wed, 10 Nov 2004 12:32:36 +0100 From: Thomas Graf To: Herbert Xu , Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110113236.GM31969@postel.suug.ch> References: <41917330.6090002@trash.net> <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> <20041110013941.GL31969@postel.suug.ch> <20041110014125.GA7302@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41917330.6090002@trash.net> <20041110014125.GA7302@gondor.apana.org.au> X-archive-position: 11682 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 891 Lines: 19 * Herbert Xu <20041110014125.GA7302@gondor.apana.org.au> 2004-11-10 12:41 > On Wed, Nov 10, 2004 at 02:39:41AM +0100, Thomas Graf wrote: > > that once this is true it would work perfectly fine, however I > > think it would be inefficient to parse the whole TLV tree multiple > > times. > > Well it's only going to happen once for each module so that's no > big deal. * Patrick McHardy <41917330.6090002@trash.net> 2004-11-10 02:47 > It will only happen once for every module, so I don't think > it's a big deal. Agreed. I'm used to huge filter configurations up to 100 MiB per netlink message and therefore I do care whether such as message is parsed 1 times or 5 times since it's a matter of having the network blocked for 3 or 15 seconds. However, if it helps to clean up the error paths then I'll be very happy and do a workaround for my special case if I ever need loadable modules. From herbert@gondor.apana.org.au Wed Nov 10 03:42:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 03:42:54 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAABgkq4024397 for ; Wed, 10 Nov 2004 03:42:47 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CRqrd-0007HJ-00; Wed, 10 Nov 2004 22:42:13 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CRqrZ-0002xG-00; Wed, 10 Nov 2004 22:42:09 +1100 Date: Wed, 10 Nov 2004 22:42:09 +1100 To: Thomas Graf Cc: Patrick McHardy , "David S. Miller" , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110114209.GA11336@gondor.apana.org.au> References: <41899DCF.3050804@trash.net> <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> <20041110013941.GL31969@postel.suug.ch> <20041110014125.GA7302@gondor.apana.org.au> <20041110113236.GM31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110113236.GM31969@postel.suug.ch> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11683 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 474 Lines: 11 On Wed, Nov 10, 2004 at 12:32:36PM +0100, Thomas Graf wrote: > > Agreed. I'm used to huge filter configurations up to 100 MiB per > netlink message and therefore I do care whether such as message is 100MiB!? How did you manage to stuff that into one linear skb? -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From tgraf@suug.ch Wed Nov 10 03:56:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 03:56:49 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAABugLm026756 for ; Wed, 10 Nov 2004 03:56:43 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 30F36F; Wed, 10 Nov 2004 12:56:02 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 32DD91C0EA; Wed, 10 Nov 2004 12:56:45 +0100 (CET) Date: Wed, 10 Nov 2004 12:56:45 +0100 From: Thomas Graf To: Herbert Xu Cc: Patrick McHardy , "David S. Miller" , netdev@oss.sgi.com Subject: Re: request_module while holding rtnl semaphore Message-ID: <20041110115645.GN31969@postel.suug.ch> References: <20041109161126.376f755c.davem@davemloft.net> <20041110010113.GJ31969@postel.suug.ch> <41916A91.3080107@trash.net> <20041110012251.GK31969@postel.suug.ch> <41916F0B.5010809@trash.net> <20041110013941.GL31969@postel.suug.ch> <20041110014125.GA7302@gondor.apana.org.au> <20041110113236.GM31969@postel.suug.ch> <20041110114209.GA11336@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110114209.GA11336@gondor.apana.org.au> X-archive-position: 11684 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Content-Length: 650 Lines: 13 * Herbert Xu <20041110114209.GA11336@gondor.apana.org.au> 2004-11-10 22:42 > On Wed, Nov 10, 2004 at 12:32:36PM +0100, Thomas Graf wrote: > > > > Agreed. I'm used to huge filter configurations up to 100 MiB per > > netlink message and therefore I do care whether such as message is > > 100MiB!? How did you manage to stuff that into one linear skb? It's splitted over multiple netlink messages. My classifier keeps appending the messages in a hash table referenced by the sequence number until a flag is set marking the end and then processes the whole message. It's ugly but it works and is atomic without locking over multiple netlink messages. From zaphodb@zaphods.net Wed Nov 10 04:07:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 04:07:26 -0800 (PST) Received: from shinjuku.zaphods.net (shinjuku.zaphods.net [194.97.108.52]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAC7GBe027784 for ; Wed, 10 Nov 2004 04:07:16 -0800 Received: from zaphodb by shinjuku.zaphods.net with local (Exim 4.34) id 1CRrF2-0000Zn-F1; Wed, 10 Nov 2004 13:06:24 +0100 Date: Wed, 10 Nov 2004 13:06:24 +0100 From: Stefan Schmidt To: Nick Piggin Cc: Andrew Morton , marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110120624.GF28163@zaphods.net> References: <20041104181856.GE28163@zaphods.net> <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110102854.GI20754@zaphods.net> X-Origin-AS: AS5430 X-NCC-nic-hdl: ZAP-RIPE User-Agent: Mutt/1.5.6+20040907i X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: zaphodb@zaphods.net X-SA-Exim-Scanned: No (on shinjuku.zaphods.net); SAEximRunCond expanded to false X-archive-position: 11685 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zaphodb@zaphods.net Precedence: bulk X-list: netdev Content-Length: 659 Lines: 14 On Wed, Nov 10, 2004 at 11:28:54AM +0100, Stefan Schmidt wrote: > > Can you try the following patch, please? It is diffed against 2.6.10-rc1, > > but I think it should apply to -mm kernels as well. I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will try latest bk next. > I unset CONFIG_PACKET_MMAP and i suppose this could have this kind of effect > on high connection rates. > I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze > for some hours at this load we can blame at least this issue (-1 EAGAIN) on > that parameter. Nope, that didn't change anything, still getting EAGAIN, checked two times. Stefan From spam@crocom.com.pl Wed Nov 10 04:09:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 04:09:22 -0800 (PST) Received: from crocom.crocom.com.pl (task-crocom-rtr.task.gda.pl [153.19.102.70]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAC9BRF028125 for ; Wed, 10 Nov 2004 04:09:12 -0800 Received: from [153.19.192.37] (localhost [127.0.0.1]) by crocom.crocom.com.pl (8.12.11/8.12.11) with ESMTP id iAAC8FBM016365; Wed, 10 Nov 2004 13:08:15 +0100 (CET) Message-ID: <419204AE.7030805@crocom.com.pl> Date: Wed, 10 Nov 2004 13:08:14 +0100 From: Szymon Miotk Organization: Crocom Computer Systems s.c. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en, pl MIME-Version: 1.0 To: Patrick McHardy CC: Thomas Graf , netdev@oss.sgi.com, davem@davemloft.net Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts References: <418B4C7C.8000402@crocom.com.pl> <418EA032.7050507@trash.net> <418ECE85.9090203@trash.net> <20041108135431.GE31969@postel.suug.ch> <418F9AD0.1040701@trash.net> <20041108183300.GF31969@postel.suug.ch> <418FCD0A.4040202@trash.net> In-Reply-To: <418FCD0A.4040202@trash.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11686 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: spam@crocom.com.pl Precedence: bulk X-list: netdev Content-Length: 1277 Lines: 38 Patrick McHardy wrote: > Thomas Graf wrote: > >> * Patrick McHardy <418F9AD0.1040701@trash.net> 2004-11-08 17:12 >> >> >>> There is some optimization possible, I will do this for the final >>> patch. But I don't understand the problem you refer to, can you >>> please explain ? >>> >> >> I don't have the time to verify this at the moment but: >> >> 1) qdisc_destroy unlinking all the lists >> 2) RTM_NEWQDISC creating a new qdisc with the same major classid as >> the old one >> which will suceed since the old one cannot be found anymore. >> 3) rcu callback __qdisc_destroy -> qdisc_destroy looking through >> qdisc_list >> again and then deleting the new entries because their major classid >> matches. >> >> I might be missing something though. >> > You're right, thanks. The optimization already fixed this, but I > wasn't aware of the bug :) New patch attached. I've tested the new kernel (2.6.10-rc1_bk17) with this patch. It performed well on test system (reloading my traffic shaping configuration for 100 times). Now it forks for some 22 hours on production system, under normal load (~20 Mbit, 500 clients at a time, 15000 entires in route table) and it performs well. Thanks a lot for your help, it really saved me away from troubles. Szymon Miotk From marcelo.tosatti@cyclades.com Wed Nov 10 04:24:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 04:24:50 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAACOiBd001892 for ; Wed, 10 Nov 2004 04:24:44 -0800 Received: from [127.0.0.1] (helo=logos.cnet) by www.linux.org.uk with esmtp (Exim 4.33) id 1CRrWT-0002lj-Ls; Wed, 10 Nov 2004 12:24:25 +0000 Received: by logos.cnet (Postfix, from userid 500) id AEDC8F38C0; Wed, 10 Nov 2004 06:58:31 -0200 (BRST) Date: Wed, 10 Nov 2004 06:58:31 -0200 From: Marcelo Tosatti To: Stefan Schmidt Cc: Nick Piggin , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110085831.GB10740@logos.cnet> References: <20041109164113.GD7632@logos.cnet> <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> <20041110120624.GF28163@zaphods.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110120624.GF28163@zaphods.net> User-Agent: Mutt/1.5.5.1i X-archive-position: 11687 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marcelo.tosatti@cyclades.com Precedence: bulk X-list: netdev Content-Length: 813 Lines: 17 On Wed, Nov 10, 2004 at 01:06:24PM +0100, Stefan Schmidt wrote: > On Wed, Nov 10, 2004 at 11:28:54AM +0100, Stefan Schmidt wrote: > > > Can you try the following patch, please? It is diffed against 2.6.10-rc1, > > > but I think it should apply to -mm kernels as well. > I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will try > latest bk next. > > > I unset CONFIG_PACKET_MMAP and i suppose this could have this kind of effect > > on high connection rates. > > I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze > > for some hours at this load we can blame at least this issue (-1 EAGAIN) on > > that parameter. > Nope, that didn't change anything, still getting EAGAIN, checked two times. Hi Stefan, Its not clear to me - do you have Nick's watermark patch in? From zaphodb@zaphods.net Wed Nov 10 04:48:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 04:49:00 -0800 (PST) Received: from shinjuku.zaphods.net (shinjuku.zaphods.net [194.97.108.52]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAACmtWP003315 for ; Wed, 10 Nov 2004 04:48:56 -0800 Received: from zaphodb by shinjuku.zaphods.net with local (Exim 4.34) id 1CRrtT-0000cj-QB; Wed, 10 Nov 2004 13:48:11 +0100 Date: Wed, 10 Nov 2004 13:48:11 +0100 From: Stefan Schmidt To: Marcelo Tosatti Cc: Nick Piggin , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110124810.GG28163@zaphods.net> References: <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> <20041110120624.GF28163@zaphods.net> <20041110085831.GB10740@logos.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110085831.GB10740@logos.cnet> X-Origin-AS: AS5430 X-NCC-nic-hdl: ZAP-RIPE User-Agent: Mutt/1.5.6+20040907i X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: zaphodb@zaphods.net X-SA-Exim-Scanned: No (on shinjuku.zaphods.net); SAEximRunCond expanded to false X-archive-position: 11688 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zaphodb@zaphods.net Precedence: bulk X-list: netdev Content-Length: 794 Lines: 16 On Wed, Nov 10, 2004 at 06:58:31AM -0200, Marcelo Tosatti wrote: > > > > Can you try the following patch, please? It is diffed against 2.6.10-rc1, > > I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will try > > latest bk next. > > > I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze > > > for some hours at this load we can blame at least this issue (-1 EAGAIN) on > > > that parameter. > > Nope, that didn't change anything, still getting EAGAIN, checked two times. > Its not clear to me - do you have Nick's watermark patch in? Yes i have vm.min_free_kbytes=8192 and Nick's patch in mm4. I'll try rc1-bk19 with his restore-atomic-buffer patch in a few minutes. Stefan -- The reason computer chips are so small is computers don't eat much. From mark@mwborst.com Wed Nov 10 06:18:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 06:18:58 -0800 (PST) Received: from mn-2 (mn-2.atm.tut.fi [130.230.52.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAEIlnZ006263 for ; Wed, 10 Nov 2004 06:18:47 -0800 Received: from mark by mn-2 with local (Exim 3.36 #1 (Debian)) id 1CRtHx-00069K-00; Wed, 10 Nov 2004 16:17:33 +0200 Subject: Re: node-local multicast issues From: Mark Borst To: David Stevens Cc: hessu@cs.tut.fi, netdev@oss.sgi.com In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Wed, 10 Nov 2004 16:17:31 +0200 Message-Id: <1100096251.22964.7.camel@mn-2> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 X-archive-position: 11689 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mark@borst.org Precedence: bulk X-list: netdev Content-Length: 2216 Lines: 55 On Tue, 2004-11-09 at 15:21 -0800, David Stevens wrote: > The loopback device doesn't have IFF_MULTICAST set, so technically > it is not a multicast-capable device, and you shouldn't be able to join a > group on it. That is Linux-specific, right? At least KAME's 'lo' does support multicast, and their README says: Each interface joins the solicited multicast address and the link-local all-nodes multicast addresses (e.g. fe80::1:ff01:6317 and ff02::1, respectively, on the link the interface is attached). In addition to a link-local address, the loopback address (::1) will be assigned to the loopback interface. Also, ::1/128 and ff01::/32 are automatically added to routing table, and loopback interface joins node-local multicast group ff01::1. On Windows I don't see 'lo' joining ff01::1. RFC 3513 tells me: 2.7.1 Pre-Defined Multicast Addresses All Nodes Addresses: FF01:0:0:0:0:0:0:1 FF02:0:0:0:0:0:0:1 The above multicast addresses identify the group of all IPv6 nodes, within scope 1 (interface-local) or 2 (link-local). Does that imply that the linux stack doesn't conform to RFC 3513? > I think the way it ought to work is that you join the group on any device, > with IPV6_MULTICAST_LOOP set and local guys should hear the node-local > multicasts, but it shouldn't be sent on the wire. Multicasting could be supported on > loopback, too, but it doesn't matter all that much unless there are no multicast-capable > real devices. > However, it appears that node-local multicasts are being sent out > the device, at least on an early 2.6 kernel I did a quick test with. There probably > isn't anything enforcing the node-locality in the send path, which I would consider a > bug. :-) Even more interesting: an other node responded to 'ping6 ff01::1' so there is some bug somewhere ;) On another note: 'ping6 ff02::1' gives "connect: Invalid argument" on linux. On KAME it says "ping6: UDP connect: Network is unreachable". The only implementation that gives me replies is Solaris. This also sounds like a bug to me. Regards, -- Mark Borst Researcher Network and Protocols Group Tampere University of Technology, Finland From marcelo.tosatti@cyclades.com Wed Nov 10 06:23:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 06:23:08 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAEN2gA006678 for ; Wed, 10 Nov 2004 06:23:02 -0800 Received: from [127.0.0.1] (helo=logos.cnet) by www.linux.org.uk with esmtp (Exim 4.33) id 1CRtMv-00055l-C4; Wed, 10 Nov 2004 14:22:41 +0000 Received: by logos.cnet (Postfix, from userid 500) id 9B507F38C0; Wed, 10 Nov 2004 08:56:21 -0200 (BRST) Date: Wed, 10 Nov 2004 08:56:21 -0200 From: Marcelo Tosatti To: Stefan Schmidt Cc: Nick Piggin , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041110105621.GA11097@logos.cnet> References: <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> <20041110120624.GF28163@zaphods.net> <20041110085831.GB10740@logos.cnet> <20041110124810.GG28163@zaphods.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110124810.GG28163@zaphods.net> User-Agent: Mutt/1.5.5.1i X-archive-position: 11690 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marcelo.tosatti@cyclades.com Precedence: bulk X-list: netdev Content-Length: 1011 Lines: 22 On Wed, Nov 10, 2004 at 01:48:11PM +0100, Stefan Schmidt wrote: > On Wed, Nov 10, 2004 at 06:58:31AM -0200, Marcelo Tosatti wrote: > > > > > Can you try the following patch, please? It is diffed against 2.6.10-rc1, > > > I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will try > > > latest bk next. > > > > > I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze > > > > for some hours at this load we can blame at least this issue (-1 EAGAIN) on > > > > that parameter. > > > Nope, that didn't change anything, still getting EAGAIN, checked two times. > > Its not clear to me - do you have Nick's watermark patch in? > Yes i have vm.min_free_kbytes=8192 and Nick's patch in mm4. I'll try > rc1-bk19 with his restore-atomic-buffer patch in a few minutes. Stefan, Please always run your tests with show_free_area() call at the page allocation failure path. I fully disagree with Andrew when he says "I don't think it'd help much - we know what's happening." From colin.lkml@colino.net Wed Nov 10 08:47:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 08:47:14 -0800 (PST) Received: from paperstreet.colino.net (colino.net [213.41.131.56]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAGl9Of027127 for ; Wed, 10 Nov 2004 08:47:10 -0800 Received: by paperstreet.colino.net (Postfix, from userid 1015) id 2143573F6; Wed, 10 Nov 2004 17:46:44 +0100 (CET) Received: from pirandello (asap.atchik.net [195.167.234.210]) by paperstreet.colino.net (Postfix) with ESMTP id 90A2073F4; Wed, 10 Nov 2004 17:46:27 +0100 (CET) Date: Wed, 10 Nov 2004 17:46:16 +0100 From: Colin Leroy To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH] sungem: Fix stop_phy Message-ID: <20041110174616.099ad8e1.colin.lkml@colino.net> In-Reply-To: <20041110092731.230719cb.colin@colino.net> References: <20041110092731.230719cb.colin@colino.net> X-Mailer: Sylpheed-Claws 0.9.12cvs142.2 (GTK+ 2.4.0; i686-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11691 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: colin.lkml@colino.net Precedence: bulk X-list: netdev Content-Length: 260 Lines: 12 On 10 Nov 2004 at 09h11, Colin Leroy wrote: Hi, > oops from it during boot while hacking on it), so booting and checking > that network works should be enough. (also check sleep/resume if your laptop supports it, there may be problems there...) -- Colin From hch@lst.de Wed Nov 10 08:57:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 08:57:10 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAGv1id028171 for ; Wed, 10 Nov 2004 08:57:02 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAAGugla029732 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 10 Nov 2004 17:56:42 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iAAGug48029730; Wed, 10 Nov 2004 17:56:42 +0100 Date: Wed, 10 Nov 2004 17:56:42 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove net_init.c ifdef clutter Message-ID: <20041110165641.GA29705@lst.de> References: <20041101130144.GA8727@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101130144.GA8727@lst.de> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11692 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 20469 Lines: 730 On Mon, Nov 01, 2004 at 02:01:44PM +0100, Christoph Hellwig wrote: > Move the devicetype-specific functions from net_init.c to the > devicetype-specific files under net/. ping? still applies fine against current BK. --- 1.24/drivers/net/net_init.c 2004-04-06 00:46:26 +02:00 +++ edited/drivers/net/net_init.c 2004-11-01 13:20:45 +01:00 @@ -105,260 +105,6 @@ } EXPORT_SYMBOL(alloc_netdev); -/** - * alloc_etherdev - Allocates and sets up an ethernet device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with ethernet-generic - * values. Basically does everything except registering the device. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_etherdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "eth%d", ether_setup); -} - -EXPORT_SYMBOL(alloc_etherdev); - -static int eth_mac_addr(struct net_device *dev, void *p) -{ - struct sockaddr *addr=p; - if (netif_running(dev)) - return -EBUSY; - memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); - return 0; -} - -static int eth_change_mtu(struct net_device *dev, int new_mtu) -{ - if ((new_mtu < 68) || (new_mtu > 1500)) - return -EINVAL; - dev->mtu = new_mtu; - return 0; -} - -#ifdef CONFIG_FDDI - -/** - * alloc_fddidev - Register FDDI device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this FDDI device - * - * Fill in the fields of the device structure with FDDI-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_fddidev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); -} - -EXPORT_SYMBOL(alloc_fddidev); - -static int fddi_change_mtu(struct net_device *dev, int new_mtu) -{ - if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) - return(-EINVAL); - dev->mtu = new_mtu; - return(0); -} - -#endif /* CONFIG_FDDI */ - -#ifdef CONFIG_HIPPI - -static int hippi_change_mtu(struct net_device *dev, int new_mtu) -{ - /* - * HIPPI's got these nice large MTUs. - */ - if ((new_mtu < 68) || (new_mtu > 65280)) - return -EINVAL; - dev->mtu = new_mtu; - return(0); -} - - -/* - * For HIPPI we will actually use the lower 4 bytes of the hardware - * address as the I-FIELD rather than the actual hardware address. - */ -static int hippi_mac_addr(struct net_device *dev, void *p) -{ - struct sockaddr *addr = p; - if (netif_running(dev)) - return -EBUSY; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - return 0; -} - -static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) -{ - /* Never send broadcast/multicast ARP messages */ - p->mcast_probes = 0; - - /* In IPv6 unicast probes are valid even on NBMA, - * because they are encapsulated in normal IPv6 protocol. - * Should be a generic flag. - */ - if (p->tbl->family != AF_INET6) - p->ucast_probes = 0; - return 0; -} - -static void hippi_setup(struct net_device *dev) -{ - dev->set_multicast_list = NULL; - dev->change_mtu = hippi_change_mtu; - dev->hard_header = hippi_header; - dev->rebuild_header = hippi_rebuild_header; - dev->set_mac_address = hippi_mac_addr; - dev->hard_header_parse = NULL; - dev->hard_header_cache = NULL; - dev->header_cache_update = NULL; - dev->neigh_setup = hippi_neigh_setup_dev; - - /* - * We don't support HIPPI `ARP' for the time being, and probably - * never will unless someone else implements it. However we - * still need a fake ARPHRD to make ifconfig and friends play ball. - */ - dev->type = ARPHRD_HIPPI; - dev->hard_header_len = HIPPI_HLEN; - dev->mtu = 65280; - dev->addr_len = HIPPI_ALEN; - dev->tx_queue_len = 25 /* 5 */; - memset(dev->broadcast, 0xFF, HIPPI_ALEN); - - - /* - * HIPPI doesn't support broadcast+multicast and we only use - * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. - */ - dev->flags = 0; -} - -/** - * alloc_hippi_dev - Register HIPPI device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this HIPPI device - * - * Fill in the fields of the device structure with HIPPI-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_hippi_dev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); -} - -EXPORT_SYMBOL(alloc_hippi_dev); - -#endif /* CONFIG_HIPPI */ - -void ether_setup(struct net_device *dev) -{ - /* Fill in the fields of the device structure with ethernet-generic values. - This should be in a common file instead of per-driver. */ - - dev->change_mtu = eth_change_mtu; - dev->hard_header = eth_header; - dev->rebuild_header = eth_rebuild_header; - dev->set_mac_address = eth_mac_addr; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update= eth_header_cache_update; - dev->hard_header_parse = eth_header_parse; - - dev->type = ARPHRD_ETHER; - dev->hard_header_len = ETH_HLEN; - dev->mtu = 1500; /* eth_mtu */ - dev->addr_len = ETH_ALEN; - dev->tx_queue_len = 1000; /* Ethernet wants good queues */ - - memset(dev->broadcast,0xFF, ETH_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST|IFF_MULTICAST; -} -EXPORT_SYMBOL(ether_setup); - -#ifdef CONFIG_FDDI - -void fddi_setup(struct net_device *dev) -{ - /* - * Fill in the fields of the device structure with FDDI-generic values. - * This should be in a common file instead of per-driver. - */ - - dev->change_mtu = fddi_change_mtu; - dev->hard_header = fddi_header; - dev->rebuild_header = fddi_rebuild_header; - - dev->type = ARPHRD_FDDI; - dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ - dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ - dev->addr_len = FDDI_K_ALEN; - dev->tx_queue_len = 100; /* Long queues on FDDI */ - - memset(dev->broadcast, 0xFF, FDDI_K_ALEN); - - /* New-style flags */ - dev->flags = IFF_BROADCAST | IFF_MULTICAST; -} -EXPORT_SYMBOL(fddi_setup); - -#endif /* CONFIG_FDDI */ - -#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) - -static int ltalk_change_mtu(struct net_device *dev, int mtu) -{ - return -EINVAL; -} - -static int ltalk_mac_addr(struct net_device *dev, void *addr) -{ - return -EINVAL; -} - - -void ltalk_setup(struct net_device *dev) -{ - /* Fill in the fields of the device structure with localtalk-generic values. */ - - dev->change_mtu = ltalk_change_mtu; - dev->hard_header = NULL; - dev->rebuild_header = NULL; - dev->set_mac_address = ltalk_mac_addr; - dev->hard_header_cache = NULL; - dev->header_cache_update= NULL; - - dev->type = ARPHRD_LOCALTLK; - dev->hard_header_len = LTALK_HLEN; - dev->mtu = LTALK_MTU; - dev->addr_len = LTALK_ALEN; - dev->tx_queue_len = 10; - - dev->broadcast[0] = 0xFF; - - dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; -} -EXPORT_SYMBOL(ltalk_setup); - -#endif /* CONFIG_ATALK || CONFIG_ATALK_MODULE */ - int register_netdev(struct net_device *dev) { int err; @@ -404,90 +150,3 @@ EXPORT_SYMBOL(register_netdev); EXPORT_SYMBOL(unregister_netdev); - -#ifdef CONFIG_TR - -void tr_setup(struct net_device *dev) -{ - /* - * Configure and register - */ - - dev->hard_header = tr_header; - dev->rebuild_header = tr_rebuild_header; - - dev->type = ARPHRD_IEEE802_TR; - dev->hard_header_len = TR_HLEN; - dev->mtu = 2000; - dev->addr_len = TR_ALEN; - dev->tx_queue_len = 100; /* Long queues on tr */ - - memset(dev->broadcast,0xFF, TR_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST | IFF_MULTICAST ; -} - -/** - * alloc_trdev - Register token ring device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this token ring device - * - * Fill in the fields of the device structure with token ring-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_trdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "tr%d", tr_setup); -} - -EXPORT_SYMBOL(tr_setup); -EXPORT_SYMBOL(alloc_trdev); - -#endif /* CONFIG_TR */ - -#ifdef CONFIG_NET_FC - -void fc_setup(struct net_device *dev) -{ - dev->hard_header = fc_header; - dev->rebuild_header = fc_rebuild_header; - - dev->type = ARPHRD_IEEE802; - dev->hard_header_len = FC_HLEN; - dev->mtu = 2024; - dev->addr_len = FC_ALEN; - dev->tx_queue_len = 100; /* Long queues on fc */ - - memset(dev->broadcast,0xFF, FC_ALEN); - - /* New-style flags. */ - dev->flags = IFF_BROADCAST; -} - -/** - * alloc_fcdev - Register fibre channel device - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this fibre channel device - * - * Fill in the fields of the device structure with fibre channel-generic values. - * - * Constructs a new net device, complete with a private data area of - * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for - * this private data area. - */ - -struct net_device *alloc_fcdev(int sizeof_priv) -{ - return alloc_netdev(sizeof_priv, "fc%d", fc_setup); -} - -EXPORT_SYMBOL(fc_setup); -EXPORT_SYMBOL(alloc_fcdev); - -#endif /* CONFIG_NET_FC */ - --- 1.91/include/linux/netdevice.h 2004-10-26 18:09:33 +02:00 +++ edited/include/linux/netdevice.h 2004-11-01 13:13:07 +01:00 @@ -910,10 +910,7 @@ /* These functions live elsewhere (drivers/net/net_init.c, but related) */ extern void ether_setup(struct net_device *dev); -extern void fddi_setup(struct net_device *dev); -extern void tr_setup(struct net_device *dev); -extern void fc_setup(struct net_device *dev); -extern void fc_freedev(struct net_device *dev); + /* Support for loadable net-drivers */ extern struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *)); ===== net/802/fc.c 1.3 vs edited ===== --- 1.3/net/802/fc.c 2004-06-24 21:37:35 +02:00 +++ edited/net/802/fc.c 2004-11-01 13:52:59 +01:00 @@ -129,3 +129,35 @@ return ntohs(ETH_P_802_2); } + +static void fc_setup(struct net_device *dev) +{ + dev->hard_header = fc_header; + dev->rebuild_header = fc_rebuild_header; + + dev->type = ARPHRD_IEEE802; + dev->hard_header_len = FC_HLEN; + dev->mtu = 2024; + dev->addr_len = FC_ALEN; + dev->tx_queue_len = 100; /* Long queues on fc */ + dev->flags = IFF_BROADCAST; + + memset(dev->broadcast, 0xFF, FC_ALEN); +} + +/** + * alloc_fcdev - Register fibre channel device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this fibre channel device + * + * Fill in the fields of the device structure with fibre channel-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_fcdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "fc%d", fc_setup); +} +EXPORT_SYMBOL(alloc_fcdev); --- 1.3/net/802/fddi.c 2003-09-29 04:23:30 +02:00 +++ edited/net/802/fddi.c 2004-11-01 13:12:14 +01:00 @@ -166,3 +166,44 @@ } EXPORT_SYMBOL(fddi_type_trans); + +static int fddi_change_mtu(struct net_device *dev, int new_mtu) +{ + if ((new_mtu < FDDI_K_SNAP_HLEN) || (new_mtu > FDDI_K_SNAP_DLEN)) + return(-EINVAL); + dev->mtu = new_mtu; + return(0); +} + +static void fddi_setup(struct net_device *dev) +{ + dev->change_mtu = fddi_change_mtu; + dev->hard_header = fddi_header; + dev->rebuild_header = fddi_rebuild_header; + + dev->type = ARPHRD_FDDI; + dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */ + dev->mtu = FDDI_K_SNAP_DLEN; /* Assume max payload of 802.2 SNAP frame */ + dev->addr_len = FDDI_K_ALEN; + dev->tx_queue_len = 100; /* Long queues on FDDI */ + dev->flags = IFF_BROADCAST | IFF_MULTICAST; + + memset(dev->broadcast, 0xFF, FDDI_K_ALEN); +} + +/** + * alloc_fddidev - Register FDDI device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this FDDI device + * + * Fill in the fields of the device structure with FDDI-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_fddidev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); +} +EXPORT_SYMBOL(alloc_fddidev); --- 1.4/net/802/hippi.c 2003-09-29 04:23:30 +02:00 +++ edited/net/802/hippi.c 2004-11-01 13:53:31 +01:00 @@ -154,3 +154,92 @@ } EXPORT_SYMBOL(hippi_type_trans); + +static int hippi_change_mtu(struct net_device *dev, int new_mtu) +{ + /* + * HIPPI's got these nice large MTUs. + */ + if ((new_mtu < 68) || (new_mtu > 65280)) + return -EINVAL; + dev->mtu = new_mtu; + return(0); +} + +/* + * For HIPPI we will actually use the lower 4 bytes of the hardware + * address as the I-FIELD rather than the actual hardware address. + */ +static int hippi_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + if (netif_running(dev)) + return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + return 0; +} + +static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) +{ + /* Never send broadcast/multicast ARP messages */ + p->mcast_probes = 0; + + /* In IPv6 unicast probes are valid even on NBMA, + * because they are encapsulated in normal IPv6 protocol. + * Should be a generic flag. + */ + if (p->tbl->family != AF_INET6) + p->ucast_probes = 0; + return 0; +} + +static void hippi_setup(struct net_device *dev) +{ + dev->set_multicast_list = NULL; + dev->change_mtu = hippi_change_mtu; + dev->hard_header = hippi_header; + dev->rebuild_header = hippi_rebuild_header; + dev->set_mac_address = hippi_mac_addr; + dev->hard_header_parse = NULL; + dev->hard_header_cache = NULL; + dev->header_cache_update = NULL; + dev->neigh_setup = hippi_neigh_setup_dev; + + /* + * We don't support HIPPI `ARP' for the time being, and probably + * never will unless someone else implements it. However we + * still need a fake ARPHRD to make ifconfig and friends play ball. + */ + dev->type = ARPHRD_HIPPI; + dev->hard_header_len = HIPPI_HLEN; + dev->mtu = 65280; + dev->addr_len = HIPPI_ALEN; + dev->tx_queue_len = 25 /* 5 */; + memset(dev->broadcast, 0xFF, HIPPI_ALEN); + + + /* + * HIPPI doesn't support broadcast+multicast and we only use + * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. + */ + dev->flags = 0; +} + +/** + * alloc_hippi_dev - Register HIPPI device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this HIPPI device + * + * Fill in the fields of the device structure with HIPPI-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ + +struct net_device *alloc_hippi_dev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); +} + +EXPORT_SYMBOL(alloc_hippi_dev); --- 1.17/net/802/tr.c 2004-06-24 21:36:53 +02:00 +++ edited/net/802/tr.c 2004-11-01 13:14:02 +01:00 @@ -583,6 +583,43 @@ #endif +static void tr_setup(struct net_device *dev) +{ + /* + * Configure and register + */ + + dev->hard_header = tr_header; + dev->rebuild_header = tr_rebuild_header; + + dev->type = ARPHRD_IEEE802_TR; + dev->hard_header_len = TR_HLEN; + dev->mtu = 2000; + dev->addr_len = TR_ALEN; + dev->tx_queue_len = 100; /* Long queues on tr */ + + memset(dev->broadcast,0xFF, TR_ALEN); + + /* New-style flags. */ + dev->flags = IFF_BROADCAST | IFF_MULTICAST ; +} + +/** + * alloc_trdev - Register token ring device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this token ring device + * + * Fill in the fields of the device structure with token ring-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_trdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "tr%d", tr_setup); +} + /* * Called during bootup. We don't actually have to initialise * too much for this. @@ -604,3 +641,4 @@ EXPORT_SYMBOL(tr_source_route); EXPORT_SYMBOL(tr_type_trans); +EXPORT_SYMBOL(alloc_trdev); --- 1.8/net/appletalk/Makefile 2004-08-18 23:35:04 +02:00 +++ edited/net/appletalk/Makefile 2004-11-01 13:22:42 +01:00 @@ -4,6 +4,6 @@ obj-$(CONFIG_ATALK) += appletalk.o -appletalk-y := aarp.o ddp.o +appletalk-y := aarp.o ddp.o dev.o appletalk-$(CONFIG_PROC_FS) += atalk_proc.o appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o --- 1.9/net/ethernet/eth.c 2004-10-05 23:51:01 +02:00 +++ edited/net/ethernet/eth.c 2004-11-01 13:54:23 +01:00 @@ -245,3 +245,64 @@ } EXPORT_SYMBOL(eth_type_trans); + +static int eth_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr=p; + if (netif_running(dev)) + return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); + return 0; +} + +static int eth_change_mtu(struct net_device *dev, int new_mtu) +{ + if ((new_mtu < 68) || (new_mtu > 1500)) + return -EINVAL; + dev->mtu = new_mtu; + return 0; +} + +/* + * Fill in the fields of the device structure with ethernet-generic values. + */ +void ether_setup(struct net_device *dev) +{ + dev->change_mtu = eth_change_mtu; + dev->hard_header = eth_header; + dev->rebuild_header = eth_rebuild_header; + dev->set_mac_address = eth_mac_addr; + dev->hard_header_cache = eth_header_cache; + dev->header_cache_update= eth_header_cache_update; + dev->hard_header_parse = eth_header_parse; + + dev->type = ARPHRD_ETHER; + dev->hard_header_len = ETH_HLEN; + dev->mtu = 1500; /* eth_mtu */ + dev->addr_len = ETH_ALEN; + dev->tx_queue_len = 1000; /* Ethernet wants good queues */ + dev->flags = IFF_BROADCAST|IFF_MULTICAST; + + memset(dev->broadcast,0xFF, ETH_ALEN); + +} +EXPORT_SYMBOL(ether_setup); + +/** + * alloc_etherdev - Allocates and sets up an ethernet device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this ethernet device + * + * Fill in the fields of the device structure with ethernet-generic + * values. Basically does everything except registering the device. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ + +struct net_device *alloc_etherdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "eth%d", ether_setup); +} +EXPORT_SYMBOL(alloc_etherdev); --- /dev/null 2004-08-20 00:05:11.000000000 +0200 +++ b/net/appletalk/dev.c 2004-11-01 13:49:02.111094544 +0100 @@ -0,0 +1,43 @@ +/* + * Moved here from drivers/net/net_init.c, which is: + * Written 1993,1994,1995 by Donald Becker. + */ + +#include +#include +#include +#include +#include + +static int ltalk_change_mtu(struct net_device *dev, int mtu) +{ + return -EINVAL; +} + +static int ltalk_mac_addr(struct net_device *dev, void *addr) +{ + return -EINVAL; +} + +void ltalk_setup(struct net_device *dev) +{ + /* Fill in the fields of the device structure with localtalk-generic values. */ + + dev->change_mtu = ltalk_change_mtu; + dev->hard_header = NULL; + dev->rebuild_header = NULL; + dev->set_mac_address = ltalk_mac_addr; + dev->hard_header_cache = NULL; + dev->header_cache_update= NULL; + + dev->type = ARPHRD_LOCALTLK; + dev->hard_header_len = LTALK_HLEN; + dev->mtu = LTALK_MTU; + dev->addr_len = LTALK_ALEN; + dev->tx_queue_len = 10; + + dev->broadcast[0] = 0xFF; + + dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; +} +EXPORT_SYMBOL(ltalk_setup); From jesse.brandeburg@intel.com Wed Nov 10 09:52:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 09:52:55 -0800 (PST) Received: from caduceus.jf.intel.com (fmr06.intel.com [134.134.136.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAHqoMx030105 for ; Wed, 10 Nov 2004 09:52:51 -0800 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by caduceus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iAAHqEot026634; Wed, 10 Nov 2004 17:52:14 GMT Received: from nwlxmail01.jf.intel.com (nwlxmail01.jf.intel.com [10.7.171.40]) by talaria.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with ESMTP id iAAHiZIU025066; Wed, 10 Nov 2004 17:44:39 GMT Received: from rickshaw.jf.intel.com (rickshaw.jf.intel.com [10.23.51.50]) by nwlxmail01.jf.intel.com (8.12.10/8.12.9/MailSET/Hub) with ESMTP id iAAHplgP024052; Wed, 10 Nov 2004 09:51:47 -0800 Date: Wed, 10 Nov 2004 17:51:47 +0000 (UTC) From: Jesse Brandeburg X-X-Sender: jbrandeb@localhost.localdomain To: Andrew Morton cc: "Brandeburg, Jesse" , Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks In-Reply-To: <20041108151048.4bf605c1.akpm@osdl.org> Message-ID: ReplyTo: "Jesse Brandeburg" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=ISO-8859-1 Content-Transfer-Encoding: 8BIT X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 11693 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jesse.brandeburg@intel.com Precedence: bulk X-list: netdev Content-Length: 1383 Lines: 28 On Mon, 8 Nov 2004, Andrew Morton wrote: > > This patch undoes a change that we believe will impact performance > adversely, > > by creating possibly too long a delay between servicing completions. > > Maybe. But now take a look at how much additional pointless work will be > done in the common case. For instance, every tx completion will incur a > call to ixgb_clean_rx_irq(), which then calls ixgb_alloc_rx_buffers(). Is your common case transmits only? It seems there will always be more than just one transmit and one receive to service in an interrupt. The issue with the current code is that the inner functions can loop (clean_[tx|rx]) over many packets on their own, so I describe the current code a little differently: "every group of tx completions, will then make sure to call clean_rx to balance tx/rx work." The way that you proposed seems as if it may starve one side or the other if there are many packets going in one direction. If I'm missing something let me know. > There's quite a bit which can be optimised here. Appreciate your input Andrew, currently we're just trying to keep the e1000 and ixgb drivers the same, however it is possible that your solution is better. We are going to do a little experiment here over the next couple of days to try performance with both your suggestion and with our old method. We'll reply with our results. Jesse From kumarkr@us.ibm.com Wed Nov 10 10:23:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 10:24:09 -0800 (PST) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAINp6k031651 for ; Wed, 10 Nov 2004 10:23:58 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAAINRJT725494 for ; Wed, 10 Nov 2004 13:23:27 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAAINOYw237950 for ; Wed, 10 Nov 2004 11:23:24 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAAINO6G032257 for ; Wed, 10 Nov 2004 11:23:24 -0700 Received: from d03nm132.boulder.ibm.com (d03nm132.boulder.ibm.com [9.17.195.172]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAAINNGk032245; Wed, 10 Nov 2004 11:23:23 -0700 In-Reply-To: <20041110.030026.29809367.yoshfuji@linux-ipv6.org> Subject: Re: [BK PATCH] Misc IPv6 Updates To: YOSHIFUJI Hideaki / =?ISO-2022-JP?B?GyRCNUhGIzFRTEAbKEI=?= Cc: davem@davemloft.net, netdev@oss.sgi.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Krishna Kumar Date: Wed, 10 Nov 2004 10:20:40 -0800 X-MIMETrack: Serialize by Router on D03NM132/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/10/2004 11:23:23 MIME-Version: 1.0 Content-type: multipart/related; Boundary="0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676" X-archive-position: 11694 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kumarkr@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 90617 Lines: 2344 --0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: multipart/alternative; Boundary="1__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676" --1__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: text/plain; charset=ISO-2022-JP Content-transfer-encoding: quoted-printable (sorry if my mailer mangles the code) In : +static inline int ipv6_addr_equal(const struct in6_addr *a1, + const struct in6_add= r *a2) +{ + return (a1->s6_addr32[0] =3D=3D a2->s6_addr32[0] && + a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] && + a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] && + a1->s6_addr32[3] =3D=3D a2->s6_addr32[3]); +} + Is it faster to do : +static inline int ipv6_addr_equal(const struct in6_addr *a1, + const struct in6_add= r *a2) +{ + return (a1->s6_addr32[3] =3D=3D a2->s6_addr32[3] && + a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] && + a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] && + a1->s6_addr32[0] =3D=3D a2->s6_addr32[0]); +} + instead ?It should be faster for typical addresses, say 2000:a:b:c::1 a= nd 2000:a:b:c::2. The device EUI-64 is normally going to be different for all devices while prefix can be same= (atleast on a link/local site) completely or to some prefix len portion. thanks, - KK = YOSHIFUJI Hideaki = / =1B$B5HF#1QL@=1B(B = davem@davemloft.net = Sent by: = cc netdev-bounce@oss netdev@oss.sgi.com, = .sgi.com yoshfuji@linux-ipv6.org = Subj= ect [BK PATCH] Misc IPv6 Updates = 11/10/2004 12:00 = AM = = = = = Hello. Here're changeset at: bk://bk.skbuff.net:20610/linux-2.6-inet6-misc/ Note: 1. Bug#3717 will be closed next week, after my returning to Japan. 2. Since there're some points to retain ipv6_addr_cmp(), let's introduce fast ipv6_addr_equal() and use it where appropriate. (please double check.) 3. I'm not so worring about alignment because we already have ipv6_addr_any() etc. If you're unhappy with this, let me re-create changesets. Thank you. HEADLINES --------- ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg. ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function. ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate. DIFFSTATS --------- include/net/ipv6.h | 9 +++++++++ include/net/tcp.h | 16 +++++++++++----- net/ipv4/tcp_timer.c | 7 ++++++- net/ipv6/addrconf.c | 10 +++++----- net/ipv6/anycast.c | 10 +++++----- net/ipv6/datagram.c | 2 +- net/ipv6/ip6_fib.c | 4 ++-- net/ipv6/ip6_flowlabel.c | 2 +- net/ipv6/ip6_output.c | 4 ++-- net/ipv6/ip6_tunnel.c | 10 +++++----- net/ipv6/mcast.c | 37 ++++++++++++++++++------------------- net/ipv6/ndisc.c | 2 +- net/ipv6/netfilter/ip6_queue.c | 4 ++-- net/ipv6/netfilter/ip6t_rt.c | 4 ++-- net/ipv6/raw.c | 8 ++++---- net/ipv6/reassembly.c | 8 ++++---- net/ipv6/route.c | 8 ++++---- net/ipv6/tcp_ipv6.c | 16 ++++++++-------- net/ipv6/udp.c | 12 ++++++------ net/ipv6/xfrm6_policy.c | 6 +++--- net/ipv6/xfrm6_state.c | 6 +++--- net/sctp/ipv6.c | 2 +- 22 files changed, 103 insertions(+), 84 deletions(-) CHANGESETS ---------- ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg. Closed: Bug#3717 (by John Goerzen ) Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h 2004-11-10 16:44:58 +09:00 +++ b/include/net/tcp.h 2004-11-10 16:44:58 +09:00 @@ -965,7 +965,9 @@ extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu); extern unsigned int tcp_current_mss(struct sock *sk, int large); -extern const char timer_bug_msg[]; +#ifdef TCP_DEBUG +extern const char tcp_timer_bug_msg[]; +#endif /* tcp_diag.c */ extern void tcp_get_info(struct sock *, struct tcp_info *); @@ -998,7 +1000,9 @@ #endif break; default: - printk(timer_bug_msg); +#ifdef TCP_DEBUG + printk(tcp_timer_bug_msg); +#endif return; }; @@ -1033,7 +1037,9 @@ break; default: - printk(timer_bug_msg); +#ifdef TCP_DEBUG + printk(tcp_timer_bug_msg); +#endif }; } diff -Nru a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c --- a/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00 +++ b/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00 @@ -36,7 +36,9 @@ static void tcp_delack_timer(unsigned long); static void tcp_keepalive_timer (unsigned long data); -const char timer_bug_msg[] =3D KERN_DEBUG "tcpbug: unknown timer value= \n"; +#ifdef TCP_DEBUG +const char tcp_timer_bug_msg[] =3D KERN_DEBUG "tcpbug: unknown timer value\n"; +#endif /* * Using different timers for retransmit, delayed acks and probes @@ -651,3 +653,6 @@ EXPORT_SYMBOL(tcp_delete_keepalive_timer); EXPORT_SYMBOL(tcp_init_xmit_timers); EXPORT_SYMBOL(tcp_reset_keepalive_timer); +#ifdef TCP_DEBUG +EXPORT_SYMBOL(tcp_timer_bug_msg); +#endif ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function. It is not optimal to use ipv6_addr_cmp() for simple address comparison, which checks if two addresses are equal. Based on idea from Dave Craig . Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/ipv6.h b/include/net/ipv6.h --- a/include/net/ipv6.h 2004-11-10 16:45:02 +09:00 +++ b/include/net/ipv6.h 2004-11-10 16:45:02 +09:00 @@ -296,6 +296,15 @@ } #endif +static inline int ipv6_addr_equal(const struct in6_addr *a1, + const struct in6_add= r *a2) +{ + return (a1->s6_addr32[0] =3D=3D a2->s6_addr32[0] && + a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] && + a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] && + a1->s6_addr32[3] =3D=3D a2->s6_addr32[3]); +} + static inline int ipv6_addr_any(const struct in6_addr *a) { return ((a->s6_addr32[0] | a->s6_addr32[1] | ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate. Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h 2004-11-10 16:45:07 +09:00 +++ b/include/net/tcp.h 2004-11-10 16:45:07 +09:00 @@ -361,8 +361,8 @@ #define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif) \ (((*((__u32 *)&(inet_sk(__sk)->dport)))=3D=3D (__ports)) && \ ((__sk)->sk_family =3D=3D AF_INET6)= && \ - !ipv6_addr_cmp(&inet6_sk(__sk)->daddr, (__saddr)) = && \ - !ipv6_addr_cmp(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ + ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) = && \ + ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if =3D= =3D (__dif)))) /* These can have wildcards, don't try too hard. */ diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00 @@ -921,7 +921,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next= ) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0 &= & + if (ipv6_addr_equal(&ifp->addr, addr) && !(ifp->flags&IFA_F_TENTATIVE)) { if (dev =3D=3D NULL || ifp->idev->= dev =3D=3D dev || !(ifp->scope&(IFA_LINK|IFA_HOS= T) || strict)) @@ -940,7 +940,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next= ) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0) = { + if (ipv6_addr_equal(&ifp->addr, addr)) { if (dev =3D=3D NULL || ifp->idev->= dev =3D=3D dev) break; } @@ -956,7 +956,7 @@ read_lock_bh(&addrconf_hash_lock); for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next= ) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0) = { + if (ipv6_addr_equal(&ifp->addr, addr)) { if (dev =3D=3D NULL || ifp->idev->= dev =3D=3D dev || !(ifp->scope&(IFA_LINK|IFA_HOS= T) || strict)) { in6_ifa_hold(ifp); @@ -992,7 +992,7 @@ return 1; if (sk2_rcv_saddr6 && - !ipv6_addr_cmp(sk_rcv_saddr6, sk2_rcv_saddr6)) + ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6)) return 1; if (addr_type =3D=3D IPV6_ADDR_MAPPED && @@ -1630,7 +1630,7 @@ read_lock_bh(&idev->lock); for (ifp =3D idev->addr_list; ifp; ifp=3Difp->if_next) { if (ifp->prefix_len =3D=3D plen && - (!memcmp(pfx, &ifp->addr, sizeof(struct in6_addr)))) { + ipv6_addr_equal(pfx, &ifp->addr)) { in6_ifa_hold(ifp); read_unlock_bh(&idev->lock); diff -Nru a/net/ipv6/anycast.c b/net/ipv6/anycast.c --- a/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00 @@ -205,7 +205,7 @@ prev_pac =3D NULL; for (pac =3D np->ipv6_ac_list; pac; pac =3D pac->acl_next)= { if ((ifindex =3D=3D 0 || pac->acl_ifindex =3D=3D= ifindex) && - ipv6_addr_cmp(&pac->acl_addr, addr) =3D=3D= 0) + ipv6_addr_equal(&pac->acl_addr, addr)) break; prev_pac =3D pac; } @@ -278,7 +278,7 @@ for (pac=3Dnp->ipv6_ac_list; pac; pac=3Dpac->acl_next) { if (ifindex && pac->acl_ifindex !=3D ifindex) continue; - found =3D ipv6_addr_cmp(&pac->acl_addr, addr) = =3D=3D 0; + found =3D ipv6_addr_equal(&pac->acl_addr, addr= ); if (found) break; } @@ -320,7 +320,7 @@ } for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) { - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D= 0) { + if (ipv6_addr_equal(&aca->aca_addr, addr)) { aca->aca_users++; err =3D 0; goto out; @@ -384,7 +384,7 @@ write_lock_bh(&idev->lock); prev_aca =3D NULL; for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) { - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D= 0) + if (ipv6_addr_equal(&aca->aca_addr, addr)) break; prev_aca =3D aca; } @@ -436,7 +436,7 @@ if (idev) { read_lock_bh(&idev->lock); for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D 0) + if (ipv6_addr_equal(&aca->aca_addr= , addr)) break; read_unlock_bh(&idev->lock); in6_dev_put(idev); diff -Nru a/net/ipv6/datagram.c b/net/ipv6/datagram.c --- a/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00 @@ -190,7 +190,7 @@ } ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) = ? + ipv6_addr_equal(&fl.fl6_dst, &np->daddr)= ? &np->daddr : NULL); sk->sk_state =3D TCP_ESTABLISHED; diff -Nru a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c --- a/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00 @@ -451,8 +451,8 @@ if (iter->rt6i_dev =3D=3D rt->rt6i= _dev && iter->rt6i_idev =3D=3D rt->rt6= i_idev && - ipv6_addr_cmp(&iter->rt6i_gate= way, - &rt->rt6i_gateway) =3D=3D 0) { + ipv6_addr_equal(&iter->rt6i_gateway, + &rt->rt6i_gateway)) { if (!(iter->rt6i_flags&RTF_EXPIRES)) return -EEXIST; iter->rt6i_expires =3D= rt->rt6i_expires; diff -Nru a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c --- a/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00 @@ -500,7 +500,7 @@ goto relea= se; err =3D -EINVAL; - if (ipv6_addr_cmp(&fl1->dst, &fl->dst) || + if (!ipv6_addr_equal(&fl1->dst, &fl->dst) || ipv6_opt_cmp(fl1->= opt, fl->opt)) goto relea= se; diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c --- a/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00 @@ -768,9 +768,9 @@ */ if (((rt->rt6i_dst.plen !=3D 128 |= | - ipv6_addr_cmp(&fl->fl6_dst, &rt->rt6i_dst.addr)) + !ipv6_addr_equal(&fl->fl6_ds= t, &rt->rt6i_dst.addr)) && (np->daddr_cache =3D=3D NU= LL || - ipv6_addr_cmp(&fl->fl6_dst, np->daddr_cache))) + !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache))) || (fl->oif && fl->oif !=3D (*dst)->dev->ifindex)) { *dst =3D NULL; } else diff -Nru a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c --- a/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00 @@ -133,8 +133,8 @@ struct ip6_tnl *t; for (t =3D tnls_r_l[h0 ^ h1]; t; t =3D t->next) { - if (!ipv6_addr_cmp(local, &t->parms.laddr) && - !ipv6_addr_cmp(remote, &t->parms.raddr) &&= + if (ipv6_addr_equal(local, &t->parms.laddr) &&= + ipv6_addr_equal(remote, &t->parms.raddr) &= & (t->dev->flags & IFF_UP)) return t; } @@ -284,8 +284,8 @@ return -EINVAL; for (t =3D *ip6ip6_bucket(p); t; t =3D t->next) { - if (!ipv6_addr_cmp(local, &t->parms.laddr) && - !ipv6_addr_cmp(remote, &t->parms.raddr)) {= + if (ipv6_addr_equal(local, &t->parms.laddr) &&= + ipv6_addr_equal(remote, &t->parms.raddr)) = { *pt =3D t; return (create ? -EEXIST : 0); } @@ -602,7 +602,7 @@ static inline int ip6ip6_tnl_addr_conflict(struct ip6_tnl *t, struct ipv6hdr *hdr) { - return !ipv6_addr_cmp(&t->parms.raddr, &hdr->saddr); + return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr); } /** diff -Nru a/net/ipv6/mcast.c b/net/ipv6/mcast.c --- a/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00 @@ -247,7 +247,7 @@ write_lock_bh(&ipv6_sk_mc_lock); for (lnk =3D &np->ipv6_mc_list; (mc_lst =3D *lnk) !=3DNULL= ; lnk =3D &mc_lst->next) { if ((ifindex =3D=3D 0 || mc_lst->ifindex =3D=3D= ifindex) && - ipv6_addr_cmp(&mc_lst->addr, addr) =3D=3D = 0) { + ipv6_addr_equal(&mc_lst->addr, addr)) { struct net_device *dev; *lnk =3D mc_lst->next; @@ -369,7 +369,7 @@ for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) { if (pgsr->gsr_interface && pmc->ifindex !=3D pgsr->gsr_interface) continue; - if (ipv6_addr_cmp(&pmc->addr, group) =3D=3D 0)= + if (ipv6_addr_equal(&pmc->addr, group)) break; } if (!pmc) /* must have a prior join */= @@ -485,7 +485,7 @@ for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) { if (pmc->ifindex !=3D gsf->gf_interface) continue; - if (ipv6_addr_cmp(&pmc->addr, group) =3D=3D 0)= + if (ipv6_addr_equal(&pmc->addr, group)) break; } if (!pmc) /* must have a prior join */= @@ -556,7 +556,7 @@ for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) { if (pmc->ifindex !=3D gsf->gf_interface) continue; - if (ipv6_addr_cmp(group, &pmc->addr) =3D=3D 0)= + if (ipv6_addr_equal(group, &pmc->addr)) break; } if (!pmc) /* must have a prior join */= @@ -603,7 +603,7 @@ read_lock(&ipv6_sk_mc_lock); for (mc =3D np->ipv6_mc_list; mc; mc =3D mc->next) { - if (ipv6_addr_cmp(&mc->addr, mc_addr) =3D=3D 0= ) + if (ipv6_addr_equal(&mc->addr, mc_addr)) break; } if (!mc) { @@ -617,7 +617,7 @@ int i; for (i=3D0; isl_count; i++) { - if (ipv6_addr_cmp(&psl->sl_addr[i]= , src_addr) =3D=3D 0) + if (ipv6_addr_equal(&psl->sl_addr[= i], src_addr)) break; } if (mc->sfmode =3D=3D MCAST_INCLUDE && i >=3D psl->sl_count) @@ -740,7 +740,7 @@ write_lock_bh(&idev->mc_lock); pmc_prev =3D NULL; for (pmc=3Didev->mc_tomb; pmc; pmc=3Dpmc->next) { - if (ipv6_addr_cmp(&pmc->mca_addr, pmca) =3D=3D= 0) + if (ipv6_addr_equal(&pmc->mca_addr, pmca)) break; pmc_prev =3D pmc; } @@ -816,7 +816,7 @@ } for (mc =3D idev->mc_list; mc; mc =3D mc->next) { - if (ipv6_addr_cmp(&mc->mca_addr, addr) =3D=3D = 0) { + if (ipv6_addr_equal(&mc->mca_addr, addr)) { mc->mca_users++; write_unlock_bh(&idev->lock); ip6_mc_add_src(idev, &mc->mca_addr= , MCAST_EXCLUDE, 0, @@ -878,7 +878,7 @@ write_lock_bh(&idev->lock); for (map =3D &idev->mc_list; (ma=3D*map) !=3D NULL; map =3D= &ma->next) { - if (ipv6_addr_cmp(&ma->mca_addr, addr) =3D=3D = 0) { + if (ipv6_addr_equal(&ma->mca_addr, addr)) { if (--ma->mca_users =3D=3D 0) { *map =3D ma->next; write_unlock_bh(&idev->lock); @@ -953,7 +953,7 @@ if (idev) { read_lock_bh(&idev->lock); for (mc =3D idev->mc_list; mc; mc=3Dmc->next) = { - if (ipv6_addr_cmp(&mc->mca_addr, group) =3D=3D 0) + if (ipv6_addr_equal(&mc->mca_addr,= group)) break; } if (mc) { @@ -962,8 +962,7 @@ spin_lock_bh(&mc->mca_lock); for (psf=3Dmc->mca_sources;psf;psf=3Dpsf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, - src_ad= dr) =3D=3D 0) + if (ipv6_addr_equal(&psf->sf_addr, src_addr)) break; } if (psf) @@ -1040,7 +1039,7 @@ if (scount =3D=3D nsrcs) break; for (i=3D0; isf_addr) =3D=3D 0) { + if (ipv6_addr_equal(&srcs[i], &psf->sf_addr)) { psf->sf_gsresp =3D 1; scount++; break; @@ -1135,7 +1134,7 @@ } else { for (ma =3D idev->mc_list; ma; ma=3Dma->next) = { if (group_type !=3D IPV6_ADDR_ANY = && - ipv6_addr_cmp(group, &ma->mca_addr) !=3D 0) + !ipv6_addr_equal(group, &ma->mca_addr)) continue; spin_lock_bh(&ma->mca_lock); if (ma->mca_flags & MAF_TIMER_RUNN= ING) { @@ -1200,7 +1199,7 @@ read_lock_bh(&idev->lock); for (ma =3D idev->mc_list; ma; ma=3Dma->next) { - if (ipv6_addr_cmp(&ma->mca_addr, addrp) =3D=3D= 0) { + if (ipv6_addr_equal(&ma->mca_addr, addrp)) { spin_lock(&ma->mca_lock); if (del_timer(&ma->mca_timer)) atomic_dec(&ma->mca_refcnt); @@ -1695,7 +1694,7 @@ psf_prev =3D NULL; for (psf=3Dpmc->mca_sources; psf; psf=3Dpsf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) =3D=3D= 0) + if (ipv6_addr_equal(&psf->sf_addr, psfsrc)) break; psf_prev =3D psf; } @@ -1735,7 +1734,7 @@ return -ENODEV; read_lock_bh(&idev->lock); for (pmc=3Didev->mc_list; pmc; pmc=3Dpmc->next) { - if (ipv6_addr_cmp(pmca, &pmc->mca_addr) =3D=3D= 0) + if (ipv6_addr_equal(pmca, &pmc->mca_addr)) break; } if (!pmc) { @@ -1790,7 +1789,7 @@ psf_prev =3D NULL; for (psf=3Dpmc->mca_sources; psf; psf=3Dpsf->sf_next) { - if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) =3D=3D= 0) + if (ipv6_addr_equal(&psf->sf_addr, psfsrc)) break; psf_prev =3D psf; } @@ -1859,7 +1858,7 @@ return -ENODEV; read_lock_bh(&idev->lock); for (pmc=3Didev->mc_list; pmc; pmc=3Dpmc->next) { - if (ipv6_addr_cmp(pmca, &pmc->mca_addr) =3D=3D= 0) + if (ipv6_addr_equal(pmca, &pmc->mca_addr)) break; } if (!pmc) { diff -Nru a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c --- a/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00 @@ -1219,7 +1219,7 @@ return; } - if (ipv6_addr_cmp(dest, target) =3D=3D 0) { + if (ipv6_addr_equal(dest, target)) { on_link =3D 1; } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)= ) { ND_PRINTK2(KERN_WARNING diff -Nru a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_que= ue.c --- a/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +0= 9:00 +++ b/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +0= 9:00 @@ -376,8 +376,8 @@ */ if (e->info->hook =3D=3D NF_IP_LOCAL_OUT) { struct ipv6hdr *iph =3D e->skb->nh.ipv6h; - if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.dad= dr) || - ipv6_addr_cmp(&iph->saddr, &e->rt_info.sad= dr)) + if (!ipv6_addr_equal(&iph->daddr, &e->rt_info.daddr) || + !ipv6_addr_equal(&iph->saddr, &e->rt_info.saddr)) return ip6_route_me_harder(e->skb)= ; } return 0; diff -Nru a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c= --- a/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00 @@ -209,7 +209,7 @@ BUG_ON(ap =3D=3D NULL)= ; - if (!ipv6_addr_cmp(ap,= &rtinfo->addrs[i])) { + if (ipv6_addr_equal(ap= , &rtinfo->addrs[i])) { DEBUGP("i=3D= %d temp=3D%d;\n",i,temp); i++; } @@ -236,7 +236,7 @@ &_addr); BUG_ON(ap =3D=3D NULL)= ; - if (ipv6_addr_cmp(ap, &rtinfo->addrs[temp])) + if (!ipv6_addr_equal(a= p, &rtinfo->addrs[temp])) break; } DEBUGP("temp=3D%d #%d\n", temp, rtinfo->addrnr); diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00 @@ -90,11 +90,11 @@ struct ipv6_pinfo *np =3D inet6_sk= (sk); if (!ipv6_addr_any(&np->daddr) && - ipv6_addr_cmp(&np->daddr, rmt_addr)) + !ipv6_addr_equal(&np->daddr, rmt_addr)) continue; if (!ipv6_addr_any(&np->rcv_saddr)= ) { - if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr)) + if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) goto found= ; if (is_multicast && inet6_mc_check(sk,= loc_addr, rmt_addr)) @@ -668,7 +668,7 @@ * sk->sk_dst_cache. */ if (sk->sk_state =3D=3D TCP_ESTABLISHED && - !ipv6_addr_cmp(daddr, &np->daddr)) + ipv6_addr_equal(daddr, &np->daddr)) daddr =3D &np->daddr; if (addr_len >=3D sizeof(struct sockaddr_in6) = && @@ -775,7 +775,7 @@ } done: ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) = ? + ipv6_addr_equal(&fl.fl6_dst, &np->daddr)= ? &np->daddr : NULL); if (err > 0) err =3D np->recverr ? net_xmit_errno(err) : 0;= diff -Nru a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c --- a/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00 @@ -342,8 +342,8 @@ #ifdef CONFIG_SMP for (fq =3D ip6_frag_hash[hash]; fq; fq =3D fq->next) { if (fq->id =3D=3D fq_in->id && - !ipv6_addr_cmp(&fq_in->saddr, &fq->saddr) = && - !ipv6_addr_cmp(&fq_in->daddr, &fq->daddr))= { + ipv6_addr_equal(&fq_in->saddr, &fq->saddr)= && + ipv6_addr_equal(&fq_in->daddr, &fq->daddr)= ) { atomic_inc(&fq->refcnt); write_unlock(&ip6_frag_lock); fq_in->last_in |=3D COMPLETE; @@ -406,8 +406,8 @@ read_lock(&ip6_frag_lock); for(fq =3D ip6_frag_hash[hash]; fq; fq =3D fq->next) { if (fq->id =3D=3D id && - !ipv6_addr_cmp(src, &fq->saddr) && - !ipv6_addr_cmp(dst, &fq->daddr)) { + ipv6_addr_equal(src, &fq->saddr) && + ipv6_addr_equal(dst, &fq->daddr)) { atomic_inc(&fq->refcnt); read_unlock(&ip6_frag_lock); return fq; diff -Nru a/net/ipv6/route.c b/net/ipv6/route.c --- a/net/ipv6/route.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/route.c 2004-11-10 16:45:07 +09:00 @@ -1006,7 +1006,7 @@ rt->rt6i_dev->ifindex !=3D rtmsg->rtmsg_ifindex)) continue; if (rtmsg->rtmsg_flags&RTF_GATEWAY= && - ipv6_addr_cmp(&rtmsg->rtmsg_gateway, &rt->rt6i_gateway)) += !ipv6_addr_equal(&rtmsg->rtmsg_gateway, &rt->rt6i_gateway)) continue; if (rtmsg->rtmsg_metric && rtmsg->rtmsg_metric !=3D rt->rt6i_metric) @@ -1057,13 +1057,13 @@ * is a bit fuzzy and one might need to check all= default * routers. */ - if (ipv6_addr_cmp(saddr, &rt->rt6i_gateway)) { + if (!ipv6_addr_equal(saddr, &rt->rt6i_gateway)) { if (rt->rt6i_flags & RTF_DEFAULT) { struct rt6_info *rt1; read_lock(&rt6_lock); for (rt1 =3D ip6_routing_table.lea= f; rt1; rt1 =3D rt1->u.next) { - if (!ipv6_addr_cmp(sad= dr, &rt1->rt6i_gateway)) { + if (ipv6_addr_equal(sa= ddr, &rt1->rt6i_gateway)) { dst_hold(&rt1->u.dst); dst_release(&rt->u.dst); read_unlock(&rt6_lock); @@ -1262,7 +1262,7 @@ write_lock_bh(&rt6_lock); for (rt =3D fn->leaf; rt; rt=3Drt->u.next) { if (dev =3D=3D rt->rt6i_dev && - ipv6_addr_cmp(&rt->rt6i_gateway, addr) =3D= =3D 0) + ipv6_addr_equal(&rt->rt6i_gateway, addr)) break; } if (rt) diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c --- a/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00 @@ -262,7 +262,7 @@ score =3D 1; if (!ipv6_addr_any(&np->rcv_saddr)= ) { - if (ipv6_addr_cmp(&np->rcv_saddr, daddr)) + if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) continue; score++; } @@ -321,8 +321,8 @@ if(*((__u32 *)&(tw->tw_dport)) =3D=3D= ports && sk->sk_family =3D=3D PF_= INET6) { - if(!ipv6_addr_cmp(&tw->tw_v6_daddr= , saddr) && - !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr) && + if(ipv6_addr_equal(&tw->tw_v6_dadd= r, saddr) && + ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) && (!sk->sk_bound_dev_if || sk->sk_bound_dev_if =3D=3D dif)) goto hit; } @@ -406,8 +406,8 @@ prev =3D &req->dl_next) { if (req->rmt_port =3D=3D rport && req->class->family =3D=3D AF_INET6 && - !ipv6_addr_cmp(&req->af.v6_req.rmt_addr, raddr) && - !ipv6_addr_cmp(&req->af.v6_req.loc_addr, laddr) && + ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) && + ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) && (!req->af.v6_req.iif || req->af.v6_req.iif= =3D=3D iif)) { BUG_TRAP(req->sk =3D=3D NULL); *prevp =3D prev; @@ -463,8 +463,8 @@ if(*((__u32 *)&(tw->tw_dport)) =3D=3D= ports && sk2->sk_family =3D=3D= PF_INET6 && - !ipv6_addr_cmp(&tw->tw_v6_daddr, saddr) && - !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr)= && + ipv6_addr_equal(&tw->tw_v6_daddr, saddr) && + ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr= ) && sk2->sk_bound_dev_if =3D=3D sk->sk_bound_de= v_if) { struct tcp_opt *tp =3D tcp_sk(sk);= @@ -610,7 +610,7 @@ } if (tp->ts_recent_stamp && - ipv6_addr_cmp(&np->daddr, &usin->sin6_addr)) { + !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) { tp->ts_recent =3D 0; tp->ts_recent_stamp =3D 0; tp->write_seq =3D 0; diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c --- a/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00 @@ -171,12 +171,12 @@ score++; } if (!ipv6_addr_any(&np->rcv_saddr)= ) { - if (ipv6_addr_cmp(&np->rcv_saddr, daddr)) + if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) continue; score++; } if (!ipv6_addr_any(&np->daddr)) { - if (ipv6_addr_cmp(&np->daddr, saddr)) + if (!ipv6_addr_equal(&np->daddr, saddr)) continue; score++; } @@ -395,14 +395,14 @@ continue; } if (!ipv6_addr_any(&np->daddr) && - ipv6_addr_cmp(&np->daddr, rmt_addr)) + !ipv6_addr_equal(&np->daddr, rmt_addr)) continue; if (s->sk_bound_dev_if && s->sk_bound_dev_if !=3D dif) continue; if (!ipv6_addr_any(&np->rcv_saddr)= ) { - if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr)) + if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) return s; continue; } @@ -732,7 +732,7 @@ * sk->sk_dst_cache. */ if (sk->sk_state =3D=3D TCP_ESTABLISHED && - !ipv6_addr_cmp(daddr, &np->daddr)) + ipv6_addr_equal(daddr, &np->daddr)) daddr =3D &np->daddr; if (addr_len >=3D sizeof(struct sockaddr_in6) = && @@ -840,7 +840,7 @@ if (dst) ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl->fl6_dst,= &np->daddr) ? + ipv6_addr_equal(&fl->fl6_dst= , &np->daddr) ? &np->daddr : NULL); if (err > 0) err =3D np->recverr ? net_xmit_errno(err) : 0;= diff -Nru a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c --- a/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00 @@ -68,8 +68,8 @@ ipv6_addr_prefix(&fl_src_prefix, &fl->fl6_src, xdst->u.rt6.rt6i_src.plen); - if (!ipv6_addr_cmp(&xdst->u.rt6.rt6i_dst.addr,= &fl_dst_prefix) && - !ipv6_addr_cmp(&xdst->u.rt6.rt6i_src.addr,= &fl_src_prefix) && + if (ipv6_addr_equal(&xdst->u.rt6.rt6i_dst.addr= , &fl_dst_prefix) && + ipv6_addr_equal(&xdst->u.rt6.rt6i_src.addr= , &fl_src_prefix) && __xfrm6_bundle_ok(xdst, fl)) { dst_clone(dst); break; @@ -123,7 +123,7 @@ trailer_len +=3D xfrm[i]->props.trailer_len; } - if (ipv6_addr_cmp(remote, &fl->fl6_dst)) { + if (!ipv6_addr_equal(remote, &fl->fl6_dst)) { struct flowi fl_tunnel; memset(&fl_tunnel, 0, sizeof(fl_tunnel)); diff -Nru a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c --- a/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00 +++ b/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00 @@ -55,7 +55,7 @@ list_for_each_entry(x, xfrm6_state_afinfo.state_byspi+h, byspi) { if (x->props.family =3D=3D AF_INET6 && spi =3D=3D x->id.spi && - !ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && + ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && proto =3D=3D x->id.proto) { xfrm_state_hold(x); return x; @@ -76,10 +76,10 @@ list_for_each_entry(x, xfrm6_state_afinfo.state_bydst+h, bydst) { if (x->props.family =3D=3D AF_INET6 && - !ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && + ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)x->id.daddr.a6) && mode =3D=3D x->props.mode && proto =3D=3D x->id.proto && - !ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)x->props.saddr.a6) && + ipv6_addr_equal((struct in6_addr *)saddr, (struct in6_addr *)x->props.saddr.a6) && reqid =3D=3D x->props.reqid && x->km.state =3D=3D XFRM_STATE_ACQ && !x->id.spi) { diff -Nru a/net/sctp/ipv6.c b/net/sctp/ipv6.c --- a/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00 +++ b/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00 @@ -461,7 +461,7 @@ } return 0; } - if (ipv6_addr_cmp(&addr1->v6.sin6_addr, &addr2->v6.sin6_ad= dr)) + if (!ipv6_addr_equal(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr)) return 0; /* If this is a linklocal address, compare the scope_id. *= / if (ipv6_addr_type(&addr1->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) { -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA = --1__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: text/html; charset=ISO-2022-JP Content-Disposition: inline Content-transfer-encoding: quoted-printable

(sorry if my mailer mangles the code)

In :

+static inline int ipv6_addr_equal(const struct in6_addr *a1,
+   const struct in6_addr *a2)
+{
+ return (a1->s6_addr32[0] =3D=3D a2->s6_addr32[0] && + a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] &&
+ a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] &&
+ a1->s6_addr32[3] =3D=3D a2->s6_addr32[3]);
+}
+


Is it faster to do :

+static inline int ipv6_addr_equal(const struct in6_addr *a1,
+   const struct in6_addr *a2)
+{
+ return (a1->s6_addr32[3] =3D=3D a2->s6_addr32[3] && + a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] &&
+ a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] &&
+ a1->s6_addr32[0] =3D=3D a2->s6_addr32[0]);
+}
+


instead ?It should be faster for typical addresses, say 2000:a:b:c::1 a= nd 2000:a:b:c::2. The device EUI-64 is
normally going to be different for all devices while prefix can be same= (atleast on a link/local site) completely
or to some prefix len portion.

thanks,

- KK

3D"InactiveYOSHIFUJI Hideaki = / =1B$B5HF#1QL@=1B(B <yoshfuji@linux-ipv6.org>


=
          YOSHIFUJI Hideaki / =1B$B5HF#1QL@=1B(B <yosh= fuji@linux-ipv6.org>
          Sent by: netdev-bounce@oss.sgi.com

          11/10/2004 12:00 AM

=
3D""
To
3D""
davem@davemloft.net
3D""
cc
3D""
netdev@oss.sgi.com, yoshfuji@linux-ipv6.org
3D""
Subject
3D""
[BK PATCH] Misc IPv6 Updates
=3D""3D""<= /td>

Hello.

Here're changeset at:
 bk://bk.skbuff.net:20610/linux-2.6-inet6-misc/

Note:
1. Bug#3717 will be closed next week, after my returning to Japan.
= 2. Since there're some points to retain ipv6_addr_cmp(),
   let's introduce fast ipv6_addr_equal() and use it
   where appropriate. (please double check.)
3. I'm not so worring about alignment because
   we already have ipv6_addr_any() etc.

If you're unhappy with this, let me re-create changesets.
Thank you.

HEADLINES
---------
ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg.
ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function.
ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate.


DIFFSTATS
---------
include/net/ipv6.h             |   =  9 +++++++++
include/net/tcp.h              | &n= bsp; 16 +++++++++++-----
net/ipv4/tcp_timer.c           |    = ;7 ++++++-
net/ipv6/addrconf.c            |   = 10 +++++-----
net/ipv6/anycast.c             |   = 10 +++++-----
net/ipv6/datagram.c            |   =  2 +-
net/ipv6/ip6_fib.c             |   =  4 ++--
net/ipv6/ip6_flowlabel.c       |    2 +-
net/ipv6/ip6_output.c          |    = ;4 ++--
net/ipv6/ip6_tunnel.c          |   10 ++= +++-----
net/ipv6/mcast.c               | &n= bsp; 37 ++++++++++++++++++-------------------
net/ipv6/ndisc.c               | &n= bsp;  2 +-
net/ipv6/netfilter/ip6_queue.c |    4 ++--
net/ipv6/netfilter/ip6t_rt.c   |    4 ++--
net/ipv6/raw.c                = |    8 ++++----
net/ipv6/reassembly.c          |    = ;8 ++++----
net/ipv6/route.c               | &n= bsp;  8 ++++----
net/ipv6/tcp_ipv6.c            |   = 16 ++++++++--------
net/ipv6/udp.c                = |   12 ++++++------
net/ipv6/xfrm6_policy.c        |    6 ++= +---
net/ipv6/xfrm6_state.c         |    6 ++= +---
net/sctp/ipv6.c                = ;|    2 +-
22 files changed, 103 insertions(+), 84 deletions(-)


CHANGESETS
----------
ChangeSet@1.2607, 2004-11-09 14:07:14+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix unresolved symbol timer_bug_msg.

Closed: Bug#3717 (by John Goerzen <goerzen@complete.org>)
Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>

diff -Nru a/include/net/tcp.h b/include/net/tcp.h
--- a/include/net/tcp.h 2004-11-10 16:44:58 +09:00
+++ b/include/net/tcp.h 2004-11-10 16:44:58 +09:00
@@ -965,7 +965,9 @@
extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu);
extern unsigned int tcp_current_mss(struct sock *sk, int large);

-extern const char timer_bug_msg[];
+#ifdef TCP_DEBUG
+extern const char tcp_timer_bug_msg[];
+#endif

/* tcp_diag.c */
extern void tcp_get_info(struct sock *, struct tcp_info *);
@@ -998,7 +1000,9 @@
#endif
break;
default:
- printk(timer_bug_msg);
+#ifdef TCP_DEBUG
+ printk(tcp_timer_bug_msg);
+#endif
return;
};

@@ -1033,7 +1037,9 @@
break;

default:
- printk(timer_bug_msg);
+#ifdef TCP_DEBUG
+ printk(tcp_timer_bug_msg);
+#endif
};
}

diff -Nru a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
--- a/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00
+++ b/net/ipv4/tcp_timer.c 2004-11-10 16:44:58 +09:00
@@ -36,7 +36,9 @@
static void tcp_delack_timer(unsigned long);
static void tcp_keepalive_timer (unsigned long data);

-const char timer_bug_msg[] =3D KERN_DEBUG "tcpbug: unknown timer = value\n";
+#ifdef TCP_DEBUG
+const char tcp_timer_bug_msg[] =3D KERN_DEBUG "tcpbug: unknown ti= mer value\n";
+#endif

/*
 * Using different timers for retransmit, delayed acks and probes=
@@ -651,3 +653,6 @@
EXPORT_SYMBOL(tcp_delete_keepalive_timer);
EXPORT_SYMBOL(tcp_init_xmit_timers);
EXPORT_SYMBOL(tcp_reset_keepalive_timer);
+#ifdef TCP_DEBUG
+EXPORT_SYMBOL(tcp_timer_bug_msg);
+#endif

ChangeSet@1.2608, 2004-11-10 15:50:50+09:00, yoshfuji@linux-ipv6.org [IPV6] introduce lightweight IPv6 address comparison function.

It is not optimal to use ipv6_addr_cmp() for simple address
comparison, which checks if two addresses are equal.
Based on idea from Dave Craig <dwcraig@qualcomm.com>.

Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>

diff -Nru a/include/net/ipv6.h b/include/net/ipv6.h
--- a/include/net/ipv6.h 2004-11-10 16:45:02 +09:00
+++ b/include/net/ipv6.h 2004-11-10 16:45:02 +09:00
@@ -296,6 +296,15 @@
}
#endif

+static inline int ipv6_addr_equal(const struct in6_addr *a1,
+   const struct in6_addr *a2)
+{
+ return (a1->s6_addr32[0] =3D=3D a2->s6_addr32[0] && + a1->s6_addr32[1] =3D=3D a2->s6_addr32[1] &&
+ a1->s6_addr32[2] =3D=3D a2->s6_addr32[2] &&
+ a1->s6_addr32[3] =3D=3D a2->s6_addr32[3]);
+}
+
static inline int ipv6_addr_any(const struct in6_addr *a)
{
return ((a->s6_addr32[0] | a->s6_addr32[1] |

ChangeSet@1.2609, 2004-11-10 15:57:15+09:00, yoshfuji@linux-ipv6.org [IPV6] Use ipv6_addr_equal() where appropriate.

Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>

diff -Nru a/include/net/tcp.h b/include/net/tcp.h
--- a/include/net/tcp.h 2004-11-10 16:45:07 +09:00
+++ b/include/net/tcp.h 2004-11-10 16:45:07 +09:00
@@ -361,8 +361,8 @@
#define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif)  = ;  \
(((*((__u32 *)&(inet_sk(__sk)->dport)))=3D=3D (__ports)) &nb= sp; && \
 ((__sk)->sk_family =3D=3D AF_INET6) && \=
-  !ipv6_addr_cmp(&inet6_sk(__sk)->daddr, (__saddr)) &a= mp;& \
-  !ipv6_addr_cmp(&inet6_sk(__sk)->rcv_saddr, (__daddr)) = && \
+  ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) &= amp;& \
+  ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr))= && \
 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if= =3D=3D (__dif))))

/* These can have wildcards, don't try too hard. */
diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
--- a/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/addrconf.c 2004-11-10 16:45:07 +09:00
@@ -921,7 +921,7 @@

read_lock_bh(&addrconf_hash_lock);
for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0 && + if (ipv6_addr_equal(&ifp->addr, addr) &&
    !(ifp->flags&IFA_F_TENTATIVE)) {
if (dev =3D=3D NULL || ifp->idev->dev =3D=3D dev ||
=     !(ifp->scope&(IFA_LINK|IFA_HOST) || stri= ct))
@@ -940,7 +940,7 @@

read_lock_bh(&addrconf_hash_lock);
for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0) {
+ if (ipv6_addr_equal(&ifp->addr, addr)) {
if (dev =3D=3D NULL || ifp->idev->dev =3D=3D dev)
break;
}
@@ -956,7 +956,7 @@

read_lock_bh(&addrconf_hash_lock);
for(ifp =3D inet6_addr_lst[hash]; ifp; ifp=3Difp->lst_next) { - if (ipv6_addr_cmp(&ifp->addr, addr) =3D=3D 0) {
+ if (ipv6_addr_equal(&ifp->addr, addr)) {
if (dev =3D=3D NULL || ifp->idev->dev =3D=3D dev ||
=     !(ifp->scope&(IFA_LINK|IFA_HOST) || stri= ct)) {
in6_ifa_hold(ifp);
@@ -992,7 +992,7 @@
return 1;

if (sk2_rcv_saddr6 &&
-     !ipv6_addr_cmp(sk_rcv_saddr6, sk2_rcv_saddr6))
+     ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6))
return 1;

if (addr_type =3D=3D IPV6_ADDR_MAPPED &&
@@ -1630,7 +1630,7 @@
read_lock_bh(&idev->lock);
for (ifp =3D idev->addr_list; ifp; ifp=3Difp->if_next) {
if (ifp->prefix_len =3D=3D plen &&
-     (!memcmp(pfx, &ifp->addr, sizeof(struct in6= _addr)))) {
+     ipv6_addr_equal(pfx, &ifp->addr)) {
in6_ifa_hold(ifp);
read_unlock_bh(&idev->lock);

diff -Nru a/net/ipv6/anycast.c b/net/ipv6/anycast.c
--- a/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/anycast.c 2004-11-10 16:45:07 +09:00
@@ -205,7 +205,7 @@
prev_pac =3D NULL;
for (pac =3D np->ipv6_ac_list; pac; pac =3D pac->acl_next) {<= br> if ((ifindex =3D=3D 0 || pac->acl_ifindex =3D=3D ifindex) &am= p;&
-      ipv6_addr_cmp(&pac->acl_addr, addr) =3D= =3D 0)
+      ipv6_addr_equal(&pac->acl_addr, addr)= )
break;
prev_pac =3D pac;
}
@@ -278,7 +278,7 @@
for (pac=3Dnp->ipv6_ac_list; pac; pac=3Dpac->acl_next) {
if (ifindex && pac->acl_ifindex !=3D ifindex)
continue;
- found =3D ipv6_addr_cmp(&pac->acl_addr, addr) =3D=3D 0; + found =3D ipv6_addr_equal(&pac->acl_addr, addr);
if (found)
break;
}
@@ -320,7 +320,7 @@
}

for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) {
= - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D 0) {
+ if (ipv6_addr_equal(&aca->aca_addr, addr)) {
aca->aca_users++;
err =3D 0;
goto out;
@@ -384,7 +384,7 @@
write_lock_bh(&idev->lock);
prev_aca =3D NULL;
for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) {
= - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D 0)
+ if (ipv6_addr_equal(&aca->aca_addr, addr))
break;
prev_aca =3D aca;
}
@@ -436,7 +436,7 @@
if (idev) {
read_lock_bh(&idev->lock);
for (aca =3D idev->ac_list; aca; aca =3D aca->aca_next) - if (ipv6_addr_cmp(&aca->aca_addr, addr) =3D=3D 0)
+ if (ipv6_addr_equal(&aca->aca_addr, addr))
break;
read_unlock_bh(&idev->lock);
in6_dev_put(idev);
diff -Nru a/net/ipv6/datagram.c b/net/ipv6/datagram.c
--- a/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/datagram.c 2004-11-10 16:45:07 +09:00
@@ -190,7 +190,7 @@
}

ip6_dst_store(sk, dst,
-       !ipv6_addr_cmp(&fl.fl6_dst, &np->= ;daddr) ?
+       ipv6_addr_equal(&fl.fl6_dst, &np-&g= t;daddr) ?
      &np->daddr : NULL);

sk->sk_state =3D TCP_ESTABLISHED;
diff -Nru a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
--- a/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/ip6_fib.c 2004-11-10 16:45:07 +09:00
@@ -451,8 +451,8 @@

if (iter->rt6i_dev =3D=3D rt->rt6i_dev &&
    iter->rt6i_idev =3D=3D rt->rt6i_idev &= ;&
-     ipv6_addr_cmp(&iter->rt6i_gateway,
-    &rt->rt6i_gateway) =3D=3D 0) {
+     ipv6_addr_equal(&iter->rt6i_gateway,
= +     &rt->rt6i_gateway)) {
if (!(iter->rt6i_flags&RTF_EXPIRES))
return -EEXIST;
iter->rt6i_expires =3D rt->rt6i_expires;
diff -Nru a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
--- a/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/ip6_flowlabel.c 2004-11-10 16:45:07 +09:00
@@ -500,7 +500,7 @@
goto release;

err =3D -EINVAL;
- if (ipv6_addr_cmp(&fl1->dst, &fl->dst) || + if (!ipv6_addr_equal(&fl1->dst, &fl->dst) ||=
    ipv6_opt_cmp(fl1->opt, fl->opt))
goto release;

diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
--- a/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/ip6_output.c 2004-11-10 16:45:07 +09:00
@@ -768,9 +768,9 @@
 */

if (((rt->rt6i_dst.plen !=3D 128 ||
-       ipv6_addr_cmp(&fl->fl6_dst, &= rt->rt6i_dst.addr))
+       !ipv6_addr_equal(&fl->fl6_dst, &a= mp;rt->rt6i_dst.addr))
     && (np->daddr_cache =3D=3D NUL= L ||
-  ipv6_addr_cmp(&fl->fl6_dst, np->daddr_cach= e)))
+  !ipv6_addr_equal(&fl->fl6_dst, np->daddr_c= ache)))
    || (fl->oif && fl->oif !=3D (*dst= )->dev->ifindex)) {
*dst =3D NULL;
} else
diff -Nru a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
--- a/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/ip6_tunnel.c 2004-11-10 16:45:07 +09:00
@@ -133,8 +133,8 @@
struct ip6_tnl *t;

for (t =3D tnls_r_l[h0 ^ h1]; t; t =3D t->next) {
- if (!ipv6_addr_cmp(local, &t->parms.laddr) &&
= -     !ipv6_addr_cmp(remote, &t->parms.raddr) &am= p;&
+ if (ipv6_addr_equal(local, &t->parms.laddr) && +     ipv6_addr_equal(remote, &t->parms.raddr) &a= mp;&
    (t->dev->flags & IFF_UP))
return t;
}
@@ -284,8 +284,8 @@
return -EINVAL;

for (t =3D *ip6ip6_bucket(p); t; t =3D t->next) {
- if (!ipv6_addr_cmp(local, &t->parms.laddr) &&
= -     !ipv6_addr_cmp(remote, &t->parms.raddr)) {<= br> + if (ipv6_addr_equal(local, &t->parms.laddr) && +     ipv6_addr_equal(remote, &t->parms.raddr)) {=
*pt =3D t;
return (create ? -EEXIST : 0);
}
@@ -602,7 +602,7 @@
static inline int
ip6ip6_tnl_addr_conflict(struct ip6_tnl *t, struct ipv6hdr *hdr)
{
- return !ipv6_addr_cmp(&t->parms.raddr, &hdr->saddr);<= br> + return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr);=
}

/**
diff -Nru a/net/ipv6/mcast.c b/net/ipv6/mcast.c
--- a/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/mcast.c 2004-11-10 16:45:07 +09:00
@@ -247,7 +247,7 @@
write_lock_bh(&ipv6_sk_mc_lock);
for (lnk =3D &np->ipv6_mc_list; (mc_lst =3D *lnk) !=3DNULL ;= lnk =3D &mc_lst->next) {
if ((ifindex =3D=3D 0 || mc_lst->ifindex =3D=3D ifindex) &= ;&
-     ipv6_addr_cmp(&mc_lst->addr, addr) =3D=3D 0= ) {
+     ipv6_addr_equal(&mc_lst->addr, addr)) {
= struct net_device *dev;

*lnk =3D mc_lst->next;
@@ -369,7 +369,7 @@
for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) {
if (pgsr->gsr_interface && pmc->ifindex !=3D pgsr-= >gsr_interface)
continue;
- if (ipv6_addr_cmp(&pmc->addr, group) =3D=3D 0)
+ if (ipv6_addr_equal(&pmc->addr, group))
break;
}
if (!pmc) /* must have a prior join */
@@ -485,7 +485,7 @@
for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) {
if (pmc->ifindex !=3D gsf->gf_interface)
continue;
- if (ipv6_addr_cmp(&pmc->addr, group) =3D=3D 0)
+ if (ipv6_addr_equal(&pmc->addr, group))
break;
}
if (!pmc) /* must have a prior join */
@@ -556,7 +556,7 @@
for (pmc=3Dinet6->ipv6_mc_list; pmc; pmc=3Dpmc->next) {
if (pmc->ifindex !=3D gsf->gf_interface)
continue;
- if (ipv6_addr_cmp(group, &pmc->addr) =3D=3D 0)
+ if (ipv6_addr_equal(group, &pmc->addr))
break;
}
if (!pmc) /* must have a prior join */
@@ -603,7 +603,7 @@

read_lock(&ipv6_sk_mc_lock);
for (mc =3D np->ipv6_mc_list; mc; mc =3D mc->next) {
- if (ipv6_addr_cmp(&mc->addr, mc_addr) =3D=3D 0)
+ if (ipv6_addr_equal(&mc->addr, mc_addr))
break;
}
if (!mc) {
@@ -617,7 +617,7 @@
int i;

for (i=3D0; i<psl->sl_count; i++) {
- if (ipv6_addr_cmp(&psl->sl_addr[i], src_addr) =3D=3D 0= )
+ if (ipv6_addr_equal(&psl->sl_addr[i], src_addr))
break;
}
if (mc->sfmode =3D=3D MCAST_INCLUDE && i >=3D psl-= >sl_count)
@@ -740,7 +740,7 @@
write_lock_bh(&idev->mc_lock);
pmc_prev =3D NULL;
for (pmc=3Didev->mc_tomb; pmc; pmc=3Dpmc->next) {
- if (ipv6_addr_cmp(&pmc->mca_addr, pmca) =3D=3D 0)
+ if (ipv6_addr_equal(&pmc->mca_addr, pmca))
break;
pmc_prev =3D pmc;
}
@@ -816,7 +816,7 @@
}

for (mc =3D idev->mc_list; mc; mc =3D mc->next) {
- if (ipv6_addr_cmp(&mc->mca_addr, addr) =3D=3D 0) {
+ if (ipv6_addr_equal(&mc->mca_addr, addr)) {
mc->mca_users++;
write_unlock_bh(&idev->lock);
ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0,<= br> @@ -878,7 +878,7 @@

write_lock_bh(&idev->lock);
for (map =3D &idev->mc_list; (ma=3D*map) !=3D NULL; map =3D = &ma->next) {
- if (ipv6_addr_cmp(&ma->mca_addr, addr) =3D=3D 0) {
+ if (ipv6_addr_equal(&ma->mca_addr, addr)) {
if (--ma->mca_users =3D=3D 0) {
*map =3D ma->next;
write_unlock_bh(&idev->lock);
@@ -953,7 +953,7 @@
if (idev) {
read_lock_bh(&idev->lock);
for (mc =3D idev->mc_list; mc; mc=3Dmc->next) {
- if (ipv6_addr_cmp(&mc->mca_addr, group) =3D=3D 0)
+ if (ipv6_addr_equal(&mc->mca_addr, group))
break;
}
if (mc) {
@@ -962,8 +962,7 @@

spin_lock_bh(&mc->mca_lock);
for (psf=3Dmc->mca_sources;psf;psf=3Dpsf->sf_next) {=
- if (ipv6_addr_cmp(&psf->sf_addr,
-     src_addr) =3D=3D 0)
+ if (ipv6_addr_equal(&psf->sf_addr, src_addr)) break;
}
if (psf)
@@ -1040,7 +1039,7 @@
if (scount =3D=3D nsrcs)
break;
for (i=3D0; i<nsrcs; i++)
- if (ipv6_addr_cmp(&srcs[i], &psf->sf_addr) =3D=3D = 0) {
+ if (ipv6_addr_equal(&srcs[i], &psf->sf_addr)) { psf->sf_gsresp =3D 1;
scount++;
break;
@@ -1135,7 +1134,7 @@
} else {
for (ma =3D idev->mc_list; ma; ma=3Dma->next) {
if (group_type !=3D IPV6_ADDR_ANY &&
-     ipv6_addr_cmp(group, &ma->mca_addr) !=3D= 0)
+     !ipv6_addr_equal(group, &ma->mca_addr))<= br> continue;
spin_lock_bh(&ma->mca_lock);
if (ma->mca_flags & MAF_TIMER_RUNNING) {
@@ -1200,7 +1199,7 @@

read_lock_bh(&idev->lock);
for (ma =3D idev->mc_list; ma; ma=3Dma->next) {
- if (ipv6_addr_cmp(&ma->mca_addr, addrp) =3D=3D 0) {
+ if (ipv6_addr_equal(&ma->mca_addr, addrp)) {
spin_lock(&ma->mca_lock);
if (del_timer(&ma->mca_timer))
atomic_dec(&ma->mca_refcnt);
@@ -1695,7 +1694,7 @@

psf_prev =3D NULL;
for (psf=3Dpmc->mca_sources; psf; psf=3Dpsf->sf_next) {
- if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) =3D=3D 0)
+ if (ipv6_addr_equal(&psf->sf_addr, psfsrc))
break;
psf_prev =3D psf;
}
@@ -1735,7 +1734,7 @@
return -ENODEV;
read_lock_bh(&idev->lock);
for (pmc=3Didev->mc_list; pmc; pmc=3Dpmc->next) {
- if (ipv6_addr_cmp(pmca, &pmc->mca_addr) =3D=3D 0)
+ if (ipv6_addr_equal(pmca, &pmc->mca_addr))
break;
}
if (!pmc) {
@@ -1790,7 +1789,7 @@

psf_prev =3D NULL;
for (psf=3Dpmc->mca_sources; psf; psf=3Dpsf->sf_next) {
- if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) =3D=3D 0)
+ if (ipv6_addr_equal(&psf->sf_addr, psfsrc))
break;
psf_prev =3D psf;
}
@@ -1859,7 +1858,7 @@
return -ENODEV;
read_lock_bh(&idev->lock);
for (pmc=3Didev->mc_list; pmc; pmc=3Dpmc->next) {
- if (ipv6_addr_cmp(pmca, &pmc->mca_addr) =3D=3D 0)
+ if (ipv6_addr_equal(pmca, &pmc->mca_addr))
break;
}
if (!pmc) {
diff -Nru a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
--- a/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/ndisc.c 2004-11-10 16:45:07 +09:00
@@ -1219,7 +1219,7 @@
return;
}

- if (ipv6_addr_cmp(dest, target) =3D=3D 0) {
+ if (ipv6_addr_equal(dest, target)) {
on_link =3D 1;
} else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) { ND_PRINTK2(KERN_WARNING
diff -Nru a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_que= ue.c
--- a/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/netfilter/ip6_queue.c 2004-11-10 16:45:07 +09:00
@@ -376,8 +376,8 @@
 */
if (e->info->hook =3D=3D NF_IP_LOCAL_OUT) {
struct ipv6hdr *iph =3D e->skb->nh.ipv6h;
- if (ipv6_addr_cmp(&iph->daddr, &e->rt_info.daddr) = ||
-     ipv6_addr_cmp(&iph->saddr, &e->rt_in= fo.saddr))
+ if (!ipv6_addr_equal(&iph->daddr, &e->rt_info.dadd= r) ||
+     !ipv6_addr_equal(&iph->saddr, &e->rt= _info.saddr))
return ip6_route_me_harder(e->skb);
}
return 0;
diff -Nru a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c=
--- a/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/netfilter/ip6t_rt.c 2004-11-10 16:45:07 +09:00
@@ -209,7 +209,7 @@

BUG_ON(ap =3D=3D NULL);

- if (!ipv6_addr_cmp(ap, &rtinfo->addrs[i])) {
+ if (ipv6_addr_equal(ap, &rtinfo->addrs[i])) {
DEBUGP("i=3D%d temp=3D%d;\n",i,temp);
i++;
}
@@ -236,7 +236,7 @@
&_addr);
BUG_ON(ap =3D=3D NULL);

- if (ipv6_addr_cmp(ap, &rtinfo->addrs[temp]))
+ if (!ipv6_addr_equal(ap, &rtinfo->addrs[temp]))
= break;
}
DEBUGP("temp=3D%d #%d\n", temp, rtinfo->addrnr);=
diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c
--- a/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/raw.c 2004-11-10 16:45:07 +09:00
@@ -90,11 +90,11 @@
struct ipv6_pinfo *np =3D inet6_sk(sk);

if (!ipv6_addr_any(&np->daddr) &&
-     ipv6_addr_cmp(&np->daddr, rmt_addr))
= +     !ipv6_addr_equal(&np->daddr, rmt_addr))<= br> continue;

if (!ipv6_addr_any(&np->rcv_saddr)) {
- if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr))
+ if (ipv6_addr_equal(&np->rcv_saddr, loc_addr))
goto found;
if (is_multicast &&
    inet6_mc_check(sk, loc_addr, rmt_addr))
@@ -668,7 +668,7 @@
 * sk->sk_dst_cache.
 */
if (sk->sk_state =3D=3D TCP_ESTABLISHED &&
-     !ipv6_addr_cmp(daddr, &np->daddr))
+     ipv6_addr_equal(daddr, &np->daddr))
daddr =3D &np->daddr;

if (addr_len >=3D sizeof(struct sockaddr_in6) &&
@@ -775,7 +775,7 @@
}
done:
ip6_dst_store(sk, dst,
-       !ipv6_addr_cmp(&fl.fl6_dst, &np->= ;daddr) ?
+       ipv6_addr_equal(&fl.fl6_dst, &np-&g= t;daddr) ?
      &np->daddr : NULL);
if (err > 0)
err =3D np->recverr ? net_xmit_errno(err) : 0;
diff -Nru a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
--- a/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00

+++ b/net/ipv6/reassembly.c 2004-11-10 16:45:07 +09:00
@@ -342,8 +342,8 @@
#ifdef CONFIG_SMP
for (fq =3D ip6_frag_hash[hash]; fq; fq =3D fq->next) {
if (fq->id =3D=3D fq_in->id &&
-     !ipv6_addr_cmp(&fq_in->saddr, &fq->s= addr) &&
-     !ipv6_addr_cmp(&fq_in->daddr, &fq->d= addr)) {
+     ipv6_addr_equal(&fq_in->saddr, &fq->= saddr) &&
+     ipv6_addr_equal(&fq_in->daddr, &fq->= daddr)) {
atomic_inc(&fq->refcnt);
write_unlock(&ip6_frag_lock);
fq_in->last_in |=3D COMPLETE;
@@ -406,8 +406,8 @@
read_lock(&ip6_frag_lock);
for(fq =3D ip6_frag_hash[hash]; fq; fq =3D fq->next) {
if (fq->id =3D=3D id &&
-     !ipv6_addr_cmp(src, &fq->saddr) &&<= br> -     !ipv6_addr_cmp(dst, &fq->daddr)) {
+     ipv6_addr_equal(src, &fq->saddr) &&=
+     ipv6_addr_equal(dst, &fq->daddr)) {
atomic_inc(&fq->refcnt);
read_unlock(&ip6_frag_lock);
return fq;
diff -Nru a/net/ipv6/route.c b/net/ipv6/route.c
--- a/net/ipv6/route.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/route.c 2004-11-10 16:45:07 +09:00
@@ -1006,7 +1006,7 @@
     rt->rt6i_dev->ifindex !=3D rtmsg-&g= t;rtmsg_ifindex))
continue;
if (rtmsg->rtmsg_flags&RTF_GATEWAY &&
-     ipv6_addr_cmp(&rtmsg->rtmsg_gateway, &am= p;rt->rt6i_gateway))
+     !ipv6_addr_equal(&rtmsg->rtmsg_gateway, = &rt->rt6i_gateway))
continue;
if (rtmsg->rtmsg_metric &&
    rtmsg->rtmsg_metric !=3D rt->rt6i_metric)=
@@ -1057,13 +1057,13 @@
 * is a bit fuzzy and one might need to check all default  * routers.
 */
- if (ipv6_addr_cmp(saddr, &rt->rt6i_gateway)) {
+ if (!ipv6_addr_equal(saddr, &rt->rt6i_gateway)) {
if (rt->rt6i_flags & RTF_DEFAULT) {
struct rt6_info *rt1;

read_lock(&rt6_lock);
for (rt1 =3D ip6_routing_table.leaf; rt1; rt1 =3D rt1->u.n= ext) {
- if (!ipv6_addr_cmp(saddr, &rt1->rt6i_gateway)) { + if (ipv6_addr_equal(saddr, &rt1->rt6i_gateway)) { dst_hold(&rt1->u.dst);
dst_release(&rt->u.dst);
read_unlock(&rt6_lock);
@@ -1262,7 +1262,7 @@
write_lock_bh(&rt6_lock);
for (rt =3D fn->leaf; rt; rt=3Drt->u.next) {
if (dev =3D=3D rt->rt6i_dev &&
-     ipv6_addr_cmp(&rt->rt6i_gateway, addr) =3D=3D= 0)
+     ipv6_addr_equal(&rt->rt6i_gateway, addr)) break;
}
if (rt)
diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
--- a/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/tcp_ipv6.c 2004-11-10 16:45:07 +09:00
@@ -262,7 +262,7 @@

score =3D 1;
if (!ipv6_addr_any(&np->rcv_saddr)) {
- if (ipv6_addr_cmp(&np->rcv_saddr, daddr))
+ if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
continue;
score++;
}
@@ -321,8 +321,8 @@

if(*((__u32 *)&(tw->tw_dport)) =3D=3D ports &&= ;
   sk->sk_family =3D=3D PF_INET6) {
- if(!ipv6_addr_cmp(&tw->tw_v6_daddr, saddr) &&= ;
-    !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, dadd= r) &&
+ if(ipv6_addr_equal(&tw->tw_v6_daddr, saddr) &&am= p;
+    ipv6_addr_equal(&tw->tw_v6_rcv_saddr, dad= dr) &&
   (!sk->sk_bound_dev_if || sk->sk_bound_dev_= if =3D=3D dif))
goto hit;
}
@@ -406,8 +406,8 @@
     prev =3D &req->dl_next) {
if (req->rmt_port =3D=3D rport &&
    req->class->family =3D=3D AF_INET6 &&= ;
-     !ipv6_addr_cmp(&req->af.v6_req.rmt_addr, ra= ddr) &&
-     !ipv6_addr_cmp(&req->af.v6_req.loc_addr, la= ddr) &&
+     ipv6_addr_equal(&req->af.v6_req.rmt_addr, r= addr) &&
+     ipv6_addr_equal(&req->af.v6_req.loc_addr, l= addr) &&
    (!req->af.v6_req.iif || req->af.v6_req.iif =3D= =3D iif)) {
BUG_TRAP(req->sk =3D=3D NULL);
*prevp =3D prev;
@@ -463,8 +463,8 @@

if(*((__u32 *)&(tw->tw_dport)) =3D=3D ports &&= ;
   sk2->sk_family =3D=3D PF_INET6 &&=
-    !ipv6_addr_cmp(&tw->tw_v6_daddr, saddr) &a= mp;&
-    !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr) = &&
+    ipv6_addr_equal(&tw->tw_v6_daddr, saddr) &= amp;&
+    ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr)= &&
   sk2->sk_bound_dev_if =3D=3D sk->sk_bound_dev_= if) {
struct tcp_opt *tp =3D tcp_sk(sk);

@@ -610,7 +610,7 @@
}

if (tp->ts_recent_stamp &&
-     ipv6_addr_cmp(&np->daddr, &usin->sin6_a= ddr)) {
+     !ipv6_addr_equal(&np->daddr, &usin->sin= 6_addr)) {
tp->ts_recent =3D 0;
tp->ts_recent_stamp =3D 0;
tp->write_seq =3D 0;
diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c
--- a/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/udp.c 2004-11-10 16:45:07 +09:00
@@ -171,12 +171,12 @@
score++;
}
if (!ipv6_addr_any(&np->rcv_saddr)) {
- if (ipv6_addr_cmp(&np->rcv_saddr, daddr))
+ if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
continue;
score++;
}
if (!ipv6_addr_any(&np->daddr)) {
- if (ipv6_addr_cmp(&np->daddr, saddr))
+ if (!ipv6_addr_equal(&np->daddr, saddr))
continue;
score++;
}
@@ -395,14 +395,14 @@
continue;
}
if (!ipv6_addr_any(&np->daddr) &&
-     ipv6_addr_cmp(&np->daddr, rmt_addr))
= +     !ipv6_addr_equal(&np->daddr, rmt_addr))<= br> continue;

if (s->sk_bound_dev_if && s->sk_bound_dev_if !=3D= dif)
continue;

if (!ipv6_addr_any(&np->rcv_saddr)) {
- if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr))
+ if (ipv6_addr_equal(&np->rcv_saddr, loc_addr))
return s;
continue;
}
@@ -732,7 +732,7 @@
 * sk->sk_dst_cache.
 */
if (sk->sk_state =3D=3D TCP_ESTABLISHED &&
-     !ipv6_addr_cmp(daddr, &np->daddr))
+     ipv6_addr_equal(daddr, &np->daddr))
daddr =3D &np->daddr;

if (addr_len >=3D sizeof(struct sockaddr_in6) &&
@@ -840,7 +840,7 @@

if (dst)
ip6_dst_store(sk, dst,
-       !ipv6_addr_cmp(&fl->fl6_dst, &= ;np->daddr) ?
+       ipv6_addr_equal(&fl->fl6_dst, &am= p;np->daddr) ?
      &np->daddr : NULL);
if (err > 0)
err =3D np->recverr ? net_xmit_errno(err) : 0;
diff -Nru a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
--- a/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/xfrm6_policy.c 2004-11-10 16:45:07 +09:00
@@ -68,8 +68,8 @@
ipv6_addr_prefix(&fl_src_prefix,
 &fl->fl6_src,
 xdst->u.rt6.rt6i_src.plen);
- if (!ipv6_addr_cmp(&xdst->u.rt6.rt6i_dst.addr, &fl_ds= t_prefix) &&
-     !ipv6_addr_cmp(&xdst->u.rt6.rt6i_src.addr, = &fl_src_prefix) &&
+ if (ipv6_addr_equal(&xdst->u.rt6.rt6i_dst.addr, &fl_d= st_prefix) &&
+     ipv6_addr_equal(&xdst->u.rt6.rt6i_src.addr,= &fl_src_prefix) &&
    __xfrm6_bundle_ok(xdst, fl)) {
dst_clone(dst);
break;
@@ -123,7 +123,7 @@
trailer_len +=3D xfrm[i]->props.trailer_len;
}

- if (ipv6_addr_cmp(remote, &fl->fl6_dst)) {
+ if (!ipv6_addr_equal(remote, &fl->fl6_dst)) {
struct flowi fl_tunnel;

memset(&fl_tunnel, 0, sizeof(fl_tunnel));
diff -Nru a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c
--- a/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00
+++ b/net/ipv6/xfrm6_state.c 2004-11-10 16:45:07 +09:00
@@ -55,7 +55,7 @@
list_for_each_entry(x, xfrm6_state_afinfo.state_byspi+h, byspi) { if (x->props.family =3D=3D AF_INET6 &&
    spi =3D=3D x->id.spi &&
-     !ipv6_addr_cmp((struct in6_addr *)daddr, (struct i= n6_addr *)x->id.daddr.a6) &&
+     ipv6_addr_equal((struct in6_addr *)daddr, (struct = in6_addr *)x->id.daddr.a6) &&
    proto =3D=3D x->id.proto) {
xfrm_state_hold(x);
return x;
@@ -76,10 +76,10 @@

list_for_each_entry(x, xfrm6_state_afinfo.state_bydst+h, bydst) { if (x->props.family =3D=3D AF_INET6 &&
-     !ipv6_addr_cmp((struct in6_addr *)daddr, (struct i= n6_addr *)x->id.daddr.a6) &&
+     ipv6_addr_equal((struct in6_addr *)daddr, (struct = in6_addr *)x->id.daddr.a6) &&
    mode =3D=3D x->props.mode &&
    proto =3D=3D x->id.proto &&
-     !ipv6_addr_cmp((struct in6_addr *)saddr, (struct i= n6_addr *)x->props.saddr.a6) &&
+     ipv6_addr_equal((struct in6_addr *)saddr, (struct = in6_addr *)x->props.saddr.a6) &&
    reqid =3D=3D x->props.reqid &&
    x->km.state =3D=3D XFRM_STATE_ACQ &&     !x->id.spi) {
diff -Nru a/net/sctp/ipv6.c b/net/sctp/ipv6.c
--- a/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00
+++ b/net/sctp/ipv6.c 2004-11-10 16:45:07 +09:00
@@ -461,7 +461,7 @@
}
return 0;
}
- if (ipv6_addr_cmp(&addr1->v6.sin6_addr, &addr2->v6.si= n6_addr))
+ if (!ipv6_addr_equal(&addr1->v6.sin6_addr, &addr2->v6= .sin6_addr))
return 0;
/* If this is a linklocal address, compare the scope_id. */
if (ipv6_addr_type(&addr1->v6.sin6_addr) & IPV6_ADDR_LIN= KLOCAL) {

--
Hideaki YOSHIFUJI @ USAGI Project <yoshfuji@linux-ipv6.org>
GPG FP: 9022 65EB 1ECF 3AD1 0BDF  80D8 4807 F894 E062 0EEA


= --1__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676-- --0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: image/gif; name="graycol.gif" Content-Disposition: inline; filename="graycol.gif" Content-ID: <20__=07BBE5DBDFF056768f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhEAAQAKECAMzMzAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIXlI+py+0PopwxUbpu ZRfKZ2zgSJbmSRYAIf4fT3B0aW1pemVkIGJ5IFVsZWFkIFNtYXJ0U2F2ZXIhAAA7 --0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: image/gif; name="pic31705.gif" Content-Disposition: inline; filename="pic31705.gif" Content-ID: <30__=07BBE5DBDFF056768f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhWABDALP/AAAAAK04Qf79/o+Gm7WuwlNObwoJFCsoSMDAwGFsmIuezf///wAAAAAAAAAA AAAAACH5BAEAAAgALAAAAABYAEMAQAT/EMlJq704682770RiFMRinqggEUNSHIchG0BCfHhOjAuh EDeUqTASLCbBhQrhG7xis2j0lssNDopE4jfIJhDaggI8YB1sZeZgLVA9YVCpnGagVjV171aRVrYR RghXcAGFhoUETwYxcXNyADJ3GlcSKGAwLwllVC1vjIUHBWsFilKQdI8GA5IcpApeJQt8L09lmgkH LZikoU5wjqcyAMMFrJIDPAKvCFletKSev1HBw8KrxtjZ2tvc3d5VyKtCKW3jfz4uMKmq3xu4N0nK BVoJQmx2LGVOmrqNjjJf2hHAQo/eDwJGTKhQMcgQEEAnEjFS98+RnW3smGkZU6ncCWav/4wYOnAI TihRL/4FEwbp28BXMMcoscQCVxlepL4IGDSCyJyVQOu0o7CjmLN50OZlqWmyFy5/6yBBuji0AxFR M00oQAqNIstqI6qKHUsWRAEAvagsmfUEAImyxgbmUpJk3IklNUtJOUAVLoUr1+wqDGTE4zk+T6FG uQb3SizBCwatiiUgCBN8vrz+zFjVyQ8FWkOlg4NQiZMB5QS8QO3mpOaKnL0Z2EKvNMSILEThKhCg zMKPVxYJh23qm9KNW7pArPynMqZDiErsTMqI+LRi3QAgkFUbXpuFKhSYZALd0O5RKa2z9EYKBbpb qxIKsjUPRgD7I2XYV6wyrOw92ykExP8NW4URhknC5dKGE4v4NENQj2jXjmfNgOZDaXb5glRmXQ33 YEWQYNcZFnrYcIQLNzyTFDQNkXIff0ExVlY4srziQk43inZgL4rwxxINMvpFFAz1KOODHiu+4aEw NEjFl5B3JIKWKF3k6I9bfUGp5ZZcdunll5IA4cuHvQQJ5gcsoCWOOUwgltIwAKRxJgbIkJAQZEq0 2YliZnpZZ4BH3CnYOXldOUOfQoYDqF1LFHbXCrO8xmRsfoXDXJ6ChjCAH3QlhJcT6VWE6FCkfCco CgrMFsROrIEX3o2whVjWDjoJccN3LdggSGXLCdLEgHr1lyU3O3QxhgohNKXJCWv8JQr/PDdaqd6w 2rj1inLiGeiCJoDspAoQlYE6QWLSECehcWIYxIQES6zhbn1iImTHEQyqJ4eIxJJoUBc+3CbBuwZE V5cJPPkIjFDdeEabQbd6WgICTxiiz0f5dBKquXF6k4senwEhYGnKEFJeGrxUZy8dB8gmAXI/sPvH ESfCwVt5hTgYiqQqtdRNHQIU1PJ33ZqmzgE90OwLaoJcnMop1WiMmgkPHQRIrwgFuNV90A3doNKT mrKIN07AnGcI9BQjhCBN4RfA1qIZnMqorJCogKfGQnxSCDilTVIA0yl5ciTovgLuBDKFUDE9aQcw 9SA+rjSNf9/M1gxrj6VwDTS0IUSElMzBfsj0NFXR2kwsV1A5IF1grLgLL/r1R40BZEnuBWgmQEyb jqRwSAt6bqMCOFkvKFN2GPPkUzIm/SCF8z8pVzpbjVnMsy0vOr1hw3SaSRUhpY09v0z0J1FnwzPl fmh+xl4WtR0zGu24I4KbMQm3lnVu2oNWxI9W/lcyzA+mCKF4DBikxb/+UWtOGRiFP8qEwAayIgIA Ow== --0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676 Content-type: image/gif; name="ecblank.gif" Content-Disposition: inline; filename="ecblank.gif" Content-ID: <40__=07BBE5DBDFF056768f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 R0lGODlhEAABAIAAAAAAAP///yH5BAEAAAEALAAAAAAQAAEAAAIEjI8ZBQA7 --0__=07BBE5DBDFF056768f9e8a93df938690918c07BBE5DBDFF05676-- From akpm@osdl.org Wed Nov 10 11:20:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 11:20:19 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAJK8d3000901 for ; Wed, 10 Nov 2004 11:20:11 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAAJJf916667; Wed, 10 Nov 2004 11:19:41 -0800 Date: Wed, 10 Nov 2004 11:19:33 -0800 From: Andrew Morton To: Jesse Brandeburg Cc: jesse.brandeburg@intel.com, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] ixgb: fix ixgb_intr looping checks Message-Id: <20041110111933.0021cf37.akpm@osdl.org> In-Reply-To: References: <20041108151048.4bf605c1.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iAAJK8d3000901 X-archive-position: 11695 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 694 Lines: 17 Jesse Brandeburg wrote: > > On Mon, 8 Nov 2004, Andrew Morton wrote: > > > This patch undoes a change that we believe will impact performance > > adversely, > > > by creating possibly too long a delay between servicing completions. > > > > Maybe. But now take a look at how much additional pointless work will be > > done in the common case. For instance, every tx completion will incur a > > call to ixgb_clean_rx_irq(), which then calls ixgb_alloc_rx_buffers(). > > Is your common case transmits only? hm, good question. Usually not, I guess. IIRC TCP normally runs with 2Tx:1Rx. NFS-over-UDP will send and receive a lot of back-to-back frames. From randolph@tausq.org Wed Nov 10 11:45:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 11:45:41 -0800 (PST) Received: from pippin.tausq.org (gandalf.tausq.org [64.81.244.94]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAJjZOT001912 for ; Wed, 10 Nov 2004 11:45:36 -0800 Received: by pippin.tausq.org (Postfix, from userid 1000) id 2A2C9CD8EA; Wed, 10 Nov 2004 11:44:01 -0800 (PST) Date: Wed, 10 Nov 2004 11:44:01 -0800 From: Randolph Chung To: torvalds@osdl.org Cc: netdev@oss.sgi.com Subject: [patch] gcc-4.0 fix for acenic Message-ID: <20041110194401.GL15714@tausq.org> Reply-To: Randolph Chung Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-GPG: for GPG key, see http://www.tausq.org/gpg.txt User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 11696 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: randolph@tausq.org Precedence: bulk X-list: netdev Content-Length: 1291 Lines: 33 Small fix to compile acenic with gcc-4.0. gcc no longer accepts static function prototypes inside a function definition. This is ugly anyway... Signed-off-by: Randolph Chung Acked-by: Jes Sorensen Index: drivers/net/acenic.c =================================================================== RCS file: /var/cvs/linux-2.6/drivers/net/acenic.c,v retrieving revision 1.12 diff -u -p -r1.12 acenic.c --- linux/drivers/net/acenic.c 21 Oct 2004 18:59:05 -0000 1.12 +++ linux/drivers/net/acenic.c 10 Nov 2004 19:33:43 -0000 @@ -450,6 +450,7 @@ static char version[] __initdata = static int ace_get_settings(struct net_device *, struct ethtool_cmd *); static int ace_set_settings(struct net_device *, struct ethtool_cmd *); static void ace_get_drvinfo(struct net_device *, struct ethtool_drvinfo *); +static void ace_watchdog(struct net_device *dev); static struct ethtool_ops ace_ethtool_ops = { .get_settings = ace_get_settings, @@ -485,7 +486,6 @@ static int __devinit acenic_probe_one(st dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid; #endif if (1) { - static void ace_watchdog(struct net_device *dev); dev->tx_timeout = &ace_watchdog; dev->watchdog_timeo = 5*HZ; } -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/ From Brian.Haley@hp.com Wed Nov 10 11:47:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 11:47:37 -0800 (PST) Received: from palrel13.hp.com (palrel13.hp.com [156.153.255.238]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAJlVe9002266 for ; Wed, 10 Nov 2004 11:47:31 -0800 Received: from mailrelay01.cac.cpqcorp.net (mailrelay01.cac.cpqcorp.net [16.47.132.152]) by palrel13.hp.com (Postfix) with ESMTP id E55671C11EA2; Wed, 10 Nov 2004 11:47:13 -0800 (PST) Received: from kitche.zk3.dec.com (kitche2.zk3.dec.com [16.140.160.162]) by mailrelay01.cac.cpqcorp.net (Postfix) with ESMTP id 5C80252C; Wed, 10 Nov 2004 11:47:13 -0800 (PST) Received: from [127.0.0.1] by kitche.zk3.dec.com (8.9.3/1.1.27.5/27Oct00-1235PM) id OAA0001459192; Wed, 10 Nov 2004 14:47:12 -0500 (EST) Message-ID: <4192701A.3090908@hp.com> Date: Wed, 10 Nov 2004 14:46:34 -0500 From: Brian Haley Organization: HP Linux and Open Source Lab User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Mark Borst Cc: netdev@oss.sgi.com Subject: Re: node-local multicast issues References: <1100096251.22964.7.camel@mn-2> In-Reply-To: <1100096251.22964.7.camel@mn-2> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11697 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Brian.Haley@hp.com Precedence: bulk X-list: netdev Content-Length: 277 Lines: 13 Mark Borst wrote: > On another note: 'ping6 ff02::1' gives "connect: Invalid argument" on > linux. You've got to use -I with that, maybe ping6 could give a hint. > The only implementation that gives me replies is Solaris. My trusty Tru64 UNIX box works as well :) -Brian From sebastian.ionita@focomunicatii.ro Wed Nov 10 12:12:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 12:12:19 -0800 (PST) Received: from focomunicatii.ro (ns.focomunicatii.ro [212.146.75.6]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAAKCBEK003359 for ; Wed, 10 Nov 2004 12:12:12 -0800 Received: (qmail 18342 invoked by uid 89); 10 Nov 2004 20:10:10 -0000 Message-ID: <20041110201010.18341.qmail@focomunicatii.ro> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> <20041109232510.GA5582@electric-eye.fr.zoreil.com> In-Reply-To: <20041109232510.GA5582@electric-eye.fr.zoreil.com> From: sebastian.ionita@focomunicatii.ro To: Francois Romieu Cc: seby@focomunicatii.ro, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Date: Wed, 10 Nov 2004 22:10:10 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="utf-8" Content-Transfer-Encoding: 7bit X-archive-position: 11698 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sebastian.ionita@focomunicatii.ro Precedence: bulk X-list: netdev Content-Length: 1014 Lines: 35 Francois Romieu writes: > Francois Romieu : >> seby@focomunicatii.ro : >> [...] >> > I just bouth a zyxel GN650T network card .. and it sems that vlan's don't >> > work on this card .. anybody had this problems with this card .. >> >> Patch below against 2.6.10-rc1-bk15 + Jeff's netdev should convert the driver >> to the in-kernel vlan API. > > Cr*p, the driver had not been backported to 2.4.x. Ok, instant patch (155 ko) > against 2.4.28-rc2 available at: > http://www.fr.zoreil.com/people/francois/misc/20041110-2.4.28-rc2-via-velocity-backport.patch The kernel compiles but I have 1 unresolved simbole in the via-velocity modul depmod: *** Unresolved symbols in /lib/modules/2.4.28-rc2/kernel/drivers/net/via-velocity.o depmod: crc_ccitt_R3771b461 Seby.. > > -- > Ueimor ____________________________________________________________ SC. FO Comunicatii SRL. Sebastian Ionita Administrator Sistem mobil: 0724 212408 tel fix: 0264 450456 From Brian.Haley@hp.com Wed Nov 10 13:19:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 13:20:01 -0800 (PST) Received: from palrel13.hp.com (atorelbas04.hp.com [156.153.255.238]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAALJm7w009026 for ; Wed, 10 Nov 2004 13:19:50 -0800 Received: from mailrelay01.cac.cpqcorp.net (mailrelay01.cac.cpqcorp.net [16.47.132.152]) by palrel13.hp.com (Postfix) with ESMTP id 887981C119C3; Wed, 10 Nov 2004 13:19:30 -0800 (PST) Received: from kitche.zk3.dec.com (kitche1.zk3.dec.com [16.140.160.161]) by mailrelay01.cac.cpqcorp.net (Postfix) with ESMTP id CC75B7B2; Wed, 10 Nov 2004 13:19:29 -0800 (PST) Received: from [127.0.0.1] by kitche.zk3.dec.com (8.9.3/1.1.27.5/27Oct00-1235PM) id QAA0000816890; Wed, 10 Nov 2004 16:19:27 -0500 (EST) Message-ID: <419285B8.4070703@hp.com> Date: Wed, 10 Nov 2004 16:18:48 -0500 From: Brian Haley Organization: HP Linux and Open Source Lab User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Krishna Kumar Cc: =?ISO-2022-JP?B?WU9TSElGVUpJIEhpZGVha2kgLyAbJEI1SEYjMVFMQBsoQg==?= , davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [BK PATCH] Misc IPv6 Updates References: In-Reply-To: Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11699 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Brian.Haley@hp.com Precedence: bulk X-list: netdev Content-Length: 1176 Lines: 41 Krishna Kumar wrote: > (sorry if my mailer mangles the code) > > In : > > +static inline int ipv6_addr_equal(const struct in6_addr *a1, > + const struct in6_addr *a2) > +{ > + return (a1->s6_addr32[0] == a2->s6_addr32[0] && > + a1->s6_addr32[1] == a2->s6_addr32[1] && > + a1->s6_addr32[2] == a2->s6_addr32[2] && > + a1->s6_addr32[3] == a2->s6_addr32[3]); > +} > + > > Is it faster to do : > > +static inline int ipv6_addr_equal(const struct in6_addr *a1, > + const struct in6_addr *a2) > +{ > + return (a1->s6_addr32[3] == a2->s6_addr32[3] && > + a1->s6_addr32[2] == a2->s6_addr32[2] && > + a1->s6_addr32[1] == a2->s6_addr32[1] && > + a1->s6_addr32[0] == a2->s6_addr32[0]); > +} > + > > instead ?It should be faster for typical addresses, say 2000:a:b:c::1 > and 2000:a:b:c::2. The device EUI-64 is > normally going to be different for all devices while prefix can be same > (atleast on a link/local site) completely > or to some prefix len portion. I think it might be fastest to do 3-0-2-1 as that will more quickly tell a global from a link-local address. I will eventually do a 64-bit comparison to see if putting an #ifdef CONFIG_64BIT is worth it. -Brian From yoshfuji@linux-ipv6.org Wed Nov 10 13:22:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 13:22:40 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAALMXZM009395 for ; Wed, 10 Nov 2004 13:22:33 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 809B433CE5; Thu, 11 Nov 2004 06:23:19 +0900 (JST) Date: Wed, 10 Nov 2004 16:23:16 -0500 (EST) Message-Id: <20041110.162316.116605012.yoshfuji@linux-ipv6.org> To: Brian.Haley@hp.com Cc: kumarkr@us.ibm.com, davem@davemloft.net, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [BK PATCH] Misc IPv6 Updates From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <419285B8.4070703@hp.com> References: <419285B8.4070703@hp.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11700 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 899 Lines: 26 In article <419285B8.4070703@hp.com> (at Wed, 10 Nov 2004 16:18:48 -0500), Brian Haley says: > > Is it faster to do : > > > > +static inline int ipv6_addr_equal(const struct in6_addr *a1, > > + const struct in6_addr *a2) > > +{ > > + return (a1->s6_addr32[3] == a2->s6_addr32[3] && > > + a1->s6_addr32[2] == a2->s6_addr32[2] && > > + a1->s6_addr32[1] == a2->s6_addr32[1] && > > + a1->s6_addr32[0] == a2->s6_addr32[0]); > > +} > > + > > > > instead ?It should be faster for typical addresses, say 2000:a:b:c::1 > > and 2000:a:b:c::2. The device EUI-64 is > > normally going to be different for all devices while prefix can be same > > (atleast on a link/local site) completely > > or to some prefix len portion. : > I will eventually do a 64-bit comparison to see if putting an > #ifdef CONFIG_64BIT is worth it. No, because we cannot assume 64bit alignment. --yoshfuji From yoshfuji@linux-ipv6.org Wed Nov 10 13:24:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 13:24:26 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAALOKxk009779 for ; Wed, 10 Nov 2004 13:24:20 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 070DF33CE5; Thu, 11 Nov 2004 06:25:07 +0900 (JST) Date: Wed, 10 Nov 2004 16:25:06 -0500 (EST) Message-Id: <20041110.162506.124979704.yoshfuji@linux-ipv6.org> To: kumarkr@us.ibm.com Cc: davem@davemloft.net, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [BK PATCH] Misc IPv6 Updates From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: <20041110.030026.29809367.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 11701 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1368 Lines: 33 In article (at Wed, 10 Nov 2004 10:20:40 -0800), Krishna Kumar says: > Is it faster to do : > > +static inline int ipv6_addr_equal(const struct in6_addr *a1, > + const struct in6_addr > *a2) > +{ > + return (a1->s6_addr32[3] == a2->s6_addr32[3] && > + a1->s6_addr32[2] == a2->s6_addr32[2] && > + a1->s6_addr32[1] == a2->s6_addr32[1] && > + a1->s6_addr32[0] == a2->s6_addr32[0]); > +} > + > > instead ?It should be faster for typical addresses, say 2000:a:b:c::1 and > 2000:a:b:c::2. The device EUI-64 is > normally going to be different for all devices while prefix can be same > (atleast on a link/local site) completely > or to some prefix len portion. It depends on context and situation. But, the difference is almost within the error range compare to the this improvements to avoid using memcmp. Anyway, the reason why the order is MSB->LSB is 1. if you have multiple addresses with multiple prefixes + same interface identifier, MSB->LSB is better. 2. from the point of view of cache, MSB->LSB is better. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From romieu@fr.zoreil.com Wed Nov 10 13:32:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 13:32:30 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAALWOFp010328 for ; Wed, 10 Nov 2004 13:32:25 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAALSivr026322; Wed, 10 Nov 2004 22:28:44 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAALSZC7026321; Wed, 10 Nov 2004 22:28:35 +0100 Date: Wed, 10 Nov 2004 22:28:35 +0100 From: Francois Romieu To: sebastian.ionita@focomunicatii.ro Cc: seby@focomunicatii.ro, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Message-ID: <20041110212835.GA23758@electric-eye.fr.zoreil.com> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> <20041109232510.GA5582@electric-eye.fr.zoreil.com> <20041110201010.18341.qmail@focomunicatii.ro> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041110201010.18341.qmail@focomunicatii.ro> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11702 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 535 Lines: 16 sebastian.ionita@focomunicatii.ro : [...] > The kernel compiles but I have 1 unresolved simbole in the via-velocity > modul > depmod: *** Unresolved symbols in > /lib/modules/2.4.28-rc2/kernel/drivers/net/via-velocity.o > depmod: crc_ccitt_R3771b461 Can you grep for crc_ccitt the output of 'nm lib/lib.a' in your build tree and check that CONFIG_CRC_CCITT is enabled in your .config ? crc_ccitt is EXPORT_SYMBOLed by lib/crc-ccitt.c and should be linked in your new kernel. -- Ueimor From benh@kernel.crashing.org Wed Nov 10 15:00:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:00:53 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAN0mgR022360 for ; Wed, 10 Nov 2004 15:00:48 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAAMvsgJ020803; Wed, 10 Nov 2004 16:57:56 -0600 Subject: Re: [(broken) PATCH] Sungem and wake_on_lan From: Benjamin Herrenschmidt To: Colin Leroy Cc: Linux Kernel list , netdev@oss.sgi.com In-Reply-To: <20041109151154.43c897dd.colin.lkml@colino.net> References: <20041109151154.43c897dd.colin.lkml@colino.net> Content-Type: text/plain Date: Thu, 11 Nov 2004 09:57:36 +1100 Message-Id: <1100127457.25814.19.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 11704 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev Content-Length: 1040 Lines: 28 On Tue, 2004-11-09 at 15:11 +0100, Colin Leroy wrote: > Hi everyone, > > I'm trying to implement wake_on_lan in sungem. I did it by mimicking the > Darwin AppleGMACEthernet driver. > I have some problems with it; not only it doesn't work (pinging the > target machine does not wake it up, nor does ether-wake.c), but also the > normal resume crashes instead of working - before powering screen up, > so no log available... > > My laptop has a BCM5221 PHY, I suppose it supports WOL but did not > check. Anyway it shouldn't crash on normal resume, as Darwin's driver > doesn't seem to have special cases depending on PHYs. > > Before putting the laptop to sleep, I issue a 'sudo ethtool -s eth0 wol p' > to enable gp->wake_on_lan. > > Here's the patch, in case anyone (BenH, David Miller ? :)) has an idea > about something i do wrong. > Thanks, Not sure at this point why it would die, but I'm pretty sure you must edit the PHY PM code too in sungem_phy.c to not shut it down :) Darwin does have some special cases for PHYs. Ben. From benh@kernel.crashing.org Wed Nov 10 15:05:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:06:00 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAAN5sGg022748 for ; Wed, 10 Nov 2004 15:05:54 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAAN3BgJ020876; Wed, 10 Nov 2004 17:03:12 -0600 Subject: Re: [PATCH] sungem: Fix stop_phy From: Benjamin Herrenschmidt To: Colin Leroy Cc: Linux Kernel list , netdev@oss.sgi.com In-Reply-To: <20041110092731.230719cb.colin@colino.net> References: <20041110092731.230719cb.colin@colino.net> Content-Type: text/plain Date: Thu, 11 Nov 2004 10:02:54 +1100 Message-Id: <1100127774.25813.24.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 11705 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev Content-Length: 5178 Lines: 150 On Wed, 2004-11-10 at 09:27 +0100, Colin Leroy wrote: > Hi, > > sungem driver's stop_phy differs quite a lot from Darwin's driver: > In darwin, the hack consisting in reading and writing the same > from/to MII_LPA is applied to every sungem card, not only bcm5201. > Also, it is done before the rest of the stuff, not after. Maybe order > matters. > In Linux sungem's driver, the BCM5221 phy is suspended as the BCM5201. > It is (completely) different in darwin. > > The patch following this follows OS X a bit more closely. It works on > iBook G4 with a BCM5221, it would be nice if users of other PHYs could > test it. If I'm correct, stop_phy is called once during boot (I had an > oops from it during boot while hacking on it), so booting and checking > that network works should be enough. Which version of Darwin did you look at ? There have been changes since I wrote that code. Note that currently, sungem stops everything (cell, PHY, ...) when the interface is down for more than 10 seconds, though I've been thinking about removing that "feature" since it prevents polling the link... > Signed-off-by: Colin Leroy > diff -ur a/drivers/net/sungem.c b/drivers/net/sungem.c > --- a/drivers/net/sungem.c 2004-10-18 23:55:28.000000000 +0200 > +++ b/drivers/net/sungem.c 2004-11-10 09:16:55.660896544 +0100 > @@ -2124,6 +2124,8 @@ > */ > msleep(10); > > + /* FIXME OS X starts with disabling interrupts for BCM5201 */ PHY interrupts are used for WOL afaik > /* Make sure we aren't polling PHY status change. We > * don't currently use that feature though > */ We don't use autopoll as it's somewhat buggy > @@ -2131,6 +2133,8 @@ > mifcfg &= ~MIF_CFG_POLL; > writel(mifcfg, gp->regs + MIF_CFG); > > + bcm_link_partner_hack(&gp->phy_mii); I doubt this is useful, and I'd like to avoid those hacks that violate the layering of sungem vs. sungem_phy.c If you really want to read the LPA, then do so on all PHYs from sungem.c. Clearing the interrupts can be done from the PHY init(). > if (gp->wake_on_lan) { > /* Setup wake-on-lan */ > } else { > @@ -2159,7 +2163,7 @@ > } > > if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) > - gp->phy_mii.def->ops->suspend(&gp->phy_mii, 0 /* wake on lan options */); > + gp->phy_mii.def->ops->suspend(&gp->phy_mii, gp->wake_on_lan); > > if (!gp->wake_on_lan) { > /* According to Apple, we must set the MDIO pins to this begnign > diff -ur a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c > --- a/drivers/net/sungem_phy.c 2004-10-18 23:53:45.000000000 +0200 > +++ b/drivers/net/sungem_phy.c 2004-11-10 08:59:20.000000000 +0100 > @@ -101,15 +101,17 @@ > return 0; > } > > -static int bcm5201_suspend(struct mii_phy* phy, int wol_options) > +void bcm_link_partner_hack(struct mii_phy *phy) > { > - if (!wol_options) > - phy_write(phy, MII_BCM5201_INTERRUPT, 0); > - > /* Here's a strange hack used by both MacOS 9 and X */ > phy_write(phy, MII_LPA, phy_read(phy, MII_LPA)); > - > +} > + > +static int bcm5201_suspend(struct mii_phy* phy, int wol_options) > +{ > if (!wol_options) { > + phy_write(phy, MII_BCM5201_INTERRUPT, 0); > + > #if 0 /* Commented out in Darwin... someone has those dawn docs ? */ > u16 val = phy_read(phy, MII_BCM5201_AUXMODE2) > phy_write(phy, MII_BCM5201_AUXMODE2, > @@ -144,6 +146,20 @@ > return 0; > } The BCM52xx docs are available on Broadcom site. > +static int bcm5221_suspend(struct mii_phy* phy, int wol_options) > +{ > + if (!wol_options) { > + u16 data = phy_read(phy, MII_BCM5221_TEST); > + phy_write(phy, MII_BCM5221_TEST, > + data | MII_BCM5221_TEST_ENABLE_SHADOWS); > + > + data = phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); > + phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, > + data | MII_BCM5221_IDDQ); > + } > + return 0; > +} > + > static int bcm5400_init(struct mii_phy* phy) > { > u16 data; > @@ -662,7 +678,7 @@ > > /* Broadcom BCM 5221 */ > static struct mii_phy_ops bcm5221_phy_ops = { > - .suspend = bcm5201_suspend, > + .suspend = bcm5221_suspend, > .init = bcm5221_init, > .setup_aneg = genmii_setup_aneg, > .setup_forced = genmii_setup_forced, > diff -ur a/drivers/net/sungem_phy.h b/drivers/net/sungem_phy.h > --- a/drivers/net/sungem_phy.h 2004-10-18 23:54:40.000000000 +0200 > +++ b/drivers/net/sungem_phy.h 2004-11-10 08:59:53.000000000 +0100 > @@ -53,6 +53,7 @@ > */ > extern int mii_phy_probe(struct mii_phy *phy, int mii_id); > > +void bcm_link_partner_hack(struct mii_phy *phy); > > /* MII definitions missing from mii.h */ > > @@ -81,6 +82,7 @@ > #define MII_BCM5221_SHDOW_AUX_STAT2_APD 0x0020 > #define MII_BCM5221_SHDOW_AUX_MODE4 0x1a > #define MII_BCM5221_SHDOW_AUX_MODE4_CLKLOPWR 0x0004 > +#define MII_BCM5221_IDDQ 0x0001 > > /* MII BCM5400 1000-BASET Control register */ > #define MII_BCM5400_GB_CONTROL 0x09 > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Benjamin Herrenschmidt From akpm@osdl.org Wed Nov 10 15:58:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:58:54 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwc4i025139 for ; Wed, 10 Nov 2004 15:58:43 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANw8904191; Wed, 10 Nov 2004 15:58:08 -0800 Message-Id: <200411102358.iAANw8904191@mail.osdl.org> Subject: [patch 1/7] arcnet fixes To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, simlo@phys.au.dk From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:19 -0800 X-archive-position: 11709 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 43131 Lines: 1312 From: Esben Nielsen As previously reported the ArcNet driver didn't work with Preempt and SMB on. They do now. I have changed the locking system from being a global arcnet lock to being a lock per device. I used the lock in dev->hard_start_xmit = arcnet_send_packet. Furthermore I added the "CAP mode" encapsulation. As far as I see it it is the only encapsulation which actually makes ArcNet usefull over ethernet. Previously, the driver just ignored the hardware transmit status, now you can get hardware acknowledge and excessive nacks back to userspace via a raw socket. The capmode.c is nearly just a copy of arc-rawmode.c. The difference is that it inserts a ack_tx() handle into the general driver framework. Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/arcnet/Kconfig | 19 + 25-akpm/drivers/net/arcnet/Makefile | 1 25-akpm/drivers/net/arcnet/arc-rawmode.c | 9 25-akpm/drivers/net/arcnet/arcnet.c | 253 +++++++++++++++++-------- 25-akpm/drivers/net/arcnet/capmode.c | 296 ++++++++++++++++++++++++++++++ 25-akpm/drivers/net/arcnet/com20020-isa.c | 1 25-akpm/drivers/net/arcnet/com20020.c | 28 +- 25-akpm/drivers/net/arcnet/rfc1051.c | 3 25-akpm/drivers/net/arcnet/rfc1201.c | 2 25-akpm/include/linux/arcdevice.h | 21 +- 25-akpm/include/linux/com20020.h | 30 +-- 25-akpm/include/linux/if_arcnet.h | 14 + 25-akpm/include/linux/if_ether.h | 1 include/linux/net.h | 0 14 files changed, 574 insertions(+), 104 deletions(-) diff -puN drivers/net/arcnet/arcnet.c~arcnet-fixes drivers/net/arcnet/arcnet.c --- 25/drivers/net/arcnet/arcnet.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/arcnet.c Wed Nov 10 16:00:34 2004 @@ -53,7 +53,6 @@ #include #include - /* "do nothing" functions for protocol drivers */ static void null_rx(struct net_device *dev, int bufnum, struct archdr *pkthdr, int length); @@ -69,25 +68,28 @@ static int null_prepare_tx(struct net_de * arc_proto_default instead. It also must not be NULL; if you would like * to set it to NULL, set it to &arc_proto_null instead. */ -struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto; + struct ArcProto *arc_proto_map[256], *arc_proto_default, + *arc_bcast_proto, *arc_raw_proto; struct ArcProto arc_proto_null = { .suffix = '?', .mtu = XMTU, + .is_ip = 0, .rx = null_rx, .build_header = null_build_header, .prepare_tx = null_prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; -static spinlock_t arcnet_lock = SPIN_LOCK_UNLOCKED; - /* Exported function prototypes */ int arcnet_debug = ARCNET_DEBUG; EXPORT_SYMBOL(arc_proto_map); EXPORT_SYMBOL(arc_proto_default); EXPORT_SYMBOL(arc_bcast_proto); +EXPORT_SYMBOL(arc_raw_proto); EXPORT_SYMBOL(arc_proto_null); EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_debug); @@ -131,7 +133,7 @@ static int __init arcnet_init(void) #endif /* initialize the protocol map */ - arc_proto_default = arc_bcast_proto = &arc_proto_null; + arc_raw_proto = arc_proto_default = arc_bcast_proto = &arc_proto_null; for (count = 0; count < 256; count++) arc_proto_map[count] = arc_proto_default; @@ -155,7 +157,8 @@ module_exit(arcnet_exit); * Dump the contents of an sk_buff */ #if ARCNET_DEBUG_MAX & D_SKB -void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc) +void arcnet_dump_skb(struct net_device *dev, + struct sk_buff *skb, char *desc) { int i; @@ -176,18 +179,22 @@ EXPORT_SYMBOL(arcnet_dump_skb); * Dump the contents of an ARCnet buffer */ #if (ARCNET_DEBUG_MAX & (D_RX | D_TX)) -void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc) +void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, + int take_arcnet_lock) { struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int i, length; - unsigned long flags; + unsigned long flags = 0; static uint8_t buf[512]; /* hw.copy_from_card expects IRQ context so take the IRQ lock to keep it single threaded */ - spin_lock_irqsave(&arcnet_lock, flags); + if(take_arcnet_lock) + spin_lock_irqsave(&lp->lock, flags); + lp->hw.copy_from_card(dev, bufnum, 0, buf, 512); - spin_unlock_irqrestore(&arcnet_lock, flags); + if(take_arcnet_lock) + spin_unlock_irqrestore(&lp->lock, flags); /* if the offset[0] byte is nonzero, this is a 256-byte packet */ length = (buf[2] ? 256 : 512); @@ -219,6 +226,8 @@ void arcnet_unregister_proto(struct ArcP arc_proto_default = &arc_proto_null; if (arc_bcast_proto == proto) arc_bcast_proto = arc_proto_default; + if (arc_raw_proto == proto) + arc_raw_proto = arc_proto_default; for (count = 0; count < 256; count++) { if (arc_proto_map[count] == proto) @@ -261,8 +270,11 @@ static int get_arcbuf(struct net_device struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int buf = -1, i; - if (!atomic_dec_and_test(&lp->buf_lock)) /* already in this function */ - BUGMSG(D_NORMAL, "get_arcbuf: overlap (%d)!\n", lp->buf_lock.counter); + if (!atomic_dec_and_test(&lp->buf_lock)) { + /* already in this function */ + BUGMSG(D_NORMAL, "get_arcbuf: overlap (%d)!\n", + lp->buf_lock.counter); + } else { /* we can continue */ if (lp->next_buf >= 5) lp->next_buf -= 5; @@ -312,7 +324,7 @@ void arcdev_setup(struct net_device *dev dev->mtu = choose_mtu(); dev->addr_len = ARCNET_ALEN; - dev->tx_queue_len = 30; + dev->tx_queue_len = 100; dev->broadcast[0] = 0x00; /* for us, broadcasts are address 0 */ dev->watchdog_timeo = TX_TIMEOUT; @@ -334,8 +346,16 @@ void arcdev_setup(struct net_device *dev struct net_device *alloc_arcdev(char *name) { - return alloc_netdev(sizeof(struct arcnet_local), - name && *name ? name : "arc%d", arcdev_setup); + struct net_device *dev; + + dev = alloc_netdev(sizeof(struct arcnet_local), + name && *name ? name : "arc%d", arcdev_setup); + if(dev) { + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + lp->lock = SPIN_LOCK_UNLOCKED; + } + + return dev; } /* @@ -351,6 +371,8 @@ static int arcnet_open(struct net_device struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int count, newmtu, error; + BUGMSG(D_INIT,"opened."); + if (!try_module_get(lp->hw.owner)) return -ENODEV; @@ -377,6 +399,8 @@ static int arcnet_open(struct net_device if (newmtu < dev->mtu) dev->mtu = newmtu; + BUGMSG(D_INIT, "arcnet_open: mtu: %d.\n", dev->mtu); + /* autodetect the encapsulation for each host. */ memset(lp->default_proto, 0, sizeof(lp->default_proto)); @@ -390,6 +414,7 @@ static int arcnet_open(struct net_device /* initialize buffers */ atomic_set(&lp->buf_lock, 1); + lp->next_buf = lp->first_free_buf = 0; release_arcbuf(dev, 0); release_arcbuf(dev, 1); @@ -411,17 +436,24 @@ static int arcnet_open(struct net_device BUGMSG(D_NORMAL, "WARNING! Station address FF may confuse " "DOS networking programs!\n"); - if (ASTATUS() & RESETflag) + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); + if (ASTATUS() & RESETflag) { + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); ACOMMAND(CFLAGScmd | RESETclear); + } + + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); /* make sure we're ready to receive IRQ's. */ AINTMASK(0); udelay(1); /* give it time to set the mask before * we reset it again. (may not even be * necessary) */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); lp->intmask = NORXflag | RECONflag; AINTMASK(lp->intmask); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); netif_start_queue(dev); @@ -467,32 +499,41 @@ static int arcnet_header(struct sk_buff daddr ? *(uint8_t *) daddr : -1, type, type, len); - if (len != skb->len) + if (skb->len!=0 && len != skb->len) BUGMSG(D_NORMAL, "arcnet_header: Yikes! skb->len(%d) != len(%d)!\n", skb->len, len); - /* - * if the dest addr isn't provided, we can't choose an encapsulation! - * Store the packet type (eg. ETH_P_IP) for now, and we'll push on a - * real header when we do rebuild_header. - */ - if (!daddr) { + + /* Type is host order - ? */ + if(type == ETH_P_ARCNET) { + proto = arc_raw_proto; + BUGMSG(D_DEBUG, "arc_raw_proto used. proto='%c'\n",proto->suffix); + _daddr = daddr ? *(uint8_t *) daddr : 0; + } + else if (!daddr) { + /* + * if the dest addr isn't provided, we can't choose an encapsulation! + * Store the packet type (eg. ETH_P_IP) for now, and we'll push on a + * real header when we do rebuild_header. + */ *(uint16_t *) skb_push(skb, 2) = type; if (skb->nh.raw - skb->mac.raw != 2) BUGMSG(D_NORMAL, "arcnet_header: Yikes! diff (%d) is not 2!\n", (int)(skb->nh.raw - skb->mac.raw)); return -2; /* return error -- can't transmit yet! */ } - /* otherwise, we can just add the header as usual. */ - _daddr = *(uint8_t *) daddr; - proto_num = lp->default_proto[_daddr]; - proto = arc_proto_map[proto_num]; - BUGMSG(D_DURING, "building header for %02Xh using protocol '%c'\n", - proto_num, proto->suffix); - if (proto == &arc_proto_null && arc_bcast_proto != proto) { - BUGMSG(D_DURING, "actually, let's use '%c' instead.\n", - arc_bcast_proto->suffix); - proto = arc_bcast_proto; + else { + /* otherwise, we can just add the header as usual. */ + _daddr = *(uint8_t *) daddr; + proto_num = lp->default_proto[_daddr]; + proto = arc_proto_map[proto_num]; + BUGMSG(D_DURING, "building header for %02Xh using protocol '%c'\n", + proto_num, proto->suffix); + if (proto == &arc_proto_null && arc_bcast_proto != proto) { + BUGMSG(D_DURING, "actually, let's use '%c' instead.\n", + arc_bcast_proto->suffix); + proto = arc_bcast_proto; + } } return proto->build_header(skb, dev, type, _daddr); } @@ -519,6 +560,7 @@ static int arcnet_rebuild_header(struct return 0; } type = *(uint16_t *) skb_pull(skb, 2); + BUGMSG(D_DURING, "rebuild header for protocol %Xh\n", type); if (type == ETH_P_IP) { #ifdef CONFIG_INET @@ -555,10 +597,12 @@ static int arcnet_send_packet(struct sk_ struct arc_rfc1201 *soft; struct ArcProto *proto; int txbuf; + unsigned long flags; + int freeskb = 0; BUGMSG(D_DURING, - "transmit requested (status=%Xh, txbufs=%d/%d, len=%d)\n", - ASTATUS(), lp->cur_tx, lp->next_tx, skb->len); + "transmit requested (status=%Xh, txbufs=%d/%d, len=%d, protocol %x)\n", + ASTATUS(), lp->cur_tx, lp->next_tx, skb->len,skb->protocol); pkt = (struct archdr *) skb->data; soft = &pkt->soft.rfc1201; @@ -578,38 +622,49 @@ static int arcnet_send_packet(struct sk_ /* We're busy transmitting a packet... */ netif_stop_queue(dev); + spin_lock_irqsave(&lp->lock, flags); AINTMASK(0); txbuf = get_arcbuf(dev); if (txbuf != -1) { - if (proto->prepare_tx(dev, pkt, skb->len, txbuf)) { - /* done right away */ + if (proto->prepare_tx(dev, pkt, skb->len, txbuf) && + !proto->ack_tx) { + /* done right away and we don't want to acknowledge + the package later - forget about it now */ lp->stats.tx_bytes += skb->len; - dev_kfree_skb(skb); + freeskb = 1; } else { /* do it the 'split' way */ lp->outgoing.proto = proto; lp->outgoing.skb = skb; lp->outgoing.pkt = pkt; - if (!proto->continue_tx) - BUGMSG(D_NORMAL, "bug! prep_tx==0, but no continue_tx!\n"); - else if (proto->continue_tx(dev, txbuf)) { - BUGMSG(D_NORMAL, - "bug! continue_tx finished the first time! " - "(proto='%c')\n", proto->suffix); + if (proto->continue_tx && + proto->continue_tx(dev, txbuf)) { + BUGMSG(D_NORMAL, + "bug! continue_tx finished the first time! " + "(proto='%c')\n", proto->suffix); } } lp->next_tx = txbuf; - } else - dev_kfree_skb(skb); + } else { + freeskb = 1; + } + BUGMSG(D_DEBUG, "%s: %d: %s, status: %x\n",__FILE__,__LINE__,__FUNCTION__,ASTATUS()); /* make sure we didn't ignore a TX IRQ while we were in here */ AINTMASK(0); - lp->intmask |= TXFREEflag; + + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); + lp->intmask |= TXFREEflag|EXCNAKflag; AINTMASK(lp->intmask); + BUGMSG(D_DEBUG, "%s: %d: %s, status: %x\n",__FILE__,__LINE__,__FUNCTION__,ASTATUS()); + spin_unlock_irqrestore(&lp->lock, flags); + if (freeskb) { + dev_kfree_skb(skb); + } return 0; /* no need to try again */ } @@ -628,7 +683,7 @@ static int go_tx(struct net_device *dev) if (lp->cur_tx != -1 || lp->next_tx == -1) return 0; - BUGLVL(D_TX) arcnet_dump_packet(dev, lp->next_tx, "go_tx"); + BUGLVL(D_TX) arcnet_dump_packet(dev, lp->next_tx, "go_tx", 0); lp->cur_tx = lp->next_tx; lp->next_tx = -1; @@ -640,7 +695,8 @@ static int go_tx(struct net_device *dev) lp->stats.tx_packets++; lp->lasttrans_dest = lp->lastload_dest; lp->lastload_dest = 0; - lp->intmask |= TXFREEflag; + lp->excnak_pending = 0; + lp->intmask |= TXFREEflag|EXCNAKflag; return 1; } @@ -654,7 +710,7 @@ static void arcnet_timeout(struct net_de int status = ASTATUS(); char *msg; - spin_lock_irqsave(&arcnet_lock, flags); + spin_lock_irqsave(&lp->lock, flags); if (status & TXFREEflag) { /* transmit _DID_ finish */ msg = " - missed IRQ?"; } else { @@ -665,12 +721,12 @@ static void arcnet_timeout(struct net_de } lp->stats.tx_errors++; - /* make sure we didn't miss a TX IRQ */ + /* make sure we didn't miss a TX or a EXC NAK IRQ */ AINTMASK(0); - lp->intmask |= TXFREEflag; + lp->intmask |= TXFREEflag|EXCNAKflag; AINTMASK(lp->intmask); - spin_unlock_irqrestore(&arcnet_lock, flags); + spin_unlock_irqrestore(&lp->lock, flags); if (jiffies - lp->last_timeout > 10*HZ) { BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n", @@ -692,18 +748,19 @@ irqreturn_t arcnet_interrupt(int irq, vo { struct net_device *dev = dev_id; struct arcnet_local *lp; - int recbuf, status, didsomething, boguscount; + int recbuf, status, diagstatus, didsomething, boguscount; + int retval = IRQ_NONE; BUGMSG(D_DURING, "\n"); BUGMSG(D_DURING, "in arcnet_interrupt\n"); - - spin_lock(&arcnet_lock); lp = (struct arcnet_local *) dev->priv; if (!lp) BUG(); + spin_lock(&lp->lock); + /* * RESET flag was enabled - if device is not running, we must clear it right * away (but nothing else). @@ -712,7 +769,7 @@ irqreturn_t arcnet_interrupt(int irq, vo if (ASTATUS() & RESETflag) ACOMMAND(CFLAGScmd | RESETclear); AINTMASK(0); - spin_unlock(&arcnet_lock); + spin_unlock(&lp->lock); return IRQ_HANDLED; } @@ -722,6 +779,10 @@ irqreturn_t arcnet_interrupt(int irq, vo boguscount = 5; do { status = ASTATUS(); + diagstatus = (status >> 8) & 0xFF; + + BUGMSG(D_DEBUG, "%s: %d: %s: status=%x\n", + __FILE__,__LINE__,__FUNCTION__,status); didsomething = 0; /* @@ -761,24 +822,55 @@ irqreturn_t arcnet_interrupt(int irq, vo } didsomething++; } + + if((diagstatus & EXCNAKflag)) { + BUGMSG(D_DURING, "EXCNAK IRQ (diagstat=%Xh)\n", + diagstatus); + + ACOMMAND(NOTXcmd); /* disable transmit */ + lp->excnak_pending = 1; + + ACOMMAND(EXCNAKclear); + lp->intmask &= ~(EXCNAKflag); + didsomething++; + } + + /* a transmit finished, and we're interested in it. */ if ((status & lp->intmask & TXFREEflag) || lp->timed_out) { - lp->intmask &= ~TXFREEflag; + lp->intmask &= ~(TXFREEflag|EXCNAKflag); BUGMSG(D_DURING, "TX IRQ (stat=%Xh)\n", status); - if (lp->cur_tx != -1 && !(status & TXACKflag) && !lp->timed_out) { - if (lp->lasttrans_dest != 0) { - BUGMSG(D_EXTRA, "transmit was not acknowledged! " - "(status=%Xh, dest=%02Xh)\n", - status, lp->lasttrans_dest); - lp->stats.tx_errors++; - lp->stats.tx_carrier_errors++; - } else { - BUGMSG(D_DURING, - "broadcast was not acknowledged; that's normal " - "(status=%Xh, dest=%02Xh)\n", - status, lp->lasttrans_dest); + if (lp->cur_tx != -1 && !lp->timed_out) { + if(!(status & TXACKflag)) { + if (lp->lasttrans_dest != 0) { + BUGMSG(D_EXTRA, + "transmit was not acknowledged! " + "(status=%Xh, dest=%02Xh)\n", + status, lp->lasttrans_dest); + lp->stats.tx_errors++; + lp->stats.tx_carrier_errors++; + } else { + BUGMSG(D_DURING, + "broadcast was not acknowledged; that's normal " + "(status=%Xh, dest=%02Xh)\n", + status, lp->lasttrans_dest); + } + } + + if (lp->outgoing.proto && + lp->outgoing.proto->ack_tx) { + int ackstatus; + if(status & TXACKflag) + ackstatus=2; + else if(lp->excnak_pending) + ackstatus=1; + else + ackstatus=0; + + lp->outgoing.proto + ->ack_tx(dev, ackstatus); } } if (lp->cur_tx != -1) @@ -798,8 +890,11 @@ irqreturn_t arcnet_interrupt(int irq, vo if (lp->outgoing.proto->continue_tx(dev, txbuf)) { /* that was the last segment */ lp->stats.tx_bytes += lp->outgoing.skb->len; - dev_kfree_skb_irq(lp->outgoing.skb); - lp->outgoing.proto = NULL; + if(!lp->outgoing.proto->ack_tx) + { + dev_kfree_skb_irq(lp->outgoing.skb); + lp->outgoing.proto = NULL; + } } lp->next_tx = txbuf; } @@ -810,7 +905,7 @@ irqreturn_t arcnet_interrupt(int irq, vo } /* now process the received packet, if any */ if (recbuf != -1) { - BUGLVL(D_RX) arcnet_dump_packet(dev, recbuf, "rx irq"); + BUGLVL(D_RX) arcnet_dump_packet(dev, recbuf, "rx irq", 0); arcnet_rx(dev, recbuf); release_arcbuf(dev, recbuf); @@ -868,6 +963,10 @@ irqreturn_t arcnet_interrupt(int irq, vo BUGMSG(D_DURING, "not recon: clearing counters anyway.\n"); } + + if(didsomething) { + retval |= IRQ_HANDLED; + } } while (--boguscount && didsomething); @@ -880,8 +979,8 @@ irqreturn_t arcnet_interrupt(int irq, vo udelay(1); AINTMASK(lp->intmask); - spin_unlock(&arcnet_lock); - return IRQ_RETVAL(didsomething); + spin_unlock(&lp->lock); + return retval; } @@ -908,7 +1007,7 @@ void arcnet_rx(struct net_device *dev, i } /* get the full header, if possible */ - if (sizeof(pkt.soft) < length) + if (sizeof(pkt.soft) <= length) lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(pkt.soft)); else { memset(&pkt.soft, 0, sizeof(pkt.soft)); @@ -923,7 +1022,7 @@ void arcnet_rx(struct net_device *dev, i lp->stats.rx_bytes += length + ARC_HDR_SIZE; /* call the right receiver for the protocol */ - if (arc_proto_map[soft->proto] != &arc_proto_null) { + if (arc_proto_map[soft->proto]->is_ip) { BUGLVL(D_PROTO) { struct ArcProto *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]], diff -puN drivers/net/arcnet/arc-rawmode.c~arcnet-fixes drivers/net/arcnet/arc-rawmode.c --- 25/drivers/net/arcnet/arc-rawmode.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/arc-rawmode.c Wed Nov 10 16:00:34 2004 @@ -42,7 +42,6 @@ static int build_header(struct sk_buff * static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); - struct ArcProto rawmode_proto = { .suffix = 'r', @@ -50,6 +49,8 @@ struct ArcProto rawmode_proto = .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; @@ -121,7 +122,8 @@ static void rx(struct net_device *dev, i BUGLVL(D_SKB) arcnet_dump_skb(dev, skb, "rx"); - skb->protocol = 0; + skb->protocol = __constant_htons(ETH_P_ARCNET); +; netif_rx(skb); dev->last_rx = jiffies; } @@ -190,6 +192,9 @@ static int prepare_tx(struct net_device } else hard->offset[0] = ofs = 256 - length; + BUGMSG(D_DURING, "prepare_tx: length=%d ofs=%d\n", + length,ofs); + lp->hw.copy_to_card(dev, bufnum, 0, hard, ARC_HDR_SIZE); lp->hw.copy_to_card(dev, bufnum, ofs, &pkt->soft, length); diff -puN /dev/null drivers/net/arcnet/capmode.c --- /dev/null Thu Apr 11 07:25:15 2002 +++ 25-akpm/drivers/net/arcnet/capmode.c Wed Nov 10 16:00:34 2004 @@ -0,0 +1,296 @@ +/* + * Linux ARCnet driver - "cap mode" packet encapsulation. + * It adds sequence numbers to packets for communicating between a user space + * application and the driver. After a transmit it sends a packet with protocol + * byte 0 back up to the userspace containing the sequence number of the packet + * plus the transmit-status on the ArcNet. + * + * Written 2002-4 by Esben Nielsen, Vestas Wind Systems A/S + * Derived from arc-rawmode.c by Avery Pennarun. + * arc-rawmode was in turned based on skeleton.c, see below. + * + * ********************** + * + * The original copyright of skeleton.c was as follows: + * + * skeleton.c Written 1993 by Donald Becker. + * Copyright 1993 United States Government as represented by the + * Director, National Security Agency. This software may only be used + * and distributed according to the terms of the GNU General Public License as + * modified by SRC, incorporated herein by reference. + * + * ********************** + * + * For more details, see drivers/net/arcnet.c + * + * ********************** + */ + +#include +#include +#include +#include +#include +#include +#include + +#define VERSION "arcnet: cap mode (`c') encapsulation support loaded.\n" + + +static void rx(struct net_device *dev, int bufnum, + struct archdr *pkthdr, int length); +static int build_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + uint8_t daddr); +static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, + int bufnum); +static int ack_tx(struct net_device *dev, int acked); + + +struct ArcProto capmode_proto = +{ + 'r', + XMTU, + 0, + rx, + build_header, + prepare_tx, + NULL, + ack_tx +}; + + +void arcnet_cap_init(void) +{ + int count; + + for (count = 1; count <= 8; count++) + if (arc_proto_map[count] == arc_proto_default) + arc_proto_map[count] = &capmode_proto; + + /* for cap mode, we only set the bcast proto if there's no better one */ + if (arc_bcast_proto == arc_proto_default) + arc_bcast_proto = &capmode_proto; + + arc_proto_default = &capmode_proto; + arc_raw_proto = &capmode_proto; +} + + +#ifdef MODULE + +int __init init_module(void) +{ + printk(VERSION); + arcnet_cap_init(); + return 0; +} + +void cleanup_module(void) +{ + arcnet_unregister_proto(&capmode_proto); +} + +MODULE_LICENSE("GPL"); +#endif /* MODULE */ + + + +/* packet receiver */ +static void rx(struct net_device *dev, int bufnum, + struct archdr *pkthdr, int length) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct sk_buff *skb; + struct archdr *pkt = pkthdr; + char *pktbuf, *pkthdrbuf; + int ofs; + + BUGMSG(D_DURING, "it's a raw(cap) packet (length=%d)\n", length); + + if (length >= MinTU) + ofs = 512 - length; + else + ofs = 256 - length; + + skb = alloc_skb(length + ARC_HDR_SIZE + sizeof(int), GFP_ATOMIC); + if (skb == NULL) { + BUGMSG(D_NORMAL, "Memory squeeze, dropping packet.\n"); + lp->stats.rx_dropped++; + return; + } + skb_put(skb, length + ARC_HDR_SIZE + sizeof(int)); + skb->dev = dev; + + pkt = (struct archdr *) skb->data; + + skb->mac.raw = skb->data; + skb_pull(skb, ARC_HDR_SIZE); + + /* up to sizeof(pkt->soft) has already been copied from the card */ + /* squeeze in an int for the cap encapsulation */ + + /* use these variables to be sure we count in bytes, not in + sizeof(struct archdr) */ + pktbuf=(char*)pkt; + pkthdrbuf=(char*)pkthdr; + memcpy(pktbuf, pkthdrbuf, ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto)); + memcpy(pktbuf+ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto)+sizeof(int), + pkthdrbuf+ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto), + sizeof(struct archdr)-ARC_HDR_SIZE-sizeof(pkt->soft.cap.proto)); + + if (length > sizeof(pkt->soft)) + lp->hw.copy_from_card(dev, bufnum, ofs + sizeof(pkt->soft), + pkt->soft.raw + sizeof(pkt->soft) + + sizeof(int), + length - sizeof(pkt->soft)); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, skb, "rx"); + + skb->protocol = __constant_htons(ETH_P_ARCNET); +; + netif_rx(skb); + dev->last_rx = jiffies; +} + + +/* + * Create the ARCnet hard/soft headers for cap mode. + * There aren't any soft headers in cap mode - not even the protocol id. + */ +static int build_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + uint8_t daddr) +{ + int hdr_size = ARC_HDR_SIZE; + struct archdr *pkt = (struct archdr *) skb_push(skb, hdr_size); + + BUGMSG(D_PROTO, "Preparing header for cap packet %x.\n", + *((int*)&pkt->soft.cap.cookie[0])); + /* + * Set the source hardware address. + * + * This is pretty pointless for most purposes, but it can help in + * debugging. ARCnet does not allow us to change the source address in + * the actual packet sent) + */ + pkt->hard.source = *dev->dev_addr; + + /* see linux/net/ethernet/eth.c to see where I got the following */ + + if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) { + /* + * FIXME: fill in the last byte of the dest ipaddr here to better + * comply with RFC1051 in "noarp" mode. + */ + pkt->hard.dest = 0; + return hdr_size; + } + /* otherwise, just fill it in and go! */ + pkt->hard.dest = daddr; + + return hdr_size; /* success */ +} + + +static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, + int bufnum) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct arc_hardware *hard = &pkt->hard; + int ofs; + + + /* hard header is not included in packet length */ + length -= ARC_HDR_SIZE; + /* And neither is the cookie field */ + length -= sizeof(int); + + BUGMSG(D_DURING, "prepare_tx: txbufs=%d/%d/%d\n", + lp->next_tx, lp->cur_tx, bufnum); + + BUGMSG(D_PROTO, "Sending for cap packet %x.\n", + *((int*)&pkt->soft.cap.cookie[0])); + + if (length > XMTU) { + /* should never happen! other people already check for this. */ + BUGMSG(D_NORMAL, "Bug! prepare_tx with size %d (> %d)\n", + length, XMTU); + length = XMTU; + } + if (length > MinTU) { + hard->offset[0] = 0; + hard->offset[1] = ofs = 512 - length; + } else if (length > MTU) { + hard->offset[0] = 0; + hard->offset[1] = ofs = 512 - length - 3; + } else + hard->offset[0] = ofs = 256 - length; + + BUGMSG(D_DURING, "prepare_tx: length=%d ofs=%d\n", + length,ofs); + + // Copy the arcnet-header + the protocol byte down: + lp->hw.copy_to_card(dev, bufnum, 0, hard, ARC_HDR_SIZE); + lp->hw.copy_to_card(dev, bufnum, ofs, &pkt->soft.cap.proto, + sizeof(pkt->soft.cap.proto)); + + // Skip the extra integer we have written into it as a cookie + // but write the rest of the message: + lp->hw.copy_to_card(dev, bufnum, ofs+1, + ((unsigned char*)&pkt->soft.cap.mes),length-1); + + lp->lastload_dest = hard->dest; + + return 1; /* done */ +} + + +static int ack_tx(struct net_device *dev, int acked) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct sk_buff *ackskb; + struct archdr *ackpkt; + int length=sizeof(struct arc_cap); + + BUGMSG(D_DURING, "capmode: ack_tx: protocol: %x: result: %d\n", + lp->outgoing.skb->protocol, acked); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, lp->outgoing.skb, "ack_tx"); + + /* Now alloc a skb to send back up through the layers: */ + ackskb = alloc_skb(length + ARC_HDR_SIZE , GFP_ATOMIC); + if (ackskb == NULL) { + BUGMSG(D_NORMAL, "Memory squeeze, can't acknowledge.\n"); + goto free_outskb; + } + + skb_put(ackskb, length + ARC_HDR_SIZE ); + ackskb->dev = dev; + + ackpkt = (struct archdr *) ackskb->data; + + ackskb->mac.raw = ackskb->data; + /* skb_pull(ackskb, ARC_HDR_SIZE); */ + + + memcpy(ackpkt, lp->outgoing.skb->data, ARC_HDR_SIZE+sizeof(struct arc_cap)); + ackpkt->soft.cap.proto=0; /* using protocol 0 for acknowledge */ + ackpkt->soft.cap.mes.ack=acked; + + BUGMSG(D_PROTO, "Ackknowledge for cap packet %x.\n", + *((int*)&ackpkt->soft.cap.cookie[0])); + + ackskb->protocol = __constant_htons(ETH_P_ARCNET); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, ackskb, "ack_tx_recv"); + netif_rx(ackskb); + + free_outskb: + dev_kfree_skb_irq(lp->outgoing.skb); + lp->outgoing.proto = NULL; /* We are always finished when in this protocol */ + + return 0; +} diff -puN drivers/net/arcnet/com20020.c~arcnet-fixes drivers/net/arcnet/com20020.c --- 25/drivers/net/arcnet/com20020.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/com20020.c Wed Nov 10 16:00:34 2004 @@ -117,7 +117,7 @@ int com20020_check(struct net_device *de lp->config = 0x21 | (lp->timeout << 3) | (lp->backplane << 2); /* set node ID to 0x42 (but transmitter is disabled, so it's okay) */ SETCONF; - outb(0x42, ioaddr + 7); + outb(0x42, ioaddr + BUS_ALIGN*7); status = ASTATUS(); @@ -129,7 +129,7 @@ int com20020_check(struct net_device *de /* Enable TX */ outb(0x39, _CONFIG); - outb(inb(ioaddr + 8), ioaddr + 7); + outb(inb(ioaddr + BUS_ALIGN*8), ioaddr + BUS_ALIGN*7); ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear); @@ -173,7 +173,7 @@ int com20020_found(struct net_device *de dev->set_multicast_list = com20020_set_mc_list; if (!dev->dev_addr[0]) - dev->dev_addr[0] = inb(ioaddr + 8); /* FIXME: do this some other way! */ + dev->dev_addr[0] = inb(ioaddr + BUS_ALIGN*8); /* FIXME: do this some other way! */ SET_SUBADR(SUB_SETUP1); outb(lp->setup, _XREG); @@ -188,7 +188,6 @@ int com20020_found(struct net_device *de outb(0x18, _COMMAND); } - lp->config = 0x20 | (lp->timeout << 3) | (lp->backplane << 2) | 1; /* Default 0x38 + register: Node ID */ SETCONF; @@ -235,15 +234,19 @@ int com20020_found(struct net_device *de static int com20020_reset(struct net_device *dev, int really_reset) { struct arcnet_local *lp = (struct arcnet_local *) dev->priv; - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; u_char inbyte; + BUGMSG(D_DEBUG, "%s: %d: %s: dev: %p, lp: %p, dev->name: %s\n", + __FILE__,__LINE__,__FUNCTION__,dev,lp,dev->name); BUGMSG(D_INIT, "Resetting %s (status=%02Xh)\n", dev->name, ASTATUS()); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2); /* power-up defaults */ SETCONF; + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); if (really_reset) { /* reset the card */ @@ -251,17 +254,22 @@ static int com20020_reset(struct net_dev mdelay(RESETtime * 2); /* COM20020 seems to be slower sometimes */ } /* clear flags & end reset */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear); /* verify that the ARCnet signature byte is present */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); com20020_copy_from_card(dev, 0, 0, &inbyte, 1); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); if (inbyte != TESTvalue) { + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); BUGMSG(D_NORMAL, "reset failed: TESTvalue not present.\n"); return 1; } /* enable extended (512-byte) packets */ ACOMMAND(CONFIGcmd | EXTconf); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); /* done! return success. */ return 0; @@ -270,22 +278,24 @@ static int com20020_reset(struct net_dev static void com20020_setmask(struct net_device *dev, int mask) { - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; + BUGMSG(D_DURING, "Setting mask to %x at %x\n",mask,ioaddr); AINTMASK(mask); } static void com20020_command(struct net_device *dev, int cmd) { - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; ACOMMAND(cmd); } static int com20020_status(struct net_device *dev) { - short ioaddr = dev->base_addr; - return ASTATUS(); + u_int ioaddr = dev->base_addr; + + return ASTATUS() + (ADIAGSTATUS()<<8); } static void com20020_close(struct net_device *dev) diff -puN drivers/net/arcnet/com20020-isa.c~arcnet-fixes drivers/net/arcnet/com20020-isa.c --- 25/drivers/net/arcnet/com20020-isa.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/com20020-isa.c Wed Nov 10 16:00:34 2004 @@ -41,7 +41,6 @@ #include - #define VERSION "arcnet: COM20020 ISA support (by David Woodhouse et al.)\n" diff -puN drivers/net/arcnet/Kconfig~arcnet-fixes drivers/net/arcnet/Kconfig --- 25/drivers/net/arcnet/Kconfig~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/Kconfig Wed Nov 10 16:00:34 2004 @@ -59,6 +59,25 @@ config ARCNET_RAW to work unless talking to a copy of the same Linux arcnet driver, but perhaps marginally faster in that case. +config ARCNET_CAP + tristate "Enable CAP mode packet interface" + depends on ARCNET + help + ARCnet "cap mode" packet encapsulation. Used to get the hardware + acknowledge back to userspace. After the initial protocol byte every + packet is stuffed with an extra 4 byte "cookie" which doesn't + actually appear on the network. After transmit the driver will send + back a packet with protocol byte 0 containing the status of the + transmition: + 0=no hardware acknowledge + 1=excessive nak + 2=transmition accepted by the reciever hardware + + Received packets are also stuffed with the extra 4 bytes but it will + be random data. + + Cap only listens to protocol 1-8. + config ARCNET_COM90xx tristate "ARCnet COM90xx (normal) chipset driver" depends on ARCNET diff -puN drivers/net/arcnet/Makefile~arcnet-fixes drivers/net/arcnet/Makefile --- 25/drivers/net/arcnet/Makefile~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/Makefile Wed Nov 10 16:00:34 2004 @@ -5,6 +5,7 @@ obj-$(CONFIG_ARCNET) += arcnet.o obj-$(CONFIG_ARCNET_1201) += rfc1201.o obj-$(CONFIG_ARCNET_1051) += rfc1051.o obj-$(CONFIG_ARCNET_RAW) += arc-rawmode.o +obj-$(CONFIG_ARCNET_CAP) += capmode.o obj-$(CONFIG_ARCNET_COM90xx) += com90xx.o obj-$(CONFIG_ARCNET_COM90xxIO) += com90io.o obj-$(CONFIG_ARCNET_RIM_I) += arc-rimi.o diff -puN drivers/net/arcnet/rfc1051.c~arcnet-fixes drivers/net/arcnet/rfc1051.c --- 25/drivers/net/arcnet/rfc1051.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/rfc1051.c Wed Nov 10 16:00:34 2004 @@ -47,9 +47,12 @@ struct ArcProto rfc1051_proto = { .suffix = 's', .mtu = XMTU - RFC1051_HDR_SIZE, + .is_ip = 1, .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; diff -puN drivers/net/arcnet/rfc1201.c~arcnet-fixes drivers/net/arcnet/rfc1201.c --- 25/drivers/net/arcnet/rfc1201.c~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/drivers/net/arcnet/rfc1201.c Wed Nov 10 16:00:34 2004 @@ -47,10 +47,12 @@ struct ArcProto rfc1201_proto = { .suffix = 'a', .mtu = 1500, /* could be more, but some receivers can't handle it... */ + .is_ip = 1, /* This is for sending IP and ARP packages */ .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, .continue_tx = continue_tx, + .ack_tx = NULL }; diff -puN include/linux/arcdevice.h~arcnet-fixes include/linux/arcdevice.h --- 25/include/linux/arcdevice.h~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/include/linux/arcdevice.h Wed Nov 10 16:00:34 2004 @@ -25,7 +25,6 @@ #define bool int #endif - /* * RECON_THRESHOLD is the maximum number of RECON messages to receive * within one minute before printing a "cabling problem" warning. The @@ -74,6 +73,7 @@ #define D_SKB 1024 /* show skb's */ #define D_SKB_SIZE 2048 /* show skb sizes */ #define D_TIMING 4096 /* show time needed to copy buffers to card */ +#define D_DEBUG 8192 /* Very detailed debug line for line */ #ifndef ARCNET_DEBUG_MAX #define ARCNET_DEBUG_MAX (127) /* change to ~0 if you want detailed debugging */ @@ -135,6 +135,7 @@ extern int arcnet_debug; #define TXACKflag 0x02 /* transmitted msg. ackd */ #define RECONflag 0x04 /* network reconfigured */ #define TESTflag 0x08 /* test flag */ +#define EXCNAKflag 0x08 /* excesive nak flag */ #define RESETflag 0x10 /* power-on-reset */ #define RES1flag 0x20 /* reserved - usually set by jumper */ #define RES2flag 0x40 /* reserved - usually set by jumper */ @@ -162,6 +163,8 @@ extern int arcnet_debug; #define RESETclear 0x08 /* power-on-reset */ #define CONFIGclear 0x10 /* system reconfigured */ +#define EXCNAKclear 0x0E /* Clear and acknowledge the excive nak bit */ + /* flags for "load test flags" command */ #define TESTload 0x08 /* test flag (diagnostic) */ @@ -187,6 +190,7 @@ extern int arcnet_debug; struct ArcProto { char suffix; /* a for RFC1201, e for ether-encap, etc. */ int mtu; /* largest possible packet */ + int is_ip; /* This is a ip plugin - not a raw thing */ void (*rx) (struct net_device * dev, int bufnum, struct archdr * pkthdr, int length); @@ -197,9 +201,11 @@ struct ArcProto { int (*prepare_tx) (struct net_device * dev, struct archdr * pkt, int length, int bufnum); int (*continue_tx) (struct net_device * dev, int bufnum); + int (*ack_tx) (struct net_device * dev, int acked); }; -extern struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto; +extern struct ArcProto *arc_proto_map[256], *arc_proto_default, + *arc_bcast_proto, *arc_raw_proto; extern struct ArcProto arc_proto_null; @@ -251,6 +257,10 @@ struct arcnet_local { char *card_name; /* card ident string */ int card_flags; /* special card features */ + + /* On preemtive and SMB a lock is needed */ + spinlock_t lock; + /* * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of * which can be used for either sending or receiving. The new dynamic @@ -279,6 +289,8 @@ struct arcnet_local { int num_recons; /* number of RECONs between first and last. */ bool network_down; /* do we think the network is down? */ + bool excnak_pending; /* We just got an excesive nak interrupt */ + struct { uint16_t sequence; /* sequence number (incs with each packet) */ uint16_t aborted_seq; @@ -323,9 +335,10 @@ void arcnet_dump_skb(struct net_device * #endif #if (ARCNET_DEBUG_MAX & D_RX) || (ARCNET_DEBUG_MAX & D_TX) -void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc); +void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, + int take_arcnet_lock); #else -#define arcnet_dump_packet(dev, bufnum, desc) ; +#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) ; #endif void arcnet_unregister_proto(struct ArcProto *proto); diff -puN include/linux/com20020.h~arcnet-fixes include/linux/com20020.h --- 25/include/linux/com20020.h~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/include/linux/com20020.h Wed Nov 10 16:00:34 2004 @@ -34,17 +34,24 @@ int com20020_found(struct net_device *de #define ARCNET_TOTAL_SIZE 8 /* various register addresses */ -#define _INTMASK (ioaddr+0) /* writable */ -#define _STATUS (ioaddr+0) /* readable */ -#define _COMMAND (ioaddr+1) /* standard arcnet commands */ -#define _DIAGSTAT (ioaddr+1) /* diagnostic status register */ -#define _ADDR_HI (ioaddr+2) /* control registers for IO-mapped memory */ -#define _ADDR_LO (ioaddr+3) -#define _MEMDATA (ioaddr+4) /* data port for IO-mapped memory */ -#define _SUBADR (ioaddr+5) /* the extended port _XREG refers to */ -#define _CONFIG (ioaddr+6) /* configuration register */ -#define _XREG (ioaddr+7) /* extra registers (indexed by _CONFIG - or _SUBADR) */ +#ifdef CONFIG_SA1100_CT6001 +#define BUS_ALIGN 2 /* 8 bit device on a 16 bit bus - needs padding */ +#else +#define BUS_ALIGN 1 +#endif + + +#define _INTMASK (ioaddr+BUS_ALIGN*0) /* writable */ +#define _STATUS (ioaddr+BUS_ALIGN*0) /* readable */ +#define _COMMAND (ioaddr+BUS_ALIGN*1) /* standard arcnet commands */ +#define _DIAGSTAT (ioaddr+BUS_ALIGN*1) /* diagnostic status register */ +#define _ADDR_HI (ioaddr+BUS_ALIGN*2) /* control registers for IO-mapped memory */ +#define _ADDR_LO (ioaddr+BUS_ALIGN*3) +#define _MEMDATA (ioaddr+BUS_ALIGN*4) /* data port for IO-mapped memory */ +#define _SUBADR (ioaddr+BUS_ALIGN*5) /* the extended port _XREG refers to */ +#define _CONFIG (ioaddr+BUS_ALIGN*6) /* configuration register */ +#define _XREG (ioaddr+BUS_ALIGN*7) /* extra registers (indexed by _CONFIG + or _SUBADR) */ /* in the ADDR_HI register */ #define RDDATAflag 0x80 /* next access is a read (not a write) */ @@ -99,6 +106,7 @@ int com20020_found(struct net_device *de } #define ASTATUS() inb(_STATUS) +#define ADIAGSTATUS() inb(_DIAGSTAT) #define ACOMMAND(cmd) outb((cmd),_COMMAND) #define AINTMASK(msk) outb((msk),_INTMASK) diff -puN include/linux/if_arcnet.h~arcnet-fixes include/linux/if_arcnet.h --- 25/include/linux/if_arcnet.h~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/include/linux/if_arcnet.h Wed Nov 10 16:00:34 2004 @@ -23,6 +23,9 @@ * These are the defined ARCnet Protocol ID's. */ +/* CAP mode */ +/* No macro but uses 1-8 */ + /* RFC1201 Protocol ID's */ #define ARC_P_IP 212 /* 0xD4 */ #define ARC_P_IPV6 196 /* 0xC4: RFC2497 */ @@ -86,6 +89,16 @@ struct arc_eth_encap #define ETH_ENCAP_HDR_SIZE 14 +struct arc_cap +{ + uint8_t proto; + uint8_t cookie[sizeof(int)]; /* Actually NOT sent over the network */ + union { + uint8_t ack; + uint8_t raw[0]; /* 507 bytes */ + } mes; +}; + /* * The data needed by the actual arcnet hardware. * @@ -116,6 +129,7 @@ struct archdr struct arc_rfc1201 rfc1201; struct arc_rfc1051 rfc1051; struct arc_eth_encap eth_encap; + struct arc_cap cap; uint8_t raw[0]; /* 508 bytes */ } soft; }; diff -puN include/linux/if_ether.h~arcnet-fixes include/linux/if_ether.h --- 25/include/linux/if_ether.h~arcnet-fixes Wed Nov 10 16:00:34 2004 +++ 25-akpm/include/linux/if_ether.h Wed Nov 10 16:00:34 2004 @@ -91,6 +91,7 @@ #define ETH_P_IRDA 0x0017 /* Linux-IrDA */ #define ETH_P_ECONET 0x0018 /* Acorn Econet */ #define ETH_P_HDLC 0x0019 /* HDLC frames */ +#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */ /* * This is an Ethernet frame header. diff -puN include/linux/net.h~arcnet-fixes include/linux/net.h _ From akpm@osdl.org Wed Nov 10 15:58:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:59:04 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwtPw025216 for ; Wed, 10 Nov 2004 15:58:56 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwN904232; Wed, 10 Nov 2004 15:58:24 -0800 Message-Id: <200411102358.iAANwN904232@mail.osdl.org> Subject: [patch 7/7] ixgb: fix ixgb_intr looping checks To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, jesse.brandeburg@intel.com From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:34 -0800 X-archive-position: 11711 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 1604 Lines: 41 From: Jesse Brandeburg This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/ixgb/ixgb_main.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff -puN drivers/net/ixgb/ixgb_main.c~ixgb-fix-ixgb_intr-looping-checks drivers/net/ixgb/ixgb_main.c --- 25/drivers/net/ixgb/ixgb_main.c~ixgb-fix-ixgb_intr-looping-checks Wed Nov 10 16:00:38 2004 +++ 25-akpm/drivers/net/ixgb/ixgb_main.c Wed Nov 10 16:00:38 2004 @@ -1613,13 +1613,14 @@ static irqreturn_t ixgb_intr(int irq, vo __netif_rx_schedule(netdev); } #else - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_rx_irq(adapter) == FALSE) + /* yes, that is actually a & and it is meant to make sure that + * every pass through this for loop checks both receive and + * transmit queues for completed descriptors, intended to + * avoid starvation issues and assist tx/rx fairness. */ + for(i = 0; i < IXGB_MAX_INTR; i++) + if(!ixgb_clean_rx_irq(adapter) & + !ixgb_clean_tx_irq(adapter)) break; - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_tx_irq(adapter) == FALSE) - break; - /* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to * set IMS:RXDMT0 to 1 to restart the RBD timer (POLL) */ _ From akpm@osdl.org Wed Nov 10 15:58:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:59:00 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwrUH025206 for ; Wed, 10 Nov 2004 15:58:53 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwH904212; Wed, 10 Nov 2004 15:58:17 -0800 Message-Id: <200411102358.iAANwH904212@mail.osdl.org> Subject: [patch 4/7] Fix for 802.3ad shutdown issue To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, mitch.a.williams@intel.com From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:28 -0800 X-archive-position: 11710 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 2503 Lines: 71 From: "Williams, Mitch A" The patch below fixes a problem with shutting down 802.3ad bonds on the 2.6 kernel. Taking the interface down or removing the module causes a stack dump if spinlock debugging is enabled. This patch was generated from the 2.6.9 kernel. This patch has been peer reviewed by our Linux software engineering team, and the fix has been verified by our test labs. Signed-off-by: Mitch Williams Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/bonding/bond_main.c | 15 +++++++++++---- 25-akpm/drivers/net/bonding/bonding.h | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff -puN drivers/net/bonding/bonding.h~fix-for-8023ad-shutdown-issue drivers/net/bonding/bonding.h --- 25/drivers/net/bonding/bonding.h~fix-for-8023ad-shutdown-issue Wed Nov 10 16:00:36 2004 +++ 25-akpm/drivers/net/bonding/bonding.h Wed Nov 10 16:00:36 2004 @@ -36,8 +36,8 @@ #include "bond_3ad.h" #include "bond_alb.h" -#define DRV_VERSION "2.6.0" -#define DRV_RELDATE "January 14, 2004" +#define DRV_VERSION "2.6.1" +#define DRV_RELDATE "October 29, 2004" #define DRV_NAME "bonding" #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" diff -puN drivers/net/bonding/bond_main.c~fix-for-8023ad-shutdown-issue drivers/net/bonding/bond_main.c --- 25/drivers/net/bonding/bond_main.c~fix-for-8023ad-shutdown-issue Wed Nov 10 16:00:36 2004 +++ 25-akpm/drivers/net/bonding/bond_main.c Wed Nov 10 16:00:36 2004 @@ -469,6 +469,13 @@ * * Add support for VLAN hardware acceleration capable slaves. * * Add capability to tag self generated packets in ALB/TLB modes. * Set version to 2.6.0. + * 2004/10/29 - Mitch Williams + * - Fixed bug when unloading module while using 802.3ad. If + * spinlock debugging is turned on, this causes a stack dump. + * Solution is to move call to dev_remove_pack outside of the + * spinlock. + * Set version to 2.6.1. + * */ //#define BONDING_DEBUG 1 @@ -3566,15 +3573,15 @@ static int bond_close(struct net_device { struct bonding *bond = bond_dev->priv; - write_lock_bh(&bond->lock); - - bond_mc_list_destroy(bond); - if (bond->params.mode == BOND_MODE_8023AD) { /* Unregister the receive of LACPDUs */ bond_unregister_lacpdu(bond); } + write_lock_bh(&bond->lock); + + bond_mc_list_destroy(bond); + /* signal timers not to re-arm */ bond->kill_timers = 1; _ From akpm@osdl.org Wed Nov 10 15:58:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:58:53 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwjV6025175 for ; Wed, 10 Nov 2004 15:58:45 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwJ904217; Wed, 10 Nov 2004 15:58:19 -0800 Message-Id: <200411102358.iAANwJ904217@mail.osdl.org> Subject: [patch 5/7] X.25: When receiving a call, check listening sockets for matching call user data. To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, ahendry@tusc.com.au From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:30 -0800 X-archive-position: 11708 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 5563 Lines: 172 From: Andrew Hendry If a listening socket sets call user data, ensure it only receives calls with matching call user data. Also ensure incoming calls with matching call user data dont go to another listening socket. Signed-off-by: Andrew Hendry Signed-off-by: Andrew Morton --- 25-akpm/include/net/x25.h | 1 25-akpm/net/x25/af_x25.c | 62 ++++++++++++++++++++++++++++++++++----------- 25-akpm/net/x25/x25_subr.c | 19 +++++++++++++ 3 files changed, 67 insertions(+), 15 deletions(-) diff -puN include/net/x25.h~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data include/net/x25.h --- 25/include/net/x25.h~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data Wed Nov 10 16:00:37 2004 +++ 25-akpm/include/net/x25.h Wed Nov 10 16:00:37 2004 @@ -243,6 +243,7 @@ extern int x25_validate_nr(struct sock extern void x25_write_internal(struct sock *, int); extern int x25_decode(struct sock *, struct sk_buff *, int *, int *, int *, int *, int *); extern void x25_disconnect(struct sock *, int, unsigned char, unsigned char); +extern int x25_check_calluserdata(struct x25_calluserdata *,struct x25_calluserdata *); /* x25_timer.c */ extern void x25_start_heartbeat(struct sock *); diff -puN net/x25/af_x25.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data net/x25/af_x25.c --- 25/net/x25/af_x25.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/af_x25.c Wed Nov 10 16:00:37 2004 @@ -223,14 +223,19 @@ static void x25_insert_socket(struct soc /* * Find a socket that wants to accept the Call Request we just - * received. + * received. Check the full list for an address/cud match. + * If no cuds match return the next_best thing, an address match. + * Note: if a listening socket has cud set it must only get calls + * with matching cud. */ -static struct sock *x25_find_listener(struct x25_address *addr) +static struct sock *x25_find_listener(struct x25_address *addr, struct x25_calluserdata *calluserdata) { struct sock *s; + struct sock *next_best; struct hlist_node *node; read_lock_bh(&x25_list_lock); + next_best = NULL; sk_for_each(s, node, &x25_list) if ((!strcmp(addr->x25_addr, @@ -238,9 +243,24 @@ static struct sock *x25_find_listener(st !strcmp(addr->x25_addr, null_x25_address.x25_addr)) && s->sk_state == TCP_LISTEN) { - sock_hold(s); - goto found; + + /* + * Found a listening socket, now check the incoming + * call user data vs this sockets call user data + */ + if (x25_check_calluserdata(&x25_sk(s)->calluserdata, calluserdata)) { + sock_hold(s); + goto found; + } + if (x25_sk(s)->calluserdata.cudlength == 0) { + next_best = s; + } } + if (next_best) { + s = next_best; + sock_hold(s); + goto found; + } s = NULL; found: read_unlock_bh(&x25_list_lock); @@ -814,6 +834,7 @@ int x25_rx_call_request(struct sk_buff * struct x25_opt *makex25; struct x25_address source_addr, dest_addr; struct x25_facilities facilities; + struct x25_calluserdata calluserdata; int len, rc; /* @@ -828,9 +849,27 @@ int x25_rx_call_request(struct sk_buff * skb_pull(skb, x25_addr_ntoa(skb->data, &source_addr, &dest_addr)); /* - * Find a listener for the particular address. + * Get the length of the facilities, skip past them for the moment + * get the call user data because this is needed to determine + * the correct listener + */ + len = skb->data[0] + 1; + skb_pull(skb,len); + + /* + * Incoming Call User Data. + */ + if (skb->len >= 0) { + memcpy(calluserdata.cuddata, skb->data, skb->len); + calluserdata.cudlength = skb->len; + } + + skb_push(skb,len); + + /* + * Find a listener for the particular address/cud pair. */ - sk = x25_find_listener(&source_addr); + sk = x25_find_listener(&source_addr,&calluserdata); /* * We can't accept the Call Request. @@ -859,7 +898,7 @@ int x25_rx_call_request(struct sk_buff * goto out_sock_put; /* - * Remove the facilities, leaving any Call User Data. + * Remove the facilities */ skb_pull(skb, len); @@ -873,17 +912,10 @@ int x25_rx_call_request(struct sk_buff * makex25->neighbour = nb; makex25->facilities = facilities; makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask; + makex25->calluserdata = calluserdata; x25_write_internal(make, X25_CALL_ACCEPTED); - /* - * Incoming Call User Data. - */ - if (skb->len >= 0) { - memcpy(makex25->calluserdata.cuddata, skb->data, skb->len); - makex25->calluserdata.cudlength = skb->len; - } - makex25->state = X25_STATE_3; sk->sk_ack_backlog++; diff -puN net/x25/x25_subr.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data net/x25/x25_subr.c --- 25/net/x25/x25_subr.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_subr.c Wed Nov 10 16:00:37 2004 @@ -367,3 +367,22 @@ void x25_check_rbuf(struct sock *sk) x25_stop_timer(sk); } } + +/* + * Compare 2 calluserdata structures, used to find correct listening sockets + * when call user data is used. + */ +int x25_check_calluserdata(struct x25_calluserdata *ours, struct x25_calluserdata *theirs) +{ + int i; + if (ours->cudlength != theirs->cudlength) + return 0; + + for (i=0;icudlength;i++) { + if (ours->cuddata[i] != theirs->cuddata[i]) { + return 0; + } + } + return 1; +} + _ From akpm@osdl.org Wed Nov 10 15:58:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:58:49 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwfeV025149 for ; Wed, 10 Nov 2004 15:58:43 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwC904201; Wed, 10 Nov 2004 15:58:12 -0800 Message-Id: <200411102358.iAANwC904201@mail.osdl.org> Subject: [patch 2/7] netpoll: fix null ifa_list pointer dereference To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, mpm@selenic.com, jmoyer@redhat.com From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:22 -0800 X-archive-position: 11707 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 1226 Lines: 40 From: Matt Mackall This fixes a bug where netpoll can dereference a null ifa_list pointer when not supplied an IP address at module load and the interface is up but no IP is configured. Bonus: unrelated netif_running cleanup Signed-off by: Jeff Moyer Signed-off by: Matt Mackall Signed-off-by: Andrew Morton --- 25-akpm/net/core/netpoll.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -puN net/core/netpoll.c~netpoll-fix-null-ifa_list-pointer-dereference net/core/netpoll.c --- 25/net/core/netpoll.c~netpoll-fix-null-ifa_list-pointer-dereference Wed Nov 10 16:00:35 2004 +++ 25-akpm/net/core/netpoll.c Wed Nov 10 16:00:35 2004 @@ -565,7 +565,7 @@ int netpoll_setup(struct netpoll *np) goto release; } - if (!(ndev->flags & IFF_UP)) { + if (!netif_running(ndev)) { unsigned short oflags; unsigned long atmost, atleast; @@ -611,7 +611,7 @@ int netpoll_setup(struct netpoll *np) rcu_read_lock(); in_dev = __in_dev_get(ndev); - if (!in_dev) { + if (!in_dev || !in_dev->ifa_list) { rcu_read_unlock(); printk(KERN_ERR "%s: no IP address for %s, aborting\n", np->name, np->dev_name); _ From akpm@osdl.org Wed Nov 10 15:58:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:58:24 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwKa9025105 for ; Wed, 10 Nov 2004 15:58:20 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAANvr904161; Wed, 10 Nov 2004 15:57:53 -0800 Date: Wed, 10 Nov 2004 16:02:04 -0800 From: Andrew Morton To: "David S. Miller" , Jeff Garzik Cc: netdev@oss.sgi.com Subject: incoming Message-Id: <20041110160204.5d35a7e7.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11706 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 136 Lines: 5 A bunch of tricky stuff which I picked up off the internets. They've been in -mm for a while but I otherwise cannot vouch for them. From akpm@osdl.org Wed Nov 10 15:58:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:59:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANwvWi025227 for ; Wed, 10 Nov 2004 15:58:57 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwK904222; Wed, 10 Nov 2004 15:58:21 -0800 Message-Id: <200411102358.iAANwK904222@mail.osdl.org> Subject: [patch 6/7] X.25: Remove unused header files To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, ahendry@tusc.com.au From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:32 -0800 X-archive-position: 11712 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 8051 Lines: 268 From: Andrew Hendry Remove unused header files from X.25 Signed-off-by: Andrew Hendry Signed-off-by: Andrew Morton --- 25-akpm/net/x25/af_x25.c | 9 --------- 25-akpm/net/x25/sysctl_net_x25.c | 1 - 25-akpm/net/x25/x25_dev.c | 19 ------------------- 25-akpm/net/x25/x25_facilities.c | 14 -------------- 25-akpm/net/x25/x25_in.c | 14 -------------- 25-akpm/net/x25/x25_link.c | 13 ------------- 25-akpm/net/x25/x25_out.c | 13 ------------- 25-akpm/net/x25/x25_subr.c | 14 -------------- 25-akpm/net/x25/x25_timer.c | 14 -------------- 9 files changed, 111 deletions(-) diff -puN net/x25/af_x25.c~x25-remove-unused-header-files net/x25/af_x25.c --- 25/net/x25/af_x25.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/af_x25.c Wed Nov 10 16:00:37 2004 @@ -34,28 +34,19 @@ #include #include #include -#include -#include -#include #include #include #include #include -#include #include -#include -#include #include #include #include #include #include -#include #include #include #include /* For TIOCINQ/OUTQ */ -#include -#include #include #include #include diff -puN net/x25/sysctl_net_x25.c~x25-remove-unused-header-files net/x25/sysctl_net_x25.c --- 25/net/x25/sysctl_net_x25.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/sysctl_net_x25.c Wed Nov 10 16:00:37 2004 @@ -5,7 +5,6 @@ * Added /proc/sys/net/x25 directory entry (empty =) ). [MS] */ -#include #include #include #include diff -puN net/x25/x25_dev.c~x25-remove-unused-header-files net/x25/x25_dev.c --- 25/net/x25/x25_dev.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_dev.c Wed Nov 10 16:00:37 2004 @@ -18,29 +18,10 @@ */ #include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include /* For TIOCINQ/OUTQ */ -#include -#include -#include -#include #include #include diff -puN net/x25/x25_facilities.c~x25-remove-unused-header-files net/x25/x25_facilities.c --- 25/net/x25/x25_facilities.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_facilities.c Wed Nov 10 16:00:37 2004 @@ -19,24 +19,10 @@ * negotiation. */ -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include /* diff -puN net/x25/x25_in.c~x25-remove-unused-header-files net/x25/x25_in.c --- 25/net/x25/x25_in.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_in.c Wed Nov 10 16:00:37 2004 @@ -24,25 +24,11 @@ */ #include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include /* For ip_rcv */ #include -#include -#include -#include -#include #include static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more) diff -puN net/x25/x25_link.c~x25-remove-unused-header-files net/x25/x25_link.c --- 25/net/x25/x25_link.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_link.c Wed Nov 10 16:00:37 2004 @@ -21,25 +21,12 @@ * 2000-09-04 Henner Eisen dev_hold() / dev_put() for x25_neigh. */ -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include #include #include -#include -#include #include -#include -#include -#include #include #include diff -puN net/x25/x25_out.c~x25-remove-unused-header-files net/x25/x25_out.c --- 25/net/x25/x25_out.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_out.c Wed Nov 10 16:00:37 2004 @@ -22,24 +22,11 @@ * needed cleaned seq-number fields. */ -#include -#include #include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include static int x25_pacsize_to_bytes(unsigned int pacsize) diff -puN net/x25/x25_subr.c~x25-remove-unused-header-files net/x25/x25_subr.c --- 25/net/x25/x25_subr.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_subr.c Wed Nov 10 16:00:37 2004 @@ -21,25 +21,11 @@ * jun/24/01 Arnaldo C. Melo use skb_queue_purge, cleanups */ -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include #include /* diff -puN net/x25/x25_timer.c~x25-remove-unused-header-files net/x25/x25_timer.c --- 25/net/x25/x25_timer.c~x25-remove-unused-header-files Wed Nov 10 16:00:37 2004 +++ 25-akpm/net/x25/x25_timer.c Wed Nov 10 16:00:37 2004 @@ -20,24 +20,10 @@ */ #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include static void x25_heartbeat_expiry(unsigned long); _ From akpm@osdl.org Wed Nov 10 15:59:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 15:59:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAANx19K025317 for ; Wed, 10 Nov 2004 15:59:01 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAANwE904206; Wed, 10 Nov 2004 15:58:14 -0800 Message-Id: <200411102358.iAANwE904206@mail.osdl.org> Subject: [patch 3/7] E1000 stop working after resume To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, shaohua.li@intel.com From: akpm@osdl.org Date: Wed, 10 Nov 2004 16:02:25 -0800 X-archive-position: 11713 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Content-Length: 973 Lines: 29 From: Li Shaohua Obviously pci_enable_device should be called after pci_restore_state. Signed-off-by: Li Shaohua Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/e1000/e1000_main.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) diff -puN drivers/net/e1000/e1000_main.c~e1000-stop-working-after-resume drivers/net/e1000/e1000_main.c --- 25/drivers/net/e1000/e1000_main.c~e1000-stop-working-after-resume Wed Nov 10 16:00:36 2004 +++ 25-akpm/drivers/net/e1000/e1000_main.c Wed Nov 10 16:00:36 2004 @@ -2885,9 +2885,11 @@ e1000_resume(struct pci_dev *pdev) struct e1000_adapter *adapter = netdev->priv; uint32_t manc, ret; - ret = pci_enable_device(pdev); pci_set_power_state(pdev, 0); pci_restore_state(pdev); + ret = pci_enable_device(pdev); + if (pdev->is_busmaster) + pci_set_master(pdev); pci_enable_wake(pdev, 3, 0); pci_enable_wake(pdev, 4, 0); /* 4 == D3 cold */ _ From piggin@cyberone.com.au Wed Nov 10 17:23:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 17:23:52 -0800 (PST) Received: from mail.iinet.net.au (mail-03.iinet.net.au [203.59.3.35]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAB1Ng1t001528 for ; Wed, 10 Nov 2004 17:23:45 -0800 Received: (qmail 3481 invoked from network); 11 Nov 2004 01:23:14 -0000 Received: from unknown (HELO chimp.local.net) (203.173.2.23) by mail.iinet.net.au with SMTP; 11 Nov 2004 01:23:14 -0000 Received: from didi.local.net ([192.168.0.1]) by chimp.local.net with esmtp (Exim 4.34) id 1CS3g9-0000AB-ET; Thu, 11 Nov 2004 12:23:13 +1100 Message-ID: <4192BF01.1090509@cyberone.com.au> Date: Thu, 11 Nov 2004 12:23:13 +1100 From: Nick Piggin User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040820 Debian/1.7.2-4 X-Accept-Language: en MIME-Version: 1.0 To: Stefan Schmidt CC: Marcelo Tosatti , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures References: <20041109223558.GR1309@mail.muni.cz> <20041109144607.2950a41a.akpm@osdl.org> <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> <20041110120624.GF28163@zaphods.net> <20041110085831.GB10740@logos.cnet> <20041110124810.GG28163@zaphods.net> In-Reply-To: <20041110124810.GG28163@zaphods.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11714 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: piggin@cyberone.com.au Precedence: bulk X-list: netdev Content-Length: 1179 Lines: 37 Stefan Schmidt wrote: >On Wed, Nov 10, 2004 at 06:58:31AM -0200, Marcelo Tosatti wrote: > >>>>>Can you try the following patch, please? It is diffed against 2.6.10-rc1, >>>>> >>>I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will try >>>latest bk next. >>> > >>>>I set it back to CONFIG_PACKET_MMAP=y and if the application does not freeze >>>>for some hours at this load we can blame at least this issue (-1 EAGAIN) on >>>>that parameter. >>>> >>>Nope, that didn't change anything, still getting EAGAIN, checked two times. >>> >>Its not clear to me - do you have Nick's watermark patch in? >> >Yes i have vm.min_free_kbytes=8192 and Nick's patch in mm4. I'll try >rc1-bk19 with his restore-atomic-buffer patch in a few minutes. > > You'll actually want to increase min_free_kbytes in order to have the same amount of memory free as 2.6.8 did. Start by applying my patch and using the default min_free_kbytes. Then increase it until the page allocation failures stop, and let us know what the end result was. BTW we should probably have a message in the page allocation failure path to tell people to try increasing /proc/sys/vm/min_free_kbytes... From herbert@gondor.apana.org.au Wed Nov 10 20:22:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 20:22:13 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAB4M3un011057 for ; Wed, 10 Nov 2004 20:22:04 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CS6Sq-00060n-00; Thu, 11 Nov 2004 15:21:40 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CS6Sm-0004SS-00; Thu, 11 Nov 2004 15:21:36 +1100 Date: Thu, 11 Nov 2004 15:21:36 +1100 To: "David S. Miller" , netdev@oss.sgi.com Subject: [NETLINK] Fix mc_list operations Message-ID: <20041111042136.GA17076@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11715 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1441 Lines: 52 --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: While doing the 2.4 version of the netlink patch, I noticed a bug in my mc_list code. First of all it wasn't holding the table lock when adding nodes to the list. It also didn't take the node off the list when multicast is switched off. The following patch fixes it for 2.6. I will simply fix it in the 2.4 version. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/netlink/af_netlink.c 1.61 vs edited ===== --- 1.61/net/netlink/af_netlink.c 2004-11-06 18:49:54 +11:00 +++ edited/net/netlink/af_netlink.c 2004-11-11 15:09:40 +11:00 @@ -471,9 +471,16 @@ return err; } - nlk->groups = nladdr->nl_groups; - if (nladdr->nl_groups) + if (!nladdr->nl_groups && !nlk->groups) + return 0; + + netlink_table_grab(); + if (nlk->groups && !nladdr->nl_groups) + __sk_del_bind_node(sk); + else if (!nlk->groups && nladdr->nl_groups) sk_add_bind_node(sk, &nl_table[sk->sk_protocol].mc_list); + nlk->groups = nladdr->nl_groups; + netlink_table_ungrab(); return 0; } --ReaqsoxgOBHFXBhH-- From anton@ozlabs.org Wed Nov 10 21:07:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 21:07:35 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAB57Raj012456 for ; Wed, 10 Nov 2004 21:07:29 -0800 Received: by ozlabs.org (Postfix, from userid 1010) id 04D752BF4C; Thu, 11 Nov 2004 16:07:03 +1100 (EST) Date: Thu, 11 Nov 2004 16:06:08 +1100 From: Anton Blanchard To: netdev@oss.sgi.com Subject: some TSO analysis Message-ID: <20041111050608.GG1922@krispykreme.ozlabs.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-archive-position: 11716 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anton@samba.org Precedence: bulk X-list: netdev Content-Length: 3062 Lines: 105 Hi, Some web server benchmarking on recent 2.6 shows TSO not to be the gain it was in earlier kernels. I took a quick look at varying tcp_tso_win_divisor, below are the results. Each line is one packet, with the size of each component of the packet logged. Note the 4 byte packets at the end are a workaround for an e1000 bug. The MTU is 1500 bytes. The kernel is BK from today. The test does 64kB writes or sendfiles. I noticed a few things: - In the normal copy case, it looks like we split the first page between the skb->data and the first frag. eg: data: 1634 frags: 1408 4096 4096 4096 2108 4 Is there a reason why the remaining 1408 bytes cant be stuffed into skb->data? Or is that an issue with MTU sized buffers? - TSO really doesnt come into play until we set tcp_tso_win_divisor to 2. BTW In this setup I am talking to a 2.4 machine on the same gigabit switch. At 4 the normal copy case sees some gains, but interestingly the zero copy does not. Anton tcp_tso_win_divisor = 8 (default) normal copy: data: 442 frags: data: 1634 frags: 2772 4 data: 1634 frags: 896 1876 4 data: 1634 frags: 2176 596 4 data: 1634 frags: 2772 4 data: 1634 frags: 640 2132 4 data: 1634 frags: 1920 852 4 data: 1634 frags: 2772 4 data: 1634 frags: 384 2388 4 data: 1634 frags: 1664 1108 4 zero copy: data: 66 frags: 1448 data: 66 frags: 1200 248 data: 66 frags: 1448 data: 66 frags: 1448 data: 66 frags: 952 data: 66 frags: 1448 data: 66 frags: 1448 data: 66 frags: 1200 248 data: 66 frags: 1448 data: 66 frags: 1448 tcp_tso_win_divisor = 4 normal copy: data: 1634 frags: 2176 4096 844 4 data: 1634 frags: 3200 3916 4 data: 1634 frags: 128 3020 4 data: 1634 frags: 1024 4096 1996 4 data: 1634 frags: 2048 4096 972 4 data: 1634 frags: 3072 4044 4 data: 1634 frags: 4096 3020 4 data: 1634 frags: 1024 4096 1996 4 data: 1634 frags: 2048 4096 972 4 data: 1634 frags: 3072 4044 4 zero copy: data: 66 frags: 1448 data: 66 frags: 1448 data: 66 frags: 1200 248 data: 66 frags: 1448 data: 66 frags: 1448 data: 66 frags: 952 data: 66 frags: 1448 data: 66 frags: 1448 data: 66 frags: 1200 248 data: 66 frags: 1448 tcp_tso_win_divisor = 2 normal copy: data: 1634 frags: 1408 4096 4096 4096 2108 4 data: 1634 frags: 1920 4096 4096 4096 1596 4 data: 1634 frags: 2432 4096 4096 4096 1084 4 data: 1634 frags: 2944 4096 4096 4096 572 4 data: 1634 frags: 3456 4096 4096 4096 60 4 data: 1634 frags: 3968 4096 4096 3644 4 data: 1634 frags: 384 4096 4096 4096 3132 4 data: 1634 frags: 896 4096 4096 4096 2620 4 data: 1634 frags: 2432 4096 4096 4096 1084 4 zero copy: data: 66 frags: 2304 4096 4096 4096 2780 4 data: 66 frags: 1312 4096 4096 4096 3772 4 data: 66 frags: 320 4096 4096 4096 4096 668 4 data: 66 frags: 3424 4096 4096 4096 1660 4 data: 66 frags: 2432 4096 4096 4096 2652 4 data: 66 frags: 1440 4096 4096 4096 3644 4 data: 66 frags: 448 4096 4096 4096 4096 540 4 data: 66 frags: 3552 4096 4096 4096 1532 4 data: 66 frags: 2560 4096 4096 4096 2524 4 data: 66 frags: 1568 4096 4096 4096 3516 4 From sebastian.ionita@focomunicatii.ro Wed Nov 10 22:14:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 22:14:18 -0800 (PST) Received: from focomunicatii.ro (ns.focomunicatii.ro [212.146.75.6]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAB6ECCb015407 for ; Wed, 10 Nov 2004 22:14:13 -0800 Received: (qmail 26313 invoked by uid 89); 11 Nov 2004 06:12:10 -0000 Message-ID: <20041111061210.26312.qmail@focomunicatii.ro> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> <20041109232510.GA5582@electric-eye.fr.zoreil.com> <20041110201010.18341.qmail@focomunicatii.ro> <20041110212835.GA23758@electric-eye.fr.zoreil.com> In-Reply-To: <20041110212835.GA23758@electric-eye.fr.zoreil.com> From: sebastian.ionita@focomunicatii.ro To: Francois Romieu Cc: seby@focomunicatii.ro, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Date: Thu, 11 Nov 2004 08:12:10 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="utf-8" Content-Transfer-Encoding: 7bit X-archive-position: 11717 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sebastian.ionita@focomunicatii.ro Precedence: bulk X-list: netdev Content-Length: 1049 Lines: 39 Francois Romieu writes: > sebastian.ionita@focomunicatii.ro : > [...] >> The kernel compiles but I have 1 unresolved simbole in the via-velocity >> modul >> depmod: *** Unresolved symbols in >> /lib/modules/2.4.28-rc2/kernel/drivers/net/via-velocity.o >> depmod: crc_ccitt_R3771b461 > > Can you grep for crc_ccitt the output of 'nm lib/lib.a' in your build > tree and check that CONFIG_CRC_CCITT is enabled in your .config ? > > crc_ccitt is EXPORT_SYMBOLed by lib/crc-ccitt.c and should be linked in > your new kernel. Yes is enabled in my .config and it exists, crc-ccitt.o: 00000000 T crc_ccitt 00000000 R crc_ccitt_table 0000001a R __kstrtab_crc_ccitt 00000000 R __kstrtab_crc_ccitt_table 00000008 R __ksymtab_crc_ccitt 00000000 R __ksymtab_crc_ccitt_table but why then depmod say's that it isn't there? > > -- > Ueimor ____________________________________________________________ SC. FO Comunicatii SRL. Sebastian Ionita Administrator Sistem mobil: 0724 212408 tel fix: 0264 450456 From herbert@gondor.apana.org.au Wed Nov 10 23:20:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 10 Nov 2004 23:20:58 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAB7Kmxp017460 for ; Wed, 10 Nov 2004 23:20:49 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CS9Fp-0006ho-00; Thu, 11 Nov 2004 18:20:25 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CS9Fm-0004hC-00; Thu, 11 Nov 2004 18:20:22 +1100 From: Herbert Xu To: anton@samba.org (Anton Blanchard) Subject: Re: some TSO analysis Cc: netdev@oss.sgi.com Organization: Core In-Reply-To: <20041111050608.GG1922@krispykreme.ozlabs.ibm.com> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Thu, 11 Nov 2004 18:20:22 +1100 X-archive-position: 11718 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1589 Lines: 42 Anton Blanchard wrote: > > Some web server benchmarking on recent 2.6 shows TSO not to be the gain > it was in earlier kernels. I took a quick look at varying > tcp_tso_win_divisor, below are the results. Thanks for doing the testing. It's very interesting. > I noticed a few things: > > - In the normal copy case, it looks like we split the first page between > the skb->data and the first frag. eg: > > data: 1634 frags: 1408 4096 4096 4096 2108 4 > > Is there a reason why the remaining 1408 bytes cant be stuffed into > skb->data? Or is that an issue with MTU sized buffers? The reason is that the skb has to accomodate other things like headers and skb_shared_info. It seems to have added up to a quite considerable value in your case. Perhaps sendmsg should check whether the data can fit in the space available in skb->data, and if not just go for a fragment right away. > - TSO really doesnt come into play until we set tcp_tso_win_divisor to > 2. BTW In this setup I am talking to a 2.4 machine on the same gigabit > switch. At 4 the normal copy case sees some gains, but interestingly > the zero copy does not. This is understandable. You really need to have a rcv window that's much bigger than 64K to have any chance of filling up the TSO packet with tcp_tso_win_divisor set to 8. BTW, how did you measure the gains? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From anton@ozlabs.org Thu Nov 11 00:38:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 00:38:52 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAB8chmP023263 for ; Thu, 11 Nov 2004 00:38:44 -0800 Received: by ozlabs.org (Postfix, from userid 1010) id D23EE2BF45; Thu, 11 Nov 2004 19:38:20 +1100 (EST) Date: Thu, 11 Nov 2004 19:36:47 +1100 From: Anton Blanchard To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: some TSO analysis Message-ID: <20041111083647.GA20769@krispykreme.ozlabs.ibm.com> References: <20041111050608.GG1922@krispykreme.ozlabs.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040907i X-archive-position: 11719 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anton@samba.org Precedence: bulk X-list: netdev Content-Length: 1311 Lines: 35 > > data: 1634 frags: 1408 4096 4096 4096 2108 4 > > > > Is there a reason why the remaining 1408 bytes cant be stuffed into > > skb->data? Or is that an issue with MTU sized buffers? > > The reason is that the skb has to accomodate other things like > headers and skb_shared_info. It seems to have added up to a > quite considerable value in your case. > > Perhaps sendmsg should check whether the data can fit in the space > available in skb->data, and if not just go for a fragment right away. Originally I thought we could save ourselves a fragment. However thinking about it more we will always have at least the headers in skb->data. If so there isnt much to gain by spilling into the fragment straight away. Or am I wrong? > This is understandable. You really need to have a rcv window that's > much bigger than 64K to have any chance of filling up the TSO packet > with tcp_tso_win_divisor set to 8. That makes sense. > BTW, how did you measure the gains? The TSO gains? On older 2.6 the TSO gain was easy to see on a web benchmark. On recent kernels it isnt, but we havent tested a divisor of 4 or 2 yet. Im interested if the divisor of 8 was based on some testing, or if we can tune the default a bit. It would be nice for TSO to kick in on normal workloads (like web serving). Anton From mark@mwborst.com Thu Nov 11 02:19:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 02:19:40 -0800 (PST) Received: from mn-2 (mn-2.atm.tut.fi [130.230.52.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABAJZtK026596 for ; Thu, 11 Nov 2004 02:19:36 -0800 Received: from mark by mn-2 with local (Exim 3.36 #1 (Debian)) id 1CSC25-0006Qr-00; Thu, 11 Nov 2004 12:18:25 +0200 Subject: Re: node-local multicast issues From: Mark Borst To: Brian Haley Cc: netdev@oss.sgi.com In-Reply-To: <4192701A.3090908@hp.com> References: <1100096251.22964.7.camel@mn-2> <4192701A.3090908@hp.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Thu, 11 Nov 2004 12:18:24 +0200 Message-Id: <1100168304.24452.5.camel@mn-2> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 X-archive-position: 11720 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mark@borst.org Precedence: bulk X-list: netdev Content-Length: 557 Lines: 23 On Wed, 2004-11-10 at 14:46 -0500, Brian Haley wrote: > Mark Borst wrote: > > > On another note: 'ping6 ff02::1' gives "connect: Invalid argument" on > > linux. > > You've got to use -I with that, maybe ping6 could give a hint. I found that too. With -I it works fine. > > > The only implementation that gives me replies is Solaris. > > My trusty Tru64 UNIX box works as well :) Good ;) My testing wasn't anything near exhaustive, just a short test ;) -- Mark Borst Researcher Network and Protocols Group Tampere University of Technology, Finland From mark@mwborst.com Thu Nov 11 03:23:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 03:23:12 -0800 (PST) Received: from mn-2 (mn-2.atm.tut.fi [130.230.52.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABBN15O030784 for ; Thu, 11 Nov 2004 03:23:02 -0800 Received: from mark by mn-2 with local (Exim 3.36 #1 (Debian)) id 1CSD1W-0006Tv-00; Thu, 11 Nov 2004 13:21:54 +0200 Subject: Re: node-local multicast issues From: Mark Borst To: David Stevens Cc: hessu@cs.tut.fi, netdev@oss.sgi.com In-Reply-To: <1100096251.22964.7.camel@mn-2> References: <1100096251.22964.7.camel@mn-2> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Thu, 11 Nov 2004 13:21:53 +0200 Message-Id: <1100172113.24452.10.camel@mn-2> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 X-archive-position: 11721 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mark@mwborst.com Precedence: bulk X-list: netdev Content-Length: 2243 Lines: 59 It's a pity that I have to reply to myself. On Wed, 2004-11-10 at 16:17 +0200, Mark Borst wrote: > On Tue, 2004-11-09 at 15:21 -0800, David Stevens wrote: > > The loopback device doesn't have IFF_MULTICAST set, so technically > > it is not a multicast-capable device, and you shouldn't be able to join a > > group on it. > > That is Linux-specific, right? At least KAME's 'lo' does support > multicast, and their README says: > > On Windows I don't see 'lo' joining ff01::1. > > RFC 3513 tells me: > > 2.7.1 Pre-Defined Multicast Addresses > > All Nodes Addresses: FF01:0:0:0:0:0:0:1 > FF02:0:0:0:0:0:0:1 > > The above multicast addresses identify the group of all IPv6 nodes, > within scope 1 (interface-local) or 2 (link-local). > > Does that imply that the linux stack doesn't conform to RFC 3513? My tests show that interface-local multicast actually works, when I get my implementation right. So interface-local multicast on 'lo' does work. However, pinging ff01::1 on 'lo' still doesn't get me any reply. > > > I think the way it ought to work is that you join the group on any device, > > with IPV6_MULTICAST_LOOP set and local guys should hear the node-local > > multicasts, but it shouldn't be sent on the wire. Multicasting could be supported on > > loopback, too, but it doesn't matter all that much unless there are no multicast-capable > > real devices. > > > However, it appears that node-local multicasts are being sent out > > the device, at least on an early 2.6 kernel I did a quick test with. There probably > > isn't anything enforcing the node-locality in the send path, which I would consider a > > bug. :-) > > Even more interesting: an other node responded to 'ping6 ff01::1' so > there is some bug somewhere ;) > > On another note: 'ping6 ff02::1' gives "connect: Invalid argument" on > linux. On KAME it says "ping6: UDP connect: Network is unreachable". The > only implementation that gives me replies is Solaris. This also sounds > like a bug to me. As already mentioned, one needs to specify the interface with -I to make it work. -- Mark Borst Researcher Network and Protocols Group Tampere University of Technology, Finland From davem@davemloft.net Thu Nov 11 10:39:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 10:39:56 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABIdoIt032000 for ; Thu, 11 Nov 2004 10:39:51 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSJeI-0002KH-00; Thu, 11 Nov 2004 10:26:22 -0800 Date: Thu, 11 Nov 2004 10:26:22 -0800 From: "David S. Miller" To: Anton Blanchard Cc: herbert@gondor.apana.org.au, netdev@oss.sgi.com Subject: Re: some TSO analysis Message-Id: <20041111102622.19fb1a22.davem@davemloft.net> In-Reply-To: <20041111083647.GA20769@krispykreme.ozlabs.ibm.com> References: <20041111050608.GG1922@krispykreme.ozlabs.ibm.com> <20041111083647.GA20769@krispykreme.ozlabs.ibm.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11722 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 423 Lines: 11 On Thu, 11 Nov 2004 19:36:47 +1100 Anton Blanchard wrote: > Im interested if the divisor of 8 was based on some testing, or if we > can tune the default a bit. It would be nice for TSO to kick in on > normal workloads (like web serving). It was the best compromise found between performance and burstyness. If you set it too small, you get large bursts of TSO created frames which is very undesirable. From jhigdon@linuxfools.org Thu Nov 11 11:08:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 11:09:01 -0800 (PST) Received: from loki.linuxfools.org (linuxfools.org [216.107.2.99]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABJ8trc007691 for ; Thu, 11 Nov 2004 11:08:56 -0800 Received: by loki.linuxfools.org (Postfix, from userid 1001) id 7B6233FD9; Thu, 11 Nov 2004 13:31:11 -0500 (EST) Date: Thu, 11 Nov 2004 13:31:11 -0500 From: jhigdon@linuxfools.org To: Nick Piggin Cc: Stefan Schmidt , Marcelo Tosatti , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: 2.6.10-rc1-mm4 -1 EAGAIN after allocation failure was: Re: Kernel 2.6.9 Multiple Page Allocation Failures Message-ID: <20041111183111.GA23564@linuxfools.org> References: <20041109235201.GC20754@zaphods.net> <20041110012733.GD20754@zaphods.net> <20041109173920.08746dbd.akpm@osdl.org> <20041110020327.GE20754@zaphods.net> <419197EA.9090809@cyberone.com.au> <20041110102854.GI20754@zaphods.net> <20041110120624.GF28163@zaphods.net> <20041110085831.GB10740@logos.cnet> <20041110124810.GG28163@zaphods.net> <4192BF01.1090509@cyberone.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4192BF01.1090509@cyberone.com.au> User-Agent: Mutt/1.3.28i X-archive-position: 11723 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jhigdon@linuxfools.org Precedence: bulk X-list: netdev Content-Length: 9249 Lines: 191 On Thu, Nov 11, 2004 at 12:23:13PM +1100, Nick Piggin wrote: > > > Stefan Schmidt wrote: > > >On Wed, Nov 10, 2004 at 06:58:31AM -0200, Marcelo Tosatti wrote: > > > >>>>>Can you try the following patch, please? It is diffed against > >>>>>2.6.10-rc1, > >>>>> > >>>I did. No apparent change with mm4 and vm.min_free_kbytes = 8192. I will > >>>try > >>>latest bk next. > >>> > > > >>>>I set it back to CONFIG_PACKET_MMAP=y and if the application does not > >>>>freeze > >>>>for some hours at this load we can blame at least this issue (-1 > >>>>EAGAIN) on > >>>>that parameter. > >>>> > >>>Nope, that didn't change anything, still getting EAGAIN, checked two > >>>times. > >>> > >>Its not clear to me - do you have Nick's watermark patch in? > >> > >Yes i have vm.min_free_kbytes=8192 and Nick's patch in mm4. I'll try > >rc1-bk19 with his restore-atomic-buffer patch in a few minutes. > > > > > > You'll actually want to increase min_free_kbytes in order to have the same > amount of memory free as 2.6.8 did. > > Start by applying my patch and using the default min_free_kbytes. Then > increase > it until the page allocation failures stop, and let us know what the end > result > was. > > BTW we should probably have a message in the page allocation failure path > to tell people to try increasing /proc/sys/vm/min_free_kbytes... > We are having a similar problem (at least i think). although I have up'd the min_free_kbytes to what was suggested in this post and havent seen these messages _yet_. Nov 7 13:02:23 aragorn kernel: swapper: page allocation failure. order:1, mode:0x20 Nov 7 13:02:23 aragorn kernel: [] __alloc_pages+0x1b3/0x358 Nov 7 13:02:23 aragorn kernel: [] __get_free_pages+0x25/0x3f Nov 7 13:02:23 aragorn kernel: [] kmem_getpages+0x21/0xc9 Nov 7 13:02:23 aragorn kernel: [] cache_grow+0xab/0x14d Nov 7 13:02:23 aragorn kernel: [] cache_alloc_refill+0x174/0x219 Nov 7 13:02:23 aragorn kernel: [] kmem_cache_alloc+0x4b/0x4d Nov 7 13:02:23 aragorn kernel: [] sk_alloc+0x34/0xa7 Nov 7 13:02:23 aragorn kernel: [] tcp_create_openreq_child+0x34/0x558 Nov 7 13:02:23 aragorn kernel: [] tcp_v4_syn_recv_sock+0x47/0x2ea Nov 7 13:02:23 aragorn kernel: [] tcp_check_req+0x1cb/0x4df Nov 7 13:02:23 aragorn kernel: [] tg3_start_xmit+0x3f4/0x4f5 [tg3] Nov 7 13:02:23 aragorn kernel: [] tg3_start_xmit+0x3f4/0x4f5 [tg3] Nov 7 13:02:23 aragorn kernel: [] dev_queue_xmit+0x120/0x284 Nov 7 13:02:23 aragorn kernel: [] qdisc_restart+0x17/0x1d9 Nov 7 13:02:23 aragorn kernel: [] dev_queue_xmit+0x120/0x284 Nov 7 13:02:23 aragorn kernel: [] ip_finish_output+0xbb/0x1b9 Nov 7 13:02:23 aragorn kernel: [] ip_queue_xmit+0x3f1/0x500 Nov 7 13:02:23 aragorn kernel: [] try_to_wake_up+0x1de/0x26c Nov 7 13:02:23 aragorn kernel: [] recalc_task_prio+0x93/0x188 Nov 7 13:02:23 aragorn kernel: [] activate_task+0x90/0xa4 Nov 7 13:02:23 aragorn kernel: [] try_to_wake_up+0x1de/0x26c Nov 7 13:02:23 aragorn kernel: [] __wake_up_common+0x3f/0x5e Nov 7 13:02:23 aragorn kernel: [] __wake_up+0x40/0x56 Nov 7 13:02:23 aragorn kernel: [] tcp_v4_hnd_req+0x66/0x20a Nov 7 13:02:23 aragorn kernel: [] tcp_child_process+0x53/0xc4 Nov 7 13:02:23 aragorn kernel: [] tcp_v4_do_rcv+0xd7/0x12d Nov 7 13:02:23 aragorn kernel: [] tcp_v4_rcv+0x6d8/0x90f Nov 7 13:02:23 aragorn kernel: [] recalc_task_prio+0x93/0x188 Nov 7 13:02:23 aragorn kernel: [] ip_local_deliver+0xb5/0x201 Nov 7 13:02:23 aragorn kernel: [] ip_rcv+0x33c/0x47e Nov 7 13:02:23 aragorn kernel: [] find_busiest_group+0xe4/0x316 Nov 7 13:02:23 aragorn kernel: [] netif_receive_skb+0x1ac/0x242 Nov 7 13:02:23 aragorn kernel: [] alloc_skb+0x47/0xe0 Nov 7 13:02:23 aragorn kernel: [] tg3_rx+0x2a7/0x3fa [tg3] Nov 7 13:02:23 aragorn kernel: [] tg3_poll+0x8d/0x130 [tg3] Nov 7 13:02:23 aragorn kernel: [] net_rx_action+0x77/0xf6 Nov 7 13:02:23 aragorn kernel: [] __do_softirq+0xb7/0xc6 Nov 7 13:02:23 aragorn kernel: [] do_softirq+0x2d/0x2f Nov 7 13:02:23 aragorn kernel: [] do_IRQ+0x112/0x130 Nov 7 13:02:23 aragorn kernel: [] common_interrupt+0x18/0x20 Nov 7 13:02:23 aragorn kernel: [] default_idle+0x0/0x2c Nov 7 13:02:23 aragorn kernel: [] default_idle+0x29/0x2c Nov 7 13:02:23 aragorn kernel: [] cpu_idle+0x3f/0x58 Nov 7 13:02:23 aragorn kernel: [] start_kernel+0x16e/0x189 Nov 7 13:02:23 aragorn kernel: [] unknown_bootoption+0x0/0x15c Nov 7 13:02:23 aragorn kernel: swapper: page allocation failure. order:1, mode:0x20 Nov 7 13:02:23 aragorn kernel: [] __alloc_pages+0x1b3/0x358 Nov 7 13:02:23 aragorn kernel: [] __get_free_pages+0x25/0x3f Nov 7 13:02:23 aragorn kernel: [] kmem_getpages+0x21/0xc9 Nov 7 13:02:23 aragorn syslog-ng[1574]: Error accepting AF_UNIX connection, opened connections: 100, max: 100 Nov 7 13:02:23 aragorn kernel: [] cache_grow+0xab/0x14d Nov 7 13:02:23 aragorn kernel: [] cache_alloc_refill+0x174/0x219 Nov 7 13:02:23 aragorn kernel: [] kmem_cache_alloc+0x4b/0x4d Nov 7 13:02:23 aragorn kernel: [] sk_alloc+0x34/0xa7 Nov 7 13:02:23 aragorn kernel: [] tcp_create_openreq_child+0x34/0x558 Nov 7 13:02:23 aragorn kernel: [] tcp_v4_syn_recv_sock+0x47/0x2ea Nov 7 13:02:23 aragorn kernel: [] tcp_check_req+0x1cb/0x4df Nov 7 13:02:23 aragorn kernel: [] tg3_start_xmit+0x3f4/0x4f5 [tg3] Nov 7 13:02:23 aragorn kernel: [] tg3_start_xmit+0x3f4/0x4f5 [tg3] Nov 7 13:02:23 aragorn kernel: [] dev_queue_xmit+0x120/0x284 Nov 7 13:02:23 aragorn kernel: [] qdisc_restart+0x17/0x1d9 Nov 7 13:02:23 aragorn kernel: [] dev_queue_xmit+0x120/0x284 Nov 7 13:02:23 aragorn kernel: [] ip_finish_output+0xbb/0x1b9 Nov 7 13:02:23 aragorn kernel: [] recalc_task_prio+0x93/0x188 Nov 7 13:02:23 aragorn kernel: [] recalc_task_prio+0x93/0x188 Nov 7 13:02:23 aragorn kernel: [] tg3_start_xmit+0x3f4/0x4f5 [tg3] Nov 7 13:02:23 aragorn kernel: [] fib_validate_source+0x22c/0x257 Nov 7 13:02:23 aragorn kernel: [] qdisc_restart+0x17/0x1d9 Nov 7 13:02:23 aragorn kernel: [] dev_queue_xmit+0x120/0x284 Nov 7 13:02:23 aragorn kernel: [] ip_finish_output+0xbb/0x1b9 Nov 7 13:02:23 aragorn kernel: [] ip_queue_xmit+0x3f1/0x500 Nov 7 13:02:23 aragorn kernel: [] tcp_v4_hnd_req+0x66/0x20a Nov 7 13:02:23 aragorn kernel: [] ip_route_output_flow+0x2f/0x9d Nov 7 13:02:23 aragorn kernel: [] tcp_v4_do_rcv+0xd7/0x12d Nov 7 13:02:23 aragorn kernel: [] tcp_v4_rcv+0x6d8/0x90f Nov 7 13:02:23 aragorn kernel: [] ip_local_deliver+0xb5/0x201 Nov 7 13:02:23 aragorn kernel: [] ip_rcv+0x33c/0x47e Nov 7 13:02:23 aragorn kernel: [] netif_receive_skb+0x1ac/0x242 Nov 7 13:02:23 aragorn kernel: [] alloc_skb+0x47/0xe0 Nov 7 13:02:23 aragorn kernel: [] tg3_rx+0x2a7/0x3fa [tg3] Nov 7 13:02:23 aragorn kernel: [] tg3_poll+0x8d/0x130 [tg3] Nov 7 13:02:23 aragorn kernel: [] net_rx_action+0x77/0xf6 Nov 7 13:02:23 aragorn kernel: [] __do_softirq+0xb7/0xc6 Nov 7 13:02:23 aragorn kernel: [] do_IRQ+0x112/0x130 Nov 7 13:02:23 aragorn kernel: [] common_interrupt+0x18/0x20 Nov 7 13:02:23 aragorn kernel: [] default_idle+0x0/0x2c Nov 7 13:02:23 aragorn kernel: [] default_idle+0x29/0x2c Nov 7 13:02:23 aragorn kernel: [] cpu_idle+0x3f/0x58 Nov 7 13:02:23 aragorn kernel: [] start_kernel+0x16e/0x189 Nov 7 13:02:23 aragorn kernel: [] unknown_bootoption+0x0/0x15c $ lspci 0000:00:00.0 Host bridge: ServerWorks CMIC-LE Host Bridge (GC-LE chipset) (rev 33) 0000:00:00.1 Host bridge: ServerWorks CMIC-LE Host Bridge (GC-LE chipset) 0000:00:00.2 Host bridge: ServerWorks CMIC-LE Host Bridge (GC-LE chipset) 0000:00:0e.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 0000:00:0f.0 Host bridge: ServerWorks CSB5 South Bridge (rev 93) 0000:00:0f.1 IDE interface: ServerWorks CSB5 IDE Controller (rev 93) 0000:00:0f.2 USB Controller: ServerWorks OSB4/CSB5 OHCI USB Controller (rev 05) 0000:00:0f.3 ISA bridge: ServerWorks CSB5 LPC bridge 0000:00:10.0 Host bridge: ServerWorks CIOB-E I/O Bridge with Gigabit Ethernet (rev 12) 0000:00:10.2 Host bridge: ServerWorks CIOB-E I/O Bridge with Gigabit Ethernet (rev 12) 0000:00:11.0 Host bridge: ServerWorks CIOB-X2 PCI-X I/O Bridge (rev 05) 0000:00:11.2 Host bridge: ServerWorks CIOB-X2 PCI-X I/O Bridge (rev 05) 0000:02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 02) 0000:02:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 02) 0000:04:03.0 RAID bus controller: Dell PowerEdge Expandable RAID controller 4/Di (rev 02) From safari-b-netdev=oss.sgi.com-1100210339-bv5m5pspycvwwd5b@b.safari.iki.fi Thu Nov 11 13:59:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 13:59:33 -0800 (PST) Received: from fep19.inet.fi (fep19.inet.fi [194.251.242.244]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABLxOuR018608 for ; Thu, 11 Nov 2004 13:59:27 -0800 Received: from safari.iki.fi ([80.223.103.140]) by fep19.inet.fi with ESMTP id <20041111215905.QBLV5926.fep19.inet.fi@safari.iki.fi> for ; Thu, 11 Nov 2004 23:59:05 +0200 Received: (qmail 3022 invoked by uid 500); 11 Nov 2004 21:58:59 -0000 Date: Thu, 11 Nov 2004 23:58:59 +0200 From: Sami Farin To: Linux Networking Mailing List Subject: ack.lrcvtime initialization in Linux 2.6.9 Message-ID: <20041111215859.GC9589@m.safari.iki.fi> Mail-Followup-To: Linux Networking Mailing List Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 11724 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: safari-kernel@safari.iki.fi Precedence: bulk X-list: netdev Content-Length: 473 Lines: 12 when no data was received during the connection, tcpi_last_data_recv in struct tcp_info (getsockopt(...TCP_INFO...)) contains garbage value. for example, one 30-second connection had tcpi_last_data_recv=133682531. then I thought maybe I could first check if tcpi_ato==0... but no, sometimes it's 40000 (TCP_ATO_MIN) when no data was received. so, I think it would be funnier if tcpi_last_data_recv was 0 (or 4294967295, or...) when no data was received. right? :) -- From garzik@havoc.gtf.org Thu Nov 11 14:44:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 14:45:05 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABMiw8Y020090 for ; Thu, 11 Nov 2004 14:44:59 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id CCA297767; Thu, 11 Nov 2004 17:44:29 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iABMiTKH002350; Thu, 11 Nov 2004 17:44:29 -0500 Date: Thu, 11 Nov 2004 17:44:29 -0500 From: Jeff Garzik To: Andrew Morton , Linus Torvalds Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [BK PATCHES] 2.6.x net driver fixes Message-ID: <20041111224429.GA2311@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11725 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 6142 Lines: 178 Please do a bk pull bk://gkernel.bkbits.net/net-drivers-2.6 This will update the following files: drivers/net/bonding/bond_main.c | 15 +++++++++++---- drivers/net/bonding/bonding.h | 4 ++-- drivers/net/e1000/e1000_main.c | 4 +++- drivers/net/ixgb/ixgb_main.c | 13 +++++++------ net/core/netpoll.c | 4 ++-- 5 files changed, 25 insertions(+), 15 deletions(-) through these ChangeSets: (04/11/11 1.2090) [PATCH] Fix for 802.3ad shutdown issue The patch below fixes a problem with shutting down 802.3ad bonds on the 2.6 kernel. Taking the interface down or removing the module causes a stack dump if spinlock debugging is enabled. This patch was generated from the 2.6.9 kernel. This patch has been peer reviewed by our Linux software engineering team, and the fix has been verified by our test labs. Signed-off-by: Mitch Williams Signed-off-by: Andrew Morton Signed-off-by: Jeff Garzik (04/11/11 1.2089) [PATCH] ixgb: fix ixgb_intr looping checks This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg Signed-off-by: Andrew Morton Signed-off-by: Jeff Garzik (04/11/11 1.2088) [PATCH] E1000 stop working after resume Obviously pci_enable_device should be called after pci_restore_state. Signed-off-by: Li Shaohua Signed-off-by: Andrew Morton Signed-off-by: Jeff Garzik (04/11/11 1.2087) [PATCH] netpoll: fix null ifa_list pointer dereference This fixes a bug where netpoll can dereference a null ifa_list pointer when not supplied an IP address at module load and the interface is up but no IP is configured. Bonus: unrelated netif_running cleanup Signed-off by: Jeff Moyer Signed-off by: Matt Mackall Signed-off-by: Andrew Morton Signed-off-by: Jeff Garzik diff -Nru a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c --- a/drivers/net/bonding/bond_main.c 2004-11-11 17:43:44 -05:00 +++ b/drivers/net/bonding/bond_main.c 2004-11-11 17:43:44 -05:00 @@ -469,6 +469,13 @@ * * Add support for VLAN hardware acceleration capable slaves. * * Add capability to tag self generated packets in ALB/TLB modes. * Set version to 2.6.0. + * 2004/10/29 - Mitch Williams + * - Fixed bug when unloading module while using 802.3ad. If + * spinlock debugging is turned on, this causes a stack dump. + * Solution is to move call to dev_remove_pack outside of the + * spinlock. + * Set version to 2.6.1. + * */ //#define BONDING_DEBUG 1 @@ -3566,14 +3573,14 @@ { struct bonding *bond = bond_dev->priv; - write_lock_bh(&bond->lock); - - bond_mc_list_destroy(bond); - if (bond->params.mode == BOND_MODE_8023AD) { /* Unregister the receive of LACPDUs */ bond_unregister_lacpdu(bond); } + + write_lock_bh(&bond->lock); + + bond_mc_list_destroy(bond); /* signal timers not to re-arm */ bond->kill_timers = 1; diff -Nru a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h --- a/drivers/net/bonding/bonding.h 2004-11-11 17:43:44 -05:00 +++ b/drivers/net/bonding/bonding.h 2004-11-11 17:43:44 -05:00 @@ -36,8 +36,8 @@ #include "bond_3ad.h" #include "bond_alb.h" -#define DRV_VERSION "2.6.0" -#define DRV_RELDATE "January 14, 2004" +#define DRV_VERSION "2.6.1" +#define DRV_RELDATE "October 29, 2004" #define DRV_NAME "bonding" #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c --- a/drivers/net/e1000/e1000_main.c 2004-11-11 17:43:44 -05:00 +++ b/drivers/net/e1000/e1000_main.c 2004-11-11 17:43:44 -05:00 @@ -2885,9 +2885,11 @@ struct e1000_adapter *adapter = netdev->priv; uint32_t manc, ret; - ret = pci_enable_device(pdev); pci_set_power_state(pdev, 0); pci_restore_state(pdev); + ret = pci_enable_device(pdev); + if (pdev->is_busmaster) + pci_set_master(pdev); pci_enable_wake(pdev, 3, 0); pci_enable_wake(pdev, 4, 0); /* 4 == D3 cold */ diff -Nru a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c --- a/drivers/net/ixgb/ixgb_main.c 2004-11-11 17:43:44 -05:00 +++ b/drivers/net/ixgb/ixgb_main.c 2004-11-11 17:43:44 -05:00 @@ -1613,13 +1613,14 @@ __netif_rx_schedule(netdev); } #else - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_rx_irq(adapter) == FALSE) + /* yes, that is actually a & and it is meant to make sure that + * every pass through this for loop checks both receive and + * transmit queues for completed descriptors, intended to + * avoid starvation issues and assist tx/rx fairness. */ + for(i = 0; i < IXGB_MAX_INTR; i++) + if(!ixgb_clean_rx_irq(adapter) & + !ixgb_clean_tx_irq(adapter)) break; - for (i = 0; i < IXGB_MAX_INTR; i++) - if (ixgb_clean_tx_irq(adapter) == FALSE) - break; - /* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to * set IMS:RXDMT0 to 1 to restart the RBD timer (POLL) */ diff -Nru a/net/core/netpoll.c b/net/core/netpoll.c --- a/net/core/netpoll.c 2004-11-11 17:43:44 -05:00 +++ b/net/core/netpoll.c 2004-11-11 17:43:44 -05:00 @@ -565,7 +565,7 @@ goto release; } - if (!(ndev->flags & IFF_UP)) { + if (!netif_running(ndev)) { unsigned short oflags; unsigned long atmost, atleast; @@ -611,7 +611,7 @@ rcu_read_lock(); in_dev = __in_dev_get(ndev); - if (!in_dev) { + if (!in_dev || !in_dev->ifa_list) { rcu_read_unlock(); printk(KERN_ERR "%s: no IP address for %s, aborting\n", np->name, np->dev_name); From safari-b-netdev=oss.sgi.com-1100214054-46lgmpdoa6zki6cn@b.safari.iki.fi Thu Nov 11 15:01:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:01:19 -0800 (PST) Received: from fep18.inet.fi (fep18.inet.fi [194.251.242.243]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABN1D8K021057 for ; Thu, 11 Nov 2004 15:01:15 -0800 Received: from safari.iki.fi ([80.223.103.140]) by fep18.inet.fi with ESMTP id <20041111230055.PPSF29995.fep18.inet.fi@safari.iki.fi> for ; Fri, 12 Nov 2004 01:00:55 +0200 Received: (qmail 5146 invoked by uid 500); 11 Nov 2004 23:00:54 -0000 Date: Fri, 12 Nov 2004 01:00:54 +0200 From: Sami Farin To: Linux Networking Mailing List Subject: ss shows invalid ipv6 addresses Message-ID: <20041111230054.GD9589@m.safari.iki.fi> Mail-Followup-To: Linux Networking Mailing List Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 11726 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: safari-kernel@safari.iki.fi Precedence: bulk X-list: netdev Content-Length: 796 Lines: 17 thttpd does this: 00:43:51.115227 bind(4, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0 <0.000119> which results into... # ss -l|head -n 2 ; svc -t /service/thttpd ; sleep 2 ; ss -l|head -n 2 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 ::fa38:ebe3:fe5f:fb3a:ffa6:b35e:http ::e541:73fb:7f26:747d:b382:4122:* Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 ::81:7111:de4f:c527:81:701d:http ::81:46b5:9313:b133:81:c2cd:* there are some comments about ``Cursed "v4 mapped" addresses'' in ss.c already ;) but is it possible fix this thing so that ss can show some sane addresses for v4 mapped addresses? -- From davem@davemloft.net Thu Nov 11 15:04:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:04:31 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABN4OMM021438 for ; Thu, 11 Nov 2004 15:04:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSNmM-0002kh-00; Thu, 11 Nov 2004 14:50:58 -0800 Date: Thu, 11 Nov 2004 14:50:58 -0800 From: "David S. Miller" To: Christoph Hellwig Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove net_init.c ifdef clutter Message-Id: <20041111145058.0fc24412.davem@davemloft.net> In-Reply-To: <20041110165641.GA29705@lst.de> References: <20041101130144.GA8727@lst.de> <20041110165641.GA29705@lst.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11727 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 330 Lines: 10 On Wed, 10 Nov 2004 17:56:42 +0100 Christoph Hellwig wrote: > On Mon, Nov 01, 2004 at 02:01:44PM +0100, Christoph Hellwig wrote: > > Move the devicetype-specific functions from net_init.c to the > > devicetype-specific files under net/. > > ping? still applies fine against current BK. Applied, thanks Christoph. From epx@altoriopreto.com.br Thu Nov 11 15:15:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:15:56 -0800 (PST) Received: from flipp.com.br (home.flipp.com.br [200.203.183.103]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iABNFnJn022163 for ; Thu, 11 Nov 2004 15:15:50 -0800 Received: (qmail 10756 invoked by uid 1022); 11 Nov 2004 21:14:48 -0200 Received: from 200.138.204.226 by monster.flipp.com.br (envelope-from , uid 1017) with qmail-scanner-1.24 (clamdscan: 0.80/548. spamassassin: 3.0.1. Clear:RC:0(200.138.204.226):SA:0(-1.2/8.0):. Processed in 0.656564 secs); 11 Nov 2004 23:14:48 -0000 Received: from unknown (HELO arp.altoriopreto.com.br) (contafoo@altoriopreto.com.br@200.138.204.226) by 200.203.183.102 with SMTP; 11 Nov 2004 21:14:47 -0200 Received: (qmail 20434 invoked from network); 11 Nov 2004 21:15:23 -0200 Received: from unknown (HELO ?3ffe:b80:1d9b:1::2?) (3ffe:b80:1d9b:1::2) by arp.altoriopreto.com.br with SMTP; 11 Nov 2004 21:15:23 -0200 From: Elvis =?iso-8859-1?q?Pf=FCtzenreuter?= To: netdev@oss.sgi.com Subject: Problems with TCP + netem packet loss simulation Date: Thu, 11 Nov 2004 21:15:23 -0200 User-Agent: KMail/1.6.2 MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200411112115.23269.epx@altoriopreto.com.br> X-archive-position: 11728 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: epx@altoriopreto.com.br Precedence: bulk X-list: netdev Content-Length: 1571 Lines: 37 Hi, I am experiencing a strange problem when I try to simulate a lossy channel with netem scheduler module. Whatever the packet loss %, all TCP connections eventually stall. The TCP connection exchange no packets after the stall (not even when the process is killed), but PING to the other host flows normally, with the expected loss rate. The first thing to be suspected would be my throughput testing application, but other TCP connections (including ssh sessions) will stall too, more often if the packet loss is high. I tried the kernels 2.6.9-rc4, 2.6.9, 2.6.10rc1 with the same results. Any other netem function (delay, reordering [2.6.10rc1] etc.) does not stall the TCP connection. I suspected a bug in TCP stack (SCTP connections stall for 1 second sometimes but they recover and go on), but if I make packet loss with "nth" iptables rule, the connection does not stall. I even tried to pull network cables, turn off switch etc. to see if any "real" packet loss would stall TCP the same way but it it didn't happen. And, since I use packet loss-based techniques (tc ingress filter) to do QoS on my ADSL, I would have been experiencing problems with TCP well before I tried netem. So it seems to be some interation between TCP and netem. I am using 2 machines in a local Ethernet network. I didn't try to put netem in a third machine (that would be the router), to see if it improves something. I am going to try this later. But if anyone is aware of the cause of the problem I am experiencing, I'd like to hear of. Thanks -- Elvis From davem@davemloft.net Thu Nov 11 15:16:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:17:00 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABNGqRf022291 for ; Thu, 11 Nov 2004 15:16:52 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSNyE-0002m7-00; Thu, 11 Nov 2004 15:03:14 -0800 Date: Thu, 11 Nov 2004 15:03:14 -0800 From: "David S. Miller" To: Patrick McHardy Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions Message-Id: <20041111150314.576ce699.davem@davemloft.net> In-Reply-To: <41908D1D.50405@trash.net> References: <41908D1D.50405@trash.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11729 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 930 Lines: 22 On Tue, 09 Nov 2004 10:25:49 +0100 Patrick McHardy wrote: > This patch fixes on overflow in tc actions times reported to > userspace on 64 bit architectures. struct tcf_t only contains > 32-bit timestamps, but they are initialized to jiffies. When > jiffies is larger than 2^32-1 only the low 32 bit are saved, > and the diff between jiffies and the current timestamp becomes > very large. This happens immediately after boottime since jiffies > is initialized to 2^32-300. It was invisible until now because > only the lower 32bit were reported to userspace, but with the > USER_HZ conversion the reported times start somewhere around > 4294967s. > > This patch extends the timestamps to 64bit. It breaks userspace > compatibility for actions, but considering that most of this is > not even in iproute yet this should be acceptable. I agree, and since Jamal also ACK'd it, I've applied this patch. Thanks. From shemminger@osdl.org Thu Nov 11 15:29:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:29:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABNT3Dk023313 for ; Thu, 11 Nov 2004 15:29:04 -0800 Received: from dxpl.pdx.osdl.net (dxpl.pdx.osdl.net [172.20.1.103]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iABNSY928107; Thu, 11 Nov 2004 15:28:34 -0800 Date: Thu, 11 Nov 2004 15:28:34 -0800 From: Stephen Hemminger To: Elvis =?ISO-8859-1?B?UGb8dHplbnJldXRlcg==?= Cc: netdev@oss.sgi.com Subject: Re: Problems with TCP + netem packet loss simulation Message-Id: <20041111152834.5a7b1f79@dxpl.pdx.osdl.net> In-Reply-To: <200411112115.23269.epx@altoriopreto.com.br> References: <200411112115.23269.epx@altoriopreto.com.br> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; x86_64-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iABNT3Dk023313 X-archive-position: 11730 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 424 Lines: 12 On Thu, 11 Nov 2004 21:15:23 -0200 Elvis Pftzenreuter wrote: > Hi, > > I am experiencing a strange problem when I try to simulate a lossy channel > with netem scheduler module. Whatever the packet loss %, all TCP connections > eventually stall. Netem might be buggy, try doing lots of pings and see if the rate you expected is correct. The scaling of percent to u32 is probably the issue. From davem@davemloft.net Thu Nov 11 15:31:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 15:31:44 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iABNVdFk023738 for ; Thu, 11 Nov 2004 15:31:39 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSOCj-0002ob-00; Thu, 11 Nov 2004 15:18:13 -0800 Date: Thu, 11 Nov 2004 15:18:13 -0800 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [BK PATCH] Misc IPv6 Updates Message-Id: <20041111151813.55fa815e.davem@davemloft.net> In-Reply-To: <20041110.030026.29809367.yoshfuji@linux-ipv6.org> References: <20041110.030026.29809367.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iABNVdFk023738 X-archive-position: 11731 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 225 Lines: 10 On Wed, 10 Nov 2004 03:00:26 -0500 (EST) YOSHIFUJI Hideaki / 吉藤英明 wrote: > Here're changeset at: > bk://bk.skbuff.net:20610/linux-2.6-inet6-misc/ Looks fine to me, pulled. Thank you. From shemminger@osdl.org Thu Nov 11 16:09:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:48 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09hbT026004 for ; Thu, 11 Nov 2004 16:09:43 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09HPE011650 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:18 -0800 Date: Thu, 11 Nov 2004 15:53:36 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (2/23) sk98: local variable can be constant Message-Id: <20041111155336.2c7a9b79@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11735 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 615 Lines: 18 The table OnesHash is only used in this file, and should be made a local constant. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skaddr.c b/drivers/net/sk98lin/skaddr.c --- a/drivers/net/sk98lin/skaddr.c 2004-11-03 14:07:28 -08:00 +++ b/drivers/net/sk98lin/skaddr.c 2004-11-03 14:07:28 -08:00 @@ -79,7 +79,7 @@ /* 64-bit hash values with all bits set. */ -SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; +static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; /* local variables ************************************************************/ From shemminger@osdl.org Thu Nov 11 16:09:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:41 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09aFT025999 for ; Thu, 11 Nov 2004 16:09:37 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09APE011640 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:10 -0800 Date: Thu, 11 Nov 2004 16:11:54 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (23/23) sk98: eliminate large controller scratch pad elements Message-Id: <20041111161154.2fc006b8@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11734 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 15391 Lines: 442 Get rid of 44K of space in the driver structure which was just being used as a scratch pad when making the calls to read stats. PnmiStruct can just be kmalloc'd/kfree in those cases. PNMI initialization can be done in one place using existing macro's for consistency Don't need to cast and mask when converting u64 to u32. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-09 15:29:24 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-09 15:29:24 -08:00 @@ -385,9 +385,9 @@ spinlock_t SlowPathLock; /* Normal IRQ lock */ struct timer_list BlinkTimer; /* for LED blinking */ int LedsOn; - SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */ - int RlmtMode; /* link check mode to set */ - int RlmtNets; /* Number of nets */ + + int RlmtMode; /* link check mode to set */ + int RlmtNets; /* Number of nets */ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ @@ -425,7 +425,6 @@ #ifdef SK_DIAG_SUPPORT SK_U32 DiagModeActive; /* is diag active? */ SK_BOOL DiagFlowCtrl; /* for control purposes */ - SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while * DIAG is busy with NIC */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-09 15:29:24 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-09 15:29:24 -08:00 @@ -297,9 +297,26 @@ static void getEthtoolStats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { - const DEV_NET *pNet = netdev_priv(dev); - const SK_AC *pAC = pNet->pAC; - const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + unsigned long flags; + unsigned int size; + int err; + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, flags); + err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); + + if (err) + return; *data++ = pPnmiStruct->Stat[0].StatRxOkCts; *data++ = pPnmiStruct->Stat[0].StatTxOkCts; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-09 15:29:23 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-09 15:29:24 -08:00 @@ -214,7 +214,7 @@ static void ClearTxRing(SK_AC*, TX_PORT*); static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); -static int SkGeIocMib(DEV_NET*, unsigned int, int); +static unsigned int SkGeIocMib(DEV_NET*, SK_PNMI_STRUCT_DATA *,unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); static void StartDrvCleanupTimer(SK_AC *pAC); static void StopDrvCleanupTimer(SK_AC *pAC); @@ -457,13 +457,6 @@ pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + (pAC->GIni.GIPciHwRev & 0x0F); - /* Set driver globals */ - pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; - pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; - -#ifdef SK_DIAG_SUPPORT - pAC->PnmiBackup = pAC->PnmiStruct; -#endif pci_set_drvdata(pdev, dev); return 0; @@ -780,8 +773,6 @@ static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC) { short i; -char *DescrString = "sk98lin: Driver for Linux"; /* this is given to PNMI */ -char *VerStr = VER_STRING; int Ret; /* return code of request_irq */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, @@ -821,8 +812,10 @@ pAC->BoardLevel = SK_INIT_DATA; pAC->RxBufSize = ETH_BUF_SIZE; - SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString); - SK_PNMI_SET_DRIVER_VER(pAC, VerStr); + SK_PNMI_SET_DRIVER_DESCR(pAC, "sk98lin: Driver for Linux"); + SK_PNMI_SET_DRIVER_VER(pAC, VER_STRING); + SK_PNMI_SET_DRIVER_FILENAME(pAC, DRIVER_FILE_NAME); + SK_PNMI_SET_DRIVER_RELDATE(pAC, DRIVER_REL_DATE); /* level 1 init common modules here (HW init) */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { @@ -1657,9 +1650,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: done ")); -#ifdef SK_DIAG_SUPPORT - pAC->PnmiBackup = pAC->PnmiStruct; -#endif pAC->MaxPorts--; return (0); @@ -3034,69 +3024,60 @@ SK_AC *pAC = pNet->pAC; SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ -SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */ unsigned int Size; /* size of pnmi struct */ unsigned long Flags; /* for spin lock */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeStats starts now...\n")); - pPnmiStruct = &pAC->PnmiStruct; -#ifdef SK_DIAG_SUPPORT - if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && - (pAC->BoardLevel == SK_INIT_RUN)) { -#endif - SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA)); + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_ATOMIC); + if (!pPnmiStruct) + goto out; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + Size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, Flags); - Size = SK_PNMI_STRUCT_SIZE; SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -#ifdef SK_DIAG_SUPPORT - } -#endif pPnmiStat = &pPnmiStruct->Stat[0]; - pPnmiConf = &pPnmiStruct->Conf[0]; - pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; - pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; - pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; - pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; + memset(&pAC->stats, 0, sizeof(struct net_device_stats)); + pAC->stats.rx_packets = pPnmiStruct->RxDeliveredCts; + pAC->stats.tx_packets = pPnmiStat->StatTxOkCts; + pAC->stats.rx_bytes = pPnmiStruct->RxOctetsDeliveredCts; + pAC->stats.tx_bytes = pPnmiStat->StatTxOctetsOkCts; - if (dev->mtu <= 1500) { - pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; - } else { - pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - - pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF); - } - + pAC->stats.rx_errors = pPnmiStruct->InErrorsCts; + if (dev->mtu > 1500) + pAC->stats.rx_errors -= pPnmiStat->StatRxTooLongCts; if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) - pAC->stats.rx_errors = pAC->stats.rx_errors - pPnmiStat->StatRxShortsCts; + pAC->stats.rx_errors -= pPnmiStat->StatRxShortsCts; - pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; - pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF; - pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF; - pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF; - pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; + pAC->stats.tx_errors = pPnmiStat->StatTxSingleCollisionCts; + pAC->stats.rx_dropped = pPnmiStruct->RxNoBufCts; + pAC->stats.tx_dropped = pPnmiStruct->TxNoBufCts; + pAC->stats.multicast = pPnmiStat->StatRxMulticastOkCts; + pAC->stats.collisions = pPnmiStat->StatTxSingleCollisionCts; /* detailed rx_errors: */ - pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF; - pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF; - pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF; - pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF; + pAC->stats.rx_length_errors = pPnmiStat->StatRxRuntCts; + pAC->stats.rx_over_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_crc_errors = pPnmiStat->StatRxFcsCts; + pAC->stats.rx_frame_errors = pPnmiStat->StatRxFramingCts; + pAC->stats.rx_fifo_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_missed_errors = pPnmiStat->StatRxMissedCts; /* detailed tx_errors */ - pAC->stats.tx_aborted_errors = (SK_U32) 0; - pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF; - pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_window_errors = (SK_U32) 0; + pAC->stats.tx_carrier_errors = pPnmiStat->StatTxCarrierCts; + pAC->stats.tx_fifo_errors = pPnmiStat->StatTxFifoUnderrunCts; + pAC->stats.tx_heartbeat_errors = pPnmiStat->StatTxCarrierCts; - return(&pAC->stats); + kfree(pPnmiStruct); + out: + return &pAC->stats; } /* SkGeStats */ @@ -3119,9 +3100,7 @@ SK_AC *pAC; void *pMemBuf; SK_GE_IOCTL Ioctl; -unsigned int Err = 0; -int Size = 0; -int Ret = 0; +int Err = 0; unsigned int Length = 0; int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); @@ -3140,27 +3119,35 @@ case SK_IOCTL_PRESETMIB: if (!capable(CAP_NET_ADMIN)) return -EPERM; case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, - Ioctl.LenPnmiStruct)? - Ioctl.Len : sizeof(pAC->PnmiStruct))) { - return -EFAULT; - } - Size = SkGeIocMib(pNet, Ioctl.Len, cmd); - if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct, - Ioctl.Lenifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + { + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + + if (copy_from_user(pPnmiStruct, Ioctl.pData, + min(sizeof(*pPnmiStruct), Ioctl.Len))) return -EFAULT; + + Length = SkGeIocMib(pNet, pPnmiStruct, Ioctl.Len, cmd); + if (copy_to_user(Ioctl.pData, pPnmiStruct, + min(Length, Ioctl.Len))) + Err = -EFAULT; + else { + Ioctl.Len = Length; + if (copy_to_user(rq->ifr_data, &Ioctl, + sizeof(SK_GE_IOCTL))) + Err = -EFAULT; } + kfree(pPnmiStruct); break; + } case SK_IOCTL_GEN: - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } @@ -3168,16 +3155,16 @@ Err = -EFAULT; goto fault_gen; } - if ((Ret = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { + if ((Err = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { Err = -EFAULT; goto fault_gen; } - if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { + if (copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_gen; } Ioctl.Len = Length; - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + if (copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { Err = -EFAULT; goto fault_gen; } @@ -3187,15 +3174,14 @@ #ifdef SK_DIAG_SUPPORT case SK_IOCTL_DIAG: if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } - if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { + + if (copy_from_user(pMemBuf, Ioctl.pData, Length)) { Err = -EFAULT; goto fault_diag; } @@ -3230,7 +3216,6 @@ } /* SkGeIoctl */ - /***************************************************************************** * * SkGeIocMib - handle a GetMib, SetMib- or PresetMib-ioctl message @@ -3248,8 +3233,9 @@ * Returns: * returned size from PNMI call */ -static int SkGeIocMib( +static unsigned int SkGeIocMib( DEV_NET *pNet, /* pointer to the adapter context */ +SK_PNMI_STRUCT_DATA *pPnmiStruct, /* structure for all Pnmi-Data */ unsigned int Size, /* length of ioctl data */ int mode) /* flag for set/preset */ { @@ -3263,16 +3249,13 @@ spin_lock_irqsave(&pAC->SlowPathLock, Flags); switch(mode) { case SK_IOCTL_GETMIB: - SkPnmiGetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_PRESETMIB: - SkPnmiPreSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiPreSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_SETMIB: - SkPnmiSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; default: break; @@ -4689,8 +4672,6 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - pAc->PnmiBackup = pAC->PnmiStruct; - pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { if (netif_running(pAC->dev[0])) { @@ -4730,7 +4711,6 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - pAc->PnmiStruct = pAc->PnmiBackup; pAc->DiagModeActive = DIAG_NOTACTIVE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) { diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-09 15:29:23 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-09 15:29:23 -08:00 @@ -60,33 +60,26 @@ struct net_device *dev = seq->private; DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; - SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + SK_PNMI_STRUCT_DATA *pPnmiStruct; unsigned long Flags; unsigned int Size; char sens_msg[50]; int t; int i; + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + /* NetIndex in GetStruct is now required, zero is only dummy */ for (t=pAC->GIni.GIMacsFound; t > 0; t--) { if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1) t--; + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); spin_lock_irqsave(&pAC->SlowPathLock, Flags); Size = SK_PNMI_STRUCT_SIZE; -#ifdef SK_DIAG_SUPPORT - if (pAC->BoardLevel == SK_INIT_DATA) { - pAC->PnmiStruct = pAC->PnmiBackup; - if (pAC->DiagModeActive == DIAG_NOTACTIVE) { - pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; - } - } else { - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); - } -#else - SkPnmiGetStruct(pAC, pAC->IoBase, - pPnmiStruct, &Size, t-1); -#endif + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->dev[t-1] == dev) { @@ -240,6 +233,7 @@ } } + kfree(pPnmiStruct); return 0; } From shemminger@osdl.org Thu Nov 11 16:09:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:14 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC099k6025925 for ; Thu, 11 Nov 2004 16:09:09 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC08ePE011596 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:08:40 -0800 Date: Thu, 11 Nov 2004 16:11:24 -0800 From: Stephen Hemminger To: Michael Heyse , Jeff Garzik , Mirko Lindner Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [PATCH] (0/23) sk98 driver fixes and enhancements Message-Id: <20041111161124.34ccb1e6@zqx3.pdx.osdl.net> In-Reply-To: <4192C60A.1050205@designassembly.de> References: <4192C60A.1050205@designassembly.de> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11732 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1032 Lines: 28 This is the first set of patches to merge some of the new SysKonnect code with existing 2.6 driver and fix several bugs. 1: Remove explicit module refcounting (bug) 2: Make OnesHash table local constant. 3: proc print interface cleanup 4: Use netdev_priv 5: Use module_param_array instead of deprecated MODULE_PARM 6: Add netpoll controller support 7: Basic ethtool support 8: Ethtool support for LED blinking 9: Ethtool pause param support 10: Cleanup 11: Fix boards_found count 12: Add MODULE_VERSION 13: Handle ring full condition properly (bug) 14: Get rid of obfuscation irqreturn_t 15: Rearrange functions to match SysKonnect code 16: More efficient OsGetTime 17: Enable high dma and lockless transmit 18: reorganize pci_device table 19: Do initialization better 20: Ethtool tx & receive checksum efficiently 21: Tx ring management improvements 22: Cleanup the code under DIAG_SUPPORT 23: Eliminate Pnmi scratchpad common To spare people's mailbox the individual patches won't go to LKML just to netdev. From shemminger@osdl.org Thu Nov 11 16:09:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:25 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09J65025933 for ; Thu, 11 Nov 2004 16:09:19 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC08rPE011613 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:08:53 -0800 Date: Thu, 11 Nov 2004 16:11:37 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (1/23) sk98: no explicit module ref counting needed Message-Id: <20041111161137.576e5f66@zqx3.pdx.osdl.net> In-Reply-To: <20041111154016.6381189d@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154016.6381189d@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11733 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 2942 Lines: 93 Network driver's shouldn't be doing module reference counting on 2.6. This is a bad replication of 2.4 behaviour Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:07:09 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:07:09 -08:00 @@ -1166,10 +1166,6 @@ } #endif - if (!try_module_get(THIS_MODULE)) { - return (-1); /* increase of usage count not possible */ - } - /* Set blink mode */ if ((pAC->PciDev->vendor == 0x1186) || (pAC->PciDev->vendor == 0x11ab )) pAC->GIni.GILedBlinkCtrl = OEM_CONFIG_VALUE; @@ -1177,7 +1173,6 @@ if (pAC->BoardLevel == SK_INIT_DATA) { /* level 1 init common modules here */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { - module_put(THIS_MODULE); /* decrease usage count */ printk("%s: HWInit (1) failed.\n", pAC->dev[pNet->PortNr]->name); return (-1); } @@ -1193,7 +1188,6 @@ if (pAC->BoardLevel != SK_INIT_RUN) { /* tschilling: Level 2 init modules here, check return value. */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_RUN) != 0) { - module_put(THIS_MODULE); /* decrease usage count */ printk("%s: HWInit (2) failed.\n", pAC->dev[pNet->PortNr]->name); return (-1); } @@ -1285,7 +1279,6 @@ #ifdef SK_DIAG_SUPPORT if (pAC->DiagModeActive == DIAG_ACTIVE) { if (pAC->DiagFlowCtrl == SK_FALSE) { - module_put(THIS_MODULE); /* ** notify that the interface which has been closed ** by operator interaction must not be started up @@ -1376,7 +1369,6 @@ pAC->MaxPorts--; pNet->Up = 0; - module_put(THIS_MODULE); return (0); } /* SkGeClose */ @@ -4681,20 +4673,11 @@ dev = pAC->dev[devNbr]; - /* - ** Function SkGeClose() uses MOD_DEC_USE_COUNT (2.2/2.4) - ** or module_put() (2.6) to decrease the number of users for - ** a device, but if a device is to be put under control of - ** the DIAG, that count is OK already and does not need to - ** be adapted! Hence the opposite MOD_INC_USE_COUNT or - ** try_module_get() needs to be used again to correct that. + /* On Linux 2.6 the network driver does NOT mess with reference + ** counts. The driver MUST be able to be unloaded at any time + ** due to the possibility of hotplug. */ - if (!try_module_get(THIS_MODULE)) { - return (-1); - } - if (SkGeClose(dev) != 0) { - module_put(THIS_MODULE); return (-1); } return (0); @@ -4723,17 +4706,6 @@ if (SkGeOpen(dev) != 0) { return (-1); - } else { - /* - ** Function SkGeOpen() uses MOD_INC_USE_COUNT (2.2/2.4) - ** or try_module_get() (2.6) to increase the number of - ** users for a device, but if a device was just under - ** control of the DIAG, that count is OK already and - ** does not need to be adapted! Hence the opposite - ** MOD_DEC_USE_COUNT or module_put() needs to be used - ** again to correct that. - */ - module_put(THIS_MODULE); } /* From shemminger@osdl.org Thu Nov 11 16:09:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:51 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09icZ026005 for ; Thu, 11 Nov 2004 16:09:44 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09IPE011655 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:19 -0800 Date: Thu, 11 Nov 2004 15:57:53 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (11/23) sk98: board counter incremented twice Message-Id: <20041111155753.080b7161@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11736 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 589 Lines: 20 Minor bug, bourd found incremented twice. Also don't need to initialize fields already zerod. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 15:09:28 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 15:09:28 -08:00 @@ -4972,11 +4972,6 @@ } #endif - pNet->PortNr = 0; - pNet->NetNr = 0; - - boards_found++; - /* More then one port found */ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { From shemminger@osdl.org Thu Nov 11 16:09:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:09:54 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09kuS026006 for ; Thu, 11 Nov 2004 16:09:46 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09KPE011661 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:20 -0800 Date: Thu, 11 Nov 2004 16:07:20 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (19/23) sk98: more cleanups Message-Id: <20041111160720.4ad4c51a@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11737 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 4006 Lines: 143 Make sure and set flags on both ports correctly. Set address before register_netdev so if any protocols want to pickup mac address they see correct value. Fix memory leak on remove (my bad from patch 15). Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-08 13:10:37 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-08 13:10:37 -08:00 @@ -184,7 +184,8 @@ static void sk98lin_remove_device(struct pci_dev *pdev); static void FreeResources(struct net_device *dev); static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC); -static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev); +static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev, + const SK_AC *pAC); static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); @@ -338,7 +339,6 @@ DEV_NET *pNet = NULL; struct net_device *dev = NULL; static int boards_found = 0; - int pci_using_dac = 0; int error = -ENODEV; error = pci_enable_device(pdev); @@ -348,9 +348,8 @@ } /* Configure DMA attributes. */ - if (!(error = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) - pci_using_dac = 1; - else if ((error = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { + if ((error = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && + (error = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { printk(KERN_ERR "sk98lin: cannot set PCI dma mask\n"); goto out_disable_device; } @@ -393,23 +392,12 @@ goto out_free_adapter; } - SkGeDevInit(dev, pdev); - if (pci_using_dac) - dev->features |= NETIF_F_HIGHDMA; - pAC->Index = boards_found++; if (SkGeBoardInit(dev, pAC)) - goto out_free_adapter; + goto out_free_resources; -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) - /* Use only if yukon hardware */ - /* SK and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -#endif -#endif + SkGeDevInit(dev, pdev, pAC); /* Register net device */ strcpy(dev->name, "eth%d"); @@ -419,6 +407,7 @@ } SkGeProcCreate(dev); + memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); /* Print adapter specific string from vpd */ PrintProductStr(dev->name, pAC); @@ -434,8 +423,6 @@ SkGeYellowLED(pAC, pAC->IoBase, 1); - memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); - /* More then one port found */ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { @@ -450,22 +437,9 @@ pNet->NetNr = 1; pNet->pAC = pAC; - memcpy(&dev->dev_addr, - &pAC->Addr.Net[1].CurrentMacAddress, 6); - - SkGeDevInit(dev, pdev); + memcpy(&dev->dev_addr, &pAC->Addr.Net[1].CurrentMacAddress, 6); - if (pci_using_dac) - dev->features |= NETIF_F_HIGHDMA; - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) - /* Use only if yukon hardware */ - /* SK and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -#endif -#endif + SkGeDevInit(dev, pdev, pAC); if (register_netdev(dev)) { printk(KERN_ERR "SKGE: Could not register device.\n"); @@ -504,7 +478,8 @@ return error; } -static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev) +static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev, + const SK_AC *pAC) { SET_MODULE_OWNER(dev); dev->open = &SkGeOpen; @@ -523,6 +498,16 @@ dev->flags &= ~IFF_RUNNING; dev->features |= NETIF_F_LLTX; + + if (pdev->dma_mask == DMA_64BIT_MASK) + dev->features |= NETIF_F_HIGHDMA; + + if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { + dev->features |= NETIF_F_SG; +#ifdef USE_SK_TX_CHECKSUM + dev->features |= NETIF_F_IP_CSUM; +#endif + } } /***************************************************************************** * @@ -768,6 +753,7 @@ } FreeResources(dev); + kfree(pAC); if (dev1 != dev) free_netdev(dev1); From shemminger@osdl.org Thu Nov 11 16:09:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:01 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09njP026033 for ; Thu, 11 Nov 2004 16:09:49 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09NPE011672 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:23 -0800 Date: Thu, 11 Nov 2004 16:07:30 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (18/23) sk98: update pci_id table Message-Id: <20041111160730.72772168@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11738 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 3180 Lines: 69 Reformat and update pci id table. Add values from lastest SysKonnect driver, and use pci_id defines if available. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-04 10:30:02 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-04 10:30:02 -08:00 @@ -277,24 +277,45 @@ static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; - -static struct pci_device_id sk98lin_pci_tbl[] = { - { PCI_VENDOR_ID_3COM, 0x1700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, +static struct pci_device_id sk98lin_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940B, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, 0x9E00, /* SK-9Exx 10/100/1000Base-T Adapter */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4320, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, #if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */ - { PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_MARVELL, 0x4350, /* Fast Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4351, /* Fast Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4360, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4361, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4362, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, #endif - { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { 0, } + { PCI_VENDOR_ID_MARVELL, 0x5005, /* Marvell (11ab), Belkin */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1032, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1064, + PCI_ANY_ID, PCI_ANY_ID }, + { 0 } }; + +MODULE_DEVICE_TABLE(pci, sk98lin_pci_tbl); static struct pci_driver skge_driver = { .name = DRIVER_FILE_NAME, From shemminger@osdl.org Thu Nov 11 16:09:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:09 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09mTK026022 for ; Thu, 11 Nov 2004 16:09:48 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09LPE011665 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:21 -0800 Date: Thu, 11 Nov 2004 15:53:49 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (3/23) sk98: /proc interface related changes Message-Id: <20041111155349.4537044c@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11739 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 23910 Lines: 713 The /proc intereface can be cleaned up a lot: + Pass the device to through the proc data/seq_private hook. + No longer needs to have a list of network devices + use seq_printf directly rather than indirection into a buffer + failure to create proc directory or interface should not be fatal. + if PROC_FS not configured, let the stubs cause the necessary code elimination rather than using #ifdef Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-05 16:25:13 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-05 16:25:13 -08:00 @@ -266,7 +266,6 @@ typedef struct s_DevNet DEV_NET; struct s_DevNet { - struct proc_dir_entry *proc; int PortNr; int NetNr; int Mtu; @@ -395,7 +394,7 @@ SK_U32 PciDevId; /* pci device id */ struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */ char Name[30]; /* driver name */ - struct SK_NET_DEVICE *Next; /* link all devices (for clearing) */ + int RxBufSize; /* length of receive buffers */ struct net_device_stats stats; /* linux 'netstat -i' statistics */ int Index; /* internal board index number */ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-05 16:25:13 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-05 16:25:13 -08:00 @@ -233,12 +233,27 @@ * Extern Function Prototypes * ******************************************************************************/ - -#ifdef CONFIG_PROC_FS -static const char SK_Root_Dir_entry[] = "sk98lin"; +static const char SKRootName[] = "sk98lin"; static struct proc_dir_entry *pSkRootDir; extern struct file_operations sk_proc_fops; -#endif + +static inline void SkGeProcCreate(struct net_device *dev) +{ + struct proc_dir_entry *pe; + + if (pSkRootDir && + (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) { + pe->proc_fops = &sk_proc_fops; + pe->data = dev; + pe->owner = THIS_MODULE; + } +} + +static inline void SkGeProcRemove(struct net_device *dev) +{ + if (pSkRootDir) + remove_proc_entry(dev->name, pSkRootDir); +} extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); extern void SkDimDisplayModerationSettings(SK_AC *pAC); @@ -252,7 +267,6 @@ #endif /* global variables *********************************************************/ -struct SK_NET_DEVICE *SkGeRootDev = NULL; static SK_BOOL DoPrintInterfaceChange = SK_TRUE; /* local variables **********************************************************/ @@ -601,12 +615,6 @@ return(-EAGAIN); } - /* - * Register the device here - */ - pAC->Next = SkGeRootDev; - SkGeRootDev = dev; - return (0); } /* SkGeBoardInit */ @@ -4876,9 +4884,6 @@ SK_AC *pAC; DEV_NET *pNet = NULL; struct net_device *dev = NULL; -#ifdef CONFIG_PROC_FS - struct proc_dir_entry *pProcFile; -#endif static int boards_found = 0; int error = -ENODEV; @@ -4974,14 +4979,7 @@ memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); -#ifdef CONFIG_PROC_FS - pProcFile = create_proc_entry(dev->name, S_IRUGO, pSkRootDir); - if (pProcFile) { - pProcFile->proc_fops = &sk_proc_fops; - pProcFile->data = dev; - pProcFile->owner = THIS_MODULE; - } -#endif + SkGeProcCreate(dev); pNet->PortNr = 0; pNet->NetNr = 0; @@ -5028,16 +5026,7 @@ free_netdev(dev); pAC->dev[1] = pAC->dev[0]; } else { -#ifdef CONFIG_PROC_FS - pProcFile = create_proc_entry(dev->name, S_IRUGO, - pSkRootDir); - if (pProcFile) { - pProcFile->proc_fops = &sk_proc_fops; - pProcFile->data = dev; - pProcFile->owner = THIS_MODULE; - } -#endif - + SkGeProcCreate(dev); memcpy(&dev->dev_addr, &pAC->Addr.Net[1].CurrentMacAddress, 6); @@ -5075,17 +5064,12 @@ struct net_device *dev = pci_get_drvdata(pdev); DEV_NET *pNet = (DEV_NET *) dev->priv; SK_AC *pAC = pNet->pAC; - int have_second_mac = 0; - - if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2) - have_second_mac = 1; + struct net_device *otherdev = pAC->dev[1]; - remove_proc_entry(dev->name, pSkRootDir); + SkGeProcRemove(dev); unregister_netdev(dev); - if (have_second_mac) { - remove_proc_entry(pAC->dev[1]->name, pSkRootDir); - unregister_netdev(pAC->dev[1]); - } + if (otherdev != dev) + SkGeProcRemove(otherdev); SkGeYellowLED(pAC, pAC->IoBase, 0); @@ -5118,8 +5102,8 @@ FreeResources(dev); free_netdev(dev); - if (have_second_mac) - free_netdev(pAC->dev[1]); + if (otherdev != dev) + free_netdev(otherdev); kfree(pAC); } @@ -5152,34 +5136,21 @@ { int error; -#ifdef CONFIG_PROC_FS - memcpy(&SK_Root_Dir_entry, BOOT_STRING, sizeof(SK_Root_Dir_entry) - 1); - - pSkRootDir = proc_mkdir(SK_Root_Dir_entry, proc_net); - if (!pSkRootDir) { - printk(KERN_WARNING "Unable to create /proc/net/%s", - SK_Root_Dir_entry); - return -ENOMEM; - } - pSkRootDir->owner = THIS_MODULE; -#endif - - error = pci_module_init(&skge_driver); - if (error) { -#ifdef CONFIG_PROC_FS - remove_proc_entry(pSkRootDir->name, proc_net); -#endif - } - + pSkRootDir = proc_mkdir(SKRootName, proc_net); + if (pSkRootDir) + pSkRootDir->owner = THIS_MODULE; + + error = pci_register_driver(&skge_driver); + if (error) + proc_net_remove(SKRootName); return error; } static void __exit skge_exit(void) { - pci_unregister_driver(&skge_driver); -#ifdef CONFIG_PROC_FS - remove_proc_entry(pSkRootDir->name, proc_net); -#endif + pci_unregister_driver(&skge_driver); + proc_net_remove(SKRootName); + } module_init(skge_init); diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-05 16:25:13 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-05 16:25:13 -08:00 @@ -31,13 +31,9 @@ #include "h/skdrv2nd.h" #include "h/skversion.h" -extern struct SK_NET_DEVICE *SkGeRootDev; -static int sk_proc_print(void *writePtr, char *format, ...); -static void sk_gen_browse(void *buffer); -int len; - static int sk_seq_show(struct seq_file *seq, void *v); static int sk_proc_open(struct inode *inode, struct file *file); + struct file_operations sk_proc_fops = { .owner = THIS_MODULE, .open = sk_proc_open, @@ -45,315 +41,206 @@ .llseek = seq_lseek, .release = single_release, }; -struct net_device *currDev = NULL; + /***************************************************************************** * - * sk_gen_browse -generic print "summaries" entry + * sk_seq_show - show proc information of a particular adapter * * Description: * This function fills the proc entry with statistic data about - * the ethernet device. + * the ethernet device. It invokes the generic sk_gen_browse() to + * print out all items one per one. * - * Returns: - - * + * Returns: 0 + * */ -static void sk_gen_browse(void *buffer) +static int sk_seq_show(struct seq_file *seq, void *v) { - struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev; - struct SK_NET_DEVICE *next; - SK_PNMI_STRUCT_DATA *pPnmiStruct; - SK_PNMI_STAT *pPnmiStat; + struct net_device *dev = seq->private; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; unsigned long Flags; unsigned int Size; - DEV_NET *pNet; - SK_AC *pAC; char sens_msg[50]; - int MaxSecurityCount = 0; int t; int i; - while (SkgeProcDev) { - MaxSecurityCount++; - if (MaxSecurityCount > 100) { - printk("Max limit for sk_proc_read security counter!\n"); - return; - } - pNet = (DEV_NET*) SkgeProcDev->priv; - pAC = pNet->pAC; - next = pAC->Next; - pPnmiStruct = &pAC->PnmiStruct; - /* NetIndex in GetStruct is now required, zero is only dummy */ - - for (t=pAC->GIni.GIMacsFound; t > 0; t--) { - if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1) - t--; + /* NetIndex in GetStruct is now required, zero is only dummy */ + for (t=pAC->GIni.GIMacsFound; t > 0; t--) { + if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1) + t--; - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - Size = SK_PNMI_STRUCT_SIZE; + spin_lock_irqsave(&pAC->SlowPathLock, Flags); + Size = SK_PNMI_STRUCT_SIZE; #ifdef SK_DIAG_SUPPORT - if (pAC->BoardLevel == SK_INIT_DATA) { - SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); - if (pAC->DiagModeActive == DIAG_NOTACTIVE) { - pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; - } - } else { - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); + if (pAC->BoardLevel == SK_INIT_DATA) { + SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); + if (pAC->DiagModeActive == DIAG_NOTACTIVE) { + pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; } + } else { + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); + } #else - SkPnmiGetStruct(pAC, pAC->IoBase, + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); #endif - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); + spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - if (strcmp(pAC->dev[t-1]->name, currDev->name) == 0) { - pPnmiStat = &pPnmiStruct->Stat[0]; - len = sk_proc_print(buffer, - "\nDetailed statistic for device %s\n", - pAC->dev[t-1]->name); - len += sk_proc_print(buffer, - "=======================================\n"); + if (pAC->dev[t-1] == dev) { + SK_PNMI_STAT *pPnmiStat = &pPnmiStruct->Stat[0]; + + seq_printf(seq, "\nDetailed statistic for device %s\n", + pAC->dev[t-1]->name); + seq_printf(seq, "=======================================\n"); - /* Board statistics */ - len += sk_proc_print(buffer, - "\nBoard statistics\n\n"); - len += sk_proc_print(buffer, - "Active Port %c\n", - 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. - Net[t-1].PrefPort]->PortNumber); - len += sk_proc_print(buffer, - "Preferred Port %c\n", - 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. - Net[t-1].PrefPort]->PortNumber); - - len += sk_proc_print(buffer, - "Bus speed (MHz) %d\n", - pPnmiStruct->BusSpeed); - - len += sk_proc_print(buffer, - "Bus width (Bit) %d\n", - pPnmiStruct->BusWidth); - len += sk_proc_print(buffer, - "Driver version %s\n", - VER_STRING); - len += sk_proc_print(buffer, - "Hardware revision v%d.%d\n", - (pAC->GIni.GIPciHwRev >> 4) & 0x0F, - pAC->GIni.GIPciHwRev & 0x0F); - - /* Print sensor informations */ - for (i=0; i < pAC->I2c.MaxSens; i ++) { - /* Check type */ - switch (pAC->I2c.SenTable[i].SenType) { - case 1: - strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); - strcat(sens_msg, " (C)"); - len += sk_proc_print(buffer, - "%-25s %d.%02d\n", - sens_msg, - pAC->I2c.SenTable[i].SenValue / 10, - pAC->I2c.SenTable[i].SenValue % 10); - - strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); - strcat(sens_msg, " (F)"); - len += sk_proc_print(buffer, - "%-25s %d.%02d\n", - sens_msg, - ((((pAC->I2c.SenTable[i].SenValue) - *10)*9)/5 + 3200)/100, - ((((pAC->I2c.SenTable[i].SenValue) - *10)*9)/5 + 3200) % 10); - break; - case 2: - strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); - strcat(sens_msg, " (V)"); - len += sk_proc_print(buffer, - "%-25s %d.%03d\n", - sens_msg, - pAC->I2c.SenTable[i].SenValue / 1000, - pAC->I2c.SenTable[i].SenValue % 1000); - break; - case 3: - strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); - strcat(sens_msg, " (rpm)"); - len += sk_proc_print(buffer, - "%-25s %d\n", - sens_msg, - pAC->I2c.SenTable[i].SenValue); - break; - default: - break; - } + /* Board statistics */ + seq_printf(seq, "\nBoard statistics\n\n"); + seq_printf(seq, "Active Port %c\n", + 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. + Net[t-1].PrefPort]->PortNumber); + seq_printf(seq, "Preferred Port %c\n", + 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. + Net[t-1].PrefPort]->PortNumber); + + seq_printf(seq, "Bus speed (MHz) %d\n", + pPnmiStruct->BusSpeed); + + seq_printf(seq, "Bus width (Bit) %d\n", + pPnmiStruct->BusWidth); + seq_printf(seq, "Driver version %s\n", + VER_STRING); + seq_printf(seq, "Hardware revision v%d.%d\n", + (pAC->GIni.GIPciHwRev >> 4) & 0x0F, + pAC->GIni.GIPciHwRev & 0x0F); + + /* Print sensor informations */ + for (i=0; i < pAC->I2c.MaxSens; i ++) { + /* Check type */ + switch (pAC->I2c.SenTable[i].SenType) { + case 1: + strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); + strcat(sens_msg, " (C)"); + seq_printf(seq, "%-25s %d.%02d\n", + sens_msg, + pAC->I2c.SenTable[i].SenValue / 10, + pAC->I2c.SenTable[i].SenValue % 10); + + strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); + strcat(sens_msg, " (F)"); + seq_printf(seq, "%-25s %d.%02d\n", + sens_msg, + ((((pAC->I2c.SenTable[i].SenValue) + *10)*9)/5 + 3200)/100, + ((((pAC->I2c.SenTable[i].SenValue) + *10)*9)/5 + 3200) % 10); + break; + case 2: + strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); + strcat(sens_msg, " (V)"); + seq_printf(seq, "%-25s %d.%03d\n", + sens_msg, + pAC->I2c.SenTable[i].SenValue / 1000, + pAC->I2c.SenTable[i].SenValue % 1000); + break; + case 3: + strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); + strcat(sens_msg, " (rpm)"); + seq_printf(seq, "%-25s %d\n", + sens_msg, + pAC->I2c.SenTable[i].SenValue); + break; + default: + break; } + } - /*Receive statistics */ - len += sk_proc_print(buffer, - "\nReceive statistics\n\n"); - - len += sk_proc_print(buffer, - "Received bytes %Lu\n", - (unsigned long long) pPnmiStat->StatRxOctetsOkCts); - len += sk_proc_print(buffer, - "Received packets %Lu\n", - (unsigned long long) pPnmiStat->StatRxOkCts); + /*Receive statistics */ + seq_printf(seq, "\nReceive statistics\n\n"); + + seq_printf(seq, "Received bytes %Lu\n", + (unsigned long long) pPnmiStat->StatRxOctetsOkCts); + seq_printf(seq, "Received packets %Lu\n", + (unsigned long long) pPnmiStat->StatRxOkCts); #if 0 - if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && - pAC->HWRevision < 12) { - pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - - pPnmiStat->StatRxShortsCts; - pPnmiStat->StatRxShortsCts = 0; - } + if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && + pAC->HWRevision < 12) { + pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - + pPnmiStat->StatRxShortsCts; + pPnmiStat->StatRxShortsCts = 0; + } #endif - if (pNet->Mtu > 1500) - pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - - pPnmiStat->StatRxTooLongCts; - - len += sk_proc_print(buffer, - "Receive errors %Lu\n", - (unsigned long long) pPnmiStruct->InErrorsCts); - len += sk_proc_print(buffer, - "Receive dropped %Lu\n", - (unsigned long long) pPnmiStruct->RxNoBufCts); - len += sk_proc_print(buffer, - "Received multicast %Lu\n", - (unsigned long long) pPnmiStat->StatRxMulticastOkCts); - len += sk_proc_print(buffer, - "Receive error types\n"); - len += sk_proc_print(buffer, - " length %Lu\n", - (unsigned long long) pPnmiStat->StatRxRuntCts); - len += sk_proc_print(buffer, - " buffer overflow %Lu\n", - (unsigned long long) pPnmiStat->StatRxFifoOverflowCts); - len += sk_proc_print(buffer, - " bad crc %Lu\n", - (unsigned long long) pPnmiStat->StatRxFcsCts); - len += sk_proc_print(buffer, - " framing %Lu\n", - (unsigned long long) pPnmiStat->StatRxFramingCts); - len += sk_proc_print(buffer, - " missed frames %Lu\n", - (unsigned long long) pPnmiStat->StatRxMissedCts); - - if (pNet->Mtu > 1500) - pPnmiStat->StatRxTooLongCts = 0; - - len += sk_proc_print(buffer, - " too long %Lu\n", - (unsigned long long) pPnmiStat->StatRxTooLongCts); - len += sk_proc_print(buffer, - " carrier extension %Lu\n", - (unsigned long long) pPnmiStat->StatRxCextCts); - len += sk_proc_print(buffer, - " too short %Lu\n", - (unsigned long long) pPnmiStat->StatRxShortsCts); - len += sk_proc_print(buffer, - " symbol %Lu\n", - (unsigned long long) pPnmiStat->StatRxSymbolCts); - len += sk_proc_print(buffer, - " LLC MAC size %Lu\n", - (unsigned long long) pPnmiStat->StatRxIRLengthCts); - len += sk_proc_print(buffer, - " carrier event %Lu\n", - (unsigned long long) pPnmiStat->StatRxCarrierCts); - len += sk_proc_print(buffer, - " jabber %Lu\n", - (unsigned long long) pPnmiStat->StatRxJabberCts); - - - /*Transmit statistics */ - len += sk_proc_print(buffer, - "\nTransmit statistics\n\n"); + if (dev->mtu > 1500) + pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - + pPnmiStat->StatRxTooLongCts; + + seq_printf(seq, "Receive errors %Lu\n", + (unsigned long long) pPnmiStruct->InErrorsCts); + seq_printf(seq, "Receive dropped %Lu\n", + (unsigned long long) pPnmiStruct->RxNoBufCts); + seq_printf(seq, "Received multicast %Lu\n", + (unsigned long long) pPnmiStat->StatRxMulticastOkCts); + seq_printf(seq, "Receive error types\n"); + seq_printf(seq, " length %Lu\n", + (unsigned long long) pPnmiStat->StatRxRuntCts); + seq_printf(seq, " buffer overflow %Lu\n", + (unsigned long long) pPnmiStat->StatRxFifoOverflowCts); + seq_printf(seq, " bad crc %Lu\n", + (unsigned long long) pPnmiStat->StatRxFcsCts); + seq_printf(seq, " framing %Lu\n", + (unsigned long long) pPnmiStat->StatRxFramingCts); + seq_printf(seq, " missed frames %Lu\n", + (unsigned long long) pPnmiStat->StatRxMissedCts); + + if (dev->mtu > 1500) + pPnmiStat->StatRxTooLongCts = 0; + + seq_printf(seq, " too long %Lu\n", + (unsigned long long) pPnmiStat->StatRxTooLongCts); + seq_printf(seq, " carrier extension %Lu\n", + (unsigned long long) pPnmiStat->StatRxCextCts); + seq_printf(seq, " too short %Lu\n", + (unsigned long long) pPnmiStat->StatRxShortsCts); + seq_printf(seq, " symbol %Lu\n", + (unsigned long long) pPnmiStat->StatRxSymbolCts); + seq_printf(seq, " LLC MAC size %Lu\n", + (unsigned long long) pPnmiStat->StatRxIRLengthCts); + seq_printf(seq, " carrier event %Lu\n", + (unsigned long long) pPnmiStat->StatRxCarrierCts); + seq_printf(seq, " jabber %Lu\n", + (unsigned long long) pPnmiStat->StatRxJabberCts); + + + /*Transmit statistics */ + seq_printf(seq, "\nTransmit statistics\n\n"); - len += sk_proc_print(buffer, - "Transmited bytes %Lu\n", - (unsigned long long) pPnmiStat->StatTxOctetsOkCts); - len += sk_proc_print(buffer, - "Transmited packets %Lu\n", - (unsigned long long) pPnmiStat->StatTxOkCts); - len += sk_proc_print(buffer, - "Transmit errors %Lu\n", - (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); - len += sk_proc_print(buffer, - "Transmit dropped %Lu\n", - (unsigned long long) pPnmiStruct->TxNoBufCts); - len += sk_proc_print(buffer, - "Transmit collisions %Lu\n", - (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); - len += sk_proc_print(buffer, - "Transmit error types\n"); - len += sk_proc_print(buffer, - " excessive collision %ld\n", - pAC->stats.tx_aborted_errors); - len += sk_proc_print(buffer, - " carrier %Lu\n", - (unsigned long long) pPnmiStat->StatTxCarrierCts); - len += sk_proc_print(buffer, - " fifo underrun %Lu\n", - (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts); - len += sk_proc_print(buffer, - " heartbeat %Lu\n", - (unsigned long long) pPnmiStat->StatTxCarrierCts); - len += sk_proc_print(buffer, - " window %ld\n", - pAC->stats.tx_window_errors); + seq_printf(seq, "Transmited bytes %Lu\n", + (unsigned long long) pPnmiStat->StatTxOctetsOkCts); + seq_printf(seq, "Transmited packets %Lu\n", + (unsigned long long) pPnmiStat->StatTxOkCts); + seq_printf(seq, "Transmit errors %Lu\n", + (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); + seq_printf(seq, "Transmit dropped %Lu\n", + (unsigned long long) pPnmiStruct->TxNoBufCts); + seq_printf(seq, "Transmit collisions %Lu\n", + (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); + seq_printf(seq, "Transmit error types\n"); + seq_printf(seq, " excessive collision %ld\n", + pAC->stats.tx_aborted_errors); + seq_printf(seq, " carrier %Lu\n", + (unsigned long long) pPnmiStat->StatTxCarrierCts); + seq_printf(seq, " fifo underrun %Lu\n", + (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts); + seq_printf(seq, " heartbeat %Lu\n", + (unsigned long long) pPnmiStat->StatTxCarrierCts); + seq_printf(seq, " window %ld\n", + pAC->stats.tx_window_errors); - } /* if (strcmp(pACname, currDeviceName) == 0) */ } - SkgeProcDev = next; } -} - -/***************************************************************************** - * - * sk_proc_print -generic line print - * - * Description: - * This function fills the proc entry with statistic data about - * the ethernet device. - * - * Returns: number of bytes written - * - */ -static int sk_proc_print(void *writePtr, char *format, ...) -{ -#define MAX_LEN_SINGLE_LINE 256 - char str[MAX_LEN_SINGLE_LINE]; - va_list a_start; - int lenght = 0; - - struct seq_file *seq = (struct seq_file *) writePtr; - - SK_MEMSET(str, 0, MAX_LEN_SINGLE_LINE); - - va_start(a_start, format); - vsprintf(str, format, a_start); - va_end(a_start); - - lenght = strlen(str); - - seq_printf(seq, str); - return lenght; -} - -/***************************************************************************** - * - * sk_seq_show - show proc information of a particular adapter - * - * Description: - * This function fills the proc entry with statistic data about - * the ethernet device. It invokes the generic sk_gen_browse() to - * print out all items one per one. - * - * Returns: number of bytes written - * - */ -static int sk_seq_show(struct seq_file *seq, void *v) -{ - void *castedBuffer = (void *) seq; - currDev = seq->private; - sk_gen_browse(castedBuffer); - return 0; + return 0; } /***************************************************************************** From shemminger@osdl.org Thu Nov 11 16:09:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:10 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09o2n026044 for ; Thu, 11 Nov 2004 16:09:51 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09OPE011676 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:25 -0800 Date: Thu, 11 Nov 2004 15:54:10 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (4/23) sk98: use netdev_priv Message-Id: <20041111155410.2a5b0d87@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11740 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 5321 Lines: 204 Use netdev_priv when dereferenceing net_device private Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:07:58 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:07:58 -08:00 @@ -337,22 +337,20 @@ DEV_NET *pNet; SK_AC *pAC; - if (dev->priv) { - pNet = (DEV_NET*) dev->priv; - pAC = pNet->pAC; - AllocFlag = pAC->AllocFlag; - if (pAC->PciDev) { - pci_release_regions(pAC->PciDev); - } - if (AllocFlag & SK_ALLOC_IRQ) { - free_irq(dev->irq, dev); - } - if (pAC->IoBase) { - iounmap(pAC->IoBase); - } - if (pAC->pDescrMem) { - BoardFreeMem(pAC); - } + pNet = netdev_priv(dev); + pAC = pNet->pAC; + AllocFlag = pAC->AllocFlag; + if (pAC->PciDev) { + pci_release_regions(pAC->PciDev); + } + if (AllocFlag & SK_ALLOC_IRQ) { + free_irq(dev->irq, dev); + } + if (pAC->IoBase) { + iounmap(pAC->IoBase); + } + if (pAC->pDescrMem) { + BoardFreeMem(pAC); } } /* FreeResources */ @@ -887,7 +885,7 @@ SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; /* @@ -1036,7 +1034,7 @@ SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; /* @@ -1152,7 +1150,7 @@ int i; SK_EVPARA EvPara; /* an event parameter union */ - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, @@ -1273,7 +1271,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC)); - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; #ifdef SK_DIAG_SUPPORT @@ -1284,7 +1282,7 @@ ** by operator interaction must not be started up ** again when the DIAG has finished. */ - newPtrNet = (DEV_NET *) pAC->dev[0]->priv; + newPtrNet = netdev_priv(pAC->dev[0]); if (newPtrNet == pNet) { pAC->WasIfUp[0] = SK_FALSE; } else { @@ -1394,7 +1392,7 @@ SK_AC *pAC; int Rc; /* return code of XmitFrame */ - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; if ((!skb_shinfo(skb)->nr_frags) || @@ -2490,7 +2488,7 @@ static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p) { -DEV_NET *pNet = (DEV_NET*) dev->priv; +DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; struct sockaddr *addr = p; @@ -2547,7 +2545,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeSetRxMode starts now... ")); - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; if (pAC->RlmtNets == 1) PortIdx = pAC->ActivePort; @@ -2619,7 +2617,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeChangeMtu starts now...\n")); - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; if ((NewMtu < 68) || (NewMtu > SK_JUMBO_MTU)) { @@ -2641,7 +2639,7 @@ #endif pNet->Mtu = NewMtu; - pOtherNet = (DEV_NET*)pAC->dev[1 - pNet->NetNr]->priv; + pOtherNet = netdev_priv(pAC->dev[1 - pNet->NetNr]); if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) { return(0); } @@ -2847,7 +2845,7 @@ */ static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev) { -DEV_NET *pNet = (DEV_NET*) dev->priv; +DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ @@ -2945,7 +2943,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeIoctl starts now...\n")); - pNet = (DEV_NET*) dev->priv; + pNet = netdev_priv(dev); pAC = pNet->pAC; if(copy_from_user(&Ioctl, rq->ifr_data, sizeof(SK_GE_IOCTL))) { @@ -4531,11 +4529,8 @@ int SkDrvEnterDiagMode( SK_AC *pAc) /* pointer to adapter context */ { - SK_AC *pAC = NULL; - DEV_NET *pNet = NULL; - - pNet = (DEV_NET *) pAc->dev[0]->priv; - pAC = pNet->pAC; + DEV_NET *pNet = netdev_priv(pAc->dev[0]); + SK_AC *pAC = pNet->pAC; SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct), sizeof(SK_PNMI_STRUCT_DATA)); @@ -4550,8 +4545,8 @@ } else { pAC->WasIfUp[0] = SK_FALSE; } - if (pNet != (DEV_NET *) pAc->dev[1]->priv) { - pNet = (DEV_NET *) pAc->dev[1]->priv; + if (pNet != netdev_priv(pAC->dev[1])) { + pNet = netdev_priv(pAC->dev[1]); if (pNet->Up) { pAC->WasIfUp[1] = SK_TRUE; pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ @@ -4897,7 +4892,7 @@ goto out_disable_device; } - pNet = dev->priv; + pNet = netdev_priv(dev); pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); if (!pNet->pAC) { printk(KERN_ERR "Unable to allocate adapter " @@ -4997,7 +4992,7 @@ } pAC->dev[1] = dev; - pNet = dev->priv; + pNet = netdev_priv(dev); pNet->PortNr = 1; pNet->NetNr = 1; pNet->pAC = pAC; @@ -5073,7 +5068,7 @@ static void __devexit skge_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - DEV_NET *pNet = (DEV_NET *) dev->priv; + DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; int have_second_mac = 0; From shemminger@osdl.org Thu Nov 11 16:09:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:25 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09sLp026065 for ; Thu, 11 Nov 2004 16:09:54 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09SPE011691 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:28 -0800 Date: Thu, 11 Nov 2004 16:00:08 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (13/23) sk98: handle ring full correctly Message-Id: <20041111160008.005fbca5@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11743 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 4929 Lines: 180 This driver needs to manage it's transmit queue properly. The hard_start_xmit needs to return OK if send successfully and BUSY (1) if queue is full. In either case must free skb, existing code would leak if tx ring filled! Also, check if queue is send fills queue and stop transmit queue as needed. In order to test for ring full w/o race, pull locking up from XmitFrame to SkGeXmit Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 15:56:39 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 15:56:39 -08:00 @@ -1396,59 +1396,43 @@ * Returns: * 0, if everything is ok * !=0, on error - * WARNING: returning 1 in 'tbusy' case caused system crashes (double - * allocated skb's) !!! */ static int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { -DEV_NET *pNet; -SK_AC *pAC; -int Rc; /* return code of XmitFrame */ - - pNet = netdev_priv(dev); - pAC = pNet->pAC; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + TX_PORT *pTxPort; + int rc; + unsigned long flags; + + if (pAC->RlmtNets == 2) + pTxPort = &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]; + else + pTxPort = &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW]; + spin_lock_irqsave(&pTxPort->TxDesRingLock, flags); if ((!skb_shinfo(skb)->nr_frags) || (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) { /* Don't activate scatter-gather and hardware checksum */ - - if (pAC->RlmtNets == 2) - Rc = XmitFrame( - pAC, - &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW], - skb); - else - Rc = XmitFrame( - pAC, - &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], - skb); + rc = XmitFrame( pAC, pTxPort, skb); } else { - /* scatter-gather and hardware TCP checksumming anabled*/ - if (pAC->RlmtNets == 2) - Rc = XmitFrameSG( - pAC, - &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW], - skb); - else - Rc = XmitFrameSG( - pAC, - &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], - skb); + rc = XmitFrameSG(pAC, pTxPort, skb); } - /* Transmitter out of resources? */ - if (Rc <= 0) { + /* No space left for next transmit */ + if (rc <= 0) netif_stop_queue(dev); - } - /* If not taken, give buffer ownership back to the - * queueing layer. - */ - if (Rc < 0) - return (1); + spin_unlock_irqrestore(&pTxPort->TxDesRingLock, flags); - dev->trans_start = jiffies; - return (0); + /* Transmit failed, out of resources */ + if (rc < 0) { + dev_kfree_skb(skb); + return NETDEV_TX_BUSY; + } else { + dev->trans_start = jiffies; + return NETDEV_TX_OK; + } } /* SkGeXmit */ @@ -1481,7 +1465,6 @@ { TXD *pTxd; /* the rxd to fill */ TXD *pOldTxd; - unsigned long Flags; SK_U64 PhysAddr; int Protocol; int IpHeaderLength; @@ -1489,7 +1472,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); - spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE FreeTxDescriptors(pAC, pTxPort); #endif @@ -1500,7 +1482,6 @@ */ FreeTxDescriptors(pAC, pTxPort); if (pTxPort->TxdRingFree == 0) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); SK_PNMI_CNT_NO_TX_BUF(pAC, pTxPort->PortIndex); SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, @@ -1523,7 +1504,6 @@ */ if (BytesSend < C_LEN_ETHERNET_MINSIZE) { if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); return 0; } pMessage->len = C_LEN_ETHERNET_MINSIZE; @@ -1598,16 +1578,7 @@ SK_OUT8(pTxPort->HwAddr, Q_CSR, CSR_START); } - /* - ** after releasing the lock, the skb may immediately be free'd - */ - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - if (pTxPort->TxdRingFree != 0) { - return (BytesSend); - } else { - return (0); - } - + return (pTxPort->TxdRingFree != 0); } /* XmitFrame */ /***************************************************************************** @@ -1640,16 +1611,13 @@ int Protocol; skb_frag_t *sk_frag; SK_U64 PhysAddr; - unsigned long Flags; - spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE FreeTxDescriptors(pAC, pTxPort); #endif if ((skb_shinfo(pMessage)->nr_frags +1) > pTxPort->TxdRingFree) { FreeTxDescriptors(pAC, pTxPort); if ((skb_shinfo(pMessage)->nr_frags + 1) > pTxPort->TxdRingFree) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); SK_PNMI_CNT_NO_TX_BUF(pAC, pTxPort->PortIndex); SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, @@ -1781,13 +1749,7 @@ pTxPort->pTxdRingPrev = pTxdLst; pTxPort->pTxdRingHead = pTxd; - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - - if (pTxPort->TxdRingFree > 0) { - return (BytesSend); - } else { - return (0); - } + return (pTxPort->TxdRingFree > 0); } /***************************************************************************** From shemminger@osdl.org Thu Nov 11 16:09:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:18 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09rND026051 for ; Thu, 11 Nov 2004 16:09:53 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09RPE011686 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:27 -0800 Date: Thu, 11 Nov 2004 15:54:25 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (5/23) sk98: use module_param Message-Id: <20041111155425.71002924@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11742 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 3188 Lines: 69 Use new format module_param rather than now deprecated MODULE_PARM Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:08:18 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:08:18 -08:00 @@ -109,6 +109,7 @@ #include "h/skversion.h" #include +#include #include #include @@ -358,26 +359,6 @@ MODULE_AUTHOR("Mirko Lindner "); MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver"); MODULE_LICENSE("GPL"); -MODULE_PARM(Speed_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Speed_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(AutoNeg_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(AutoNeg_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(DupCap_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(ConType, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -/* used for interrupt moderation */ -MODULE_PARM(IntsPerSec, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); -MODULE_PARM(Moderation, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Stats, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(ModerationMask, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(AutoSizing, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); - #ifdef LINK_SPEED_A static char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED; @@ -462,6 +443,26 @@ static char *ModerationMask[SK_MAX_CARD_PARAM]; static char *AutoSizing[SK_MAX_CARD_PARAM]; static char *Stats[SK_MAX_CARD_PARAM]; + +module_param_array(Speed_A, charp, NULL, 0); +module_param_array(Speed_B, charp, NULL, 0); +module_param_array(AutoNeg_A, charp, NULL, 0); +module_param_array(AutoNeg_B, charp, NULL, 0); +module_param_array(DupCap_A, charp, NULL, 0); +module_param_array(DupCap_B, charp, NULL, 0); +module_param_array(FlowCtrl_A, charp, NULL, 0); +module_param_array(FlowCtrl_B, charp, NULL, 0); +module_param_array(Role_A, charp, NULL, 0); +module_param_array(Role_B, charp, NULL, 0); +module_param_array(ConType, charp, NULL, 0); +module_param_array(PrefPort, charp, NULL, 0); +module_param_array(RlmtMode, charp, NULL, 0); +/* used for interrupt moderation */ +module_param_array(IntsPerSec, int, NULL, 0); +module_param_array(Moderation, charp, NULL, 0); +module_param_array(Stats, charp, NULL, 0); +module_param_array(ModerationMask, charp, NULL, 0); +module_param_array(AutoSizing, charp, NULL, 0); /***************************************************************************** * From shemminger@osdl.org Thu Nov 11 16:09:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:18 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09qfg026049 for ; Thu, 11 Nov 2004 16:09:52 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09QPE011681 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:26 -0800 Date: Thu, 11 Nov 2004 16:09:25 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (21/23) sk98: transmit ring barriers Message-Id: <20041111160925.69912766@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11741 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 7284 Lines: 235 Transmit descriptor control doesn't need to be volatile, it is much better to use explicit memory barriers. This generates better code and makes sure that ordering is maintained. When doing SG figure out the bits once rather than for each frag. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-10 11:29:09 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-10 11:29:09 -08:00 @@ -227,7 +227,7 @@ typedef struct s_TxD TXD; /* the transmit descriptor */ struct s_TxD { - volatile SK_U32 TBControl; /* Transmit Buffer Control */ + SK_U32 TBControl; /* Transmit Buffer Control */ SK_U32 VNextTxd; /* Next transmit descriptor,low dword */ SK_U32 VDataLow; /* Transmit Buffer Addr, low dword */ SK_U32 VDataHigh; /* Transmit Buffer Addr, high dword */ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-10 11:29:09 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-10 11:29:09 -08:00 @@ -1760,9 +1760,6 @@ TXD *pTxd; /* the rxd to fill */ TXD *pOldTxd; SK_U64 PhysAddr; - int Protocol; - int IpHeaderLength; - int BytesSend = pMessage->len; SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); @@ -1796,7 +1793,7 @@ ** the original packet end and the new packet end of 60 with 0x00. ** This is to resolve faulty padding by the HW with 0xaa bytes. */ - if (BytesSend < C_LEN_ETHERNET_MINSIZE) { + if (pMessage->len < C_LEN_ETHERNET_MINSIZE) { if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) { return 0; } @@ -1831,7 +1828,10 @@ pTxd->pMBuf = pMessage; if (pMessage->ip_summed == CHECKSUM_HW) { - Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); + SK_U8 Protocol = pMessage->data[C_OFFSET_IPPROTO]; + int IpHeaderLength + = (pMessage->data[C_OFFSET_IPHEADER]&0xf) * 4; + if ((Protocol == C_PROTO_ID_UDP) && (pAC->GIni.GIChipRev == 0) && (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { @@ -1840,13 +1840,11 @@ pTxd->TBControl = BMU_UDP_CHECK; } - IpHeaderLength = (SK_U8)pMessage->data[C_OFFSET_IPHEADER]; - IpHeaderLength = (IpHeaderLength & 0xf) * 4; pTxd->TcpSumOfs = 0; /* PH-Checksum already calculated */ - pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + - (Protocol == C_PROTO_ID_UDP ? - C_OFFSET_UDPHEADER_UDPCS : - C_OFFSET_TCPHEADER_TCPCS); + pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + + (Protocol == C_PROTO_ID_UDP ? + C_OFFSET_UDPHEADER_UDPCS : + C_OFFSET_TCPHEADER_TCPCS); pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; pTxd->TBControl |= BMU_OWN | BMU_STF | @@ -1863,6 +1861,7 @@ #endif pMessage->len; } + wmb(); /* ** If previous descriptor already done, give TX start cmd @@ -1901,9 +1900,8 @@ TXD *pTxdLst; int CurrFrag; int BytesSend; - int IpHeaderLength; - int Protocol; skb_frag_t *sk_frag; + SK_U32 CheckMsk; SK_U64 PhysAddr; #ifndef USE_TX_COMPLETE @@ -1925,7 +1923,6 @@ pTxdFst = pTxd; pTxdLst = pTxd; BytesSend = 0; - Protocol = 0; /* ** Map the first fragment (header) into the DMA-space @@ -1943,32 +1940,32 @@ ** Does the HW need to evaluate checksum for TCP or UDP packets? */ if (pMessage->ip_summed == CHECKSUM_HW) { - pTxd->TBControl = BMU_STF | BMU_STFWD | skb_headlen(pMessage); + SK_U8 Protocol = pMessage->data[C_OFFSET_IPPROTO]; + int IpHeaderLength + = (pMessage->data[C_OFFSET_IPHEADER]&0xf) * 4; + /* ** We have to use the opcode for tcp here, because the ** opcode for udp is not working in the hardware yet ** (Revision 2.0) */ - Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); if ((Protocol == C_PROTO_ID_UDP) && (pAC->GIni.GIChipRev == 0) && - (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { - pTxd->TBControl |= BMU_TCP_CHECK; - } else { - pTxd->TBControl |= BMU_UDP_CHECK; - } + (pAC->GIni.GIChipId == CHIP_ID_YUKON)) + CheckMsk = BMU_TCP_CHECK | BMU_STFWD; + else + CheckMsk = BMU_UDP_CHECK; - IpHeaderLength = ((SK_U8)pMessage->data[C_OFFSET_IPHEADER] & 0xf)*4; pTxd->TcpSumOfs = 0; /* PH-Checksum already claculated */ - pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + - (Protocol == C_PROTO_ID_UDP ? - C_OFFSET_UDPHEADER_UDPCS : - C_OFFSET_TCPHEADER_TCPCS); + pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + + (Protocol == C_PROTO_ID_UDP ? + C_OFFSET_UDPHEADER_UDPCS : + C_OFFSET_TCPHEADER_TCPCS); pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; - } else { - pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_STF | - skb_headlen(pMessage); - } + } else + CheckMsk = BMU_CHECK; + + pTxd->TBControl = CheckMsk | BMU_STF | skb_headlen(pMessage); pTxd = pTxd->pNextTxd; pTxPort->TxdRingFree--; @@ -1992,41 +1989,21 @@ pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); pTxd->pMBuf = pMessage; - /* - ** Does the HW need to evaluate checksum for TCP or UDP packets? - */ - if (pMessage->ip_summed == CHECKSUM_HW) { - pTxd->TBControl = BMU_OWN | BMU_SW | BMU_STFWD; - /* - ** We have to use the opcode for tcp here because the - ** opcode for udp is not working in the hardware yet - ** (revision 2.0) - */ - if ((Protocol == C_PROTO_ID_UDP) && - (pAC->GIni.GIChipRev == 0) && - (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { - pTxd->TBControl |= BMU_TCP_CHECK; - } else { - pTxd->TBControl |= BMU_UDP_CHECK; - } - } else { - pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_OWN; - } + pTxd->TBControl = BMU_OWN | BMU_SW | CheckMsk | sk_frag->size; /* ** Do we have the last fragment? */ if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags ) { #ifdef USE_TX_COMPLETE - pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF | sk_frag->size; + pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF; #else - pTxd->TBControl |= BMU_EOF | sk_frag->size; + pTxd->TBControl |= BMU_EOF; #endif + wmb(); pTxdFst->TBControl |= BMU_OWN | BMU_SW; - } else { - pTxd->TBControl |= sk_frag->size; - } + } pTxdLst = pTxd; pTxd = pTxd->pNextTxd; pTxPort->TxdRingFree--; @@ -2036,13 +2013,12 @@ /* ** If previous descriptor already done, give TX start cmd */ - if ((pTxPort->pTxdRingPrev->TBControl & BMU_OWN) == 0) { + pTxPort->pTxdRingHead = pTxd; + pTxd = xchg(&pTxPort->pTxdRingPrev, pTxdLst); + if ((pTxd->TBControl & BMU_OWN) == 0) { SK_OUT8(pTxPort->HwAddr, Q_CSR, CSR_START); } - pTxPort->pTxdRingPrev = pTxdLst; - pTxPort->pTxdRingHead = pTxd; - return (pTxPort->TxdRingFree > 0); } @@ -2080,6 +2056,7 @@ ** or BMU_OWN bit set in any frame */ while (1) { + rmb(); Control = pTxd->TBControl; if ((Control & BMU_SW) == 0) { /* @@ -2116,6 +2093,7 @@ pTxPort->TxdRingFree++; pTxd->TBControl &= ~BMU_SW; + wmb(); pTxd = pTxd->pNextTxd; /* point behind fragment with EOF */ } /* while(forever) */ } /* FreeTxDescriptors */ @@ -2674,6 +2652,7 @@ pTxd->TBControl &= ~BMU_OWN; pTxd = pTxd->pNextTxd; } + wmb(); FreeTxDescriptors(pAC, pTxPort); spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); } /* ClearTxRing */ From shemminger@osdl.org Thu Nov 11 16:09:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:26 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09v2N026092 for ; Thu, 11 Nov 2004 16:09:57 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09VPE011701 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:31 -0800 Date: Thu, 11 Nov 2004 15:54:40 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (6/23) sk98: add netpoll console support Message-Id: <20041111155440.617bc21f@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11744 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1267 Lines: 43 Add netpoll console support From: Michal Schmidt Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:08:32 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:08:32 -08:00 @@ -1125,6 +1125,24 @@ return SkIsrRetHandled; } /* SkGeIsrOnePort */ +#ifdef CONFIG_NET_POLL_CONTROLLER +/**************************************************************************** + * + * SkGePollController - polling receive, for netconsole + * + * Description: + * Polling receive - used by netconsole and other diagnostic tools + * to allow network i/o with interrupts disabled. + * + * Returns: N/A + */ +static void SkGePollController(struct net_device *dev) +{ + disable_irq(dev->irq); + SkGeIsr(dev->irq, dev, NULL); + enable_irq(dev->irq); +} +#endif /**************************************************************************** * @@ -4928,6 +4946,9 @@ dev->set_mac_address = &SkGeSetMacAddr; dev->do_ioctl = &SkGeIoctl; dev->change_mtu = &SkGeChangeMtu; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = &SkGePollController; +#endif dev->flags &= ~IFF_RUNNING; SET_NETDEV_DEV(dev, &pdev->dev); From shemminger@osdl.org Thu Nov 11 16:10:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:32 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A1aG026140 for ; Thu, 11 Nov 2004 16:10:01 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09YPE011712 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:34 -0800 Date: Thu, 11 Nov 2004 15:55:03 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (7/23) sk98: basic ethtool support Message-Id: <20041111155503.6e0349b8@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11746 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 13324 Lines: 378 The basic stuff comes from the newer code from SysKonnect, but I redid it using ethtool_ops and a cleaner way of doing the stats (from e100) Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile --- a/drivers/net/sk98lin/Makefile 2004-11-03 14:28:47 -08:00 +++ b/drivers/net/sk98lin/Makefile 2004-11-03 14:28:47 -08:00 @@ -13,6 +13,7 @@ obj-$(CONFIG_SK98LIN) += sk98lin.o sk98lin-objs := \ skge.o \ + skethtool.o \ skdim.o \ skaddr.o \ skgehwt.o \ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-03 14:28:47 -08:00 @@ -0,0 +1,330 @@ +/****************************************************************************** + * + * Name: skethtool.c + * Project: GEnesis, PCI Gigabit Ethernet Adapter + * Version: $Revision: 1.7 $ + * Date: $Date: 2004/09/29 13:32:07 $ + * Purpose: All functions regarding ethtool handling + * + ******************************************************************************/ + +/****************************************************************************** + * + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2004 Marvell. + * + * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet + * Server Adapters. + * + * Author: Ralph Roesler (rroesler@syskonnect.de) + * Mirko Lindner (mlindner@syskonnect.de) + * + * Address all question to: linux@syskonnect.de + * + * The technical manual for the adapters is available from SysKonnect's + * web pages: www.syskonnect.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The information in this file is provided "AS IS" without warranty. + * + *****************************************************************************/ + +#include "h/skdrv1st.h" +#include "h/skdrv2nd.h" +#include "h/skversion.h" + +#include +#include + +/****************************************************************************** + * + * Defines + * + *****************************************************************************/ + +#define SUPP_COPPER_ALL (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \ + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ + SUPPORTED_1000baseT_Half| SUPPORTED_1000baseT_Full| \ + SUPPORTED_TP) + +#define ADV_COPPER_ALL (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \ + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \ + ADVERTISED_1000baseT_Half| ADVERTISED_1000baseT_Full| \ + ADVERTISED_TP) + +#define SUPP_FIBRE_ALL (SUPPORTED_1000baseT_Full | \ + SUPPORTED_FIBRE | \ + SUPPORTED_Autoneg) + +#define ADV_FIBRE_ALL (ADVERTISED_1000baseT_Full | \ + ADVERTISED_FIBRE | \ + ADVERTISED_Autoneg) + + +/****************************************************************************** + * + * Local Functions + * + *****************************************************************************/ + +/***************************************************************************** + * + * getSettings - retrieves the current settings of the selected adapter + * + * Description: + * The current configuration of the selected adapter is returned. + * This configuration involves a)speed, b)duplex and c)autoneg plus + * a number of other variables. + * + * Returns: always 0 + * + */ +static int getSettings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + const DEV_NET *pNet = netdev_priv(dev); + int port = pNet->PortNr; + const SK_AC *pAC = pNet->pAC; + const SK_GEPORT *pPort = &pAC->GIni.GP[port]; + + static int DuplexAutoNegConfMap[9][3]= { + { -1 , -1 , -1 }, + { 0 , -1 , -1 }, + { SK_LMODE_HALF , DUPLEX_HALF, AUTONEG_DISABLE }, + { SK_LMODE_FULL , DUPLEX_FULL, AUTONEG_DISABLE }, + { SK_LMODE_AUTOHALF , DUPLEX_HALF, AUTONEG_ENABLE }, + { SK_LMODE_AUTOFULL , DUPLEX_FULL, AUTONEG_ENABLE }, + { SK_LMODE_AUTOBOTH , DUPLEX_FULL, AUTONEG_ENABLE }, + { SK_LMODE_AUTOSENSE , -1 , -1 }, + { SK_LMODE_INDETERMINATED, -1 , -1 } + }; + static int SpeedConfMap[6][2] = { + { 0 , -1 }, + { SK_LSPEED_AUTO , -1 }, + { SK_LSPEED_10MBPS , SPEED_10 }, + { SK_LSPEED_100MBPS , SPEED_100 }, + { SK_LSPEED_1000MBPS , SPEED_1000 }, + { SK_LSPEED_INDETERMINATED, -1 } + }; + static int AdvSpeedMap[6][2] = { + { 0 , -1 }, + { SK_LSPEED_AUTO , -1 }, + { SK_LSPEED_10MBPS , ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full }, + { SK_LSPEED_100MBPS , ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full }, + { SK_LSPEED_1000MBPS , ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full}, + { SK_LSPEED_INDETERMINATED, -1 } + }; + + ecmd->phy_address = port; + ecmd->speed = SpeedConfMap[pPort->PLinkSpeedUsed][1]; + ecmd->duplex = DuplexAutoNegConfMap[pPort->PLinkModeStatus][1]; + ecmd->autoneg = DuplexAutoNegConfMap[pPort->PLinkModeStatus][2]; + ecmd->transceiver = XCVR_INTERNAL; + + if (pAC->GIni.GICopperType) { + ecmd->port = PORT_TP; + ecmd->supported = (SUPP_COPPER_ALL|SUPPORTED_Autoneg); + if (pAC->GIni.GIGenesis) { + ecmd->supported &= ~(SUPPORTED_10baseT_Half); + ecmd->supported &= ~(SUPPORTED_10baseT_Full); + ecmd->supported &= ~(SUPPORTED_100baseT_Half); + ecmd->supported &= ~(SUPPORTED_100baseT_Full); + } else { + if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { + ecmd->supported &= ~(SUPPORTED_1000baseT_Half); + } +#ifdef CHIP_ID_YUKON_FE + if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { + ecmd->supported &= ~(SUPPORTED_1000baseT_Half); + ecmd->supported &= ~(SUPPORTED_1000baseT_Full); + } +#endif + } + if (pAC->GIni.GP[0].PLinkSpeed != SK_LSPEED_AUTO) { + ecmd->advertising = AdvSpeedMap[pPort->PLinkSpeed][1]; + if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { + ecmd->advertising &= ~(SUPPORTED_1000baseT_Half); + } + } else { + ecmd->advertising = ecmd->supported; + } + + if (ecmd->autoneg == AUTONEG_ENABLE) + ecmd->advertising |= ADVERTISED_Autoneg; + } else { + ecmd->port = PORT_FIBRE; + ecmd->supported = SUPP_FIBRE_ALL; + ecmd->advertising = ADV_FIBRE_ALL; + } + return 0; +} + +/***************************************************************************** + * + * setSettings - configures the settings of a selected adapter + * + * Description: + * Possible settings that may be altered are a)speed, b)duplex or + * c)autonegotiation. + * + * Returns: + * 0: everything fine, no error + * <0: the return value is the error code of the failure + */ +static int setSettings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + u32 instance; + char buf[4]; + int len = 1; + + if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100 + && ecmd->speed != SPEED_1000) + return -EINVAL; + + if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) + return -EINVAL; + + if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE) + return -EINVAL; + + if (ecmd->autoneg == AUTONEG_DISABLE) + *buf = (ecmd->duplex == DUPLEX_FULL) + ? SK_LMODE_FULL : SK_LMODE_HALF; + else + *buf = (ecmd->duplex == DUPLEX_FULL) + ? SK_LMODE_AUTOFULL : SK_LMODE_AUTOHALF; + + instance = 1 + (pAC->RlmtNets == 2) + pNet->PortNr; + if (SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE, + &buf, &len, instance, pNet->NetNr) != SK_PNMI_ERR_OK) + return -EINVAL; + + switch(ecmd->speed) { + case SPEED_1000: + *buf = SK_LSPEED_1000MBPS; + break; + case SPEED_100: + *buf = SK_LSPEED_100MBPS; + break; + case SPEED_10: + *buf = SK_LSPEED_10MBPS; + } + + if (SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE, + &buf, &len, instance, pNet->NetNr) != SK_PNMI_ERR_OK) + return -EINVAL; + + return 0; +} + +/***************************************************************************** + * + * getDriverInfo - returns generic driver and adapter information + * + * Description: + * Generic driver information is returned via this function, such as + * the name of the driver, its version and and firmware version. + * In addition to this, the location of the selected adapter is + * returned as a bus info string (e.g. '01:05.0'). + * + * Returns: N/A + * + */ +static void getDriverInfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + const DEV_NET *pNet = netdev_priv(dev); + const SK_AC *pAC = pNet->pAC; + char vers[32]; + + snprintf(vers, sizeof(vers)-1, VER_STRING "(v%d.%d)", + (pAC->GIni.GIPciHwRev >> 4) & 0xf, pAC->GIni.GIPciHwRev & 0xf); + + strlcpy(info->driver, DRIVER_FILE_NAME, sizeof(info->driver)); + strcpy(info->version, vers); + strcpy(info->fw_version, "N/A"); + strlcpy(info->bus_info, pAC->PciDev->slot_name, ETHTOOL_BUSINFO_LEN); +} + +/* + * Ethtool statistics support. + */ +static const char StringsStats[][ETH_GSTRING_LEN] = { + "rx_packets", "tx_packets", + "rx_bytes", "tx_bytes", + "rx_errors", "tx_errors", + "rx_dropped", "tx_dropped", + "multicasts", "collisions", + "rx_length_errors", "rx_buffer_overflow_errors", + "rx_crc_errors", "rx_frame_errors", + "rx_too_short_errors", "rx_too_long_errors", + "rx_carrier_extension_errors", "rx_symbol_errors", + "rx_llc_mac_size_errors", "rx_carrier_errors", + "rx_jabber_errors", "rx_missed_errors", + "tx_abort_collision_errors", "tx_carrier_errors", + "tx_buffer_underrun_errors", "tx_heartbeat_errors", + "tx_window_errors", +}; + +static int getStatsCount(struct net_device *dev) +{ + return ARRAY_SIZE(StringsStats); +} + +static void getStrings(struct net_device *dev, u32 stringset, u8 *data) +{ + switch(stringset) { + case ETH_SS_STATS: + memcpy(data, *StringsStats, sizeof(StringsStats)); + break; + } +} + +static void getEthtoolStats(struct net_device *dev, + struct ethtool_stats *stats, u64 *data) +{ + const DEV_NET *pNet = netdev_priv(dev); + const SK_AC *pAC = pNet->pAC; + const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + + *data++ = pPnmiStruct->Stat[0].StatRxOkCts; + *data++ = pPnmiStruct->Stat[0].StatTxOkCts; + *data++ = pPnmiStruct->Stat[0].StatRxOctetsOkCts; + *data++ = pPnmiStruct->Stat[0].StatTxOctetsOkCts; + *data++ = pPnmiStruct->InErrorsCts; + *data++ = pPnmiStruct->Stat[0].StatTxSingleCollisionCts; + *data++ = pPnmiStruct->RxNoBufCts; + *data++ = pPnmiStruct->TxNoBufCts; + *data++ = pPnmiStruct->Stat[0].StatRxMulticastOkCts; + *data++ = pPnmiStruct->Stat[0].StatTxSingleCollisionCts; + *data++ = pPnmiStruct->Stat[0].StatRxRuntCts; + *data++ = pPnmiStruct->Stat[0].StatRxFifoOverflowCts; + *data++ = pPnmiStruct->Stat[0].StatRxFcsCts; + *data++ = pPnmiStruct->Stat[0].StatRxFramingCts; + *data++ = pPnmiStruct->Stat[0].StatRxShortsCts; + *data++ = pPnmiStruct->Stat[0].StatRxTooLongCts; + *data++ = pPnmiStruct->Stat[0].StatRxCextCts; + *data++ = pPnmiStruct->Stat[0].StatRxSymbolCts; + *data++ = pPnmiStruct->Stat[0].StatRxIRLengthCts; + *data++ = pPnmiStruct->Stat[0].StatRxCarrierCts; + *data++ = pPnmiStruct->Stat[0].StatRxJabberCts; + *data++ = pPnmiStruct->Stat[0].StatRxMissedCts; + *data++ = pAC->stats.tx_aborted_errors; + *data++ = pPnmiStruct->Stat[0].StatTxCarrierCts; + *data++ = pPnmiStruct->Stat[0].StatTxFifoUnderrunCts; + *data++ = pPnmiStruct->Stat[0].StatTxCarrierCts; + *data++ = pAC->stats.tx_window_errors; +} + +struct ethtool_ops SkGeEthtoolOps = { + .get_settings = getSettings, + .set_settings = setSettings, + .get_drvinfo = getDriverInfo, + .get_strings = getStrings, + .get_stats_count = getStatsCount, + .get_ethtool_stats = getEthtoolStats, +}; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:28:47 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:28:47 -08:00 @@ -255,6 +255,7 @@ /* global variables *********************************************************/ struct SK_NET_DEVICE *SkGeRootDev = NULL; static SK_BOOL DoPrintInterfaceChange = SK_TRUE; +extern struct ethtool_ops SkGeEthtoolOps; /* local variables **********************************************************/ static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; @@ -4951,6 +4952,7 @@ #endif dev->flags &= ~IFF_RUNNING; SET_NETDEV_DEV(dev, &pdev->dev); + SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); #ifdef SK_ZEROCOPY #ifdef USE_SK_TX_CHECKSUM @@ -5030,6 +5032,8 @@ dev->do_ioctl = &SkGeIoctl; dev->change_mtu = &SkGeChangeMtu; dev->flags &= ~IFF_RUNNING; + SET_NETDEV_DEV(dev, &pdev->dev); + SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); #ifdef SK_ZEROCOPY #ifdef USE_SK_TX_CHECKSUM From shemminger@osdl.org Thu Nov 11 16:09:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:28 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09u7n026088 for ; Thu, 11 Nov 2004 16:09:56 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09TPE011695 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:30 -0800 Date: Thu, 11 Nov 2004 16:09:55 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (22/23) sk98: diag code changes Message-Id: <20041111160955.4570b327@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11745 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 6261 Lines: 196 Cleanup DIAG support code. * Use type safe structure assignment rather than memcpy * PCI device number is available in pci_dev don't need to go string parsing to find it. * Compile correctly if SK_DIAG_SUPPORT not defined Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-11 14:17:16 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-11 14:17:16 -08:00 @@ -364,10 +364,8 @@ SK_TIMER ModTimer; /* just some timer */ }; -#ifdef SK_DIAG_SUPPORT #define DIAG_ACTIVE 1 #define DIAG_NOTACTIVE 0 -#endif /**************************************************************************** * Per board structure / Adapter Context structure: diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-11 14:17:16 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-11 14:17:16 -08:00 @@ -219,7 +219,6 @@ static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*); #ifdef SK_DIAG_SUPPORT -static SK_U32 ParseDeviceNbrFromSlotName(const char *SlotName); static int SkDrvInitAdapter(SK_AC *pAC, int devNbr); static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr); #endif @@ -460,8 +459,9 @@ pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; - memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); - memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); +#ifdef SK_DIAG_SUPPORT + pAC->PnmiBackup = pAC->PnmiStruct; +#endif #ifdef USE_SK_RX_CHECKSUM pAC->RxPort[0].UseRxCsum = SK_TRUE; @@ -1565,7 +1565,6 @@ struct net_device *dev) { DEV_NET *pNet = netdev_priv(dev); - DEV_NET *newPtrNet; SK_AC *pAC = pNet->pAC; unsigned long Flags; /* for spin lock */ @@ -1579,6 +1578,7 @@ #ifdef SK_DIAG_SUPPORT if (pAC->DiagModeActive == DIAG_ACTIVE) { if (pAC->DiagFlowCtrl == SK_FALSE) { + DEV_NET *newPtrNet; /* ** notify that the interface which has been closed ** by operator interaction must not be started up @@ -1662,10 +1662,9 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: done ")); - SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA)); - SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); - +#ifdef SK_DIAG_SUPPORT + pAC->PnmiBackup = pAC->PnmiStruct; +#endif pAC->MaxPorts--; return (0); @@ -3103,7 +3102,6 @@ DEV_NET *pNet; SK_AC *pAC; void *pMemBuf; -struct pci_dev *pdev = NULL; SK_GE_IOCTL Ioctl; unsigned int Err = 0; int Size = 0; @@ -3185,7 +3183,6 @@ Err = -EFAULT; goto fault_diag; } - pdev = pAC->PciDev; Length = 3 * sizeof(SK_U32); /* Error, Bus and Device */ /* ** While coding this new IOCTL interface, only a few lines of code @@ -3194,8 +3191,8 @@ ** should be used... */ * ((SK_U32 *)pMemBuf) = 0; - * ((SK_U32 *)pMemBuf + 1) = pdev->bus->number; - * ((SK_U32 *)pMemBuf + 2) = ParseDeviceNbrFromSlotName(pdev->slot_name); + * ((SK_U32 *)pMemBuf + 1) = pAC->PciDev->bus->number; + * ((SK_U32 *)pMemBuf + 2) = PCI_SLOT(pAC->PciDev->devfn); if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_diag; @@ -4676,8 +4673,7 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); + pAc->PnmiBackup = pAC->PnmiStruct; pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { @@ -4718,8 +4714,7 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - SK_MEMCPY(&(pAc->PnmiStruct), &(pAc->PnmiBackup), - sizeof(SK_PNMI_STRUCT_DATA)); + pAc->PnmiStruct = pAc->PnmiBackup; pAc->DiagModeActive = DIAG_NOTACTIVE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) { @@ -4735,61 +4730,6 @@ return(0); } -/***************************************************************************** - * - * ParseDeviceNbrFromSlotName - Evaluate PCI device number - * - * Description: - * This function parses the PCI slot name information string and will - * retrieve the devcie number out of it. The slot_name maintianed by - * linux is in the form of '02:0a.0', whereas the first two characters - * represent the bus number in hex (in the sample above this is - * pci bus 0x02) and the next two characters the device number (0x0a). - * - * Returns: - * SK_U32: The device number from the PCI slot name - */ - -static SK_U32 ParseDeviceNbrFromSlotName( -const char *SlotName) /* pointer to pci slot name eg. '02:0a.0' */ -{ - char *CurrCharPos = (char *) SlotName; - int FirstNibble = -1; - int SecondNibble = -1; - SK_U32 Result = 0; - - while (*CurrCharPos != '\0') { - if (*CurrCharPos == ':') { - while (*CurrCharPos != '.') { - CurrCharPos++; - if ( (*CurrCharPos >= '0') && - (*CurrCharPos <= '9')) { - if (FirstNibble == -1) { - /* dec. value for '0' */ - FirstNibble = *CurrCharPos - 48; - } else { - SecondNibble = *CurrCharPos - 48; - } - } else if ( (*CurrCharPos >= 'a') && - (*CurrCharPos <= 'f') ) { - if (FirstNibble == -1) { - FirstNibble = *CurrCharPos - 87; - } else { - SecondNibble = *CurrCharPos - 87; - } - } else { - Result = 0; - } - } - - Result = FirstNibble; - Result = Result << 4; /* first nibble is higher one */ - Result = Result | SecondNibble; - } - CurrCharPos++; /* next character */ - } - return (Result); -} /**************************************************************************** * diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-11 14:17:16 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-11 14:17:16 -08:00 @@ -76,7 +76,7 @@ Size = SK_PNMI_STRUCT_SIZE; #ifdef SK_DIAG_SUPPORT if (pAC->BoardLevel == SK_INIT_DATA) { - SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); + pAC->PnmiStruct = pAC->PnmiBackup; if (pAC->DiagModeActive == DIAG_NOTACTIVE) { pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; } From shemminger@osdl.org Thu Nov 11 16:09:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:36 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC09xbf026117 for ; Thu, 11 Nov 2004 16:09:59 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09WPE011707 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:32 -0800 Date: Thu, 11 Nov 2004 16:01:13 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (15/23) sk98: rearrange initialization Message-Id: <20041111160113.15a356cd@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11747 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 18106 Lines: 628 The code in the latest SysKonnect driver is arranged differently, this aligns the two versions to allow for easier comparisons. Also: Don't enable the pci device twice. Add common SkGeDevInit for common code used to setup both ports Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-05 16:54:01 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-05 16:54:01 -08:00 @@ -111,6 +111,7 @@ #include #include #include +#include #include #include "h/skdrv1st.h" @@ -179,8 +180,11 @@ * ******************************************************************************/ +static int sk98lin_init_device(struct pci_dev *pdev, const struct pci_device_id *ent); +static void sk98lin_remove_device(struct pci_dev *pdev); static void FreeResources(struct net_device *dev); static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC); +static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev); static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); @@ -251,6 +255,7 @@ extern void SkDimStartModerationTimer(SK_AC *pAC); extern void SkDimModerate(SK_AC *pAC); extern void SkGeBlinkTimer(unsigned long data); +extern struct ethtool_ops SkGeEthtoolOps; #ifdef DEBUG static void DumpMsg(struct sk_buff*, char*); @@ -260,12 +265,237 @@ /* global variables *********************************************************/ static SK_BOOL DoPrintInterfaceChange = SK_TRUE; -extern struct ethtool_ops SkGeEthtoolOps; +static const char *BootString = BOOT_STRING; /* local variables **********************************************************/ static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; + +static struct pci_device_id sk98lin_pci_tbl[] = { + { PCI_VENDOR_ID_3COM, 0x1700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, +#if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */ + { PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, +#endif + { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0, } +}; + +static struct pci_driver skge_driver = { + .name = DRIVER_FILE_NAME, + .id_table = sk98lin_pci_tbl, + .probe = sk98lin_init_device, + .remove = __devexit_p(sk98lin_remove_device), +}; + +/***************************************************************************** + * + * sk98lin_init_device - initialize the adapter + * + * Description: + * This function initializes the adapter. Resources for + * the adapter are allocated and the adapter is brought into Init 1 + * state. + * + * Returns: + * 0, if everything is ok + * !=0, on error + */ +static int __devinit sk98lin_init_device(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + SK_AC *pAC; + DEV_NET *pNet = NULL; + struct net_device *dev = NULL; + static int boards_found = 0; + int error = -ENODEV; + + error = pci_enable_device(pdev); + if (error) { + printk(KERN_ERR "sk98lin: cannot enable PCI device, aborting\n"); + goto out; + } + + /* Configure DMA attributes. */ + if ((error = pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL)) || + (error = pci_set_dma_mask(pdev, (u64) 0xffffffff))) { + printk(KERN_ERR "sk98lin: cannot set PCI dma mask\n"); + goto out_disable_device; + } + + /* Allocate both structures for first port, + and only one for second port. */ + dev = alloc_etherdev(sizeof(DEV_NET)); + if (!dev) { + printk(KERN_ERR "sk98lin: unable to allocate etherdev structure!\n"); + error = -ENOMEM; + goto out_disable_device; + } + + pNet = netdev_priv(dev); + pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); + if (pNet->pAC == NULL){ + printk(KERN_ERR "sk98lin: unable to allocate adapter structure!\n"); + error = -ENOMEM; + goto out_free_netdev; + } + + if (BootString) { + printk("%s\n", BootString); + BootString = NULL; + } + + memset(pNet->pAC, 0, sizeof(SK_AC)); + pAC = pNet->pAC; + pAC->PciDev = pdev; + pAC->dev[0] = dev; + pAC->dev[1] = dev; + pAC->CheckQueue = SK_FALSE; + + dev->irq = pdev->irq; + + strcpy(dev->name, pci_name(pdev)); /* use PCI for early messages */ + error = SkGeInitPCI(pAC); + if (error) { + printk("SKGE: PCI setup failed: %i\n", error); + goto out_free_adapter; + } + + SkGeDevInit(dev, pdev); + + pAC->Index = boards_found++; + + if (SkGeBoardInit(dev, pAC)) + goto out_free_adapter; + +#ifdef SK_ZEROCOPY +#ifdef USE_SK_TX_CHECKSUM + if (pAC->ChipsetType) + /* Use only if yukon hardware */ + /* SK and ZEROCOPY - fly baby... */ + dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; +#endif +#endif + + /* Register net device */ + strcpy(dev->name, "eth%d"); + if (register_netdev(dev)) { + printk(KERN_ERR "SKGE: Could not register device.\n"); + goto out_free_resources; + } + + SkGeProcCreate(dev); + + /* Print adapter specific string from vpd */ + PrintProductStr(dev->name, pAC); + + /* Print configuration settings */ + printk(" PrefPort:%c RlmtMode:%s\n", + 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber, + (pAC->RlmtMode==0) ? "Check Link State" : + ((pAC->RlmtMode==1) ? "Check Link State" : + ((pAC->RlmtMode==3) ? "Check Local Port" : + ((pAC->RlmtMode==7) ? "Check Segmentation" : + ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error"))))); + + SkGeYellowLED(pAC, pAC->IoBase, 1); + + memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); + + /* More then one port found */ + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { + printk(KERN_ERR "Unable to allocate etherdev " + "structure!\n"); + goto out; + } + + pAC->dev[1] = dev; + pNet = netdev_priv(dev); + pNet->PortNr = 1; + pNet->NetNr = 1; + pNet->pAC = pAC; + + memcpy(&dev->dev_addr, + &pAC->Addr.Net[1].CurrentMacAddress, 6); + + SkGeDevInit(dev, pdev); + +#ifdef SK_ZEROCOPY +#ifdef USE_SK_TX_CHECKSUM + if (pAC->ChipsetType) + /* Use only if yukon hardware */ + /* SK and ZEROCOPY - fly baby... */ + dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; +#endif +#endif + + + if (register_netdev(dev)) { + printk(KERN_ERR "SKGE: Could not register device.\n"); + free_netdev(dev); + pAC->dev[1] = pAC->dev[0]; + } else { + SkGeProcCreate(dev); + PrintProductStr(dev->name, pAC); + printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); + } + } + + /* Save the hardware revision */ + pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + + (pAC->GIni.GIPciHwRev & 0x0F); + + /* Set driver globals */ + pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; + pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; + + memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); + memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); + + pci_set_drvdata(pdev, dev); + return 0; + + out_free_resources: + FreeResources(dev); + out_free_adapter: + kfree(pAC); + out_free_netdev: + free_netdev(dev); + out_disable_device: + pci_disable_device(pdev); + out: + return error; +} + +static void SkGeDevInit(struct net_device *dev, struct pci_dev *pdev) +{ + SET_MODULE_OWNER(dev); + dev->open = &SkGeOpen; + dev->stop = &SkGeClose; + dev->hard_start_xmit = &SkGeXmit; + dev->get_stats = &SkGeStats; + dev->set_multicast_list = &SkGeSetRxMode; + dev->set_mac_address = &SkGeSetMacAddr; + dev->do_ioctl = &SkGeIoctl; + dev->change_mtu = &SkGeChangeMtu; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = &SkGePollController; +#endif + SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); + SET_NETDEV_DEV(dev, &pdev->dev); +} + + /***************************************************************************** * * SkGeInitPCI - Init the PCI resources @@ -276,16 +506,12 @@ * Returns: N/A * */ -int SkGeInitPCI(SK_AC *pAC) +static int SkGeInitPCI(SK_AC *pAC) { struct net_device *dev = pAC->dev[0]; struct pci_dev *pdev = pAC->PciDev; int retval; - if (pci_enable_device(pdev) != 0) { - return 1; - } - dev->mem_start = pci_resource_start (pdev, 0); pci_set_master(pdev); @@ -326,7 +552,6 @@ return retval; } - /***************************************************************************** * * FreeResources - release resources allocated for adapter @@ -462,6 +687,69 @@ /***************************************************************************** * + * sk98lin_remove_device - device deinit function + * + * Description: + * Disable adapter if it is still running, free resources, + * free device struct. + * + * Returns: N/A + */ +static void __devexit sk98lin_remove_device(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + struct net_device *dev1 = pAC->dev[1]; + + if (dev1 != dev) { + unregister_netdev(dev1); + SkGeProcRemove(dev1); + } + + SkGeProcRemove(dev); + unregister_netdev(dev); + + SkGeYellowLED(pAC, pAC->IoBase, 0); + + if (pAC->BoardLevel == SK_INIT_RUN) { + SK_EVPARA EvPara; + unsigned long Flags; + + /* board is still alive */ + spin_lock_irqsave(&pAC->SlowPathLock, Flags); + EvPara.Para32[0] = 0; + EvPara.Para32[1] = -1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); + EvPara.Para32[0] = 1; + EvPara.Para32[1] = -1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); + SkEventDispatcher(pAC, pAC->IoBase); + /* disable interrupts */ + SK_OUT32(pAC->IoBase, B0_IMSK, 0); + SkGeDeInit(pAC, pAC->IoBase); + spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); + pAC->BoardLevel = SK_INIT_DATA; + /* We do NOT check here, if IRQ was pending, of course*/ + } + + if (pAC->BoardLevel == SK_INIT_IO) { + /* board is still alive */ + SkGeDeInit(pAC, pAC->IoBase); + pAC->BoardLevel = SK_INIT_DATA; + } + + FreeResources(dev); + + if (dev1 != dev) + free_netdev(dev1); + free_netdev(dev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); +} + +/***************************************************************************** + * * SkGeBoardInit - do level 0 and 1 initialization * * Description: @@ -4821,253 +5109,6 @@ #endif -static int __devinit skge_probe_one(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - SK_AC *pAC; - DEV_NET *pNet = NULL; - struct net_device *dev = NULL; - static int boards_found = 0; - int error = -ENODEV; - - if (pci_enable_device(pdev)) - goto out; - - /* Configure DMA attributes. */ - if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL) && - pci_set_dma_mask(pdev, (u64) 0xffffffff)) - goto out_disable_device; - - - if ((dev = alloc_etherdev(sizeof(DEV_NET))) == NULL) { - printk(KERN_ERR "Unable to allocate etherdev " - "structure!\n"); - goto out_disable_device; - } - - pNet = netdev_priv(dev); - pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); - if (!pNet->pAC) { - printk(KERN_ERR "Unable to allocate adapter " - "structure!\n"); - goto out_free_netdev; - } - - memset(pNet->pAC, 0, sizeof(SK_AC)); - pAC = pNet->pAC; - pAC->PciDev = pdev; - pAC->dev[0] = dev; - pAC->dev[1] = dev; - pAC->CheckQueue = SK_FALSE; - - dev->irq = pdev->irq; - error = SkGeInitPCI(pAC); - if (error) { - printk("SKGE: PCI setup failed: %i\n", error); - goto out_free_netdev; - } - - SET_MODULE_OWNER(dev); - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; -#ifdef CONFIG_NET_POLL_CONTROLLER - dev->poll_controller = &SkGePollController; -#endif - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* Use only if yukon hardware */ - /* SK and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif - - pAC->Index = boards_found++; - - if (SkGeBoardInit(dev, pAC)) - goto out_free_netdev; - - /* Register net device */ - if (register_netdev(dev)) { - printk(KERN_ERR "SKGE: Could not register device.\n"); - goto out_free_resources; - } - - /* Print adapter specific string from vpd */ - PrintProductStr(dev->name, pAC); - - /* Print configuration settings */ - printk(" PrefPort:%c RlmtMode:%s\n", - 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber, - (pAC->RlmtMode==0) ? "Check Link State" : - ((pAC->RlmtMode==1) ? "Check Link State" : - ((pAC->RlmtMode==3) ? "Check Local Port" : - ((pAC->RlmtMode==7) ? "Check Segmentation" : - ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error"))))); - - SkGeYellowLED(pAC, pAC->IoBase, 1); - - - memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); - - SkGeProcCreate(dev); - - /* More then one port found */ - if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { - if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { - printk(KERN_ERR "Unable to allocate etherdev " - "structure!\n"); - goto out; - } - - pAC->dev[1] = dev; - pNet = netdev_priv(dev); - pNet->PortNr = 1; - pNet->NetNr = 1; - pNet->pAC = pAC; - - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* SG and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif - - if (register_netdev(dev)) { - printk(KERN_ERR "SKGE: Could not register device.\n"); - free_netdev(dev); - pAC->dev[1] = pAC->dev[0]; - } else { - SkGeProcCreate(dev); - memcpy(&dev->dev_addr, - &pAC->Addr.Net[1].CurrentMacAddress, 6); - - PrintProductStr(dev->name, pAC); - printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); - } - } - - /* Save the hardware revision */ - pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + - (pAC->GIni.GIPciHwRev & 0x0F); - - /* Set driver globals */ - pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; - pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; - - memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); - memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); - - pci_set_drvdata(pdev, dev); - return 0; - - out_free_resources: - FreeResources(dev); - out_free_netdev: - free_netdev(dev); - out_disable_device: - pci_disable_device(pdev); - out: - return error; -} - -static void __devexit skge_remove_one(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - DEV_NET *pNet = netdev_priv(dev); - SK_AC *pAC = pNet->pAC; - struct net_device *otherdev = pAC->dev[1]; - - SkGeProcRemove(dev); - unregister_netdev(dev); - if (otherdev != dev) - SkGeProcRemove(otherdev); - - SkGeYellowLED(pAC, pAC->IoBase, 0); - - if (pAC->BoardLevel == SK_INIT_RUN) { - SK_EVPARA EvPara; - unsigned long Flags; - - /* board is still alive */ - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - EvPara.Para32[0] = 0; - EvPara.Para32[1] = -1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); - EvPara.Para32[0] = 1; - EvPara.Para32[1] = -1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); - SkEventDispatcher(pAC, pAC->IoBase); - /* disable interrupts */ - SK_OUT32(pAC->IoBase, B0_IMSK, 0); - SkGeDeInit(pAC, pAC->IoBase); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - pAC->BoardLevel = SK_INIT_DATA; - /* We do NOT check here, if IRQ was pending, of course*/ - } - - if (pAC->BoardLevel == SK_INIT_IO) { - /* board is still alive */ - SkGeDeInit(pAC, pAC->IoBase); - pAC->BoardLevel = SK_INIT_DATA; - } - - FreeResources(dev); - free_netdev(dev); - if (otherdev != dev) - free_netdev(otherdev); - kfree(pAC); -} - -static struct pci_device_id skge_pci_tbl[] = { - { PCI_VENDOR_ID_3COM, 0x1700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, -#if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */ - { PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, -#endif - { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { 0, } -}; - -static struct pci_driver skge_driver = { - .name = "skge", - .id_table = skge_pci_tbl, - .probe = skge_probe_one, - .remove = __devexit_p(skge_remove_one), -}; static int __init skge_init(void) { From shemminger@osdl.org Thu Nov 11 16:10:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:39 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A2Dq026151 for ; Thu, 11 Nov 2004 16:10:02 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09aPE011717 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:36 -0800 Date: Thu, 11 Nov 2004 16:01:21 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (14/23) sk98: don't obfuscate irqreturn_t Message-Id: <20041111160121.7e3d20b6@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11748 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 6107 Lines: 209 Dont redefine irqreturn_t and dev_kfree anymore. It probably was done for compatiablity with 2.4 but we are past that point now. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 16:26:15 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 16:26:15 -08:00 @@ -166,22 +166,12 @@ // #define CON_TYPE {"Auto", } // #define RLMT_MODE {"CheckLinkState", } -#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb) -#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb) -#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb) - - /* Set blink mode*/ #define OEM_CONFIG_VALUE ( SK_ACT_LED_BLINK | \ SK_DUP_LED_NORMAL | \ SK_LED_LINK100_ON) -/* Isr return value */ -#define SkIsrRetVar irqreturn_t -#define SkIsrRetNone IRQ_NONE -#define SkIsrRetHandled IRQ_HANDLED - /******************************************************************************* * @@ -195,8 +185,8 @@ static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); -static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); -static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct net_device *dev); static int SkGeClose(struct net_device *dev); static int SkGeXmit(struct sk_buff *skb, struct net_device *dev); @@ -895,7 +885,7 @@ * Returns: N/A * */ -static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; @@ -909,8 +899,8 @@ * Check and process if its our interrupt */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); - if (IntSrc == 0) { - return SkIsrRetNone; + if (IntSrc == 0 || IntSrc == ~0) { + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { @@ -1027,7 +1017,7 @@ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return SkIsrRetHandled; + return IRQ_HANDLED; } /* SkGeIsr */ @@ -1044,12 +1034,12 @@ * Returns: N/A * */ -static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { -struct net_device *dev = (struct net_device *)dev_id; -DEV_NET *pNet; -SK_AC *pAC; -SK_U32 IntSrc; /* interrupts source register contents */ +struct net_device *dev = (struct net_device *)dev_id; +DEV_NET *pNet; +SK_AC *pAC; +SK_U32 IntSrc; /* interrupts source register contents */ pNet = netdev_priv(dev); pAC = pNet->pAC; @@ -1058,30 +1048,30 @@ * Check and process if its our interrupt */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); - if (IntSrc == 0) { - return SkIsrRetNone; + if (IntSrc == 0 || IntSrc == ~0) { + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { #if 0 /* software irq currently not used */ if (IntSrc & IS_IRQ_SW) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("Software IRQ\n")); + SK_DBGCAT_DRV_INT_SRC, + ("Software IRQ\n")); } #endif if (IntSrc & IS_R1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF RX1 IRQ\n")); + SK_DBGCAT_DRV_INT_SRC, + ("EOF RX1 IRQ\n")); ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); SK_PNMI_CNT_RX_INTR(pAC, 0); } #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ if (IntSrc & IS_XA1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF AS TX1 IRQ\n")); + SK_DBGCAT_DRV_INT_SRC, + ("EOF AS TX1 IRQ\n")); SK_PNMI_CNT_TX_INTR(pAC, 0); spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]); @@ -1132,13 +1122,13 @@ * SkGeDrvEvent(), because it is timer * guarded now * - ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); - */ + ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); + */ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return SkIsrRetHandled; + return IRQ_HANDLED; } /* SkGeIsrOnePort */ #ifdef CONFIG_NET_POLL_CONTROLLER @@ -1837,7 +1827,7 @@ PCI_DMA_TODEVICE); if (Control & BMU_EOF) - DEV_KFREE_SKB_ANY(pTxd->pMBuf); /* free message */ + dev_kfree_skb_any(pTxd->pMBuf); /* free message */ pTxPort->TxdRingFree++; pTxd->TBControl &= ~BMU_SW; @@ -2267,7 +2257,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, ("D")); - DEV_KFREE_SKB(pMsg); + dev_kfree_skb(pMsg); } } /* if not for rlmt */ @@ -2316,7 +2306,7 @@ pAC->dev[pRxPort->PortIndex]->last_rx = jiffies; } else { - DEV_KFREE_SKB(pMsg); + dev_kfree_skb(pMsg); } } /* if packet for rlmt */ @@ -2343,7 +2333,7 @@ PhysAddr, pAC->RxBufSize - 2, PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB_IRQ(pRxd->pMBuf); + dev_kfree_skb_irq(pRxd->pMBuf); pRxd->pMBuf = NULL; pRxPort->RxdRingFree++; pRxPort->pRxdRingHead = pRxd->pNextRxd; @@ -2426,7 +2416,7 @@ PhysAddr, pAC->RxBufSize - 2, PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB(pRxd->pMBuf); + dev_kfree_skb(pRxd->pMBuf); pRxd->pMBuf = NULL; } pRxd->RBControl &= BMU_OWN; @@ -3935,7 +3925,7 @@ pFreeMbuf = pMbuf; do { pNextMbuf = pFreeMbuf->pNext; - DEV_KFREE_SKB_ANY(pFreeMbuf->pOs); + dev_kfree_skb_any(pFreeMbuf->pOs); pFreeMbuf = pNextMbuf; } while ( pFreeMbuf != NULL ); } /* SkDrvFreeRlmtMbuf */ @@ -4406,7 +4396,7 @@ if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW], pMsg) < 0) - DEV_KFREE_SKB_ANY(pMsg); + dev_kfree_skb_any(pMsg); break; case SK_DRV_TIMER: if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) { From shemminger@osdl.org Thu Nov 11 16:10:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:43 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0AACB026217 for ; Thu, 11 Nov 2004 16:10:10 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09iPE011748 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:44 -0800 Date: Thu, 11 Nov 2004 15:57:44 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (12/23) sk98: add module version Message-Id: <20041111155744.3119f256@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11750 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 564 Lines: 15 Add MODULE_VERSION to build process Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 15:35:02 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 15:35:02 -08:00 @@ -350,6 +350,7 @@ MODULE_AUTHOR("Mirko Lindner "); MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver"); MODULE_LICENSE("GPL"); +MODULE_VERSION(VER_STRING); #ifdef LINK_SPEED_A static char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED; From shemminger@osdl.org Thu Nov 11 16:10:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:39 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A4ZT026168 for ; Thu, 11 Nov 2004 16:10:04 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09cPE011726 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:38 -0800 Date: Thu, 11 Nov 2004 16:02:25 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (16/23) sk98: more efficient time OsGetTime Message-Id: <20041111160225.1185793e@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11749 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 2901 Lines: 104 Avoid doing a gettimeofday to only get low resolution time. Can use jiffies_64 and internal 64 bit divide to get what is needed. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-03 17:06:12 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-03 17:06:12 -08:00 @@ -96,9 +96,6 @@ #define SK_BIG_ENDIAN #endif -/* we use gethrtime(), return unit: nanoseconds */ -#define SK_TICKS_PER_SEC 100 - #define SK_MEM_MAPPED_IO // #define SK_RLMT_SLOW_LOOKAHEAD diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-03 17:06:12 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-03 17:06:12 -08:00 @@ -56,7 +56,6 @@ extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); -extern SK_U64 SkOsGetTime(SK_AC*); extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*); extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*); extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*); @@ -83,25 +82,28 @@ }; -/* - * Time macros - */ -#if SK_TICKS_PER_SEC == 100 -#define SK_PNMI_HUNDREDS_SEC(t) (t) +/* Units used for timing measurements. */ +#define SK_TICKS_PER_SEC HZ + +/* OS time value in HZ (1000 or 100) */ +static inline SK_U64 SkOsGetTime(const SK_AC *pAC) +{ + return get_jiffies_64(); +} + +/* Convert OS time units to hundredth's of sec */ +static inline SK_U64 jiffies_64_to_hsecs(u64 t) +{ +#if (HZ % 100) == 0 + do_div(t, HZ / 100); #else -#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t) * 100) / \ - (SK_TICKS_PER_SEC)) + t *= 100; + do_div(x, HZ); #endif - -/* - * New SkOsGetTime - */ -#define SkOsGetTimeCurrent(pAC, pUsec) {\ - struct timeval t;\ - do_gettimeofday(&t);\ - *pUsec = ((((t.tv_sec) * 1000000L)+t.tv_usec)/10000);\ + return t; } +#define SK_PNMI_HUNDREDS_SEC(t) jiffies_64_to_hsecs(t) /* * ioctl definitions diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 17:06:12 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 17:06:12 -08:00 @@ -4221,26 +4221,6 @@ /***************************************************************************** * - * SkOsGetTime - provide a time value - * - * Description: - * This routine provides a time value. The unit is 1/HZ (defined by Linux). - * It is not used for absolute time, but only for time differences. - * - * - * Returns: - * Time value - */ -SK_U64 SkOsGetTime(SK_AC *pAC) -{ - SK_U64 PrivateJiffies; - SkOsGetTimeCurrent(pAC, &PrivateJiffies); - return PrivateJiffies; -} /* SkOsGetTime */ - - -/***************************************************************************** - * * SkPciReadCfgDWord - read a 32 bit value from pci config space * * Description: From shemminger@osdl.org Thu Nov 11 16:10:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:48 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A9FQ026206 for ; Thu, 11 Nov 2004 16:10:09 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09gPE011741 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:42 -0800 Date: Thu, 11 Nov 2004 15:55:58 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (10/23) sk98: cleanout unnecessary controller elements Message-Id: <20041111155558.22c8860a@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11753 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 21312 Lines: 718 Catchall cleanup patch: * get rid of obfuscating #define's * eliminate structure elements in the controller structure that are never used or only used in one context or available in net_device Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-11 13:57:37 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-11 13:57:37 -08:00 @@ -96,9 +96,6 @@ #define SK_BIG_ENDIAN #endif -#define SK_NET_DEVICE net_device - - /* we use gethrtime(), return unit: nanoseconds */ #define SK_TICKS_PER_SEC 100 @@ -109,12 +106,11 @@ #define SK_MAX_MACS 2 #define SK_MAX_NETS 2 -#define SK_IOC char __iomem * - +typedef char __iomem *SK_IOC; typedef struct s_DrvRlmtMbuf SK_MBUF; -#define SK_CONST64 INT64_C -#define SK_CONSTU64 UINT64_C +#define SK_CONST64(x) (x##ll) +#define SK_CONSTU64(x) (x##ull) #define SK_MEMCPY(dest,src,size) memcpy(dest,src,size) #define SK_MEMCMP(s1,s2,size) memcmp(s1,s2,size) @@ -143,27 +139,21 @@ #define t_uscalar_t unsigned int #define uintptr_t unsigned long -#define __CONCAT__(A,B) A##B +#ifdef DEBUG -#define INT32_C(a) __CONCAT__(a,L) -#define INT64_C(a) __CONCAT__(a,LL) -#define UINT32_C(a) __CONCAT__(a,UL) -#define UINT64_C(a) __CONCAT__(a,ULL) +#define SK_DBG_PRINTF(fmt, arg...) printk(KERN_DEBUG fmt,##arg) -#ifdef DEBUG -#define SK_DBG_PRINTF printk #ifndef SK_DEBUG_CHKMOD #define SK_DEBUG_CHKMOD 0 #endif #ifndef SK_DEBUG_CHKCAT #define SK_DEBUG_CHKCAT 0 #endif + /* those come from the makefile */ #define SK_DBG_CHKMOD(pAC) (SK_DEBUG_CHKMOD) #define SK_DBG_CHKCAT(pAC) (SK_DEBUG_CHKCAT) -extern void SkDbgPrintf(const char *format,...); - #define SK_DBGMOD_DRV 0x00010000 /**** possible driver debug categories ********************************/ @@ -184,7 +174,7 @@ #define SK_ERR_LOG SkErrorLog -extern void SkErrorLog(SK_AC*, int, int, char*); +extern void SkErrorLog(const SK_AC*, int, int, const char*); #endif diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-11 13:57:37 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-11 13:57:37 -08:00 @@ -266,11 +266,9 @@ typedef struct s_DevNet DEV_NET; struct s_DevNet { + SK_AC *pAC; int PortNr; int NetNr; - int Mtu; - int Up; - SK_AC *pAC; }; typedef struct s_TxPort TX_PORT; @@ -356,10 +354,6 @@ SK_TIMER ModTimer; /* just some timer */ }; -typedef struct s_PerStrm PER_STRM; - -#define SK_ALLOC_IRQ 0x00000001 - #ifdef SK_DIAG_SUPPORT #define DIAG_ACTIVE 1 #define DIAG_NOTACTIVE 0 @@ -390,31 +384,17 @@ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ - char DeviceStr[80]; /* adapter string from vpd */ - SK_U32 AllocFlag; /* flag allocation of resources */ struct pci_dev *PciDev; /* for access to pci config space */ - SK_U32 PciDevId; /* pci device id */ - struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */ - char Name[30]; /* driver name */ + struct net_device *dev[2]; /* pointer to device struct */ int RxBufSize; /* length of receive buffers */ struct net_device_stats stats; /* linux 'netstat -i' statistics */ int Index; /* internal board index number */ /* adapter RAM sizes for queues of active port */ - int RxQueueSize; /* memory used for receive queue */ - int TxSQueueSize; /* memory used for sync. tx queue */ - int TxAQueueSize; /* memory used for async. tx queue */ - - int PromiscCount; /* promiscuous mode counter */ - int AllMultiCount; /* allmulticast mode counter */ - int MulticCount; /* number of different MC */ - /* addresses for this board */ - /* (may be more than HW can)*/ - int HWRevision; /* Hardware revision */ int ActivePort; /* the active XMAC port */ - int MaxPorts; /* number of activated ports */ + int MaxPorts; /* number of activated ports */ int TxDescrPerRing; /* # of descriptors per tx ring */ int RxDescrPerRing; /* # of descriptors per rx ring */ @@ -434,7 +414,6 @@ DIM_INFO DynIrqModInfo; /* all data related to DIM */ /* Only for tests */ - int PortUp; int PortDown; int ChipsetType; /* Chipset family type * 0 == Genesis family support diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-11 13:57:37 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-11 13:57:37 -08:00 @@ -189,23 +189,23 @@ * ******************************************************************************/ -static void FreeResources(struct SK_NET_DEVICE *dev); -static int SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC); +static void FreeResources(struct net_device *dev); +static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC); static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); -static int SkGeOpen(struct SK_NET_DEVICE *dev); -static int SkGeClose(struct SK_NET_DEVICE *dev); -static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev); -static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p); -static void SkGeSetRxMode(struct SK_NET_DEVICE *dev); -static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev); -static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd); +static int SkGeOpen(struct net_device *dev); +static int SkGeClose(struct net_device *dev); +static int SkGeXmit(struct sk_buff *skb, struct net_device *dev); +static int SkGeSetMacAddr(struct net_device *dev, void *p); +static void SkGeSetRxMode(struct net_device *dev); +static struct net_device_stats *SkGeStats(struct net_device *dev); +static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd); static void GetConfiguration(SK_AC*); -static void ProductStr(SK_AC*); +static void PrintProductStr(const char *, SK_AC*); static int XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*); static void FreeTxDescriptors(SK_AC*pAC, TX_PORT*); static void FillRxRing(SK_AC*, RX_PORT*); @@ -215,7 +215,7 @@ static void ClearTxIrq(SK_AC*, int, int); static void ClearRxRing(SK_AC*, RX_PORT*); static void ClearTxRing(SK_AC*, TX_PORT*); -static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu); +static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); static int SkGeIocMib(DEV_NET*, unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); @@ -288,7 +288,7 @@ */ int SkGeInitPCI(SK_AC *pAC) { - struct SK_NET_DEVICE *dev = pAC->dev[0]; + struct net_device *dev = pAC->dev[0]; struct pci_dev *pdev = pAC->PciDev; int retval; @@ -299,7 +299,7 @@ dev->mem_start = pci_resource_start (pdev, 0); pci_set_master(pdev); - if (pci_request_regions(pdev, pAC->Name) != 0) { + if (pci_request_regions(pdev, DRIVER_FILE_NAME) != 0) { retval = 2; goto out_disable; } @@ -348,27 +348,16 @@ * Returns: N/A * */ -static void FreeResources(struct SK_NET_DEVICE *dev) +static void FreeResources(struct net_device *dev) { -SK_U32 AllocFlag; -DEV_NET *pNet; -SK_AC *pAC; +DEV_NET *pNet = netdev_priv(dev); +SK_AC *pAC = pNet->pAC; - pNet = netdev_priv(dev); - pAC = pNet->pAC; - AllocFlag = pAC->AllocFlag; - if (pAC->PciDev) { - pci_release_regions(pAC->PciDev); - } - if (AllocFlag & SK_ALLOC_IRQ) { - free_irq(dev->irq, dev); - } - if (pAC->IoBase) { - iounmap(pAC->IoBase); - } - if (pAC->pDescrMem) { - BoardFreeMem(pAC); - } + free_irq(dev->irq, dev); + iounmap(pAC->IoBase); + pci_release_regions(pAC->PciDev); + + BoardFreeMem(pAC); } /* FreeResources */ @@ -493,14 +482,12 @@ * 0, if everything is ok * !=0, on error */ -static int __init SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC) +static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC) { short i; -unsigned long Flags; char *DescrString = "sk98lin: Driver for Linux"; /* this is given to PNMI */ char *VerStr = VER_STRING; int Ret; /* return code of request_irq */ -SK_BOOL DualNet; SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("IoBase: %08lX\n", (unsigned long)pAC->IoBase)); @@ -524,12 +511,9 @@ init_timer(&pAC->BlinkTimer); /* level 0 init common modules here */ - - spin_lock_irqsave(&pAC->SlowPathLock, Flags); /* Does a RESET on board ...*/ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_DATA) != 0) { printk("HWInit (0) failed.\n"); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); return(-EAGAIN); } SkI2cInit( pAC, pAC->IoBase, SK_INIT_DATA); @@ -545,13 +529,9 @@ SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString); SK_PNMI_SET_DRIVER_VER(pAC, VerStr); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - /* level 1 init common modules here (HW init) */ - spin_lock_irqsave(&pAC->SlowPathLock, Flags); if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { printk("sk98lin: HWInit (1) failed.\n"); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); return(-EAGAIN); } SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO); @@ -574,13 +554,12 @@ } pAC->BoardLevel = SK_INIT_IO; - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - if (pAC->GIni.GIMacsFound == 2) { - Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev); + Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, + DRIVER_FILE_NAME, dev); } else if (pAC->GIni.GIMacsFound == 1) { Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, - pAC->Name, dev); + DRIVER_FILE_NAME, dev); } else { printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n", pAC->GIni.GIMacsFound); @@ -592,12 +571,11 @@ dev->irq); return -EAGAIN; } - pAC->AllocFlag |= SK_ALLOC_IRQ; /* Alloc memory for this board (Mem for RxD/TxD) : */ if(!BoardAllocMem(pAC)) { printk("No memory for descriptor rings.\n"); - return(-EAGAIN); + goto out_free_irq; } SkCsSetReceiveFlags(pAC, @@ -606,22 +584,21 @@ pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; BoardInitMem(pAC); + /* tschilling: New common function with minimum size check. */ - DualNet = SK_FALSE; - if (pAC->RlmtNets == 2) { - DualNet = SK_TRUE; - } - - if (SkGeInitAssignRamToQueues( - pAC, - pAC->ActivePort, - DualNet)) { - BoardFreeMem(pAC); + if (SkGeInitAssignRamToQueues( pAC, pAC->ActivePort, + (pAC->RlmtNets == 2))) { printk("sk98lin: SkGeInitAssignRamToQueues failed.\n"); - return(-EAGAIN); + goto out_free_mem; } return (0); + + out_free_mem: + BoardFreeMem(pAC); + out_free_irq: + free_irq(dev->irq, dev); + return -EAGAIN; } /* SkGeBoardInit */ @@ -896,7 +873,7 @@ */ static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { -struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; +struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ @@ -1045,7 +1022,7 @@ */ static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { -struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; +struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ @@ -1176,7 +1153,7 @@ * != 0 on error */ static int SkGeOpen( -struct SK_NET_DEVICE *dev) +struct net_device *dev) { DEV_NET *pNet; SK_AC *pAC; @@ -1269,8 +1246,6 @@ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); pAC->MaxPorts++; - pNet->Up = 1; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeOpen suceeded\n")); @@ -1291,11 +1266,11 @@ * error code - on error */ static int SkGeClose( -struct SK_NET_DEVICE *dev) +struct net_device *dev) { - DEV_NET *pNet; + DEV_NET *pNet = netdev_priv(dev); DEV_NET *newPtrNet; - SK_AC *pAC; + SK_AC *pAC = pNet->pAC; unsigned long Flags; /* for spin lock */ int i; @@ -1305,9 +1280,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC)); - pNet = netdev_priv(dev); - pAC = pNet->pAC; - #ifdef SK_DIAG_SUPPORT if (pAC->DiagModeActive == DIAG_ACTIVE) { if (pAC->DiagFlowCtrl == SK_FALSE) { @@ -1399,7 +1371,6 @@ sizeof(SK_PNMI_STRUCT_DATA)); pAC->MaxPorts--; - pNet->Up = 0; return (0); } /* SkGeClose */ @@ -1420,7 +1391,7 @@ * WARNING: returning 1 in 'tbusy' case caused system crashes (double * allocated skb's) !!! */ -static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev) +static int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { DEV_NET *pNet; SK_AC *pAC; @@ -2519,7 +2490,7 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p) +static int SkGeSetMacAddr(struct net_device *dev, void *p) { DEV_NET *pNet = netdev_priv(dev); @@ -2565,7 +2536,7 @@ * 0, if everything is ok * !=0, on error */ -static void SkGeSetRxMode(struct SK_NET_DEVICE *dev) +static void SkGeSetRxMode(struct net_device *dev) { DEV_NET *pNet; @@ -2639,10 +2610,10 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int NewMtu) +static int SkGeChangeMtu(struct net_device *dev, int NewMtu) { DEV_NET *pNet; -DEV_NET *pOtherNet; +struct net_device *otherdev; SK_AC *pAC; unsigned long Flags; int i; @@ -2672,11 +2643,10 @@ } #endif - pNet->Mtu = NewMtu; - pOtherNet = netdev_priv(pAC->dev[1 - pNet->NetNr]); - if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) { - return(0); - } + otherdev = pAC->dev[1 - pNet->NetNr]; + if (NewMtu <= 1500 && otherdev != dev + && netif_running(otherdev) && otherdev->mtu > 1500) + return 0; pAC->RxBufSize = NewMtu + 32; dev->mtu = NewMtu; @@ -2838,7 +2808,8 @@ EvPara.Para32[1] = -1; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); - if (pOtherNet->Up) { + if (otherdev && netif_running(otherdev)) { + DEV_NET *pOtherNet = netdev_priv(otherdev); EvPara.Para32[0] = pOtherNet->PortNr; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); } @@ -2848,21 +2819,8 @@ SkEventDispatcher(pAC, pAC->IoBase); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - - /* - ** While testing this driver with latest kernel 2.5 (2.5.70), it - ** seems as if upper layers have a problem to handle a successful - ** return value of '0'. If such a zero is returned, the complete - ** system hangs for several minutes (!), which is in acceptable. - ** - ** Currently it is not clear, what the exact reason for this problem - ** is. The implemented workaround for 2.5 is to return the desired - ** new MTU size if all needed changes for the new MTU size where - ** performed. In kernels 2.2 and 2.4, a zero value is returned, - ** which indicates the successful change of the mtu-size. - */ - return NewMtu; + return 0; } /* SkGeChangeMtu */ @@ -2877,7 +2835,7 @@ * Returns: * pointer to the statistic structure. */ -static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev) +static struct net_device_stats *SkGeStats(struct net_device *dev) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -2898,7 +2856,8 @@ SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA)); spin_lock_irqsave(&pAC->SlowPathLock, Flags); Size = SK_PNMI_STRUCT_SIZE; - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); #ifdef SK_DIAG_SUPPORT } @@ -2912,7 +2871,7 @@ pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; - if (pNet->Mtu <= 1500) { + if (dev->mtu <= 1500) { pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; } else { pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - @@ -2961,7 +2920,7 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd) +static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd) { DEV_NET *pNet; SK_AC *pAC; @@ -3855,7 +3814,7 @@ /***************************************************************************** * - * ProductStr - return a adapter identification string from vpd + * PrintProductStr - show adapter identification string from vpd * * Description: * This function reads the product name string from the vpd area @@ -3863,25 +3822,22 @@ * * Returns: N/A */ -static void ProductStr( -SK_AC *pAC /* pointer to adapter context */ -) +static void PrintProductStr(const char *name, SK_AC *pAC) { -int StrLen = 80; /* length of the string, defined in SK_AC */ -char Keyword[] = VPD_NAME; /* vpd productname identifier */ +char Buf[80]; +int Len = sizeof(Buf); int ReturnCode; /* return code from vpd_read */ unsigned long Flags; spin_lock_irqsave(&pAC->SlowPathLock, Flags); - ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, pAC->DeviceStr, - &StrLen); + ReturnCode = VpdRead(pAC, pAC->IoBase, VPD_NAME, Buf, &Len); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (ReturnCode != 0) { /* there was an error reading the vpd data */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR, - ("Error reading VPD data: %d\n", ReturnCode)); - pAC->DeviceStr[0] = '\0'; + sprintf(Buf, "Error reading VPD data: %d\n", ReturnCode); } + + printk(KERN_INFO "%s: %s\n", name, Buf); } /* ProductStr */ /***************************************************************************** @@ -4510,35 +4466,34 @@ * < 0 on error * */ -void SkErrorLog( -SK_AC *pAC, -int ErrClass, -int ErrNum, -char *pErrorMsg) +void SkErrorLog(const SK_AC *pAC, + int ErrClass, + int ErrNum, + const char *pErrorMsg) { -char ClassStr[80]; + const char *ClassStr = ""; switch (ErrClass) { case SK_ERRCL_OTHER: - strcpy(ClassStr, "Other error"); + ClassStr = "Other error"; break; case SK_ERRCL_CONFIG: - strcpy(ClassStr, "Configuration error"); + ClassStr = "Configuration error"; break; case SK_ERRCL_INIT: - strcpy(ClassStr, "Initialization error"); + ClassStr = "Initialization error"; break; case SK_ERRCL_NORES: - strcpy(ClassStr, "Out of resources error"); + ClassStr = "Out of resources error"; break; case SK_ERRCL_SW: - strcpy(ClassStr, "internal Software error"); + ClassStr = "internal Software error"; break; case SK_ERRCL_HW: - strcpy(ClassStr, "Hardware failure"); + ClassStr = "Hardware failure"; break; case SK_ERRCL_COMM: - strcpy(ClassStr, "Communication error"); + ClassStr = "Communication error"; break; } printk(KERN_INFO "%s: -- ERROR --\n Class: %s\n" @@ -4571,7 +4526,7 @@ pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { - if (pNet->Up) { + if (netif_running(pAC->dev[0])) { pAC->WasIfUp[0] = SK_TRUE; pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ DoPrintInterfaceChange = SK_FALSE; @@ -4580,8 +4535,7 @@ pAC->WasIfUp[0] = SK_FALSE; } if (pNet != netdev_priv(pAC->dev[1])) { - pNet = netdev_priv(pAC->dev[1]); - if (pNet->Up) { + if (netif_running(pAC->dev[1])) { pAC->WasIfUp[1] = SK_TRUE; pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ DoPrintInterfaceChange = SK_FALSE; @@ -4698,7 +4652,7 @@ SK_AC *pAC, /* pointer to adapter context */ int devNbr) /* what device is to be handled */ { - struct SK_NET_DEVICE *dev; + struct net_device *dev; dev = pAC->dev[devNbr]; @@ -4729,7 +4683,7 @@ SK_AC *pAC, /* pointer to adapter context */ int devNbr) /* what device is to be handled */ { - struct SK_NET_DEVICE *dev; + struct net_device *dev; dev = pAC->dev[devNbr]; @@ -4934,14 +4888,10 @@ memset(pNet->pAC, 0, sizeof(SK_AC)); pAC = pNet->pAC; pAC->PciDev = pdev; - pAC->PciDevId = pdev->device; pAC->dev[0] = dev; pAC->dev[1] = dev; - sprintf(pAC->Name, "SysKonnect SK-98xx"); pAC->CheckQueue = SK_FALSE; - pNet->Mtu = 1500; - pNet->Up = 0; dev->irq = pdev->irq; error = SkGeInitPCI(pAC); if (error) { @@ -4987,8 +4937,7 @@ } /* Print adapter specific string from vpd */ - ProductStr(pAC); - printk("%s: %s\n", dev->name, pAC->DeviceStr); + PrintProductStr(dev->name, pAC); /* Print configuration settings */ printk(" PrefPort:%c RlmtMode:%s\n", @@ -5024,8 +4973,6 @@ pNet->PortNr = 1; pNet->NetNr = 1; pNet->pAC = pAC; - pNet->Mtu = 1500; - pNet->Up = 0; dev->open = &SkGeOpen; dev->stop = &SkGeClose; @@ -5057,7 +5004,7 @@ memcpy(&dev->dev_addr, &pAC->Addr.Net[1].CurrentMacAddress, 6); - printk("%s: %s\n", dev->name, pAC->DeviceStr); + PrintProductStr(dev->name, pAC); printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); } } From shemminger@osdl.org Thu Nov 11 16:10:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:45 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A7Rx026189 for ; Thu, 11 Nov 2004 16:10:08 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09fPE011736 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:41 -0800 Date: Thu, 11 Nov 2004 16:03:29 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (17/23) sk98: use lockless transmit Message-Id: <20041111160329.6d3092f6@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11752 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 2293 Lines: 84 This driver lends it self to the new lockless transmit hook in 2.6. Also, flag that driver can do 64 bit DMA, if it is successful in setting the bigger mask. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 18:57:15 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 18:57:15 -08:00 @@ -323,6 +323,7 @@ DEV_NET *pNet = NULL; struct net_device *dev = NULL; static int boards_found = 0; + int pci_using_dac = 0; int error = -ENODEV; error = pci_enable_device(pdev); @@ -332,8 +333,9 @@ } /* Configure DMA attributes. */ - if ((error = pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL)) || - (error = pci_set_dma_mask(pdev, (u64) 0xffffffff))) { + if (!(error = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) + pci_using_dac = 1; + else if ((error = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { printk(KERN_ERR "sk98lin: cannot set PCI dma mask\n"); goto out_disable_device; } @@ -375,6 +377,8 @@ } SkGeDevInit(dev, pdev); + if (pci_using_dac) + dev->features |= NETIF_F_HIGHDMA; pAC->Index = boards_found++; @@ -438,6 +442,9 @@ SkGeDevInit(dev, pdev); + if (pci_using_dac) + dev->features |= NETIF_F_HIGHDMA; + #ifdef SK_ZEROCOPY #ifdef USE_SK_TX_CHECKSUM if (pAC->ChipsetType) @@ -447,7 +454,6 @@ #endif #endif - if (register_netdev(dev)) { printk(KERN_ERR "SKGE: Could not register device.\n"); free_netdev(dev); @@ -501,9 +507,10 @@ #endif SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); SET_NETDEV_DEV(dev, &pdev->dev); -} - + dev->flags &= ~IFF_RUNNING; + dev->features |= NETIF_F_LLTX; +} /***************************************************************************** * * SkGeInitPCI - Init the PCI resources @@ -1707,7 +1714,13 @@ else pTxPort = &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW]; - spin_lock_irqsave(&pTxPort->TxDesRingLock, flags); + local_irq_save(flags); + if (!spin_trylock(&pTxPort->TxDesRingLock)) { + /* Collision - tell upper layer to requeue */ + local_irq_restore(flags); + return NETDEV_TX_LOCKED; + } + if ((!skb_shinfo(skb)->nr_frags) || (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) { /* Don't activate scatter-gather and hardware checksum */ From shemminger@osdl.org Thu Nov 11 16:10:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:49 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A5AR026177 for ; Thu, 11 Nov 2004 16:10:05 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09dPE011731 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:40 -0800 Date: Thu, 11 Nov 2004 15:55:38 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (9/23) sk98: ethtool pause param support Message-Id: <20041111155538.4d98d9b9@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11754 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 4486 Lines: 144 The basic stuff comes from the newer code from SysKonnect, but there code had ugly way to find the PNMI instance. This driver seems full of places where they do unnecessary board/port bookeeping (*sigh*) Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-03 14:39:56 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-03 14:39:56 -08:00 @@ -163,6 +163,15 @@ return 0; } +/* + * MIB infrastructure uses instance value starting at 1 + * based on board and port. + */ +static inline u32 pnmiInstance(const DEV_NET *pNet) +{ + return 1 + (pNet->pAC->RlmtNets == 2) + pNet->PortNr; +} + /***************************************************************************** * * setSettings - configures the settings of a selected adapter @@ -200,7 +209,7 @@ *buf = (ecmd->duplex == DUPLEX_FULL) ? SK_LMODE_AUTOFULL : SK_LMODE_AUTOHALF; - instance = 1 + (pAC->RlmtNets == 2) + pNet->PortNr; + instance = pnmiInstance(pNet); if (SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE, &buf, &len, instance, pNet->NetNr) != SK_PNMI_ERR_OK) return -EINVAL; @@ -437,6 +446,102 @@ return 0; } +/***************************************************************************** + * + * getPauseParams - retrieves the pause parameters + * + * Description: + * All current pause parameters of a selected adapter are placed + * in the passed ethtool_pauseparam structure and are returned. + * + * Returns: N/A + * + */ +static void getPauseParams(struct net_device *dev, struct ethtool_pauseparam *epause) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + SK_GEPORT *pPort = &pAC->GIni.GP[pNet->PortNr]; + + epause->rx_pause = (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) || + (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM); + + epause->tx_pause = epause->rx_pause || (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND); + epause->autoneg = epause->rx_pause || epause->tx_pause; +} + +/***************************************************************************** + * + * setPauseParams - configures the pause parameters of an adapter + * + * Description: + * This function sets the Rx or Tx pause parameters + * + * Returns: + * ==0: everything fine, no error + * !=0: the return value is the error code of the failure + */ +static int setPauseParams(struct net_device *dev , struct ethtool_pauseparam *epause) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + SK_GEPORT *pPort = &pAC->GIni.GP[pNet->PortNr]; + u32 instance = pnmiInstance(pNet); + struct ethtool_pauseparam old; + u8 oldspeed = pPort->PLinkSpeedUsed; + char buf[4]; + int len = 1; + int ret; + + /* + ** we have to determine the current settings to see if + ** the operator requested any modification of the flow + ** control parameters... + */ + getPauseParams(dev, &old); + + /* + ** perform modifications regarding the changes + ** requested by the operator + */ + if (epause->autoneg != old.autoneg) + *buf = epause->autoneg ? SK_FLOW_MODE_NONE : SK_FLOW_MODE_SYMMETRIC; + else { + if (epause->rx_pause && epause->tx_pause) + *buf = SK_FLOW_MODE_SYMMETRIC; + else if (epause->rx_pause && !epause->tx_pause) + *buf = SK_FLOW_MODE_SYM_OR_REM; + else if (!epause->rx_pause && epause->tx_pause) + *buf = SK_FLOW_MODE_LOC_SEND; + else + *buf = SK_FLOW_MODE_NONE; + } + + ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_FLOWCTRL_MODE, + &buf, &len, instance, pNet->NetNr); + + if (ret != SK_PNMI_ERR_OK) { + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL, + ("ethtool (sk98lin): error changing rx/tx pause (%i)\n", ret)); + goto err; + } + + /* + ** It may be that autoneg has been disabled! Therefore + ** set the speed to the previously used value... + */ + if (!epause->autoneg) { + len = 1; + ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE, + &oldspeed, &len, instance, pNet->NetNr); + if (ret != SK_PNMI_ERR_OK) + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL, + ("ethtool (sk98lin): error setting speed (%i)\n", ret)); + } + err: + return ret ? -EIO : 0; +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = getSettings, .set_settings = setSettings, @@ -445,4 +550,6 @@ .get_stats_count = getStatsCount, .get_ethtool_stats = getEthtoolStats, .phys_id = locateDevice, + .get_pauseparam = getPauseParams, + .set_pauseparam = setPauseParams, }; From shemminger@osdl.org Thu Nov 11 16:10:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:43 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0A3cO026158 for ; Thu, 11 Nov 2004 16:10:03 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09bPE011722 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:37 -0800 Date: Thu, 11 Nov 2004 15:55:22 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (8/23) sk98: ethtool phy support Message-Id: <20041111155522.0a55335a@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11751 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 5816 Lines: 180 The basic stuff comes from the newer code from SysKonnect, but I redid it using a per board timer rather than a global timer. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-03 14:31:05 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-03 14:31:05 -08:00 @@ -383,6 +383,8 @@ SK_CSUM Csum; /* for checksum module */ SK_RLMT Rlmt; /* for rlmt module */ spinlock_t SlowPathLock; /* Normal IRQ lock */ + struct timer_list BlinkTimer; /* for LED blinking */ + int LedsOn; SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */ int RlmtMode; /* link check mode to set */ int RlmtNets; /* Number of nets */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-03 14:31:05 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-03 14:31:05 -08:00 @@ -39,6 +39,7 @@ #include #include +#include /****************************************************************************** * @@ -320,6 +321,122 @@ *data++ = pAC->stats.tx_window_errors; } + +/***************************************************************************** + * + * toggleLeds - Changes the LED state of an adapter + * + * Description: + * This function changes the current state of all LEDs of an adapter so + * that it can be located by a user. + * + * Returns: N/A + * + */ +static void toggleLeds(DEV_NET *pNet, int on) +{ + SK_AC *pAC = pNet->pAC; + int port = pNet->PortNr; + void __iomem *io = pAC->IoBase; + + if (pAC->GIni.GIGenesis) { + SK_OUT8(io, MR_ADDR(port,LNK_LED_REG), + on ? SK_LNK_ON : SK_LNK_OFF); + SkGeYellowLED(pAC, io, + on ? (LED_ON >> 1) : (LED_OFF >> 1)); + SkGeXmitLED(pAC, io, MR_ADDR(port,RX_LED_INI), + on ? SK_LED_TST : SK_LED_DIS); + + if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM) + SkXmPhyWrite(pAC, io, port, PHY_BCOM_P_EXT_CTRL, + on ? PHY_B_PEC_LED_ON : PHY_B_PEC_LED_OFF); + else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE) + SkXmPhyWrite(pAC, io, port, PHY_LONE_LED_CFG, + on ? 0x0800 : PHY_L_LC_LEDT); + else + SkGeXmitLED(pAC, io, MR_ADDR(port,TX_LED_INI), + on ? SK_LED_TST : SK_LED_DIS); + } else { + const u16 YukLedOn = (PHY_M_LED_MO_DUP(MO_LED_ON) | + PHY_M_LED_MO_10(MO_LED_ON) | + PHY_M_LED_MO_100(MO_LED_ON) | + PHY_M_LED_MO_1000(MO_LED_ON) | + PHY_M_LED_MO_RX(MO_LED_ON)); + const u16 YukLedOff = (PHY_M_LED_MO_DUP(MO_LED_OFF) | + PHY_M_LED_MO_10(MO_LED_OFF) | + PHY_M_LED_MO_100(MO_LED_OFF) | + PHY_M_LED_MO_1000(MO_LED_OFF) | + PHY_M_LED_MO_RX(MO_LED_OFF)); + + + SkGmPhyWrite(pAC,io,port,PHY_MARV_LED_CTRL,0); + SkGmPhyWrite(pAC,io,port,PHY_MARV_LED_OVER, + on ? YukLedOn : YukLedOff); + } +} + +/***************************************************************************** + * + * skGeBlinkTimer - Changes the LED state of an adapter + * + * Description: + * This function changes the current state of all LEDs of an adapter so + * that it can be located by a user. If the requested time interval for + * this test has elapsed, this function cleans up everything that was + * temporarily setup during the locate NIC test. This involves of course + * also closing or opening any adapter so that the initial board state + * is recovered. + * + * Returns: N/A + * + */ +void SkGeBlinkTimer(unsigned long data) +{ + struct net_device *dev = (struct net_device *) data; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + toggleLeds(pNet, pAC->LedsOn); + + pAC->LedsOn = !pAC->LedsOn; + mod_timer(&pAC->BlinkTimer, jiffies + HZ/4); +} + +/***************************************************************************** + * + * locateDevice - start the locate NIC feature of the elected adapter + * + * Description: + * This function is used if the user want to locate a particular NIC. + * All LEDs are regularly switched on and off, so the NIC can easily + * be identified. + * + * Returns: + * ==0: everything fine, no error, locateNIC test was started + * !=0: one locateNIC test runs already + * + */ +static int locateDevice(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)) + data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); + + /* start blinking */ + pAC->LedsOn = 0; + mod_timer(&pAC->BlinkTimer, jiffies); + msleep_interruptible(data * 1000); + + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(data * HZ); + del_timer_sync(&pAC->BlinkTimer); + toggleLeds(pNet, 0); + + return 0; +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = getSettings, .set_settings = setSettings, @@ -327,4 +444,5 @@ .get_strings = getStrings, .get_stats_count = getStatsCount, .get_ethtool_stats = getEthtoolStats, + .phys_id = locateDevice, }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-03 14:31:05 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-03 14:31:05 -08:00 @@ -245,6 +245,7 @@ extern void SkDimDisplayModerationSettings(SK_AC *pAC); extern void SkDimStartModerationTimer(SK_AC *pAC); extern void SkDimModerate(SK_AC *pAC); +extern void SkGeBlinkTimer(unsigned long data); #ifdef DEBUG static void DumpMsg(struct sk_buff*, char*); @@ -502,6 +503,11 @@ spin_lock_init(&pAC->RxPort[i].RxDesRingLock); } spin_lock_init(&pAC->SlowPathLock); + + /* setup phy_id blink timer */ + pAC->BlinkTimer.function = SkGeBlinkTimer; + pAC->BlinkTimer.data = (unsigned long) dev; + init_timer(&pAC->BlinkTimer); /* level 0 init common modules here */ From shemminger@osdl.org Thu Nov 11 16:10:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:10:54 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0ADvx026236 for ; Thu, 11 Nov 2004 16:10:16 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC09jPE011752 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:09:45 -0800 Date: Thu, 11 Nov 2004 16:07:09 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (20/23) sk98: checksum ethtool and improvements Message-Id: <20041111160709.5ba1c463@zqx3.pdx.osdl.net> In-Reply-To: <20041111154225.5cf85567@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11755 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 41299 Lines: 1307 The driver was going through a lot of work to use portable code for receive checksum offload. On Linux it much simpler, and all that code can be eliminated. Make transmit/receive checksum controllable by ethtool. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile --- a/drivers/net/sk98lin/Makefile 2004-11-10 11:29:48 -08:00 +++ b/drivers/net/sk98lin/Makefile 2004-11-10 11:29:48 -08:00 @@ -26,9 +26,11 @@ skrlmt.o \ sktimer.o \ skvpd.o \ - skxmac2.o \ - skproc.o \ - skcsum.o + skxmac2.o + +ifdef CONFIG_PROC_FS +sk98lin-objs += skproc.o +endif # DBGDEF = \ # -DDEBUG @@ -77,7 +79,8 @@ # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources # SK_DBGCAT_DRV_EVENT 0x08000000 driver events -EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) +EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT \ + -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) clean: rm -f core *.o *.a *.s diff -Nru a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h --- a/drivers/net/sk98lin/h/skcsum.h 2004-11-10 11:29:48 -08:00 +++ b/drivers/net/sk98lin/h/skcsum.h 2004-11-10 11:29:48 -08:00 @@ -155,11 +155,11 @@ * s_Csum - The CSUM module context structure. */ typedef struct s_Csum { +#ifdef SK_USE_CSUM /* Enabled receive SK_PROTO_XXX bit flags. */ unsigned ReceiveFlags[SK_MAX_NETS]; -#ifdef TX_CSUM unsigned TransmitFlags[SK_MAX_NETS]; -#endif /* TX_CSUM */ +#endif /* The protocol statistics structure; one per supported protocol. */ SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-10 11:29:48 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-10 11:29:48 -08:00 @@ -200,6 +200,13 @@ #define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */ #define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */ +/* +** Hardware supports receive checksumming starting at two offsets +** Linux only uses the first one (skip ether header). +*/ +#define SK_CHECKSUM_OFFSET_1 ETH_HLEN +#define SK_CHECKSUM_OFFSET_2 (ETH_HLEN + 20) + /* TX and RX descriptors *****************************************************/ typedef struct s_RxD RXD; /* the receive descriptor */ @@ -302,6 +309,7 @@ int RxFillLimit; /* limit for buffers in ring */ SK_IOC HwAddr; /* bmu registers address */ int PortIndex; /* index number of port (0 or 1) */ + SK_BOOL UseRxCsum; /* use Rx checksumming (yes/no) */ }; /* Definitions needed for interrupt moderation *******************************/ @@ -410,10 +418,6 @@ /* the port structures with descriptor rings */ TX_PORT TxPort[SK_MAX_MACS][2]; RX_PORT RxPort[SK_MAX_MACS]; - - unsigned int CsOfs1; /* for checksum calculation */ - unsigned int CsOfs2; /* for checksum calculation */ - SK_U32 CsOfs; /* for checksum calculation */ SK_BOOL CheckQueue; /* check event queue soon */ SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ diff -Nru a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c --- a/drivers/net/sk98lin/skcsum.c 2004-11-10 11:29:48 -08:00 +++ /dev/null Wed Dec 31 16:00:00 196900 @@ -1,871 +0,0 @@ -/****************************************************************************** - * - * Name: skcsum.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 2003/08/20 13:55:53 $ - * Purpose: Store/verify Internet checksum in send/receive packets. - * - ******************************************************************************/ - -/****************************************************************************** - * - * (C)Copyright 1998-2003 SysKonnect GmbH. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -#ifdef SK_USE_CSUM /* Check if CSUM is to be used. */ - -#ifndef lint -static const char SysKonnectFileId[] = - "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect."; -#endif /* !lint */ - -/****************************************************************************** - * - * Description: - * - * This is the "GEnesis" common module "CSUM". - * - * This module contains the code necessary to calculate, store, and verify the - * Internet Checksum of IP, TCP, and UDP frames. - * - * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" - * and is the code name of this SysKonnect project. - * - * Compilation Options: - * - * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an - * empty module. - * - * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id - * definitions. In this case, all SKCS_PROTO_xxx definitions must be made - * external. - * - * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status - * definitions. In this case, all SKCS_STATUS_xxx definitions must be made - * external. - * - * Include File Hierarchy: - * - * "h/skdrv1st.h" - * "h/skcsum.h" - * "h/sktypes.h" - * "h/skqueue.h" - * "h/skdrv2nd.h" - * - ******************************************************************************/ - -#include "h/skdrv1st.h" -#include "h/skcsum.h" -#include "h/skdrv2nd.h" - -/* defines ********************************************************************/ - -/* The size of an Ethernet MAC header. */ -#define SKCS_ETHERNET_MAC_HEADER_SIZE (6+6+2) - -/* The size of the used topology's MAC header. */ -#define SKCS_MAC_HEADER_SIZE SKCS_ETHERNET_MAC_HEADER_SIZE - -/* The size of the IP header without any option fields. */ -#define SKCS_IP_HEADER_SIZE 20 - -/* - * Field offsets within the IP header. - */ - -/* "Internet Header Version" and "Length". */ -#define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH 0 - -/* "Total Length". */ -#define SKCS_OFS_IP_TOTAL_LENGTH 2 - -/* "Flags" "Fragment Offset". */ -#define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET 6 - -/* "Next Level Protocol" identifier. */ -#define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL 9 - -/* Source IP address. */ -#define SKCS_OFS_IP_SOURCE_ADDRESS 12 - -/* Destination IP address. */ -#define SKCS_OFS_IP_DESTINATION_ADDRESS 16 - - -/* - * Field offsets within the UDP header. - */ - -/* UDP checksum. */ -#define SKCS_OFS_UDP_CHECKSUM 6 - -/* IP "Next Level Protocol" identifiers (see RFC 790). */ -#define SKCS_PROTO_ID_TCP 6 /* Transport Control Protocol */ -#define SKCS_PROTO_ID_UDP 17 /* User Datagram Protocol */ - -/* IP "Don't Fragment" bit. */ -#define SKCS_IP_DONT_FRAGMENT SKCS_HTON16(0x4000) - -/* Add a byte offset to a pointer. */ -#define SKCS_IDX(pPtr, Ofs) ((void *) ((char *) (pPtr) + (Ofs))) - -/* - * Macros that convert host to network representation and vice versa, i.e. - * little/big endian conversion on little endian machines only. - */ -#ifdef SK_LITTLE_ENDIAN -#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8)) -#endif /* SK_LITTLE_ENDIAN */ -#ifdef SK_BIG_ENDIAN -#define SKCS_HTON16(Val16) (Val16) -#endif /* SK_BIG_ENDIAN */ -#define SKCS_NTOH16(Val16) SKCS_HTON16(Val16) - -/* typedefs *******************************************************************/ - -/* function prototypes ********************************************************/ - -/****************************************************************************** - * - * SkCsGetSendInfo - get checksum information for a send packet - * - * Description: - * Get all checksum information necessary to send a TCP or UDP packet. The - * function checks the IP header passed to it. If the high-level protocol - * is either TCP or UDP the pseudo header checksum is calculated and - * returned. - * - * The function returns the total length of the IP header (including any - * IP option fields), which is the same as the start offset of the IP data - * which in turn is the start offset of the TCP or UDP header. - * - * The function also returns the TCP or UDP pseudo header checksum, which - * should be used as the start value for the hardware checksum calculation. - * (Note that any actual pseudo header checksum can never calculate to - * zero.) - * - * Note: - * There is a bug in the GENESIS ASIC which may lead to wrong checksums. - * - * Arguments: - * pAc - A pointer to the adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the IP header *not* - * including any option fields, i.e. at least 20 bytes. - * - * Note: This pointer will be used to address 8-, 16-, and 32-bit - * variables with the respective alignment offsets relative to the pointer. - * Thus, the pointer should point to a 32-bit aligned address. If the - * target system cannot address 32-bit variables on non 32-bit aligned - * addresses, then the pointer *must* point to a 32-bit aligned address. - * - * pPacketInfo - A pointer to the packet information structure for this - * packet. Before calling this SkCsGetSendInfo(), the following field must - * be initialized: - * - * ProtocolFlags - Initialize with any combination of - * SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on - * the protocols specified here. Any protocol(s) not specified - * here will be ignored. - * - * Note: Only one checksum can be calculated in hardware. Thus, if - * SKCS_PROTO_IP is specified in the 'ProtocolFlags', - * SkCsGetSendInfo() must calculate the IP header checksum in - * software. It might be a better idea to have the calling - * protocol stack calculate the IP header checksum. - * - * Returns: N/A - * On return, the following fields in 'pPacketInfo' may or may not have - * been filled with information, depending on the protocol(s) found in the - * packet: - * - * ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s) - * that were both requested by the caller and actually found in the packet. - * Protocol(s) not specified by the caller and/or not found in the packet - * will have their respective SKCS_PROTO_XXX bit flags reset. - * - * Note: For IP fragments, TCP and UDP packet information is ignored. - * - * IpHeaderLength - The total length in bytes of the complete IP header - * including any option fields is returned here. This is the start offset - * of the IP data, i.e. the TCP or UDP header if present. - * - * IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the - * 16-bit Internet Checksum of the IP header is returned here. This value - * is to be stored into the packet's 'IP Header Checksum' field. - * - * PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP - * has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum - * of the TCP or UDP pseudo header is returned here. - */ -void SkCsGetSendInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -SKCS_PACKET_INFO *pPacketInfo, /* Packet information struct. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Bit field specifiying the desired/found protocols. */ - unsigned ProtocolFlags; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* TCP/UDP pseudo header checksum. */ - unsigned long PseudoHeaderChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - pPacketInfo->IpHeaderLength = IpHeaderLength; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* This is an IPv4 frame with a header of valid length. */ - - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++; - - /* Check if we should calculate the IP header checksum. */ - - ProtocolFlags = pPacketInfo->ProtocolFlags; - - if (ProtocolFlags & SKCS_PROTO_IP) { - pPacketInfo->IpHeaderChecksum = - SkCsCalculateChecksum(pIpHeader, IpHeaderLength); - } - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = - *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - return; - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - NextLevelProtoStats->TxUnableCts++; - return; - } - - /* - * Calculate the TCP/UDP pseudo header checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - /* Calculate the sum of all pseudo header fields (16-bit). */ - - PseudoHeaderChecksum = - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength); - - /* Add-in any carries. */ - - SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - pPacketInfo->ProtocolFlags = ProtocolFlags; - NextLevelProtoStats->TxOkCts++; /* Success. */ -} /* SkCsGetSendInfo */ - - -/****************************************************************************** - * - * SkCsGetReceiveInfo - verify checksum information for a received packet - * - * Description: - * Verify a received frame's checksum. The function returns a status code - * reflecting the result of the verification. - * - * Note: - * Before calling this function you have to verify that the frame is - * not padded and Checksum1 and Checksum2 are bigger than 1. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the length in bytes - * of the received IP header including any option fields. For UDP packets, - * 8 additional bytes are needed to access the UDP checksum. - * - * Note: The actual length of the IP header is stored in the lower four - * bits of the first octet of the IP header as the number of 4-byte words, - * so it must be multiplied by four to get the length in bytes. Thus, the - * maximum IP header length is 15 * 4 = 60 bytes. - * - * Checksum1 - The first 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Checksum2 - The second 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Returns: - * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. - * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. - * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. - * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame - * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). - * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). - * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). - * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). - * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. - * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. - * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. - * - * Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values - * returned here can be defined in some header file by the module using CSUM. - * In this way, the calling module can assign return values for its own needs, - * e.g. by assigning bit flags to the individual protocols. - */ -SKCS_STATUS SkCsGetReceiveInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -unsigned Checksum1, /* Hardware checksum 1. */ -unsigned Checksum2, /* Hardware checksum 2. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* IP header checksum. */ - unsigned IpHeaderChecksum; - - /* IP header options checksum, if any. */ - unsigned IpOptionsChecksum; - - /* IP data checksum, i.e. TCP/UDP checksum. */ - unsigned IpDataChecksum; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* The checksum of the "next level protocol", i.e. TCP or UDP. */ - unsigned long NextLevelProtocolChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++; - return (SKCS_STATUS_UNKNOWN_IP_VERSION); - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* This is an IPv4 frame with a header of valid length. */ - - /* Get the IP header and data checksum. */ - - IpDataChecksum = Checksum2; - - /* - * The IP header checksum is calculated as follows: - * - * IpHeaderChecksum = Checksum1 - Checksum2 - */ - - SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2); - - /* Check if any IP header options. */ - - if (IpHeaderLength > SKCS_IP_HEADER_SIZE) { - - /* Get the IP options checksum. */ - - IpOptionsChecksum = SkCsCalculateChecksum( - SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE), - IpHeaderLength - SKCS_IP_HEADER_SIZE); - - /* Adjust the IP header and IP data checksums. */ - - SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum); - - SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum); - } - - /* - * Check if the IP header checksum is ok. - * - * NOTE: We must check the IP header checksum even if the caller just wants - * us to check upper-layer checksums, because we cannot do any further - * processing of the packet without a valid IP checksum. - */ - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - if (IpHeaderChecksum != 0xffff) { - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - /* the NDIS tester wants to know the upper level protocol too */ - if (NextLevelProtocol == SKCS_PROTO_ID_TCP) { - return(SKCS_STATUS_IP_CSUM_ERROR_TCP); - } - else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) { - return(SKCS_STATUS_IP_CSUM_ERROR_UDP); - } - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - return (SKCS_STATUS_IP_CSUM_OK); - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - NextLevelProtoStats->RxUnableCts++; - return (SKCS_STATUS_IP_FRAGMENT); - } - - /* - * 08-May-2000 ra - * - * From RFC 768 (UDP) - * If the computed checksum is zero, it is transmitted as all ones (the - * equivalent in one's complement arithmetic). An all zero transmitted - * checksum value means that the transmitter generated no checksum (for - * debugging or for higher level protocols that don't care). - */ - - if (NextLevelProtocol == SKCS_PROTO_ID_UDP && - *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) { - - NextLevelProtoStats->RxOkCts++; - - return (SKCS_STATUS_IP_CSUM_OK_NO_UDP); - } - - /* - * Calculate the TCP/UDP checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - NextLevelProtocolChecksum = - - /* Calculate the pseudo header checksum. */ - - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength) + - - /* Add the TCP/UDP header checksum. */ - - (unsigned long) IpDataChecksum; - - /* Add-in any carries. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Check if the TCP/UDP checksum is ok. */ - - if ((unsigned) NextLevelProtocolChecksum == 0xffff) { - - /* TCP/UDP checksum ok. */ - - NextLevelProtoStats->RxOkCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK); - } - - /* TCP/UDP checksum error. */ - - NextLevelProtoStats->RxErrCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR); -} /* SkCsGetReceiveInfo */ - - -/****************************************************************************** - * - * SkCsSetReceiveFlags - set checksum receive flags - * - * Description: - * Use this function to set the various receive flags. According to the - * protocol flags set by the caller, the start offsets within received - * packets of the two hardware checksums are returned. These offsets must - * be stored in all receive descriptors. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols - * for which the caller wants checksum information on received frames. - * - * pChecksum1Offset - The start offset of the first receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * pChecksum2Offset - The start offset of the second receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * Returns: N/A - * Returns the two hardware checksum start offsets. - */ -void SkCsSetReceiveFlags( -SK_AC *pAc, /* Adapter context struct. */ -unsigned ReceiveFlags, /* New receive flags. */ -unsigned *pChecksum1Offset, /* Offset for hardware checksum 1. */ -unsigned *pChecksum2Offset, /* Offset for hardware checksum 2. */ -int NetNumber) -{ - /* Save the receive flags. */ - - pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags; - - /* First checksum start offset is the IP header. */ - *pChecksum1Offset = SKCS_MAC_HEADER_SIZE; - - /* - * Second checksum start offset is the IP data. Note that this may vary - * if there are any IP header options in the actual packet. - */ - *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE; -} /* SkCsSetReceiveFlags */ - -#ifndef SK_CS_CALCULATE_CHECKSUM - -/****************************************************************************** - * - * SkCsCalculateChecksum - calculate checksum for specified data - * - * Description: - * Calculate and return the 16-bit Internet Checksum for the specified - * data. - * - * Arguments: - * pData - Pointer to data for which the checksum shall be calculated. - * Note: The pointer should be aligned on a 16-bit boundary. - * - * Length - Length in bytes of data to checksum. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -unsigned SkCsCalculateChecksum( -void *pData, /* Data to checksum. */ -unsigned Length) /* Length of data. */ -{ - SK_U16 *pU16; /* Pointer to the data as 16-bit words. */ - unsigned long Checksum; /* Checksum; must be at least 32 bits. */ - - /* Sum up all 16-bit words. */ - - pU16 = (SK_U16 *) pData; - for (Checksum = 0; Length > 1; Length -= 2) { - Checksum += *pU16++; - } - - /* If this is an odd number of bytes, add-in the last byte. */ - - if (Length > 0) { -#ifdef SK_BIG_ENDIAN - /* Add the last byte as the high byte. */ - Checksum += ((unsigned) *(SK_U8 *) pU16) << 8; -#else /* !SK_BIG_ENDIAN */ - /* Add the last byte as the low byte. */ - Checksum += *(SK_U8 *) pU16; -#endif /* !SK_BIG_ENDIAN */ - } - - /* Add-in any carries. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Note: All bits beyond the 16-bit limit are now zero. */ - - return ((unsigned) Checksum); -} /* SkCsCalculateChecksum */ - -#endif /* SK_CS_CALCULATE_CHECKSUM */ - -/****************************************************************************** - * - * SkCsEvent - the CSUM event dispatcher - * - * Description: - * This is the event handler for the CSUM module. - * - * Arguments: - * pAc - Pointer to adapter context. - * - * Ioc - I/O context. - * - * Event - Event id. - * - * Param - Event dependent parameter. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -int SkCsEvent( -SK_AC *pAc, /* Pointer to adapter context. */ -SK_IOC Ioc, /* I/O context. */ -SK_U32 Event, /* Event id. */ -SK_EVPARA Param) /* Event dependent parameter. */ -{ - int ProtoIndex; - int NetNumber; - - switch (Event) { - /* - * Clear protocol statistics. - * - * Param - Protocol index, or -1 for all protocols. - * - Net number. - */ - case SK_CSUM_EVENT_CLEAR_PROTO_STATS: - - ProtoIndex = (int)Param.Para32[1]; - NetNumber = (int)Param.Para32[0]; - if (ProtoIndex < 0) { /* Clear for all protocols. */ - if (NetNumber >= 0) { - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber])); - } - } - else { /* Clear for individual protocol. */ - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex])); - } - break; - default: - break; - } - return (0); /* Success. */ -} /* SkCsEvent */ - -#endif /* SK_USE_CSUM */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-10 11:29:48 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-10 11:29:48 -08:00 @@ -542,9 +542,90 @@ return ret ? -EIO : 0; } +/***************************************************************************** + * + * setScatterGather + * + * Description: + * Enable/disable scatter/gather DMA setting. + * + * Returns: 0 if successful + * + */ +static int setScatterGather(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (!pAC->ChipsetType) + return -EOPNOTSUPP; + return ethtool_op_set_sg(dev, data); +} + +/***************************************************************************** + * + * setTxChecksum + * + * Description: + * Enable/disable transmit checksumming + * + * Returns: 0 if successful + * + */ +static int setTxChecksum(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (!pAC->ChipsetType) + return -EOPNOTSUPP; + return ethtool_op_set_tx_csum(dev, data); +} + +/***************************************************************************** + * + * getRxChecksum + * + * Description: + * Report on state of receive checksumming + * + * Returns: 0 if disabled, 1 if enabled + * + */ +static u32 getRxChecksum(struct net_device *dev) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + return pAC->RxPort[pNet->PortNr].UseRxCsum; +} +/***************************************************************************** + * + * setRxChecksum + * + * Description: + * Enable/disable transmit checksumming + * + * Returns: 0 if successful + * + */ +static int setRxChecksum(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (data && + !(pAC->GIni.GIChipId == CHIP_ID_GENESIS || pAC->ChipsetType)) + return -EOPNOTSUPP; + + pAC->RxPort[pNet->PortNr].UseRxCsum = data; + return 0; +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = getSettings, .set_settings = setSettings, + .get_link = ethtool_op_get_link, .get_drvinfo = getDriverInfo, .get_strings = getStrings, .get_stats_count = getStatsCount, @@ -552,4 +633,10 @@ .phys_id = locateDevice, .get_pauseparam = getPauseParams, .set_pauseparam = setPauseParams, + .get_sg = ethtool_op_get_sg, + .set_sg = setScatterGather, + .get_rx_csum = getRxChecksum, + .set_rx_csum = setRxChecksum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = setTxChecksum, }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-10 11:29:48 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-10 11:29:48 -08:00 @@ -463,6 +463,11 @@ memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); +#ifdef USE_SK_RX_CHECKSUM + pAC->RxPort[0].UseRxCsum = SK_TRUE; + pAC->RxPort[1].UseRxCsum = SK_TRUE; +#endif + pci_set_drvdata(pdev, dev); return 0; @@ -503,7 +508,9 @@ dev->features |= NETIF_F_HIGHDMA; if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { +#ifdef SK_ZEROCOPY dev->features |= NETIF_F_SG; +#endif #ifdef USE_SK_TX_CHECKSUM dev->features |= NETIF_F_IP_CSUM; #endif @@ -871,11 +878,6 @@ goto out_free_irq; } - SkCsSetReceiveFlags(pAC, - SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP, - &pAC->CsOfs1, &pAC->CsOfs2, 0); - pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; - BoardInitMem(pAC); /* tschilling: New common function with minimum size check. */ @@ -1092,7 +1094,8 @@ /* set the pointers right */ pDescr->VNextRxd = VNextDescr & 0xffffffffULL; pDescr->pNextRxd = pNextDescr; - pDescr->TcpSumStarts = pAC->CsOfs; + pDescr->TcpSumStarts = SK_CHECKSUM_OFFSET_1 + | (SK_CHECKSUM_OFFSET_2 << 16); /* advance one step */ pPrevDescr = pDescr; @@ -2179,7 +2182,8 @@ SK_PNMI_CNT_NO_RX_BUF(pAC, pRxPort->PortIndex); return(SK_FALSE); } - skb_reserve(pMsgBlock, 2); /* to align IP frames */ + + skb_reserve(pMsgBlock, NET_IP_ALIGN); /* to align IP frames */ /* skb allocated ok, so add buffer */ pRxd = pRxPort->pRxdRingTail; pRxPort->pRxdRingTail = pRxd->pNextRxd; @@ -2216,12 +2220,10 @@ * * Returns: N/A */ -static void ReQueueRxBuffer( +static inline void ReQueueRxBuffer( SK_AC *pAC, /* pointer to the adapter context struct */ RX_PORT *pRxPort, /* ptr to port struct of ring to fill */ -struct sk_buff *pMsg, /* pointer to the buffer */ -SK_U32 PhysHigh, /* phys address high dword */ -SK_U32 PhysLow) /* phys address low dword */ +struct sk_buff *pMsg) /* pointer to the buffer */ { RXD *pRxd; /* the rxd to fill */ SK_U16 Length; /* data fragment length */ @@ -2231,8 +2233,6 @@ pRxPort->RxdRingFree--; Length = pAC->RxBufSize; - pRxd->VDataLow = PhysLow; - pRxd->VDataHigh = PhysHigh; pRxd->pMBuf = pMsg; pRxd->RBControl = BMU_OWN | BMU_STF | @@ -2263,7 +2263,6 @@ struct sk_buff *pMsg; /* pointer to message holding frame */ struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ int FrameLength; /* total length of received frame */ -int IpFrameLength; SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ SK_EVPARA EvPara; /* an event parameter union */ unsigned long Flags; /* for spin lock */ @@ -2276,10 +2275,6 @@ SK_BOOL IsBadFrame; /* Bad frame */ SK_U32 FrameStat; -unsigned short Csum1; -unsigned short Csum2; -unsigned short Type; -int Result; SK_U64 PhysAddr; rx_start: @@ -2384,8 +2379,7 @@ "Control: %x\nRxStat: %x\n", Control, FrameStat)); - ReQueueRxBuffer(pAC, pRxPort, pMsg, - pRxd->VDataHigh, pRxd->VDataLow); + ReQueueRxBuffer(pAC, pRxPort, pMsg); continue; } @@ -2414,13 +2408,11 @@ (dma_addr_t) PhysAddr, FrameLength, PCI_DMA_FROMDEVICE); - ReQueueRxBuffer(pAC, pRxPort, pMsg, - pRxd->VDataHigh, pRxd->VDataLow); + ReQueueRxBuffer(pAC, pRxPort, pMsg); pMsg = pNewMsg; - } - else { + } else { /* * if large frame, or SKB allocation failed, pass * the SKB directly to the networking @@ -2437,67 +2429,13 @@ /* set length in message */ skb_put(pMsg, FrameLength); - /* hardware checksum */ - Type = ntohs(*((short*)&pMsg->data[12])); + pMsg->ip_summed = CHECKSUM_NONE; /* initial default */ -#ifdef USE_SK_RX_CHECKSUM - if (Type == 0x800) { - Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); - Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); - IpFrameLength = (int) ntohs((unsigned short) - ((unsigned short *) pMsg->data)[8]); - - /* - * Test: If frame is padded, a check is not possible! - * Frame not padded? Length difference must be 14 (0xe)! - */ - if ((FrameLength - IpFrameLength) != 0xe) { - /* Frame padded => TCP offload not possible! */ - pMsg->ip_summed = CHECKSUM_NONE; - } else { - /* Frame not padded => TCP offload! */ - if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || - (pAC->ChipsetType)) { - Result = SkCsGetReceiveInfo(pAC, - &pMsg->data[14], - Csum1, Csum2, pRxPort->PortIndex); - if (Result == - SKCS_STATUS_IP_FRAGMENT || - Result == - SKCS_STATUS_IP_CSUM_OK || - Result == - SKCS_STATUS_TCP_CSUM_OK || - Result == - SKCS_STATUS_UDP_CSUM_OK) { - pMsg->ip_summed = - CHECKSUM_UNNECESSARY; - } - else if (Result == - SKCS_STATUS_TCP_CSUM_ERROR || - Result == - SKCS_STATUS_UDP_CSUM_ERROR || - Result == - SKCS_STATUS_IP_CSUM_ERROR_UDP || - Result == - SKCS_STATUS_IP_CSUM_ERROR_TCP || - Result == - SKCS_STATUS_IP_CSUM_ERROR ) { - /* HW Checksum error */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, - ("skge: CRC error. Frame dropped!\n")); - goto rx_failed; - } else { - pMsg->ip_summed = - CHECKSUM_NONE; - } - }/* checksumControl calculation valid */ - } /* Frame length check */ - } /* IP frame */ -#else - pMsg->ip_summed = CHECKSUM_NONE; -#endif + /* Use hardware checksum of complete packet */ + if (pRxPort->UseRxCsum) { + pMsg->csum = le16_to_cpu(pRxd->TcpSums & 0xffff); + pMsg->ip_summed = CHECKSUM_HW; + } } /* frame > SK_COPY_TRESHOLD */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); @@ -4518,26 +4456,23 @@ else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) printk(" irq moderation: dynamic (%d ints/sec)\n", pAC->DynIrqModInfo.MaxModIntsPerSec); - else + else printk(" irq moderation: disabled\n"); - -#ifdef SK_ZEROCOPY - if (pAC->ChipsetType) -#ifdef USE_SK_TX_CHECKSUM + if (pAC->dev[FromPort]->features & NETIF_F_SG) printk(" scatter-gather: enabled\n"); -#else - printk(" tx-checksum: disabled\n"); -#endif else printk(" scatter-gather: disabled\n"); -#else - printk(" scatter-gather: disabled\n"); -#endif + + if (pAC->dev[FromPort]->features & NETIF_F_IP_CSUM) + printk(" tx-checksum: enabled\n"); + else + printk(" tx-checksum: disabled\n"); -#ifndef USE_SK_RX_CHECKSUM + if (pAC->RxPort[FromPort].UseRxCsum) + printk(" rx-checksum: enabled\n"); + else printk(" rx-checksum: disabled\n"); -#endif } else { DoPrintInterfaceChange = SK_TRUE; From mhk@designassembly.de Thu Nov 11 16:17:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:17:13 -0800 (PST) Received: from mail2.designassembly.de (mail2.designassembly.de [217.11.62.46]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0H8jb001197 for ; Thu, 11 Nov 2004 16:17:09 -0800 Received: from [192.168.1.227] (pD950AE98.dip.t-dialin.net [217.80.174.152]) by smtp.designassembly.de (smtp.designassembly.de) with ESMTP id 8291223D281; Fri, 12 Nov 2004 01:16:49 +0100 (CET) Message-ID: <41940106.7030207@designassembly.de> Date: Fri, 12 Nov 2004 01:17:10 +0100 From: Michael Heyse User-Agent: Mozilla Thunderbird 0.9 (X11/20041109) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Stephen Hemminger Cc: Jeff Garzik , netdev@oss.sgi.com Subject: Re: [PATCH] (0/23) sk98 driver fixes and enhancements References: <4192C60A.1050205@designassembly.de> <20041111161124.34ccb1e6@zqx3.pdx.osdl.net> In-Reply-To: <20041111161124.34ccb1e6@zqx3.pdx.osdl.net> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11756 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mhk@designassembly.de Precedence: bulk X-list: netdev Content-Length: 220 Lines: 8 Stephen Hemminger wrote: > This is the first set of patches to merge some of the new SysKonnect > code with existing 2.6 driver and fix several bugs. So I was wrong and it did *not* take very long ;-) Thanks! Michael From shemminger@osdl.org Thu Nov 11 16:25:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:25:48 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0PgfJ004939 for ; Thu, 11 Nov 2004 16:25:42 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAC0PDPE013773 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 11 Nov 2004 16:25:14 -0800 Date: Thu, 11 Nov 2004 16:27:58 -0800 From: Stephen Hemminger To: Michael Heyse Cc: Jeff Garzik , netdev@oss.sgi.com Subject: Re: [PATCH] (0/23) sk98 driver fixes and enhancements Message-Id: <20041111162758.4f38f104@zqx3.pdx.osdl.net> In-Reply-To: <41940106.7030207@designassembly.de> References: <4192C60A.1050205@designassembly.de> <20041111161124.34ccb1e6@zqx3.pdx.osdl.net> <41940106.7030207@designassembly.de> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11757 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 558 Lines: 17 On Fri, 12 Nov 2004 01:17:10 +0100 Michael Heyse wrote: > Stephen Hemminger wrote: > > This is the first set of patches to merge some of the new SysKonnect > > code with existing 2.6 driver and fix several bugs. > > So I was wrong and it did *not* take very long ;-) > Thanks! > > Michael Still missing stuff from the SysKonnect version: * Yukon2 support because existing SysKonnect code is too ugly as it is. Next week I should have a de-mucked version. * NAPI code in their version is broken under stress and needs work. From demon@pro-linux.de Thu Nov 11 16:43:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 11 Nov 2004 16:43:48 -0800 (PST) Received: from pro-linux.de (213-239-211-178.clients.your-server.de [213.239.211.178] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAC0hgpA005612 for ; Thu, 11 Nov 2004 16:43:43 -0800 Received: from pro-linux.de (p508B3725.dip.t-dialin.net [80.139.55.37]) by pro-linux.de (Postfix) with ESMTP id 146BB17C049; Fri, 12 Nov 2004 01:43:21 +0100 (CET) Message-ID: <4194090D.6000303@pro-linux.de> Date: Fri, 12 Nov 2004 01:51:25 +0100 From: Mirko Lindner User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7a) Gecko/20040221 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Stephen Hemminger Cc: Jeff Garzik , Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (1/23) sk98: no explicit module ref counting needed References: <4192C60A.1050205@designassembly.de> <20041111154016.6381189d@zqx3.pdx.osdl.net> <20041111161137.576e5f66@zqx3.pdx.osdl.net> In-Reply-To: <20041111161137.576e5f66@zqx3.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11758 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: demon@pro-linux.de Precedence: bulk X-list: netdev Content-Length: 238 Lines: 8 Thanks Stephen. We'll check the functionality and let you know as soon as possible. Mirko Stephen Hemminger wrote: > Network driver's shouldn't be doing module reference counting > on 2.6. This is a bad replication of 2.4 behaviour From tommy.christensen@tpack.net Fri Nov 12 02:55:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 02:55:18 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iACAtCjn030155 for ; Fri, 12 Nov 2004 02:55:13 -0800 Received: (qmail 20412 invoked from network); 12 Nov 2004 10:54:48 -0000 Received: from cyan.cph.tpack.net (192.168.3.101) by 0 with SMTP; 12 Nov 2004 10:54:48 -0000 Subject: Re: [PATCH] (13/23) sk98: handle ring full correctly From: Tommy Christensen To: Stephen Hemminger Cc: Jeff Garzik , Michael Heyse , Mirko Lindner , netdev@oss.sgi.com In-Reply-To: <20041111160008.005fbca5@zqx3.pdx.osdl.net> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111160008.005fbca5@zqx3.pdx.osdl.net> Content-Type: text/plain Organization: Message-Id: <1100256887.22136.26.camel@cyan.cph.tpack.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.0 Date: 12 Nov 2004 11:54:48 +0100 Content-Transfer-Encoding: 7bit X-archive-position: 11759 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Content-Length: 612 Lines: 22 On Fri, 2004-11-12 at 01:00, Stephen Hemminger wrote: > This driver needs to manage it's transmit queue properly. > The hard_start_xmit needs to return OK if send successfully > and BUSY (1) if queue is full. In either case must free skb, > existing code would leak if tx ring filled! This isn't true. When returning NETDEV_TX_BUSY, the caller will requeue or drop the skb. So > + /* Transmit failed, out of resources */ > + if (rc < 0) { > + dev_kfree_skb(skb); > + return NETDEV_TX_BUSY; > + } else { > + dev->trans_start = jiffies; > + return NETDEV_TX_OK; > + } it shouldn't be freed here. -Tommy From ilia.sotnikov@asstra.by Fri Nov 12 05:12:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 05:12:18 -0800 (PST) Received: from mail.asstra.pl (mail.asstra.pl [217.153.152.34]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACDCBW3004540 for ; Fri, 12 Nov 2004 05:12:12 -0800 MIME-Version: 1.0 X-MIMETrack: S/MIME Sign by Notes Client on Ilia Sotnikov/ASSTRA/BY(Release 6.0.2CF1|June 9, 2003) at 12.11.2004 14:59:59, Serialize by Notes Client on Ilia Sotnikov/ASSTRA/BY(Release 6.0.2CF1|June 9, 2003) at 12.11.2004 14:59:59, Serialize complete at 12.11.2004 14:59:59, S/MIME Sign failed at 12.11.2004 14:59:59: The cryptographic key was not found, S/MIME Sign by Notes Client on Ilia Sotnikov/ASSTRA/BY(Release 5.0.12 |February 13, 2003) at 12.11.2004 15:09:50, Serialize by Notes Client on Ilia Sotnikov/ASSTRA/BY(Release 5.0.12 |February 13, 2003) at 12.11.2004 15:09:50, Serialize complete at 12.11.2004 15:09:50, S/MIME Sign failed at 12.11.2004 15:09:50: The cryptographic key was not found, Serialize by Router on Warszawa-Passthru/ASSTRA/BY(Release 6.5.1|January 28, 2004) at 11/12/2004 02:11:53 PM To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Cc: Alan Cox Subject: [PATCH] [Repost] IPSec: cleartext packets path for 2.6.9 X-Mailer: Lotus Notes Release 5.0.12 February 13, 2003 Message-ID: From: Ilia Sotnikov/ASSTRA/BY Date: Fri, 12 Nov 2004 15:11:18 +0200 Content-Type: multipart/mixed; boundary="=_mixed 006EC3BD85256F4A_=" X-archive-position: 11760 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ilia.sotnikov@asstra.by Precedence: bulk X-list: netdev Content-Length: 9837 Lines: 156 --=_mixed 006EC3BD85256F4A_= Content-Type: text/plain; charset="us-ascii" IPSec: Let incoming packets after decapsulation in transport mode traverse the same path as with tunnels. Deliver outgoing packets before encapsulation to all attached PF_PACKET sockets for example, pcap based programs) without sending them to a physical interface. Signed-off-by: Ilia Sotnikov Description: xfrm{4,6}_input() calls will return 0 even when decapsulating packet in the transport mode as opposed to the original concept when they return -nh->protocol. Then packets get reinjected via neitf_rx() call. Although it's overhead, it allows a packet to be seen in more Netfilter hooks. Below is table which shows the difference in Netfilter hooks traversal. mangle table: Mode NF Hook Vanilla Patched transport PREROUTING no yes tunnel PREROUTING yes yes transport INPUT no yes tunnel INPUT yes yes transport OUTPUT yes yes tunnel OUTPUT yes yes transport POSTROUTING no no tunnel POSTROUTING no no Additionally, pcap based programs will be able to see all cleartext packets (incoming and outgoing). In vanilla kernel, you will see only incoming cleartext packets after decapsulation and only in the tunnel mode. PS: Please, CC me as I'm not on the list PPS: Please forgive me the attachement but my email client will kill all the indentation. --=_mixed 006EC3BD85256F4A_= Content-Type: application/octet-stream; name="linux-2.6.9-ipsec_traverse_path.diff" Content-Disposition: attachment; filename="linux-2.6.9-ipsec_traverse_path.diff" Content-Transfer-Encoding: base64 ZGlmZiAtdXIgbGludXgtMi42Ljkub3JpZy9pbmNsdWRlL25ldC94ZnJtLmggbGludXgtMi42Ljkv aW5jbHVkZS9uZXQveGZybS5oCi0tLSBsaW51eC0yLjYuOS5vcmlnL2luY2x1ZGUvbmV0L3hmcm0u aAkyMDA0LTEwLTE5IDAwOjU0OjU1LjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42LjkvaW5j bHVkZS9uZXQveGZybS5oCTIwMDQtMTEtMTAgMTQ6NDE6MDAuMjA4NjAwNzg0ICswMjAwCkBAIC05 MDksNCArOTA5LDc3IEBACiAJfQogfQogCisvKiBEZWxpdmVyIGNsZWFyLXRleHQgcGFja2V0IHRv IG5ldHdvcmsgdGFwcy4KKyAqCisgKiBEZWxpdmVyIElQIHBhY2tldCB0byBhbGwgYXR0YWNoZWQg bmV0d29yayB0YXBzIHVzaW5nIGRldl9xdWV1ZV94bWl0X25pdC4KKyAqIE5vIG91dHB1dCBzaG91 bGQgYmUgcHJvZHVjZWQgb24gYSBwaHlzaWNhbCBpbnRlcmZhY2UuCisgKiBBY3R1YWxseSBzdW1t YXJ5IG9mIGlwX2ZpbmlzaF9vdXRwdXQsIGlwX2ZpbmlzaF9vdXRwdXQyLgorICovCisKK3N0YXRp YyBpbmxpbmUgaW50IGlwX3htaXRfbml0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVj dCBza19idWZmICpuZXdza2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaGhfbGVu OworCisJLyogQWxsb2NhdGUgbmV3IGJ1ZmZlciB3aXRoIHByaXZhdGUgaGVhZGVycyBhbmQgc2hh cmVkIGRhdGEgCisJICAgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gbW9kaWZ5IHRoZSBmb3JtZXIg Ki8KKwluZXdza2IgPSBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAobmV3c2tiID09 IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG5ld3NrYi0+ZHN0KQorCQlkZXYgPSBu ZXdza2ItPmRzdC0+ZGV2OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGxvY2F0 ZSBtb3JlIHNwYWNlIGluIHRoZSBoZWFkIGZvciBMTCBoZWFkZXJzIGlmIGFueSAqLworCWhoX2xl biA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisJaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShu ZXdza2IpIDwgaGhfbGVuICYmIGRldi0+aGFyZF9oZWFkZXIpKSB7CisJCXN0cnVjdCBza19idWZm ICpuZXdza2IyOworCisJCW5ld3NrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShuZXdza2IsIGho X2xlbik7CisJCWlmIChuZXdza2IyID09IE5VTEwpIHsKKwkJCWtmcmVlX3NrYiAobmV3c2tiKTsK KwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWtmcmVlX3NrYiAobmV3c2tiKTsKKwkJbmV3c2ti ID0gbmV3c2tiMjsKKwl9CisKKwluZXdza2ItPnByb3RvY29sIAk9IGh0b25zKEVUSF9QX0lQKTsK KwluZXdza2ItPmRldiAJCT0gZGV2OworCisJLyogUHV0IExMIGhlYWRlciBpbnRvIHRoZSBidWZm ZXIgKi8KKwlpZiAoZGV2LT5oYXJkX2hlYWRlcikKKwkJaWYgKCFkZXYtPmhhcmRfaGVhZGVyKG5l d3NrYiwgZGV2LCBudG9ocyhuZXdza2ItPnByb3RvY29sKSwgTlVMTCwgTlVMTCwgbmV3c2tiLT5s ZW4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEZWxpdmVyIHRoZSBidWZmZXIgdG8gYWxs IG5ldHdvcmsgdGFwcyAqLworCWRldl9xdWV1ZV94bWl0X25pdChuZXdza2IsIGRldik7CisJCisJ a2ZyZWVfc2tiKG5ld3NrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lk IHhmcm1fZXhwYW5kX21hYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bWFjLnJhdyA9 IG1lbW1vdmUoc2tiLT5kYXRhIC0gc2tiLT5tYWNfbGVuLAorCQkJCSAgIHNrYi0+bWFjLnJhdywg c2tiLT5tYWNfbGVuKTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlu bGluZSB2b2lkIHhmcm1fcmVzdG9yZV9pcGgoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQg aXBoX2xlbiwgdG90X2xlbjsKKworCWlwaF9sZW4gPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7 CisKKwlza2JfcHVzaCAoc2tiLCBpcGhfbGVuKTsKKwl0b3RfbGVuID0gbnRvaHMoc2tiLT5uaC5p cGgtPnRvdF9sZW4pOworCXRvdF9sZW4gKz0gaXBoX2xlbjsKKwlza2ItPm5oLmlwaC0+dG90X2xl biA9IGh0b25zKHRvdF9sZW4pOworfQorCiAjZW5kaWYJLyogX05FVF9YRlJNX0ggKi8KZGlmZiAt dXIgbGludXgtMi42Ljkub3JpZy9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jIGxpbnV4LTIuNi45L25l dC9pcHY0L3hmcm00X2lucHV0LmMKLS0tIGxpbnV4LTIuNi45Lm9yaWcvbmV0L2lwdjQveGZybTRf aW5wdXQuYwkyMDA0LTEwLTE5IDAwOjUzOjIxLjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42 LjkvbmV0L2lwdjQveGZybTRfaW5wdXQuYwkyMDA0LTExLTEwIDAyOjE2OjU3LjAwMDAwMDAwMCAr MDIwMApAQCAtMTA1LDkgKzEwNSw3IEBACiAJCQkJaXB2NF9jb3B5X2RzY3AoaXBoLCBza2ItPmgu aXBpcGgpOwogCQkJaWYgKCEoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKSkKIAkJ CQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShza2IpOwotCQkJc2tiLT5tYWMucmF3ID0gbWVtbW92ZShz a2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCi0JCQkJCSAgICAgICBza2ItPm1hYy5yYXcsIHNrYi0+ bWFjX2xlbik7Ci0JCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXhmcm1fZXhwYW5kX21h Yyhza2IpOwogCQkJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2Yoc3RydWN0IGlw X29wdGlvbnMpKTsKIAkJCWRlY2FwcyA9IDE7CiAJCQlicmVhazsKQEAgLTEzNCwxNyArMTMyLDI4 IEBACiAJbWVtY3B5KHNrYi0+c3AtPngrc2tiLT5zcC0+bGVuLCB4ZnJtX3ZlYywgeGZybV9ucipz aXplb2Yoc3RydWN0IHNlY19kZWNhcF9zdGF0ZSkpOwogCXNrYi0+c3AtPmxlbiArPSB4ZnJtX25y OwogCi0JaWYgKGRlY2FwcykgewotCQlpZiAoIShza2ItPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNL KSkgewotCQkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCQkJc2tiLT5kc3QgPSBOVUxMOwotCQl9 Ci0JCW5ldGlmX3J4KHNrYik7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtc2ti LT5uaC5pcGgtPnByb3RvY29sOworCS8qIExldCBwYWNrZXRzIGluIElQU2VjIHRyYW5zcG9ydCBt b2RlIHRyYXZlcnNlIHRoZSBzYW1lIHBhdGggYXMgd2l0aCB0dW5uZWwKKwkgKiAod2hpY2ggYXJl IGRlbGl2ZXJlZCBiYWNrIHRvIElQIHN0YWNrIHZpYSBuZXRpZl9yeCBhZnRlciBkZWNhcHN1bGF0 aW9uKQorCSAqCisJICogc2tiLT5kYXRhIHBvaW50cyB0byBqdXN0IHBhc3QgSVAgaGVhZGVyLCBz a2ItPmxlbiAmIGlwaC0+dG90X2xlbiBkb2Vzbid0IAorCSAqIGNvdW50IElQIGhlYWRlciwgYSBn YXAgZXhpc3RzIGJldHdlZW4gc2tiLT5tYWMgYW5kIHNrYi0+bmgsIElQIGNoZWNrc3VtCisJICog bmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkLgorCSAqLworCisJaWYgKCEoc2tiLT5kZXYtPmZsYWdz JklGRl9MT09QQkFDSykpIHsKKwkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCQlza2ItPmRzdCA9 IE5VTEw7CisJfQorCisJaWYgKCFkZWNhcHMpIHsKKwkJeGZybV9yZXN0b3JlX2lwaChza2IpOwor CQl4ZnJtX2V4cGFuZF9tYWMoc2tiKTsKKwkJaXBfc2VuZF9jaGVjayAoc2tiLT5uaC5pcGgpOwog CX0KIAorCW5ldGlmX3J4KHNrYik7CisJcmV0dXJuIDA7CisKIGRyb3BfdW5sb2NrOgogCXNwaW5f dW5sb2NrKCZ4LT5sb2NrKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKZGlmZiAtdXIgbGludXgtMi42 Ljkub3JpZy9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYyBsaW51eC0yLjYuOS9uZXQvaXB2NC94ZnJt NF9vdXRwdXQuYwotLS0gbGludXgtMi42Ljkub3JpZy9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwky MDA0LTEwLTE5IDAwOjUzOjQ0LjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42LjkvbmV0L2lw djQveGZybTRfb3V0cHV0LmMJMjAwNC0xMS0xMCAwMjoxNjo1Ny4wMDAwMDAwMDAgKzAyMDAKQEAg LTExNiw2ICsxMTYsOCBAQAogCQkJZ290byBlcnJvcjsKIAl9CiAKKwkvKiBEZWxpdmVyIGNsZWFy IHRleHQgcGFja2V0IHRvIG5ldHdvcmsgdGFwcyAqLworCWlwX3htaXRfbml0KHNrYik7CiAJeGZy bTRfZW5jYXAoc2tiKTsKIAogCWVyciA9IHgtPnR5cGUtPm91dHB1dChza2IpOwpkaWZmIC11ciBs aW51eC0yLjYuOS5vcmlnL25ldC9pcHY2L3hmcm02X2lucHV0LmMgbGludXgtMi42LjkvbmV0L2lw djYveGZybTZfaW5wdXQuYwotLS0gbGludXgtMi42Ljkub3JpZy9uZXQvaXB2Ni94ZnJtNl9pbnB1 dC5jCTIwMDQtMTAtMTkgMDA6NTU6MzYuMDAwMDAwMDAwICswMzAwCisrKyBsaW51eC0yLjYuOS9u ZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCTIwMDQtMTEtMTAgMDI6MTY6NTcuMDAwMDAwMDAwICswMjAw CkBAIC05Miw5ICs5Miw3IEBACiAJCQkJaXB2Nl9jb3B5X2RzY3Aoc2tiLT5uaC5pcHY2aCwgc2ti LT5oLmlwdjZoKTsKIAkJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikp CiAJCQkJaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKHNrYik7Ci0JCQlza2ItPm1hYy5yYXcgPSBtZW1t b3ZlKHNrYi0+ZGF0YSAtIHNrYi0+bWFjX2xlbiwKLQkJCQkJICAgICAgIHNrYi0+bWFjLnJhdywg c2tiLT5tYWNfbGVuKTsKLQkJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQkJeGZybV9leHBh bmRfbWFjKHNrYik7CiAJCQlkZWNhcHMgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEyMSwxNyAr MTE5LDI4IEBACiAJc2tiLT5zcC0+bGVuICs9IHhmcm1fbnI7CiAJc2tiLT5pcF9zdW1tZWQgPSBD SEVDS1NVTV9OT05FOwogCi0JaWYgKGRlY2FwcykgewotCQlpZiAoIShza2ItPmRldi0+ZmxhZ3Mm SUZGX0xPT1BCQUNLKSkgewotCQkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCQkJc2tiLT5kc3Qg PSBOVUxMOwotCQl9Ci0JCW5ldGlmX3J4KHNrYik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2Ugewot CQlyZXR1cm4gMTsKKwkvKiBMZXQgcGFja2V0cyBpbiBJUFNlYyB0cmFuc3BvcnQgbW9kZSB0cmF2 ZXJzZSB0aGUgc2FtZSBwYXRoIGFzIHdpdGggdHVubmVsCisJICogKHdoaWNoIGFyZSBkZWxpdmVy ZWQgYmFjayB0byBJUCBzdGFjayB2aWEgbmV0aWZfcnggYWZ0ZXIgZGVjYXBzdWxhdGlvbikKKwkg KgorCSAqIHNrYi0+ZGF0YSBwb2ludHMgdG8ganVzdCBwYXN0IElQIGhlYWRlciwgc2tiLT5sZW4g JiBpcGgtPnRvdF9sZW4gZG9lc24ndCAKKwkgKiBjb3VudCBJUCBoZWFkZXIsIGEgZ2FwIGV4aXN0 cyBiZXR3ZWVuIHNrYi0+bWFjIGFuZCBza2ItPm5oLCBJUCBjaGVja3N1bQorCSAqIG5lZWRzIHRv IGJlIHJlY2FsY3VsYXRlZC4KKwkgKi8KKworCWlmICghKHNrYi0+ZGV2LT5mbGFncyZJRkZfTE9P UEJBQ0spKSB7CisJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwkJc2tiLT5kc3QgPSBOVUxMOwor CX0KKworCWlmICghZGVjYXBzKSB7CisJCXhmcm1fcmVzdG9yZV9pcGgoc2tiKTsKKwkJeGZybV9l eHBhbmRfbWFjIChza2IpOworCQlpcF9zZW5kX2NoZWNrIChza2ItPm5oLmlwaCk7CiAJfQogCisJ bmV0aWZfcngoc2tiKTsKKwlyZXR1cm4gLTE7CisKIGRyb3BfdW5sb2NrOgogCXNwaW5fdW5sb2Nr KCZ4LT5sb2NrKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKZGlmZiAtdXIgbGludXgtMi42Ljkub3Jp Zy9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYyBsaW51eC0yLjYuOS9uZXQvaXB2Ni94ZnJtNl9vdXRw dXQuYwotLS0gbGludXgtMi42Ljkub3JpZy9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwkyMDA0LTEw LTE5IDAwOjU1OjA3LjAwMDAwMDAwMCArMDMwMAorKysgbGludXgtMi42LjkvbmV0L2lwdjYveGZy bTZfb3V0cHV0LmMJMjAwNC0xMS0xMCAwMjoxNjo1Ny4wMDAwMDAwMDAgKzAyMDAKQEAgLTExNiw2 ICsxMTYsOCBAQAogCQkJZ290byBlcnJvcjsKIAl9CiAKKwkvKiBEZWxpdmVyIGNsZWFyIHRleHQg cGFja2V0IHRvIG5ldHdvcmsgdGFwcyAqLworCWlwX3htaXRfbml0KHNrYik7CiAJeGZybTZfZW5j YXAoc2tiKTsKIAogCWVyciA9IHgtPnR5cGUtPm91dHB1dChza2IpOwo= --=_mixed 006EC3BD85256F4A_=-- From SRS0+266cf96ced9351110a2b+446+infradead.org+hch@phoenix.srs.infradead.org Fri Nov 12 08:27:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 08:27:23 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACGRHs0011751 for ; Fri, 12 Nov 2004 08:27:18 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CSeG2-0001qy-Cq; Fri, 12 Nov 2004 16:26:42 +0000 Date: Fri, 12 Nov 2004 16:26:42 +0000 From: Christoph Hellwig To: Stephen Hemminger Cc: Jeff Garzik , Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (3/23) sk98: /proc interface related changes Message-ID: <20041112162641.GA7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111155349.4537044c@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041111155349.4537044c@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11761 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev Content-Length: 749 Lines: 15 On Thu, Nov 11, 2004 at 03:53:49PM -0800, Stephen Hemminger wrote: > The /proc intereface can be cleaned up a lot: > + Pass the device to through the proc data/seq_private hook. > + No longer needs to have a list of network devices > + use seq_printf directly rather than indirection into a buffer > + failure to create proc directory or interface should not > be fatal. > + if PROC_FS not configured, let the stubs cause the necessary > code elimination rather than using #ifdef This is still totally broken because dev->name may change between registration and removal. If a netdriver wants to use procfs file per-adapter it needs to use an enumeration scheme independant of the netdevice naming. Or even better stop using procfs at all. From SRS0+266cf96ced9351110a2b+446+infradead.org+hch@phoenix.srs.infradead.org Fri Nov 12 08:29:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 08:29:30 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACGTPjZ012052 for ; Fri, 12 Nov 2004 08:29:26 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CSeIK-0001rZ-Kf; Fri, 12 Nov 2004 16:29:04 +0000 Date: Fri, 12 Nov 2004 16:29:04 +0000 From: Christoph Hellwig To: Stephen Hemminger Cc: Jeff Garzik , Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (7/23) sk98: basic ethtool support Message-ID: <20041112162904.GB7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111155503.6e0349b8@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041111155503.6e0349b8@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11762 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev Content-Length: 1033 Lines: 31 On Thu, Nov 11, 2004 at 03:55:03PM -0800, Stephen Hemminger wrote: > The basic stuff comes from the newer code from SysKonnect, but I redid > it using ethtool_ops and a cleaner way of doing the stats (from e100) > +/***************************************************************************** > + * > + * getSettings - retrieves the current settings of the selected adapter > + * > + * Description: > + * The current configuration of the selected adapter is returned. > + * This configuration involves a)speed, b)duplex and c)autoneg plus > + * a number of other variables. > + * > + * Returns: always 0 > + * > + */ Please use normal kernel-doc function documentation. > +static int getSettings(struct net_device *dev, struct ethtool_cmd *ecmd) And avoid studlyCaps. Also an sk98lin prefix even on private function helps avoiding nameclashes for the generic names (and in the debugger or oopses) > +{ > + const DEV_NET *pNet = netdev_priv(dev); please always use struct net_device instead of strange typedefs for it. From SRS0+266cf96ced9351110a2b+446+infradead.org+hch@phoenix.srs.infradead.org Fri Nov 12 08:31:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 08:31:07 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACGV3aW012405 for ; Fri, 12 Nov 2004 08:31:03 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CSeJt-0001s6-No; Fri, 12 Nov 2004 16:30:41 +0000 Date: Fri, 12 Nov 2004 16:30:41 +0000 From: Christoph Hellwig To: Stephen Hemminger Cc: Jeff Garzik , Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (15/23) sk98: rearrange initialization Message-ID: <20041112163041.GC7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111160113.15a356cd@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041111160113.15a356cd@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11763 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev Content-Length: 436 Lines: 10 On Thu, Nov 11, 2004 at 04:01:13PM -0800, Stephen Hemminger wrote: > The code in the latest SysKonnect driver is arranged differently, > this aligns the two versions to allow for easier comparisons. > Also: > Don't enable the pci device twice. > Add common SkGeDevInit for common code used to setup both ports please don't reorder the functions. I placed them in natural order when converting to new pci probing for a good reason. From sebastian.ionita@focomunicatii.ro Fri Nov 12 10:01:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 10:01:27 -0800 (PST) Received: from focomunicatii.ro (ns.focomunicatii.ro [212.146.75.6]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iACI1Ke3014814 for ; Fri, 12 Nov 2004 10:01:21 -0800 Received: (qmail 24847 invoked by uid 89); 12 Nov 2004 17:59:11 -0000 Message-ID: <20041112175911.24846.qmail@focomunicatii.ro> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> <20041109232510.GA5582@electric-eye.fr.zoreil.com> <20041110201010.18341.qmail@focomunicatii.ro> <20041110212835.GA23758@electric-eye.fr.zoreil.com> <20041110230853.GB23758@electric-eye.fr.zoreil.com> <20041111073754.27966.qmail@focomunicatii.ro> <20041111095102.GA2280@electric-eye.fr.zoreil.com> In-Reply-To: <20041111095102.GA2280@electric-eye.fr.zoreil.com> From: sebastian.ionita@focomunicatii.ro To: Francois Romieu Cc: seby@focomunicatii.ro, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Date: Fri, 12 Nov 2004 19:59:11 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="utf-8" Content-Transfer-Encoding: 7bit X-archive-position: 11764 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sebastian.ionita@focomunicatii.ro Precedence: bulk X-list: netdev Content-Length: 923 Lines: 29 Francois Romieu writes: > sebastian.ionita@focomunicatii.ro : > [...] >> Later i will restart the server with the new kernel and i will tell you if >> something gets bad or if it will work ... :) > > If it does not work as expected, please describe the minimal level of > operation which is ok (i.e. networking without vlan for instance). > > The range of possible errors should be rather limited: mostly gross > typos or endianness issues when mucking with vlan related registers > (I am not too sure about the layout of the VID for Rx/Tx). Without vlan's it works but with vlan the behavier is just like with the old drivers. Shoud I give some param's to the module if want to have vlans ? > > -- > Ueimor ____________________________________________________________ SC. FO Comunicatii SRL. Sebastian Ionita Administrator Sistem mobil: 0724 212408 tel fix: 0264 450456 From romieu@fr.zoreil.com Fri Nov 12 13:13:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 13:14:05 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACLDh1v022208 for ; Fri, 12 Nov 2004 13:13:56 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iACLAuvr003806; Fri, 12 Nov 2004 22:10:56 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iACLAtox003805; Fri, 12 Nov 2004 22:10:55 +0100 Date: Fri, 12 Nov 2004 22:10:55 +0100 From: Francois Romieu To: sebastian.ionita@focomunicatii.ro Cc: seby@focomunicatii.ro, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, alan@redhat.com, jgarzik@pobox.com Subject: Re: ZyXEL GN650-T Message-ID: <20041112211055.GA346@electric-eye.fr.zoreil.com> References: <20041107214427.20301.qmail@focomunicatii.ro> <20041107224803.GA29248@electric-eye.fr.zoreil.com> <20041109000006.GA14911@electric-eye.fr.zoreil.com> <20041109232510.GA5582@electric-eye.fr.zoreil.com> <20041110201010.18341.qmail@focomunicatii.ro> <20041110212835.GA23758@electric-eye.fr.zoreil.com> <20041110230853.GB23758@electric-eye.fr.zoreil.com> <20041111073754.27966.qmail@focomunicatii.ro> <20041111095102.GA2280@electric-eye.fr.zoreil.com> <20041112175911.24846.qmail@focomunicatii.ro> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041112175911.24846.qmail@focomunicatii.ro> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11765 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 1134 Lines: 27 sebastian.ionita@focomunicatii.ro : [...] > Without vlan's it works but with vlan the behavier is just like with the > old drivers. Shoud I give some param's to the module if want to have vlans ? I have modified the original patch. Does the network appliance allow you to configure some specific VID, say 68, 1028 or 1092 ? If yes, pick one and test the behavior of the three VID on the network adapter, ideally within their own insmod, config up, ping (from host and remote), config down and rmmod session. Provided the issue is only a matter of ordering of the VID, something should appear in the log/packet statistics when the VID overlap. dmesg/kernel log messages as well as the serie of commands issued would be welcome. bzip2 is your friend. If the VID on the lan side is fixed for you, please send it so I'll see which values on the network adapter could match (the values above are not sensitive to endianness for instance). A patch against vanilla 2.4.18-rc2 is available at: http://www.fr.zoreil.com/people/francois/misc/20041112-2.4.28-rc2-via-velocity-backport.patch -- Ueimor From webvenza@libero.it Fri Nov 12 14:07:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 14:08:00 -0800 (PST) Received: from gateway.milesteg.arr (venza@adsl-96-231.38-151.net24.it [151.38.231.96]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACM7dTf023303 for ; Fri, 12 Nov 2004 14:07:45 -0800 Date: Fri, 12 Nov 2004 23:07:10 +0100 From: Daniele Venzano To: Jeff Garzik , Rusty Russell Cc: NetDev Subject: [PATCH] convert sis900 to new style parameters Message-ID: <20041112220710.GB29980@gateway.milesteg.arr> Mail-Followup-To: Jeff Garzik , Rusty Russell , NetDev Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="p4qYPpj5QlsIQJ0K" Content-Disposition: inline X-Operating-System: Debian GNU/Linux on kernel Linux 2.4.27-grsec X-Copyright: Forwarding or publishing without permission is prohibited. X-Truth: La vita e' una questione di culo, o ce l'hai o te lo fanno. X-GPG-Fingerprint: 642A A345 1CEF B6E3 925C 23CE DAB9 8764 25B3 57ED User-Agent: Mutt/1.5.6i X-archive-position: 11766 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webvenza@libero.it Precedence: bulk X-list: netdev Content-Length: 2168 Lines: 75 --p4qYPpj5QlsIQJ0K Content-Type: multipart/mixed; boundary="zYM0uCDKw75PZbzx" Content-Disposition: inline --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The attached patch converts MODULE_PARM() calls in module_param() calls. I've tested it and the expected files were created in sysfs. For now all parameters are read-only. After some check I'll probably change some of them to r/w. The patch is against 2.6.9 and if no issues are raised, I propose it for inclusion. This patch is also available at http://teg.homeunix.org/sis900.html --=20 ----------------------------- Daniele Venzano Web: http://teg.homeunix.org --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="sis900-module-param.diff" Content-Transfer-Encoding: quoted-printable --- a/drivers/net/sis900.c 2004-11-12 16:26:50.000000000 +0100 +++ b/drivers/net/sis900.c 2004-11-12 16:33:20.000000000 +0100 @@ -48,6 +48,7 @@ */ =20 #include +#include #include #include #include @@ -179,9 +180,9 @@ MODULE_DESCRIPTION("SiS 900 PCI Fast Ethernet driver"); MODULE_LICENSE("GPL"); =20 -MODULE_PARM(multicast_filter_limit, "i"); -MODULE_PARM(max_interrupt_work, "i"); -MODULE_PARM(debug, "i"); +module_param(multicast_filter_limit, int, 0444); +module_param(max_interrupt_work, int, 0444); +module_param(debug, int, 0444); MODULE_PARM_DESC(multicast_filter_limit, "SiS 900/7016 maximum number of f= iltered multicast addresses"); MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled = per interrupt"); MODULE_PARM_DESC(debug, "SiS 900/7016 debug level (2-4)"); --zYM0uCDKw75PZbzx-- --p4qYPpj5QlsIQJ0K Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFBlTQO2rmHZCWzV+0RAlLKAJwNBqPurX3dsKcEVm6WOE/muEVPBQCcDaEK tpL36BohIy2G5AKUqsdHaFY= =VeE/ -----END PGP SIGNATURE----- --p4qYPpj5QlsIQJ0K-- From jheffner@psc.edu Fri Nov 12 15:46:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 15:46:39 -0800 (PST) Received: from mailer1.psc.edu (mailer1.psc.edu [128.182.58.100]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACNkXpx025329 for ; Fri, 12 Nov 2004 15:46:33 -0800 Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by mailer1.psc.edu (8.12.10/8.12.5) with ESMTP id iACNkBTU020547 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 12 Nov 2004 18:46:11 -0500 (EST) Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by dexter.psc.edu (8.12.11/8.12.10) with ESMTP id iACNkBG7009515 for ; Fri, 12 Nov 2004 18:46:11 -0500 Date: Fri, 12 Nov 2004 18:46:11 -0500 (EST) From: John Heffner To: netdev@oss.sgi.com Subject: A case AGAINST checksum offload Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: clamd / ClamAV version 0.75, clamav-milter version 0.75 on mailer1.psc.edu X-Virus-Status: Clean X-archive-position: 11767 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jheffner@psc.edu Precedence: bulk X-list: netdev Content-Length: 1761 Lines: 32 Currently with many common Ethernet devices in Linux, hardware TCP checksumming is enabled by default. This seems fairly dangerous to me. Most link layer checksums are much stronger than the TCP/UDP checksum; most bit errors are caught by these. However, one of the primary purposes of the TCP/UDP checksum is to detect errors occurring outside the protection of the link layer checksums -- errors when data is reassembled or copied across busses inside hosts and routers. Hardware checksum offload removes the ability to detect errors between the NIC and host memory. For some anecdotal evidence: One of my machines has fiber e1000 (82545GM) and I observed corruptions in its TCP streams. I actually caught this because large SSH flows originating from this host would usually die after <1 GB or so with a MAC error, indicating the TCP stream was somehow corrupt. I looked at some TCP statistics, which indicated no dropped packets or checksum errors, but then I realized hardware checksumming was on. I turned off hardware checksumming and found the stream errors disappeared, and it correctly started discarding the corrupt TCP segments. Luckily for me, this machine is mainly used for testing, and the strong authentication SSH uses caught the problems. Though I don't have any definitive references, I've heard stories that Sun turned off UDP checksums on LANs to increase NFS performance, only to re-enable checksumming by default after problems similar to mine caused corruptions of some critical databases. Since TCP checksum offload should only really helps the zero-copy case in terms of performance, it seems safer to turn off hardware checksumming by default, or perhaps only enable it if an application is doing a zero-copy send. -John From haveblue@us.ibm.com Fri Nov 12 15:54:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 15:54:17 -0800 (PST) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACNsCgO025725 for ; Fri, 12 Nov 2004 15:54:13 -0800 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e2.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iACNrnG4533806 for ; Fri, 12 Nov 2004 18:53:49 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iACNrmeS283318 for ; Fri, 12 Nov 2004 18:53:48 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iACNrmkl020949 for ; Fri, 12 Nov 2004 18:53:48 -0500 Received: from [10.8.0.13] (aurora.beaverton.ibm.com [9.47.17.16]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iACNrlUp020923; Fri, 12 Nov 2004 18:53:48 -0500 Subject: Re: A case AGAINST checksum offload From: Dave Hansen To: John Heffner Cc: netdev@oss.sgi.com In-Reply-To: References: Content-Type: text/plain Message-Id: <1100303625.14465.631.camel@localhost> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Fri, 12 Nov 2004 15:53:45 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 11768 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: haveblue@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 760 Lines: 17 On Fri, 2004-11-12 at 15:46, John Heffner wrote: > Currently with many common Ethernet devices in Linux, hardware TCP > checksumming is enabled by default. This seems fairly dangerous to me. > Most link layer checksums are much stronger than the TCP/UDP checksum; > most bit errors are caught by these. However, one of the primary purposes > of the TCP/UDP checksum is to detect errors occurring outside the > protection of the link layer checksums -- errors when data is reassembled > or copied across busses inside hosts and routers. If you're getting errors copying things on buses inside of the machine, don't you have bigger problems than corrupt packets? For instance, why doesn't your disk controller have the same problem? Just curious. -- Dave From jheffner@psc.edu Fri Nov 12 15:56:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 15:56:54 -0800 (PST) Received: from mailer1.psc.edu (mailer1.psc.edu [128.182.58.100]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iACNuiZV026218 for ; Fri, 12 Nov 2004 15:56:45 -0800 Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by mailer1.psc.edu (8.12.10/8.12.5) with ESMTP id iACNuOTU020639 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 12 Nov 2004 18:56:24 -0500 (EST) Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by dexter.psc.edu (8.12.11/8.12.10) with ESMTP id iACNuOWl009537; Fri, 12 Nov 2004 18:56:24 -0500 Date: Fri, 12 Nov 2004 18:56:24 -0500 (EST) From: John Heffner To: Dave Hansen cc: netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload In-Reply-To: <1100303625.14465.631.camel@localhost> Message-ID: References: <1100303625.14465.631.camel@localhost> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: clamd / ClamAV version 0.75, clamav-milter version 0.75 on mailer1.psc.edu X-Virus-Status: Clean X-archive-position: 11769 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jheffner@psc.edu Precedence: bulk X-list: netdev Content-Length: 1034 Lines: 22 On Fri, 12 Nov 2004, Dave Hansen wrote: > On Fri, 2004-11-12 at 15:46, John Heffner wrote: > > Currently with many common Ethernet devices in Linux, hardware TCP > > checksumming is enabled by default. This seems fairly dangerous to me. > > Most link layer checksums are much stronger than the TCP/UDP checksum; > > most bit errors are caught by these. However, one of the primary purposes > > of the TCP/UDP checksum is to detect errors occurring outside the > > protection of the link layer checksums -- errors when data is reassembled > > or copied across busses inside hosts and routers. > > If you're getting errors copying things on buses inside of the machine, > don't you have bigger problems than corrupt packets? For instance, why > doesn't your disk controller have the same problem? > > Just curious. It's a probem with the NIC. It did the same thing in a different machine. The point is that I think it's a good idea to mitigate the effects of faulty hardware, especially if you can do so nearly for free. -John From davem@davemloft.net Fri Nov 12 16:03:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 16:03:47 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD03fCQ026611 for ; Fri, 12 Nov 2004 16:03:42 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSlAn-0004ec-00; Fri, 12 Nov 2004 15:49:45 -0800 Date: Fri, 12 Nov 2004 15:49:45 -0800 From: "David S. Miller" To: John Heffner Cc: netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload Message-Id: <20041112154945.63da5103.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11770 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 1632 Lines: 39 On Fri, 12 Nov 2004 18:46:11 -0500 (EST) John Heffner wrote: > Though I don't have any definitive references, I've heard stories that Sun > turned off UDP checksums on LANs to increase NFS performance, only to > re-enable checksumming by default after problems similar to mine caused > corruptions of some critical databases. That story about Sun is true. But it is an entirely different matter to disable checksums altogether vs. disabling HW assisted checksumming. > Since TCP checksum offload should only really helps the zero-copy case in > terms of performance, it seems safer to turn off hardware checksumming by > default, or perhaps only enable it if an application is doing a zero-copy > send. I disagree. What is the difference between the CPU (a bus agent with computational abilities), and a networking card (again, a bus agent with computational abilities) computing the checksums? In your listed case you found a bug, and it appears that what happened is that the DMA transfer got corrupted to the networking card yet a properly checksummed packet went out because the card computed the checksum. What would happen if this happened on a block device? Your filesystem would get corrupted, perhaps irreparably. How is this any different? It's a hard error for the DMA data to be corrupted. The data could just as easily be corrupted on the way to the CPU when doing a copy+checksum operation. It's the same problem you say exists with your networking card case except the path of the corruption is RAM-->CPU instead of RAM-->PCI Controller-->Networking Card I really don't buy this. :-) From jheffner@psc.edu Fri Nov 12 16:37:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 16:37:05 -0800 (PST) Received: from mailer2.psc.edu (mailer2.psc.edu [128.182.66.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD0b1KU030747 for ; Fri, 12 Nov 2004 16:37:01 -0800 Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by mailer2.psc.edu (8.12.10/8.12.5) with ESMTP id iAD0aZbX025918 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 12 Nov 2004 19:36:35 -0500 (EST) Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by dexter.psc.edu (8.12.11/8.12.10) with ESMTP id iAD0aZuR009651; Fri, 12 Nov 2004 19:36:35 -0500 Date: Fri, 12 Nov 2004 19:36:35 -0500 (EST) From: John Heffner To: "David S. Miller" cc: netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload In-Reply-To: <20041112154945.63da5103.davem@davemloft.net> Message-ID: References: <20041112154945.63da5103.davem@davemloft.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: clamd / ClamAV version 0.75, clamav-milter version 0.75 on mailer2.psc.edu X-Virus-Status: Clean X-archive-position: 11771 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jheffner@psc.edu Precedence: bulk X-list: netdev Content-Length: 648 Lines: 17 On Fri, 12 Nov 2004, David S. Miller wrote: > The data could just as easily be corrupted on the way to the CPU when > doing a copy+checksum operation. It's the same problem you say exists > with your networking card case except the path of the corruption is > RAM-->CPU instead of RAM-->PCI Controller-->Networking Card > > I really don't buy this. :-) Sure. But we can get a check on one point of failure nearly free. I've measured about a 1% difference in CPU use with checksum on vs. off at 1 gigabit. Probably not a big deal (yeah, somethings buggy anyway and needs to be fixed or replaced), but I thought it worth pointing out. -John From davem@davemloft.net Fri Nov 12 16:43:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 16:43:21 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD0hF6v031129 for ; Fri, 12 Nov 2004 16:43:15 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CSlnC-0004mZ-00; Fri, 12 Nov 2004 16:29:26 -0800 Date: Fri, 12 Nov 2004 16:29:26 -0800 From: "David S. Miller" To: John Heffner Cc: netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload Message-Id: <20041112162926.799af564.davem@davemloft.net> In-Reply-To: References: <20041112154945.63da5103.davem@davemloft.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11772 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 335 Lines: 8 On Fri, 12 Nov 2004 19:36:35 -0500 (EST) John Heffner wrote: > Probably not a big deal (yeah, somethings buggy anyway and needs to be > fixed or replaced), but I thought it worth pointing out. It certainly was an interesting viewpoint. I haven't totally dismissed your ideas, so please don't get that impression. From shemminger@osdl.org Fri Nov 12 20:34:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 20:35:00 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD4YueN006173 for ; Fri, 12 Nov 2004 20:34:56 -0800 Received: from www.osdl.org (fire.osdl.org [65.172.181.4]) by fire-1.osdl.org (8.12.8/8.12.8) with SMTP id iAD4YHPD017270; Fri, 12 Nov 2004 20:34:17 -0800 Received: from 63.170.215.71 (SquirrelMail authenticated user shemminger) by www.osdl.org with HTTP; Fri, 12 Nov 2004 20:34:19 -0800 (PST) Message-ID: <60051.63.170.215.71.1100320459.squirrel@www.osdl.org> In-Reply-To: <20041112162641.GA7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111155349.4537044c@zqx3.pdx.osdl.net> <20041112162641.GA7066@infradead.org> Date: Fri, 12 Nov 2004 20:34:19 -0800 (PST) Subject: Re: [PATCH] (3/23) sk98: /proc interface related changes From: shemminger@osdl.org To: "Christoph Hellwig" Cc: "Stephen Hemminger" , "Jeff Garzik" , "Michael Heyse" , "Mirko Lindner" , netdev@oss.sgi.com User-Agent: SquirrelMail/1.4.2-1_osdl_00 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 Importance: Normal Received-SPF: pass (domain of shemminger@osdl.org designates 65.172.181.4 as permitted sender) X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11773 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1018 Lines: 20 > On Thu, Nov 11, 2004 at 03:53:49PM -0800, Stephen Hemminger wrote: >> The /proc intereface can be cleaned up a lot: >> + Pass the device to through the proc data/seq_private hook. >> + No longer needs to have a list of network devices >> + use seq_printf directly rather than indirection into a buffer >> + failure to create proc directory or interface should not >> be fatal. >> + if PROC_FS not configured, let the stubs cause the necessary >> code elimination rather than using #ifdef > > This is still totally broken because dev->name may change between > registration and removal. If a netdriver wants to use procfs file > per-adapter it needs to use an enumeration scheme independant of the > netdevice naming. Or even better stop using procfs at all. I would prefer to get rid of /proc interface altogether. I will unless SysKonnect says they have some application depending on it. There are a few statistics that don't show up in ethtool, but it wouldn't be hard to add those (or put them in sysfs). From shemminger@osdl.org Fri Nov 12 20:40:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 20:40:21 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD4eH1r006597 for ; Fri, 12 Nov 2004 20:40:17 -0800 Received: from www.osdl.org (fire.osdl.org [65.172.181.4]) by fire-1.osdl.org (8.12.8/8.12.8) with SMTP id iAD4dmPD017585; Fri, 12 Nov 2004 20:39:48 -0800 Received: from 63.170.215.71 (SquirrelMail authenticated user shemminger) by www.osdl.org with HTTP; Fri, 12 Nov 2004 20:39:48 -0800 (PST) Message-ID: <60128.63.170.215.71.1100320788.squirrel@www.osdl.org> In-Reply-To: <20041112162904.GB7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111155503.6e0349b8@zqx3.pdx.osdl.net> <20041112162904.GB7066@infradead.org> Date: Fri, 12 Nov 2004 20:39:48 -0800 (PST) Subject: Re: [PATCH] (7/23) sk98: basic ethtool support From: shemminger@osdl.org To: "Christoph Hellwig" Cc: "Stephen Hemminger" , "Jeff Garzik" , "Michael Heyse" , "Mirko Lindner" , netdev@oss.sgi.com User-Agent: SquirrelMail/1.4.2-1_osdl_00 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 Importance: Normal Received-SPF: pass (domain of shemminger@osdl.org designates 65.172.181.4 as permitted sender) X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11774 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1685 Lines: 47 > On Thu, Nov 11, 2004 at 03:55:03PM -0800, Stephen Hemminger wrote: >> The basic stuff comes from the newer code from SysKonnect, but I redid >> it using ethtool_ops and a cleaner way of doing the stats (from e100) > > >> +/***************************************************************************** >> + * >> + * getSettings - retrieves the current settings of the selected >> adapter >> + * >> + * Description: >> + * The current configuration of the selected adapter is returned. >> + * This configuration involves a)speed, b)duplex and c)autoneg plus >> + * a number of other variables. >> + * >> + * Returns: always 0 >> + * >> + */ > > Please use normal kernel-doc function documentation. That was SysKonnect's format, personally I would rather no comment because this isn't an API for any external usage and is obvious. > >> +static int getSettings(struct net_device *dev, struct ethtool_cmd >> *ecmd) > > And avoid studlyCaps. Also an sk98lin prefix even on private function > helps avoiding nameclashes for the generic names (and in the debugger > or oopses) I'll just change them to normal kernel format (ie get_settings). But no, putting prefix's on local obvious functions is a waste. >> +{ >> + const DEV_NET *pNet = netdev_priv(dev); > > please always use struct net_device instead of strange typedefs for it. DEV_NET is one of their typedef's (for the driver private data). I prefer to change them last after all the other patches. Don't want some files using 'struct s_Devnet' and others using 'DEV_NET', that would be more confusing. Eventually DEV_NET will be replaced by something more descriptive 'struct sk98_port' and AC will be 'struct sk8_board' From shemminger@osdl.org Fri Nov 12 20:44:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 12 Nov 2004 20:44:19 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAD4iFd3006946 for ; Fri, 12 Nov 2004 20:44:15 -0800 Received: from www.osdl.org (fire.osdl.org [65.172.181.4]) by fire-1.osdl.org (8.12.8/8.12.8) with SMTP id iAD4hkPD017845; Fri, 12 Nov 2004 20:43:46 -0800 Received: from 63.170.215.71 (SquirrelMail authenticated user shemminger) by www.osdl.org with HTTP; Fri, 12 Nov 2004 20:43:47 -0800 (PST) Message-ID: <60183.63.170.215.71.1100321027.squirrel@www.osdl.org> In-Reply-To: <20041112163041.GC7066@infradead.org> References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111160113.15a356cd@zqx3.pdx.osdl.net> <20041112163041.GC7066@infradead.org> Date: Fri, 12 Nov 2004 20:43:47 -0800 (PST) Subject: Re: [PATCH] (15/23) sk98: rearrange initialization From: shemminger@osdl.org To: "Christoph Hellwig" Cc: "Stephen Hemminger" , "Jeff Garzik" , "Michael Heyse" , "Mirko Lindner" , netdev@oss.sgi.com User-Agent: SquirrelMail/1.4.2-1_osdl_00 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 Importance: Normal Received-SPF: pass (domain of shemminger@osdl.org designates 65.172.181.4 as permitted sender) X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11775 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 612 Lines: 13 > On Thu, Nov 11, 2004 at 04:01:13PM -0800, Stephen Hemminger wrote: >> The code in the latest SysKonnect driver is arranged differently, >> this aligns the two versions to allow for easier comparisons. >> Also: >> Don't enable the pci device twice. >> Add common SkGeDevInit for common code used to setup both ports > > please don't reorder the functions. I placed them in natural order when > converting to new pci probing for a good reason. I really don't care which way it goes, just trying to make SysKonnect's life easeier. When all the comments are in, I will redo the patches without the reordering From romieu@fr.zoreil.com Sat Nov 13 03:32:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 03:33:06 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iADBWskO019924 for ; Sat, 13 Nov 2004 03:32:55 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iADBWSvr012240; Sat, 13 Nov 2004 12:32:28 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iADBWNt1012239; Sat, 13 Nov 2004 12:32:23 +0100 Date: Sat, 13 Nov 2004 12:32:23 +0100 From: Francois Romieu To: John Heffner Cc: Dave Hansen , netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload Message-ID: <20041113113223.GA12109@electric-eye.fr.zoreil.com> References: <1100303625.14465.631.camel@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11776 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 240 Lines: 9 John Heffner : [...] > The point is that I think it's a good idea to mitigate the effects of > faulty hardware, especially if you can do so nearly for free. Perhaps it could go as a new option for ethtool -t. -- Ueimor From bunk@stusta.de Sat Nov 13 06:54:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 06:54:55 -0800 (PST) Received: from mailout.stusta.mhn.de (mailout.stusta.mhn.de [141.84.69.5]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iADEsl3F028119 for ; Sat, 13 Nov 2004 06:54:48 -0800 Received: (qmail 20041 invoked from network); 13 Nov 2004 14:54:23 -0000 Received: from r063144.stusta.swh.mhn.de (10.150.63.144) by mailhub.stusta.mhn.de with SMTP; 13 Nov 2004 14:54:23 -0000 Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000) id 47F9EBBB33; Sat, 13 Nov 2004 15:53:52 +0100 (CET) Date: Sat, 13 Nov 2004 15:53:51 +0100 From: Adrian Bunk To: Robert Olsson Cc: davem@davemloft.net, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [patch] net/core/pktgen.c shouldn't include pci.h Message-ID: <20041113145351.GZ2249@stusta.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-archive-position: 11777 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bunk@stusta.de Precedence: bulk X-list: netdev Content-Length: 695 Lines: 24 If rebuilding after touching pci.h in 2.6, net/core/pktgen.c is the only file under net/ that gets rebuilt. I searched and didn't find any reason why net/core/pktgen.c needs to include pci.h . I'm therefore suggesting the patch below (applies against both 2.4 and 2.6). Signed-off-by: Adrian Bunk --- linux-2.6.10-rc1-mm5-full/net/core/pktgen.c.old 2004-11-13 14:37:43.000000000 +0100 +++ linux-2.6.10-rc1-mm5-full/net/core/pktgen.c 2004-11-13 14:40:07.000000000 +0100 @@ -69,7 +69,6 @@ #include #include #include -#include #include #include #include From sinder@thp.Uni-Koeln.DE Sat Nov 13 11:13:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 11:14:00 -0800 (PST) Received: from sun80.thp.Uni-Koeln.DE (sun80.thp.uni-koeln.de [134.95.67.81]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iADJDsGw005899 for ; Sat, 13 Nov 2004 11:13:55 -0800 Received: (from sinder@localhost) by sun80.thp.Uni-Koeln.DE (8.11.7+Sun/8.11.7) id iADJDZ321996; Sat, 13 Nov 2004 20:13:35 +0100 (MET) Message-Id: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> From: sinder@thp.Uni-Koeln.DE (Andreas Sindermann) Date: Sat, 13 Nov 2004 20:13:35 +0100 X-Mailer: Mail User's Shell (7.2.5 10/14/92) To: netdev@oss.sgi.com Subject: Options for forcedeth Linux kernel module Cc: c-d.hailfinger.kernel.2004@gmx.net X-archive-position: 11778 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sinder@thp.Uni-Koeln.DE Precedence: bulk X-list: netdev Content-Length: 759 Lines: 21 Hi, I'm searching for options (for modules.conf) of the forcedeth kernel module. I'm using the Suse 9.2 version which seems to be 0.29. On http://www.hailfinger.org/carldani/linux/patches/forcedeth/ I can't find any information how to explicity set options for 100 Mbps full duplex. Currently the driver sets the network device to 100 Mbps half duplex which results in extremely poor performance (only a few KB/sec throughput) since our network switch is configured with full duplex explicitely (and we can't change it because Sun workstations won't work properly otherwise). I've looked into the sourced and searched google but unfortunately without success. A short hint to a source of information would be of great help. Thanks in advance Andreas From bunk@stusta.de Sat Nov 13 12:08:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 12:08:41 -0800 (PST) Received: from mailout.stusta.mhn.de (mailout.stusta.mhn.de [141.84.69.5]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iADK8Wsm007340 for ; Sat, 13 Nov 2004 12:08:33 -0800 Received: (qmail 6082 invoked from network); 13 Nov 2004 20:08:08 -0000 Received: from r063144.stusta.swh.mhn.de (10.150.63.144) by mailout.stusta.mhn.de with SMTP; 13 Nov 2004 20:08:08 -0000 Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000) id BA4A6C7A44; Sat, 13 Nov 2004 21:07:35 +0100 (CET) Date: Sat, 13 Nov 2004 21:07:35 +0100 From: Adrian Bunk To: Marcelo Tosatti , Harald Welte , "David S. Miller" Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, patrick@tykepenguin.com, linux-decnet-user@lists.sourceforge.net Subject: [patch] 2.4.28-rc3: neigh_for_each must be EXPORT_SYMBOL'ed Message-ID: <20041113200735.GD2249@stusta.de> References: <20041112180052.GE23215@logos.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041112180052.GE23215@logos.cnet> User-Agent: Mutt/1.5.6+20040907i X-archive-position: 11779 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bunk@stusta.de Precedence: bulk X-list: netdev Content-Length: 1139 Lines: 42 I'm getting the following error: <-- snip --> depmod: *** Unresolved symbols in /lib/modules/2.4.28-rc3/kernel/net/decnet/decnet.o depmod: neigh_for_each <-- snip --> This was caused by Harald's backport of the neighbour scalability fixes from 2.6 . neigh_for_each must be EXPORT_SYMBOL'ed (as it is in 2.6): Signed-off-by: Adrian Bunk --- linux-2.4.28-rc3-modular/net/core/Makefile.old 2004-11-13 19:40:36.000000000 +0100 +++ linux-2.4.28-rc3-modular/net/core/Makefile 2004-11-13 19:40:50.000000000 +0100 @@ -9,7 +9,7 @@ O_TARGET := core.o -export-objs := netfilter.o profile.o ethtool.o +export-objs := netfilter.o profile.o ethtool.o neighbour.o obj-y := sock.o skbuff.o iovec.o datagram.o scm.o --- linux-2.4.28-rc3-modular/net/core/neighbour.c.old 2004-11-13 19:35:26.000000000 +0100 +++ linux-2.4.28-rc3-modular/net/core/neighbour.c 2004-11-13 19:35:59.000000000 +0100 @@ -1569,6 +1569,7 @@ } read_unlock_bh(&tbl->lock); } +EXPORT_SYMBOL(neigh_for_each); /* The tbl->lock must be held as a writer and BH disabled. */ void __neigh_for_each_release(struct neigh_table *tbl, From jgarzik@pobox.com Sat Nov 13 17:20:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 17:20:37 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE1KV9F021334 for ; Sat, 13 Nov 2004 17:20:31 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CT93s-0007hS-56; Sun, 14 Nov 2004 01:20:12 +0000 Message-ID: <4196B2B8.3040202@pobox.com> Date: Sat, 13 Nov 2004 20:19:52 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Daniele Venzano CC: Rusty Russell , NetDev Subject: Re: [PATCH] convert sis900 to new style parameters References: <20041112220710.GB29980@gateway.milesteg.arr> In-Reply-To: <20041112220710.GB29980@gateway.milesteg.arr> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11780 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 786 Lines: 20 Patch is OK, but your mailer sends them "MIME-encrypted", which means script (like the ones I use) cannot merge the patch. Example from your email: > @@ -179,9 +180,9 @@ > MODULE_DESCRIPTION("SiS 900 PCI Fast Ethernet driver"); > MODULE_LICENSE("GPL"); > =20 > -MODULE_PARM(multicast_filter_limit, "i"); > -MODULE_PARM(max_interrupt_work, "i"); > -MODULE_PARM(debug, "i"); > +module_param(multicast_filter_limit, int, 0444); > +module_param(max_interrupt_work, int, 0444); > +module_param(debug, int, 0444); > MODULE_PARM_DESC(multicast_filter_limit, "SiS 900/7016 maximum number of f= > iltered multicast addresses"); > MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled = > per interrupt"); > MODULE_PARM_DESC(debug, "SiS 900/7016 debug level (2-4)"); From jgarzik@pobox.com Sat Nov 13 17:29:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 17:29:49 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE1Tikd021921 for ; Sat, 13 Nov 2004 17:29:44 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CT9Cn-0007t5-Cs; Sun, 14 Nov 2004 01:29:25 +0000 Message-ID: <4196B4E9.40502@pobox.com> Date: Sat, 13 Nov 2004 20:29:13 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Thomas Spatzier CC: linux-kernel@vger.kernel.org, Netdev Subject: Re: [patch 4/10] s390: network driver. References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11781 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1314 Lines: 39 Thomas Spatzier wrote: > > > >>You should be using netif_carrier_{on,off} properly, and not drop the >>packets. When (if) link comes back, you requeue the packets to hardware >>(or hypervisor or whatever). Your dev->stop() should stop operation and >>clean up anything left in your send/receive {rings | buffers}. >> > > > When we do not drop packets, but call netif_stop_queue the write queues > of all sockets associated to the net device are blocked as soon as they > get full. This causes problems with programs such as the zebra routing > daemon. So we have to keep the netif queue running in order to not block > any programs. This is very, very wrong. You are essentially creating in in-driver /dev/null simulator. This does nothing but chew CPU cycles by having the driver drop packets, rather than allowing the system to work as it should. Queues are DESIGNED to fill up under various conditions. Would not the zebra routing software have the same problems with cable pull under an e1000 or tg3 gigabit NIC? > We also had a look at some other drivers and the common behaviour seems to > be that packets are lost if the network cable is pulled out. Which drivers, specifically, are these? The most popular drivers -- e1000, tg3, etc. -- do not do this, for very good reasons. Jeff From jgarzik@pobox.com Sat Nov 13 17:43:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 17:43:49 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE1hhn6022518 for ; Sat, 13 Nov 2004 17:43:44 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CT9QL-00089O-1f; Sun, 14 Nov 2004 01:43:25 +0000 Message-ID: <4196B830.10906@pobox.com> Date: Sat, 13 Nov 2004 20:43:12 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Stephen Hemminger CC: Michael Heyse , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (10/23) sk98: cleanout unnecessary controller elements References: <4192C60A.1050205@designassembly.de> <20041111154225.5cf85567@zqx3.pdx.osdl.net> <20041111155558.22c8860a@zqx3.pdx.osdl.net> In-Reply-To: <20041111155558.22c8860a@zqx3.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11782 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 419 Lines: 16 Stephen Hemminger wrote: > Catchall cleanup patch: > * get rid of obfuscating #define's > * eliminate structure elements in the controller structure > that are never used or only used in one context or available > in net_device I applied patches 1 - 9 to netdev-2.6 queue. I would prefer that you split up this patch a bit more, and resend that (and the rest of this series) in a new patch series. Jeff From cranium2003@yahoo.com Sat Nov 13 19:02:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 19:02:26 -0800 (PST) Received: from web41406.mail.yahoo.com (web41406.mail.yahoo.com [66.218.93.72]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAE32L6S024958 for ; Sat, 13 Nov 2004 19:02:21 -0800 Received: (qmail 88093 invoked by uid 60001); 14 Nov 2004 03:01:58 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=dlljp9VNPMX7NkxxwHtFQdOaTMN/0yjRDJ3nL9ib76tSimuNVBmS/f4RNcSGXQhdQp3ei8T7ybv3Wk1DrqLDPuYADxPo5m9x7frcoslrdpsf1ohCy12G9uja8mjW+f8sHseF6mIv2VrFZwl9FoYSf0h9V+lVoTAXJc4jWTAIVw4= ; Message-ID: <20041114030157.88091.qmail@web41406.mail.yahoo.com> Received: from [66.218.69.219] by web41406.mail.yahoo.com via HTTP; Sat, 13 Nov 2004 19:01:57 PST Date: Sat, 13 Nov 2004 19:01:57 -0800 (PST) From: cranium2003 Subject: network protocol query To: netdev@oss.sgi.com Cc: kernelnewbies@nl.linux.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 11783 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev Content-Length: 309 Lines: 16 hello, For study purpose i want to add new protocol in linux kernel. Is there any function in kernel that help me to add new protocol?can it be working with existing tcp/ip? regards, cranium2003 __________________________________ Do you Yahoo!? Check out the new Yahoo! Front Page. www.yahoo.com From jm@jm.kir.nu Sat Nov 13 21:18:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:18:59 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5ImWa031318 for ; Sat, 13 Nov 2004 21:18:49 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCjd-0003sU-Kp; Sat, 13 Nov 2004 21:15:33 -0800 Date: Sat, 13 Nov 2004 21:15:33 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com, Andrew Morton , James Ketrenos Subject: Re: [PATCH wireless-2.6 0/12] Host AP update Message-ID: <20041114051533.GA14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> <41907A06.2040702@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41907A06.2040702@pobox.com> User-Agent: Mutt/1.5.6i X-archive-position: 11784 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 2655 Lines: 58 On Tue, Nov 09, 2004 at 03:04:22AM -0500, Jeff Garzik wrote: > Andrew Morton's "-mm" kernels are essentially a staging area for pushing > changes to the upstream kernel. I pulled the latest wireless-2.6 tree > (includes your latest patches #1 - #9) into my netdev-2.6 queue. > netdev-2.6, in turn, is automatically pulled by Andrew, into his -mm > tree. It will get wider review and testing here. Thanks! I'll send couple of more patches to update the driver to Linux 2.6.10-rc1. > A key goal I have for HostAP is that portions of HostAP code should be > bundled into a generic "lib80211" kernel module, for use by various > low-level and "softmac" 802.11 device drivers. Agreed. > The Intel Centrino driver folks are already using HostAP in this > capacity, and I _think_ their changes were fairly minimal and cosmetic. > If the changes are indeed minimal, I think it's better to merge > those changes before sending HostAP stuff upstream. I haven't went through all the changes in Intel driver, but at least IEEE 802.11g support is going to require quite a bit more work and IEEE 802.11a and Atheros-like hardware even more. > To emphasize that the upstream-bound HostAP code is a generic library > (well, parts of it), I would prefer that the kernel module name, and API > prefixes, use some name other than 'hostap_'. 'wifi_' or 'ieee80211_' > or whatever, I don't care. Just something "more generic". > > I would rather perform mass renaming of functions and files before > merging upstream. I can start cleaning up some of the functions and renaming them in the code. However, I still want to finalize couple of things in my employment agreement before starting doing more "non-Host AP" things. I would thus prefer to be able to get current Host AP driver merged upstream before doing full merge with other drivers (I would add at least net80211/madwifi to the list with Intel drivers). This would allow me to maintain stable version of Host AP driver without having to do too much work with an external CVS repository and start working on wireless-2.6 for the generic library and merging. > IMHO the bksend stuff is useless. I prefer "plain ole patches", like > the ones you sent in emails '1/12' through '12/12' in this thread. OK. > WRT the patches you sent, as I mentioned, #1 - #9 were applied. Please > update #10 and #11 per comments, and then resend #10 - #12. I have updated #10 and #11 and added couple of more patches (13..16) to match with the Linux 2.6.10-rc1 pull into wireless-2.6. I'll re-send 10..12 and send 13..16. -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:22:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:22:07 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5M12F031649 for ; Sat, 13 Nov 2004 21:22:01 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCml-0003su-Iy; Sat, 13 Nov 2004 21:18:47 -0800 Date: Sat, 13 Nov 2004 21:18:47 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 10/16] Host AP: Use void __iomem * with {read,write}{b,w} Message-ID: <20041114051847.GB14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> <20041108071630.GK1076@jm.kir.nu> <419071D5.8070208@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419071D5.8070208@pobox.com> User-Agent: Mutt/1.5.6i X-archive-position: 11785 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 8451 Lines: 278 Start using void __iomem * instead of unsigned long with {read,write}{b,w} to silence compiler warning with Linux 2.6.9-rc2 and newer. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:55:58 -08:00 +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:55:58 -08:00 @@ -50,25 +50,25 @@ static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); local_info_t *local = iface->local; unsigned long flags; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); - writeb(v, dev->mem_start + a); + writeb(v, local->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); local_info_t *local = iface->local; unsigned long flags; u8 v; spin_lock_irqsave(&local->lock, flags); - v = readb(dev->mem_start + a); + v = readb(local->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -76,25 +76,25 @@ static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); local_info_t *local = iface->local; unsigned long flags; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); - writew(v, dev->mem_start + a); + writew(v, local->mem_start + a); spin_unlock_irqrestore(&local->lock, flags); } static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); local_info_t *local = iface->local; unsigned long flags; u16 v; spin_lock_irqsave(&local->lock, flags); - v = readw(dev->mem_start + a); + v = readw(local->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); spin_unlock_irqrestore(&local->lock, flags); return v; @@ -109,12 +109,40 @@ #else /* PRISM2_IO_DEBUG */ -#define HFA384X_OUTB(v,a) writeb((v), dev->mem_start + (a)) -#define HFA384X_INB(a) (u8) readb(dev->mem_start + (a)) -#define HFA384X_OUTW(v,a) writew((v), dev->mem_start + (a)) -#define HFA384X_INW(a) (u16) readw(dev->mem_start + (a)) -#define HFA384X_OUTW_DATA(v,a) writew(cpu_to_le16(v), dev->mem_start + (a)) -#define HFA384X_INW_DATA(a) (u16) le16_to_cpu(readw(dev->mem_start + (a))) +static inline void hfa384x_outb(struct net_device *dev, int a, u8 v) +{ + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; + writeb(v, local->mem_start + a); +} + +static inline u8 hfa384x_inb(struct net_device *dev, int a) +{ + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; + return readb(local->mem_start + a); +} + +static inline void hfa384x_outw(struct net_device *dev, int a, u16 v) +{ + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; + writew(v, local->mem_start + a); +} + +static inline u16 hfa384x_inw(struct net_device *dev, int a) +{ + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; + return readw(local->mem_start + a); +} + +#define HFA384X_OUTB(v,a) hfa384x_outb(dev, (a), (v)) +#define HFA384X_INB(a) hfa384x_inb(dev, (a)) +#define HFA384X_OUTW(v,a) hfa384x_outw(dev, (a), (v)) +#define HFA384X_INW(a) hfa384x_inw(dev, (a)) +#define HFA384X_OUTW_DATA(v,a) hfa384x_outw(dev, (a), cpu_to_le16((v))) +#define HFA384X_INW_DATA(a) (u16) le16_to_cpu(hfa384x_inw(dev, (a))) #endif /* PRISM2_IO_DEBUG */ @@ -232,7 +260,7 @@ const struct pci_device_id *id) { unsigned long phymem; - unsigned long mem = 0; + void __iomem *mem = NULL; local_info_t *local = NULL; struct net_device *dev = NULL; static int cards_found /* = 0 */; @@ -249,8 +277,8 @@ goto err_out_disable; } - mem = (unsigned long) ioremap(phymem, pci_resource_len(pdev, 0)); - if (!mem) { + mem = ioremap(phymem, pci_resource_len(pdev, 0)); + if (mem == NULL) { printk(KERN_ERR "prism2: Cannot remap PCI memory region\n") ; goto fail; } @@ -267,8 +295,7 @@ cards_found++; dev->irq = pdev->irq; - dev->mem_start = mem; - dev->mem_end = mem + pci_resource_len(pdev, 0); + local->mem_start = mem; prism2_pci_cor_sreset(local); @@ -297,7 +324,7 @@ free_irq(dev->irq, dev); if (mem) - iounmap((void *) mem); + iounmap(mem); release_mem_region(phymem, pci_resource_len(pdev, 0)); @@ -312,8 +339,8 @@ static void prism2_pci_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - struct hostap_interface *iface = dev->priv; - unsigned long mem_start; + struct hostap_interface *iface = netdev_priv(dev); + void __iomem *mem_start; /* Reset the hardware, and ensure interrupts are disabled. */ prism2_pci_cor_sreset(iface->local); @@ -322,10 +349,10 @@ if (dev->irq) free_irq(dev->irq, dev); - mem_start = dev->mem_start; + mem_start = iface->local->mem_start; prism2_free_local_data(dev); - iounmap((void *) mem_start); + iounmap(mem_start); release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:55:58 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:55:58 -08:00 @@ -247,7 +247,7 @@ /* Set sreset bit of COR and clear it after hold time */ - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -271,7 +271,7 @@ { unsigned char corsave; - if (local->attr_mem == 0) { + if (local->attr_mem == NULL) { /* TMD7160 - COR at card's first I/O addr */ corsave = inb(local->cor_offset); outb(corsave | COR_SRESET, local->cor_offset); @@ -306,7 +306,7 @@ }; -static int prism2_plx_check_cis(unsigned long attr_mem, int attr_len, +static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, unsigned int *cor_offset, unsigned int *cor_index) { @@ -401,7 +401,7 @@ unsigned int pccard_ioaddr, plx_ioaddr; unsigned long pccard_attr_mem; unsigned int pccard_attr_len; - unsigned long attr_mem = 0; + void __iomem *attr_mem = NULL; unsigned int cor_offset, cor_index; u32 reg; local_info_t *local = NULL; @@ -422,7 +422,7 @@ if (tmd7160) { /* TMD7160 */ - attr_mem = 0; /* no access to PC Card attribute memory */ + attr_mem = NULL; /* no access to PC Card attribute memory */ printk(KERN_INFO "TMD7160 PCI/PCMCIA adapter: io=0x%x, " "irq=%d, pccard_io=0x%x\n", @@ -448,9 +448,8 @@ goto fail; - attr_mem = (unsigned long) ioremap(pccard_attr_mem, - pccard_attr_len); - if (!attr_mem) { + attr_mem = ioremap(pccard_attr_mem, pccard_attr_len); + if (attr_mem == NULL) { printk(KERN_ERR "%s: cannot remap attr_mem\n", dev_info); goto fail; @@ -532,7 +531,7 @@ free_irq(dev->irq, dev); if (attr_mem) - iounmap((void *) attr_mem); + iounmap(attr_mem); pci_disable_device(pdev); @@ -550,7 +549,7 @@ hfa384x_disable_interrupts(dev); if (iface->local->attr_mem) - iounmap((void *) iface->local->attr_mem); + iounmap(iface->local->attr_mem); if (dev->irq) free_irq(dev->irq, dev); diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:55:58 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:55:58 -08:00 @@ -895,11 +895,12 @@ #endif /* PRISM2_PCCARD */ #ifdef PRISM2_PLX - unsigned long attr_mem; + void __iomem *attr_mem; unsigned int cor_offset; #endif /* PRISM2_PLX */ #ifdef PRISM2_PCI + void __iomem *mem_start; #ifdef PRISM2_BUS_MASTER /* bus master for BAP0 (TX) */ int bus_m0_tx_idx; -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:23:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:23:26 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5NIst031974 for ; Sat, 13 Nov 2004 21:23:18 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCo0-0003tD-On; Sat, 13 Nov 2004 21:20:04 -0800 Date: Sat, 13 Nov 2004 21:20:04 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 11/16] Host AP: Fix PRISM2_IO_DEBUG Message-ID: <20041114052004.GC14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> <20041108071710.GL1076@jm.kir.nu> <419071F0.6030602@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419071F0.6030602@pobox.com> User-Agent: Mutt/1.5.6i X-archive-position: 11786 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1217 Lines: 38 From Mark Glines : I just noticed PRISM2_IO_DEBUG doesn't work. This patch gets it working again. I checked the development CVS snapshot, looks like its still broken there. jkm: in addition, fix the other PRISM2_IO_DEBUG function Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:09 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:09 -08:00 @@ -1004,7 +1004,8 @@ static inline void prism2_io_debug_add(struct net_device *dev, int cmd, int reg, int value) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; if (!local->io_debug_enabled) return; @@ -1021,7 +1022,8 @@ static inline void prism2_io_debug_error(struct net_device *dev, int err) { - local_info_t *local = dev->priv; + struct hostap_interface *iface = netdev_priv(dev); + local_info_t *local = iface->local; unsigned long flags; if (!local->io_debug_enabled) -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:25:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:25:16 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5PC0Q032336 for ; Sat, 13 Nov 2004 21:25:12 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCpp-0003tW-Gx; Sat, 13 Nov 2004 21:21:57 -0800 Date: Sat, 13 Nov 2004 21:21:57 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 12/16] Host AP: Fix netif_carrier_off() in non-client modes Message-ID: <20041114052157.GD14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11787 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1635 Lines: 46 Connection status is reported properly only in client modes, so do not try to set netif_carrier_off() in non-client modes. Previously, Master mode may end up being in state where netif_carrier was left off and this may break things like bridging. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:17 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:17 -08:00 @@ -3399,8 +3399,11 @@ "", dev_template); if (local->ddev) { - netif_carrier_off(local->dev); - netif_carrier_off(local->ddev); + if (local->iw_mode == IW_MODE_INFRA || + local->iw_mode == IW_MODE_ADHOC) { + netif_carrier_off(local->dev); + netif_carrier_off(local->ddev); + } hostap_init_proc(local); hostap_init_ap_proc(local); return 0; diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:17 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:17 -08:00 @@ -1108,6 +1108,13 @@ if (double_reset && local->func->reset_port(dev)) return -EINVAL; + if (local->iw_mode != IW_MODE_INFRA && local->iw_mode != IW_MODE_ADHOC) + { + /* netif_carrier is used only in client modes for now, so make + * sure carrier is on when moving to non-client modes. */ + netif_carrier_on(local->dev); + netif_carrier_on(local->ddev); + } return 0; } -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:26:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:26:18 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5QE4a032597 for ; Sat, 13 Nov 2004 21:26:14 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCqm-0003tm-LG; Sat, 13 Nov 2004 21:22:56 -0800 Date: Sat, 13 Nov 2004 21:22:56 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 13/16] Host AP: pci_register_driver() return value changes Message-ID: <20041114052256.GE14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11788 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 1411 Lines: 47 Changed pci_register_driver() calls to match with the new behavior in Linux 2.6.10-rc1. Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:56:25 -08:00 +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:56:25 -08:00 @@ -414,14 +414,7 @@ { printk(KERN_INFO "%s: %s\n", dev_info, version); - if (pci_register_driver(&prism2_pci_drv_id) <= 0) { - printk("hostap_pci: No devices found, driver not " - "installed.\n"); - pci_unregister_driver(&prism2_pci_drv_id); - return -ENODEV; - } - - return 0; + return pci_register_driver(&prism2_pci_drv_id); } diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:25 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:25 -08:00 @@ -575,14 +575,7 @@ { printk(KERN_INFO "%s: %s\n", dev_info, version); - if (pci_register_driver(&prism2_plx_drv_id) <= 0) { - printk("hostap_plx: No devices found, driver not " - "installed.\n"); - pci_unregister_driver(&prism2_plx_drv_id); - return -ENODEV; - } - - return 0; + return pci_register_driver(&prism2_plx_drv_id); } -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:27:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:27:16 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5R9x0000521 for ; Sat, 13 Nov 2004 21:27:09 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCrj-0003tw-DU; Sat, 13 Nov 2004 21:23:55 -0800 Date: Sat, 13 Nov 2004 21:23:55 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 14/16] Host AP: Updated to use Linux wireless extensions v17 Message-ID: <20041114052355.GF14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11789 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 4454 Lines: 131 Patch from Jean Tourrilhes : HostAP WE-17 support: - allow large scan requests - export event capability - new spy data handling jkm: removed support for old WE versions (ifdefs) Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c --- a/drivers/net/wireless/hostap/hostap.c 2004-11-13 20:56:35 -08:00 +++ b/drivers/net/wireless/hostap/hostap.c 2004-11-13 20:56:35 -08:00 @@ -890,8 +890,12 @@ /* kernel callbacks */ dev->get_stats = hostap_get_stats; - if (main_dev || (iface && iface->type == HOSTAP_INTERFACE_MAIN)) - dev->get_wireless_stats = hostap_get_wireless_stats; + if (iface) { + /* Currently, we point to the proper spy_data only on + * the main_dev. This could be fixed. Jean II */ + iface->wireless_data.spy_data = &iface->spy_data; + dev->wireless_data = &iface->wireless_data; + } dev->wireless_handlers = (struct iw_handler_def *) &hostap_iw_handler_def; dev->do_ioctl = hostap_ioctl; diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:35 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:35 -08:00 @@ -13,6 +13,10 @@ local_info_t *local = iface->local; struct iw_statistics *wstats; + /* Why are we doing that ? Jean II */ + if (iface->type != HOSTAP_INTERFACE_MAIN) + return NULL; + wstats = &local->wstats; wstats->status = 0; @@ -989,6 +993,17 @@ range->min_frag = 256; range->max_frag = 2346; + /* Event capability (kernel + driver) */ + range->event_capa[0] = (IW_EVENT_CAPA_K_0 | + IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) | + IW_EVENT_CAPA_MASK(SIOCGIWAP) | + IW_EVENT_CAPA_MASK(SIOCGIWSCAN)); + range->event_capa[1] = IW_EVENT_CAPA_K_1; + range->event_capa[4] = (IW_EVENT_CAPA_MASK(IWEVTXDROP) | + IW_EVENT_CAPA_MASK(IWEVCUSTOM) | + IW_EVENT_CAPA_MASK(IWEVREGISTERED) | + IW_EVENT_CAPA_MASK(IWEVEXPIRED)); + return 0; } @@ -1818,13 +1833,14 @@ /* Translate scan data returned from the card to a card independant * format that the Wireless Tools will understand - Jean II */ -static inline int prism2_translate_scan(local_info_t *local, char *buffer) +static inline int prism2_translate_scan(local_info_t *local, + char *buffer, int buflen) { struct hfa384x_scan_result *scan; struct hfa384x_hostscan_result *hscan; int entries, entry, hostscan; char *current_ev = buffer; - char *end_buf = buffer + IW_SCAN_MAX_DATA; + char *end_buf = buffer + buflen; u8 *bssid; struct list_head *ptr; @@ -1858,6 +1874,12 @@ local, scan, hscan, hostscan, NULL, bssid, current_ev, end_buf); } + /* Check if there is space for one more entry */ + if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) { + /* Ask user space to try again with a bigger buffer */ + spin_unlock_bh(&local->lock); + return -E2BIG; + } } spin_unlock_bh(&local->lock); @@ -1894,7 +1916,7 @@ } local->scan_timestamp = 0; - res = prism2_translate_scan(local, extra); + res = prism2_translate_scan(local, extra, data->length); if (res >= 0) { data->length = res; @@ -3372,7 +3394,7 @@ .standard = (iw_handler *) prism2_handler, .private = (iw_handler *) prism2_private_handler, .private_args = (struct iw_priv_args *) prism2_priv, - .spy_offset = offsetof(struct hostap_interface, spy_data), + .get_wireless_stats = hostap_get_wireless_stats, }; diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:35 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:35 -08:00 @@ -924,12 +924,8 @@ struct net_device *dev; /* pointer to this device */ struct local_info *local; /* pointer to shared private data */ struct net_device_stats stats; - /* Note: this data area must be at a fixed offset from dev->priv. - * Unfortunately, this model does not fit the current Host AP netdev - * data structure because this should really be in local_into_t that is - * shared by all virtual interfaces. Currently, only the main data - * device (wlan#) is used for iwspy entries. */ struct iw_spy_data spy_data; /* iwspy support */ + struct iw_public_data wireless_data; enum { HOSTAP_INTERFACE_MASTER, -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:28:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:28:12 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5S2UU000860 for ; Sat, 13 Nov 2004 21:28:02 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCsa-0003u3-04; Sat, 13 Nov 2004 21:24:48 -0800 Date: Sat, 13 Nov 2004 21:24:47 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 15/16] Host AP: Replaced direct dev->priv references with netdev_priv(dev). Message-ID: <20041114052447.GG14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11790 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 55873 Lines: 1975 Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c --- a/drivers/net/wireless/hostap/hostap.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap.c 2004-11-13 20:56:44 -08:00 @@ -117,7 +117,7 @@ if (dev == NULL) return NULL; - iface = dev->priv; + iface = netdev_priv(dev); iface->dev = dev; iface->local = local; iface->type = type; @@ -169,7 +169,7 @@ if (!dev) return; - iface = dev->priv; + iface = netdev_priv(dev); if (remove_from_list) { list_del(&iface->list); @@ -254,7 +254,7 @@ if (dev == NULL) return -ENOMEM; - iface = dev->priv; + iface = netdev_priv(dev); memcpy(iface->u.wds.remote_addr, remote_addr, ETH_ALEN); local->wds_connections++; @@ -351,18 +351,20 @@ /* val is in host byte order */ int hostap_set_word(struct net_device *dev, int rid, u16 val) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface; u16 tmp = cpu_to_le16(val); + iface = netdev_priv(dev); return iface->local->func->set_rid(dev, rid, &tmp, 2); } int hostap_set_string(struct net_device *dev, int rid, const char *val) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface; char buf[MAX_SSID_LEN + 2]; int len; + iface = netdev_priv(dev); len = strlen(val); if (len > MAX_SSID_LEN) return -1; @@ -692,18 +694,22 @@ struct net_device_stats *hostap_get_stats(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface; + iface = netdev_priv(dev); return &iface->stats; } static int prism2_close(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; PDEBUG(DEBUG_FLOW, "%s: prism2_close\n", dev->name); + iface = netdev_priv(dev); + local = iface->local; + if (dev == local->ddev) { prism2_sta_deauth(local, WLAN_REASON_DEAUTH_LEAVING); } @@ -746,11 +752,14 @@ static int prism2_open(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; PDEBUG(DEBUG_FLOW, "%s: prism2_open\n", dev->name); + iface = netdev_priv(dev); + local = iface->local; + if (local->no_pri) { printk(KERN_DEBUG "%s: could not set interface UP - no PRI " "f/w\n", dev->name); @@ -794,11 +803,14 @@ static int prism2_set_mac_address(struct net_device *dev, void *p) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct list_head *ptr; struct sockaddr *addr = p; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->set_rid(dev, HFA384X_RID_CNFOWNMACADDR, addr->sa_data, ETH_ALEN) < 0 || local->func->reset_port(dev)) return -EINVAL; @@ -820,9 +832,11 @@ void hostap_set_multicast_list_queue(void *data) { struct net_device *dev = (struct net_device *) data; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, local->is_promisc)) { printk(KERN_INFO "%s: %sabling promiscuous mode failed\n", @@ -838,9 +852,11 @@ * some station firmware versions (FCSErr frames, invalid MACPort, etc. * corrupted incoming frames). This code is now commented out while the * problems are investigated. */ - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; if ((dev->flags & IFF_ALLMULTI) || (dev->flags & IFF_PROMISC)) { local->is_promisc = 1; } else { @@ -864,10 +880,13 @@ static void prism2_tx_timeout(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_regs regs; + iface = netdev_priv(dev); + local = iface->local; + printk(KERN_WARNING "%s Tx timed out! Resetting card\n", dev->name); netif_stop_queue(local->dev); @@ -884,8 +903,9 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local, int main_dev) { - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface; + iface = netdev_priv(dev); ether_setup(dev); /* kernel callbacks */ @@ -1039,11 +1059,13 @@ int prism2_update_comms_qual(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret = 0; struct hfa384x_comms_quality sq; + iface = netdev_priv(dev); + local = iface->local; if (!local->sta_fw_ver) ret = -1; else if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1)) { @@ -1099,7 +1121,7 @@ meta = (struct hostap_skb_tx_data *) skb->cb; memset(meta, 0, sizeof(*meta)); meta->magic = HOSTAP_SKB_TX_DATA_MAGIC; - meta->iface = dev->priv; + meta->iface = netdev_priv(dev); skb->dev = dev; skb->mac.raw = skb->nh.raw = skb->data; diff -Nru a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c --- a/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c 2004-11-13 20:56:44 -08:00 @@ -46,13 +46,15 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, struct hostap_80211_rx_status *rx_stats, int type) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int hdrlen, phdrlen, head_need, tail_need; u16 fc; int prism_header, ret; struct hostap_ieee80211_hdr *hdr; + iface = netdev_priv(dev); + local = iface->local; dev->last_rx = jiffies; if (dev->type == ARPHRD_IEEE80211_PRISM) { @@ -677,8 +679,8 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, struct hostap_80211_rx_status *rx_stats) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hostap_ieee80211_hdr *hdr; size_t hdrlen; u16 fc, type, stype, sc; @@ -696,13 +698,15 @@ void *sta = NULL; int keyidx = 0; + iface = netdev_priv(dev); + local = iface->local; iface->stats.rx_packets++; iface->stats.rx_bytes += skb->len; /* dev is the master radio device; change this to be the default * virtual interface (this may be changed to WDS device below) */ dev = local->ddev; - iface = dev->priv; + iface = netdev_priv(dev); hdr = (struct hostap_ieee80211_hdr *) skb->data; stats = hostap_get_stats(dev); diff -Nru a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c --- a/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c 2004-11-13 20:56:44 -08:00 @@ -38,8 +38,8 @@ * device configuration. */ int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int need_headroom, need_tailroom = 0; struct hostap_ieee80211_hdr hdr; u16 fc, ethertype = 0; @@ -51,6 +51,9 @@ int to_assoc_ap = 0; struct hostap_skb_tx_data *meta; + iface = netdev_priv(dev); + local = iface->local; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -237,12 +240,15 @@ /* hard_start_xmit function for hostapd wlan#ap interfaces */ int hostap_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hostap_skb_tx_data *meta; struct hostap_ieee80211_hdr *hdr; u16 fc; + iface = netdev_priv(dev); + local = iface->local; + if (skb->len < 10) { printk(KERN_DEBUG "%s: hostap_mgmt_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -280,12 +286,15 @@ struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, struct prism2_crypt_data *crypt) { - struct hostap_interface *iface = skb->dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hostap_ieee80211_hdr *hdr; u16 fc; int hdr_len, res; + iface = netdev_priv(skb->dev); + local = iface->local; + if (skb->len < IEEE80211_DATA_HDR3_LEN) { kfree_skb(skb); return NULL; @@ -342,8 +351,8 @@ * Use hardware TX function to send the frame. */ int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret = 1; u16 fc; struct hostap_tx_data tx; @@ -351,6 +360,9 @@ struct hostap_skb_tx_data *meta; int no_encrypt = 0; struct hostap_ieee80211_hdr *hdr; + + iface = netdev_priv(dev); + local = iface->local; tx.skb = skb; tx.sta_ptr = NULL; diff -Nru a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c --- a/drivers/net/wireless/hostap/hostap_ap.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.c 2004-11-13 20:56:44 -08:00 @@ -915,16 +915,18 @@ int type, int subtype, char *body, int body_len, u8 *addr, u16 tx_cb_idx) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hostap_ieee80211_hdr *hdr; u16 fc; struct sk_buff *skb; struct hostap_skb_tx_data *meta; int hdrlen; + iface = netdev_priv(dev); + local = iface->local; dev = local->dev; /* always use master radio device */ - iface = dev->priv; + iface = netdev_priv(dev); if (!(dev->flags & IFF_UP)) { PDEBUG(DEBUG_AP, "%s: prism2_send_mgmt - device is not UP - " @@ -2252,11 +2254,14 @@ void hostap_rx(struct net_device *dev, struct sk_buff *skb, struct hostap_80211_rx_status *rx_stats) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 fc; struct hostap_ieee80211_hdr *hdr; + iface = netdev_priv(dev); + local = iface->local; + if (skb->len < 16) goto drop; @@ -2359,9 +2364,9 @@ * format that the Wireless Tools will understand - Jean II */ static int prism2_ap_translate_scan(struct net_device *dev, char *buffer) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; - struct ap_data *ap = local->ap; + struct hostap_interface *iface; + local_info_t *local; + struct ap_data *ap; struct list_head *ptr; struct iw_event iwe; char *current_ev = buffer; @@ -2370,6 +2375,10 @@ char buf[64]; #endif + iface = netdev_priv(dev); + local = iface->local; + ap = local->ap; + spin_lock_bh(&ap->sta_table_lock); for (ptr = ap->sta_list.next; ptr != NULL && ptr != &ap->sta_list; @@ -2601,8 +2610,11 @@ static int ap_update_sta_tx_rate(struct sta_info *sta, struct net_device *dev) { int ret = sta->tx_rate; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; sta->tx_count[sta->tx_rate_idx]++; sta->tx_since_last_failure++; diff -Nru a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c --- a/drivers/net/wireless/hostap/hostap_cs.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_cs.c 2004-11-13 20:56:44 -08:00 @@ -51,10 +51,12 @@ static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); outb(v, dev->base_addr + a); @@ -63,11 +65,13 @@ static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u8 v; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); v = inb(dev->base_addr + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); @@ -77,10 +81,12 @@ static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); outw(v, dev->base_addr + a); @@ -89,11 +95,13 @@ static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u16 v; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); v = inw(dev->base_addr + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); @@ -104,10 +112,12 @@ static inline void hfa384x_outsw_debug(struct net_device *dev, int a, u8 *buf, int wc) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTSW, a, wc); outsw(dev->base_addr + a, buf, wc); @@ -117,10 +127,12 @@ static inline void hfa384x_insw_debug(struct net_device *dev, int a, u8 *buf, int wc) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INSW, a, wc); insw(dev->base_addr + a, buf, wc); @@ -623,7 +635,7 @@ link->state |= DEV_CONFIG; link->state &= ~DEV_CONFIG_PENDING; - iface = dev->priv; + iface = netdev_priv(dev); local = iface->local; local->link = link; strcpy(local->node.dev_name, dev->name); @@ -656,7 +668,9 @@ if (link->priv) { struct net_device *dev = link->priv; - struct hostap_interface *iface = dev->priv; + struct hostap_interface *iface; + + iface = netdev_priv(dev); if (link->state & DEV_CONFIG) prism2_hw_shutdown(dev, 0); iface->local->shutdown = 1; diff -Nru a/drivers/net/wireless/hostap/hostap_download.c b/drivers/net/wireless/hostap/hostap_download.c --- a/drivers/net/wireless/hostap/hostap_download.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_download.c 2004-11-13 20:56:44 -08:00 @@ -3,8 +3,11 @@ u16 val, reg; int i, tries; unsigned long flags; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (local->no_pri) { if (enable) { diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:44 -08:00 @@ -274,12 +274,15 @@ static inline int hfa384x_cmd_issue(struct net_device *dev, struct hostap_cmd_queue *entry) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int tries; u16 reg; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->card_present && !local->func->card_present(local)) return -ENODEV; @@ -338,13 +341,16 @@ static int hfa384x_cmd(struct net_device *dev, u16 cmd, u16 param0, u16 *param1, u16 *resp0) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int err, res, issue, issued = 0; unsigned long flags; struct hostap_cmd_queue *entry; DECLARE_WAITQUEUE(wait, current); + iface = netdev_priv(dev); + local = iface->local; + if (in_interrupt()) { printk(KERN_DEBUG "%s: hfa384x_cmd called from interrupt " "context\n", dev->name); @@ -515,12 +521,15 @@ u16 status), void *context) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int issue, ret; unsigned long flags; struct hostap_cmd_queue *entry; + iface = netdev_priv(dev); + local = iface->local; + if (local->cmd_queue_len >= HOSTAP_CMD_QUEUE_MAX_LEN + 2) { printk(KERN_DEBUG "%s: hfa384x_cmd: cmd_queue full\n", dev->name); @@ -674,10 +683,13 @@ */ static void prism2_cmd_ev(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hostap_cmd_queue *entry = NULL; + iface = netdev_priv(dev); + local = iface->local; + spin_lock(&local->cmdlock); if (!list_empty(&local->cmd_queue)) { entry = list_entry(local->cmd_queue.next, @@ -817,11 +829,14 @@ static int hfa384x_get_rid(struct net_device *dev, u16 rid, void *buf, int len, int exact_len) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int res, rlen = 0; struct hfa384x_rid_hdr rec; + iface = netdev_priv(dev); + local = iface->local; + if (local->no_pri) { printk(KERN_DEBUG "%s: cannot get RID %04x (len=%d) - no PRI " "f/w\n", dev->name, rid, len); @@ -887,11 +902,14 @@ static int hfa384x_set_rid(struct net_device *dev, u16 rid, void *buf, int len) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_rid_hdr rec; int res; + iface = netdev_priv(dev); + local = iface->local; + if (local->no_pri) { printk(KERN_DEBUG "%s: cannot set RID %04x (len=%d) - no PRI " "f/w\n", dev->name, rid, len); @@ -1009,10 +1027,13 @@ static int prism2_reset_port(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int res; + iface = netdev_priv(dev); + local = iface->local; + if (!local->dev_enabled) return 0; @@ -1048,8 +1069,11 @@ const char *txt) { struct hfa384x_comp_ident comp; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (local->no_pri) { /* PRI f/w not yet available - cannot read RIDs */ @@ -1069,11 +1093,14 @@ static int prism2_setup_rids(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 tmp; int ret = 0; + iface = netdev_priv(dev); + local = iface->local; + hostap_set_word(dev, HFA384X_RID_TICKTIME, 2000); if (!local->fw_ap) { @@ -1288,13 +1315,16 @@ static int prism2_hw_init(struct net_device *dev, int initial) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret, first = 1; unsigned long start, delay; PDEBUG(DEBUG_FLOW, "prism2_hw_init()\n"); + iface = netdev_priv(dev); + local = iface->local; + clear_bit(HOSTAP_BITS_TRANSMIT, &local->bits); init: @@ -1341,10 +1371,13 @@ static int prism2_hw_init2(struct net_device *dev, int initial) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int i; + iface = netdev_priv(dev); + local = iface->local; + #ifdef PRISM2_DOWNLOAD_SUPPORT kfree(local->pda); if (local->no_pri) @@ -1436,9 +1469,13 @@ static int prism2_hw_enable(struct net_device *dev, int initial) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; - int was_resetting = local->hw_resetting; + struct hostap_interface *iface; + local_info_t *local; + int was_resetting; + + iface = netdev_priv(dev); + local = iface->local; + was_resetting = local->hw_resetting; if (hfa384x_cmd(dev, HFA384X_CMDCODE_ENABLE, 0, NULL, NULL)) { printk("%s: MAC port 0 enabling failed\n", dev->name); @@ -1471,8 +1508,12 @@ static int prism2_hw_config(struct net_device *dev, int initial) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; + if (local->hw_downloading) return 1; @@ -1499,8 +1540,11 @@ static void prism2_hw_shutdown(struct net_device *dev, int no_disable) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; /* Allow only command completion events during disable */ hfa384x_events_only_cmd(dev); @@ -1531,8 +1575,8 @@ static void prism2_hw_reset(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; #if 0 static long last_reset = 0; @@ -1544,6 +1588,9 @@ last_reset = jiffies; #endif + iface = netdev_priv(dev); + local = iface->local; + if (in_interrupt()) { printk(KERN_DEBUG "%s: driver bug - prism2_hw_reset() called " "in interrupt context\n", dev->name); @@ -1666,10 +1713,13 @@ static void prism2_transmit_cb(struct net_device *dev, void *context, u16 resp0, u16 res) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int idx = (int) context; + iface = netdev_priv(dev); + local = iface->local; + if (res) { printk(KERN_DEBUG "%s: prism2_transmit_cb - res=0x%02x\n", dev->name, res); @@ -1730,10 +1780,13 @@ * this can be called both from software and hardware IRQ) */ static int prism2_transmit(struct net_device *dev, int idx) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int res; + iface = netdev_priv(dev); + local = iface->local; + /* The driver tries to stop netif queue so that there would not be * more than one attempt to transmit frames going on; check that this * is really the case */ @@ -1778,11 +1831,14 @@ static void prism2_tx_cb(struct net_device *dev, void *context, u16 resp0, u16 res) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long addr; int buf_len = (int) context; + iface = netdev_priv(dev); + local = iface->local; + if (res) { printk(KERN_DEBUG "%s: prism2_tx_cb - res=0x%02x\n", dev->name, res); @@ -1803,14 +1859,17 @@ /* Called only from software IRQ */ static int prism2_tx_80211(struct sk_buff *skb, struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_tx_frame txdesc; struct hostap_ieee80211_hdr *hdr; struct hostap_skb_tx_data *meta; int hdr_len, data_len, idx, res, ret = -1; u16 tx_control, fc; + iface = netdev_priv(dev); + local = iface->local; + meta = (struct hostap_skb_tx_data *) skb->cb; hdr = (struct hostap_ieee80211_hdr *) skb->data; @@ -2179,11 +2238,14 @@ /* Called only from hardware IRQ */ static void prism2_alloc_ev(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int idx; u16 fid; + iface = netdev_priv(dev); + local = iface->local; + fid = prism2_read_fid_reg(dev, HFA384X_ALLOCFID_OFF); PDEBUG(DEBUG_FID, "FID: interrupt: ALLOC - fid=0x%04x\n", fid); @@ -2595,8 +2657,12 @@ /* Called only from hardware IRQ */ static void prism2_bus_master_ev(struct net_device *dev, int bap) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; + if (bap == BAP1) { /* FIX: frame payload was DMA'd to skb->data; might need to * invalidate data cache for that memory area */ @@ -2640,11 +2706,14 @@ /* Called only from hardware IRQ */ static void prism2_ev_tick(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 evstat, inten; static int prev_stuck = 0; + iface = netdev_priv(dev); + local = iface->local; + if (time_after(jiffies, local->last_tick_timer + 5 * HZ) && local->last_tick_timer) { evstat = HFA384X_INW(HFA384X_EVSTAT_OFF); @@ -2710,11 +2779,14 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int events = 0; u16 ev; + iface = netdev_priv(dev); + local = iface->local; + prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); if (local->func->card_present && !local->func->card_present(local)) { @@ -3104,8 +3176,11 @@ { struct list_head *ptr; struct set_tim_data *new_entry; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; new_entry = (struct set_tim_data *) kmalloc(sizeof(*new_entry), GFP_ATOMIC); @@ -3216,7 +3291,7 @@ if (dev == NULL) return NULL; - iface = dev->priv; + iface = netdev_priv(dev); local = (struct local_info *) ((((long) (iface + 1)) + 3) & ~3); local->ap = (struct ap_data *) ((((long) (local + 1)) + 3) & ~3); local->dev = iface->dev = dev; @@ -3392,9 +3467,11 @@ static int hostap_hw_ready(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - struct local_info *local = iface->local; + struct hostap_interface *iface; + struct local_info *local; + iface = netdev_priv(dev); + local = iface->local; local->ddev = hostap_add_interface(local, HOSTAP_INTERFACE_MAIN, 0, "", dev_template); @@ -3424,7 +3501,7 @@ if (dev == NULL) return; - iface = dev->priv; + iface = netdev_priv(dev); local = iface->local; flush_scheduled_work(); diff -Nru a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c --- a/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ioctl.c 2004-11-13 20:56:44 -08:00 @@ -9,10 +9,13 @@ static struct iw_statistics *hostap_get_wireless_stats(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct iw_statistics *wstats; + iface = netdev_priv(dev); + local = iface->local; + /* Why are we doing that ? Jean II */ if (iface->type != HOSTAP_INTERFACE_MAIN) return NULL; @@ -65,12 +68,15 @@ static int prism2_get_datarates(struct net_device *dev, u8 *rates) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u8 buf[12]; int len; u16 val; + iface = netdev_priv(dev); + local = iface->local; + len = local->func->get_rid(dev, HFA384X_RID_SUPPORTEDDATARATES, buf, sizeof(buf), 0); if (len < 2) @@ -138,11 +144,14 @@ struct iw_request_info *info, struct iw_point *erq, char *keybuf) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int i; struct prism2_crypt_data **crypt; + iface = netdev_priv(dev); + local = iface->local; + i = erq->flags & IW_ENCODE_INDEX; if (i < 1 || i > 4) i = local->tx_keyidx; @@ -238,12 +247,15 @@ struct iw_request_info *info, struct iw_point *erq, char *key) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int i, len; u16 val; struct prism2_crypt_data *crypt; + iface = netdev_priv(dev); + local = iface->local; + i = erq->flags & IW_ENCODE_INDEX; if (i < 1 || i > 4) i = local->tx_keyidx; @@ -295,10 +307,13 @@ static int hostap_set_rate(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret, basic_rates; + iface = netdev_priv(dev); + local = iface->local; + basic_rates = local->basic_rates & local->tx_rate_control; if (!basic_rates || basic_rates != local->basic_rates) { printk(KERN_INFO "%s: updating basic rate set automatically " @@ -338,8 +353,11 @@ struct iw_request_info *info, struct iw_param *rrq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (rrq->fixed) { switch (rrq->value) { @@ -396,10 +414,13 @@ struct iw_param *rrq, char *extra) { u16 val; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret = 0; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_TXRATECONTROL, &val, 2, 1) < 0) return -EINVAL; @@ -451,8 +472,11 @@ struct iw_request_info *info, struct iw_param *sens, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; /* Set the desired AP density */ if (sens->value < 1 || sens->value > 3) @@ -469,10 +493,13 @@ struct iw_request_info *info, struct iw_param *sens, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + /* Get the current AP density */ if (local->func->get_rid(dev, HFA384X_RID_CNFSYSTEMSCALE, &val, 2, 1) < 0) @@ -490,11 +517,14 @@ struct iw_request_info *info, struct iw_point *data, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct sockaddr addr[IW_MAX_AP]; struct iw_quality qual[IW_MAX_AP]; + iface = netdev_priv(dev); + local = iface->local; + if (local->iw_mode != IW_MODE_MASTER) { printk(KERN_DEBUG "SIOCGIWAPLIST is currently only supported " "in Host AP mode\n"); @@ -517,10 +547,13 @@ struct iw_request_info *info, struct iw_param *rts, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (rts->disabled) val = __constant_cpu_to_le16(2347); else if (rts->value < 0 || rts->value > 2347) @@ -541,10 +574,13 @@ struct iw_request_info *info, struct iw_param *rts, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_RTSTHRESHOLD, &val, 2, 1) < 0) return -EINVAL; @@ -561,10 +597,13 @@ struct iw_request_info *info, struct iw_param *rts, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (rts->disabled) val = __constant_cpu_to_le16(2346); else if (rts->value < 256 || rts->value > 2346) @@ -585,10 +624,13 @@ struct iw_request_info *info, struct iw_param *rts, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_FRAGMENTATIONTHRESHOLD, &val, 2, 1) < 0) return -EINVAL; @@ -604,13 +646,16 @@ #ifndef PRISM2_NO_STATION_MODES static int hostap_join_ap(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_join_request req; unsigned long flags; int i; struct hfa384x_scan_result *entry; + iface = netdev_priv(dev); + local = iface->local; + memcpy(req.bssid, local->preferred_ap, ETH_ALEN); req.channel = 0; @@ -649,8 +694,11 @@ #ifdef PRISM2_NO_STATION_MODES return -EOPNOTSUPP; #else /* PRISM2_NO_STATION_MODES */ - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; memcpy(local->preferred_ap, &ap_addr->sa_data, ETH_ALEN); @@ -683,8 +731,11 @@ struct iw_request_info *info, struct sockaddr *ap_addr, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; ap_addr->sa_family = ARPHRD_ETHER; switch (iface->type) { @@ -716,8 +767,11 @@ struct iw_request_info *info, struct iw_point *data, char *nickname) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; memset(local->name, 0, sizeof(local->name)); memcpy(local->name, nickname, data->length); @@ -734,12 +788,15 @@ struct iw_request_info *info, struct iw_point *data, char *nickname) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int len; char name[MAX_NAME_LEN + 3]; u16 val; + iface = netdev_priv(dev); + local = iface->local; + len = local->func->get_rid(dev, HFA384X_RID_CNFOWNNAME, &name, MAX_NAME_LEN + 2, 0); val = __le16_to_cpu(*(u16 *) name); @@ -758,8 +815,11 @@ struct iw_request_info *info, struct iw_freq *freq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; /* freq => chan. */ if (freq->e == 1 && @@ -792,10 +852,13 @@ struct iw_request_info *info, struct iw_freq *freq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_CURRENTCHANNEL, &val, 2, 1) < 0) return -EINVAL; @@ -834,8 +897,11 @@ struct iw_request_info *info, struct iw_point *data, char *ssid) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (iface->type == HOSTAP_INTERFACE_WDS) return -EOPNOTSUPP; @@ -867,10 +933,13 @@ struct iw_request_info *info, struct iw_point *data, char *essid) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 val; + iface = netdev_priv(dev); + local = iface->local; + if (iface->type == HOSTAP_INTERFACE_WDS) return -EOPNOTSUPP; @@ -900,13 +969,16 @@ struct iw_request_info *info, struct iw_point *data, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct iw_range *range = (struct iw_range *) extra; u8 rates[10]; u16 val; int i, len, over2; + iface = netdev_priv(dev); + local = iface->local; + data->length = sizeof(struct iw_range); memset(range, 0, sizeof(struct iw_range)); @@ -1066,10 +1138,13 @@ struct iw_request_info *info, __u32 *mode, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int double_reset = 0; + iface = netdev_priv(dev); + local = iface->local; + if (*mode != IW_MODE_ADHOC && *mode != IW_MODE_INFRA && *mode != IW_MODE_MASTER && *mode != IW_MODE_REPEAT && *mode != IW_MODE_MONITOR) @@ -1138,8 +1213,11 @@ struct iw_request_info *info, __u32 *mode, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; switch (iface->type) { case HOSTAP_INTERFACE_STA: @@ -1222,10 +1300,13 @@ #ifdef PRISM2_NO_STATION_MODES return -EOPNOTSUPP; #else /* PRISM2_NO_STATION_MODES */ - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 enable, mcast; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_CNFPMENABLED, &enable, 2, 1) < 0) return -EINVAL; @@ -1274,8 +1355,11 @@ struct iw_request_info *info, struct iw_param *rrq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (rrq->disabled) return -EINVAL; @@ -1332,10 +1416,13 @@ struct iw_request_info *info, struct iw_param *rrq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 shortretry, longretry, lifetime, altretry; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->get_rid(dev, HFA384X_RID_SHORTRETRYLIMIT, &shortretry, 2, 1) < 0 || local->func->get_rid(dev, HFA384X_RID_LONGRETRYLIMIT, &longretry, @@ -1427,14 +1514,17 @@ struct iw_request_info *info, struct iw_param *rrq, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; #ifdef RAW_TXPOWER_SETTING char *tmp; #endif u16 val; int ret = 0; + iface = netdev_priv(dev); + local = iface->local; + if (rrq->disabled) { if (local->txpower_type != PRISM2_TXPOWER_OFF) { val = 0xff; /* use all standby and sleep modes */ @@ -1506,10 +1596,13 @@ struct iw_param *rrq, char *extra) { #ifdef RAW_TXPOWER_SETTING - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 resp0; + iface = netdev_priv(dev); + local = iface->local; + rrq->flags = IW_TXPOW_DBM; rrq->disabled = 0; rrq->fixed = 0; @@ -1548,10 +1641,13 @@ static int prism2_request_hostscan(struct net_device *dev, u8 *ssid, u8 ssid_len) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_hostscan_request scan_req; + iface = netdev_priv(dev); + local = iface->local; + memset(&scan_req, 0, sizeof(scan_req)); scan_req.channel_list = __constant_cpu_to_le16(local->channel_mask); scan_req.txrate = __constant_cpu_to_le16(HFA384X_RATES_1MBPS); @@ -1573,11 +1669,14 @@ static int prism2_request_scan(struct net_device *dev) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; struct hfa384x_scan_request scan_req; int ret = 0; + iface = netdev_priv(dev); + local = iface->local; + memset(&scan_req, 0, sizeof(scan_req)); scan_req.channel_list = __constant_cpu_to_le16(local->channel_mask); scan_req.txrate = __constant_cpu_to_le16(HFA384X_RATES_1MBPS); @@ -1629,10 +1728,13 @@ struct iw_request_info *info, struct iw_point *data, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret; + iface = netdev_priv(dev); + local = iface->local; + if (local->iw_mode == IW_MODE_MASTER) { /* In master mode, we just return the results of our local * tables, so we don't need to start anything... @@ -1896,10 +1998,13 @@ #ifdef PRISM2_NO_STATION_MODES return -EOPNOTSUPP; #else /* PRISM2_NO_STATION_MODES */ - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int res; + iface = netdev_priv(dev); + local = iface->local; + /* Wait until the scan is finished. We can probably do better * than that - Jean II */ if (local->scan_timestamp && @@ -1933,10 +2038,13 @@ struct iw_request_info *info, struct iw_point *data, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int res; + iface = netdev_priv(dev); + local = iface->local; + if (local->iw_mode == IW_MODE_MASTER) { /* In MASTER mode, it doesn't make sense to go around * scanning the frequencies and make the stations we serve @@ -2163,8 +2271,11 @@ static int prism2_ioctl_priv_inquire(struct net_device *dev, int *i) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; if (local->func->cmd(dev, HFA384X_CMDCODE_INQUIRE, *i, NULL, NULL)) return -EOPNOTSUPP; @@ -2177,14 +2288,17 @@ struct iw_request_info *info, void *wrqu, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int *i = (int *) extra; int param = *i; int value = *(i + 1); int ret = 0; u16 val; + iface = netdev_priv(dev); + local = iface->local; + switch (param) { case PRISM2_PARAM_TXRATECTRL: local->fw_tx_rate_control = value; @@ -2528,11 +2642,14 @@ struct iw_request_info *info, void *wrqu, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int *param = (int *) extra; int ret = 0; + iface = netdev_priv(dev); + local = iface->local; + switch (*param) { case PRISM2_PARAM_TXRATECTRL: *param = local->fw_tx_rate_control; @@ -2716,10 +2833,13 @@ struct iw_request_info *info, void *wrqu, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 resp0; + iface = netdev_priv(dev); + local = iface->local; + if (local->func->cmd(dev, HFA384X_CMDCODE_READMIF, *extra, NULL, &resp0)) return -EOPNOTSUPP; @@ -2734,10 +2854,13 @@ struct iw_request_info *info, void *wrqu, char *extra) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; u16 cr, val; + iface = netdev_priv(dev); + local = iface->local; + cr = *extra; val = *(extra + 1); if (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF, cr, &val, NULL)) @@ -2749,11 +2872,14 @@ static int prism2_ioctl_priv_monitor(struct net_device *dev, int *i) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret = 0; u32 mode; + iface = netdev_priv(dev); + local = iface->local; + printk(KERN_DEBUG "%s: process %d (%s) used deprecated iwpriv monitor " "- update software to use iwconfig mode monitor\n", dev->name, current->pid, current->comm); @@ -2792,8 +2918,11 @@ static int prism2_ioctl_priv_reset(struct net_device *dev, int *i) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + + iface = netdev_priv(dev); + local = iface->local; printk(KERN_DEBUG "%s: manual reset request(%d)\n", dev->name, *i); switch (*i) { @@ -3401,9 +3530,12 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct iwreq *wrq = (struct iwreq *) ifr; - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; int ret = 0; + + iface = netdev_priv(dev); + local = iface->local; switch (cmd) { /* Private ioctls (iwpriv) that have not yet been converted diff -Nru a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c --- a/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_pci.c 2004-11-13 20:56:44 -08:00 @@ -50,10 +50,13 @@ static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); writeb(v, local->mem_start + a); @@ -62,11 +65,14 @@ static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u8 v; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); v = readb(local->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); @@ -76,10 +82,13 @@ static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); writew(v, local->mem_start + a); @@ -88,11 +97,14 @@ static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u16 v; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); v = readw(local->mem_start + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); @@ -111,29 +123,37 @@ static inline void hfa384x_outb(struct net_device *dev, int a, u8 v) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; writeb(v, local->mem_start + a); } static inline u8 hfa384x_inb(struct net_device *dev, int a) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; return readb(local->mem_start + a); } static inline void hfa384x_outw(struct net_device *dev, int a, u16 v) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; writew(v, local->mem_start + a); } static inline u16 hfa384x_inw(struct net_device *dev, int a) { - struct hostap_interface *iface = netdev_priv(dev); - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; + iface = netdev_priv(dev); + local = iface->local; return readw(local->mem_start + a); } @@ -290,7 +310,7 @@ dev = prism2_init_local_data(&prism2_pci_funcs, cards_found); if (dev == NULL) goto fail; - iface = dev->priv; + iface = netdev_priv(dev); local = iface->local; cards_found++; @@ -338,9 +358,12 @@ static void prism2_pci_remove(struct pci_dev *pdev) { - struct net_device *dev = pci_get_drvdata(pdev); - struct hostap_interface *iface = netdev_priv(dev); + struct net_device *dev; + struct hostap_interface *iface; void __iomem *mem_start; + + dev = pci_get_drvdata(pdev); + iface = netdev_priv(dev); /* Reset the hardware, and ensure interrupts are disabled. */ prism2_pci_cor_sreset(iface->local); diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:44 -08:00 @@ -100,10 +100,13 @@ static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); outb(v, dev->base_addr + a); @@ -112,11 +115,14 @@ static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u8 v; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); v = inb(dev->base_addr + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v); @@ -126,10 +132,13 @@ static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); outw(v, dev->base_addr + a); @@ -138,11 +147,14 @@ static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; u16 v; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); v = inw(dev->base_addr + a); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v); @@ -153,10 +165,13 @@ static inline void hfa384x_outsw_debug(struct net_device *dev, int a, u8 *buf, int wc) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTSW, a, wc); outsw(dev->base_addr + a, buf, wc); @@ -166,10 +181,13 @@ static inline void hfa384x_insw_debug(struct net_device *dev, int a, u8 *buf, int wc) { - struct hostap_interface *iface = dev->priv; - local_info_t *local = iface->local; + struct hostap_interface *iface; + local_info_t *local; unsigned long flags; + iface = netdev_priv(dev); + local = iface->local; + spin_lock_irqsave(&local->lock, flags); prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INSW, a, wc); insw(dev->base_addr + a, buf, wc); @@ -498,7 +516,7 @@ dev = prism2_init_local_data(&prism2_plx_funcs, cards_found); if (dev == NULL) goto fail; - iface = dev->priv; + iface = netdev_priv(dev); local = iface->local; cards_found++; @@ -541,8 +559,11 @@ static void prism2_plx_remove(struct pci_dev *pdev) { - struct net_device *dev = pci_get_drvdata(pdev); - struct hostap_interface *iface = dev->priv; + struct net_device *dev; + struct hostap_interface *iface; + + dev = pci_get_drvdata(pdev); + iface = netdev_priv(dev); /* Reset the hardware, and ensure interrupts are disabled. */ prism2_plx_cor_sreset(iface->local); diff -Nru a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h --- a/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:44 -08:00 +++ b/drivers/net/wireless/hostap/hostap_wlan.h 2004-11-13 20:56:44 -08:00 @@ -635,7 +635,8 @@ /* Per radio private Host AP data - shared by all net devices interfaces used * by each radio (wlan#, wlan#ap, wlan#sta, WDS). - * ((struct hostap_interface *) dev->priv)->local points to this structure. */ + * ((struct hostap_interface *) netdev_priv(dev))->local points to this + * structure. */ struct local_info { struct module *hw_module; int card_idx; @@ -918,7 +919,7 @@ /* Per interface private Host AP data * Allocated for each net device that Host AP uses (wlan#, wlan#ap, wlan#sta, - * WDS) and dev->priv points to this structure. */ + * WDS) and netdev_priv(dev) points to this structure. */ struct hostap_interface { struct list_head list; /* list entry in Host AP interface list */ struct net_device *dev; /* pointer to this device */ -- Jouni Malinen PGP id EFC895FA From jm@jm.kir.nu Sat Nov 13 21:28:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 21:29:04 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE5SwDG001198 for ; Sat, 13 Nov 2004 21:28:58 -0800 Received: from jm by jm.kir.nu with local (Exim 4.42) id 1CTCtT-0003uJ-Rd; Sat, 13 Nov 2004 21:25:43 -0800 Date: Sat, 13 Nov 2004 21:25:43 -0800 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH wireless-2.6 16/16] Host AP: Replaced MODULE_PARM with module_param* Message-ID: <20041114052543.GH14810@jm.kir.nu> References: <20041108070156.GA1076@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041108070156.GA1076@jm.kir.nu> User-Agent: Mutt/1.5.6i X-archive-position: 11791 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 5545 Lines: 144 Signed-off-by: Jouni Malinen diff -Nru a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c --- a/drivers/net/wireless/hostap/hostap_ap.c 2004-11-13 20:56:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_ap.c 2004-11-13 20:56:53 -08:00 @@ -18,22 +18,22 @@ static int other_ap_policy[MAX_PARM_DEVICES] = { AP_OTHER_AP_SKIP_ALL, DEF_INTS }; -MODULE_PARM(other_ap_policy, PARM_MIN_MAX "i"); +module_param_array(other_ap_policy, int, NULL, 0444); MODULE_PARM_DESC(other_ap_policy, "Other AP beacon monitoring policy (0-3)"); static int ap_max_inactivity[MAX_PARM_DEVICES] = { AP_MAX_INACTIVITY_SEC, DEF_INTS }; -MODULE_PARM(ap_max_inactivity, PARM_MIN_MAX "i"); +module_param_array(ap_max_inactivity, int, NULL, 0444); MODULE_PARM_DESC(ap_max_inactivity, "AP timeout (in seconds) for station " "inactivity"); static int ap_bridge_packets[MAX_PARM_DEVICES] = { 1, DEF_INTS }; -MODULE_PARM(ap_bridge_packets, PARM_MIN_MAX "i"); +module_param_array(ap_bridge_packets, int, NULL, 0444); MODULE_PARM_DESC(ap_bridge_packets, "Bridge packets directly between " "stations"); static int autom_ap_wds[MAX_PARM_DEVICES] = { 0, DEF_INTS }; -MODULE_PARM(autom_ap_wds, PARM_MIN_MAX "i"); +module_param_array(autom_ap_wds, int, NULL, 0444); MODULE_PARM_DESC(autom_ap_wds, "Add WDS connections to other APs " "automatically"); diff -Nru a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c --- a/drivers/net/wireless/hostap/hostap_cs.c 2004-11-13 20:56:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_cs.c 2004-11-13 20:56:53 -08:00 @@ -36,14 +36,14 @@ MODULE_LICENSE("GPL"); -static unsigned int irq_mask = 0xdeb8; -MODULE_PARM(irq_mask, "i"); +static int irq_mask = 0xdeb8; +module_param(irq_mask, int, 0444); static int irq_list[4] = { -1 }; -MODULE_PARM(irq_list, "1-4i"); +module_param_array(irq_list, int, NULL, 0444); -static int ignore_cis_vcc = 0; -MODULE_PARM(ignore_cis_vcc, "i"); +static int ignore_cis_vcc; +module_param(ignore_cis_vcc, int, 0444); MODULE_PARM_DESC(ignore_cis_vcc, "Ignore broken CIS VCC entry"); diff -Nru a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c --- a/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_hw.c 2004-11-13 20:56:53 -08:00 @@ -59,43 +59,43 @@ /* #define final_version */ static int mtu = 1500; -MODULE_PARM(mtu, "i"); +module_param(mtu, int, 0444); MODULE_PARM_DESC(mtu, "Maximum transfer unit"); static int channel[MAX_PARM_DEVICES] = { 3, DEF_INTS }; -MODULE_PARM(channel, PARM_MIN_MAX "i"); +module_param_array(channel, int, NULL, 0444); MODULE_PARM_DESC(channel, "Initial channel"); -static char *essid[MAX_PARM_DEVICES] = { "test" }; -MODULE_PARM(essid, PARM_MIN_MAX "s"); +static char essid[33] = "test"; +module_param_string(essid, essid, sizeof(essid), 0444); MODULE_PARM_DESC(essid, "Host AP's ESSID"); static int iw_mode[MAX_PARM_DEVICES] = { IW_MODE_MASTER, DEF_INTS }; -MODULE_PARM(iw_mode, PARM_MIN_MAX "i"); +module_param_array(iw_mode, int, NULL, 0444); MODULE_PARM_DESC(iw_mode, "Initial operation mode"); static int beacon_int[MAX_PARM_DEVICES] = { 100, DEF_INTS }; -MODULE_PARM(beacon_int, PARM_MIN_MAX "i"); +module_param_array(beacon_int, int, NULL, 0444); MODULE_PARM_DESC(beacon_int, "Beacon interval (1 = 1024 usec)"); static int dtim_period[MAX_PARM_DEVICES] = { 1, DEF_INTS }; -MODULE_PARM(dtim_period, PARM_MIN_MAX "i"); +module_param_array(dtim_period, int, NULL, 0444); MODULE_PARM_DESC(dtim_period, "DTIM period"); #if defined(PRISM2_PCI) && defined(PRISM2_BUS_MASTER) static int bus_master_threshold_rx[MAX_PARM_DEVICES] = { 100, DEF_INTS }; -MODULE_PARM(bus_master_threshold_rx, "i"); +module_param_array(bus_master_threshold_rx, int, NULL, 0444); MODULE_PARM_DESC(bus_master_threshold_rx, "Packet length threshold for using " "PCI bus master on RX"); static int bus_master_threshold_tx[MAX_PARM_DEVICES] = { 100, DEF_INTS }; -MODULE_PARM(bus_master_threshold_tx, "i"); +module_param_array(bus_master_threshold_tx, int, NULL, 0444); MODULE_PARM_DESC(bus_master_threshold_tx, "Packet length threshold for using " "PCI bus master on TX"); #endif /* PRISM2_PCI and PRISM2_BUS_MASTER */ -static char *dev_template = "wlan%d"; -MODULE_PARM(dev_template, "s"); +static char dev_template[16] = "wlan%d"; +module_param_string(dev_template, dev_template, sizeof(dev_template), 0444); MODULE_PARM_DESC(dev_template, "Prefix for network device name (default: " "wlan%d)"); @@ -3346,9 +3346,8 @@ card_idx = 0; local->card_idx = card_idx; - i = essid[card_idx] == NULL ? 0 : card_idx; - len = strlen(essid[i]); - memcpy(local->essid, essid[i], + len = strlen(essid); + memcpy(local->essid, essid, len > MAX_SSID_LEN ? MAX_SSID_LEN : len); local->essid[MAX_SSID_LEN] = '\0'; i = GET_INT_PARM(iw_mode, card_idx); diff -Nru a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c --- a/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:53 -08:00 +++ b/drivers/net/wireless/hostap/hostap_plx.c 2004-11-13 20:56:53 -08:00 @@ -35,8 +35,8 @@ MODULE_LICENSE("GPL"); -static int ignore_cis = 0; -MODULE_PARM(ignore_cis, "i"); +static int ignore_cis; +module_param(ignore_cis, int, 0444); MODULE_PARM_DESC(ignore_cis, "Do not verify manfid information in CIS"); -- Jouni Malinen PGP id EFC895FA From acme@conectiva.com.br Sat Nov 13 22:40:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 22:40:47 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE6ef6c003119 for ; Sat, 13 Nov 2004 22:40:42 -0800 Received: from [200.138.51.84] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTE4n-0003OG-00; Sun, 14 Nov 2004 04:41:29 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 4C1371463E; Sun, 14 Nov 2004 04:40:19 -0200 (BRST) Message-ID: <4196FDD8.7000302@conectiva.com.br> Date: Sun, 14 Nov 2004 04:40:24 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" Cc: Christoph Hellwig , netdev@oss.sgi.com Subject: Re: [PATCH] remove net_init.c ifdef clutter References: <20041101130144.GA8727@lst.de> <20041110165641.GA29705@lst.de> <20041111145058.0fc24412.davem@davemloft.net> In-Reply-To: <20041111145058.0fc24412.davem@davemloft.net> Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11792 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 465 Lines: 21 David S. Miller wrote: > On Wed, 10 Nov 2004 17:56:42 +0100 > Christoph Hellwig wrote: > > >>On Mon, Nov 01, 2004 at 02:01:44PM +0100, Christoph Hellwig wrote: >> >>>Move the devicetype-specific functions from net_init.c to the >>>devicetype-specific files under net/. >> >>ping? still applies fine against current BK. > > > Applied, thanks Christoph. Dave, you missed the new file net/appletalk/dev.c, i.e. it is not in Linus tree. - Arnaldo From davem@davemloft.net Sat Nov 13 23:28:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 23:28:09 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE7S2fd004625 for ; Sat, 13 Nov 2004 23:28:02 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTEZy-0006Vt-00; Sat, 13 Nov 2004 23:13:42 -0800 Date: Sat, 13 Nov 2004 23:13:42 -0800 From: "David S. Miller" To: Arnaldo Carvalho de Melo Cc: hch@lst.de, netdev@oss.sgi.com Subject: Re: [PATCH] remove net_init.c ifdef clutter Message-Id: <20041113231342.71fb73d3.davem@davemloft.net> In-Reply-To: <4196FDD8.7000302@conectiva.com.br> References: <20041101130144.GA8727@lst.de> <20041110165641.GA29705@lst.de> <20041111145058.0fc24412.davem@davemloft.net> <4196FDD8.7000302@conectiva.com.br> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11793 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 332 Lines: 12 On Sun, 14 Nov 2004 04:40:24 -0200 Arnaldo Carvalho de Melo wrote: > Dave, you missed the new file net/appletalk/dev.c, i.e. it is not > in Linus tree. Yeah I just noticed that, crap. It's one thing a build verify doesn't catch, a forgotten "bk new" like this. Sorry, will send the fix to Linus shortly. From davem@davemloft.net Sat Nov 13 23:35:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 23:35:33 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE7ZSoE005047 for ; Sat, 13 Nov 2004 23:35:28 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTEeA-0006WI-00; Sat, 13 Nov 2004 23:18:02 -0800 Date: Sat, 13 Nov 2004 23:18:02 -0800 From: "David S. Miller" To: Adrian Bunk Cc: robert.olsson@its.uu.se, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [patch] net/core/pktgen.c shouldn't include pci.h Message-Id: <20041113231802.0704083e.davem@davemloft.net> In-Reply-To: <20041113145351.GZ2249@stusta.de> References: <20041113145351.GZ2249@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11794 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 423 Lines: 13 On Sat, 13 Nov 2004 15:53:51 +0100 Adrian Bunk wrote: > If rebuilding after touching pci.h in 2.6, net/core/pktgen.c is the only > file under net/ that gets rebuilt. > > I searched and didn't find any reason why net/core/pktgen.c needs to > include pci.h . > > I'm therefore suggesting the patch below (applies against both 2.4 > and 2.6). Yeah, that's pretty weird. Patch applied, thanks Adrian :) From tzachar@cs.bgu.ac.il Sat Nov 13 23:42:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 23:42:40 -0800 (PST) Received: from indigo.cs.bgu.ac.il (indigo.cs.bgu.ac.il [132.72.42.23]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE7gZQc005446 for ; Sat, 13 Nov 2004 23:42:36 -0800 Received: from nexus.cs.bgu.ac.il (nexus [132.72.40.40]) by indigo.cs.bgu.ac.il (8.13.1/8.13.1) with ESMTP id iAE7fNti018023; Sun, 14 Nov 2004 09:41:25 +0200 (IST) Date: Sun, 14 Nov 2004 09:41:23 +0200 (IST) From: Nir Tzachar To: cranium2003 cc: netdev@oss.sgi.com, "" Subject: Re: network protocol query In-Reply-To: <20041114030157.88091.qmail@web41406.mail.yahoo.com> Message-ID: References: <20041114030157.88091.qmail@web41406.mail.yahoo.com> X-GPG-PUBLIC_KEY: http://www.cs.bgu.ac.il/~tzachar/pubkey MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: ClamAV 0.80/566/Sun Oct 31 21:06:02 2004 clamav-milter version 0.80j on ha-rs2 X-Virus-Status: Clean X-Scanned-By: milter-spamc/0.19.268 (lvs-rs3 [132.72.41.62]); Sun, 14 Nov 2004 09:41:26 +0200 X-archive-position: 11795 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tzachar@cs.bgu.ac.il Precedence: bulk X-list: netdev Content-Length: 401 Lines: 14 > hello, > kernel. Is there any function in kernel that help me > to add new protocol?can it be working with existing try looking at existing protocols, and how the register themselves. you basically need to inet_add_protocol to add your protocol, after you built the proper struct net_protocol. hope this helped. -- ======================================================================== nir. From davem@davemloft.net Sat Nov 13 23:42:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 23:42:59 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE7gtmW005506 for ; Sat, 13 Nov 2004 23:42:55 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTEl8-0006Xq-00; Sat, 13 Nov 2004 23:25:14 -0800 Date: Sat, 13 Nov 2004 23:25:14 -0800 From: "David S. Miller" To: Adrian Bunk Cc: marcelo.tosatti@cyclades.com, laforge@gnumonks.org, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, patrick@tykepenguin.com, linux-decnet-user@lists.sourceforge.net Subject: Re: [patch] 2.4.28-rc3: neigh_for_each must be EXPORT_SYMBOL'ed Message-Id: <20041113232514.61bf760e.davem@davemloft.net> In-Reply-To: <20041113200735.GD2249@stusta.de> References: <20041112180052.GE23215@logos.cnet> <20041113200735.GD2249@stusta.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11796 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev Content-Length: 202 Lines: 9 On Sat, 13 Nov 2004 21:07:35 +0100 Adrian Bunk wrote: > neigh_for_each must be EXPORT_SYMBOL'ed (as it is in 2.6): Good catch Adrian, I'll apply this and push it to Marcelo. Thanks. From sam@errno.com Sat Nov 13 23:43:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 13 Nov 2004 23:43:28 -0800 (PST) Received: from ebb.errno.com (ebb.errno.com [66.127.85.87]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE7hMGi005833 for ; Sat, 13 Nov 2004 23:43:23 -0800 Received: from [66.127.85.93] ([66.127.85.93]) (authenticated bits=0) by ebb.errno.com (8.12.9/8.12.6) with ESMTP id iAE7h4Wi095114 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 13 Nov 2004 23:43:04 -0800 (PST) (envelope-from sam@errno.com) Message-ID: <41970C8F.6020909@errno.com> Date: Sat, 13 Nov 2004 23:43:11 -0800 From: Sam Leffler Organization: Errno Consulting User-Agent: Mozilla Thunderbird 0.9 (Macintosh/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: [Fwd: how do I request an ARPHRD_ constant?] Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11797 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sam@errno.com Precedence: bulk X-list: netdev Content-Length: 545 Lines: 19 Sorry if this is in some faq... -------- Original Message -------- Subject: how do I request an ARPHRD_ constant? Date: Mon, 1 Nov 2004 16:41:12 -0700 From: Sam Leffler Organization: Errno Consulting To: Jeff Garzik Can you tell me how to get an ARPHRD_ constant allocated? This would be for an 802.11 packet capture format (different than the existing ones). If you're the right person then I'm looking for something like #define ARPHDR_IEEE80211_RADIO 803 /* IEEE 802.11 + radiotap */ Thanks. Sam From xschmi00@stud.feec.vutbr.cz Sun Nov 14 00:59:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 00:59:08 -0800 (PST) Received: from tron.kn.vutbr.cz (tron.kn.vutbr.cz [147.229.191.152]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAE8x18b011138 for ; Sun, 14 Nov 2004 00:59:02 -0800 Received: from [147.229.222.29] (a05-0930b.kn.vutbr.cz [147.229.222.29]) by tron.kn.vutbr.cz (8.12.9p2/8.12.9) with ESMTP id iAE8wZH3048177; Sun, 14 Nov 2004 09:58:35 +0100 (CET) (envelope-from xschmi00@stud.feec.vutbr.cz) Message-ID: <41971E3B.40605@stud.feec.vutbr.cz> Date: Sun, 14 Nov 2004 09:58:35 +0100 From: Michal Schmidt User-Agent: Mozilla Thunderbird 0.8 (X11/20041005) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andreas Sindermann CC: netdev@oss.sgi.com, c-d.hailfinger.kernel.2004@gmx.net Subject: Re: Options for forcedeth Linux kernel module References: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> In-Reply-To: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: clamd / ClamAV version 0.70, clamav-milter version 0.70j X-Scanned-By: milter-spamc/0.19.268 (tron [147.229.191.152]); Sun, 14 Nov 2004 09:58:36 +0100 X-archive-position: 11798 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xschmi00@stud.feec.vutbr.cz Precedence: bulk X-list: netdev Content-Length: 249 Lines: 9 Andreas Sindermann wrote: > On http://www.hailfinger.org/carldani/linux/patches/forcedeth/ I can't > find any information how to explicity set options for 100 Mbps full > duplex. > Have you tried to set this using the 'mii-tool' utility? Michal From hch@lst.de Sun Nov 14 02:16:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 02:17:05 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEAGvxv013023 for ; Sun, 14 Nov 2004 02:16:58 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAEAGbla031801 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Sun, 14 Nov 2004 11:16:38 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iAEAGb1M031799; Sun, 14 Nov 2004 11:16:37 +0100 Date: Sun, 14 Nov 2004 11:16:37 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: [PATCH] kill drivers/net/net_init.c Message-ID: <20041114101637.GA31739@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11799 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 9124 Lines: 326 After the last patch only three routines are left in this file, but all of the fir into net/core/dev.c much better: - {un,}register_netdev are just wrappers around {un,}register_netdevice from dev.c - alloc_netdev's counterpart, free_netdev is in dev.c aswell. So move over the remaining contents and add some kerneldoc comments describing the functions. --- 1.87/drivers/net/Makefile 2004-11-11 09:34:32 +01:00 +++ edited/drivers/net/Makefile 2004-11-14 10:36:00 +01:00 @@ -66,7 +66,7 @@ obj-$(CONFIG_SUNDANCE) += sundance.o obj-$(CONFIG_HAMACHI) += hamachi.o -obj-$(CONFIG_NET) += Space.o net_init.o loopback.o +obj-$(CONFIG_NET) += Space.o loopback.o obj-$(CONFIG_SEEQ8005) += seeq8005.o obj-$(CONFIG_ETHERTAP) += ethertap.o obj-$(CONFIG_NET_SB1000) += sb1000.o --- 1.25/drivers/net/net_init.c 2004-11-11 23:40:09 +01:00 +++ edited/drivers/net/net_init.c 2004-11-14 10:35:50 +01:00 @@ -1,152 +0,0 @@ -/* net_init.c: Initialization for network devices. */ -/* - Written 1993,1994,1995 by Donald Becker. - - The author may be reached as becker@scyld.com, or C/O - Scyld Computing Corporation - 410 Severn Ave., Suite 210 - Annapolis MD 21403 - - This file contains the initialization for the "pl14+" style ethernet - drivers. It should eventually replace most of drivers/net/Space.c. - It's primary advantage is that it's able to allocate low-memory buffers. - A secondary advantage is that the dangerous NE*000 netcards can reserve - their I/O port region before the SCSI probes start. - - Modifications/additions by Bjorn Ekwall : - ethdev_index[MAX_ETH_CARDS] - register_netdev() / unregister_netdev() - - Modifications by Wolfgang Walter - Use dev_close cleanly so we always shut things down tidily. - - Changed 29/10/95, Alan Cox to pass sockaddr's around for mac addresses. - - 14/06/96 - Paul Gortmaker: Add generic eth_change_mtu() function. - 24/09/96 - Paul Norton: Add token-ring variants of the netdev functions. - - 08/11/99 - Alan Cox: Got fed up of the mess in this file and cleaned it - up. We now share common code and have regularised name - allocation setups. Abolished the 16 card limits. - 03/19/2000 - jgarzik and Urban Widmark: init_etherdev 32-byte align - 03/21/2001 - jgarzik: alloc_etherdev and friends - -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* The network devices currently exist only in the socket namespace, so these - entries are unused. The only ones that make sense are - open start the ethercard - close stop the ethercard - ioctl To get statistics, perhaps set the interface port (AUI, BNC, etc.) - One can also imagine getting raw packets using - read & write - but this is probably better handled by a raw packet socket. - - Given that almost all of these functions are handled in the current - socket-based scheme, putting ethercard devices in /dev/ seems pointless. - - [Removed all support for /dev network devices. When someone adds - streams then by magic we get them, but otherwise they are un-needed - and a space waste] -*/ - - -struct net_device *alloc_netdev(int sizeof_priv, const char *mask, - void (*setup)(struct net_device *)) -{ - void *p; - struct net_device *dev; - int alloc_size; - - /* ensure 32-byte alignment of both the device and private area */ - - alloc_size = (sizeof(struct net_device) + NETDEV_ALIGN_CONST) - & ~NETDEV_ALIGN_CONST; - alloc_size += sizeof_priv + NETDEV_ALIGN_CONST; - - p = kmalloc (alloc_size, GFP_KERNEL); - if (!p) { - printk(KERN_ERR "alloc_dev: Unable to allocate device.\n"); - return NULL; - } - - memset(p, 0, alloc_size); - - dev = (struct net_device *)(((long)p + NETDEV_ALIGN_CONST) - & ~NETDEV_ALIGN_CONST); - dev->padded = (char *)dev - (char *)p; - - if (sizeof_priv) - dev->priv = netdev_priv(dev); - - setup(dev); - strcpy(dev->name, mask); - - return dev; -} -EXPORT_SYMBOL(alloc_netdev); - -int register_netdev(struct net_device *dev) -{ - int err; - - rtnl_lock(); - - /* - * If the name is a format string the caller wants us to - * do a name allocation - */ - - if (strchr(dev->name, '%')) - { - err = dev_alloc_name(dev, dev->name); - if (err < 0) - goto out; - } - - /* - * Back compatibility hook. Kill this one in 2.5 - */ - - if (dev->name[0]==0 || dev->name[0]==' ') - { - err = dev_alloc_name(dev, "eth%d"); - if (err < 0) - goto out; - } - - err = register_netdevice(dev); - -out: - rtnl_unlock(); - return err; -} - -void unregister_netdev(struct net_device *dev) -{ - rtnl_lock(); - unregister_netdevice(dev); - rtnl_unlock(); -} - -EXPORT_SYMBOL(register_netdev); -EXPORT_SYMBOL(unregister_netdev); --- 1.174/net/core/dev.c 2004-11-10 01:12:00 +01:00 +++ edited/net/core/dev.c 2004-11-14 10:35:45 +01:00 @@ -2677,8 +2677,7 @@ * chain. 0 is returned on success. A negative errno code is returned * on a failure to set up the device, or if the name is a duplicate. * - * Callers must hold the rtnl semaphore. See the comment at the - * end of Space.c for details about the locking. You may want + * Callers must hold the rtnl semaphore. You may want * register_netdev() instead of this. * * BUGS: @@ -2799,6 +2798,51 @@ goto out; } +/** + * register_netdev - register a network device + * @dev: device to register + * + * Take a completed network device structure and add it to the kernel + * interfaces. A %NETDEV_REGISTER message is sent to the netdev notifier + * chain. 0 is returned on success. A negative errno code is returned + * on a failure to set up the device, or if the name is a duplicate. + * + * This is a wrapper around register_netdev that takes the rtnl semaphore + * and expands the device name if you passed a format string to + * alloc_netdev. + */ +int register_netdev(struct net_device *dev) +{ + int err; + + rtnl_lock(); + + /* + * If the name is a format string the caller wants us to do a + * name allocation. + */ + if (strchr(dev->name, '%')) { + err = dev_alloc_name(dev, dev->name); + if (err < 0) + goto out; + } + + /* + * Back compatibility hook. Kill this one in 2.5 + */ + if (dev->name[0] == 0 || dev->name[0] == ' ') { + err = dev_alloc_name(dev, "eth%d"); + if (err < 0) + goto out; + } + + err = register_netdevice(dev); +out: + rtnl_unlock(); + return err; +} +EXPORT_SYMBOL(register_netdev); + /* * netdev_wait_allrefs - wait until all references are gone. * @@ -2942,6 +2986,46 @@ } /** + * alloc_netdev - allocate network device + * @sizeof_priv: size of private data to allocate space for + * @name: device name format string + * @setup: callback to initialize device + * + * Allocates a struct net_device with private data area for driver use + * and performs basic initialization. + */ +struct net_device *alloc_netdev(int sizeof_priv, const char *name, + void (*setup)(struct net_device *)) +{ + void *p; + struct net_device *dev; + int alloc_size; + + /* ensure 32-byte alignment of both the device and private area */ + alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST; + alloc_size += sizeof_priv + NETDEV_ALIGN_CONST; + + p = kmalloc(alloc_size, GFP_KERNEL); + if (!p) { + printk(KERN_ERR "alloc_dev: Unable to allocate device.\n"); + return NULL; + } + memset(p, 0, alloc_size); + + dev = (struct net_device *) + (((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST); + dev->padded = (char *)dev - (char *)p; + + if (sizeof_priv) + dev->priv = netdev_priv(dev); + + setup(dev); + strcpy(dev->name, name); + return dev; +} +EXPORT_SYMBOL(alloc_netdev); + +/** * free_netdev - free network device * @dev: device * @@ -2983,8 +3067,7 @@ * from the kernel tables. On success 0 is returned, on a failure * a negative errno code is returned. * - * Callers must hold the rtnl semaphore. See the comment at the - * end of Space.c for details about the locking. You may want + * Callers must hold the rtnl semaphore. You may want * unregister_netdev() instead of this. */ @@ -3061,6 +3144,27 @@ dev_put(dev); return 0; } + +/** + * unregister_netdev - remove device from the kernel + * @dev: device + * + * This function shuts down a device interface and removes it + * from the kernel tables. On success 0 is returned, on a failure + * a negative errno code is returned. + * + * This is just a wrapper for unregister_netdevice that takes + * the rtnl semaphore. In general you want to use this and not + * unregister_netdevice. + */ +void unregister_netdev(struct net_device *dev) +{ + rtnl_lock(); + unregister_netdevice(dev); + rtnl_unlock(); +} + +EXPORT_SYMBOL(unregister_netdev); #ifdef CONFIG_HOTPLUG_CPU static int dev_cpu_callback(struct notifier_block *nfb, From sinder@thp.Uni-Koeln.DE Sun Nov 14 02:28:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 02:29:03 -0800 (PST) Received: from sun80.thp.Uni-Koeln.DE (sun80.thp.uni-koeln.de [134.95.67.81]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEASubp013539 for ; Sun, 14 Nov 2004 02:28:57 -0800 Received: (from sinder@localhost) by sun80.thp.Uni-Koeln.DE (8.11.7+Sun/8.11.7) id iAEASVL27021; Sun, 14 Nov 2004 11:28:31 +0100 (MET) Date: Sun, 14 Nov 2004 11:28:31 +0100 (MET) Message-Id: <200411141028.iAEASVL27021@sun80.thp.Uni-Koeln.DE> From: Andreas Sindermann To: Michal Schmidt Cc: Andreas Sindermann , netdev@oss.sgi.com, c-d.hailfinger.kernel.2004@gmx.net Subject: Re: Options for forcedeth Linux kernel module In-Reply-To: <41971E3B.40605@stud.feec.vutbr.cz> References: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> <41971E3B.40605@stud.feec.vutbr.cz> Mime-Version: 1.0 (generated by tm-edit 7.92) Content-Type: text/plain; charset=US-ASCII X-archive-position: 11800 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sinder@thp.Uni-Koeln.DE Precedence: bulk X-list: netdev Content-Length: 893 Lines: 32 Michal Schmidt writes: > Andreas Sindermann wrote: > > On http://www.hailfinger.org/carldani/linux/patches/forcedeth/ I can't > > find any information how to explicity set options for 100 Mbps full > > duplex. > > > > Have you tried to set this using the 'mii-tool' utility? Thanks for your answer! I tried ethtool but without success. The mii-tool doesn't seem to be delivered with Suse 9.2 and I can't find the sources right now on the net. Here what I tried with ethtool: linux3:~ # ethtool -s eth0 speed 100 duplex full autoneg off Cannot get current device settings: Operation not supported not setting speed not setting duplex not setting autoneg linux3:~ # ethtool eth0 Settings for eth0: Supports Wake-on: g Wake-on: d Link detected: yes So unfortunately ethtool doesn't seem to work properly for me at the moment. Thanks again, Andreas From hch@lst.de Sun Nov 14 02:39:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 02:39:10 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEAd5R5014050 for ; Sun, 14 Nov 2004 02:39:06 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAEAckla032045 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Sun, 14 Nov 2004 11:38:46 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iAEAck14032043; Sun, 14 Nov 2004 11:38:46 +0100 Date: Sun, 14 Nov 2004 11:38:46 +0100 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: [PATCH] use local_softirq_pending instead of softirq_pending in netif_rx_ni Message-ID: <20041114103846.GA32024@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11801 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev Content-Length: 671 Lines: 20 Some architectures can optimize local_softirq_pending much better than softirq_pending(smp_processor_id()), and for all others the former is just a macro expanding to the later. Also this is the last use of softirq_pending() in common code, once this is in we can soon kill the notation of beeing able to query other cpus softirq pending count. --- 1.174/net/core/dev.c 2004-11-10 01:12:00 +01:00 +++ edited/net/core/dev.c 2004-11-14 11:35:19 +01:00 @@ -1470,7 +1470,7 @@ int netif_rx_ni(struct sk_buff *skb) preempt_disable(); err = netif_rx(skb); - if (softirq_pending(smp_processor_id())) + if (local_softirq_pending()) do_softirq(); preempt_enable(); From romieu@fr.zoreil.com Sun Nov 14 03:57:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 03:57:26 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEBvJEW018391 for ; Sun, 14 Nov 2004 03:57:20 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAEBr0vr000577; Sun, 14 Nov 2004 12:53:00 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAEBr0mI000576; Sun, 14 Nov 2004 12:53:00 +0100 Date: Sun, 14 Nov 2004 12:53:00 +0100 From: Francois Romieu To: Andreas Sindermann Cc: Michal Schmidt , netdev@oss.sgi.com, c-d.hailfinger.kernel.2004@gmx.net, manfred@colorfullife.com Subject: Re: Options for forcedeth Linux kernel module Message-ID: <20041114115300.GA32451@electric-eye.fr.zoreil.com> References: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> <41971E3B.40605@stud.feec.vutbr.cz> <200411141028.iAEASVL27021@sun80.thp.Uni-Koeln.DE> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411141028.iAEASVL27021@sun80.thp.Uni-Koeln.DE> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11802 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 944 Lines: 26 Andreas Sindermann : [...] > Thanks for your answer! I tried ethtool but without success. The > mii-tool doesn't seem to be delivered with Suse 9.2 and I can't find > the sources right now on the net. Here what I tried with ethtool: > > linux3:~ # ethtool -s eth0 speed 100 duplex full autoneg off > Cannot get current device settings: Operation not supported > not setting speed > not setting duplex > not setting autoneg [...] > So unfortunately ethtool doesn't seem to work properly for me at the > moment. At least in 2.6.10-rc1-bk20 + 2.6.10-rc1-bk14-netdev1, the driver does not provide a set_settings() method in its ethtool_ops structure. It does not use generic_mii_ioctl() or support SIOC#MII### either. So neither ethtool nor mii-tool will allow you to set the required option. Otoh it seems that phy_init() contains most of the code one needs to glue to have mii-tool/ethtool support. -- Ueimor From manfred@colorfullife.com Sun Nov 14 07:03:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 07:03:29 -0800 (PST) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEF3L69031065 for ; Sun, 14 Nov 2004 07:03:22 -0800 Received: from [127.0.0.2] (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAEF2qSL003937; Sun, 14 Nov 2004 16:02:55 +0100 Message-ID: <4197739A.7050804@colorfullife.com> Date: Sun, 14 Nov 2004 16:02:50 +0100 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Francois Romieu CC: Andreas Sindermann , Michal Schmidt , netdev@oss.sgi.com, c-d.hailfinger.kernel.2004@gmx.net Subject: Re: Options for forcedeth Linux kernel module References: <200411131913.iADJDZ321996@sun80.thp.Uni-Koeln.DE> <41971E3B.40605@stud.feec.vutbr.cz> <200411141028.iAEASVL27021@sun80.thp.Uni-Koeln.DE> <20041114115300.GA32451@electric-eye.fr.zoreil.com> In-Reply-To: <20041114115300.GA32451@electric-eye.fr.zoreil.com> Content-Type: multipart/mixed; boundary="------------070703090800020700080104" X-archive-position: 11803 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Content-Length: 12744 Lines: 420 This is a multi-part message in MIME format. --------------070703090800020700080104 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Francois Romieu wrote: >>So unfortunately ethtool doesn't seem to work properly for me at the >>moment. >> >> > >At least in 2.6.10-rc1-bk20 + 2.6.10-rc1-bk14-netdev1, the driver does >not provide a set_settings() method in its ethtool_ops structure. > Correct. Attached is a patch that adds get_settings and set_settings. Andreas, could you apply it and test if it solves your problem? I've tested it with an gigabit nforce nic and it worked as expected: duplex mismatch means ~23 kB throughput, proper link setting ~11 MB/sec, both with 100 FD. -- Manfred --------------070703090800020700080104 Content-Type: text/plain; name="patch-forcedeth-031-ethtool" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-forcedeth-031-ethtool" // $Header$ // Kernel Version: // VERSION = 2 // PATCHLEVEL = 6 // SUBLEVEL = 10 // EXTRAVERSION =-rc1 --- 2.6/drivers/net/forcedeth.c 2004-11-14 14:50:21.668871625 +0100 +++ build-2.6/drivers/net/forcedeth.c 2004-11-14 15:55:45.780714220 +0100 @@ -79,6 +79,8 @@ * 0.30: 25 Sep 2004: rx checksum support for nf 250 Gb. Add rx reset * into nv_close, otherwise reenabling for wol can * cause DMA to kfree'd memory. + * 0.31: 14 Nov 2004: ethtool support for getting/setting link + * capabilities. * * Known bugs: * We suspect that on some hardware no TX done interrupts are generated. @@ -90,7 +92,7 @@ * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * superfluous timer interrupts from the nic. */ -#define FORCEDETH_VERSION "0.30" +#define FORCEDETH_VERSION "0.31" #define DRV_NAME "forcedeth" #include @@ -210,6 +212,7 @@ enum { #define NVREG_LINKSPEED_10 1000 #define NVREG_LINKSPEED_100 100 #define NVREG_LINKSPEED_1000 50 +#define NVREG_LINKSPEED_MASK (0xFFF) NvRegUnknownSetupReg5 = 0x130, #define NVREG_UNKSETUP5_BIT31 (1<<31) NvRegUnknownSetupReg3 = 0x13c, @@ -441,6 +444,8 @@ struct fe_priv { int in_shutdown; u32 linkspeed; int duplex; + int autoneg; + int fixed_mode; int phyaddr; int wolenabled; unsigned int phy_oui; @@ -765,50 +770,6 @@ static struct net_device_stats *nv_get_s return &np->stats; } -static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) -{ - struct fe_priv *np = get_nvpriv(dev); - strcpy(info->driver, "forcedeth"); - strcpy(info->version, FORCEDETH_VERSION); - strcpy(info->bus_info, pci_name(np->pci_dev)); -} - -static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - wolinfo->supported = WAKE_MAGIC; - - spin_lock_irq(&np->lock); - if (np->wolenabled) - wolinfo->wolopts = WAKE_MAGIC; - spin_unlock_irq(&np->lock); -} - -static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - - spin_lock_irq(&np->lock); - if (wolinfo->wolopts == 0) { - writel(0, base + NvRegWakeUpFlags); - np->wolenabled = 0; - } - if (wolinfo->wolopts & WAKE_MAGIC) { - writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); - np->wolenabled = 1; - } - spin_unlock_irq(&np->lock); - return 0; -} - -static struct ethtool_ops ops = { - .get_drvinfo = nv_get_drvinfo, - .get_link = ethtool_op_get_link, - .get_wol = nv_get_wol, - .set_wol = nv_set_wol, -}; - /* * nv_alloc_rx: fill rx ring entries. * Return 1 if the allocations for the skbs failed and the @@ -1286,6 +1247,25 @@ static int nv_update_linkspeed(struct ne goto set_speed; } + if (np->autoneg == 0) { + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: autoneg off, PHY set to 0x%04x.\n", + dev->name, np->fixed_mode); + if (np->fixed_mode & LPA_100FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 1; + } else if (np->fixed_mode & LPA_100HALF) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 0; + } else if (np->fixed_mode & LPA_10FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 1; + } else { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 0; + } + retval = 1; + goto set_speed; + } /* check auto negotiation is complete */ if (!(mii_status & BMSR_ANEGCOMPLETE)) { /* still in autonegotiation - configure nic for 10 MBit HD and wait. */ @@ -1303,7 +1283,7 @@ static int nv_update_linkspeed(struct ne if ((control_1000 & ADVERTISE_1000FULL) && (status_1000 & LPA_1000FULL)) { - dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", dev->name); newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_1000; newdup = 1; @@ -1362,9 +1342,9 @@ set_speed: phyreg &= ~(PHY_HALF|PHY_100|PHY_1000); if (np->duplex == 0) phyreg |= PHY_HALF; - if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_100) + if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_100) phyreg |= PHY_100; - else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_1000) + else if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) phyreg |= PHY_1000; writel(phyreg, base + NvRegPhyInterface); @@ -1500,6 +1480,223 @@ static void nv_do_nic_poll(unsigned long enable_irq(dev->irq); } +static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct fe_priv *np = get_nvpriv(dev); + strcpy(info->driver, "forcedeth"); + strcpy(info->version, FORCEDETH_VERSION); + strcpy(info->bus_info, pci_name(np->pci_dev)); +} + +static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + wolinfo->supported = WAKE_MAGIC; + + spin_lock_irq(&np->lock); + if (np->wolenabled) + wolinfo->wolopts = WAKE_MAGIC; + spin_unlock_irq(&np->lock); +} + +static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + u8 __iomem *base = get_hwbase(dev); + + spin_lock_irq(&np->lock); + if (wolinfo->wolopts == 0) { + writel(0, base + NvRegWakeUpFlags); + np->wolenabled = 0; + } + if (wolinfo->wolopts & WAKE_MAGIC) { + writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); + np->wolenabled = 1; + } + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + int adv; + + spin_lock_irq(&np->lock); + ecmd->port = PORT_MII; + if (!netif_running(dev)) { + /* We do not track link speed / duplex setting if the + * interface is disabled. Force a link check */ + nv_update_linkspeed(dev); + } + switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { + case NVREG_LINKSPEED_10: + ecmd->speed = SPEED_10; + break; + case NVREG_LINKSPEED_100: + ecmd->speed = SPEED_100; + break; + case NVREG_LINKSPEED_1000: + ecmd->speed = SPEED_1000; + break; + } + ecmd->duplex = DUPLEX_HALF; + if (np->duplex) + ecmd->duplex = DUPLEX_FULL; + + ecmd->autoneg = np->autoneg; + + ecmd->advertising = ADVERTISED_MII; + if (np->autoneg) { + ecmd->advertising |= ADVERTISED_Autoneg; + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + } else { + adv = np->fixed_mode; + } + if (adv & ADVERTISE_10HALF) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (adv & ADVERTISE_10FULL) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (adv & ADVERTISE_100HALF) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (adv & ADVERTISE_100FULL) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (np->autoneg && np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + if (adv & ADVERTISE_1000FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + } + + ecmd->supported = (SUPPORTED_Autoneg | + SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | + SUPPORTED_MII); + if (np->gigabit == PHY_GIGABIT) + ecmd->supported |= SUPPORTED_1000baseT_Full; + + ecmd->phy_address = np->phyaddr; + ecmd->transceiver = XCVR_EXTERNAL; + + /* ignore maxtxpkt, maxrxpkt for now */ + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + + if (ecmd->port != PORT_MII) + return -EINVAL; + if (ecmd->transceiver != XCVR_EXTERNAL) + return -EINVAL; + if (ecmd->phy_address != np->phyaddr) { + /* TODO: support switching between multiple phys. Should be + * trivial, but not enabled due to lack of test hardware. */ + return -EINVAL; + } + if (ecmd->autoneg == AUTONEG_ENABLE) { + if ((ecmd->advertising & (ADVERTISED_10baseT_Half | + ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | + ADVERTISED_100baseT_Full | + ADVERTISED_1000baseT_Full)) == 0) { + return -EINVAL; + } + if (ecmd->advertising & ADVERTISED_1000baseT_Full && + np->gigabit != PHY_GIGABIT) { + return -EINVAL; + } + } else if (ecmd->autoneg == AUTONEG_DISABLE) { + /* Note: autonegotiation disable, speed 1000 intentionally + * forbidden - noone should need that. */ + + if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) + return -EINVAL; + if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) + return -EINVAL; + } else { + return -EINVAL; + } + + spin_lock_irq(&np->lock); + if (ecmd->autoneg == AUTONEG_ENABLE) { + int adv, tmp; + + np->autoneg = 1; + + /* advertise only what has been requested */ + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->advertising & ADVERTISED_10baseT_Half) + adv |= ADVERTISE_10HALF; + if (ecmd->advertising & ADVERTISED_10baseT_Full) + adv |= ADVERTISE_10FULL; + if (ecmd->advertising & ADVERTISED_100baseT_Half) + adv |= ADVERTISE_100HALF; + if (ecmd->advertising & ADVERTISED_100baseT_Full) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + if (ecmd->advertising & ADVERTISED_1000baseT_Full) + adv |= ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + + tmp = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + tmp |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, tmp); + + } else { + int adv, tmp; + + np->autoneg = 0; + + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_10HALF; + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_10FULL; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_100HALF; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + np->fixed_mode = adv; + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + tmp = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + tmp |= ~BMCR_ANENABLE; + mii_rw(dev, np->phyaddr, MII_BMCR, tmp); + + if (netif_running(dev)) { + /* Wait a bit and then reconfigure the nic. */ + udelay(10); + nv_linkchange(dev); + } + } + spin_unlock_irq(&np->lock); + + return 0; +} + +static struct ethtool_ops ops = { + .get_drvinfo = nv_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_wol = nv_get_wol, + .set_wol = nv_set_wol, + .get_settings = nv_get_settings, + .set_settings = nv_set_settings, +}; + static int nv_open(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); @@ -1550,9 +1747,6 @@ static int nv_open(struct net_device *de base + NvRegRingSizes); /* 5) continue setup */ - np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; - np->duplex = 0; - writel(np->linkspeed, base + NvRegLinkSpeed); writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); writel(np->desc_ver, base + NvRegTxRxControl); @@ -1866,6 +2060,11 @@ static int __devinit nv_probe(struct pci phy_init(dev); } + /* set default link speed settings */ + np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + np->duplex = 0; + np->autoneg = 1; + err = register_netdev(dev); if (err) { printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err); --------------070703090800020700080104-- From buytenh@wantstofly.org Sun Nov 14 07:47:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 07:47:20 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEFlCC3000412 for ; Sun, 14 Nov 2004 07:47:13 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 6C4B72B0EE; Sun, 14 Nov 2004 16:46:53 +0100 (MET) Date: Sun, 14 Nov 2004 16:46:53 +0100 From: Lennert Buytenhek To: netdev@oss.sgi.com Subject: pktgen performance numbers Message-ID: <20041114154653.GA3857@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11804 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Content-Length: 621 Lines: 19 Hi all, On an intel 7505-based board with onboard e1000 and dual 2.4ghz xeon processors running 2.6.10-rc1, I can send ~600kpps 60byte packets using pktgen. I'm using only one CPU, the IRQ tied to that CPU, etc. On a single P4 3.0GHz with a 32/33 e1000 PCI card, I get ~450kpps, also on 2.6.10-rc1. Robert Olsson's pktgen paper* talks about 870kpps using an e1000 in a P3 733, and 2.4Mpps on a dual 1.6GHz opteron, but I've been totally unable to reproduce anything like this at all. Any ideas for stuff I should try? thanks, Lennert * ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf From Robert.Olsson@data.slu.se Sun Nov 14 08:33:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 08:33:16 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEGXA0X005441 for ; Sun, 14 Nov 2004 08:33:11 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAEGWokm028701; Sun, 14 Nov 2004 17:32:50 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id AE9D0EC0AD; Sun, 14 Nov 2004 17:32:50 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16791.34994.647288.940473@robur.slu.se> Date: Sun, 14 Nov 2004 17:32:50 +0100 To: Lennert Buytenhek Cc: netdev@oss.sgi.com, Robert.Olsson@data.slu.se Subject: pktgen performance numbers In-Reply-To: <20041114154653.GA3857@xi.wantstofly.org> References: <20041114154653.GA3857@xi.wantstofly.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 11805 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Content-Length: 1345 Lines: 37 Hello! Lennert Buytenhek writes: > Hi all, > > On an intel 7505-based board with onboard e1000 and dual 2.4ghz xeon > processors running 2.6.10-rc1, I can send ~600kpps 60byte packets using > pktgen. I'm using only one CPU, the IRQ tied to that CPU, etc. On a > single P4 3.0GHz with a 32/33 e1000 PCI card, I get ~450kpps, also on > 2.6.10-rc1. PCI-bus limitations probably. Lots of transactions per packet. I was trying TX performance with small packets (64 byte) at w. different bus speeds it seems like even at PCI-X 133 MHz this is a limit. Also PCI-brigades decreases TX performance according to Grant Graundler this probably to the extra delay added. Grant Grundler gave a talk on OLS 2004 covering many aspects of this. > Robert Olsson's pktgen paper* talks about 870kpps using an e1000 in a > P3 733, and 2.4Mpps on a dual 1.6GHz opteron, but I've been totally > unable to reproduce anything like this at all. The 2.4 Mpps mentioned is aggregated TX performance from an DUAL Opteron at 1.6 GHz using several e1000's. The the best single stream (from one NIC) wee see is about 870 kpps. (ServerWorks chipset) So the BSD claims to route 1 Mpps puzzles me a bit as we cannot even send. Again it would be interesting to see some numbers from decent PCI-connected 10 GIGE cards. Cheers. --ro From ross.axe@blueyonder.co.uk Sun Nov 14 10:13:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 10:13:45 -0800 (PST) Received: from smtp-out4.blueyonder.co.uk (smtp-out4.blueyonder.co.uk [195.188.213.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEIDbXt008833 for ; Sun, 14 Nov 2004 10:13:38 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out4.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Sun, 14 Nov 2004 18:13:47 +0000 Message-ID: <4197A037.1020307@blueyonder.co.uk> Date: Sun, 14 Nov 2004 18:13:11 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com CC: linux-kernel@vger.kernel.org Subject: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig1A9E7CC68846B315A9689575" X-OriginalArrivalTime: 14 Nov 2004 18:13:47.0428 (UTC) FILETIME=[AF4D4E40:01C4CA75] X-archive-position: 11806 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev Content-Length: 1598 Lines: 49 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig1A9E7CC68846B315A9689575 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit With CONFIG_SECURITY_NETWORK=y and CONFIG_SECURITY_SELINUX=y, using SOCK_SEQPACKET unix domain sockets causes an oops in the superfluous(?) call to security_unix_may_send in sock_dgram_sendmsg. This patch avoids making this call for SOCK_SEQPACKET sockets. Signed-off-by: Ross Axe --- linux-2.6.10-rc1/net/unix/af_unix.c.orig 2004-11-13 21:04:53.000000000 +0000 +++ linux-2.6.10-rc1/net/unix/af_unix.c 2004-11-13 21:12:23.000000000 +0000 @@ -1354,9 +1354,11 @@ restart: if (other->sk_shutdown & RCV_SHUTDOWN) goto out_unlock; - err = security_unix_may_send(sk->sk_socket, other->sk_socket); - if (err) - goto out_unlock; + if (sk->sk_type != SOCK_SEQPACKET) { + err = security_unix_may_send(sk->sk_socket, other->sk_socket); + if (err) + goto out_unlock; + } if (unix_peer(other) != sk && (skb_queue_len(&other->sk_receive_queue) > --------------enig1A9E7CC68846B315A9689575 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBl6A89bR4xmappRARAottAKCamwZt5rm2zbcOBZbZFCN1t3fvJACfUwt8 BLHOjOb6vwerfpiZgXdI8KM= =TIn2 -----END PGP SIGNATURE----- --------------enig1A9E7CC68846B315A9689575-- From jgarzik@pobox.com Sun Nov 14 11:04:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 11:04:39 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEJ4YeQ010937 for ; Sun, 14 Nov 2004 11:04:35 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTPfa-0001by-6X; Sun, 14 Nov 2004 19:04:14 +0000 Message-ID: <4197AC20.6020707@pobox.com> Date: Sun, 14 Nov 2004 14:04:00 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?UTF-8?B?WU9TSElGVUpJIEhpZGVha2kgLyDlkInol6Toi7HmmI4=?= CC: Netdev , Arnaldo Carvalho de Melo Subject: IPv6 "badness" in recent releases Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11808 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 2082 Lines: 60 So, while ssh'ing _successfully_ to a DNS server I maintain, I noticed that my gateway would grind its disk whenever traffic flowed through the ssh connection. I login (same machine that used to have the "BUG: dst underflow" problems) and see [first one I can find in log] Badness in dst_release at include/net/dst.h:149 [] ip6_dst_check+0x64/0x6a [ipv6] [] ip6_dst_lookup+0x17b/0x195 [ipv6] [] udpv6_sendmsg+0x2bb/0x934 [ipv6] [] udp_recvmsg+0x60/0x2e9 [] inet_sendmsg+0x4d/0x59 [] sock_sendmsg+0xe8/0x103 [] find_busiest_group+0xcf/0x2db [] copy_from_user+0x42/0x6e [] autoremove_wake_function+0x0/0x57 [] sys_sendmsg+0x189/0x1e6 [] __wake_up_common+0x3f/0x5e [] __wake_up+0x40/0x56 [] wake_futex+0x37/0x62 [] futex_wake+0x74/0xc4 [] copy_from_user+0x42/0x6e [] sys_socketcall+0x236/0x254 [] sysenter_past_esp+0x52/0x71 [current ones] Badness in dst_release at include/net/dst.h:149 [] ipip6_tunnel_xmit+0x5e9/0x7c8 [ipv6] [] try_to_wake_up+0x1f3/0x2c9 [] dev_queue_xmit+0xd1/0x272 [] ip6_output2+0x18c/0x29e [ipv6] [] ip6_forward+0x148/0x3e6 [ipv6] [] ipv6_rcv+0x142/0x284 [ipv6] [] netif_receive_skb+0x12f/0x18f [] e1000_clean_rx_irq+0x12e/0x447 [e1000] [] __kfree_skb+0x83/0x107 [] e1000_clean+0x51/0xca [e1000] [] net_rx_action+0x77/0xf6 [] __do_softirq+0xb7/0xc6 [] do_softirq+0x2d/0x2f [] do_IRQ+0x1e/0x24 [] common_interrupt+0x1a/0x20 [] default_idle+0x0/0x2c [] default_idle+0x29/0x2c [] cpu_idle+0x33/0x3c filling my logs. This is i686 HyperThreaded (fake SMP) box running 2.6.10-rc1-bk16. As I mentioned at the beginning of the message, IPv6 still seems to function. It just fills my kernel ring buffer with these BUG messages. Jeff From jgarzik@pobox.com Sun Nov 14 11:38:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 11:38:31 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEJcQnQ013044 for ; Sun, 14 Nov 2004 11:38:27 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTQCM-0002Ha-SR; Sun, 14 Nov 2004 19:38:07 +0000 Message-ID: <4197B407.2030108@pobox.com> Date: Sun, 14 Nov 2004 14:37:43 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?UTF-8?B?WU9TSElGVUpJIEhpZGVha2kgLyDlkInol6Toi7HmmI4=?= , Netdev CC: Arnaldo Carvalho de Melo Subject: Re: IPv6 "badness" in recent releases References: <4197AC20.6020707@pobox.com> In-Reply-To: <4197AC20.6020707@pobox.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11809 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 366 Lines: 13 Two additional data points... * I'm running -bk24 now, and trying to reproduce * the problem in the previous email was generated by an ssh connection from host A, through router B, to host C. router B is the Linux kernel that was emitting the "Badness in dst_release" messages. No obvious error messages on host A (2.6.10-rc1-bk22) or host C (UML). Jeff From fw@deneb.enyo.de Sun Nov 14 12:01:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:01:50 -0800 (PST) Received: from albireo.enyo.de (albireo.enyo.de [212.9.189.169]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEK1gXX014224 for ; Sun, 14 Nov 2004 12:01:43 -0800 Received: from deneb.enyo.de ([212.9.189.171]) by albireo.enyo.de with esmtp id 1CTQYl-00008E-LS; Sun, 14 Nov 2004 21:01:15 +0100 Received: from fw by deneb.enyo.de with local (Exim 4.34) id 1CTQYk-0001qp-0v; Sun, 14 Nov 2004 21:01:14 +0100 To: John Heffner Cc: netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload References: From: Florian Weimer Date: Sun, 14 Nov 2004 21:01:14 +0100 In-Reply-To: (John Heffner's message of "Fri, 12 Nov 2004 18:46:11 -0500 (EST)") Message-ID: <87mzxkxks5.fsf@deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 11810 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fw@deneb.enyo.de Precedence: bulk X-list: netdev Content-Length: 907 Lines: 18 * John Heffner: > Currently with many common Ethernet devices in Linux, hardware TCP > checksumming is enabled by default. This seems fairly dangerous to me. > Most link layer checksums are much stronger than the TCP/UDP checksum; > most bit errors are caught by these. However, one of the primary purposes > of the TCP/UDP checksum is to detect errors occurring outside the > protection of the link layer checksums -- errors when data is reassembled > or copied across busses inside hosts and routers. The IP checksum is quite bad at catching those, though. Broken memory banks or busses tend to introduce bit errors in distances which are multiples of 16 bits (something like 64 or 256). Because of the way the IP checksum works, two such errors in the same packet cancel out and go undetected. I was once on the receiving end of such packets, and I can tell you it's not a fun thing to debug. 8-( From chrisw@osdl.org Sun Nov 14 12:19:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:19:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKJ45T015067 for ; Sun, 14 Nov 2004 12:19:05 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKIb925955; Sun, 14 Nov 2004 12:18:37 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKIbn12748; Sun, 14 Nov 2004 12:18:37 -0800 Date: Sun, 14 Nov 2004 12:18:37 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 0/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i X-archive-position: 11811 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 551 Lines: 16 The following trivial patches update networking code to use the SLAB_PANIC flag when creating a critical slab cache instead of doing localized calls to panic(). This brings networking inline with other core kernel code. core/flow.c | 5 +---- core/skbuff.c | 4 +--- decnet/dn_route.c | 9 +++------ ipv4/inetpeer.c | 5 +---- ipv4/ipmr.c | 5 +---- ipv6/ip6_fib.c | 4 +--- ipv6/route.c | 9 +++------ xfrm/xfrm_input.c | 4 +--- 8 files changed, 12 insertions(+), 33 deletions(-) thanks, -chris From chrisw@osdl.org Sun Nov 14 12:20:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:20:33 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKKSKl018679 for ; Sun, 14 Nov 2004 12:20:29 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKK0926029; Sun, 14 Nov 2004 12:20:00 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKK0Y12769; Sun, 14 Nov 2004 12:20:00 -0800 Date: Sun, 14 Nov 2004 12:20:00 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 1/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122000.Y2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11812 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 623 Lines: 20 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/core/flow.c 1.20 vs edited ===== --- 1.20/net/core/flow.c 2004-03-16 18:10:10 -08:00 +++ edited/net/core/flow.c 2004-10-29 14:22:54 -07:00 @@ -343,11 +343,8 @@ static int __init flow_cache_init(void) flow_cachep = kmem_cache_create("flow_cache", sizeof(struct flow_cache_entry), - 0, SLAB_HWCACHE_ALIGN, + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - - if (!flow_cachep) - panic("NET: failed to allocate flow cache slab\n"); flow_hash_shift = 10; flow_lwm = 2 * flow_hash_size; From chrisw@osdl.org Sun Nov 14 12:21:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:21:17 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKLDeR018999 for ; Sun, 14 Nov 2004 12:21:13 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKKm926173; Sun, 14 Nov 2004 12:20:48 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKKmV12825; Sun, 14 Nov 2004 12:20:48 -0800 Date: Sun, 14 Nov 2004 12:20:48 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 2/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122048.Z2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11813 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 618 Lines: 19 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/core/skbuff.c 1.39 vs edited ===== --- 1.39/net/core/skbuff.c 2004-10-19 21:56:24 -07:00 +++ edited/net/core/skbuff.c 2004-10-29 14:23:43 -07:00 @@ -1430,10 +1430,8 @@ void __init skb_init(void) skbuff_head_cache = kmem_cache_create("skbuff_head_cache", sizeof(struct sk_buff), 0, - SLAB_HWCACHE_ALIGN, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - if (!skbuff_head_cache) - panic("cannot create skbuff cache"); } EXPORT_SYMBOL(___pskb_trim); From chrisw@osdl.org Sun Nov 14 12:22:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:22:15 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKMC0R019379 for ; Sun, 14 Nov 2004 12:22:12 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKLl926923; Sun, 14 Nov 2004 12:21:47 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKLld12841; Sun, 14 Nov 2004 12:21:47 -0800 Date: Sun, 14 Nov 2004 12:21:47 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 3/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122147.A2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11814 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 767 Lines: 23 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/decnet/dn_route.c 1.29 vs edited ===== --- 1.29/net/decnet/dn_route.c 2004-11-09 16:44:25 -08:00 +++ edited/net/decnet/dn_route.c 2004-11-10 17:48:58 -08:00 @@ -1778,12 +1778,9 @@ void __init dn_route_init(void) int i, goal, order; dn_dst_ops.kmem_cachep = kmem_cache_create("dn_dst_cache", - sizeof(struct dn_route), - 0, SLAB_HWCACHE_ALIGN, - NULL, NULL); - - if (!dn_dst_ops.kmem_cachep) - panic("DECnet: Failed to allocate dn_dst_cache\n"); + sizeof(struct dn_route), 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, + NULL, NULL); init_timer(&dn_route_timer); dn_route_timer.function = dn_dst_check_expire; From chrisw@osdl.org Sun Nov 14 12:23:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:23:07 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKN2Gx019616 for ; Sun, 14 Nov 2004 12:23:02 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKMc926982; Sun, 14 Nov 2004 12:22:38 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKMcS12857; Sun, 14 Nov 2004 12:22:38 -0800 Date: Sun, 14 Nov 2004 12:22:38 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 4/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122238.B2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11815 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 638 Lines: 20 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/ipv4/inetpeer.c 1.9 vs edited ===== --- 1.9/net/ipv4/inetpeer.c 2004-02-23 15:09:14 -08:00 +++ edited/net/ipv4/inetpeer.c 2004-10-29 14:17:33 -07:00 @@ -126,11 +126,8 @@ void __init inet_initpeers(void) peer_cachep = kmem_cache_create("inet_peer_cache", sizeof(struct inet_peer), - 0, SLAB_HWCACHE_ALIGN, + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - - if (!peer_cachep) - panic("cannot create inet_peer_cache"); /* All the timers, started at system startup tend to synchronize. Perturb it a bit. From chrisw@osdl.org Sun Nov 14 12:23:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:23:48 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKNhjH019986 for ; Sun, 14 Nov 2004 12:23:43 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKNI927048; Sun, 14 Nov 2004 12:23:18 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKNIc12872; Sun, 14 Nov 2004 12:23:18 -0800 Date: Sun, 14 Nov 2004 12:23:18 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 5/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122318.C2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11816 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 692 Lines: 20 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/ipv4/ipmr.c 1.45 vs edited ===== --- 1.45/net/ipv4/ipmr.c 2004-07-20 14:55:34 -07:00 +++ edited/net/ipv4/ipmr.c 2004-10-29 14:11:57 -07:00 @@ -1885,11 +1885,8 @@ void __init ip_mr_init(void) { mrt_cachep = kmem_cache_create("ip_mrt_cache", sizeof(struct mfc_cache), - 0, SLAB_HWCACHE_ALIGN, + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - if (!mrt_cachep) - panic("cannot allocate ip_mrt_cache"); - init_timer(&ipmr_expire_timer); ipmr_expire_timer.function=ipmr_expire_process; register_netdevice_notifier(&ip_mr_notifier); From chrisw@osdl.org Sun Nov 14 12:24:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:24:30 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKOPwC020351 for ; Sun, 14 Nov 2004 12:24:25 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKO0927114; Sun, 14 Nov 2004 12:24:00 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKO0v12885; Sun, 14 Nov 2004 12:24:00 -0800 Date: Sun, 14 Nov 2004 12:24:00 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 6/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122400.D2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11817 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 602 Lines: 19 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/ipv6/ip6_fib.c 1.33 vs edited ===== --- 1.33/net/ipv6/ip6_fib.c 2004-11-09 22:57:03 -08:00 +++ edited/net/ipv6/ip6_fib.c 2004-11-14 11:56:01 -08:00 @@ -1242,10 +1242,8 @@ void __init fib6_init(void) { fib6_node_kmem = kmem_cache_create("fib6_nodes", sizeof(struct fib6_node), - 0, SLAB_HWCACHE_ALIGN, + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - if (!fib6_node_kmem) - panic("cannot create fib6_nodes cache"); } void __exit fib6_gc_cleanup(void) From chrisw@osdl.org Sun Nov 14 12:25:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:25:17 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKPDma020750 for ; Sun, 14 Nov 2004 12:25:13 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKOn927185; Sun, 14 Nov 2004 12:24:49 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKOnS12897; Sun, 14 Nov 2004 12:24:49 -0800 Date: Sun, 14 Nov 2004 12:24:49 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 7/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122449.E2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11818 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 768 Lines: 23 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/ipv6/route.c 1.101 vs edited ===== --- 1.101/net/ipv6/route.c 2004-11-11 15:07:25 -08:00 +++ edited/net/ipv6/route.c 2004-11-14 11:56:41 -08:00 @@ -2069,12 +2069,9 @@ void __init ip6_route_init(void) struct proc_dir_entry *p; ip6_dst_ops.kmem_cachep = kmem_cache_create("ip6_dst_cache", - sizeof(struct rt6_info), - 0, SLAB_HWCACHE_ALIGN, - NULL, NULL); - if (!ip6_dst_ops.kmem_cachep) - panic("cannot create ip6_dst_cache"); - + sizeof(struct rt6_info), 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, + NULL, NULL); fib6_init(); #ifdef CONFIG_PROC_FS p = proc_net_create("ipv6_route", 0, rt6_proc_info); From chrisw@osdl.org Sun Nov 14 12:25:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:25:50 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKPkPV020937 for ; Sun, 14 Nov 2004 12:25:46 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEKPL927302; Sun, 14 Nov 2004 12:25:21 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEKPL412931; Sun, 14 Nov 2004 12:25:21 -0800 Date: Sun, 14 Nov 2004 12:25:21 -0800 From: Chris Wright To: davem@davemloft.net Cc: netdev@oss.sgi.com Subject: [PATCH 8/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114122521.F2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net>; from chrisw@osdl.org on Sun, Nov 14, 2004 at 12:18:37PM -0800 X-archive-position: 11819 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 587 Lines: 17 Use SLAB_PANIC when creating a critical slab cache. Signed-off-by: Chris Wright ===== net/xfrm/xfrm_input.c 1.13 vs edited ===== --- 1.13/net/xfrm/xfrm_input.c 2003-07-27 19:22:27 -07:00 +++ edited/net/xfrm/xfrm_input.c 2004-10-29 14:57:20 -07:00 @@ -78,8 +78,6 @@ void __init xfrm_input_init(void) { secpath_cachep = kmem_cache_create("secpath_cache", sizeof(struct sec_path), - 0, SLAB_HWCACHE_ALIGN, + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); - if (!secpath_cachep) - panic("XFRM: failed to allocate secpath_cache\n"); } From jturner@gemini.edu Sun Nov 14 12:28:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:28:23 -0800 (PST) Received: from cygnus.hi.gemini.edu (cygnus.gemini.edu [128.171.188.208]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKSHvc021536 for ; Sun, 14 Nov 2004 12:28:17 -0800 Received: from [192.168.1.101] ([192.168.188.34]) by cygnus.hi.gemini.edu (Switch-3.0.5/Switch-3.0.0) with SMTP id iAEKRcW1012224; Sun, 14 Nov 2004 10:27:39 -1000 (HST) Message-ID: <4197BF46.8060802@gemini.edu> Date: Sun, 14 Nov 2004 17:25:42 -0300 From: James Turner Organization: Gemini Observatory User-Agent: Mozilla Thunderbird 0.8 (X11/20041020) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Shawn Starr CC: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [2.6.10-rc1-bk5] e1000 broken badly on IBM T42 References: <200410270033.22804.shawn.starr@rogers.com> <200410270054.30313.shawn.starr@rogers.com> <200410270521.56816.shawn.starr@rogers.com> In-Reply-To: <200410270521.56816.shawn.starr@rogers.com> Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11821 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jturner@gemini.edu Precedence: bulk X-list: netdev Content-Length: 1760 Lines: 39 >On October 27, 2004 00:33, Shawn Starr wrote: > >>NETDEV WATCHDOG: eth0: transmit timed out >>e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex >>NETDEV WATCHDOG: eth0: transmit timed out >> >>eth0 Link encap:Ethernet HWaddr 00:0D:60:CA:C1:97 >> inet addr:192.168.10.5 Bcast:192.168.10.255 >>Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 >> RX packets:4294883167 errors:4294370903 dropped:4294796898 >>overruns:4294882097 frame:4294711699 TX packets:4294883949 >>errors:4294796898 dropped:0 overruns:0 carrier:4294711699 >>collisions:4294882097 txqueuelen:1000 >> RX bytes:470309 (459.2 KiB) TX bytes:108971 (106.4 KiB) >> Base address:0x8000 Memory:c0220000-c0240000 I also get 4bn errors reported using e1000 on a T42 (2378-DXU) after coming out of APM suspend. However, my network interface seems to work normally otherwise, as far as I can tell. It always reports 100Mbps. eth0 Link encap:Ethernet HWaddr 00:0D:60:FF:0D:9A inet addr:172.16.22.206 Bcast:172.16.22.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:887386 errors:4294967254 dropped:4294967284 overruns:4294967290 frame:4294967278 TX packets:452521 errors:4294967284 dropped:0 overruns:0 carrier:4294967278 collisions:4294967290 txqueuelen:1000 RX bytes:1319970165 (1.2 GiB) TX bytes:32622656 (31.1 MiB) Base address:0x8000 Memory:c0220000-c0240000 I'm using 2.6.9 (FC3), which includes e1000 version 5.3.19-k2. Looks like there is a newer version at http://sourceforge.net/projects/e1000/ (maybe the same as in 2.6.10-rc1?). James. Please cc: any replies to me - thanks (IANAKH). From acme@conectiva.com.br Sun Nov 14 12:28:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:28:09 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKS3U9021510 for ; Sun, 14 Nov 2004 12:28:04 -0800 Received: from [200.138.51.84] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTQzT-00050v-00; Sun, 14 Nov 2004 18:28:51 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id D8AA51463E; Sun, 14 Nov 2004 18:27:37 -0200 (BRST) Message-ID: <4197BFC5.5080800@conectiva.com.br> Date: Sun, 14 Nov 2004 18:27:49 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Chris Wright Cc: davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [PATCH 6/8] Use SLAB_PANIC when creating critical slab cache References: <20041114121837.X2357@build.pdx.osdl.net> <20041114122400.D2357@build.pdx.osdl.net> In-Reply-To: <20041114122400.D2357@build.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11820 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 928 Lines: 31 Chris, I think somebody proposed this in the past and it was refused because we better get rid of the panics and return an error, propagate it and refuse to load the module, better have the machine still alive but without networking than panic it. - Arnaldo Chris Wright wrote: > Use SLAB_PANIC when creating a critical slab cache. > > Signed-off-by: Chris Wright > > ===== net/ipv6/ip6_fib.c 1.33 vs edited ===== > --- 1.33/net/ipv6/ip6_fib.c 2004-11-09 22:57:03 -08:00 > +++ edited/net/ipv6/ip6_fib.c 2004-11-14 11:56:01 -08:00 > @@ -1242,10 +1242,8 @@ void __init fib6_init(void) > { > fib6_node_kmem = kmem_cache_create("fib6_nodes", > sizeof(struct fib6_node), > - 0, SLAB_HWCACHE_ALIGN, > + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, > NULL, NULL); > - if (!fib6_node_kmem) > - panic("cannot create fib6_nodes cache"); > } > > void __exit fib6_gc_cleanup(void) > > From herbert@gondor.apana.org.au Sun Nov 14 12:36:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 12:36:09 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEKa0aQ022336 for ; Sun, 14 Nov 2004 12:36:01 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CTR5w-0003C1-00; Mon, 15 Nov 2004 07:35:32 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CTR5h-0006ac-00; Mon, 15 Nov 2004 07:35:17 +1100 From: Herbert Xu To: jgarzik@pobox.com (Jeff Garzik) Subject: Re: IPv6 "badness" in recent releases Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com, acme@conectiva.com.br Organization: Core In-Reply-To: <4197AC20.6020707@pobox.com> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Mon, 15 Nov 2004 07:35:17 +1100 X-archive-position: 11822 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Content-Length: 1230 Lines: 35 Jeff Garzik wrote: > > I login (same machine that used to have the "BUG: dst underflow" > problems) and see > > [first one I can find in log] > Badness in dst_release at include/net/dst.h:149 Thanks. This is what "dst underflow" looks like in the new kernels. Unfortunately whatever caused this has already happened so we can only guess about where the bug is. Could you please apply this patch and see if the warning triggers before the underflows start coming in? We already know that if it does then it can cause underflows but I want to make sure that this is what's causing your problems. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- ===== net/ipv6/addrconf.c 1.115 vs edited ===== --- 1.115/net/ipv6/addrconf.c 2004-10-26 14:11:35 +10:00 +++ edited/net/ipv6/addrconf.c 2004-11-09 22:44:35 +11:00 @@ -2989,6 +2989,7 @@ dst_hold(&ifp->rt->u.dst); if (ip6_ins_rt(ifp->rt, NULL, NULL)) dst_release(&ifp->rt->u.dst); + WARN_ON(ifp->dead); if (ifp->idev->cnf.forwarding) addrconf_join_anycast(ifp); break; From pp@ee.oulu.fi Sun Nov 14 14:19:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 14:19:34 -0800 (PST) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEMJQRY025777 for ; Sun, 14 Nov 2004 14:19:27 -0800 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.13.1/8.13.1) with ESMTP id iAEMJ4S6028300; Mon, 15 Nov 2004 00:19:04 +0200 (EET) Received: (from pp@localhost) by tk28.oulu.fi (8.13.0/8.13.0/Submit) id iAEMJ4bE000092; Mon, 15 Nov 2004 00:19:04 +0200 (EET) Date: Mon, 15 Nov 2004 00:19:04 +0200 From: Pekka Pietikainen To: Florian Weimer Cc: John Heffner , netdev@oss.sgi.com Subject: Re: A case AGAINST checksum offload Message-ID: <20041114221904.GA29293@ee.oulu.fi> References: <87mzxkxks5.fsf@deneb.enyo.de> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <87mzxkxks5.fsf@deneb.enyo.de> User-Agent: Mutt/1.4.2i X-archive-position: 11823 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev Content-Length: 1598 Lines: 31 On Sun, Nov 14, 2004 at 09:01:14PM +0100, Florian Weimer wrote: > * John Heffner: > > > of the TCP/UDP checksum is to detect errors occurring outside the > > protection of the link layer checksums -- errors when data is reassembled > > or copied across busses inside hosts and routers. > > The IP checksum is quite bad at catching those, though. Broken memory > banks or busses tend to introduce bit errors in distances which are > multiples of 16 bits (something like 64 or 256). Because of the way > the IP checksum works, two such errors in the same packet cancel out > and go undetected. > I was once on the receiving end of such packets, and I can tell you > it's not a fun thing to debug. 8-( Btw., "When the CRC and TCP Checksum Disagree" http://citeseer.ist.psu.edu/stone00when.html is well worth reading. Doesn't go into the offload vs. host IP checksum case too heavily, though, I'm not sure if anyone really has data on that. The impression I have is that the risk isn't that big. If you're having flipped bits in your (non-ECC :-) ) memory, you lose. If your PCI bus flips bits, you probably lose when the data is read off disk. If your NIC has a bad checksum engine, well... Then the IP checksums end up bad on the remote end, packets get dropped, people tend to notice and that chip gets host-based checksums soon enough. What definately would make sense is using user-space checksums (or just transmit output from a PRNG + the seed and compare the streams) in driver/hardware stress testing. And testing all those corner cases which the driver/NIC might have gotten wrong. From chrisw@osdl.org Sun Nov 14 14:52:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 14:52:33 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAEMqRWn026971 for ; Sun, 14 Nov 2004 14:52:28 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAEMpv912377; Sun, 14 Nov 2004 14:51:57 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAEMpvI15710; Sun, 14 Nov 2004 14:51:57 -0800 Date: Sun, 14 Nov 2004 14:51:57 -0800 From: Chris Wright To: Arnaldo Carvalho de Melo Cc: Chris Wright , davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [PATCH 6/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114145157.G2357@build.pdx.osdl.net> References: <20041114121837.X2357@build.pdx.osdl.net> <20041114122400.D2357@build.pdx.osdl.net> <4197BFC5.5080800@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <4197BFC5.5080800@conectiva.com.br>; from acme@conectiva.com.br on Sun, Nov 14, 2004 at 06:27:49PM -0200 X-archive-position: 11824 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev Content-Length: 557 Lines: 14 * Arnaldo Carvalho de Melo (acme@conectiva.com.br) wrote: > Chris, > > I think somebody proposed this in the past and it was refused > because we better get rid of the panics and return an error, propagate > it and refuse to load the module, better have the machine still alive > but without networking than panic it. Sounds good too. Part of my thinking was that these patches would be a good chance to review if these are necessarily panic conditions. What was the plan on error return, since I expect some caches are interdependent? thanks, -chris From SRS0+5e6d7bf86c1f59fcdc6e+448+infradead.org+hch@phoenix.srs.infradead.org Sun Nov 14 15:11:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 15:11:27 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAENBMkp027837 for ; Sun, 14 Nov 2004 15:11:23 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CTTWP-0002Tl-Kg; Sun, 14 Nov 2004 23:11:01 +0000 Date: Sun, 14 Nov 2004 23:11:01 +0000 From: Christoph Hellwig To: Chris Wright Cc: davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [PATCH 0/8] Use SLAB_PANIC when creating critical slab cache Message-ID: <20041114231101.GA9498@infradead.org> References: <20041114121837.X2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041114121837.X2357@build.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11825 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev Content-Length: 644 Lines: 15 On Sun, Nov 14, 2004 at 12:18:37PM -0800, Chris Wright wrote: > The following trivial patches update networking code to use the SLAB_PANIC > flag when creating a critical slab cache instead of doing localized calls > to panic(). This brings networking inline with other core kernel code. > > core/flow.c | 5 +---- > core/skbuff.c | 4 +--- > decnet/dn_route.c | 9 +++------ > ipv4/inetpeer.c | 5 +---- > ipv4/ipmr.c | 5 +---- > ipv6/ip6_fib.c | 4 +--- > ipv6/route.c | 9 +++------ > xfrm/xfrm_input.c | 4 +--- decnet, ipv6 and xfrm can be modular, so using SLAB_PANIC there is bogus. From jgarzik@pobox.com Sun Nov 14 15:49:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 15:49:48 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAENngkD028842 for ; Sun, 14 Nov 2004 15:49:43 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTU7V-0007K6-Iz; Sun, 14 Nov 2004 23:49:21 +0000 Message-ID: <4197EEF3.8040708@pobox.com> Date: Sun, 14 Nov 2004 18:49:07 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jouni Malinen CC: netdev@oss.sgi.com Subject: Re: [PATCH wireless-2.6 10/16] Host AP: Use void __iomem * with {read,write}{b,w} References: <20041108070156.GA1076@jm.kir.nu> <20041108071630.GK1076@jm.kir.nu> <419071D5.8070208@pobox.com> <20041114051847.GB14810@jm.kir.nu> In-Reply-To: <20041114051847.GB14810@jm.kir.nu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11826 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 76 Lines: 2 applied patches 10-16 to wireless-2.6 (and thus netdev-2.6, and thus -mm). From acme@conectiva.com.br Sun Nov 14 15:52:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 15:52:11 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAENq6DY029199 for ; Sun, 14 Nov 2004 15:52:07 -0800 Received: from [200.138.51.84] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTUB2-0005O1-00; Sun, 14 Nov 2004 21:53:00 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 921CF1463E; Sun, 14 Nov 2004 21:51:46 -0200 (BRST) Message-ID: <4197EF9F.50300@conectiva.com.br> Date: Sun, 14 Nov 2004 21:51:59 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Chris Wright Cc: davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [PATCH 6/8] Use SLAB_PANIC when creating critical slab cache References: <20041114121837.X2357@build.pdx.osdl.net> <20041114122400.D2357@build.pdx.osdl.net> <4197BFC5.5080800@conectiva.com.br> <20041114145157.G2357@build.pdx.osdl.net> In-Reply-To: <20041114145157.G2357@build.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11827 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 667 Lines: 22 Chris Wright wrote: > * Arnaldo Carvalho de Melo (acme@conectiva.com.br) wrote: > >>Chris, >> >> I think somebody proposed this in the past and it was refused >>because we better get rid of the panics and return an error, propagate >>it and refuse to load the module, better have the machine still alive >>but without networking than panic it. > > > Sounds good too. Part of my thinking was that these patches would be a > good chance to review if these are necessarily panic conditions. What was > the plan on error return, since I expect some caches are interdependent? I lost track, perhaps we should push this to the janitor mailing list? :-) - Arnaldo From acme@conectiva.com.br Sun Nov 14 22:19:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 22:19:45 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF6Jdx3013734 for ; Sun, 14 Nov 2004 22:19:39 -0800 Received: from [200.138.51.84] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTaE6-00067X-00; Mon, 15 Nov 2004 04:20:34 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 616211463C; Mon, 15 Nov 2004 04:19:19 -0200 (BRST) Message-ID: <41984A76.70406@conectiva.com.br> Date: Mon, 15 Nov 2004 04:19:34 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH][NET] Assign inet transport sockets to the right module Content-Type: multipart/mixed; boundary="------------060107090406070700050700" X-archive-position: 11828 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 5088 Lines: 174 This is a multi-part message in MIME format. --------------060107090406070700050700 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi David, Please take a look if it makes sense, if so please pull from: bk://kernel.bkbits.net/acme/sock-2.6 Regards, - Arnaldo --------------060107090406070700050700 Content-Type: text/plain; name="sk_prot_owner.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sk_prot_owner.patch" =================================================================== ChangeSet@1.2148, 2004-11-15 04:05:17-02:00, acme@conectiva.com.br [NET] Assign inet transport sockets to the right module This is another case where when all the protocols use sk->sk_prot we can remove another member from struct sock, sk->sk_owner, instead using the sk->sk_prot->owner, i.e. this property is not per socket instance, but per protocol. Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: David S. Miller include/net/sock.h | 2 ++ net/ipv4/af_inet.c | 2 +- net/ipv4/raw.c | 1 + net/ipv4/tcp_ipv4.c | 1 + net/ipv4/udp.c | 1 + net/ipv6/af_inet6.c | 2 +- net/ipv6/raw.c | 1 + net/ipv6/tcp_ipv6.c | 1 + net/ipv6/udp.c | 1 + net/sctp/socket.c | 2 ++ 10 files changed, 12 insertions(+), 2 deletions(-) diff -Nru a/include/net/sock.h b/include/net/sock.h --- a/include/net/sock.h 2004-11-15 04:12:55 -02:00 +++ b/include/net/sock.h 2004-11-15 04:12:55 -02:00 @@ -556,6 +556,8 @@ kmem_cache_t *slab; int slab_obj_size; + struct module *owner; + char name[32]; struct { diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv4/af_inet.c 2004-11-15 04:12:55 -02:00 @@ -309,7 +309,7 @@ inet->id = 0; sock_init_data(sock, sk); - sk_set_owner(sk, THIS_MODULE); + sk_set_owner(sk, sk->sk_prot->owner); sk->sk_destruct = inet_sock_destruct; sk->sk_family = PF_INET; diff -Nru a/net/ipv4/raw.c b/net/ipv4/raw.c --- a/net/ipv4/raw.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv4/raw.c 2004-11-15 04:12:55 -02:00 @@ -706,6 +706,7 @@ struct proto raw_prot = { .name = "RAW", + .owner = THIS_MODULE, .close = raw_close, .connect = ip4_datagram_connect, .disconnect = udp_disconnect, diff -Nru a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c --- a/net/ipv4/tcp_ipv4.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv4/tcp_ipv4.c 2004-11-15 04:12:55 -02:00 @@ -2598,6 +2598,7 @@ struct proto tcp_prot = { .name = "TCP", + .owner = THIS_MODULE, .close = tcp_close, .connect = tcp_v4_connect, .disconnect = tcp_disconnect, diff -Nru a/net/ipv4/udp.c b/net/ipv4/udp.c --- a/net/ipv4/udp.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv4/udp.c 2004-11-15 04:12:55 -02:00 @@ -1306,6 +1306,7 @@ struct proto udp_prot = { .name = "UDP", + .owner = THIS_MODULE, .close = udp_close, .connect = ip4_datagram_connect, .disconnect = udp_disconnect, diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c --- a/net/ipv6/af_inet6.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv6/af_inet6.c 2004-11-15 04:12:55 -02:00 @@ -174,7 +174,7 @@ goto out; sock_init_data(sock, sk); - sk_set_owner(sk, THIS_MODULE); + sk_set_owner(sk, sk->sk_prot->owner); rc = 0; sk->sk_prot = answer_prot; diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv6/raw.c 2004-11-15 04:12:55 -02:00 @@ -975,6 +975,7 @@ struct proto rawv6_prot = { .name = "RAW", + .owner = THIS_MODULE, .close = rawv6_close, .connect = ip6_datagram_connect, .disconnect = udp_disconnect, diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c --- a/net/ipv6/tcp_ipv6.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv6/tcp_ipv6.c 2004-11-15 04:12:55 -02:00 @@ -2132,6 +2132,7 @@ struct proto tcpv6_prot = { .name = "TCPv6", + .owner = THIS_MODULE, .close = tcp_close, .connect = tcp_v6_connect, .disconnect = tcp_disconnect, diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c --- a/net/ipv6/udp.c 2004-11-15 04:12:55 -02:00 +++ b/net/ipv6/udp.c 2004-11-15 04:12:55 -02:00 @@ -1033,6 +1033,7 @@ struct proto udpv6_prot = { .name = "UDP", + .owner = THIS_MODULE, .close = udpv6_close, .connect = ip6_datagram_connect, .disconnect = udp_disconnect, diff -Nru a/net/sctp/socket.c b/net/sctp/socket.c --- a/net/sctp/socket.c 2004-11-15 04:12:55 -02:00 +++ b/net/sctp/socket.c 2004-11-15 04:12:55 -02:00 @@ -4652,6 +4652,7 @@ /* This proto struct describes the ULP interface for SCTP. */ struct proto sctp_prot = { .name = "SCTP", + .owner = THIS_MODULE, .close = sctp_close, .connect = sctp_connect, .disconnect = sctp_disconnect, @@ -4675,6 +4676,7 @@ #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) struct proto sctpv6_prot = { .name = "SCTPv6", + .owner = THIS_MODULE, .close = sctp_close, .connect = sctp_connect, .disconnect = sctp_disconnect, --------------060107090406070700050700-- From garzik@havoc.gtf.org Sun Nov 14 22:47:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 22:47:13 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF6l8NM014747 for ; Sun, 14 Nov 2004 22:47:08 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id 157D0773F; Mon, 15 Nov 2004 01:46:44 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iAF6kin4014595; Mon, 15 Nov 2004 01:46:44 -0500 Date: Mon, 15 Nov 2004 01:46:44 -0500 From: Jeff Garzik To: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [netdrvr] netdev-2.4 queue updated Message-ID: <20041115064644.GA14578@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 11830 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 2394 Lines: 65 (this is waiting for the next Marcelo release, before going upstream) BK users: bk pull bk://gkernel.bkbits.net/netdev-2.4 Patch: http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.4/2.4.28-rc3-netdev1.patch.bz2 This will update the following files: Documentation/Configure.help | 84 -- Documentation/networking/dl2k.txt | 44 - Documentation/networking/e1000.txt | 216 +++-- drivers/net/3c59x.c | 500 ++++++++---- drivers/net/dl2k.c | 309 +++++-- drivers/net/dl2k.h | 19 drivers/net/e1000/e1000_ethtool.c | 6 drivers/net/e1000/e1000_hw.c | 25 drivers/net/e1000/e1000_main.c | 2 drivers/net/e1000/e1000_param.c | 2 drivers/net/forcedeth.c | 1020 ++++++++++++++++++-------- drivers/net/wireless/prism54/isl_38xx.c | 12 drivers/net/wireless/prism54/isl_38xx.h | 14 drivers/net/wireless/prism54/isl_ioctl.c | 24 drivers/net/wireless/prism54/islpci_dev.c | 8 drivers/net/wireless/prism54/islpci_dev.h | 2 drivers/net/wireless/prism54/islpci_hotplug.c | 2 drivers/net/wireless/prism54/prismcompat.h | 4 drivers/net/wireless/prism54/prismcompat24.h | 4 include/linux/mii.h | 7 include/linux/pci_ids.h | 11 21 files changed, 1524 insertions(+), 791 deletions(-) through these ChangeSets: : o dl2k: correct author's email Ganesh Venkatesan: o e1000: Update to Configure.help o e100: Update to Configure.help o e1000: white space corrections o e1000: driver version update o e1000: fix set ringparam for ethtool returning error o e1000: remove unused function e1000_enable_mng_pass_thru o e1000: fix set_pauseparam for fiber serdes link o e1000: Update Documentation/networking/e1000.txt Jeff Garzik: o [netdrvr dl2k] remove unused constant 'CFI' o [netdrvr dl2k] new TX scheme, fix minor bug John W. Linville: o 3c59x: resync with 2.6 Manfred Spraul: o Backport of the 0.30 forcedeth driver to 2.4. It's a new backport, starting from the 2.6 tree. Margit Schubert-While: o prism54 sparse fixes o prism54 fix resume processing o prism54 sync with 2.6 From garzik@havoc.gtf.org Sun Nov 14 22:46:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 22:46:43 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF6kanR014666 for ; Sun, 14 Nov 2004 22:46:37 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id 9B98B773F; Mon, 15 Nov 2004 01:46:09 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iAF6k9uM014568; Mon, 15 Nov 2004 01:46:09 -0500 Date: Mon, 15 Nov 2004 01:46:09 -0500 From: Jeff Garzik To: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Cc: akpm@osdl.org Subject: [netdrvr] netdev-2.6 queue updated Message-ID: <20041115064609.GA14547@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.4.1i X-archive-position: 11829 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 13449 Lines: 333 The most notable thing is the addition of HostAP. BK users: bk pull bk://gkernel.bkbits.net/netdev-2.6 Patch: http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc2-netdev1.patch.bz2 This will update the following files: MAINTAINERS | 7 drivers/net/3c505.c | 10 drivers/net/3c507.c | 148 drivers/net/3c59x.c | 1 drivers/net/8139cp.c | 102 drivers/net/8139too.c | 98 drivers/net/8390.c | 1 drivers/net/8390.h | 1 drivers/net/Kconfig | 73 drivers/net/ac3200.c | 64 drivers/net/atp.c | 2 drivers/net/bonding/bond_3ad.c | 10 drivers/net/depca.c | 24 drivers/net/e100.c | 1 drivers/net/e2100.c | 18 drivers/net/eepro100.c | 293 - drivers/net/fealnx.c | 275 - drivers/net/gt96100eth.c | 8 drivers/net/hamradio/6pack.c | 370 +- drivers/net/hp100.c | 65 drivers/net/ixgb/ixgb_main.c | 33 drivers/net/lne390.c | 64 drivers/net/mace.c | 66 drivers/net/ne3210.c | 34 drivers/net/pcmcia/fmvj18x_cs.c | 4 drivers/net/pcmcia/ibmtr_cs.c | 7 drivers/net/pcmcia/pcnet_cs.c | 39 drivers/net/pcmcia/smc91c92_cs.c | 2 drivers/net/pcmcia/xirc2ps_cs.c | 2 drivers/net/r8169.c | 855 ++++- drivers/net/s2io-regs.h | 3 drivers/net/s2io.c | 3114 ++++++++++++-------- drivers/net/s2io.h | 295 + drivers/net/sb1000.c | 14 drivers/net/sis900.c | 1 drivers/net/sk98lin/Makefile | 1 drivers/net/sk98lin/h/skdrv2nd.h | 5 drivers/net/sk98lin/skaddr.c | 2 drivers/net/sk98lin/skethtool.c | 555 +++ drivers/net/sk98lin/skge.c | 280 - drivers/net/sk98lin/skproc.c | 453 +-- drivers/net/skfp/h/fplustm.h | 6 drivers/net/skfp/h/targethw.h | 6 drivers/net/skfp/h/targetos.h | 2 drivers/net/skfp/h/types.h | 21 drivers/net/skfp/skfddi.c | 25 drivers/net/skfp/smt.c | 7 drivers/net/starfire.c | 79 drivers/net/sundance.c | 259 - drivers/net/tlan.c | 72 drivers/net/tlan.h | 88 drivers/net/tokenring/3c359.c | 36 drivers/net/tokenring/3c359.h | 2 drivers/net/tokenring/ibmtr.c | 158 - drivers/net/tokenring/lanstreamer.c | 24 drivers/net/tokenring/lanstreamer.h | 2 drivers/net/tokenring/olympic.c | 94 drivers/net/tulip/de2104x.c | 1 drivers/net/tulip/dmfe.c | 1 drivers/net/tulip/tulip_core.c | 3 drivers/net/tulip/winbond-840.c | 3 drivers/net/tulip/xircom_tulip_cb.c | 16 drivers/net/typhoon.c | 3 drivers/net/via-rhine.c | 276 - drivers/net/via-velocity.h | 4 drivers/net/wan/c101.c | 3 drivers/net/wan/cycx_drv.c | 22 drivers/net/wan/n2.c | 5 drivers/net/wireless/Kconfig | 2 drivers/net/wireless/Makefile | 2 drivers/net/wireless/airo.c | 69 drivers/net/wireless/airport.c | 5 drivers/net/wireless/arlan-main.c | 90 drivers/net/wireless/arlan-proc.c | 15 drivers/net/wireless/arlan.h | 26 drivers/net/wireless/hermes.c | 43 drivers/net/wireless/hermes.h | 62 drivers/net/wireless/hostap/Kconfig | 101 drivers/net/wireless/hostap/Makefile | 8 drivers/net/wireless/hostap/hostap.c | 1205 +++++++ drivers/net/wireless/hostap/hostap.h | 57 drivers/net/wireless/hostap/hostap_80211.h | 107 drivers/net/wireless/hostap/hostap_80211_rx.c | 1080 +++++++ drivers/net/wireless/hostap/hostap_80211_tx.c | 522 +++ drivers/net/wireless/hostap/hostap_ap.c | 3259 +++++++++++++++++++++ drivers/net/wireless/hostap/hostap_ap.h | 272 + drivers/net/wireless/hostap/hostap_common.h | 556 +++ drivers/net/wireless/hostap/hostap_config.h | 86 drivers/net/wireless/hostap/hostap_crypt.c | 167 + drivers/net/wireless/hostap/hostap_crypt.h | 50 drivers/net/wireless/hostap/hostap_crypt_ccmp.c | 486 +++ drivers/net/wireless/hostap/hostap_crypt_tkip.c | 696 ++++ drivers/net/wireless/hostap/hostap_crypt_wep.c | 281 + drivers/net/wireless/hostap/hostap_cs.c | 785 +++++ drivers/net/wireless/hostap/hostap_download.c | 761 +++++ drivers/net/wireless/hostap/hostap_hw.c | 3607 +++++++++++++++++++++++ drivers/net/wireless/hostap/hostap_info.c | 469 +++ drivers/net/wireless/hostap/hostap_ioctl.c | 3624 ++++++++++++++++++++++++ drivers/net/wireless/hostap/hostap_pci.c | 452 ++ drivers/net/wireless/hostap/hostap_plx.c | 611 ++++ drivers/net/wireless/hostap/hostap_proc.c | 466 +++ drivers/net/wireless/hostap/hostap_wlan.h | 1071 +++++++ drivers/net/wireless/netwave_cs.c | 75 drivers/net/wireless/orinoco_cs.c | 10 drivers/net/wireless/orinoco_pci.c | 7 drivers/net/wireless/orinoco_plx.c | 82 drivers/net/wireless/orinoco_tmd.c | 51 drivers/net/wireless/prism54/isl_ioctl.c | 24 drivers/net/wireless/prism54/islpci_hotplug.c | 2 drivers/net/wireless/prism54/prismcompat.h | 4 drivers/net/wireless/ray_cs.c | 4 drivers/net/wireless/wavelan_cs.c | 25 drivers/net/wireless/wavelan_cs.p.h | 1 include/linux/delay.h | 5 include/linux/ibmtr.h | 15 include/linux/pci_ids.h | 3 include/pcmcia/mem_op.h | 89 117 files changed, 26084 insertions(+), 4024 deletions(-) through these ChangeSets: : o [netdrvr 8139cp] add PCI ID : o S2io: styling o S2io: modified loadable parameters o S2io: 2 buffer mode with copy o S2io: new functions for card restart o S2io: two buffer mode o S2io: NAPI fix o S2io: new txd allocation o S2io: module loadable parameters o S2io: hardware fixes o S2io: optimizations o S2io: sw bug fixes o S2io: cosmetic changes Adrian Bunk: o net/skfp/smt.c: remove an unused function o net/3c505.c: remove unused functions o bonding: remove an unused function o net/wan/n2.c: remove an unused function Alexander Viro: o mace iomem annotations - trivial part o airo iomem annotations o wavelan_cs iomem annotations o lne390 iomem annotations and fixes o fealnx iomem annotations, switch to io{read,write} o wireless iomem annotations and fixes, switch to io{read,write} o ibmtr annotations - the rest o skfp iomem annotations, switch to io{read,write} o olympic_open() cleanup and fixes o sundance iomem annotations, switch to io{read,write} o via-rhine iomem annotations, switch to io{read,write} o net/pcmcia iomem annotations o netwave iomem annotations o arlan iomem annotations and cleanups o netdev_priv() in netwave_cs o netdev_priv() in arlan o (25/32) lanstreamer iomem annotations o beginning of ibmtr iomem annotations o e2100 iomem annotations and fixes o 3c359 iomem annotations o depca iomem annotations o killed isa_... in 3c507 o starfire iomem annotations o ne3210 iomem annotations o ac3200 iomem annotations and fixes o iomem annotations in r8169 Andrew Morton: o r8169 module_param build fix Arjan van de Ven: o ray_cs export cleanup Christoph Hellwig: o unexport ei_tx_timeout Daniele Venzano: o Add Altimata PHY to sis900 driver David Dillow: o net/typhoon.c: use previously-unused function David S. Miller: o eepro100.c iomap conversion Felipe Damasio: o 8139cp net driver: add MODULE_VERSION Franois Romieu: o r8169: netconsole support o r8169: unneeded synchronize_irq() o r8169: always clean Tx desc o r8169: cleanup o r8169: rtl8169_close() races o r8169: automatic pci dac step down o r8169: wrong advertisement of VLAN features o r8169: Tx timeout rework o r8169: default on disabling PCIDAC o r8169: Mac identifier extracted from Realtek's driver v2.2 o r8169: TSO support o r8169: hint for Tx flow control o r8169: miscalculation of available Tx descriptors o 8139cp: SG support fixes o r8169: vlan support o r8169: Rx checksum support o r8169: advertise DMA to high memory o r8169: Tx checksum offload o r8169: comment a gcc 2.95.x bug o r8169: sync the names of a few bits with the 8139cp driver o r8169: bump version number o r8169: enable MWI o r8169: code cleanup o r8169: per device receive buffer size o r8169: add ethtool_ops.{get_regs_len/get_regs} Ganesh Venkatesan: o ixgb: Condition that determines when to quit polling o ixgb: Fix memory leak in NAPI mode. Avoid unnecessary o ixgb: Fix VLAN filter setup errors (while running Jeff Garzik: o [wireless hostap] update for new pci_save_state() o [netdrvr eepro100] fix pci_iomap() args and info msg that follows o [netdrvr 8139cp] TSO support John W. Linville: o tulip: Add MODULE_VERSION o e100: Add MODULE_VERSION o r8169: Add MODULE_VERSION o 8139too: Add MODULE_VERSION o 3c59x: Add MODULE_VERSION o r8169: simplify trick if() expression o r8169: fix RxVlan bit manipulation o r8169: endian-swap return of rtl8169_tx_vlan_tag() Jouni Malinen: o Host AP: Replaced MODULE_PARM with module_param* o Host AP: Replaced direct dev->priv references with netdev_priv(dev) o Host AP: Updated to use Linux wireless extensions v17 o Host AP: pci_register_driver() return value changes o Host AP: Fix netif_carrier_off() in non-client modes o Host AP: Fix PRISM2_IO_DEBUG o Host AP: Use void __iomem * with {read,write}{b,w} o Host AP: Fix card enabling after firmware download o Host AP: Do not bridge packets to unauthorized ports o Host AP: Fix compilation with PRISM2_NO_STATION_MODES defined o Host AP: Prevent STAs from associating using AP address o Host AP: Fix hw address changing for wifi# interface o Host AP: Remove ioctl debug messages o Host AP: Ignore (Re)AssocResp messages silently o Host AP: Fix interface packet counters o Host AP: Disable EAPOL TX/RX debug messages o fix hostap crypto bugs o Add HostAP wireless driver Krzysztof Halasa: o net/wan/n2.c: remove an unused function Margit Schubert-While: o prism54 sparse fixes o prism54 fix resume processing Michal Schmidt: o sk98: add netpoll console support Nishanth Aravamudan: o net/gt96100eth: replace gt96100_delay() with msleep_interruptible() o net/sb1000: replace nicedelay() with ssleep_interruptible() o net/cycx_drv: replace delay_cycx() with ssleep_interruptible() o net/airo: replace schedule_timeout() with *sleep() variants o Add ssleep_interruptible() Ralf Bchle: o Another big 6pack patch Rene Herman: o 8139too Interframe Gap Time Roger Luethi: o mc_filter on big-endian arch Steffen Klassert: o 8139cp - add netpoll support Stephen Hemminger: o sk98: ethtool pause param support o sk98: ethtool phy support o sk98: basic ethtool support o sk98: use module_param o sk98: use netdev_priv o sk98: /proc interface related changes o sk98: local variable can be constant o sk98: no explicit module ref counting needed o xircom_tulip_cb: convert to using module_param o tlan: enable faster hash function o tlan: make inline's static (rev2) o tlan: get rid of unneeded global vars (rev 2) o tlan: use netdev_priv (rev 2) o hp100: use inline for comple usage of dev->priv o hp100: use netdev_priv (rev 2) o via-velocity: get rid of unused global o via-rhine: free_ring should be static o via-rhine: use module_param o 8139too: use netdev_priv o r8169: use netdev_priv o r8169: use module_param o 8139cp - module_param Thomas Gleixner: o rtl8139too.c: Fix missing pci_disable_dev o rtl8139too.c: Fix missing pci_disable_dev Tom Rini: o IBM EMAC Kconfig changes: Add 'select CRC32' o IBM EMAC Kconfig changes From wichert@levante.wiggy.net Sun Nov 14 23:50:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 23:50:18 -0800 (PST) Received: from mx1.wiggy.net (levante.wiggy.net [195.85.225.139]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF7oANo016564 for ; Sun, 14 Nov 2004 23:50:11 -0800 Received: from wichert by mx1.wiggy.net with local (Exim 4.34) id 1CTbcT-0006KL-VL; Mon, 15 Nov 2004 08:49:49 +0100 Date: Mon, 15 Nov 2004 08:49:49 +0100 From: Wichert Akkerman To: Jeff Garzik Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, akpm@osdl.org Subject: Re: [netdrvr] netdev-2.6 queue updated Message-ID: <20041115074949.GA9481@wiggy.net> Mail-Followup-To: Jeff Garzik , netdev@oss.sgi.com, linux-kernel@vger.kernel.org, akpm@osdl.org References: <20041115064609.GA14547@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041115064609.GA14547@havoc.gtf.org> User-Agent: Mutt/1.5.6+20040722i X-SA-Exim-Connect-IP: X-archive-position: 11831 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wichert@wiggy.net Precedence: bulk X-list: netdev Content-Length: 356 Lines: 13 Hi Jeff, Previously Jeff Garzik wrote: > The most notable thing is the addition of HostAP. I was expecting to see that pulled in through the wireless tree; does this have any affect on that tree? Wichert. -- Wichert Akkerman It is simple to make things. http://www.wiggy.net/ It is hard to make things simple. From paul@clubi.ie Sun Nov 14 23:53:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 14 Nov 2004 23:53:37 -0800 (PST) Received: from hibernia.jakma.org (hibernia.jakma.org [212.17.55.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF7rSbj016929 for ; Sun, 14 Nov 2004 23:53:30 -0800 Received: from hibernia.jakma.org (IDENT:paul@hibernia.jakma.org [192.168.0.3]) by hibernia.jakma.org (8.12.11/8.12.11) with ESMTP id iAF7qot4008856; Mon, 15 Nov 2004 07:52:50 GMT Date: Mon, 15 Nov 2004 07:52:50 +0000 (GMT) From: Paul Jakma X-X-Sender: paul@hibernia.jakma.org To: Jeff Garzik cc: Thomas Spatzier , linux-kernel@vger.kernel.org, Netdev Subject: Re: [patch 4/10] s390: network driver. In-Reply-To: <4196B4E9.40502@pobox.com> Message-ID: References: <4196B4E9.40502@pobox.com> Mail-Followup-To: paul@hibernia.jakma.org X-NSA: arafat al aqsar jihad musharef jet-A1 avgas ammonium qran inshallah allah al-akbar martyr iraq saddam hammas hisballah rabin ayatollah korea vietnam revolt mustard gas british airways washington MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 11832 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@clubi.ie Precedence: bulk X-list: netdev Content-Length: 1549 Lines: 42 On Sat, 13 Nov 2004, Jeff Garzik wrote: > Queues are DESIGNED to fill up under various conditions. What happens when they are full? Blocking isnt good, at least not from GNU Zebra / Quagga's POV. > Would not the zebra routing software have the same problems with > cable pull under an e1000 or tg3 gigabit NIC? If they block further writes, yes. > The most popular drivers -- e1000, tg3, etc. -- do not do this, for > very good reasons. The problem is that GNU Zebra / Quagga uses a single raw socket for certain protocols, eg OSPF. Blocking the socket because one NIC has a cable pulled is undesireable, and there's no point queueing the packets, by the time the link comes back, if ever, its highly unlikely there is any use in sending the packets (sending OSPF hello's from X minutes ago on a link that just came back is useless). The kernel really shouldnt get too much in the way of an application that already is fully aware of reliability issues[1] - at least that is the application's expectation in this case. We could change it to use a socket/interface on Linux, but it seems a bit unnecessary to me, at least for raw socket/included-header sockets. > Jeff 1. an application must be if its uses raw sockets surely? Even for non-raw/header-included sockets, eg BGP tcp sockets, a user like GNU Zebra / Quagga would much prefer packets to be dropped. regards, -- Paul Jakma paul@clubi.ie paul@jakma.org Key ID: 64A2FF6A Fortune: My interest is in the future because I am going to spend the rest of my life there. From yi.zhu@intel.com Mon Nov 15 01:34:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 01:34:38 -0800 (PST) Received: from orsfmr003.jf.intel.com (fmr18.intel.com [134.134.136.17]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAF9YX33023171 for ; Mon, 15 Nov 2004 01:34:34 -0800 Received: from petasus.jf.intel.com (petasus.jf.intel.com [10.7.209.6]) by orsfmr003.jf.intel.com (8.12.10/8.12.10/d: major-outer.mc,v 1.1 2004/09/17 17:50:56 root Exp $) with ESMTP id iAF9Y47Z002013; Mon, 15 Nov 2004 09:34:04 GMT Received: from pdsmsxvs01.pd.intel.com (pdsmsxvs01.pd.intel.com [172.16.12.122]) by petasus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.11 2004/07/29 22:51:53 root Exp $) with SMTP id iAF9c77n030086; Mon, 15 Nov 2004 09:38:08 GMT Received: from pdsmsx331.ccr.corp.intel.com ([172.16.12.58]) by pdsmsxvs01.pd.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004111517340102506 ; Mon, 15 Nov 2004 17:34:01 +0800 Received: from pdsmsx403.ccr.corp.intel.com ([172.16.12.55]) by pdsmsx331.ccr.corp.intel.com with Microsoft SMTPSVC(6.0.3790.0); Mon, 15 Nov 2004 17:34:01 +0800 X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Subject: RE: [netdrvr] netdev-2.6 queue updated Date: Mon, 15 Nov 2004 17:34:00 +0800 Message-ID: <3ACA40606221794F80A5670F0AF15F8403BD583B@pdsmsx403> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [netdrvr] netdev-2.6 queue updated Thread-Index: AcTK4AvrLwQgEPrBTA2P6fIEjREiCQAFV13Q From: "Zhu, Yi" To: "Jeff Garzik" , , Cc: X-OriginalArrivalTime: 15 Nov 2004 09:34:01.0485 (UTC) FILETIME=[3D71CBD0:01C4CAF6] X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iAF9YX33023171 X-archive-position: 11833 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yi.zhu@intel.com Precedence: bulk X-list: netdev Jeff Garzik wrote: > The most notable thing is the addition of HostAP. How about move HostAP 802.11 stack and crypt related files to net/80211? It is generic and some other drivers (i.e. ipw2100) share the code. Do you receive patches to do this? Thanks, -yi From kaber@trash.net Mon Nov 15 02:29:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 02:29:13 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFAT0eH025593 for ; Mon, 15 Nov 2004 02:29:00 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CTe62-0006Dx-RA; Mon, 15 Nov 2004 11:28:30 +0100 Message-ID: <419884CE.2080406@trash.net> Date: Mon, 15 Nov 2004 11:28:30 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, sri@us.ibm.com Subject: [PATCH 2.4 SCTP]: Fix inetaddr notifier chain corruption Content-Type: multipart/mixed; boundary="------------090602060505050700000305" X-archive-position: 11834 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------090602060505050700000305 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Backport of 2.6 patch: SCTP corrupts the inetaddr notifier chain by registering the same notifier block twice. --------------090602060505050700000305 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/15 11:25:40+01:00 kaber@coreworks.de # [SCTP]: Fix inetaddr notifier chain corruption # # Signed-off-by: Patrick McHardy # # net/sctp/protocol.c # 2004/11/15 11:25:38+01:00 kaber@coreworks.de +3 -3 # [SCTP]: Fix inetaddr notifier chain corruption # # Signed-off-by: Patrick McHardy # # net/sctp/ipv6.c # 2004/11/15 11:25:38+01:00 kaber@coreworks.de +6 -3 # [SCTP]: Fix inetaddr notifier chain corruption # # Signed-off-by: Patrick McHardy # diff -Nru a/net/sctp/ipv6.c b/net/sctp/ipv6.c --- a/net/sctp/ipv6.c 2004-11-15 11:25:51 +01:00 +++ b/net/sctp/ipv6.c 2004-11-15 11:25:51 +01:00 @@ -78,7 +78,10 @@ #include -extern struct notifier_block sctp_inetaddr_notifier; +extern int sctp_inetaddr_event(struct notifier_block *, unsigned long, void *); +static struct notifier_block sctp_inet6addr_notifier = { + .notifier_call = sctp_inetaddr_event, +}; /* FIXME: This macro needs to be moved to a common header file. */ #define NIP6(addr) \ @@ -980,7 +983,7 @@ sctp_register_af(&sctp_ipv6_specific); /* Register notifier for inet6 address additions/deletions. */ - register_inet6addr_notifier(&sctp_inetaddr_notifier); + register_inet6addr_notifier(&sctp_inet6addr_notifier); return 0; } @@ -992,5 +995,5 @@ inet6_del_protocol(&sctpv6_protocol); inet6_unregister_protosw(&sctpv6_seqpacket_protosw); inet6_unregister_protosw(&sctpv6_stream_protosw); - unregister_inet6addr_notifier(&sctp_inetaddr_notifier); + unregister_inet6addr_notifier(&sctp_inet6addr_notifier); } diff -Nru a/net/sctp/protocol.c b/net/sctp/protocol.c --- a/net/sctp/protocol.c 2004-11-15 11:25:51 +01:00 +++ b/net/sctp/protocol.c 2004-11-15 11:25:51 +01:00 @@ -621,8 +621,8 @@ /* Event handler for inet address addition/deletion events. * Basically, whenever there is an event, we re-build our local address list. */ -static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev, - void *ptr) +int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev, + void *ptr) { unsigned long flags; @@ -823,7 +823,7 @@ }; /* Notifier for inetaddr addition/deletion events. */ -struct notifier_block sctp_inetaddr_notifier = { +static struct notifier_block sctp_inetaddr_notifier = { .notifier_call = sctp_inetaddr_event, }; --------------090602060505050700000305-- From 7.e.Q@syncro-community.de Mon Nov 15 04:32:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 04:32:44 -0800 (PST) Received: from mail.hostunreachable.de (knserv.hostunreachable.de [212.72.163.70]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFCWdDn002165 for ; Mon, 15 Nov 2004 04:32:40 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.hostunreachable.de (Postfix) with ESMTP id 34F6461DD6 for ; Mon, 15 Nov 2004 13:32:18 +0100 (CET) Received: from mail.hostunreachable.de ([127.0.0.1]) by localhost (knserv [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 04556-06 for ; Mon, 15 Nov 2004 13:32:16 +0100 (CET) Received: from [127.0.0.1] (d020244.adsl.hansenet.de [80.171.20.244]) by mail.hostunreachable.de (Postfix) with ESMTP id D323A61DD3 for ; Mon, 15 Nov 2004 13:32:15 +0100 (CET) Message-ID: <4198A1CE.7040905@syncro-community.de> Date: Mon, 15 Nov 2004 13:32:14 +0100 From: Hendrik Wiese <7.e.Q@syncro-community.de> User-Agent: Mozilla Thunderbird 0.9 (Windows/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: driver ability to use iptables? Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hostunreachable.de X-archive-position: 11835 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: 7.e.Q@syncro-community.de Precedence: bulk X-list: netdev Hello there, I hope I do right posting this here. So please don't be angry if I'm wrong. I'm kind of newbie. We developed a driver which puts an IP-layer onto the VME-bus. So we are able to do normal network traffic over the VME-bus, transfer files between active VME modules and so on. But as soon as we want to use iptables to establish one of the modules as a router to the outer world (tp network connected via front panel eth device) this doesn't work... everything is configured correctly as it works for to eth devices. Is there any ability else a network device driver must have to work with iptables? Thanks in advance kind regards Hendrik (Germany) PS: kernel is version 2.6.7, System is an LFS 5 From mroos@linux.ee Mon Nov 15 04:37:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 04:37:27 -0800 (PST) Received: from math.ut.ee (math.ut.ee [193.40.5.125]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFCbJmf002656 for ; Mon, 15 Nov 2004 04:37:21 -0800 Received: from math.ut.ee (localhost [IPv6:::1]) by math.ut.ee (8.12.8+Sun/8.12.8/math-1.2) with ESMTP id iAFCb0bE012992 for ; Mon, 15 Nov 2004 14:37:00 +0200 (EET) Received: from localhost (mroos@localhost) by math.ut.ee (8.12.8+Sun/8.12.2/Submit) with ESMTP id iAFCauNQ012968 for ; Mon, 15 Nov 2004 14:37:00 +0200 (EET) X-Authentication-Warning: math.ut.ee: mroos owned process doing -bs Date: Mon, 15 Nov 2004 14:36:56 +0200 (EET) From: Meelis Roos To: netdev@oss.sgi.com Subject: 2.6.10-rc2: still no ipv6 link-local addresses Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 11836 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mroos@linux.ee Precedence: bulk X-list: netdev I tried 2.6.10-rc2 and it still does not give lipv6 link-local address to Ethernet interfaces (I tried NICs with e100 and 8139too drivers). This is broken since 2.6.9. -- Meelis Roos (mroos@linux.ee) From jgarzik@pobox.com Mon Nov 15 05:14:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 05:14:51 -0800 (PST) Received: from pobox.com ([61.182.251.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFDEGA0004279 for ; Mon, 15 Nov 2004 05:14:17 -0800 Message-Id: <200411151314.iAFDEGA0004279@oss.sgi.com> From: jgarzik@pobox.com To: netdev@oss.sgi.com Subject: pxuzqemrwqcvt Date: Mon, 15 Nov 2004 21:10:56 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0002_35ED0952.0CE1C3CD" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 11837 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0002_35ED0952.0CE1C3CD Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Mail failed. For further assistance, please contact! ------=_NextPart_000_0002_35ED0952.0CE1C3CD Content-Type: application/octet-stream; name="data.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="data.zip" UEsDBAoAAAAAAFxpbzE5ybvqAAQCAAAEAgBSAAAAZGF0YS50eHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNjck1a kAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AOAAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2Rl Lg0NCiQAAAAAAAAAlTT7YdFVlTLRVZUy0VWVMoh2hjLTVZUyqkmZMtNVlTJSSZsywFWVMjlKnzKN VZUys0qGMsBVlTLRVZQyZFWVMjlKnjL9VZUyUmljaNFVlTIAAAAAAAAAAAAAAAAYWRh4UEUAAEwB CgBVjm1AAAAAAAAAAADgAA8BCwEGAAAQAQAA8AIAAAAAAAGABAAAEAAAACABAAAAQAAAEAAAAAIA AAQAAAAAAAAABAAAAAAAAAAAoAQAAAYAAHd/AgACAAAAAAAQAAAQAAAAABAAABAAAAAAAAAQAAAA AAAAAAAAAACsjwQALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSPBAAIAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAEAAudGV4dAAAAAAQAQAAEAAAAJwAAAAGAAAAAAAAAAAAAAAAAABAAADALnJk YXRhAAAAIAAAACABAAASAAAAogAAAAAAAAAAAAAAAAAAQAAAwC5kYXRhAAAAANACAABAAQAACgEA ALQAAAAAAAAAAAAAAAAAAEAAAMAuamRwYWNrAAAQAAAAEAQAAAoAAAC+AQAAAAAAAAAAAAAAAABA AADALmFzcGFjawAAIAAAACAEAAAOAAAAyAEAAAAAAAAAAAAAAAAAQAAAwC5kYXRhAAAAABAAAABA BAAAAAAAANYBAAAAAAAAAAAAAAAAAEAAAMAuYXNwYWNrAAAgAAAAUAQAAA4AAADWAQAAAAAAAAAA AAAAAABAAADALmRhdGEAAAAAEAAAAHAEAAAAAAAA5AEAAAAAAAAAAAAAAAAAQAAAwC5hc3BhY2sA ABAAAACABAAAEAAAAOQBAAAAAAAAAAAAAAAAAEAAAMAuYWRhdGEAAAAQAAAAkAQAABAAAAD0AQAA AAAAAAAAAAAAAABAAADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKqgAKR sqqAEiEGg7u7u4bGmx3TYQdw2O7u7vB3dYO7vB3d3CAQd3CAVe1O2M9YT1TlTlTlT+p2p21vr/3/ sf7GLIZ1rWdfHJxABMxBmIQIlTbaYUjhW2wAAfzdrlwN323V2HJZ2FzakcPWr7TX9hxz9PEL/gX5 emTNZPzOvO48IWXZ1lnWjGfBQXylM6IlJSeKRQZsjF7Fo1VQOY/zudGA9Jee1s3ZPttAcBNO+53o SpjE71OqnNkH72ySfUSt/qxFzFw1MY5lzwtJ+LxismacX4q4vG1ME1+oqqkpSLE+zQBFEI9/Tl+w pCNYV8/MoECrOzDNaIwlKtZAZM2vfJSeFVol0YtRhNm/blvIayuxTq2Yh3HPwwuCpRv62mb4nAiI tDohk8X/M4YnqlL1ZXEL95wUV9XeI7ZNf4JxxAU3IZW4ZB0apUabpe2xk4/Mrqea27VT1W5J2iuk 6+7pZu7YnUsiM5QQT8yyh2dGZBlrIsilvOmVSm2auHbfscxVoc6AG4ZKuroD24xslpwKYM2no+Bq YLvNz/ZVzLI6EO0wHMR86bGjb88L5Exwn/2e3NYflS6zLxagpdi2NipTPhVs5li25p0uB1I/4EsL 1j/PXwa4kw/7gYLGtxPXiVmJw5E63HhlXFtOiYZDUXB5FDnm4Mw1TfXJH3jQJX79jYdGSVFtTgye N8qPq0kgzZgbRa24TGJ/EAcsUJIjeztuZW6qyZyR0j2uc3TPDpBO4+smmgfgEIOMXuJqNYQpIZVj YMF0dp16Ox731mH4I3t8p9EGQ4bycuv8EDXl+xJbd+f9sSA1gctQSkP1+7ZrYDwaP/CSz7WW5azT KQC6SJ7uY+6uuunOqVhGvCICTlmHDBmNRl4g9zpENWEMB9PETePnDjxj4/zx9D2+Tq4KEOHjLa+9 nXuAmWfm1pknzeniiqxSOKILsIbBbjYvAmDHhCR/K+z764GqqFN3qfjH/SbvRPqCXP420YYf2NhN 1x3qvXZbiPwVa2NJ+7bHivuEAd9TlllZnZg4mJ3vrXD6FJ4Ow+H4cFL7xTXsG/6gDWPybPagyCmp 7+it1aADD4MUgk0Yp3XZM1rNfYyr3cCdnEpW1V7bSJ4ya017F/luoPK+cpIefuczaX5LRfw7KF1t eDOFLqblV1AbtMbYkh++QL/9YlQwcrI1hNOkYyt5zEWSdWki0KTLbGsZs3vgPvk6oUXOekjqp5ee e747IYMl2/QrLss7lAb8aSN5gJQhwYDdqg+dHMxa0wxCGVIyZnuUqehUakC+sOGXYUaUvUZ8eiVM pLAbRU+6TxEMX5hod6kiw8zDlT+ETiLTtXyA5tsd+wNrk954jdPKu7jpyrIXV1gq2w2P+dNZx5BW aUKxkWAcoFpx16jVHXO78JxlzBGT+Y3DN7Qyysi0IWdgfqQ4JSPKCig9taXcB8Jo2WE0QVvhKwXI RBX6N0U8r0vwMp4FRjmec/oA+pjyZ1lR6axleqtV4NEnoYFXVoT9DSmx8di1yI3qifvkHsnsu4oL bsbnW9bSpyug0jX8ak13uNryE4MItphM6XRC+79JZv7Oa8ctct51WPURhXhTS9aMtaNo8R6bxz7F W6y3InPQNOW5N/DWmJzBz/NU8huBH2yveu1edOS0qxkG7wXR4lT6fL6jJu1GJO2FeYVuseuS73yR 3L9D8uv349Xq6NcGU/ZajhkMom2eC3pftURjyrCNoQLYn/bOOmq2uzS9xoMvwiuBGYt/tsS+ExGG 0VkFHuvvPBHP6d+ZG8CZfQ1AChul9MMj9rH4D8eyxSUUeRn0e311pig7gJcvJKRxpYBO3gzGmH0k 9QB/1lBaYrU1ip4xcoXlHRlbH3CuSzIU8HAxyf2VXcZFuEeqWMbfA329yEZ6eY25JROfNLpLlVmi i7J/eNaLQS3q1zsMWhWJ7zAWtSk858ZgA/meTZqgBm8Dal1CmHQWtIFmtYZibhAiTnoQM1g9Pp6J Hu/C+DCNBhCbjMQmw0140VkJObR6O9nLcYyiaK3bJUg6pg/sjP3Z9zWuye8+ooeWnkpRQyOegO+8 y1o5mwP/LT8zV4hFstk76Nv959ikFul59ne4ARD5wfj3x2gK11LzplEvJMc3tLuQYaP/Y2fnQ+GK 8n6xHu3kUUUMBluy9RZFtjCMO8xuIn6WkeYsLAzX+h/uc5ca0HCgRSGMu0qkOqKhf2VEGHWUy8xF BQppuzA0tHyht/GuaAxIT7hZyIwnf+E9y5zCo9HKJLOAWAiGVBHr4wHiT+n0a1rvJbPgy5QlXfaL 0QEp9CWJ8V3Ran4iCHGgtyj78Ox9GGdsLHw97zdSgG7Ca8P5jVGpm6c/hcL8aY8QRizkrBNLMKIy 58tiI1tNBAORF3kQrroteFbkN9AEPz7MgJDTC+fEQgmF/sVhBTNjeKFGSMQieRS3VmypVXfYTC1t daixLVhEntkgRGDuEXXEUcv/BRrsZJ51fGpD5UBcedPOQd8vRV8vsFZnUy0J/wDA8YMYZPfPw89E glt1MNQxbpv18D8Zwc+LukyL2qQ7uxU1eGKxY4xgT9luXxKg1U4q/1NRld9nNLdXzc+n3K6Bdvyb e812bD71GIgmmu+fyx/dF0uhICARCGU+nd7khBj6dcSFz77vXuesOnj5hkpJ9h1bK7h2kOTDscAI y/Edc5CLJnh7yDZg3eNOoLdh75p37IOshNfGg/DAgIVsZJ/cTSkLpUGR8714ZUNTAp7BpZaoVMRJ +Dayo3jb9yTvfRG5lnuPZYpa9/pX/s4djM2SdpOp9Ov+r3mCXgEjl/jBbXwQGbBWybWcplTjnl70 CHztl10H5UWwLfRknP6P6n+zlSrc/Go5oEG7x7rpH6MFTawU1iWtK8bI9mWhIuNVNd8o7Q5GaSr9 N1qxHxeIpqi1IRq2rfxBnL/fciddr8qnR30gK5cJrAEKn7pAeAnhIUVCnUnw7+uUcqF9k3EvX+9a sQzYVWHu5jw0eHlxiHvlTQaHtgqfrDIIJp6QZMOqKlK+Um2sSxP/UZqUXyEXsmhO4x3D92hlHtGP XqXXcRmmq7d1OP983E6fbLv83F37nMRbk7jcIaQpZchH3AvfXcJvlrC7QTl6PdAJ/SMNwDEXYEjt bCUrJLFYC3qvfKxiGdXqSudaRiNkHPv24uMLGovHjb46DlZKjpgOQZHLIgn3hrXrWSoUSMFKzqSd heowGgX/mOFl0UebgPuB2+UGtsVcq6Orb/yux4dnkMzFxyEaGJ4hiJhDck4XWD016Otq6q20Oln1 ZqN+aC5Pp84yvnydFK9Jn2NyukWbTezM8Fa8g8YxGWkW8urROo32/gOwBeKzBWteb0UXjXKCIaUG 8QxWivL+xw52DWPK71pt6wHMt2i5cz6sPk02lK4wwa4heVq24PANUOoO4Sa0vi8CFxpsibZv6waU 79VV12Y6bBjW1TBA/EMrHMg5St/783ELBELB43ltp3Z2syLOdBSTlpuukYiBH+kPEaR7zKsdMS3p igiLKrpY48XsGcQzHg96uTlUFyo8l96dIhSzfr0DB7GFEh8ifp44ic4/1D5vv1ZyvPxeztWeNk4J c/kCtbFZ9N6n0H2SzZmISfLUqOyaNPqIacP+mx/cUOjaJ31b85LrJAvjRN39yFrH3cRSvT3SgGbP LSdUziawT2l8M0mQ+W+gkHI0xQ26GS0dIl2vNFDuvYcvkE+Uu8nsL+gVxh7XeSZTg9g0HNdCG1p5 lin/9PwE5pVpa4QguOMreWUmi2QQLgBtqdk+NYMAYnqf43+luxl4MQqkFGACzjbC7XgyEu9Zad7R rKzp/4lgrJaQod5lADFlwz39OeiObC6UCvDxBhE3KDOCcPW3mQTKBTOWbJgUk4vILrkPO3oL7aM7 Hrtl29orYUc08gwQ8Fxdqz9A3iX4j1h3Ki56U/TNr6S0Bns08vgsCYwIWs4tiGnNTju2aSjzP5cS XaTJVHpmkiaklrB3JWxlYRFjC5Xwiq4vO+zohyxurUSW5868J/UJTZK57sbk0TuCfTM7nI7g9wbD RdrHe2oc+X1WfXIPP1MmcFBkkJ+HlyInHcR1mgC7Pd0xpxtl5apAcyld6WG4tMsdJJ8aEG6YEw47 c6p+BQI6YnmFsGzZVcWUcq5/fhpQLpkjT2gxT7g9ZIJs6qpvnvv1GEunjZxKh5kvMQ0drbhMtbLG gzm5OkSCLdYHGjsmr7Rilcx8sq0T5Wa9ZTVwspn7t4vw/HkfUmeVcNOLIM2ri7Q7hzxejB9QCK63 y07zdcEvW3J5RHGAbSV4dtRads1tIiUHt5XJDhG5kB5tnnnX/6yHUgqRpeYiB6zvAhQe9oOjxzwe uFXxtBOqweFsWQRzwbLvfL2thwH+iS3nLdcm4GAZEHB9Jx+2EY5lpFEBzEgtpg8vzRJs7BE27P2D KQSF9XXnXKuFh5JHJvoVklJyRRtAIkjBoko+Kut4Spfpn1WjpouBR1xPsCEVoi5hhpJAAvN44rL+ QkCfTNGqjUjIRPtKbZjKqyYVZy6IY9FndKp973m0s5d9PxV6ytkvMEsla+VL0NVlDnB3KDFnRE5S o4uukSfgzpamqB5+IQbMg/kVr99RH7x3J4DkVtlyNrvRZUzAlHMHfV5IfsLsKx+dLnhDWIry/WY4 CPxl+XNvSkd7jK0i7WJVXPWwwe9xycwUybtP7Ke64f/Y2/6ZGvdo9KaiWPXfacr69S+Wel5hDOG7 KohfMSBiMny00CvFv6GmCPwcqQNVRIj7gWq1XaStShv3Gy6dj7vDvhMvrMK5/AUzx84KkqEtdOnG 52ZPFf7bBAMh9EkK9GfGFVHLmEiTa9A8XhmoWYgkiVwc105RRGzwCQ7E9yy4NahVnUyvoBcUogCO VWZ8O+rnFGsrCjjWv4+a3sagM7Kdp/kjiiMqQnLGL3Puz2Fl0q6J3wGkj4Rih0owL51hXqGJ9yIZ VVw9uvYVcL6fzA36+HnHEmGRq1eAb1yiFIl6DUM9ccwQrwxIEihL63qSbbsUND4akd8NxEymgMc9 mpQIcuokMMT121GUzTNaQ8in5VGHy84s6Qn84jhkxP5wdlipZ7PHv6Q2POZPdwQFAHrr26mQaaFj OnW6lOmXRGSBhXyLUsx3NZK93HlQi8LoVtZqzKKYy9laB4mYkpYL17BVmC36wNOXpmme4x6saXcw 2CDmPMazeFu24wfDSxVuQ2/zM4U+qmoL1IeR6fOdcVSpxfkmF13UKuBxW7jn2+fZ5zmpKOjQucEp gC9uQfj5eW1SbduCKXn4O3IXbAm8ubqOZAhnAI8kT7AIFyASG5r1a6G3Hn2pCflaLEIWlyqCigFM jvVtPi6HxbxNFsQyPNOEEvLzHPiVH63ww5AvhVsf1tqbN3xXhlzrMhGPDsi/1fWtK1gwv1JJED7+ qSz6p4IWP9c8eoz3CcK67ZgH7vkKXIXSSTmdM6CzSAkbhzQ6Nkh/oGFati3dUi1/rO69muMpnMcL tZDt/bdiFDpzoF+sR0XTO8GG7Bq9EfivwVEV+veTpwfP2biH9fbdeenCvGRnUT164x/fWtzVf3q6 BXQ9fsBSWzQfFIWAMjhvkCnJlsU5byqcf76V8bQz7diSytPDRfzUl5DnwFEk2N+0zO92CeXQU8R/ ml79scxlr1R+GhV7JDsmiMirbgXoRkRFh88nT/B+t54ITPAy9WCelin0eROum5Y34lcoJlllnVJu HvTkjCcaTqewVDFwdKmHjcOv0+TU+ZNSrczv3ERPpWTTKMKnWlQENsSz31782+nMB81zSynpfyKH Nzf7nv7OcMDymuv/OvfT+ee51n6zwoXrauFTx5LXwek0C2aanu3IS2Li+Or1KbO3Eydrt7XqNND3 3f7ZWZYmUuUd7B2RBiJGOmcqIROmIeiSTAeK1VLDGLzNZBF4+NwvQ5g1JRozOt2f0OeTQBfx8PBj lNUJnveJjmM0q0cx2hKbANSVDf7gHGFMiT/dB0WV/wEaX2WVfAE5w9FONOwsbbPC8uz564tub71Q 6Hdai9xztq1cIzziakBTTJqMiGGJIGBFkAyCrVy7m4rlasemzchR25kk4qdIJydp9RcNza2reFcD bcN8/NPSkbAUxIdpFXwlhSEMOhPj590la5XNOCv10IP27GtFbmLyV+4Wekg8WgXNouzA+jlNWz70 JI3749iYrUXwuSoeWEesBylRMlmxWXAw9f4Iva5uXi/rJCvUd9UeUFqOL9sGQUqDsdpbhAk3dW22 OCbwZPdOW/WsRCPQkEa82NtMyN1KHRnxFTJtf6Imr0CYSq7zyC57ecXIE/43jBA3sZfdSwkkXIXD 2xe+IV52LbcRixEdhWiBA+x1vto4o/1j3tdsGAFEaHU7tnenCnj66qH0ZOjKy38Su+Sz6P9PMV0a jcT7jf00dttyVPEqazaS15spV/fw7Q5jhG25k7fatagFswHipKgI2JVoH1X7jZiejd8QU1s5LBUi 5BZ30D3dfm9+M8q4GK6GL1OdyHK3XMn1VgdFG50KlCAWw83/l7P7zeOJyloyFVj/v+iKaZDHuyFS bkAmKNYUdUhZbjq2Gcl4VL4MpRVoIVqZkDL5NRecGTwAKf7IT/mN+l0nhAqTc3h/Zhj/GXIXxcGU 37sNzkCQ3pfCzIJGxUhz4HUl8R3HAdhZWFyuoSEayzSSFCggIpzvg9L/ikxGyGjr4J+muJvPwkxl 398mE3dBF3uGPdnUz/H0ShR+mmRvH+fAm7D+hS0xQz0VCVsNEO2pu43mPw2o5JodkmOkfB//82+m y7wX72mtawJs6h3TR4KmM7NeQvI+buHFXtMx6N7tOYpqKpVyaTpp9DPtG3+QF8NC7qNv1z6k+yjP u74IVYEaNSPQYhL5wuQVlrvaFXtkrEb7n3Nu1rOsu+GN9WPrP0rabFW5FjBelFikc5U3SLuZ5CgB CUBT7aH5zSJFN/bj40/bMldbwML8KljgpMMlrskd+GqUIvmyhSViWaExaCSkrsW5sdDZiKF0d9SO L+pjYqF3mBNIZsQtxYxB6WYsaanJQndprtz7tWYMswdusURBSNA2ar4PiMGCFmiEqlDhT/NLfwEW 3Dw0JThA+E55fYp26ZibuDQ8AdmLtAIgmvOQn7v/4buPq/UVPwx59NH8/x7i8B9b3clEH/ttt2GX tXO0Jm5Bx0970mNZtdlUqO9sKlYPzDrXsRdU40NCWLDU2sZO7nH1sqRNw033vyIzzxvoGBg5PaRs wgYZQGmY2MqE2Ce35VB/EVK9LcI+WA8ZT2ccV0DqFs1F2gXs1Fymq418fvL9cwylbS5CC3PuWL5b 2vS3B2LNiF45YHbaCh5NbaaP/XeUnHiiQOwfcfmnrXU9UxWTuuEUSlCNozW+0JmnmyGwLPw58lUg OdNhfeQJ62hX+DfwryWc3HrxI0uesekZOYRRn1kDQVL/MFmfq3GOQjtljr6B3wxHkFzZIsaBG/av rylQUFZw3eVKTUnJB8bP2HnX3zb1s81TMq3fkgiKiLa9jQPavSsu+cqjFm9E+N8nZUNbbH5ojMNz qKZ1p/693LzDnn9BMOw5BSo3NyMUIv0hh9hufFx0jmaSrSYqWIQPneStf1Fu/7+Vd0ciSU6oQft0 gIOsThm87nB7mSdj742r5UMwNFHsYxxyrzgcCMNBophFwAFC9HDYYrrMo0ITQLga5yuPVNvc1+Ml 9j8l3iUQAWnUK/X9QIn2PNviHqF+4b0uMExzhNgg7pD+vV9HmbueXiMFcZvVID9albbaFlGCGjgN R7XIv0hEIesAmCkk84qIGcPn/y3BIzXava9xmA2rlxcRB+i+z9WZa3P/DLejsrzcXaYnvs2mB8Cy 4+OOMQlLgAB7I4t89RPjrkfZb2JXKuU/KYrFgDCIS1fGifX1cyCIcxJXUraI7jlFSU7BGUiSvQTm WfnLtQgbIa25ieZMyGaiXwO6Upv+mmohYzcosKwpm8KZ6ORDrLH3stMmscC03tRGY65TuG/8f55A SrG9DnzO5bdXWc2Xa6LX4VwYEsCQ8FtOmAsNijTotoUTAGQ1puIwaOpwhxTKbFoShqQl5mM1/TtA SeBl61NBeqee+a5+jQT0704QWbZalASMAlNYwmPU+uqCsCdIzlDdF6awR9lBvrBaMrq7GORHK/dd 7bZqkWvEEFSODIXhy3sPooK0xqQ8HVPSWkUGqXoGOs+p7uqppB0jY1BlObSWlbHz8At318xwyJnX 86zTyqB+Ncqq8E/iKHhBBOS91xV5nhAKfS4kaI+sj6LX/iG0KBdpJtFXhjobu3lm2tTJ6PqUgci5 7zTFrYLSfz1E5xZJU47KmK69U4smid87Y29hvQeUgYH4CvohhWnbNKL4p6/OySXOVZdsgL2SpGy8 i5ZwwQvEHnaa2bYpk1MWVB1a9HVV+3MhjMhFrNJDdAvxy3cRcpwHrlS+dQx8GdbXjbzdfdxaniVl yFdGiEwcFJ+T2Wu/eQK0opYVnZscz2p8JlZ63LKfkN6YeNjNtAzQJyzXaH+llhpW7ksrOumDlYm1 DVexw7MrSyskFY3Ny2U3wGl/re+HhfM9JBGRlrRmVdbFo+JGS0xUUmFtkxRWga7HF6IvDIL/6CQu tmrN7wXg/uWnJlJHDc/+xPduy48VNW+ZtpyicEWwcl/dK/TVU0vnxJuGHzGSVOZAGA2rF+6fgm7k PjUhC9sjNxUBvbsrhqOnnI/0/KqUj3wiRQqWPo4RJmXG6NFSlfWrPFlczcb7xLFY8dXHSBhEOIqY j9r9anaaxkMcH4XpL9/aWUtZ5I8RUSA1BLMO4p7dRUOjHDiPxKi9YD9WDp/YDN9cMyJZYjzd07vK e9xXzbCs1VJH4YW4aQo4plpnszmM0b2a7opzG+IbYxaD7f5Ub4bwIjhyNS41sDPVYk0PzEyOUI4W ks/drOCDKPI8q2CHH+4k+qq52FO5TyW426AZHpLESUW0WDCjzs/bfxLKJVFe4vHYxXTkxRtD6qyJ oHaxcmnmcntiG/zyivFs01GU3pMibbGz+67CTAfr7OhzyIw/MJM4XvF6jLLRGgGCpMvGraUf0J8K cvvI88a1Tg68PVUBYBrwJuht0ql9ppVuLyyxzL+mIzIv7/42qGqNRqZAWJXK/lHdv5I7QmI7Vx32 RJ0z/C9OV7uqb3lnx4x3aU/R6dKfIHOmzz60ah6/bSWzAqyUEqR1tctCtP4kVI+ZDqGn0V3N6DGD kewxr8t/HiaiWDcuPS7XLwyygvKXhiJQ2vfY4fMHmamb8+WnFfIXaw9IeD5EBp+jd6OsitF5zVUQ ZoWuGqZr4tzGd5c/VsSBsv6zMrs+ndehBGVPh/sUTvnOLJ+zUzCT3R+hxlRPF8tf4gt8s0txaLVj WDr/I+HMlDGmP2TTNkupjPxJXSSbdUIXX1PpP6su8O7uO6UUQm4kau2e2UcT72XZkXkhxLI2D4r/ OJtc4UrzHoL1pxLcsY8HpeWVB+v7iLvooT3sIpAkMV2+IHvZunLHZ7StUHFTdQAa7+Zgv8Xn/rVO ohuT2bUNyvGVeLYCCLGYM3O+gA02PCYhNijL4SZ1wG7QmOOlgdDt5Igq0PyeD8mdHzC0VTiswd0q TruBzRfdevG1ezckk52WXhDl5yoXoM9h7do1ChcqLGSqIoe5NfG7t/6TSj+XHRSaTvj+L8fu2lV0 3tegaV725ADLBxGbuhQ/Z/vnX4Mkos80CuzwhFlVYEDhQEZ1mvRYUbtWxxbalr3iIVVfGDwMyxMv +Eaw9U1GbHjngEv8NkNgazraUOW6zMHbjJccRUjHU7U8dSZneS8Y64ybaNqsx+YrlVWXewj/tx4j yvF9pojyj2KKxZMZS6v5/7lGe4/H9Z77havkM2a2W3xIMfA8MYw18qJZWzIXFAqKTKadEx49+kZf WLNun0Y5tbo7IvfRDYX9AQ0bHBgSGuUdfWU8rY3yVbv18fFhtKL+lRS8YMZwvzxK2WlB+5lssMF8 KkX3GjVkadBH8t9kqYMkK2aAYB8uO4iRlWMJ4VeMwIQHy+Xnu1obJgBGWEnfHgji6dWAJxheFjD6 NzJxNBiI+OuMoiukDxNjtfbcslhB3A/DRpXS+ccKw7b2+JVgI+gS7fEf5FwiROzLcWCD4Uzp7Cig ZvbZ/Ec2FqB88zUNr3wTpOOhCqjRe++JWkt/gGKV5bwGCQ+pQWI1qO84NZgwwUn7QabV4TogspkB v7KU+7Z+KMzsdcicJAQda27g+/njalnaoR00jVmTd4ESBGQInIpObLEFn5O/CycOGo1Z6BKWqaWO iXNNA0H9yqNkecpyBv/ebXUeUjz/LSNdgsxjbbEPmIXQFYz9IiOlTpzz99F1jwKbYSO1a5OrkSGt wXpJb7BlMZogX6GxrSNQpWuuwVMkIaeVk+JOWRq9eR1N+wwj3D9nyMmL9Im4JL9prM3YkTd8gsup XZUg5D9kFOIx1W1LfqdW9B2/dDZg129k75ngiqKjwevKsLCblWkKmpEfY40vzjh6w5RkfL7x4fTT ZWRbIpU+2ZdeM6Liik5PFkNYhV0hEIsDK6lDZFh2jVI+mzPseCwL0siUeHBSds2M++luRMiVZ6K7 bl0KFTzi+bTHxyHqDRZREzEM9uK9U6VAQn0BFjNJZWxPhqM1H0LlwdoPPHCIfTB4TdIWbEt1LUNd d0ub/4T/CfuESFIgODsx/3uZq2cXwbOUm4BWgR4SH/7yCyScZnH7J3dMS3o7/n8e0bioWnSH9+vl MK0V0T/fBzrAFxZq3rguFXOEhL6yvDxzHXy7qkKRhKwQWp13FHIaHexq6+4Du4dztTYBib2eNLb+ ppE8XILKgPfJGDDPqhC/sjF/m03e64I7+s7U22KafQf+f3ODrmGdJNYZaXONq3JOCCTr4WWjzIU2 Jrt4YY5HV/RuuZvJ730qQ+A86RxxZwLq6am/1/Tl69uYf7x7ai1d2iW6FWhiJDRIwZp8IqCrhsWW xQyU3mFNJL6KmmJOLlLMpkEMlY0H/Ouqgz70iqBaDmXH4yhy5VDqPRJNdV22cuqSum7xn0RNGoMU 5IC8vQZsSVIwyB7l1b//yNgYAAAAFQEI0mrB0g7pAIO+ju7puu6fDaO6QfR2g5B3d3d3eDu7u7rl ksluV5YWZwyWFks2zeG5yz1nuGZ3/sIHD/pk2H+WcDAVgxlJ1S6M2XUrEky+cyuCD1u3voPTMupe Xt5kUPZGsxJjZFIV6eRY2Z/2axfdbtFbs+4BS+n/lGDBlK1qOlTIqx1W18ONVssf/WH/edqtM82T V5fNzLsW21Hg2bF05ZBrvY5OmZvTtqUvDK68R+PhcTj/GaMfOgq/zbKK+rOyd2ibrZcLZ+KvU9rp Utqwk2Mf7PbNtdjNiHFu70f7ItjwUwAx39SfSJiicT/2jbxahlwoSE8aHqYaRNR9xUEG4O3ainxl 0+cAXO9CpgXVQUW0YzO4SKOMKQByV+dEJ4pNrmsvL+vEwUrtsBCTaCXqEpO3+9RtS1cLXZ9Eybr1 JUzPwH5AC4RQHh2nfRSuqyiA0eGnNeGWUifj8O3TY8MceNcEdLaBa0VQ1LFsSqRJPFAq59PbayIG BE8ApPf40XCR+8t6vNn5QyqkaDUfNsD6IzulpU2xM2DvT31+N5Gsh4/R3I+8OsO7fJ34OkQoUxV+ 7t6gbikPno62WfPh+fvOEuKoBBuwbcfzoyHJJ1L0vCsvZ+VgLh7buhExLjxWdPhicW6sl4d9cBKG /DGBZd2O2Ikb/WA37iV2wad0wI1dBO5ONl9sY5oibmJX6ZKSSjR9563szcmGIrZQOPF0TG2paiFs KcT5TglHDf5VTTScvdvCswweGYddH5YsHCiYxXzCbZBQG3yEeqmLnb7Rmt9ze7hoVJF/OrUg1255 cB0kutZkpWAClc8vzELgsZAYUnRxutjHlrLG/L2GXJmR91xeQxTsZt/qzqTth2uNoT33MzQrM8ML zlIk29UsunYV5ka8v0FJvGxJQvzj/hZAE0hDyOyyf1iwbxCUn0fMW/Rt26m2OLGnvpoIUwyPa0bG 8+7Y8DMdpZEFDqil5FTXz6o8AtNP/C851SWrE0heeH+Gzhjb2HH8NUSjCcUzI8i8ZMHkEqdLa1KJ a15Z8c/to35SPu4Vh6vC7G+MvAtqW4rXCd3VxWuPLt28zE5xVXomphQRv8ps3jwQG0m6+XWrBm4v zqvOKg+reJhC3dfQQC5jsFJ80gC5nwXHAq1DPywiFLafWSG01kGYzeBVfCazqLrzzWs3tQFyf0Yv 2mWoyaHbn96OPMIZSifxwK20nQeVP8jgeOYszIvhy2+bXIniTKWTyUFDytp/XnUVXzjpe7MVB/ji wQgEfKUG1zAi+HG/P641XvzJjkGus7BIs8zHvJWsOfdy4muoT/svvsE6z+xTqMo3HK6NcZZpB0zX 187J0mr6IuObx67dzrIYoiIVYIYtIlIPtvrCv9RfJKOGQ3TiYK/57NHa9updN/nrro8BKE80cvnX oxCP1Npsis+JnuKh0aQk0rAz0DcTH0Y0DH7WrC1njjsmMBHamaMeYODDQmqPn/6aEM1F2zoqCp2o A+4Niy27vwi9pvc/qvqvJRDx40KhWyWD+dzzQA1Xer7kTtPp2dUBQaEcE9vkJFtarEpOpwcdh7VY UxoauF+XJMuMjQpLaJsGzYdwO6NlO8YWhTgLyJylpHEgv0PXH2N+1Hwgu5goZY6WZUpUQ/x3Mg2N jBd7Hifd3PY9tUXSaBHqKAO2Q7Y4vWrduHvScnwl8Rq8SrD0bw2NK/kE4w8rzhzk3eR71/UyOtgX 5aOqDU6GzjsJ6icyuDWPkr4dq9JpcNFt6cZBA4vKaB7sFz4pyFXgqtJEI/eyh4G66Fy0NRatfP+d 3xULPVTdl1Fn0h11YPQ4wSIjVnL8Gsp0QuFkVox3uXnv9bj/ACj99VWGD++eNQ1QmFKbGgu1Hcbe SkKTmRFUGlygWSrHpjN1sij4FORrM9/GcM0ipM19eIZzlT15kF0Uxukv7S8tY1Q2PCXLYpVtHrvP jgzkW4di9xWOTZQAfd5Br2GsuT5q7RJY6BCxKr9luW5ubDq7lk0Ty0fy0IDj7Yt30gf+zUZ4xG9M SsDRVh/53ch+85TJIutJzbDaG+WSS0ko9lBPnrHW499+8Zfn5T73vOY3TV3YX+xQcfCwGk5I2UYd VFQ0jB/qgcUKRFuX1fwn1x3LXqH7pJVmmFjv0da5KpQ6wJxPiOZMNUFjYvMeZhQGdW8trGyt1Qt6 NjPUFW/mSNr2Cff9nHoXrjYXi7Tgq4RII9U4rcESBhjxOYJkZ095BqEe0QL2JwVmSa8oioDZp4GO 25E2B+rexNRG4zSnnSV7pSznIYptjDsBsod2fRUHtlAArj0NvD7w6dSkH1NEi7Kc1slBiMxOpJM7 ooX/Q5w+omh1xgIeALPrTj57TMW2dKd1+D7LeXZuAdUXy1Xb/wiRZgvoa38Y+rHM+TxKKyHzdZCB G2A2Luo+efS3Qysg5prS4jDdMLI7IC6GHMrhkyCmoidCzoTmN92yp9cAvOxV+eVhqwTjVnIHU67L jq2b8fzPDyblMKpa2valcXvEdVUwPT4DRS8ycCWC6igHQJ0bWEZUgprisR6eVMsOmkkJ4/b9NKYx 5JSE+C3Gj9LHgKKB9MV6h35L8cEcr1Av63WaA9Rz8V/JRnLqhtuIPXexQ7VCRiZtZDgx1y++PzcU ZME/gDh9ZtHA9eKh+/8xqQ/JWKyBjhdmhUpKnL3tyaHzYdbE+kgaz3eUp/9xaVPv+6Ndj/Y1uzxJ ries9/RVC+YKFu1zYd9HvhtEWug4/WU/Irjqx8b7TjHWdf20XLLMqxd4yA2ArRdkyXv6rFY/pY+q sc+BMCyfk8cfiyD6yc2eiGfCTsfv58dvBewZrsfB/JQIWNev0mDdGdUuGijkqVa01GmhmvsB40SM K9ZiVo8y5YyZvzAgK7BYPXbjkyfs3TytMtPm3ycuWrWt3x8KH5X/aZ0oo4+RDzuDsosieKrKnRXd hSt5sbJw2bYai89z/xWahg7g2eJwd0p18F9ckDWFi19Sf7m5l3thEqtsMFuDfMcArg9xZMUxdf3f gqA31MZmMj7E9ILBgyJEMRLOLpVaxsazLD36pS6zYQvQup1nsqIsusN6NWrrPi4zJNX4Z253yJMe IhUl38X9vEpD1lJMtCcy23V8OuzSBtCgvKGGgYySp8qqm2AysOCsmVRzIvjlK6RMxsviJfbtJHXr VW00HObhpU9OHGDWHlgNa7twiNFAy1VARJB2bQULGUCsykYTqM86nYwsOTfQQOEL/pYqhdWUXaBQ aN75E/1ioXUXhUbM9qBXee4cmHi0NGWIw0SBdfZP9zkuk7Iwjo4EjDO2Se2gUPjSdmQUO6MbNAuf 811DcKn+zL+EMtJdcIi2txEDRD794T/B2aJSLeg+Dsextfzlkh1A7AcAGpUzXiwgxuANU0Tq8edq aDZBe2/X9qkB4sAdLDhCmUhdsDxzTmcdlzg3P48NtqbR0YS8iyLb26JjR7vUYyvZssAReSVzoNIV dMoUxmMVkMaZn0J0AMOK9/9OPxz9NbOfJrrlwHBjc6W3ZTZc+yjcigIClM/ioaS3EZaqPyz85HB9 JwhLQt1DxVE+dGVnNK9MOL0/OXCSxmLTesIEMHWVdQNfQDsrhTdOjiAk6eaNA3nJmVhOW+IGj9JT pG9b7+tFfyLBJoyOlfQw6tNykOejTOOLiv7UmQxzc2gJfXGkZWDIgMKWhW/XlidvmToguRYntdwT ag/DOe3nQxRhnCyLGS+vsCkxkPv44QR59x1FOzS01UrX7n9wmGw4Y1aBkK7HpqajG8prmiUiNav5 +0m+ZCOk1KB9cDI+TEV5DMyo5EFjj5hw9Zo+Y8J0KyeXTqMH1xSYj0tRUy5bEHxz+b6qLWdWiGDl SlEr6KhfPD1waWSGgBdE/HPpoy+ZdKIfZ8leRvmpwoZRPMJSZEUG1NyvSo5TaE5+SE6svHnsrF82 G4N5F+iMxfOHeA5Nn/wxNRIH/kOUCuhLRRD/J/nbnxCdoiXMRUMcRpyfTMjf7lrAaktEStjnjPsw 4QvICOMTm+ImrVd2CjzHnnAw3z+0CydohJq5V2Wh1z2iwIVy3QiOs3WL/POgU6ZRyWLrvP8t6Pi6 BNm5jAzDv7bOy1dsb4Lr+wncUvJCSDA0Wgh5M0dfvC51U8RABuEq6/jMXjskuQb/yT6f3Yrp987j CaX7ro4xOYYfP+nlaS63Vz39klgPxXN4B+unqm3gV7u7ai0hghxXMxBKosQnS4+9Ypa70lLCUhyP qrd6n5ApJ0K2IWIfCh/peAHbjcsxS/p3kOjwbIZaUEMYhsmiSfpyQntadj3XNLqrxzXI+XBlJDeJ U6oNZOkqGgEOT4sMWDxn/1qIJpDFTEHFWtqsEDgOkkabbuZtegOHaLb0FjCGNMGslr1qFy984Z2k 3cGsCG5YV3vlwSE0K2lpts4I6CaJEY5PSNMgcSbVbS+uNLI0U9yz/avon66OueO5DEHST7NfSuVT jUwoc8FvKzOrXJE6CqTrnM/GVZBqhyb49gZimHikAS2ewr50DnsEXPML55LngvQzevmI+E9ipwJy 6u91JUV3I2jgRxmv4kKj25xa8Nu44r2UAsg+IiRuUGzJJoXo82HY+WvicbzCgtj0rh7oDDbYO2e8 U42epz8GrSyjNlkrKhJxbJbhTQteNj7bgwhaGLFPCDsz0GVkyZu5/fON3WHvFYugdataD/ItN4u+ dMt5yM1wGuizpeMRuM2byNBFU2QQAjpMb5d7k94D3DyzJNGy1MJPxk4j8IdrqP81HiBt6VY7jUij R3aNS5TQmCSYKnS/3g4sOG/WbZt/chC2lsaCKdhsJKTyIiJn824ujTczJCrHseuPRaPK7spJrHA8 xnRjID+zscctL7sQuZvHUfiptPz6rgK70SslbH9DfqVQ4eVbR0BqeLo15o47y03pBwQ1RIaqtCtU GwuoD/ddbfstedeMV6T4zlMPnsotMIihefJP+Q82ONk5G8/BPrqeTtE2FhS9G65JZxDapG4W9ZJK JIMzgvYrjb1nbsaTYCrBoFUv+7Bmy+YWEKUnM2F8wvUkt1zjHv5kiOVfMoL1M2yroPLPmZ1vKPcK jF7U3VgpCOAX1UVQdsmLQ/3g9fGN2wXhydIfq1kcKRk9+Sq768oH8k1Dp3vblRFeTAvEqttIPXVO 06N60RaOCjPmTRv/uQE2JeTsyj+QkgBI5AptG8IQ5/DDNpTAE7boD3CLDZ0YbTgNpNNmbgmdUE8v W7LWHSfB5MMPQgjZjda8fVWU+GxQ2DJWUmHVv0UwVFCauZl25Vf68JOFN9rkk76QnMTp7VYNXpGn SUJJrpoGH6LIqjrguUOhRz+yIPzdmf/46aYMwwyqoXnkwMFjhuygoTSjT4da55EzKQsEg4hihGJD CCX7lgfe3+xPClxly1XO/FE/9eW8WLfHhJ1aof4H0lIKqDtS5g3WMShyo8yeWfFRMRqVqgpKQr25 nnf42jJJTcNe85sSATyfwFw7aYNHlKTl7hMdDuxMdnlXjOeboeTT+BQTJm/rMn1gtC9mwFaumnzR BjnTD5TAGxUypfWHT9Ba3ZGnmvKpTxm2pjaqkcurcl5a8lr0HjUqMz0TnCjXZbOoiCA9TLd+YNnd ROgqFwgF1aNDeI3s3xisU3yVDVnbZ5+88eBpg0Si3D6hApkO6Zlsei2a9+ZU8s+9uHTTjwmEueJb sbWFh4oHZzhn4Rz1gDgU7dXQTDmaKA5h0W1Hq6+7s2ktCxyZieB9RajdXVP2iKVO/9if/i+ia/A0 LCjPkcV3krcSodqfaE4u94JrHpyuk4lh8lafq+V9JXJ1WGLeIpPZRMx4Qttt0oi5UGZv3HVdGgpa ++Tt4XOKUHL4BlogR2AE901YGgu4R/M6dGa44YyLcWhnBRyMpjfa+JGdcg1fTaG49YrP4+ceUi/3 7dnLg4vjm6kCFM1dRW/IHAbaGGNt+uUJBDL4wFNBZg2WL4FkMLKUxNYYjtuv6Fy+cfe/GZ7fIWtH a274Zc6dMUl5wAk172GedO3mv1UgknLPmGdpd82t17eQG1x/stuUj4oUPSk20lOrrlWF9Vvbn8Q3 nDWI32qnKs8YeO1zeAdCCOcmfJ/sFZWT4FL2aNmikypNzBmC2/JhhGUrBPSipeQtiY0yXF9RJnuc oHpIpm2pzz1/5rww/2DZ55Xmm2MOZgrBQuU7dhdQWrbqhFQqgu2CluuDjoEPC2ox5ZeefLXKy9O4 NXNNDKP6eI4qQNupNu8K4pjXh6uaLjAUfaX6NmNMFDaBTL1AlSuYJYzRgGuR+yXZzTTYTRAA+mVw kBttFL9o1LH/P0/mfJp2ORV9G8Vdc6z2tozFV2A38NFhGoIOef62jreiy7od7c4d9bh0fjzFMtkG 0u4HoifxA0QKnAtjDq95tM86xkGmkYjg5+NNrYlXKeIpbJ7LuGfp1zzSsSgNAiE1HZkx0l1YaiW4 6IprQUtuZVOCQyfxoKcy6x6/SRy89t6IFYs7U/3TQrPHxvEv3mENlN6SpRhFnBLmu+HeoVxU3idP 93PZES2WK1ct6WkiVhXkdoyuTsIZF7ZgoXjGvNTuyn83VTgg9SOYUANoWggMGLEa/NfFQ5EBrriK Nvtpp2Cj09liC2+m+PgevL651CVWFdg65d1eLp+F7Z8/NSY+z0oR5ybQNtBk0A1oi0caaKxYcf8Z bOqxAZorCRkY03kSqIh+vJsPU0Rx0hTejxXTheC6py+Jkde8wlsJnHFdoZ3L5vrAWOtoBq9VAkm7 fXTOJpZYy9MFe32yywaW+94Ka9aKEFQHTPxhgrTHdai8QtZXFpI6vtogfD/ru1xc2nBBmqaOpakb hY++UPu6/JdXFWcKcov2Vxcum9FXtTlzqq3MdK3A//0ocqRCYd1/dDw2gXmAN3RZE/oiIlkOLonj YZY5riLtSoJyate2QGKvezXPXcSpP0zjamDETYmc7Hqpw39PtHYYAUSK5WM/fsDV6tbwNjVsF0z1 MIFVnbxK2Mn3my5OIFg8/YnffrVblWcTujphD5Ts6VSdhrvze31ABj1vw9C+OQeubsa4ivhT5lzj PGqq6doJZ60gwRHejyTJMDP3X6XmFEmWvhn0cZ3DPJwQsHJRKO9DP9Tx9rAOnqi3mGkAZKjC9bqU Gy8b+v72Uo2R0V3LjdbEar8Kn6szz/xmVmdRWktIW2YTdEyUR2WTThAcQ/lCotq+RoFhRplCzIxY y2RstoDqIs6KlOTTu5nxnMvAQze4BHaJp+FlGuYbKtkQ8r3hJMvnWmeRmUAQZ0mS812z3vGTZDcH OZXuS7klXUpDFt+0MErGSTwkxW/pY74COmBdnnXTIgXuEo94N3KLUcv7MZKYHherOVgTSyKK0jdn XE5UdIzbc6siUjzWRwgUS6le8B40om20+7s4R+gBFrzW9Hnm+SU/68V/n6Kl5MAQvaN1xhN8oiu0 TXSHskZfROZLVFinFtHCTYR8Qr4NZzZbl4j9vxibrTKmq9i5AboHxwQTOIxyEBM39RmvcO3DArvx 0p4grduLojzzKS2Q9BP5Yc10es5evCKmWRhZzd3iTINfaNLo3tdoAtwOD6WZbKcXDzAqTNehaSx5 kc+GbHC5L8yvCf4f58XfFYznfOruYaaFLOq2CKcJvN6X4cj58coAkdlTMk/MJuEJFzCevNRUe8FI RaYo0S+G1Mvda2YX3qkFu0oySwT/VabeE5yoFIKR9/MoqHpyTLqlojxg+b9OSSJQRukWT+IIQkLh P5F+0PGcAtNk3sQyzBLGnhVzEDGUHsN4ZP9oYM9E3dtJ/U1Mm1VhsAaee9bweRzxGqcFQTLUzL2M 0x71iZco73uNsase7zjd/AgTCm+hmzSDoKgABFQhztPTXQerCMopQd7BYaQbqQ2eKFYvAwHgV/bt Us40kXVar4xKpxRuVpm+1r2I9FSTPv2HTB0NbFagpLLJyD0JwNH+FhiyePcBWE5dV56OHnEuBfIT tnFA3FSRHvJUBp2NuTuTNOPbbGZGnGtqGkRTwvRyeKoE+rsyEsBjD4NmJHlV5SA1Ml5TzSVuoiky EcxvjmmD64lBZejWbkTbXht8wid009U5a0TXJfzKfjCBsjDo9JQ8nKt4CU9aaNnu6EYtcWaQZEAF 01sZHtzL7e5CdLo7FwJlnmY8mJlqPWAd+cWflF+Iydk5UJgf6DbjFje8TqXhPLcxWn+TSRtC9cZl Dw12emsAhbrCYjjfbh6zeE31we7m4QGxGcKVONkvJIUbtpriMF74kr0V8aNIv1eOFR8qAXDQaIF+ H4J6a0fma0KJn3OSgAYkKipbRgjU3bKePcQzrF4NZWwedp8mhvnw/JB3AP++Y/Dw53/UQkGQJ2gs pr+Qnwd6I+bsQMfB4LiHLcKDQXXT5fccZ7YyuvdZO3tMr0GE0TlS1fyErq0kZYsYC8mtBIDda0VP ZEVnxvAd6YnYHtvcSk/G5FuAtbf+y9sjXPEDXVUYHNc3IZwPpweESIkevtR+IsYADkbPYi8es46k VXANcqgR7T9mqw/E9+TIdEYX3UyopnAJIaOpPH/zSXEPJh26ZN1YZuudRc/ENnX9ns8POrKLpLym bWYyrStEIlDqIvWlbU5geu4MnDj5KIZ78f5TgRJheWFE29+44gVHO8UdfjYuLJfwnZw3JzR13yGQ ZX4EZoD+yGtAYGazLdhfz8uqylDuCj//kTPn8s/1X4V/r7N24mYv3s50hh4DsBf0vA7N0QZfHIyV yrwxcU5jhD4p+HIRNSRMTXNBmMa0tAc1Z19VReS9Ibxe4DX0d9QtyR6g+82JD7EUTDb+ZfMwPEWa pq8BreI8MAFdKB32pqqoRhQhPDDI8xEqc08qOK5cdVv6rQLiUq2BNf/i6sQ6oQGEUVnH8P3sBvRT RDX/TSwzXrORLsisZ3RLcT1f85nYzqD6lPmdtpbRrCSzQ6IBEXzucjqfXz/70+Y4PmvTqiipjSsk iFaHBZW74RjW7Q7+mmqLsq7UZGx79yjWbg6LhwbMHyw+Xpv2FxOGDrUNB3VoYL9+stVbd6SwJChR sXxj9/8wkTdpalJ3QlQpbX2leTexo7cA6zXmjeAsQEKtWTfXPHOywEonjFdoY5+GXv3ijoXctGCK 61eJ1za7sxyfPCM8QDLJYVXhRUGgyjQoL6ps9haMSO/0uadZHPr9up+JqXdK0lzOqkbe8flCxa3w DG7ADcutlXbXmclqG95mOFVnuMR1i0+e0cMiDNLUET0HZmqANo0RNVXucKT5pzzS7o4h+bQosWVd L9nL0FvG3D71SvREgWCK0D1hHleCZYW08N08DKmR5O/XUUh5TxnpcYbZLA5FlrP2KYFrhWeDHEsD JeYTjes1VsbpFmDn7+Jy39SH0D5E5m2sOSFypQw49M0SJgkKAfCfxQTuMobJzmBzLKvl84Su1goy MaWkQfMJBm4KuQsuZRYvojNf7FisxRy2x+yKESQXRYqOBf4TxreCN7cWKOsOR5j5aFLEq3lm9y6w MszCjS1yOFY6c1jy+DtqNhg2AbeI5WBUImE2tSthf+IxEzbK5hlDRi2ccNDMM/LiBDSUz4NnVjvC hDvgKhiYRCu4iq6nmXdfFbYf0UWq9InpQqpMCrwiewaZX0aRLmz11URSFSNCi+fN26FlRPBTsrOW QugN4pieSTwEtBtMmNAffouPg956KDnWnJhbuBK6UmjwNp59OuG78ajRnXhUJKzifwwi0+76I3Nl 5dZFW3qsJuq/HT5aCUswubR1EkiyXJaT62R9pZ5bD06y+2XUm4VBzLeabk1+iMQrvXwPBFY6Di/E 0Zldfb5hGE8LvPt5z9HYz8ytgZ3fRyOU4vI83znDKaYgU9maNlobVemaonyEUikldYS4UIBGi9To 9N7fIm4GVIGiR/DjguDGdu3GtAgfodP8jU3jD45ZXlT2+JfJDy+5r8ALGn1mU54YE0Xm/8OKC+ZT OTjp5HOC4H5LJSi2uIxSu+33rSTKgzrcon1PdLcVsBmiias/4sAm7hbymvR1aJ50JKcJ9ii5uGvL zsCz84I9japGqp4D1ovlfkmv28Us7AVvQUiB5lwsitVaQrR+9QkybjaGELnfBUu0O5Dr8FxtrA2O veJYcEGB/+dMe3Mpxjfcv758sArFGFE7Vt6iKPjwoTV/DJlASvmukcfpWiMNFwOfh5SxOIcqHyIA zTIAI0yo9FFOrWUQkQLrQKDjFHEe/CfxtwN5z/7JA09DuYyPCEFy6RRTI2v4UEwxRnHEIJcRI88m oXUuecKczkDaZ5UzuC7LRHqO3BQ3Bkjo1iUk+J5QIX9cxZijJCc4rj9yok9O94dIN/YnMJw5Vfj/ 9iombAEF7zcglbaZtsO38hG8tIBMKE2VtTNy2OtjlIO2XJNRZQOvK8386/uiduC6l5nLdRl+DFHM 7K/d13OfEkd3UBh6i47TCTzc/lScn9PNMioqEKMsOYIT/aIcuR7TS/+DaN2xaRb3Hw7s3iY+b+pA dHM2PlD8KiR9v1jUjxgIEVmXWU3/LjcS4ZbcnVT5ME5mRDgqqSF09fvZnE4IS9tvoS/Pp/NY9b+z 5YcLXa25V03Z5qzBaYXn8TZviAA6n650TyBKurp7lzBN0SvdMo7Hu5EmnJMRwu2CVlUrc+2QXjrO /fb6pIr+jfyJkX/nTK+pjRjN05IFlCGyFnvHw55IeRcLHdcVKwez/XQlVMpacVkviBLSB5xYFXuK n58vOJHI4bTnLhmHsncd6MiKLxDdyowBWCqxUBe2qa44qlze5zl6KyIw8C8uL2Xwq4sniIYscxEl jqhs0r4COD2EWIX/vxwsTF4DPFVKkP85poULXSbIz6M+Vp1ZvGTGkdqsKwIpKTzLb1PqmP7c1+Vj ukLC+OzS4rA9QlpeqYdiA+8tWBjwfrLi6b/nuanpWNLqdPZL6m49H0L6U3sKP2P6O7+qVLtRrtZ0 oy0WC4eVM17URWm83MBfVL4g1AS7TDwRoxuyxsIFamZDgYdyoYm7HglKn9PMDTLnWSFGvCEYux4/ 1JfSkGPMUHePneA0jwt8qJfNW05So7bqI8sVfR45VSdFXOVG2cAf/+SO4AAADg7ugslNvJZNtt5N ttvZ1szk2xkcm223WTbWzbW8N3he8M3yevJcEuG7xz9xz55Lv/YauH17+5+v7kPIzYt+ltVS2Nma 4q8GzGV3Kak20B2kj/fqBF3uD1yGlClpQP7PDT7aVcVGe3bGEvs5fLPRNcgarSW9oHxfpQdtzhwQ 9IKtogYkqQjJ2tpjp/Z0tWu4asHbOkHRwd6574Ltki7Lpw7C5D637De/W4hKv12nP2/7Zmg1RiDI I+mPAgQ83Goom/OzfxvUGhJBslfT/1uhgFzE+tzmMASkolpCbhC1TlQe5kSmL42addA6vhmEyTgE EIWBniIsRKou7hFxBOFolaVhvA2Ge/7xeN7qxWeNIhe/oV9HxwOhF/4/xClS5PQG3ipkSwymgEPO d6aZMisWOb4mEaCn3ViYKqS2+o5VbEocSHh++Q5SGL2clDIpJjmOBK5Fnv36t1B5yUav6exOKutx 6uidAFn/nFFWo2hLEuCbT/t98DFEyPP7WM40C9jpqIw6gN5zPrK9PHPAckfo45MYQTWa09XzH1X0 c2kwmiPl1RPJBYpctHbAYJ95IfMs2jmvJ50OXX7mX4/JF2FnTZyT7kUjg1WzsKXoE3+QyrHaao84 0YQLufn506OkvvSPDLHst2rZwMzLQkfdrO28f2/U7IfjyrGQeII6BRL1ebvDAR9tL3aL+HZTEUHT daVX3VffBN9hMZ15JjRhpHtFsjNMAkQk9S9CEkikivgJdJ31ZwTtNe4AhxeCq2XGVR1W7udliz6Z U1oncuRGge7+lN+gTXtxqsN+VMJ4HKUWAZDqmfi2RjtOxtNaCrQO3bMDUl2mBU/izc0mOoPy5Gby rkEEl6jIyAvbPD7V6KW5tVE9rtBKrsu+pebYMmh9hWE0Alwc8tIbzx63l/dQ46Qj9gG1nYW2ArLr vTlOJVSui6rRS/kXEb7KZeOv3Mb66C4EKDnp2Zp18pp/oLU7LIhqJbGb5C3/UqGrgcnL6BWzh1Ve AXarfb72ELo3h20bsXp820p+YeiCD8LYh3wccCxI3IvDlEWBuNeGeV8xYPvdyKucHRlOmRDXPr6v AMm+KkWrhjutPjYvIG8565GAy6HBj05+jL4Mqo7GshktLktYgUB4LyDpYOFzJPbcKuXAd5/MHZPa U+eW5NQcfGK2ej53tUZhVecQFb7S7RD52M5GR8m4Qcj9fsnLT32polbHyqNYwA5Dk9XHAQq1S5O7 x9N0TOpQvG3xMT2f2zoc3QtU5shsyB/wLd2yZw/OjNCSZ2IjXI4W9ps23cryTBxepSGSoJTqTNUD Nflx906gjMx8yJ+ARgzGntkovL/nZY6u2NoSU5pNqlAt02TLEVg+EhffcSjd5elHnXhzq42Jnyzq WDQH49HCKwyhZUKRVtBKldzS/7FKvhWkik/D6c15hy3rSlzQ0P0L8jPyZcfphyY8HLa3W/udrk94 KCMkvCHEPqWy9OPOZwTI1ZRx3zPWILLN1/AOtAbb4pLNDRfobH7RZAyzrMd+llO82nSmdLpcIPTj d63pdOGkTHsJLIYj/WHAJTRi70+2GeabItELQdT4gRtqy6tz4xAlrAO0GvEWWeti72OMEUy1w5RJ AVndm+aZNbas5a4TAWvgmtztx2IBh8GX/y/BtKR9EW6jOK/M0zenEDvqTE7TJIS4Lcfn+qJZHydL tffLO91FFDqjCrzGE/+K+QjF3dSHuREhcU3QqMnhh0vD8LEGQVaxNEUVI4f+YImqjEihxboZn+MK og3Bf4oOxN2ZY+3rLwm1twJOK8Zl2LPptcJ0PiuMvFezVh48XFi21NpFfmP6vnFHV/j338rTK0t+ 4BMDBRjIAwDNBf8fe1XzpmUBS5Xvu+OQdQXaGD4UVbG3KP2HTYrFl8mdmct27pOfTUAhzX5bEHO8 0rfsilAGMWRlB/MHk+oJSRKE5ytAD+NSG7cb2R/uFlS4nYTB8PFULL8Fh8KID+NG0kiiPbKIe2Vl 0e7xFYJdpmXOTpajNidZeF8N0M84nRRSGipBfmf0BPM2ss95pqDNZH+9Q/xTZ6XK3dcfR8bSATnp V0aKQUqOF8nF8Q+0RYGPMQWpjZvTbni96hUbZLNYzcbJS2ylz0KM5SKqrnUzO4sV5AFO1tjqdfa4 unPU80NUGTid+LNnuJsvPsAor2v/7891izsmyDiXQ9NgctViKRtyeTCZnfjPnAN4+MZAmgHC4eF5 d5BCycjTbiDA8kLpVujfNBKhJasuJJEQTYxvwES32Ld3rnfxO19aYwVR3kWtZ79FY4Xf6ncwstKW 4C3p9+zjphNvWsjbmjtG2rzxnKrPv9O+zBknX2ZxGiGhQh1i5GXADHJrb6wH6BfJ9nOApvymuAVI NMJCvpXnvYggn3VqsseJ+JXwO4cm1FzfPKRKiunxehiU/WoO/cmb8oW+9IWCvl4n2fa66ShmJPxX FkyvI8JuYvzCOITPPsx1yiJer5STy99xynXnOnn8NMs8kzUU3QSLp3OXFRjyLgjbW0arTMaJUMXE VZCvqvND7oauJam1SQ7XBmifxsNDIKx2xSoEWDcRcbKlwfYVxab9VFJl4+5H7HKTMMoCWEHHoY28 U0WEHioHHbccrUbB9U1Vi7+pJLTymqZ1P+qZIRuIzp+9fGlHLu/9JYJX8oLS0vkHNwQjT2gdf53M r4YVA9lSSq+sKvpdYlAX6lGG0UVaNhHkfXiZAhZfmA/NsccZJh5wk8Mvv6usmcWWwXEcuXSlavU6 pPDub79sF7ERAfypKNLSnM/BLoBmT7fH7mf1UcRp4tlLVI0jjCzrl3tJF3pT78CBoS8ZV9Z7sRFQ RuFNYXevXwbWPEJrhhMgLJ1axoqSy5F8U53fiFfj7tGnmdf6mF56E2NsxQ0erB4iymXzv9rpjNP0 NWV1ZkT1EYk8dk1SFrrZ0LoIPyf4sUOQrZuixkn0e/XCa85PvUbz4U69OllkyO6rbTUW4J84PhpS olwv3xXS733Kwc6S2NPzEoIyQSwG5FJwYN6nMbQRzjzAoubYnwLgxPkAaY0t6GRxDk5wIb0mq/yr C2i7SKsenZGuxV0D7Knq1T9vAUTL6Z49SZHO0xKvQSUwT75pxoH6PM66xz6t/Kgh9Z3B0aqxcUFq RHWk/FvBomTJHv4RQ0U9ms+QIBq8zug2VSponFk9O92pMv9e3Py3SsDm6O2zl17XiLqPb7vVJSP1 vsiPXGAc3NixtI9QS7Nwk27k4suBIk4/EsuyJB9EiI+P247JB6izkBV3OKIjgbQFYY2/G8pZeNCN ZH16QZQhc+pWdCGBDbrfOpJUO2cAsWr3rZ/DnW7UzflK102uOsnBffgigfeo83XSgHpSsFb4hSTs fk1bZ9dG46JH/Qwo6wRz7b5Uon3tsOn7ld3rb3Rs/1ZY4D7lveHVOSBeeioEV+q2PQjl3H9Fpplx 15Frz2pNTHwAAGZewivheJ8SxkNJYZ0btvJ6k8PGN/5Z5zSzPGwcr0D1kJg/H6Bt8iyZl9exL5xi 9WS0XLa476T94twLvKhHzkAQTc4gPhsma1CGHTtnvU+zfuqflH8fPHZXMwh/u5Aejhhca2KbvsqX v8XGt39Ba+WCKihCrOqCJBhD1OwqfdTD67tmhGt0fdFWEUiBFSaxmUf24WmedzyJV0SEZ8g17y8W vkeWpYAA5gDqhev3fsD3YXkRXc/0cTtbtwjPElzboLcffgq0d0yco6nlEtRE7WZ1BxAGNkcELBra d3qUrAgOUpxGr/SpihI7szOz0npadaO9HldMSH/FHTij99SLxZWy0SwmV8e7RPPwtkwFtqkjvtbN eZIE+WgPFEd8nkSc7MxR1sX//mpQYuIVVEftd8Hen8MXnR6acssD/sNVGFaN+TeVPQbsedS7VRHc +eLVtEDfkZdC4rGg22l4P3PtB2R8tsUYsIrGpTYb6GR0Waz74GuGd4k1yP5WnFVUl1Yd4hJuH1+i zYQV5ddejo6r1EvJUAFYeVDJj0d9K1hJjW0h7pf/17ZMwzSmJ0R24Lx9RylSMLksxtTLZNgA3hGf ySodZRy29AqO498bEwP3eiPYCxx7urDiuvZ1p9ik5k4KHRqvDSYK6YC8IuoIHkwFAP4QmZmDc4g/ YFwVm6BJ9BYr7k0QYYBOibiYrSSmcf+BeB50OgmFnifOpNaGFhF+1npQGps9+HuRiovd5KcyOmTN 9mM8Uma6D96hC8HZmTMXfVGksesq1SpwepnYZ37B2vztHRnr8lAU81MpW2FZY99zUBnDJPxJ9rrD G2Cee5OXz25NDviaiDiZwFnDkAQErIsb76Cxs+AFdaV91ibvPIKcmGDpjlfjGl3Ps5dr233xBa3C LdlQxAo0ar7qt+368GVWDSnyxGP7eOUorPGPeW/sF6mhfvUWTSYb0EIvvqISybENTg6BKTEuOIrs 69vIGrj7qGK5hg0Nl59w+AxkicVP7z9TND40Tnxtd5g8DSs9r/3f1oObjNm7OS9L5tqF5tX2TZd3 X7lyucuf4+4uladBFXIQZoCCtcatPSrYyIuvgH3+MGfgBMpuCcNoSDro0LCyDli32YfCG82XsSw7 SzQOSCWDMKZot5ut60e3yBnRf0J++ZUx7/yGrOcyck5SGjc02QC/JQ63I/rOsAtGrzPWKCodz6mL To1JuUqgQgl6oqe2qfH3XwItO50UyLmSJA6s+IGgfS7ZllkBPTt8GZkMW3jExRcREKn9ZmuAwD+T LhEPN9qXyQw+4QcOjKRYPdrcK9hexHksBPxUSrYokER5wHXvGcYiaKJ1v5jCNC9GIw65gtD+BPOb zAMMdYXO8kE7LCG7ASSXQtuEw7nlD9te8jSqkid3lMZgsIpfod78lu970pELGKJ54cGYryVjj72C hhPxH7fkpzGWwnGE+/vWvyLziBh3+KLT2IhlgwOkdS8xpAHsZKbmdwFohuX/JvWKCjMPDlloFDW+ 686C9WOacEleBiUR9lWu2fEAXyAM+1pfhHt3V9P9dR06mhcfYjU6uuO9m0isQzh26gIYYbMUpMPu ProxPndhWIR3Ya3+zlHq5WXin2XvPVFKS4TyWqR/Ff2P6lTFdEivY2wEuFskyDEC7q+BPdfOx+Bu c0BndaPp67IoEOC+8bFOBPWZ5kFTUcnAbdDvdRkmB6QtA8WK80au2jN8E1HcfOKgvciXxUUhMOU7 0wz7BpRoeSS9WbwQyW3NYAqPrr3g9EqeSfW2CXxqt0AVAgCH8H0z6rhWqN4wo7tEjpGwY/FXVrGP bcebJYaS+paxCs6YWT4uIktcuGxA/R/sx/hA5qIpnFYtjivHz77DWmAdYyJpmSv2vJ9mRWyJO5Fc why1YQXdqHCNYIieJuc6K44rDkOz5bLcooqtntxKmYttfjkl/x7qu9JoxX2sZyMxyAY2LDk2VKFw VNdEOjTpYXeWRp4a6JbyCPe/mipChubNm5E9el0JIvcLvSg8KzMM6ujslYHspDEo/bN9alSkG5L1 J7K3DyJnezrz95SMK61Kk9ezwujEagn5KEHgKMg5TJ5o+DaB0WoVbm+pTSeN1kcoKP9+6amw0x+h +qba04l9K85Sb6ceDqmaixl8gSXFN8XsLNrP6A6rq8popmsO5nqpegbpMJgYfiaUItKL/UhLavdx fevfJzJkBpseg7a7Aqirjs8EW0R/Q8+MB1FQb5ySvmtaEAp45uYoUNm4MxZUrxLla1S2tOp52HOL sjs2um/fBGLNZxyBsrSd7TSF8ywgAT5n7sh4w33mGSNPBIS6dVk8cOJp0e/5kWL9iDQ0OvSTNDfY It+7J8w1rF7t9LhDjeDGuyCFKaWV4AwCL91ZVSnBf7wzSs26rAf84EuGXUrEB6ZnysmQCoK7xw0+ 3vZsQFUpi/duI8jmthXaf7tFI9xsq+MXgVMpWsFchVS7YTgvIxxTIrxTJ15UkRNrKj8L2ARC2knX t1yThC4544IKHIaWR2y287kiMVYafT94oNRk8/bBMSWawWMwQ/Hv4Yf9nU92ocDdx+mz2u0rk7uT Le+sdJBFQ/163cCR4qz5y7l5Uvgu+pMZmooJbkluanRkiYQXsGKNt31QxTmfEA6KALysciMgKJC5 FbFCwvtjuLb3QZ853bk8R40pYifo4TpK4Ka5g+1lnBc4g5AqGMjfw34Yahd8puf+2fYy+rbluFJE K/NxYB6P3KQeGkGFprzf6GHiY4aU2eCuka7xQabh527i2dKTR8MrRakkd4OSKBMhLMm6gA+66Qyr 8WxNyqkTd5ZZObUu67hP95W5ne/DClj4S+xhxWLd4c6ZHyKNEGwG7pWcCkOBY99JdNF79vw9dcSN kNM0o6o18iAnxzWLP9r0W9FRZsIGKGTy1rzMAGO4jWmtsuK7P4hiF0Fw1KCf/LfmFk6Ur2M42hWv KjE6DbCOuVn1fL/pXKknK8ZZOgA+AcXSskC+UMmPR3luAwcvox8gpxjWF+Rc6CAuSwZA0ePjPpwB jZWRo780XmMbIFfRzMxAfRwZyzjDmF9UZUbb1Pto/O5LTipqWYMxHXzffIPDu5QOrjVEbA6VCUr8 wKhVGa9MD0Yx//eqkNViQXuqVuXdEeYs8eIHIQC9T9sjCD4Z2dIy6emuE0KE6fic22hxMmOnKH4B Ua9cuE212EtyK7tzsVAqY2vS5+pzSxYsWJd8WRvZ97QkyklhUJe5lLrOHs+QniHGCdTVlw6JtjGG 9PRHCwKENh6mI9+EuncDg9h6mdawu36lQbPvkcpuuTf3hOASrVZKn3KpQHgI/C4ys1xOfxMj2iLs ujxoM8F4SbKM+SolXqAiG+e4j7Z4QQRqocWo+wbLAIAEwdMoz0iKktMMsl5W/tqllPFk8Q2EVCR9 uhPLwURWWvlXnJJSYuj2bYBa/RT82fPPrQEWPSC6ka3F4bKYwzkOjrYAXoq5Xm3VtHIlOl8CeCnq xCpMJUSjQKVfTFCYz/BAxgav5Pk3K94VtogLCd+YiWJUo6X3NlSJOj5dv1O1FJ7z8eikrx/Dpbc2 r9FCrm9md5xYVhQgV/fD9vGVJL+fzrFGk9Q6SGq0JpiWd3bqTWRHMGBdf+Lni6lDUPfN2gw7nUEk rK5RkUcdeKbClcw4p5+Soii1PbWuGcCUBZFlBBMz17Hmk48iChI7aDlgXiVPpHVRgMvkrU4sqes9 NIa88oqvCsX4MK399yUKZmfBdYXA8rYAWv38gQQCkEEzfp12El1n2UEMzQK+JzyD+wlF/uYu9HyO +lLxv+g9oJt8KkBJ5JYw7LZCWaoHrWuzlJi512ZjojPRm9rbfYHgenlsbSb4TXYTzIRzJq019OOk AaLD9HJsKX3l/e66ch/L5yfy1rnCcHDK+jk4kCaPesNYS2J6K6d/9AcmX6yQgsapbm8vEfBHcY2Z hvYCdERdWiTAqLnMEvhM0TxKOK9WvmzUWFIN2NqtS3UsUEcFPdOuJX5Gg13NgLWi3sb9UVStz5gw Jlid1cfYUgDGgtSUT/FsSxSTU2onjkJHnHUDfRgV8vEoQDMeCtcN3JlwFm7PzbgNmQQ9t1DwDkRp RmXvLAUl6kSqki2Gns0fN+LGp8u/SYD6qYEQX2PZTKBt/9pYHnPuJfNtqxNNtBFGCnkDFe4YaPmU A9kiJW5m8fBdZ/qSKKoGfgtcwyiP4LZrjGZg+GW6ddl+/H6pscXwoTO3aF/9G/eW/YUxyxw90ipa 1h8aLAHDv/SP4smhbNftjDO+6C+xNj1jn6X90lceraPKOY/kSVH7k5MfPrgT6wzJieCVD0N0ByKj eu9oUmPYtgxth2vi1eheGF3F6i3EF+gaPDBlSqQvCC3wZXndDDZI9L/GYnLSTBZfHNfXdRVe9ppQ SD1x/S04+N76TBULtNhnTpA3/NUEOF+NIEjg0rcyv2tfMIjdf4EXv97qbsnjcI3X0bJKmgjWsizY qXPsQFjOJZSOKVUzLrO77CQJbee4rm3Fo/yfewalcSInApNOeX1guUGhmh2ITdILKehq+AS1xSnj 8bDZAmcfrjT3SwRPIee1M+F/5Fv1kTmzBGVVJr+JPmh4ue5urX8MgRY/9QDmQ55/9IEyo8T1AazZ WdKcEOu0mgDltUYbU0i/YV/GoWmHU4XENlHKdrYI6i+AZ45XW2hPY/AYHVuHUNGn3BvXy3m2RwZk nMrlnYuBSS/boe06Kl8/B/UP0iBL9brB1SQRy11jascSakJdj4EYXv+y6XkWaCS4u/LJX9t+fzCk LDMYcgp46YNAJcElE4tmE3cWX2GTYZ9KSY5YJ0gXkzsw4rMs2ZFsEvOIqUFTLHeHyECQ6d8zXdG+ 2x/1bO43+6uqUFIZpN3H+7PFcl8SnudeQCrUZgfFbv35/OAy0oi1R9FWUhLbV47p4ftzw1C9zLjA nowwDA3+szSqXx8v4jUOyX3bntrA73+lg0uL27osVrbfqXCY2fe83TaCdE31xsOEjdwSxH9zavpB 7+w+xuV5dXQ/oMjZS5F3dRP/lhwg/vGHhNksoC/CURC6Z6Nu7ruxjwT+Y4sM4C5dw6gzU2crK6bp 6mLDTSqef1UAyy9/QxYkhZC5MQbOadp10OSBykdT5xrCw+ZSZgrYRuRpRdPBtBYRyQyEBIp58DHy oEHFWrsEmO/lnfk7kZcq5r0acw6ysH0Go5k8abQn/d7i0m00Zgo9Zng6vnGOvCzhkUmqeP7+axoy bEurs54HMS1pNN9tDNyk4tWUwMKDN6S2DrqdP1Ia4U6OxDkBjJDLdURcDwIi3ao1dJ3zpfWd0CH6 JQRgocwMqvp560w4wX74Gm4puNcvCInTtQ4I8Rx3RRtvAkG3llgbeEg6xVOFoc5j1h9MlOVPLNgY cjw4T/lnIr99mwCpBLn+2DmV4TJ8kQPB8pnzIsNpQQ/LPaIdTY5oAyaEJqDuCrU2OrTcUYnLwnhV Wy0W0RyTDCFcx/mnLyS6zJb5rFbm0hR60nbeQAkF/KN+QkNO6AhDmFm6Qm3PjEeCUeGKSoH/OgUp 7X8BN+YmO8s0HM5CgG1CO8ach4CUZZt837NV/5mMyr/vl+Z56kqhsZK9poAU1mkmiUpi1HjY/0L3 vZw4wBFaHYNofEk39ytm2Q/osBDpnkA5D5xixJ1eNmEKqp/pUl2UcBs4lU7y0t4teGeOLGINCXUa Y8/zKhTMuL5Cra14gDXfbreRNm6iMtrHvxfL91ZY287DNCMfAXqW3mfCrH5LExFY8YEBo5A97Jq/ NnHg6W4JZZ89LMrjzPm20pRjA9O5fQRKqyAcgrTRjywvKXsYw58eEbnhXMiM8Zp0+Kyvr4vPB3oI O+zTUvkpGBB6dUpa0rFVa0UJr07iiAZqOQZNwhqGZDVvIQPXbXFw3q+7tVGFjjbT6MobSNv6UimX HgX6+CkCt4cVe/UymGtwsQiShXTq5I5r8pP/6XCPs7e2P1voDSV8YXaI/NOFTmfuhjA4NTN+sp4v h+65JIiFh4G9UK39ZQ1nDuWZQ85PwBPsJA0aIqDJG4bRShNqNLKsGP4VK2hvTJ4uBvaaYP7SqGXy YnwxYcSnNv4sF88Z18GGJ+QyqA2ddBadSTFhfxy8KPQ681PHwq3FrcQz5Yv+2gFnE8sKtmtpro/R FyaNx+PLOe1HU+n2anOwgqvjM6s5kfWmKXp0XfNQUEz8cK/o5rooUAQjiDdvVgnCWwL6YZmb+bbH FxxeGYr9QM+jzsQTCiujA6RgeHcmrqsguLy/R8v+TieuGpnJleoLmODSpTekrYGL7fGBBYb01Ki4 xhxmyoj7hItdqGmyogett66soBj3NUogSIxRcOHG/rtB+Nrnfwj4I9wBXCEdGr6x4HBVo4UwzgRs KOPw40qgwKzKnhfByrIJe1HlQDpvwcL6eBPoS5qEX4y+6ej+OKH3uKkFulSB+oZ8JYpM57qP8C8S P1z8n2jnSkM3V9qfthJmN0it8VsnziteLwA8yDtemZa/Ce2XsZyQpSUlKobWOotQwe9GpbZJO7W9 2duzZke5lZvIixCEMBWJNQM0PeP9xIKnWklL0jAi4ZQD8kdCFwZLBKjUM7DujCsidekHFJ+X+fHl B1/PcQbAv+zfhIEzwKPW6xFwZlfwIhHqgBQ+opfIxOJ8/ouqx+ZMsC3RyBr2b6Bun62BE1GqXZOy +Vo1tP6yQVCVf+9NzJpC/tk1/dT9UF8w6eesDB4+ht6e0FNlqEju+Nn8cs7p78cONP9HnWPaHFkK Ll/bCJTp4wyJrtCdq5rU5R5gVz7LMN4Ym5lzps60tBBdGhCFaBM/mK7saYh6GZ1Ua09dZsJ1RcuR bg6muC1jemWDXVr/FEWtjAQYC30zCz0+fMUdZ6JHQgZozFXiyYmaMoYEXlb93Lc1dYS6swmkJBS+ LfXYXyTDBiUJAs9u/D+5cVAvLv5uF9aIfPA8c0e8SxswyFwCQPEbdyp1e4nilaFA0NROEuq5YSqo NXNO8LBIUbDtKC6GrYJWqNtVHizql+b4KowpQei2XhnA4xnxQE8vJtUgOacYGgLX0ZgOsajYfJI0 s0wvARtwkJgAoSGj/m/xYz/QwWm102F7VB53BYb3BrttrDlNptlqE1qonQmTG4hZ8FhXNSOyo+9x Qomft3c/3cxkRVUZBhDXM1UseiYaBh9bOib1NmNGPcdDGKJwVadM+mii15ecYV8vJpyPdNdYMkCk vqQPRZbyoE3TV1iRaJK4dIJQRVKcpdCjLWbccYqJ7j0lNzA9+uRB7zlg9kdQhTo2bHpJnKAXCYyS iJ9lE5fZrNLS6DCNHd1HYXLTc/1gj8hr9TNCttNTTi7mjYhsqXk3Rvk+ssn0Qdet9dSsL0dxjBto 9yjtf82PuxYBbsKkq+rmBRsYCHeSqLMjyjJFWWV6xe3BlDkjL6jlEWnH0eHGT3DPorOk21DD9UHe r+81oq9w8ld+tMQqVaSrznX84h8130M6nM/+MuKwf8+LDquy0jamz0sb+JUZHUkSxqOQt4Km4q6F ltTlt7GQ+qeCvDimOHvrdNXk2+5ym+fumwTaGL8WbKQ0vnnm8sQ9p3ksxJjfyfcQS9Pdm57dfn3i eif//I2YAAAAGBGMkSu8Hd3d3dwgQd3d3g7hCV3d3dIBR3ILB3d3dYPR7TgmbMmvNmbJwTOGGz7Z OanHJsua/u/9ZA4fA8vufyehpG7YE2Xux/JjOLdAlO7Qj6M1vjHFI3uoIZiDXqR4bkhNAJxOQPzV 8jrwnUMuyg9LuIy/vICGWTJksgZres+VJgpF0zyN2CsaXmVbjml7xD9lit4uP1BPN32ZBgUdetbb yJR1MX6Hv3CmT7T4kfgItGSwqHDyJON+NwFtNnmwo7VDIUAyEYrjO0fjBzcgyHCmTuxQNYzdbL/X ZFQ5yOe4tStWn0kiCoOAwDxrLJZ+Kr+Ldu/DUD+I+Evwj/uOZUlirozd3eBt6gr/f6rby7YPcvt/ +Mg7JP/RD/40Rw3VGWVDJou2y1Q6jl4N8Kj0HgCDqoSJ+fiyZNsriCPuIaQ0waxcVLyloGMTxU80 RMa6ESgz+gSWXjcGHcudSCVybodysXffWOjI98Hq47XybyP9U6XM1GAjhbyIzJBeaOsebIzX628S 9RGNRdUSymJ9GqUa2OhPzhnozAWJno1HKaqrqZZji5M4nj7QKMDrLydb2O2j05OI32yxsUsqaFA/ ggiu239vFwnfsf1gp/YzrEKtCRUWKMQ59N/J+c0O/rFYMEKxF+g3MB0KHBvlqXKEB6vbSNAJwXCO 4TS2btrOJ574WoIKJfU2jHmi3vc30I8syz272TReDxYP5krsIVvUQAJV570gBreNPQBM99gGjJXX kqoWgnqRLiQNIVpuonfP49lZQAP5f6fFSPww942vXisiQ1VCaCmD+WSdK6QahlAvabTUZflfIsJo 8wr6zfhfV276bCYfAnPZvoKarmMqqp+edGPFfrAXIuctcfoWAP4rlDSYnEKvL4lNwQ2DRCI0AqKJ vHJb5CJXHaCdzs1xsoid6nDUi+s9a6lG8pfsL34q1frKnRSRFaPjoU1dN4A3185HeVn2gaVOUAHz SR83vnY6Oqtsha2XeuKjgyL8CK2hMoS5e7M2L7UfWfn3v5mMRh1f8Sr6oXseAYhep0TtrmZ6Fv5E lYiYYAR8sp2QsOV4yczfVc5DHew59Xrh/JPZMMnH+9ffFZTKmyFwvJuEustSNXwcUhyfI0o20k9k ofTQxKn7+w9tw8GMJRf5sAO3soYMlNc4No1uZO1BYr7EVsTvtjEFujEQ3qshZBW5eB8tdcbFTLea NFil6pxLi+l3RH/mcDkz96s7uWnV5YW8oSXMm12ErEjKREdXkyJWvCtiD7Fk1iwEWCvNRlH/j4ry nQSrdKH9ewhOLEHuAT/Z78xDV05HSt9JKia4vwVTibT9RFQL90Yfj/G1WyOQ1SyMo6PWLoRkW4+c E/ePnCc/XjKFcpU1sysB0oBbwlr4CzPr+5rz0+xk6qbGIgK01M/+ayUE/xMVx6SCb5hLEjidsDea Jvvovn/U8xUBcewOeCUkT7Pu68TjFcCbVmpG96oaMSe9v9o6MieexUBooTKA6VXsh6Z/7YBG3ruu WizVZdvzv42jON6HoHigC9NlmNmYXzhaeZhqEd8oTIZhoX9rjeTrc1I6CLt0g8Leqb1xwBXWojJ3 y93Q+nhCozZ90pBjHisldJTx2VAWtVqoJEyOJFiuIaaJUltkZLnrFnFOFIOu2pueiMv/Fe1XQ7vC eNMB1weHRgX1oJwEXffRJniLU3/BO4JjpZwbZGcMGF8FATQAKcFoUS8EdNGRn2dFm7KShkMyXp+Y /Uy2qVyl//z5/Dwv3e+AOPbySEeBN1VO+1YGkRBz7kFT/eLEtBlpZTlWF5PNq+ut4vlzobzQ/OZr /zzR6In3Bsdz4WLwRr2pT8Rj6AiK/6ufhG14PkHmjLdIAbj/hCvBOyyzHTcadMjw5SDCYUVYTxtG rENirUq0hMQf1C+Hr4jTpcIB/sOcCxmMREnqTTrUyqpZzmHLeVD4OQVi+XbwlZqMzcSGThO8uckU rh6B9jY8GXIWAOfC2xumNGSla1H0bG3i5OZjbSLQy7pBw6rPr/TBci6b9MfGs1WPVFuM1bj7E1Kn dqDlDRs23P67TdUUZWJ8+ehJGy48hTfNhQ5hsjUB5qZ4h4XDgJBphqmEPvxcw+SyB5YqvsWOYyrO pn0JlXJAC+v1vOzGXXG0xc6TGFdofxwaVVIzzg2GTkw0USKvIZruRpVNARTbgs45BeDzm4RV9eYZ Q4aOxu63NC9wlmw9vEINlY/NKOqFyx/r66kOKV4NiydBLRjetZoD9V36czWP35PtAb2tjeWCvndX 1tg/5Lh2LT9C6+Qs5Re2ZslAs9KAv2TokEtZbspMxCsJ8p8yXZYtIxSdElOUa5N3ynA5HAeIdHby 1HG+jRdMXX0AnAiXxDyLRNl9zYw8ahJ/k4s+L6pLC8/RvfZiTrV/6QeA94PvH8FKYvfphtvEyxR1 cI6O7m2SyERZKcHQh9Oo7k3a0orWnTVw2U+zvQ1Jvb5RmmbKAftGZcLof5tryxX6QJGzt8wGsgTP grAlNLiJwedJT8ELoq+ypNIMxTiCpEjg34eRVm99aolsFvmSpKXqH2vqG6GltbnQX+Bz0V4Akm8L lwaVxo1pHTMHC8oLXm58JXlcuz0LoDXm83UE9sTmIl8S7CM/i59zVOMjDevDgUhX5Rr0m0gg2zUM ZRGGgHkwicviwxuQuu7nW6X44kcytyb5/Xcs8EfP+HCLHF1bOGIjtr50I4gZyhKmNMr+vEuJZOtR b9nqCb4mN3a+5wWZRqvvKp55dSPyDI4jW1Dd4DSh93z1xWl3ajo0c4ZaqHkJAYl50lsIro7jKc8V QIDae0NyD0Wy65hlRFTtOO3quxIHpaVu2ocSLf70n+hidzS1cbs4s81ppWW3+7biDk9MUtw8Uspf o9XhLT9HhAzqDUZCov99uY2xLLH8tqn5xATfrHoP9vxHTFFZfZUo9jh3t6fNqY3Eo47vji8qIgVg WA4NRR8hSps6iVxRoKcmkmREjwEmuPVvboNY+WmempaiWBNN0tkI9xy21WuXrIM5jzUTTjt2mQVK 74zd4cgaoqhNUTSbvYvroAIJ6ImsVFWz+K6W3LLmvTzjm+NDEj74gjpjHYhogzLdupPGEw5nG7nS Zy2SJE2NCr9TW2H6/X3rtZT6FxwJ+sTkqnSvORHzT33c/opK0eptjqpbbHsDPcKWtJ+GNGO2NRc6 50VC3O9LI0nbLhriI2iA0i17twztiWgQsGo6I3ka0JgfpOAvUZLXO3DzJYiU+0ZDaNOFUpqY1tW8 T1xntAeedUV61XLS9veBJkRQEHK1r1tNdn2edEpXsSsUOvRglA9PrNuJ2VJ3fUvgmnbLYrlPL7CT qsK51AUHuxWBPoYYkO6GZcM02l0tfqL9RpqpeX17CtjStdCYQeZWOVvGSLMOXpJ+YFXhv+3OgwJg 9l9FKjOyioXMdITsMvvi+UkrHCnF1epZ/Rm92JBlG2wvzhuIp14X7oGvDkGEiXgZsQc9nLqVYOq4 AVllCoyLdikPCrQVNM61tM81ksJH1PLdXyNQBa0RMX9Yjbt+UeWaqf7TZ3pRgNirU0F7e2MkKkE2 iU9WG9nLyMESyO5APkaBGCLHs0tHY5R0yKxqZrO84wQzZHjF4HfB/DK1heLX08IK+2IQwh1SIOVg iIvKYOZ7mnnKp5d/pqSWAsvgagD+GwJ6Os343H9Lf4OdxRRxx4cu4uMjP3yvvxUQqTd1LRy7D2sX ToSMxvr23fNAftdi31nfjS520qFnm5LFvUfwn9lm935hb/aymqD75HUsPSZeOMnXOUWACHcE7WzA KXIy8R4+w8L6R2YI32ZjvL1oQruJANnVRbWgmI6TmIBckLxLbmLF9IetYi0H8Ej7KArNrF7hr1X+ pnSEX7g1c5Zu/5JaKwZb5ageFAEr947HIZd69xk9KPfU2nspLyNtJBuwY+TXNQuJ2KxBT0Xbchv7 oJehb8pLPlXiogMbUqdurRhDUj92KtvzK3/kvZqh6rqdgM7IT3bnQJNJjHad1ykeGMW072la6l+4 w1AqtmW0PwHcntoMvywtpe2Xp/MHWat0bVPm4ibviUPRaY33SHkLyJdMM4ROmMHXHOd8WvOCNrDK XhmOYwYX4okDPJh0e7ThlujCGne4x+tq5BZmkdcmkeeXHdTbycmHvfEb0IEL2J5lZU9QMar1oUSt nI5hgT1o1Sb73uCAU9uMRkJlA3XOyn+kD61ICT6kdLOB/Z/ukLrd4IuK63gr5Yd93BpT4AqufK0k 8jtHfCUWlEU9zi4bwPuL26nV6MuifMkbpmPZVUsyF/XkCpqNKqXpo2fJtLWTrUvAkRd50TVqbxPw hAY/NgGRoXw52ND0gGFgfH99dY/ef9bfYHTTdVPXohyq8mcS4KdV5QgrRGl5I5otMiDia0bqYsPk nanBkr06cnRL8Zf8TaeXFZqjlCTT/KlSOn4tuFZ7vEJCagFlBOXkD3L58rlZIVJHUnlV3GmI98mO C2lNgRMs+KqpN6eSRDetWO3AokDct98L60aAgSaxdskwXAVRG0vHGPNk4o2+0ecaUVs2a+CcaQw+ drE5skyN23feV6UK51RCel2MqDC93dN39fmEBz4UbaJS03kLvdiKhSPk2/rbyHV/TGD4VKzCWU6D CPKX8eO1z+3/m3D8atJwMKfSSHqyuB0ZC0cjxIzspSbMytulWbw0CCMVTHT35lFSHE788Z+4u/th BX7N6/QrUH69UWFE7iAqoYr4LpLhsR/rFZj11igEMhGT9LvnbUgVfJ/QNXiGdVgv8alFMkhjInRh Yjf/3yDID4pombHtR+mfpC4xr+E2eE+Ypd4ZsD86hnu47t2z+Sh6HuTNl9uVcy3n6TLmouU4n5vL Y1tkZ31P9SQ9x0nV+1Rod8e/KgNv7rTISRQ4n4v23a6gxjHcNU0ZJxODBIkG3bsakdGcD8ym7d8k 9qNBWv6y3jP/9DRtrrZ3B57T9JWUbZdHl1cXMyyQQOhXDN2w9Dt3ZZp70C0bBapPP51oQSgUgpma Guo5utzzy5qnSa5NIhhDAXOqLGWrWvh08rvQrUSwMKRzA6z7/eGcEuLFoNEOoej7BSYxN3MjMA7Y ACmE0va+8v54rDRXmX2OR7l+MssJowI4jpZFJMYdtdYGbtI2HmAMVy7YdBpXbwFyL4T3hRjAjepc dzeXTJ7U7E6NcdZ/bUdJvQTH3Vj92lflyb24VTXqfpU54Oag77Q+kt7l5vInSy1oR8m/YjJNEYiK iUkmZiV1p05JCVsPzWwpfclOGstp3/zPqfTkcj33bnZfODHP1Oc1ZCuwixP7wYO+PPDDFvgAuy4I xZrLNwhiKCxf54zNrO2XjNJlXTkgjIPW5L3PxyGLFZdtYnXehd5Q80iFU3o9ei6eOuY/fjHF3t5M f9SwoGOuuSj5GRMxjtyz9qolP0bBz58Neze9PI3IU54Hj+7ZPHH8G1TXDBAeB4ht/OJjTqeS929f NLzcb8MclPbSX0JQO20kNLB0vO1bJfp68pFC4+Ew/dgmqSutIrrlET6B9T3n7x/noHyoAS45ZYDb +5MzNiPulASYzUJ5H6xVdcviBDJnlokxcn7uqU0PjMMgw2jFpGWfOFL5yw4/NFXsR9h8AS2zo5NC mg4V4jyFMA7ad7q6bCq6ZykssL0VjrJDDSBOrJcJ3gmsO513LhwK/DzyU2AE49GJZO7Z1mP+Unzt Fk/6+Z8xzQSEjjaF0lgzIB/QovWnaxhl9ddjEYJPhLsHgQCl35trPZt+rl+XaCHTQpC2d/HyyJn0 7dJQlAqBy0btwSmHW3y2dtbuJoB9ljz4qZpe4+7ALfyDgEc+JDpIuPP8ldlGZyMGr73BU3n8lAR4 JrvbitWK/WKD6SvEFsEMxgsZ8/sP41ixLLsyH1v6PpWjLU+fL6a30cPPznPwAJ9YR6v0Xt/z/gH3 1hl26xfY7UrEc/qURWWOrdBD7vr+m7ie2rWjRmuR/wgrsxpIFgtpyYVjXDjGS29fXuDvItQ5+OvI Dz7BjyoyRibk+MRQKsaQz+P9+dBO3EfJDnqRXNaEX/OjvKFB4ZijzGSYzZARyCqBr3/TeIzvomid GFA0d+n/rssJ1AOwYvyTVoTWiYKXIGfZIU98VnvCDqrwL47IUqPZfbJVaTW++JiRExKQQZAwlo/w +7nWiTQqzw5JepypjtOL2Hk8BvoLcQ4xIOEtlsNPfzO2crPKBLdaKf7q1x4tr8Bbn5lbA8Edb7+f XnBZC8dcqoL00bbdVT1hpEXr2LFWV84k62wiBXYHQU9iwDstkyn9bJ1AqCV6yN8p7kQDfTuucXhG ydRwAemi7DRcHqLmTJoHMK7fKDy7T8TGKSfHplO4tAuJJ/UqtR9fkayb32WF3T0H3NUUSQX3e1Y+ 9sPr/C1SnJBSC753s4iCiflTrOnaGDWu91a5lHDBWzgQ/MYWR4xVzh8+PIA/sUidSiRHCdkjGxw0 bADUgLeI2UUiAAuHHEGAyvHqyf0Ufq+L0ExpkxyncRsUUMGezTcsmnplgSn8/MVx8HFDCTnLrv1/ TrGBdLojkZCNk8c5hpe4qNDYtA6EF9+yBa6aqTNq1ejr7PZpN6kKVu6yqm0IQngFWGbIL6llkP+k C+PPHe/tahScSn1KCgVkWdWjFv2QUlKo+hKv7xIebL5ZSSj/cFGFZ1MZSvoy+xFKRVvjwCpNfVTV Hze72O6OC3E+4map9FWLJk9/5n11FirXtkpDhIKzk2rF88/yuuKVSOrrqsXMeyiAMp+d7QlD0ygW Wcf/viyZ82SyO01sPOSNcjnIDZoC4hXTd1EX8uPDqDxiMOwGrrACeJPWTIP1nxqEqlaPmPiCuCZ0 VV52C2I9wXLDAiBI8UMMMtNsv0ZtrpUM63oi6PwxaS/0aaSbPpd+v6RAW5EJWrolaodTALIexkaO VId14K0m8GKojwQ9XCgsh3Er3I0bHG4B0CQIhjegk/UulCviR8UexPwxd9L3+5vveUHtOdPNgPQA OcUKIBJcEFU4TBut/jVXsOEwKczxJujtt3dHprVogPighSHQeT2gc7XKCk5asy11CuaeA4rL/8Oh 4xXOUNDwOM7Jh+pVp0G8B+o7XrkySHaoD4+Nl8eLJPpdfRm9DOGH9x5A70mi2TAq+ZIheXLOtTp/ wP7zcmwIxrI9/n+ufdV5BTROmZnCx4TPVFGEWvCaQbVggm21vWOMtKyNl2B51CU01wbmxHvgVgVw Aj61UZpEafrw54c5YwrYE/Ndc7QnedreCH6m7oraI1D3IJv4LGDIZzQMnJVBAl9GdChIsJrGqN7J F4pZ+uCldV8EXIU8gFsfg5cZnizj3e+W2/2aANaZrJYn55I+DwwLF7mx971S6VhTyfhkIFomR/0Y 2EivpAyPAppmM5/iDfPb0uAp8O6QfQL2KmGrvH9EOiD2FQ2fbl9TPAdtGQYM5fkY/nrLJW6+GA1Z ZoYPdd8YwczyIuUQYY9ZMOMNNOkc6oBnvv9TPbfoKIWeqAAJ8EDuv5gRkWDkCtQao48+tqltCw2p kxA5OIyUNo2ctudbZmsRvsTFoIYrwkC1MtTRu3KERu2WqjTmUQ8FOBJ6H1yvODYTJXCKBLVkVEKi Pf895Pn76S35pZeMJBM0UDpeLFGryCfzFsabdAu0Eg9k3Do3/HXePNlerqxlckX1mZkyqrfdUyfT CLF30dEoTjH+463asT+UXKij5DESDx+2mweOoL32XKIVQXBENmWKyWeaK6qvO2zGQA+iC0Z/pQCb wZIOsFPsf50MEUv1IkcHUAmiRqJoFUpanvLfrLQ2ro9RscLmK4DqK5WDIKtiv32fRtMPPn0o9t2R p+WcuxFkmxT7dYMxcsgwWH96zzE3R5srowTL6AxY3S7SxLDUueyQZ7wdZ7mjlgYA4EmRjjy5rEc6 fUpZKQ+owPR8SAufklD6Jv7DaSyKGoZxru5MfhBdkQ8d/GdoyPSP2CuFJsLZznnnDVs7E1FZJw9U cLnlo6iNlinMkbYwPBhQ3o9pX3hziOwnscLEapChYU9GnccvX6gj7e9QiY+PuTIWrxE9Qk/m0+8r Q77HgvHrCqBwebw43ZvOYpOEw1qa2vvSPXINbBOJv0yeFfR2krl+CUrb/q8EucUjejeGgRdcW1vO zQHjcC/dIvpMZGigxaykTAnupb91gYYE/vVOVXiTV7IBi0Tn6xfaDuGsp548IlyDMH8ZlKPxnD1i p56DnwDCpENLSPVD11QlRMfjuDmbPGvKRLdFo23kASA6egDQ3B4bofue5VjYyw5ZYvG8yhROhROk /dL+DvtHIsQkncwU+2YBYaJcaca0FHYgl86Qip/i7M6yjT2ku2sGNJUETUOLorKrCE7bg2XXVLqc YaSseer8Mq/mQM5STWE290s8tKYjE8/40Q3yl7pQi0amaOKAIhsLLpEOv5scphbv2PCX8CX7H8Bi 5GjVr+rk3PBBJNWzEW7Ko+1MNEkaSHwTkBm2i1zYem0OYZCBDXRq5Ycj/nARDPplnmCE40Gh6qcM 1bPqcwblpZQCK9QHHUBGifskWIZ2muvbFCpxLacPQLYX76m6WO/qqUgqPQ9N8O751JXkVJaS37gM zdFGFd0hdTl4Lf3VYEJjp8ygSux7QhY4K2V3yWkGISrkVmpBVKSJ/ZApdvl/plPHOvVfqxjQ197A vgFdm3d8hX0/oHqkxpQxPXk4CGn1Ul1JY3xLYIdm4zwswiu+OTcegYG1/L/oOup1PzWkAylJjELI J/InEvWszUY8mfol1ThXSdHb+IwdKsw9D197e6H2zi2psp92TuiLv1qoOkksbmMq8Ecpp99DozFK TuHQNHYeAXhpUPInRj3U1fEHO9zG+eZ1uVWk9s5vXA6elWLWFKpbKtGg7Yylius9pSahuvRUdKLl hjm6XozfM2VyzsIC41mIbg+oApoWPHX7+Z0DSoX3R8Xd2hIDnOs819lvWuhlw3A+1zNHYb/Q2/+2 2Y5k4Jz7n1AGxFJyumx5J0WvzZGnPR75m8U99DKQaEolFn84UtEw3qSTQgrMQbX4g2Hbm336w40I /ok3GHzJPbdHGfjUWp7GeYiGKIsFW1GGSNtUbuAsqyOaEc5a9ciq8eYI/pMgzPW+53rdrSWQrfXB GKzVTVkH6HEz05g15MVe5PWR6UwF3wcypXIhxc4J1WD438lUC50nSxz5w2DMWZvq3WqcqhIL/Cye JpxHZIRBTGRLqX/9QS4fBzi2VNGu2F+ouUV9T0mNF2/KOsFld4m5f6txoXjzigz5HKoEYROUrSzJ QSx609+xgr5u0lY1ASI/b/XWZ3MAILEEP4W5R27x9C213/RjncGiZnATDLHEiAFNRfXGZGkHiuj2 9FBO0/+4K6qD9YqsVH9m687xiUNxzNiY8EnwPGiYLd+8lVRkuoOGLvOjuW5ca86R7i5QvoabvlAk MGFBcSlSROvdKTTB2BXDkNLk60YiOcxfgMMia3iyn40kK0ecdKK3d4iDACXWyqWtL4FpzcF/qCHa mUpkYn2CMULfl4fXdej74Tobse3NcvgWta3F8/VT+vDCO0a3G9Vqr91GH3IK1XsZLFa2WYfub5j+ Ogql5+SlzcUt3coWM61DnjmCEteFV05g7dLW8xZSvktQczU+Fljs59tbNXoL5hWWgXlgG+eXf5GJ pS3fdEGGgpVy3tST3rO7NhWcYeXZ3p6F4SLynPlX4p4PD5i266nzWS9tjpJUySktR6DgTPZhSL34 YOVzxXcvo4cpIZ2nZPnOqDz5RHZqNl59mdXZHxWvjBGo677g8MfpG7MEbLQoa6F8JpWfY5HsRJoS DzrzKHgn/LFrcqcaAbpHqxWd9WNPSkzn10d0YdVrQYTjczNQQDoEanHsivcd4/n3xT9DpOoOf7AD j5XTMxF9CRuMf5gJaOUCdK92t5VF6OxKP2XmiBWYK5lIWCEZUcynAmT3pcIW/5IMqZbuPGCYZIy7 RbGJyUGnm4IxQk9L8DEWy9gZKThjQyuuggJlu7JOAtKPMPrNp4Kbe8hKYoMvuqAILGLM93YZXK6f 9an1y8SkGBaG6Lgsxky17DN6LXfqLasM6ZugjNGfWKcYpAVcakGXNV7EdiVVkisLQwf5yaRr/2rB fbWUZm4CT5ERcJNeju8srIscNqOukfyIqj9lUJ+ubxqbWbo2eXgNQiShK7uQf+aU1KmdMx8Oxus0 uPVshaoE3M68G4MFcRTebP+YL/XskQFaKc8tGafYRUTyoJXabbqCqsMofKw4C6F4v8FJ+Eju8s/x VdPgNEW32NHUEEcf9sok2ZFk74iRkQQ28ZWltHPeRlX2C9xyes6GZf9wenJeZjugUOzZasElpSSa mO2rJnfnezNpEb0vW3ebX8/HU8NlNtQXvSIQEjhJzEJCqQ4al1CnxTnAKD+yRkhSMPMwcSwsT04z 0rBnvnsmHfC6hVqYUIBQmDRNqqrsAX4RTMis12232Cc8pbpnpB6bC3Xd/+C2LCp+cYyM8kgT5+Sg rxVRQFKPobVzsRbasi/YkxDvUUeVvx7yRmNCUSbStlJwxoTskmk1O2fWoPvArXFQ7+5hMeM317jC AQBJhq2fkS5+xiqHXCA30zu5leSpTjV3/pTknYIQq04OdCdLki4k1r3l9xspIzKrefujR4adnD5v 4Wc0Plsjogd5riAZQpOj+e0YBNVvA+JtI6+Z9gRwL9IUumcL6dlp5ix/QoeJio/0xP5jw6wzOq2b eBbZ0ZfuqhzoHJo8zP0ferjYLwI846vVQO6RX7yUwDJftlIz/WZKTAmM8bZeio3dgUJBvv0S4GDg 1Wvwn/FQY0IqVmD3kyOF3DMKUaWCvtuRYXvqrhngFOub88MmRpl9+T5zZTG9RoJs+UOUKjab+1c4 g8PGeRRBiVbYOJx42xqHDRQ7rbJBSXx+LSOba6iJZrnEX86AduYu43cX+xki7rpqPSFNiieh/RZ6 k2fwakeK1b28ZoJ2N3ywkQULA/HBGJPa3rExl1cjoDgJVUrGAmpZj6NsLuVfgT7OVl7PEYyVUCLa zVmQtmwy5bcdOHcvyYPyfThl909jMLjMVoW3uP2KgDUS3DVKV3Uh//yNWYAAAZgUDJEHSADuQIBB yDu7uECjukEotHd3WDu7waByDlHd3ehQsgQd3eTRxi7oU0IZO5P8nMkyTVvdSTIZDJ9v/aNNGwCh zvnoEyXlbzvIefx3kbiRDuYTU9hjj/rEgYdK9UVOC21an8g/r1UDB/kmssbKWR1cg7vfg/Q9P5JL yKhVlgbK0wMV7sERougsRQ5ivC9osiFJK4gGnfG49/WfNJnM9JJEH3XTUBQCwRKPQZ70xIkbXSlU 3aH5w0JD4QTFcK0B5/vS1Qf5I65cccY/vfg7YSx2tlzDUJ74YjLB+7hPA/SXPCx6O3+FasQB+hMj NyoYKP0eXTRMVqCaPaMjuFl2briLKaP3MzThjC3yuPWVpyGW6edrlfXfxyIyPHUhIclPop44a72k gr+vaNtz8LC4rhpFwXt/XAO/8C2O0xZaRK4gJE3vDu8OpbMo2AtLnawwVJIWIHhhPFkD/1V7Oz+4 chr4KaupA9KTdljc51JzoT2J8xzdh1MX7mYUCJIBhaP152EzjPEh0w+gtBwCSQ0pCKeEunwnzTNw 3h0Uf0TGajBpaIurZJb/pSo2K7C+0PN8Ky53wQLn2oZZq40t6Ybf/f1ENnIfTeZBF7HW06z1CA1L Aum1TCgVU87fieUGQUfDF5a/8Sao9/v3AueyRtr7LV5Qdt9mMR1BltwPmxI8i2gPKzS3NvLubtUu fkbI+JDw8d0J1gYS/yGy9fMo/z183rX9chX4PoVIlWd0pzOEMhliHctDT38shRTUUvH/XufkiWPy DUVmldB9qh8yub/Djt0ilsw95vxNoC29Qxa0l2n/KL6GCD17npQzBF4v0s/a2bd80pchpSTSq3OQ YOm3x5WfjKlhC8mbULRloZrR6+57DXINR4SFXA1ETnTnsfQrdaLHqR8SZnEA8+ApwTtv0zKkAolN May8FfVvvvOToKilHU55GIktj58mDoagVxWzvanHZdoVXu0KW4IUXv+Gdvl9vqS5K1+IJ2EN/5xU LQWy0scyHsfktRHDfTfUwqrPn8VtpxKZJyzNY9rZfZcg+08gScI6swaXvZ3qICsYc7HCGCH7ywsn 5qC/gpb2SsaQWvRK6httDO7dhfFnmv8GgzgUfhVByrqH3JMl1Ul+e7/witIz11WpfeNTBOl6k8su /3xwb3mrpTw9/eOxe4pyekLm+jowXJ4ZXouQBrfdTfdIRMPk70vDRtcG5fEupp19X6ael83t/MHK W9xTDGIfmgHf3FKiHl7i0gEclWFXft5HXWrJOOMqNasC9ArNkgOF2nlgVkt8iF7WHoZ52oujQHn/ GlinebEDeYrrhIth+OVZ2nb+nFdzr1AFDaxe4RTehplaJvH8r/GZMwXGVMhak2u+mHm0kKyWXXWm K3+2Rmv5QeqUK0U7LZ/VU5d2TdfH3nTlylDIBd7RSl91g5WPGYUIzy5Z/Y/N4UcwRzh0vMz+lRZi BS8/6VYkvwWokJHSyFmOXIjoY/UgfHQKDjsvG6nz1wYcS8HGx7n0F2IE5/luc35YkVXZSEC2W+36 8wd9NS6SAa6x05ioaDZJryv/IZnh4R2QQ0W69Zb0rBpKvGhPn5fOZfyhRaoY5yhtFNNDKRpjN3uK YrQoIuvekKbOZQ6/P9+qPJMc/l02AnWFv+OBfrc+Ldc7mHj932+7j9rZATYf6ojaNnBcrXnkySgH QLza4yiOAOOy4mhzMMdHrkP6o+PNI9la2LoHx6BEaYbWf2p/lJCQK4QOLp/quQtJNkM9hn3YT/g+ 2OCnErRMyi7fCKTYzePuTbrSYtKWZfnUJ0rEct1oFEoWWq6IT4ZyqXQ5YlN787U6KImb7J5NXtGC I8f9Xr8nMbNz5bH0430gu5aWmvmZFRJTAe0AbNhNvaEQ2ln9Lw7+aPzLJCmRo7B+i5x2l4nFt9GQ pcKE1Fu+TYaGn8CpXlXIW3zyR/0mfGzfooUreLqqLu/JZk3gnqu/b1s7KdYD+AIrwEsoTUjoWky7 DfqNDV45kDlRI/Vpja0QN6u3M102cvR4Q6futY5T3dowQuGPuZn7nCNarTAT7XVkPeO07xD5ipqB ztGUdfUX9owlQutB/eWr23FRgza+0KDaNFQpXH4UZJFgyBpP07BoMSav5ix9vovZKDchiHCNX8nY lf+UH3T3lztb+w7qQ4IIIrOsoShdB71CfglOumHtPXdVq2oUx1zDral2P+Omw9vKLs1hjt2je4EB vXPp/iPlWLunSbccHm4xscuA722ob+yt7HhourlTrMB+qAFuQbxM0cZ+wM7O3jiyXEZLQj4I05L8 dKERTXUYB0m3db+QBBzz/4zxtY6sorKdMRIJGVlmfe/EfFuHN7+3VvN3RIrtN4HKL8FMyRQ2fid2 5g92NzjMOx+Hd2Fq8kALEsm/b4nf7Ca7mRCX69C7eIxzmagOtIFTLvjv0rpgf7J+T1hzlfM4OYFT Fi+yGPgQJ/I/J6UT9rXAd77GeNXODOEdN5/N59kgGjblxwTTpxgLOtXtNaMyHGtYO8yYeEYutiKP OpGtIAKsa15WWHUf7p+jwYtb1C8//SsgggibayRiow8qr5ebIvBApOzM44BMjiASJ19Er944Hpy9 qNnxILgvOdW71Saz2+Fsqw/maa5WhNJfMwK/lkDPr3NETM8eBqim7xG7n360pYuda9sRtsqOD9BX 66/WsecTO5kIhZzh2gKYp3LL/lPbRk50FqToU2HRybiOjnkCggzOLIl97LMiFZQWwpv0sNM1Q6j7 rDj6uWZpLnTUjaUT3CdmkEkeeHUkjfRW2aR7b+GlUY9SjS7D2I8SMBH0FWGez2+LJQJ6ez0GpPHY jlKiYrCB7wH/4FNsNVMsDN8ZBM4JFhlxShiqhaQOqri9pov5tEDZ38G3NmCK9i7yxMZKnuDFScWE LRxFQ7RtR4HLblW5MMyE1WuuW84mN7GI+uWd2+waPf1Y14B/yG4uT0sfLBdL/j2PDiu1e2dD3tpz JGAFLoTlDPMy8pl36Xkfqn/Z3dMM66kZpNPnINXmSILFcefbrc9tlsU76DdT5m34E4C5zjyaTWdr d0X9+01eQ2ow52kiduTl/1sasZ9QHH5pCP5jIskJ5rdssMz/Yxr1O1dIMpSjeJ+SAsUzNXrQKIYO RWinO2uHnNymVkw8d1rsZfK1hzwpICppiVy6mK0xaZPVkRwoVFdcVpZ7wH1qLk+E6NKcGqetWZGk 0BWpD2G7PqFfXn3SEl0Z8sCni3FL4CK8Srpo6cQ7ehTzKNXr/f3v2YVoszIj9O2ypXNQkKIqaMPM GvePKQI8b7TJaG8swSGkW6atxMyup/xoTZVm6RVOLUxfCVC8Izf7FbZWLBj7VvCjbpQfQfzMDQk4 WDMSS+K2btCpTz2dWGCSbEB3TYmvhIeETs2pDcbtxf2Vr021AaudQG7UeEGSuRCY22C6Qj4Ac8pb 7jpnHPmSevMh3RUO/SCudks+KvHfBqyEluH27qkgVvtCuR9OOeYJJhXtKlBToyfGFZLwE6Z4aRlp x1rfuol7h621PgmsJWQBVq+OLIkh/LQYH7fnDUaZAIuZSzL6T9JtN23Gdup74jIh8N8Vu8+wVV6K 3nZD0FEEiNjfFsGhHWzKZ2UEaRTMx9OcbVduRSUBWqIXrt2OJ3OZ1UfcsODv8YaxbSnygWvpAni8 QQHijzKj0Z9gQdFAe1jAQyenUjklGn+qenbQOOQr9pXlq0tml9mj2H8exslhtB6DmGKTOUNyReu9 vm8VyvtqVt1YnMKt/L3jEHYIXpRnF9JXWH3AOEG4an0NoJ0z8/tFE5lLrqvPDYpIvhfjQ24nUx9S lUTDpPfdgeEcCnwQLpqeg99Zfik/t9Pn3Fp1je3J/UyvGdnP3iAbhgHklgYDnhyHbJj88Urhzr4f Gf9Rp08eO5N1Md0R8fYUY8I5TBVpB4oMaKtz5dWwoOug/Hz3nrG55aXTrr6YmjaDL//dYS8IuDq2 sKozXQsCaaYcOT4alhtjJ+8OHogBxNYunkytQNuB9q7LmWzpWPZQ/E7Mbs/IqUDwecu3n1WpCw1m s7AFXbGHGP16MeLZokpNYNb80uP9z8NZSDSUOLV1Kl8ilmqexwOZjB+eIGuiqoer7yCOl2WbTSs7 hLNxprUx9Cd+5cVvogD35iChuybYO+sjZsdsR0ULTxcKnS60eiL33f0Qe3Jeez2BNXBN4ZGr/ehn fUCkyRrg1D6wrkeXFBtUuS154vHbfiJH7cnlARTNB1xSw2YUp5xit5/3aYr9hsrnlLa0d0X2snO9 Ui+7ozMGSw5MjR1GwAkwnRXXrtYGJ/qpzNfstGxpJdC9uD6jjf3pQYKdWlXWG1mJLObhcFE3iOOY IZhvQoAVLe5bM/bDxwrpiVDuiQqDsOlTl/ggK9Os2BHJippX3zvEuUCwLqeXIuN4bXp2yt5RzLgQ 0kFrBL3RyEjidI0qnGVwhVyNa+I/1NrpyLAIot13lyNuFqOgZR5DuLGIZjInS+MBMuHKzykJ+/KQ 8xWc+44xwAlXKEMLAaxe7sOx8KfbwMP3Q+js2f+tKlK8veWN+f8V3IcXXMiXNUWkLxkCa6Ywn3rz +TwcPV0eTvneQl1ToN/rKH0xg9mYnsU+hWaAnRK3Icuwo/ySDWgfh4eNWTUrZ4v2uhmx51xOYEuN uRfZkGOdFsXl5Rrpek9FiAURnFFnR850wiPcC5mOKl2cSKc9MLWj1Px0r6wZM5Yu+PDkQaqCO4FN kLDma6E0MoQRpw5+YktIcHTcD8xo1wAZxp+L4ylNnvk1Jj6eNzkkrpQofnI3WvxIT4FFe6Dzt1wM vSDxxUN3Af0bMx64eMKcUuY2ZappU4rMZjhaBqnFtC7RNqYAa2VH1u23zjhlOoqwmTr2EBQktdYU c9LhfZPMuTeooI9RL2hyoh4Ydlks5fLyFtB2cRrs5GREhNNLWI7Z753Y456pOvG9beHJPQlHES4n LBSeVYsw5LSn+XcMDofCWsn9RhgWogddqQILbHVU3u5LLBPu2g8em9Aq3BTcV3mq6Sb1jlNTMqIV 9ODk8wPvfHMHWX6sYl9wHudfvkPiHXPArs7qC3KT0q55gStC+O5fGlxQTaeT73l6DK6d22F9Dm4d KTq+zKnQdphEcO/6UQLg/niPOqQ62xT3Rx5NRGG0b/HI5n7dJVTTIKJuYT5ISLoZR90hB4UkcYdS kRQhxXQnbGiwYTgF007UyJuRIcK1DzFFa1DDbwCxt5FyTGtDzC/zxR/fQJtUp/RV4ZP02AiRrQ4q cQMmL9Rq/dSb4LYpcNtbex2KrCe2RE9Zw6mc5IzM3v6ubk9NX2BwXVJvjyEbduIqqUKQx5Erms55 2rWeEFTcsuCyDoZQRxOs+EVjZP/sKK3E5+nHo98RUh+4Jz2xgff+X+IX7nB/rGzPCuqxzsowvnPE 0xkXsInnCqkrD9miGTbrl71HLagWl8/ufN9u7p/Vv6Lq4ySrdE41DQ3Dq+eUOyyy55P8galVUPxj prWcIlD+7x9WSuJzuM8P9KcUhx+4PoAt0Y7yvuSVsiAldZG3z5ybDzisY6nEDeuc0TkayymxS8Nn 0wJl6ZawWwPBol+zumn87CRr/XidCWzRk6cUgkwo/OWz4R9vGs2yekfnoqQ5qzktOKDW4zj+GQaa 0jv6kKxmknl4Y6Bc+l0cKPjefkEocis1kr8a205gmxiPnosnjvzqv8VuZUk8mKB0UUrREr1pRtGS bztwNSnK1KP08GU0HpnKVgx/mLCk0pAZ10Pucor60Tj6tyEeUIs9VDE7aSzWTDc6Mh9zdn2WXsXX /9ot322fRHZUvyUDF6Nb74m67K6l/4JgH30zqGdMarNeBoMYVfAbTEUi1/I3PZjo6Eopx5B1nfhM qfr5WsTLzITv/KHdgouCPNT+3VgG6Wx6IxD2JGK4lSX47dlOxmSxCBiepzN43/lTEnKi9x7HVhTt +LrWphva6glo2vZ3KwGFsmQl8+UVqo5dF5ESOVchXzIGWqtHQLBTiTlYwu6aGrbsucVg/Gb5ng9/ 3uuGw/N4Dt6MAIQsUjw5Cj062ut5I/emeKiMRZCLRs/6xzHFacfkW7kZ4ThqvYq+48cKGTvuzuAn lsnMaaWl9kIJu2jx60LHDJWif705QJPS4UD5TIDhncX1mbp/PJFQi4LBjwOzCL6KkyvucmgdCew7 rgJwuALuzRf1DG0KSoXXiyrH8LQEDkz80y3GLnIT523/nBnMQmEgP369pUoBHd3SsXMqWAPPgwGD 9pIskYbxc+M1AiwHZwDoH3mum0Uuk/yM9hq1awIZU+qfUvHgntNgk3dV65X/8tPSgdMeiT6kW1Jp H3aLg54XRHf72JDdnJ2rWdOw8w2RRuvBWMJa4kG7XjW8hiUYroIk4qB9bSbCrvKtGIAf2Z0XxAFv gmzd5PSEPhH58CA2MTs87NVRjE6xjh/D3xpv8vRNlCSwNUfqSldVsvzKoxzz6z2o9YHfOS3SBzyA oe5wJdDC2rArMgw56qjRDA9Gge3wco63K2Cj7Adzx8J3BwblNWaI7EHKtg7K7RtxG9T1VnZ4NMyE 2mQ6ScO/9UQ/l825oBE4AlzB2u/SXz+89LlLrAoEVZ2iKFCn3v+fG80wkgCkzvSn/5RrPeU4MNey f2mdjT1fUITVPxRI1mOpOGdyR5kKxrEJ9DY3N+/J9p0HNcPK/voB6kG83q/zQdSu3HI3JrLQhlZF kyXxJftFiFBdOHJZLuCgxmm+goPtjmo2hXyVt98aXXGMEotycXurtY19f74HrkPS2SjY8CJVsyR5 rKf8KpUjIcY7dL74l32Ovc+0GUT97XfqNfLHh29IVFFYavEPWE2Y2J8xqkBQR6//f0NKwGBmEjRW 7NJn79+jIfvA74/NME9UdmpK9U63kqVop6zmemK5arIP4SFtu4NAy0OyafOPQcuenmzMkTSgkT+4 VpLKMvsO9uBbffihSf95xfQILLSYGv2CJ8AC6ky1svKJ3Qej5sOh2AB/5rYexrATbvNeRPQjHy65 iLMiDcLk5h+zMJaiFmErNLKh+zjT/di1/YBreTVB7odYa5FWlmp6bhuQpqbBFfkjPlRyjQl8e5cP LmGUc8QhCja3ctAG36a8MYWNe6ErRwqC3i4pH1CIwQRMi4CKj0U5zdqb7JTStqFG/kgGgjw7YXCd Yvk0iG/i5iAh+2qodH+V46UBtGVJI0WpzX4aLc4I3bzX2V8I4+hj+zBOPhvmjrCi0Nmji5wKskm4 XlB/lc9DfQ76Gba16WwYjRT6EX5lovNfAC5eWgGqjrTTM4/D5I9eAlzz28Wm8H6FSFrkYf7ZNo3C 4Y9JZQRvzkm+r0HMDhzCuLI95nOLZrkgpFHkw2q5R1Nl0sRsQHfOSa8WvfkihIcDAqZnrII3eN9R 1LvObjJDZIeovFJYsu2JUz2qReq9gvC+D+FDeosowfLrCIMqRKKfktWqgGmLdRyDkTz0L++rXYz3 QqThTddMLmrZkhXev31nYxewAKc8Q0WTr44tbIRnEtGsaD0V/0fyM66+Q8NCC3WW4BqXuiYIkFed LwiavOcLl5c/J9WtiZtPA7WYe85e0711ayO7w1myytq5DRbGLN3UwGxWA7EGUIdN/ha8lPuKyyJK 6Ub10YQe0hsXYr6M4fl02WtVqnv/aoqF/BML82f0u4/X4Pii2Ihg5nRZl4RaVwpGMAOULyXizY6f cKiKPeXOnXf1QR8fk9C43VTOmITDoqpTXcGUbc0Y5ZFwr0rMf6J049mncFpkyUk7NrUs9/aMjW/J OiQNbxWbG6oi2nIPzoHc0by3rs0/7SliIByo39MUAdBvlapxwKqxLJOZvD9elvIqxyqjfoh0xyvF Wu5luSPHMg+HYeVAAXbFdjd9vePFD7f9Mh1mqyaFxFZJs4FNTrXqa3NTyYQFLE6bO86Y91bx1gPW d3dcA5n9BH+LQL5Pxr5Knxk/pQbbYOYY/1AuayoXeiRjU6Od34Z960GXnKTlaDwQ6gy5ma/axdLm uUgzxOTPW3ubRfucttWY0l1ZAv7UwvRH0L0dcT80P5HaWWJe2RrVzDbNbBFzdUYMRlwZLjdzbK2B NUVmdz2DI3asvCbK6y0KfazfNldOfotUUPk5sc8WZ10Rk98cOoshqB4jZ4gvIgHyNdHHyJPvkDAA +/9zEWoT+UiW8vTMv7BOcPMmRlaZYfecCqRFR63c083haDMoeyhP+TYQt03xRpO+tiApHy+7u3I2 jxZAr8zV2cT0+GApSth6xjmR4TTSrEzxt/8cJknrFpu1kQaIU6RQYkrVC9ioqkohFYnlsIlPrA+b 8RtUyaaGiMXRWScLugrlfAq+ZpT7tX9ZA2GC5r/L7g4UOGBv1wS7rKp9uZzQLyppdJA+k70RDwF2 HsTjYsF1oI2lnvY82a+2IOcwyn5e2xo8tLsULNonedlB8w0WPejpALbAUpd9mXE7+LsKzzfW5ZoO euKycsTcLfzEtnT9baOIZ1Z5KxWyoHC6TUNQv5/k7sVIEtJj1mEOXgHImfRl3NU19ZoO/8/AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzgAIJu6AAGqrmIgxWEQRF2DF7RCKReuIy Ipi9otFYIrBCEUxciuL3uRekgisIwRSDBiL4rjF6dKf//Rm8m8m8m7x/uTeTe/+/+yN+dCfOgPvn nv333xGTYUgAXB6PeGoK5hE911u/EHA0B8RM5NdYUYr2hQG/25Iy+jNaujZHA8cbm+CkVeCBEqFO JnneT9/02si2820uDkLq7rzphIPkaLlNzZ6z2Rhke5uaXyTCUGgrbcSfv3dOubZxZpkeGp0U4FkY JelP23ujoxGNoKw2bbh/xhue32+rI0/1dJLfisJUaePOdtfOqY+FOB/dK3zvNaKrXKmx+P7GewIL h8sndSiKFYaU71vk5fLsAmECmEY7JtZb9HKviUWwZ+8FbSkFoQeRvmZb2pmmbvSkt89bmTCXTczo h2kT7SMN2M8v/MOH0vzTI20oA0HGeNv96RnNNGydfj/1TiTaVvm6MmQw9yC4dGAY/L5XGKyIq/RF +7N8x9QImXNv2qmb79sPDzjLdPS9nKS6Rcz66Lhctall+MK4rJYkFnwBi4V3cpeUhce2DFqyGdrn Y9zUI65RqAJmdPiUVLs9dRsfnpvkrpJhSu2SDJcYWhqKNF5NUgZVtNCtlm7mNHETz8NmXyXmUXSh VocKVEAttepSjG7QsMKjAwyxgFCkGL5rgVLmnjc3zcKecw2zrtxH50ZZKYmD+6u/50HDr3kYa7GA LfWbT7E8aI/CbrF4TT0mU9TP3HA95b0rc7yX9RRGHO+riP8dc3KhDpHLJjtm2UeplOtwvvXa6bFM viW6PW8FfVTlTR75oMSbQ7TIJXNbNdY8C8bwth6aL1KJP8QdAXSOCRVOKD2CvwJdA6N849kAHeap iIaD1fdzWI9A2zZJDp3STfFxs1ObQNTJySeg0x9+M5yLzlOYpmgr+8kHZmuf9J/OMpLULjsn6Xtu NsQa7nbN0jk0lx7mNcavNaevXRmUyEiiFECc6C2Q5bxOPPr+Bv3UnbsZtBVOC+GxX5WAqGdhUP5b 4+xjD5GQXbvL/4cY6zTpAT9ZN499rcd30Yqmawv6Ao8qX0By2IziS57sBqjq+wQJ18ZC03xmufn7 h+4VTu3Tzp9PASjDbi9ojZ/W5R5v67Twn+l/8t74Vt6ySRRovK3TD2bInLyiX7Tgml23xzIajr0U DgzW7x5LYVi/mSg3hgu1yXfJFF8j0AwjP21qP85dBttmDb0q/Bd2zQXO0AWq1IBFWcacBGbD9i0c yOppFa0snIAeiX4CTmP1LkFdfu9YJbdBMlQrozcWIY1BG8s8VWlv2KSc0iNtAMmzWW8+yQVJuZdU 2NVEFwEnILS4nYp36YQkBNzgIVI8d4sNHufJkjgTDhXqBJFUdIDYvu3B6WCN2ipXw70U7tR/QqYU P7KgqnNfa76D9kD5cFsSa9WNZyw5kaHRR7mq8MxcJ9zC5Lqc/VtcuJuvVpd0bwl3vpEB/8h2Owmi AC0Ky69jCjcDc9RBAML4t/iKDSuahs2b+ueozltOA5dIWEcLK8CxtXKCOOB3V0LSqyFd+CrxIwzv +b7QyelpzyNNZub8HrrJn1DnZbhlCIrBtARR+6Obev3bC0SsqB4vyfZ+FD+v/GIDvItd8yvPVjQL d/eBoPVDQYoysyF8uE5l9CezSWyn0u5mxEtNZBv37QHkYtxZ7dxULGOX6p+MRnk00gjVyBMyriyo 9LcCfy5SJdfRpfOiPcKLyJft+3r9yivFr/znLCD2Gthy/5qEDwFA1ZyREy7e2c0WT2exJP4vYSP2 UZgGvzZ1ZYhHxLJHRSSrmW629zMlt2Z5QkzNXKwJg6d9EiBbkfYDa+F4pZbxfSut9QMcbjoq4JJv LhjhGDbpFpve6t63tzyQpL3P09R/VeHmB6e6ls39kJncOi8Ll5Yjt0db5O6bir62+SrD1g0t+axs rzXzEV44CJOERr7hvAbrdDMn2ekUMM/vFJekGsIiGboE3H8GpasN5d+ad/jd2gMG+LuzL4C84Jge +c4fH7eIaoEt/BwX84qubOj+RMaeYFfdY65Fz1zO0ePXtt90WIXcCtLIO46cdPcylbArIEZCeE6R uOeVuO9siFx5FrLC0rd+3t8a/HlarZrNTeWyq6mZYTzp9KK8IUPwJuoiB6yYXwJvEM3hgQ0d4ZtE vIpLlHS7nHquW+4Wr75J4OmbuJNIK9l0JGnYNHCsQFK+3+4ql7eYY4qxrnlInFIFz/PpSKwGR+JD hnJR4YRYxWWsYeICwT14divkPvUR90ihcdN3p1nOLHHKafrzenKX8kahdF1IS1wS9vm0Kp1GZ/9r 5m88mogGNtEXro46MmfxVI8N55I0EhF7/6eCC4ll8jTd21mfk5dranJ2BkWLLaNZv2yATDz4wfU4 YtLassHcQI8N/0M71smjkjPF9+oueni7zCQO38avgATNqAEm2yxvkyF3k9B8618/FraDuNqGP1R9 5jKg8bBKFEI9VCrnGXlleob9kylzo2ic8wyyVpuIfsb5xcKXfew/OTvNqytMXrOn8Qvp2zyD2n0L Ajv6Q+Vc3kqDIgX1OiAUpKm9awI2SHjRe2WfkWf415HnQZyo+LbZQscj5eDN9k5RKKApKAEC/1u2 xdn2IaUFT/g/PO/8w0BiWzQe7+ienh6nKK5+aDvmTSc/sXoFeCKzrRG6DdcqsVB+Ngb9/006PU3B 2Fn123b1re/rt4SgYUrFYtxZICUWF/gwB/TSxGj9KSwXrf8a7HRd84nuTEpe2Y/70v7Oi4ynRdSY 0lYdtGhGrX73k8kE5ZWqOwgjHH3c9xWk5qQ1qTftNTrqKx+mvvn71pivBwy+/iOqV7BgzMilk4U1 7d53PAYLPnbTwoxD4rF87QTDnGzIchp9ennXchsJYjKPap+hd/hOD8eOA2322KtCH90f5bonIE7r VryxGcpSwxsrxEr/9nYp+0akH2XyqfAjWGPvUe1XmdNEEm5ottsEpJJlxJJF7/nL2vL+nrJgKAHn /ujIguhB8Gs9BCnDi577fCQgKiNiIuVEaRE6W3EjnUty/dpAwClaAUOtDMCsqdWwML3lbjqfDZh+ Xkcan+Lr7Tabojj1W+tBYXzZTh67UlV0i+o8PlYHXDYKdf+U6E5oElxrrBVxw9Fg31dC9J1dvc63 sWk6pFg+FlRX2RIV7bsV17npI9DUAJMv++TlUqF+kQU6CZujSHH7lUqSIwgqM/cy7aK5oOoS+XEj bzluiSwOsi9h0cuLr/VYiOOXjv7LEpELrMqkEldAJuORvjzA0wkZWYHmuVU/U7ZptM4pmNsPYoyN 7EpBVaCxqAr68z5J7zhjAlwYixtVXnuLNBpbPbIqZ34KRWjRDD3HXBIex/ww66o4+oy4CH7uV/8E onsPN48ZNRKRBsGWO5M2WWKaEmuSdC8SvOulzknajMlnP7Dha5ILlF7sg2e4PZ4qbigQ7sGz6kaH YzFXgf7R82/6BeJ6JlJrOXRFhIsXY6viB/AxX6nWgi9s+AOuMfCiTa6ktSJmtJRMfOc0wGh2ReOO DhIMfXqylWb3xtubfw0OtSB6q130bQzfEtguqkL7q6nPcWCqDT8La9zvojnuOxTMtpUpd8bYo1NM VbqILWg+aqJPHAGfYgsfXps07RHQPgdOWcvTk6xXtGITyTWNt/9pmQep6b5K4MLY02iRKjpNfbZW vmTbFjH1hAMbSMww69XZysXaKQT1+NhLwVcQk/okda98BEj38EgQw8NU+H9okLzhOGSr+GhSvZB9 MbUYG0k9VhxaRg9Ni63xCyOEFNPRMmP9K7wb2YIWr2f6WvGIacKw5vvmTcrqqMCI5y8h2vDa7ya1 pTVYNAjd4knKZ2DrBGr6UCZatzanXFQfp1ySsF3N9xlQuyohOWl2hQP/me66PqzTIypQ3ILNJlVz Ft0M/XEZsEnZ2qvtHLdlsdT4nGuACmEZIS792vbVnIHE+wOcGT8ZfOSdLe4cC6jIy5C3pujeaWqe AQKMKh7QrJCdWQEUrTNmFQKJ9MulqtwxTpTeVgM6FqKY3zNNhaNsB0UUBq21pxTl29/UTVM9rVZ/ QGJ8PDGccG/Aei//DhZJpwvTN0YT+t1KjU9GdayAPsf+JB7nq3PH3z3X5G5wEHOlwEnpPk6Ovez5 bjj7FgyNfpNU1plnvkr8z+1sOncsS7q9h+KZ1tNCJ+x68sXMYv5lLhPFZ1GfePO7k7NtcO2HrD9P aEilww2fxHPcUSRhf94nMu7wjOP+Un5z2DhXb76186c1U0pteJo5G6+sXu6eyqhqbX1CZ8rcW28h 9NkdkbHQn2Z7k8KSmmmA1PtzeymxvBZyHbEeB2oFcVEJVm/n1ih+JZG2rDTRqPkSEo94WWUQEfE9 m0TlKQWLShh/TKO+YdlDWux2blQ3srM0SKXXv7TW0BN08iwWv2mu8w1LxP2SP76d2qoQx1cfohQD YX4pWCt1HJHM1DO+oaMg07VuQr8BvcD2i0XcDhuEeV0BBDm/9w9HN4x78KUdETjM3Yz20aACj6s/ UQlLZUAf8wprh7vl9w3WqyLrMjstuviLmeW2xpGXH/iYdzRaVCuF66hC50BhdgjbpgYyWK7Lq/6L 2ky5mmOjWqg2IxUhzPZq/X2fGxngG0ZMQJwTPOoyjx6cd7R/y8KiYM7zOQkwVaVcrXXom/7glnZi qboFUeeaHYplonTFblRmMggvglYq9vERUAPycsFk9vAJN/rWI62ZxH62TvfgwcLb2LF0QXT4TGZP U92BUUztQSx7mQ5PxWQyhbbFeDGGkp2H5y319CS/ULhGujHa1ycSUNT4T+cy7lI00jtpLPK5LLXf ClmDLJKs8SJBFi9x557vAI5HzvMnrY/Ow+Tyy7xgSpuIEuBgdy9tCwgqS1VoK/cEPj/qZy0rPk+r o0emYxUsqqJiyVk97d9V6bOfaZrKtL+vslkh6KpRoftiLSoVC9OmSWpjeNJilDE7YMAk2jW/y+UY bKlEbRU59mW7Wyf6pokDlxf9qtPXYUmYrE/BikdnygDvK9xHBn5xjn5d01RsUZT1QGDhziUrUqbo OJ/JntK3l2ec7YRC5zuQ4cKWqNiv53T6u45TRKrYLLitfH0eZdDihlTxNLn6LzKVFVV1KNKSblVU nQQJP7lu/WaXu9iUW4Vr887jYmKn+OM1jtvm8B/DU7hvZrSAVVtJ/5vehiEXSng/sMYP3kOEjK/x gJotriQAQvFmzVbIJ/REOz5OCDdZYoeRHKB87PKG7pvLYUp0av+VdIrmWSovnZiLFPsB5C1+1Ogb O1uA57YmTRIGohRMUJZQG1yREj6BTUj8EA4jMvAczXdNaqj4Naianrr+B1pNNlie3C5xnqiPNBH4 fpCHhM+HVsN2legBST9qVlXxPPQUdawoR8Em/+e/2aZ+04fGnBBKqSiYO7n88Hv9cXuJSO+tqOFS iqh9FqapvGbelOlplR5iSw+jgh8jO2EVwRSAF0LS3HD50fAIe4TK337GU9owZ+8PpCbbjSPf64AA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAADKqgAKaAyAACqSSo25UdRttttyo21UbY7G25Kh7G3KjbbVR 1H2DsOBbwJeFP/S8CX6Xn/P+UL1rCG+c39v4wMAgKnAqyCBIqRla22n+P7zxWnI9ZHCKp26nj/qX tONt/3s8fM38r+TMQaBT16+fhcavh8wX88+WaRH3dvd66TLA7EIpFRfYbV55pizbQOk5Pqll1OYV SmseX/tWGu5u7Si7yQ10sh4Wbz1JDgg0aLmdWzCl2Pdy/tE0eCth8p+WNYkAAxV/yh2Ul8fBpF+6 Haa3zDOKIvXhxJ2uMLXfXzwpaQPl/tsATkBeGvPe9l7ofk1NuYv9R9JIz4cIIpV4Yk8dEsQr98mu v7Rvl1b4/cdX9B3Wu5mnbpKlbV17BNUS05I07swhJRU79U83LOivDc1aL6lfEyPqGqUCma2IUpJV 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 A4UiBAAAWQvJiYWoAwAAYXUIuAEAAADCDABoAAAAAMOLhSYEAACNjTsEAABRUP+VSQ8AAImFVQUA AI2FRwQAAFD/lVEPAACJhSoEAACNjVIEAABRUP+VSQ8AAImFWQUAAIuFKgQAAI2NXgQAAFFQ/5VJ DwAA/9CDxBBfajCNnWgEAABTV2oA/5VZBQAAav//lVUFAAAAAAAAAAAAAAAAAABrZXJuZWwzMi5k bGwARXhpdFByb2Nlc3MAdXNlcjMyLmRsbABNZXNzYWdlQm94QQB3c3ByaW50ZkEATE9BREVSIEVS Uk9SAFRoZSBwcm9jZWR1cmUgZW50cnkgcG9pbnQgJXMgY291bGQgbm90IGJlIGxvY2F0ZWQgaW4g dGhlIGR5bmFtaWMgbGluayBsaWJyYXJ5ICVzAFRoZSBvcmRpbmFsICV1IGNvdWxkIG5vdCBiZSBs b2NhdGVkIGluIHRoZSBkeW5hbWljIGxpbmsgbGlicmFyeSAlcwBSuo4kO5ysCsB0FDLQsAjR6nMG gfKa86fB/sh18uvnklrDh9sAAEAAAAAAAAAAAADEYAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAJoAAAAgAQAAEAAAAEABAAAIAQAAEAQAAAoAAAAgBAAA DgAAAFAEAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLRCQQgexUAwAAjUwkBFDoqAMAAIuMJFwD AACLlCRYAwAAUVKNTCQM6A0EAACEwHUKg8j/gcRUAwAAw4uMJGADAACNBCRQUY1MJAzo6AUAAITA dQqDyP+BxFQDAADDiwQkgcRUAwAAwhAAAAECAwQFBgcICgwOEBQYHCAoMDhAUGBwgKDA4AAAAAAA AAAAAQEBAQICAgIDAwMDBAQEBAUFBQUAAAAAAQECAgMDBAQFBQYGBwcICAkJCgoLCwwMDQ0ODg8P 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 CECITCQgi04IiUYEi0QkICX/AAAAg8H4C9CLwYP4CIlWDIlOCHPPi1YIi0YMuQgAAAArygPX0+i5 GAAAAIlWCCvPJf///wDT6APYg/sDcxqLjJ5QAgAAhdt0MIuWUAIAAImUnlACAADrG4uGVAIAAIuW UAIAAI1L/YmGWAIAAImWVAIAAImOUAIAAIsGi3wkFEGNFDg7wokWcxCL0CvRQIoSiFD/ixY7wnLw i0QkEAPHiUQkEIv46wuLzuj3+///hMB0HDt8JCgPgqv9//+LRCQsiThfXl2wAVuDxBTCCABfXl0y wFuDxBTCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAHmPBACKjwQAnY8EAAAAAABr ZXJuZWwzMi5kbGwAAABHZXRQcm9jQWRkcmVzcwAAAEdldE1vZHVsZUhhbmRsZUEAAABMb2FkTGli cmFyeUEAAAAAAAAAAAAAAAAAbI8EAFyPBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAQIUAAoAAAAAAFxpbzE5ybvqAAQCAAAEAgBSAAAA AAAAAAAAIAAAAAAAAABkYXRhLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2NyUEsFBgAAAAABAAEAgAAAAHAE AgAAAA== ------=_NextPart_000_0002_35ED0952.0CE1C3CD-- From sds@epoch.ncsc.mil Mon Nov 15 05:36:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 05:36:11 -0800 (PST) Received: from epoch.ncsc.mil ([144.51.25.10]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFDa3QG005522 for ; Mon, 15 Nov 2004 05:36:04 -0800 Received: from [144.51.25.121] (moss-spartans [144.51.25.121]) by epoch.ncsc.mil (8.12.8/8.12.8) with ESMTP id iAFDZU1H027678; Mon, 15 Nov 2004 08:35:31 -0500 (EST) Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Stephen Smalley To: Ross Kendall Axe Cc: netdev@oss.sgi.com, lkml In-Reply-To: <4197A037.1020307@blueyonder.co.uk> References: <4197A037.1020307@blueyonder.co.uk> Content-Type: text/plain Organization: National Security Agency Message-Id: <1100525477.31773.38.camel@moss-spartans.epoch.ncsc.mil> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Mon, 15 Nov 2004 08:31:17 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 11838 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sds@epoch.ncsc.mil Precedence: bulk X-list: netdev On Sun, 2004-11-14 at 13:13, Ross Kendall Axe wrote: > With CONFIG_SECURITY_NETWORK=y and CONFIG_SECURITY_SELINUX=y, using > SOCK_SEQPACKET unix domain sockets causes an oops in the superfluous(?) > call to security_unix_may_send in sock_dgram_sendmsg. This patch avoids > making this call for SOCK_SEQPACKET sockets. I'd prefer to track down the actual issue in the SELinux code and correct it than just omit the security hook call entirely. Do you have the Oops output and a trivial test case? Thanks. -- Stephen Smalley National Security Agency From mroos@tartu.cyber.ee Mon Nov 15 05:47:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 05:47:51 -0800 (PST) Received: from tartu.cyber.ee (tartu.cyber.ee [193.40.6.68]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFDlkw6006106 for ; Mon, 15 Nov 2004 05:47:47 -0800 Received: Message by Barricade tartu.cyber.ee with ESMTP id iAFDjr612437 for ; Mon, 15 Nov 2004 15:45:53 +0200 Received: from rhn.tartu-labor (rhn.tartu-labor [192.168.74.17]) by ondatra.tartu-labor (Postfix) with ESMTP id 8FCF914C18 for ; Mon, 15 Nov 2004 15:47:27 +0200 (EET) Received: from mroos by rhn.tartu-labor with local (Exim 4.34) id 1CTgOY-00019E-Nq for netdev@oss.sgi.com; Mon, 15 Nov 2004 14:55:46 +0200 From: Meelis Roos To: netdev@oss.sgi.com Subject: Re: 2.6.10-rc2: still no ipv6 link-local addresses In-Reply-To: User-Agent: tin/1.7.6-20040906 ("Baleshare") (UNIX) (Linux/2.6.10-rc2 (i686)) Message-Id: Date: Mon, 15 Nov 2004 14:55:46 +0200 X-archive-position: 11839 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mroos@linux.ee Precedence: bulk X-list: netdev MR> I tried 2.6.10-rc2 and it still does not give lipv6 link-local address MR> to Ethernet interfaces (I tried NICs with e100 and 8139too drivers). Hmm, eth1 with 8139too has gotten a link-local address meanwhile - maybe after up'ing the interface. e100 is my primary NIC and is up and working but still does not have link-local address. -- Meelis Roos From david@dgreaves.com Mon Nov 15 08:54:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 08:54:55 -0800 (PST) Received: from mail.ukfsn.org (s2.ukfsn.org [217.158.120.143]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFGsmnG019436 for ; Mon, 15 Nov 2004 08:54:48 -0800 Received: from localhost (lucy.ukfsn.org [127.0.0.1]) by mail.ukfsn.org (Postfix) with ESMTP id D5438E6D34; Mon, 15 Nov 2004 16:52:31 +0000 (GMT) Received: from mail.ukfsn.org ([127.0.0.1]) by localhost (lucy.ukfsn.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 32217-10; Mon, 15 Nov 2004 16:52:31 +0000 (GMT) Received: from oak.dgreaves.com (modem-3132.kawau.dialup.pol.co.uk [81.78.156.60]) by mail.ukfsn.org (Postfix) with ESMTP id 36705E6A96; Mon, 15 Nov 2004 16:52:28 +0000 (GMT) Received: from ash.dgreaves.com ([10.0.0.104]) by oak.dgreaves.com with esmtp (Exim 4.20) id 1CTkBQ-0003AI-Ac; Mon, 15 Nov 2004 16:58:28 +0000 Message-ID: <4198DF2E.3030301@dgreaves.com> Date: Mon, 15 Nov 2004 16:54:06 +0000 From: David Greaves User-Agent: Mozilla Thunderbird 0.8 (X11/20040926) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Venkatesan, Ganesh" Cc: netdev@oss.sgi.com Subject: Re: e1000 driver (NETDEV WATCHDOG + page allocation failure) References: <468F3FDA28AA87429AD807992E22D07E02C6625A@orsmsx408> In-Reply-To: <468F3FDA28AA87429AD807992E22D07E02C6625A@orsmsx408> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11840 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: david@dgreaves.com Precedence: bulk X-list: netdev Hi Ganesh Apologies for not responding sooner - you know how it is. I've recently had a chance to update the BIOS on my motherboard as you suggested and it has made a considerable difference. However I am still seeing some issues and wouldn't consider the system useable yet :( Given that version 2.6.9 came out I thought it would be worth upgrading to grab the new patches I saw go through; so now I'm running 2.6.9 Light usage with a standard 1500 MTU now works most of the time (ie ping -f works fine, normal ssh usage and nfs etc) I can't test jumbo packets as mtu 9000 causes immediate page allocation failures: ifconfig: page allocation failure. order:3, mode:0x20 on my other (otherwise stable) box. Even on mtu=1500 I do however have problems with sustained throughput. The reason I got the cards was to make video-editing over the network quicker so this is a real problem. At the moment I'm using rsync to transfer a few hundred Gb of data. If I use ssh as the shell tunnel then the high cpu bottlenecks the data to 10Mb/s I use --rsh=rsh to ensure that there's minimal cpu usage the throughput goes up to ~21Mb/s (the remote server is capable of ~40Mb/s raw filesystem I/O but it still has a slow cpu) At this throughput my workstation's e1000 appears to begin to fail. Some tests: # ping -f cuf PING cuf (10.0.1.3): 56 data bytes .. --- cuf ping statistics --- 1483792 packets transmitted, 1483791 packets received, 0% packet loss round-trip min/avg/max = 0.0/0.6/3074.8 ms so that works fine (whereas pre-BIOS update I used to have problems) a more realistic activity: rsync --rsh="rsh" --progress -a /scratch/* cu:/huge/myth/ 1524072448 81% 22.84MB/s 0:00:14 but stalls (every 10-15 seconds) down to 95715328 5% 2.77MB/s 0:01:04 When the stall happens, the e1000_tx_timeout_task() log (extract below) is produced. Normally (with R/TxDescriptors=256) the start of the log is 'lost' by syslogd so the version below is with T/RXDescriptors=80. I've played with a few variables and found this set gave me better behaviour with a stall every minute or so rather than every few seconds) # modprobe e1000 InterruptThrottleRate=600 FlowControl=3 TxDescriptors=80 RxDescriptors=80 David Venkatesan, Ganesh wrote: >David: > >Could you check the BIOS version on your system? We were able to >reproduce some of your performance issues on a machine with BIOS version >1.03. Upgrading to version 1.10 resolved all issues. The machine we used >is: >Athlon 1800 with an Aopen AK77-KT600N motherboard. > >Please let us know what you find. > >Thanks, >Ganesh. > > Nov 14 18:05:05 ash kernel: NETDEV WATCHDOG: eth0: transmit timed out after 5000 jiffies Nov 14 18:05:05 ash kernel: eth0: transmit timeout from queuing Nov 14 18:05:05 ash kernel: eth0: state=0x7 transmit ring size=4096 count=80 to_use=6 to_clean=10 Nov 14 18:05:05 ash kernel: 0: skb=00000000 dma=0 length=1514 time=+20656 watch=1 Nov 14 18:05:05 ash kernel: 1: skb=dffbf420 dma=747090014 length=1514 time=+9308 watch=2 Nov 14 18:05:05 ash kernel: 2: skb=00000000 dma=0 length=1514 time=+20656 watch=3 Nov 14 18:05:05 ash kernel: 3: skb=eef81420 dma=370819166 length=1514 time=+9308 watch=4 Nov 14 18:05:05 ash kernel: 4: skb=00000000 dma=0 length=1514 time=+20656 watch=5 Nov 14 18:05:05 ash kernel: 5: skb=dffbf6a0 dma=410486878 length=1514 time=+9308 watch=6 Nov 14 18:05:05 ash kernel: 6: skb=00000000 dma=0 length=1514 time=+20656 watch=7 Nov 14 18:05:05 ash kernel: 7: skb=00000000 dma=0 length=1514 time=+9313 watch=8 Nov 14 18:05:05 ash kernel: 8: skb=00000000 dma=0 length=1514 time=+20656 watch=9 Nov 14 18:05:05 ash kernel: 9: skb=00000000 dma=0 length=1514 time=+9313 watch=10 Nov 14 18:05:05 ash kernel: 10: skb=00000000 dma=0 length=1514 time=+20656 watch=11 Nov 14 18:05:05 ash kernel: 11: skb=dffbf9c0 dma=1015185502 length=1514 time=+9313 watch=12 Nov 14 18:05:05 ash kernel: 12: skb=00000000 dma=0 length=1514 time=+20656 watch=13 Nov 14 18:05:05 ash kernel: 13: skb=b94a42e0 dma=678299742 length=1514 time=+9313watch=14 Nov 14 18:05:05 ash kernel: 14: skb=00000000 dma=0 length=1514 time=+20656 watch=15 Nov 14 18:05:05 ash kernel: 15: skb=dffbf740 dma=244232286 length=1514 time=+9313watch=16 Nov 14 18:05:05 ash kernel: 16: skb=00000000 dma=0 length=1514 time=+20656 watch=17 Nov 14 18:05:05 ash kernel: 17: skb=dffbf880 dma=244234334 length=1514 time=+9313watch=18 Nov 14 18:05:05 ash kernel: 18: skb=00000000 dma=0 length=982 time=+20654 watch=19 Nov 14 18:05:05 ash kernel: 19: skb=e054f560 dma=543977566 length=1514 time=+9313watch=19 Nov 14 18:05:05 ash kernel: 20: skb=00000000 dma=0 length=1514 time=+20669 watch=21 Nov 14 18:05:05 ash kernel: 21: skb=efd22ce0 dma=543979614 length=1514 time=+9313watch=22 Nov 14 18:05:05 ash kernel: 22: skb=00000000 dma=0 length=1514 time=+20669 watch=23 Nov 14 18:05:05 ash kernel: 23: skb=eef81740 dma=621445214 length=1514 time=+9313watch=24 Nov 14 18:05:05 ash kernel: 24: skb=00000000 dma=0 length=1514 time=+20669 watch=25 Nov 14 18:05:05 ash kernel: 25: skb=dffbfd80 dma=621447262 length=1514 time=+9313watch=26 Nov 14 18:05:05 ash kernel: 26: skb=00000000 dma=0 length=1514 time=+20669 watch=27 Nov 14 18:05:05 ash kernel: 27: skb=b94a4920 dma=96651358 length=1514 time=+9313 watch=28 Nov 14 18:05:05 ash kernel: 28: skb=00000000 dma=0 length=1514 time=+20669 watch=29 Nov 14 18:05:05 ash kernel: 29: skb=ef3d27e0 dma=212396126 length=1514 time=+9312watch=30 Nov 14 18:05:05 ash kernel: 30: skb=00000000 dma=0 length=1514 time=+20669 watch=31 Nov 14 18:05:05 ash kernel: 31: skb=e054f420 dma=212394078 length=1514 time=+9312watch=32 Nov 14 18:05:05 ash kernel: 32: skb=00000000 dma=0 length=1514 time=+20669 watch=33 Nov 14 18:05:05 ash kernel: 33: skb=ef3d26a0 dma=471775326 length=1514 time=+9312watch=34 Nov 14 18:05:05 ash kernel: 34: skb=00000000 dma=0 length=1514 time=+20669 watch=35 Nov 14 18:05:05 ash kernel: 35: skb=b88a0880 dma=471773278 length=1514 time=+9312watch=36 Nov 14 18:05:05 ash kernel: 36: skb=00000000 dma=0 length=1514 time=+20669 watch=37 Nov 14 18:05:05 ash kernel: 37: skb=c9e26380 dma=301906014 length=1514 time=+9312watch=38 Nov 14 18:05:05 ash kernel: 38: skb=00000000 dma=0 length=1514 time=+20668 watch=39 Nov 14 18:05:05 ash kernel: 39: skb=efd227e0 dma=301903966 length=1514 time=+9312watch=40 Nov 14 18:05:05 ash kernel: 40: skb=00000000 dma=0 length=1514 time=+20668 watch=41 Nov 14 18:05:05 ash kernel: 41: skb=c95a2240 dma=292812894 length=1514 time=+9312watch=42 Nov 14 18:05:05 ash kernel: 42: skb=00000000 dma=0 length=1514 time=+20668 watch=43 Nov 14 18:05:05 ash kernel: 43: skb=eef81100 dma=292810846 length=1514 time=+9312watch=44 Nov 14 18:05:05 ash kernel: 44: skb=00000000 dma=0 length=1514 time=+20668 watch=45 Nov 14 18:05:05 ash kernel: 45: skb=c9e26f60 dma=412209246 length=1514 time=+9312watch=46 Nov 14 18:05:05 ash kernel: 46: skb=00000000 dma=0 length=1514 time=+20668 watch=47 Nov 14 18:05:05 ash kernel: 47: skb=b88a07e0 dma=410490974 length=1514 time=+9312watch=48 Nov 14 18:05:05 ash kernel: 48: skb=00000000 dma=0 length=1514 time=+20668 watch=49 Nov 14 18:05:05 ash kernel: 49: skb=efd22420 dma=471769182 length=1514 time=+9312watch=50 Nov 14 18:05:05 ash kernel: 50: skb=00000000 dma=0 length=1394 time=+20668 watch=51 Nov 14 18:05:05 ash kernel: 51: skb=e054fec0 dma=471771230 length=994 time=+9312 watch=52 Nov 14 18:05:05 ash kernel: 52: skb=00000000 dma=0 length=78 time=+20656 watch=53 Nov 14 18:05:05 ash kernel: 53: skb=c9e26560 dma=139356254 length=1514 time=+9312watch=54 Nov 14 18:05:05 ash kernel: 54: skb=00000000 dma=0 length=1514 time=+20656 watch=55 Nov 14 18:05:05 ash kernel: 55: skb=eef817e0 dma=410484830 length=1514 time=+9312watch=56 Nov 14 18:05:05 ash kernel: 56: skb=00000000 dma=0 length=1514 time=+20656 watch=57 Nov 14 18:05:05 ash kernel: 57: skb=e054f240 dma=410488926 length=1514 time=+9312watch=58 Nov 14 18:05:05 ash kernel: 58: skb=00000000 dma=0 length=1514 time=+20656 watch=59 Nov 14 18:05:05 ash kernel: 59: skb=ef3d2b00 dma=543973470 length=1514 time=+9310watch=60 Nov 14 18:05:05 ash kernel: 60: skb=00000000 dma=0 length=1514 time=+20656 watch=61 Nov 14 18:05:05 ash kernel: 61: skb=dffbfec0 dma=747087966 length=1514 time=+9310watch=62 Nov 14 18:05:05 ash kernel: 62: skb=00000000 dma=0 length=1514 time=+20656 watch=63 Nov 14 18:05:05 ash kernel: 63: skb=ef3d2560 dma=747085918 length=1514 time=+9310watch=64 Nov 14 18:05:05 ash kernel: 64: skb=00000000 dma=0 length=1514 time=+20656 watch=65 Nov 14 18:05:05 ash kernel: 65: skb=b94a4100 dma=1013049438 length=1514 time=+9310 watch=66 Nov 14 18:05:05 ash kernel: 66: skb=00000000 dma=0 length=1514 time=+20656 watch=67 Nov 14 18:05:05 ash kernel: 67: skb=c95a21a0 dma=323840094 length=1514 time=+9310watch=68 Nov 14 18:05:05 ash kernel: 68: skb=00000000 dma=0 length=1514 time=+20656 watch=69 Nov 14 18:05:05 ash kernel: 69: skb=e054f2e0 dma=572936286 length=1514 time=+9310watch=70 Nov 14 18:05:05 ash kernel: 70: skb=00000000 dma=0 length=1514 time=+20656 watch=71 Nov 14 18:05:05 ash kernel: 71: skb=b94a4060 dma=895561822 length=1514 time=+9310watch=72 Nov 14 18:05:05 ash kernel: 72: skb=00000000 dma=0 length=1514 time=+20656 watch=73 Nov 14 18:05:05 ash kernel: 73: skb=b94a4880 dma=96649310 length=1514 time=+9310 watch=74 Nov 14 18:05:05 ash kernel: 74: skb=00000000 dma=0 length=1514 time=+20656 watch=75 Nov 14 18:05:05 ash kernel: 75: skb=b88a0380 dma=512022622 length=1514 time=+9310watch=76 Nov 14 18:05:05 ash kernel: 76: skb=00000000 dma=0 length=1514 time=+20656 watch=77 Nov 14 18:05:05 ash kernel: 77: skb=b94a4380 dma=1013047390 length=1514 time=+9310 watch=78 Nov 14 18:05:05 ash kernel: 78: skb=00000000 dma=0 length=1514 time=+20656 watch=79 Nov 14 18:05:05 ash kernel: 79: skb=b88a0100 dma=1053198430 length=1514 time=+9310 watch=0 Nov 14 18:05:08 ash kernel: e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex From jgarzik@pobox.com Mon Nov 15 09:08:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 09:08:48 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFH8gGH020138 for ; Mon, 15 Nov 2004 09:08:42 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTkKy-0007yZ-OZ; Mon, 15 Nov 2004 17:08:20 +0000 Message-ID: <4198E279.5070806@pobox.com> Date: Mon, 15 Nov 2004 12:08:09 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Wichert Akkerman CC: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, akpm@osdl.org Subject: Re: [netdrvr] netdev-2.6 queue updated References: <20041115064609.GA14547@havoc.gtf.org> <20041115074949.GA9481@wiggy.net> In-Reply-To: <20041115074949.GA9481@wiggy.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11841 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Wichert Akkerman wrote: > Hi Jeff, > > Previously Jeff Garzik wrote: > >>The most notable thing is the addition of HostAP. > > > I was expecting to see that pulled in through the wireless tree; does > this have any affect on that tree? It was pulled in through the wireless tree, wireless-2.6 -> netdev-2.6 -> -mm -> (eventually) upstream From jgarzik@pobox.com Mon Nov 15 09:10:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 09:10:22 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFHAInG020483 for ; Mon, 15 Nov 2004 09:10:18 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTkMZ-00080D-4G; Mon, 15 Nov 2004 17:09:59 +0000 Message-ID: <4198E2DB.5010800@pobox.com> Date: Mon, 15 Nov 2004 12:09:47 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Zhu, Yi" CC: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, akpm@osdl.org, Jouni Malinen Subject: Re: [netdrvr] netdev-2.6 queue updated References: <3ACA40606221794F80A5670F0AF15F8403BD583B@pdsmsx403> In-Reply-To: <3ACA40606221794F80A5670F0AF15F8403BD583B@pdsmsx403> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11842 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Zhu, Yi wrote: > Jeff Garzik wrote: > >>The most notable thing is the addition of HostAP. > > > How about move HostAP 802.11 stack and crypt related files to > net/80211? It is generic and some other drivers (i.e. ipw2100) share > the code. Do you receive patches to do this? Jouni mentioned he wanted to do a few things before we started renaming? I would like someone at Intel to submit the ipw drivers, and start working on them via the wireless-2.6 tree eventually[1] Jeff [1] once we have permission to put the firmware in the kernel From acme@conectiva.com.br Mon Nov 15 10:34:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 10:34:36 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFIYU81022786 for ; Mon, 15 Nov 2004 10:34:31 -0800 Received: from [200.140.204.103] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTlhH-0007YN-00; Mon, 15 Nov 2004 16:35:28 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 69AA61463C; Mon, 15 Nov 2004 16:33:59 -0200 (BRST) Message-ID: <4198E8BF.70104@conectiva.com.br> Date: Mon, 15 Nov 2004 15:34:55 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Meelis Roos Cc: netdev@oss.sgi.com Subject: Re: 2.6.10-rc2: still no ipv6 link-local addresses References: In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11843 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Can you try disabling ipv6 privacy extensions? Meelis Roos wrote: > I tried 2.6.10-rc2 and it still does not give lipv6 link-local address > to Ethernet interfaces (I tried NICs with e100 and 8139too drivers). > > This is broken since 2.6.9. > From brazilnut@us.ibm.com Mon Nov 15 11:00:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 11:00:53 -0800 (PST) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFJ0gbb023754 for ; Mon, 15 Nov 2004 11:00:49 -0800 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e2.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAFJ0BG4539446 for ; Mon, 15 Nov 2004 14:00:11 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAFJ0B0c116138 for ; Mon, 15 Nov 2004 14:00:11 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAFJ0BvV023748 for ; Mon, 15 Nov 2004 14:00:11 -0500 Received: from DYN319661.beaverton.ibm.com (linux-009047022144.beaverton.ibm.com [9.47.22.144]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAFJ0A2J023720; Mon, 15 Nov 2004 14:00:11 -0500 Received: by DYN319661.beaverton.ibm.com (Postfix, from userid 1000) id 71E352293EC; Fri, 12 Nov 2004 11:41:24 -0800 (PST) Date: Fri, 12 Nov 2004 11:41:24 -0800 From: Don Fry To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Subject: [PATCH 2.4.28-rc2-bk3] pcnet32: added pci_disable_device Message-ID: <20041112194124.GA17957@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 11844 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds pci_disable_device to disable the device prior to being removed or if the probe fails. Tested ia32. signed-off-by: Don Fry --- linux-2.4.28-rc2-bk3/drivers/net/orig.pcnet32.c 2004-11-12 07:45:37.000000000 -0800 +++ linux-2.4.28-rc2-bk3/drivers/net/pcnet32.c 2004-11-12 09:50:31.000000000 -0800 @@ -1007,7 +1007,11 @@ pcnet32_probe_pci(struct pci_dev *pdev, return -EBUSY; } - return pcnet32_probe1(ioaddr, 1, pdev); + err = pcnet32_probe1(ioaddr, 1, pdev); + if (err < 0) { + pci_disable_device(pdev); + } + return err; } @@ -2241,6 +2245,7 @@ static void __devexit pcnet32_remove_one release_region(dev->base_addr, PCNET32_TOTAL_SIZE); pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); free_netdev(dev); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); } } -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Mon Nov 15 11:00:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 11:00:55 -0800 (PST) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFJ0g7M023755 for ; Mon, 15 Nov 2004 11:00:49 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e6.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAFJ0Em5052028 for ; Mon, 15 Nov 2004 14:00:15 -0500 Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAFJ0ETG275100 for ; Mon, 15 Nov 2004 14:00:14 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAFJ0E79014628 for ; Mon, 15 Nov 2004 14:00:14 -0500 Received: from DYN319661.beaverton.ibm.com (linux-009047022144.beaverton.ibm.com [9.47.22.144]) by d01av03.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAFJ0Ebc014569; Mon, 15 Nov 2004 14:00:14 -0500 Received: by DYN319661.beaverton.ibm.com (Postfix, from userid 1000) id 391BD2293E7; Fri, 12 Nov 2004 11:38:24 -0800 (PST) Date: Fri, 12 Nov 2004 11:38:24 -0800 From: Don Fry To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc1-bk22] pcnet32: added pci_disable_device Message-ID: <20041112193824.GA17937@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 11845 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds pci_disable_device in the appropriate places to eliminate the following message when removing the module. pcnet32 0000:00:05.0: Device was removed without properly calling pci_disable_device(). This may need fixing. pcnet32 0000:02:05.0: Device was removed without properly calling pci_disable_device(). This may need fixing. Tested ia32. signed-off-by: Don Fry --- linux-2.6.10-rc1-bk22/drivers/net/pcnet32.c.orig Fri Nov 12 10:22:41 2004 +++ linux-2.6.10-rc1-bk22/drivers/net/pcnet32.c Fri Nov 12 11:17:39 2004 @@ -1010,7 +1010,11 @@ pcnet32_probe_pci(struct pci_dev *pdev, return -EBUSY; } - return pcnet32_probe1(ioaddr, 1, pdev); + err = pcnet32_probe1(ioaddr, 1, pdev); + if (err < 0) { + pci_disable_device(pdev); + } + return err; } @@ -2249,6 +2253,7 @@ static void __devexit pcnet32_remove_one release_region(dev->base_addr, PCNET32_TOTAL_SIZE); pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); free_netdev(dev); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); } } -- Don Fry brazilnut@us.ibm.com From rddunlap@osdl.org Mon Nov 15 11:55:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 11:55:47 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFJtY0T025883 for ; Mon, 15 Nov 2004 11:55:36 -0800 Received: from [172.20.1.27] (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFJt9PE002107 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO); Mon, 15 Nov 2004 11:55:10 -0800 Message-ID: <419906AA.8010705@osdl.org> Date: Mon, 15 Nov 2004 11:42:34 -0800 From: "Randy.Dunlap" Organization: OSDL User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com, sri@us.ibm.com Subject: [PATCH] sctp/socket: fix printk arg. type Content-Type: multipart/mixed; boundary="------------090302010609050607090804" X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11846 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------090302010609050607090804 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit fix printk argument type warning: net/sctp/socket.c:2672: warning: format argument is not a pointer (arg 5) diffstat:= net/sctp/socket.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Signed-off-by: Randy Dunlap -- --------------090302010609050607090804 Content-Type: text/x-patch; name="socket_printk.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="socket_printk.patch" diff -Naurp ./net/sctp/socket.c~socket_printk ./net/sctp/socket.c --- ./net/sctp/socket.c~socket_printk 2004-11-15 10:02:01.901678280 -0800 +++ ./net/sctp/socket.c 2004-11-15 10:56:53.683251416 -0800 @@ -2669,7 +2669,7 @@ static int sctp_getsockopt_sctp_status(s goto out; } - SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %p\n", + SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %d\n", len, status.sstat_state, status.sstat_rwnd, status.sstat_assoc_id); --------------090302010609050607090804-- From akpm@osdl.org Mon Nov 15 12:21:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 12:21:39 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFKLXMO030210 for ; Mon, 15 Nov 2004 12:21:34 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAFKLA906390 for ; Mon, 15 Nov 2004 12:21:10 -0800 Date: Mon, 15 Nov 2004 12:20:59 -0800 From: Andrew Morton To: netdev@oss.sgi.com Subject: Fw: [Bugme-new] [Bug 3747] New: HTB causes machine lockups Message-Id: <20041115122059.4cfcd213.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11848 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Mon, 15 Nov 2004 04:46:38 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3747] New: HTB causes machine lockups http://bugme.osdl.org/show_bug.cgi?id=3747 Summary: HTB causes machine lockups Kernel Version: 2.4.26 Status: NEW Severity: high Owner: acme@conectiva.com.br Submitter: alchemyx@uznam.net.pl Distribution: PLD Linux 1.1 with 2.4.26 vanilla kernel Hardware Environment: 2x Xeon 2.4 GHz, 1 GB of ram, 2x e1000 NICs Software Environment: iproute2-2.4.7.ss020116 Problem Description: I have some network traffic shaping rules used on a Linux box. For example I have hundreds of them on eth1. I am using HTB in all cases (sometimes attaching SFQ to HTB rules). Everything works fine, until I issue: tc qdisc del dev eth1 root Which causes a machine lockup. Sometimes it happens day after day, but sometimes once a month. There are no traces in logs, no oopses, and so on. Machine just freezes (you see login on your screen, but can't type anything, can't ping that machine, ctrl-alt-del or sysrq doesn't work). Problem was on kernels from 2.4.21 up to 2.4.26. Haven't tried 2.4.27 and 2.6.x on that box yet. Steps to reproduce: Hard to tell really. You need to set up a script creating hunderds of HTB rules and regenerating them every (let say) 15 minutes, issuing 'tc qdisc del dev ethX' everytime. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From akpm@osdl.org Mon Nov 15 12:21:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 12:21:28 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFKLKoP030198 for ; Mon, 15 Nov 2004 12:21:21 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAFKKv906248 for ; Mon, 15 Nov 2004 12:20:57 -0800 Date: Mon, 15 Nov 2004 12:20:46 -0800 From: Andrew Morton To: netdev@oss.sgi.com Subject: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups Message-Id: <20041115122046.1413527e.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11847 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Mon, 15 Nov 2004 04:33:51 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups http://bugme.osdl.org/show_bug.cgi?id=3746 Summary: Bridge causes machine lockups Kernel Version: 2.6.9 Status: NEW Severity: high Owner: acme@conectiva.com.br Submitter: alchemyx@uznam.net.pl Distribution: Gentoo 2004.2 with vanilla kernel sources Hardware Environment: 2 x Xeon 2.80 GHz, 1GB RAM, 4 x e1000 NIC, 2 x e100 NIC Software Environment: bridge-utils-0.9.6, bridged 2x e100 and 3x e1000 Problem Description: On my Linux box I have few scripts that modify entries in ebtables filtering chains. I have main chain called BLOCKED and in FORWARD chain I have entry "-j BLOCKED", which directs every bridged packet to BLOCKED chain. Blocked chain consists of entries: -s SO:ME:MA:CA:DD:R0 -j DROP -d SO:ME:MA:CA:DD:R0 -j DROP [... about 50 of them ...] -j RETURN It works fine. About twenty or thirty times a day, a script does 'iptables -F BLOCKED' and writes new entries into chain BLOCKED. Problem is that machine dies from time to time (under heavy network load it happens once a day). It just locks, nothing happenes, no oopses, or entries in logs. Then after 60 seconds, watchdog from Intel motherboard resets machine. Also I was doing some changes manually into chains and noticed that machine died after I have issued 'ebtables -F BLOCKED' (clearing the chain). Once again after 60 seconds watchdog reset machine. Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such problem on 2.4.26. The only weird thing I noticed is when I initalise my bridge, is something about that it can't get speed of some interfaces (guessing it is about e1000). I can't give you full error message at the moment, because those have been rotated by logrotate. Steps to reproduce: 1. Set up a bridge consisting of few devices and having chains as described in "Problem description" 2. Use high flow trough those devices (at least 50 megabits per second cumulative). 3. Change chain BLOCKED few tens of time a day. 4. Wait for lockup. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From bdschuym@pandora.be Mon Nov 15 12:43:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 12:43:11 -0800 (PST) Received: from poros.telenet-ops.be (poros.telenet-ops.be [195.130.132.44]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFKh5bM031934 for ; Mon, 15 Nov 2004 12:43:06 -0800 Received: from localhost (localhost.localdomain [127.0.0.1]) by poros.telenet-ops.be (Postfix) with SMTP id 8F2EC3BC149; Mon, 15 Nov 2004 21:42:46 +0100 (MET) Received: from 192.168.0.138 (D5763CED.kabel.telenet.be [213.118.60.237]) by poros.telenet-ops.be (Postfix) with ESMTP id 542DA3BC057; Mon, 15 Nov 2004 21:42:46 +0100 (MET) From: Bart De Schuymer To: Andrew Morton , netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups Date: Mon, 15 Nov 2004 21:46:02 +0100 User-Agent: KMail/1.5 References: <20041115122046.1413527e.akpm@osdl.org> In-Reply-To: <20041115122046.1413527e.akpm@osdl.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411152146.02851.bdschuym@pandora.be> X-archive-position: 11849 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bdschuym@pandora.be Precedence: bulk X-list: netdev > Date: Mon, 15 Nov 2004 04:33:51 -0800 > From: bugme-daemon@osdl.org > To: bugme-new@lists.osdl.org > Subject: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups > > -s SO:ME:MA:CA:DD:R0 -j DROP > -d SO:ME:MA:CA:DD:R0 -j DROP > [... about 50 of them ...] > -j RETURN > > It works fine. About twenty or thirty times a day, a script does 'iptables > -F BLOCKED' and writes new entries into chain BLOCKED. Problem is that > machine dies from time to time (under heavy network load it happens once a > day). It just locks, nothing happenes, no oopses, or entries in logs. Then > after 60 seconds, watchdog from Intel motherboard resets machine. > > Also I was doing some changes manually into chains and noticed that machine > died after I have issued 'ebtables -F BLOCKED' (clearing the chain). Once > again after 60 seconds watchdog reset machine. > > Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such problem > on 2.4.26. Can you do something similar with iptables rules to see if it's specific to ebtables (which I doubt)? > The only weird thing I noticed is when I initalise my bridge, is something > about that it can't get speed of some interfaces (guessing it is about > e1000). I can't give you full error message at the moment, because those > have been rotated by logrotate. I don't know what that is about... cheers, Bart From akpm@osdl.org Mon Nov 15 12:49:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 12:49:31 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFKnJpq032544 for ; Mon, 15 Nov 2004 12:49:22 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAFKmr911935; Mon, 15 Nov 2004 12:48:53 -0800 Date: Mon, 15 Nov 2004 12:48:43 -0800 From: Andrew Morton To: Bart De Schuymer Cc: netdev@oss.sgi.com, alchemyx@uznam.net.pl Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups Message-Id: <20041115124843.4c3dd72f.akpm@osdl.org> In-Reply-To: <200411152146.02851.bdschuym@pandora.be> References: <20041115122046.1413527e.akpm@osdl.org> <200411152146.02851.bdschuym@pandora.be> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11850 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Originator added to Cc.. Bart De Schuymer wrote: > > > Date: Mon, 15 Nov 2004 04:33:51 -0800 > > From: bugme-daemon@osdl.org > > To: bugme-new@lists.osdl.org > > Subject: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups > > > > -s SO:ME:MA:CA:DD:R0 -j DROP > > -d SO:ME:MA:CA:DD:R0 -j DROP > > [... about 50 of them ...] > > -j RETURN > > > > It works fine. About twenty or thirty times a day, a script does 'iptables > > -F BLOCKED' and writes new entries into chain BLOCKED. Problem is that > > machine dies from time to time (under heavy network load it happens once a > > day). It just locks, nothing happenes, no oopses, or entries in logs. Then > > after 60 seconds, watchdog from Intel motherboard resets machine. > > > > Also I was doing some changes manually into chains and noticed that machine > > died after I have issued 'ebtables -F BLOCKED' (clearing the chain). Once > > again after 60 seconds watchdog reset machine. > > > > Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such problem > > on 2.4.26. > > Can you do something similar with iptables rules to see if it's specific to > ebtables (which I doubt)? > > > The only weird thing I noticed is when I initalise my bridge, is something > > about that it can't get speed of some interfaces (guessing it is about > > e1000). I can't give you full error message at the moment, because those > > have been rotated by logrotate. > > I don't know what that is about... > > cheers, > Bart From davem@davemloft.net Mon Nov 15 12:50:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 12:51:01 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFKotEC000450 for ; Mon, 15 Nov 2004 12:50:56 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTnZw-0000iW-00; Mon, 15 Nov 2004 12:36:00 -0800 Date: Mon, 15 Nov 2004 12:35:58 -0800 From: "David S. Miller" To: Meelis Roos Cc: netdev@oss.sgi.com Subject: Re: 2.6.10-rc2: still no ipv6 link-local addresses Message-Id: <20041115123558.7965d6e2.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11851 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 15 Nov 2004 14:55:46 +0200 Meelis Roos wrote: > MR> I tried 2.6.10-rc2 and it still does not give lipv6 link-local address > MR> to Ethernet interfaces (I tried NICs with e100 and 8139too drivers). > > Hmm, eth1 with 8139too has gotten a link-local address meanwhile - maybe > after up'ing the interface. e100 is my primary NIC and is up and working > but still does not have link-local address. I know what the problem is, I discovered this while analyzing another ipv6 bug with Herbert Xu over the past week. I'm still undecided on how to fix this, though. It only happens if you first bring your interfaces up, then the ipv6 module gets loaded. The problem will never occur if either: 1) You build ipv6 statically 2) You bring your interfaces up after the ipv6 module loads. The problem is in addrconf_init(). The registry of the netdev notifier for the addrconf layer assumes that loopback will be the first device it does UP processing on. If that is not the case, then addition of the link-local addresses for other devices will fail. This is because link-local address addition in ipv6 uses a dummy route which uses loopback_dev as it's netdev reference. So if loopback_dev does not have it's ipv6 specific info setup yet, the creation of that dummy route for the link-local address of other devices will fail. In general, I am incredibly displeased with all of the loopback device dependencies in the ipv6 code and I'm going to work to gradually remove them all. They are the source of many problems, and this bug in particular. Here is a hack fix to this problem which is probably what I'll send to Linus for 2.6.10 ===== net/ipv6/addrconf.c 1.119 vs edited ===== --- 1.119/net/ipv6/addrconf.c 2004-11-11 15:07:25 -08:00 +++ edited/net/ipv6/addrconf.c 2004-11-15 12:22:22 -08:00 @@ -3387,6 +3387,29 @@ void __init addrconf_init(void) { + /* The addrconf netdev notifier requires that loopback_dev + * has it's ipv6 private information allocated and setup + * before it can bring up and give link-local addresses + * to other devices which are up. + * + * Unfortunately, loopback_dev is not necessarily the first + * entry in the global dev_base list of net devices. In fact, + * it is likely to be the very last entry on that list. + * So this causes the notifier registry below to try and + * give link-local addresses to all devices besides loopback_dev + * first, then loopback_dev, which cases all the non-loopback_dev + * devices to fail to get a link-local address. + * + * So, as a temporary fix, register loopback_dev first by hand. + * Longer term, all of the dependencies ipv6 has upon the loopback + * device and it being up should be removed. + */ + rtnl_lock(); + addrconf_notify(&ipv6_dev_notf, NETDEV_REGISTER, &loopback_dev); + if (loopback_dev.flags & IFF_UP) + addrconf_notify(&ipv6_dev_notf, NETDEV_UP, &loopback_dev); + rtnl_unlock(); + register_netdevice_notifier(&ipv6_dev_notf); #ifdef CONFIG_IPV6_PRIVACY From ravinandan.arakali@s2io.com Mon Nov 15 13:36:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 13:36:56 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFLamdO001946 for ; Mon, 15 Nov 2004 13:36:49 -0800 Received: from guinness.s2io.com (sentry [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iAFLZxje015100; Mon, 15 Nov 2004 16:35:59 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iAFLZu39012223; Mon, 15 Nov 2004 16:35:56 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" , Cc: , , Subject: RE: [PATCH 2.6.9-rc2 12/12] S2io: styling Date: Mon, 15 Nov 2004 12:21:26 -0800 Message-ID: <000e01c4cb5b$20018710$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) x-mimeole: Produced By Microsoft MimeOLE V6.00.2900.2180 Importance: Normal In-Reply-To: <41904619.2020206@pobox.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11852 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Jeff, We received couple of comments from Krishna Kumar. Other than that we are waiting for further comments. If there are no other, we can submit one final patch to address Krishna Kumar's comments. In one of your earlier mails(on 10/28), you mentioned "patches pass review". Pls let us know. Thanks, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Monday, November 08, 2004 8:23 PM To: raghavendra.koushik@s2io.com Cc: romieu@fr.zoreil.com; netdev@oss.sgi.com; ravinandan.arakali@s2io.com Subject: Re: [PATCH 2.6.9-rc2 12/12] S2io: styling It is my pleasure to report that I successfully applied all 12 patches from the most recent batch sent, to the netdev-2.6 queue. Jeff From alchemyx@uznam.net.pl Mon Nov 15 13:58:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 13:58:22 -0800 (PST) Received: from mail.uznam.net.pl (postfix@gandalf.uznam.net.pl [195.135.236.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFLwDup002888 for ; Mon, 15 Nov 2004 13:58:14 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.uznam.net.pl (Postfix) with ESMTP id 45CBE12F1D; Mon, 15 Nov 2004 22:57:53 +0100 (CET) Received: from mail.uznam.net.pl ([195.135.236.2]) by localhost (gandalf.uznam.net.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 14684-05; Mon, 15 Nov 2004 22:57:52 +0100 (CET) Received: from [195.135.237.2] (cerber.uznam.net.pl [195.135.237.2]) by mail.uznam.net.pl (Postfix) with ESMTP id 6D36B12F0D; Mon, 15 Nov 2004 22:57:52 +0100 (CET) Message-ID: <4199265E.7030404@uznam.net.pl> Date: Mon, 15 Nov 2004 22:57:50 +0100 From: =?ISO-8859-2?Q?Micha=B3_Margula?= User-Agent: Mozilla Thunderbird 0.8 (X11/20041104) X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Andrew Morton Cc: Bart De Schuymer , netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups References: <20041115122046.1413527e.akpm@osdl.org> <200411152146.02851.bdschuym@pandora.be> <20041115124843.4c3dd72f.akpm@osdl.org> In-Reply-To: <20041115124843.4c3dd72f.akpm@osdl.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at uznam.net.pl X-archive-position: 11853 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alchemyx@uznam.net.pl Precedence: bulk X-list: netdev Andrew Morton napisa(a): >Originator added to Cc.. > >Bart De Schuymer wrote: > > >>Can you do something similar with iptables rules to see if it's specific to >>ebtables (which I doubt)? >> >> >> OK. Done. I have tried to mimic ebtables rules as similar as possible. Only difference is that iptables module mac has only --mac-source option. Now I need to wait about 24 to 48 hours, to see if everything is OK. I will tell you as soon I have more information. >>>The only weird thing I noticed is when I initalise my bridge, is something >>>about that it can't get speed of some interfaces (guessing it is about >>>e1000). I can't give you full error message at the moment, because those >>>have been rotated by logrotate. >>> >>> >>I don't know what that is about... >> >> >> Found it in kernel sources, it was giving error from line 62 of net/bridge/br_if.c: pr_info("bridge: can't decode speed from %s: %d\n", dev->name, ecmd.speed); Thanks! -- Micha Margula, alchemyx@uznam.net.pl, http://alchemyx.uznam.net.pl/ "W yciu pikne s tylko chwile" [Ryszard Riedel] From jgarzik@pobox.com Mon Nov 15 14:34:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 14:34:43 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFMYb1g003987 for ; Mon, 15 Nov 2004 14:34:38 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTpQQ-0006tg-7j; Mon, 15 Nov 2004 22:34:18 +0000 Message-ID: <41992ED8.7080906@pobox.com> Date: Mon, 15 Nov 2004 17:34:00 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: ravinandan.arakali@s2io.com CC: raghavendra.koushik@s2io.com, romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com Subject: Re: [PATCH 2.6.9-rc2 12/12] S2io: styling References: <000e01c4cb5b$20018710$9810100a@S2IOtech.com> In-Reply-To: <000e01c4cb5b$20018710$9810100a@S2IOtech.com> Content-Type: multipart/mixed; boundary="------------030709010805020108030200" X-archive-position: 11854 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------030709010805020108030200 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Ravinandan Arakali wrote: > Jeff, > We received couple of comments from Krishna Kumar. Other than that > we are waiting for further comments. If there are no other, we can > submit one final patch to address Krishna Kumar's comments. > > In one of your earlier mails(on 10/28), you mentioned "patches pass > review". > Pls let us know. See attached for the list of patches I've applied. If I am missing any, please let me know. Jeff --------------030709010805020108030200 Content-Type: text/plain; name="linus.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="linus.txt" Please do a bk pull bk://gkernel.bkbits.net/s2io This will update the following files: drivers/net/Kconfig | 11 drivers/net/s2io-regs.h | 3 drivers/net/s2io.c | 3114 ++++++++++++++++++++++++++++-------------------- drivers/net/s2io.h | 295 ++-- 4 files changed, 2018 insertions(+), 1405 deletions(-) through these ChangeSets: : o S2io: styling o S2io: modified loadable parameters o S2io: 2 buffer mode with copy o S2io: new functions for card restart o S2io: two buffer mode o S2io: NAPI fix o S2io: new txd allocation o S2io: module loadable parameters o S2io: hardware fixes o S2io: optimizations o S2io: sw bug fixes o S2io: cosmetic changes --------------030709010805020108030200-- From davem@davemloft.net Mon Nov 15 15:23:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:23:35 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNNJwP005493 for ; Mon, 15 Nov 2004 15:23:19 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTpxN-000117-00; Mon, 15 Nov 2004 15:08:21 -0800 Date: Mon, 15 Nov 2004 15:08:21 -0800 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [NETLINK] Fix mc_list operations Message-Id: <20041115150821.50ec4647.davem@davemloft.net> In-Reply-To: <20041111042136.GA17076@gondor.apana.org.au> References: <20041111042136.GA17076@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11855 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Thu, 11 Nov 2004 15:21:36 +1100 Herbert Xu wrote: > While doing the 2.4 version of the netlink patch, I noticed a bug > in my mc_list code. First of all it wasn't holding the table lock > when adding nodes to the list. It also didn't take the node off > the list when multicast is switched off. Applied, thanks Herbert. From shemminger@osdl.org Mon Nov 15 15:25:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:25:54 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPglm005789 for ; Mon, 15 Nov 2004 15:25:42 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPIPE020448 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:18 -0800 Date: Mon, 15 Nov 2004 15:23:23 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (7/25) sk98: remove unneeded include's Message-Id: <20041115152323.08f670b3@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11856 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Remove extraneous header includes Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:23:03 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:23:03 -08:00 @@ -39,9 +39,6 @@ #ifndef __INC_SKDRV1ST_H #define __INC_SKDRV1ST_H -/* Check kernel version */ -#include - typedef struct s_AC SK_AC; /* Set card versions */ @@ -62,8 +59,6 @@ #include #include #include -#include -#include #include #include #include @@ -75,7 +70,7 @@ #include #include -#include + #define SK_CS_CALCULATE_CHECKSUM #ifndef CONFIG_X86_64 From shemminger@osdl.org Mon Nov 15 15:25:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:25:55 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPfZT005788 for ; Mon, 15 Nov 2004 15:25:41 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPHPE020442 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:17 -0800 Date: Mon, 15 Nov 2004 15:23:16 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (8/25) sk98: get rid of unused prototype Message-Id: <20041115152316.669737c2@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11857 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of unused prototype Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:24:36 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:24:36 -08:00 @@ -135,8 +135,6 @@ #define SK_DBG_CHKMOD(pAC) (SK_DEBUG_CHKMOD) #define SK_DBG_CHKCAT(pAC) (SK_DEBUG_CHKCAT) -extern void SkDbgPrintf(const char *format,...); - #define SK_DBGMOD_DRV 0x00010000 /**** possible driver debug categories ********************************/ From shemminger@osdl.org Mon Nov 15 15:25:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:25:57 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPhSI005790 for ; Mon, 15 Nov 2004 15:25:43 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPJPE020452 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:19 -0800 Date: Mon, 15 Nov 2004 15:25:36 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (9/25) sk98: remove Up and Mtu per-device structure elements Message-Id: <20041115152536.632b0226@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11858 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev The per-port elements (Up and Mtu) can both be derived from the net_device state. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:31:21 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:31:21 -08:00 @@ -282,8 +282,6 @@ SK_AC *pAC; int PortNr; int NetNr; - int Mtu; - int Up; struct proc_dir_entry *proc; }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 11:31:21 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 11:31:21 -08:00 @@ -1247,8 +1247,6 @@ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); pAC->MaxPorts++; - pNet->Up = 1; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeOpen suceeded\n")); @@ -1377,7 +1375,6 @@ sizeof(SK_PNMI_STRUCT_DATA)); pAC->MaxPorts--; - pNet->Up = 0; return (0); } /* SkGeClose */ @@ -2620,7 +2617,7 @@ static int SkGeChangeMtu(struct net_device *dev, int NewMtu) { DEV_NET *pNet; -DEV_NET *pOtherNet; +struct net_device *otherdev; SK_AC *pAC; unsigned long Flags; int i; @@ -2650,11 +2647,10 @@ } #endif - pNet->Mtu = NewMtu; - pOtherNet = netdev_priv(pAC->dev[1 - pNet->NetNr]); - if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) { - return(0); - } + otherdev = pAC->dev[1 - pNet->NetNr]; + if (NewMtu <= 1500 && otherdev != dev + && netif_running(otherdev) && otherdev->mtu > 1500) + return 0; pAC->RxBufSize = NewMtu + 32; dev->mtu = NewMtu; @@ -2816,7 +2812,8 @@ EvPara.Para32[1] = -1; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); - if (pOtherNet->Up) { + if (otherdev != dev && netif_running(otherdev)) { + DEV_NET *pOtherNet = netdev_priv(otherdev); EvPara.Para32[0] = pOtherNet->PortNr; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); } @@ -2890,7 +2887,7 @@ pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; - if (pNet->Mtu <= 1500) { + if (dev->mtu <= 1500) { pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; } else { pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - @@ -4549,7 +4546,7 @@ pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { - if (pNet->Up) { + if (netif_running(pAC->dev[0])) { pAC->WasIfUp[0] = SK_TRUE; pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ DoPrintInterfaceChange = SK_FALSE; @@ -4557,9 +4554,10 @@ } else { pAC->WasIfUp[0] = SK_FALSE; } + if (pNet != netdev_priv(pAC->dev[1])) { pNet = netdev_priv(pAC->dev[1]); - if (pNet->Up) { + if (netif_running(pAC->dev[1])) { pAC->WasIfUp[1] = SK_TRUE; pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ DoPrintInterfaceChange = SK_FALSE; @@ -4918,8 +4916,6 @@ sprintf(pAC->Name, "SysKonnect SK-98xx"); pAC->CheckQueue = SK_FALSE; - pNet->Mtu = 1500; - pNet->Up = 0; dev->irq = pdev->irq; error = SkGeInitPCI(pAC); if (error) { @@ -5002,8 +4998,6 @@ pNet->PortNr = 1; pNet->NetNr = 1; pNet->pAC = pAC; - pNet->Mtu = 1500; - pNet->Up = 0; dev->open = &SkGeOpen; dev->stop = &SkGeClose; From shemminger@osdl.org Mon Nov 15 15:25:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:00 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPiFo005792 for ; Mon, 15 Nov 2004 15:25:44 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPKPE020456 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:20 -0800 Date: Mon, 15 Nov 2004 15:27:19 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (10/25) sk98: remove more unused device private fields Message-Id: <20041115152719.225cf0b4@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11859 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of more elements in the per-board structure that are never used. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:31:35 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:31:35 -08:00 @@ -368,8 +368,6 @@ SK_TIMER ModTimer; /* just some timer */ }; -typedef struct s_PerStrm PER_STRM; - #define SK_ALLOC_IRQ 0x00000001 #ifdef SK_DIAG_SUPPORT @@ -414,16 +412,6 @@ int Index; /* internal board index number */ /* adapter RAM sizes for queues of active port */ - int RxQueueSize; /* memory used for receive queue */ - int TxSQueueSize; /* memory used for sync. tx queue */ - int TxAQueueSize; /* memory used for async. tx queue */ - - int PromiscCount; /* promiscuous mode counter */ - int AllMultiCount; /* allmulticast mode counter */ - int MulticCount; /* number of different MC */ - /* addresses for this board */ - /* (may be more than HW can)*/ - int HWRevision; /* Hardware revision */ int ActivePort; /* the active XMAC port */ int MaxPorts; /* number of activated ports */ @@ -446,7 +434,6 @@ DIM_INFO DynIrqModInfo; /* all data related to DIM */ /* Only for tests */ - int PortUp; int PortDown; int ChipsetType; /* Chipset family type * 0 == Genesis family support From shemminger@osdl.org Mon Nov 15 15:25:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:05 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPkAf005793 for ; Mon, 15 Nov 2004 15:25:46 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNP9PE020438 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:09 -0800 Date: Mon, 15 Nov 2004 15:28:05 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com, Christoph Hellwig Subject: [PATCH] (1/25) sk98: skethtool elimnateCamelCaps Message-Id: <20041115152805.6ff7a05f@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11861 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Take Cristoph's suggestion and make the new skethtool support use linux naming convention (at least for the function names). Don't bother with useless block comments. These patches are based on what is in current net driver tree (ie after 1 - 9 of the earlier patches). Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-15 11:21:23 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-15 11:21:23 -08:00 @@ -72,19 +72,7 @@ * *****************************************************************************/ -/***************************************************************************** - * - * getSettings - retrieves the current settings of the selected adapter - * - * Description: - * The current configuration of the selected adapter is returned. - * This configuration involves a)speed, b)duplex and c)autoneg plus - * a number of other variables. - * - * Returns: always 0 - * - */ -static int getSettings(struct net_device *dev, struct ethtool_cmd *ecmd) +static int sk98_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { const DEV_NET *pNet = netdev_priv(dev); int port = pNet->PortNr; @@ -172,19 +160,7 @@ return 1 + (pNet->pAC->RlmtNets == 2) + pNet->PortNr; } -/***************************************************************************** - * - * setSettings - configures the settings of a selected adapter - * - * Description: - * Possible settings that may be altered are a)speed, b)duplex or - * c)autonegotiation. - * - * Returns: - * 0: everything fine, no error - * <0: the return value is the error code of the failure - */ -static int setSettings(struct net_device *dev, struct ethtool_cmd *ecmd) +static int sk98_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -232,20 +208,8 @@ return 0; } -/***************************************************************************** - * - * getDriverInfo - returns generic driver and adapter information - * - * Description: - * Generic driver information is returned via this function, such as - * the name of the driver, its version and and firmware version. - * In addition to this, the location of the selected adapter is - * returned as a bus info string (e.g. '01:05.0'). - * - * Returns: N/A - * - */ -static void getDriverInfo(struct net_device *dev, struct ethtool_drvinfo *info) +static void sk98_get_driver_info(struct net_device *dev, + struct ethtool_drvinfo *info) { const DEV_NET *pNet = netdev_priv(dev); const SK_AC *pAC = pNet->pAC; @@ -263,7 +227,7 @@ /* * Ethtool statistics support. */ -static const char StringsStats[][ETH_GSTRING_LEN] = { +static const char sk98_stats_gstrings[][ETH_GSTRING_LEN] = { "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", "tx_errors", @@ -280,21 +244,21 @@ "tx_window_errors", }; -static int getStatsCount(struct net_device *dev) +static int sk98_stats_count(struct net_device *dev) { - return ARRAY_SIZE(StringsStats); + return ARRAY_SIZE(sk98_stats_gstrings); } -static void getStrings(struct net_device *dev, u32 stringset, u8 *data) +static void sk98_get_strings(struct net_device *dev, u32 stringset, u8 *data) { switch(stringset) { case ETH_SS_STATS: - memcpy(data, *StringsStats, sizeof(StringsStats)); + memcpy(data, *sk98_stats_gstrings, sizeof(sk98_stats_gstrings)); break; } } -static void getEthtoolStats(struct net_device *dev, +static void sk98_get_ethstats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { const DEV_NET *pNet = netdev_priv(dev); @@ -331,16 +295,9 @@ } -/***************************************************************************** - * - * toggleLeds - Changes the LED state of an adapter - * - * Description: - * This function changes the current state of all LEDs of an adapter so +/* + * change the current state of all LEDs of an adapter so * that it can be located by a user. - * - * Returns: N/A - * */ static void toggleLeds(DEV_NET *pNet, int on) { @@ -411,21 +368,12 @@ mod_timer(&pAC->BlinkTimer, jiffies + HZ/4); } -/***************************************************************************** - * - * locateDevice - start the locate NIC feature of the elected adapter - * - * Description: - * This function is used if the user want to locate a particular NIC. +/* + * Ethtool phys_id used to locate a particular NIC. * All LEDs are regularly switched on and off, so the NIC can easily * be identified. - * - * Returns: - * ==0: everything fine, no error, locateNIC test was started - * !=0: one locateNIC test runs already - * */ -static int locateDevice(struct net_device *dev, u32 data) +static int sk98_flash_leds(struct net_device *dev, u32 data) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -446,18 +394,7 @@ return 0; } -/***************************************************************************** - * - * getPauseParams - retrieves the pause parameters - * - * Description: - * All current pause parameters of a selected adapter are placed - * in the passed ethtool_pauseparam structure and are returned. - * - * Returns: N/A - * - */ -static void getPauseParams(struct net_device *dev, struct ethtool_pauseparam *epause) +static void sk98_get_pause_param(struct net_device *dev, struct ethtool_pauseparam *epause) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -470,18 +407,7 @@ epause->autoneg = epause->rx_pause || epause->tx_pause; } -/***************************************************************************** - * - * setPauseParams - configures the pause parameters of an adapter - * - * Description: - * This function sets the Rx or Tx pause parameters - * - * Returns: - * ==0: everything fine, no error - * !=0: the return value is the error code of the failure - */ -static int setPauseParams(struct net_device *dev , struct ethtool_pauseparam *epause) +static int sk98_set_pause_param(struct net_device *dev , struct ethtool_pauseparam *epause) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -498,7 +424,7 @@ ** the operator requested any modification of the flow ** control parameters... */ - getPauseParams(dev, &old); + sk98_get_pause_param(dev, &old); /* ** perform modifications regarding the changes @@ -543,13 +469,13 @@ } struct ethtool_ops SkGeEthtoolOps = { - .get_settings = getSettings, - .set_settings = setSettings, - .get_drvinfo = getDriverInfo, - .get_strings = getStrings, - .get_stats_count = getStatsCount, - .get_ethtool_stats = getEthtoolStats, - .phys_id = locateDevice, - .get_pauseparam = getPauseParams, - .set_pauseparam = setPauseParams, + .get_settings = sk98_get_settings, + .set_settings = sk98_set_settings, + .get_drvinfo = sk98_get_driver_info, + .get_strings = sk98_get_strings, + .get_stats_count = sk98_stats_count, + .get_ethtool_stats = sk98_get_ethstats, + .phys_id = sk98_flash_leds, + .get_pauseparam = sk98_get_pause_param, + .set_pauseparam = sk98_set_pause_param, }; From shemminger@osdl.org Mon Nov 15 15:25:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:05 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPk4Z005798 for ; Mon, 15 Nov 2004 15:25:46 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPMPE020464 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:22 -0800 Date: Mon, 15 Nov 2004 15:22:03 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (4/25) sk98: change #define to typedef Message-Id: <20041115152203.24adb0ea@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11862 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Change #define of to a typedef. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:28 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:28 -08:00 @@ -106,7 +106,7 @@ #define SK_MAX_MACS 2 #define SK_MAX_NETS 2 -#define SK_IOC char __iomem * +typedef void __iomem *SK_IOC; typedef struct s_DrvRlmtMbuf SK_MBUF; From shemminger@osdl.org Mon Nov 15 15:25:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:04 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPlBH005807 for ; Mon, 15 Nov 2004 15:25:47 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPNPE020468 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:23 -0800 Date: Mon, 15 Nov 2004 15:22:08 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (5/25) sk98: elimnate nested macro. Message-Id: <20041115152208.6684c483@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11860 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Replace nested macros to handle defining 64bit constants with simpler macro. Would prefer to just remove it but it gets used in multiple OS common code. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:48 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:48 -08:00 @@ -110,8 +110,8 @@ typedef struct s_DrvRlmtMbuf SK_MBUF; -#define SK_CONST64 INT64_C -#define SK_CONSTU64 UINT64_C +#define SK_CONST64(x) (x##ll) +#define SK_CONSTU64(x) (x##ull) #define SK_MEMCPY(dest,src,size) memcpy(dest,src,size) #define SK_MEMCMP(s1,s2,size) memcmp(s1,s2,size) @@ -139,13 +139,6 @@ #define t_scalar_t int #define t_uscalar_t unsigned int #define uintptr_t unsigned long - -#define __CONCAT__(A,B) A##B - -#define INT32_C(a) __CONCAT__(a,L) -#define INT64_C(a) __CONCAT__(a,LL) -#define UINT32_C(a) __CONCAT__(a,UL) -#define UINT64_C(a) __CONCAT__(a,ULL) #ifdef DEBUG #define SK_DBG_PRINTF printk From shemminger@osdl.org Mon Nov 15 15:25:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:08 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPnLE005812 for ; Mon, 15 Nov 2004 15:25:49 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPLPE020460 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:21 -0800 Date: Mon, 15 Nov 2004 15:21:58 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com, Christoph Hellwig Subject: [PATCH] (3/25) sk98: remove #define of net_device Message-Id: <20041115152158.0b5dad55@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11863 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of obfuscating #define of net_device. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:11 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:11 -08:00 @@ -96,9 +96,6 @@ #define SK_BIG_ENDIAN #endif -#define SK_NET_DEVICE net_device - - /* we use gethrtime(), return unit: nanoseconds */ #define SK_TICKS_PER_SEC 100 diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:22:11 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:22:11 -08:00 @@ -70,7 +70,7 @@ extern int SkDrvLeaveDiagMode(SK_AC *pAc); #endif -extern int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev); +extern int SkGeXmit(struct sk_buff *skb, struct net_device *dev); #ifdef CONFIG_PROC_FS extern struct proc_dir_entry *SkGeProcCreate(struct net_device *dev); extern void SkGeProcRemove(struct proc_dir_entry *pe); @@ -408,7 +408,7 @@ SK_U32 AllocFlag; /* flag allocation of resources */ struct pci_dev *PciDev; /* for access to pci config space */ SK_U32 PciDevId; /* pci device id */ - struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */ + struct net_device *dev[2]; /* pointer to device struct */ char Name[30]; /* driver name */ int RxBufSize; /* length of receive buffers */ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 11:22:11 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 11:22:11 -08:00 @@ -189,20 +189,20 @@ * ******************************************************************************/ -static void FreeResources(struct SK_NET_DEVICE *dev); -static int SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC); +static void FreeResources(struct net_device *dev); +static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC); static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); -static int SkGeOpen(struct SK_NET_DEVICE *dev); -static int SkGeClose(struct SK_NET_DEVICE *dev); -static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p); -static void SkGeSetRxMode(struct SK_NET_DEVICE *dev); -static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev); -static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd); +static int SkGeOpen(struct net_device *dev); +static int SkGeClose(struct net_device *dev); +static int SkGeSetMacAddr(struct net_device *dev, void *p); +static void SkGeSetRxMode(struct net_device *dev); +static struct net_device_stats *SkGeStats(struct net_device *dev); +static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd); static void GetConfiguration(SK_AC*); static void ProductStr(SK_AC*); static int XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*); @@ -214,7 +214,7 @@ static void ClearTxIrq(SK_AC*, int, int); static void ClearRxRing(SK_AC*, RX_PORT*); static void ClearTxRing(SK_AC*, TX_PORT*); -static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu); +static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); static int SkGeIocMib(DEV_NET*, unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); @@ -266,7 +266,7 @@ */ int SkGeInitPCI(SK_AC *pAC) { - struct SK_NET_DEVICE *dev = pAC->dev[0]; + struct net_device *dev = pAC->dev[0]; struct pci_dev *pdev = pAC->PciDev; int retval; @@ -326,7 +326,7 @@ * Returns: N/A * */ -static void FreeResources(struct SK_NET_DEVICE *dev) +static void FreeResources(struct net_device *dev) { SK_U32 AllocFlag; DEV_NET *pNet; @@ -471,7 +471,7 @@ * 0, if everything is ok * !=0, on error */ -static int __init SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC) +static int __init SkGeBoardInit(struct net_device *dev, SK_AC *pAC) { short i; unsigned long Flags; @@ -874,7 +874,7 @@ */ static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { -struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; +struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ @@ -1023,7 +1023,7 @@ */ static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { -struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; +struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; SK_AC *pAC; SK_U32 IntSrc; /* interrupts source register contents */ @@ -1154,7 +1154,7 @@ * != 0 on error */ static int SkGeOpen( -struct SK_NET_DEVICE *dev) +struct net_device *dev) { DEV_NET *pNet; SK_AC *pAC; @@ -1269,7 +1269,7 @@ * error code - on error */ static int SkGeClose( -struct SK_NET_DEVICE *dev) +struct net_device *dev) { DEV_NET *pNet; DEV_NET *newPtrNet; @@ -1398,7 +1398,7 @@ * WARNING: returning 1 in 'tbusy' case caused system crashes (double * allocated skb's) !!! */ -int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev) +int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { DEV_NET *pNet; SK_AC *pAC; @@ -2497,7 +2497,7 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p) +static int SkGeSetMacAddr(struct net_device *dev, void *p) { DEV_NET *pNet = netdev_priv(dev); @@ -2543,7 +2543,7 @@ * 0, if everything is ok * !=0, on error */ -static void SkGeSetRxMode(struct SK_NET_DEVICE *dev) +static void SkGeSetRxMode(struct net_device *dev) { DEV_NET *pNet; @@ -2617,7 +2617,7 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int NewMtu) +static int SkGeChangeMtu(struct net_device *dev, int NewMtu) { DEV_NET *pNet; DEV_NET *pOtherNet; @@ -2855,7 +2855,7 @@ * Returns: * pointer to the statistic structure. */ -static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev) +static struct net_device_stats *SkGeStats(struct net_device *dev) { DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; @@ -2939,7 +2939,7 @@ * 0, if everything is ok * !=0, on error */ -static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd) +static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd) { DEV_NET *pNet; SK_AC *pAC; @@ -4676,7 +4676,7 @@ SK_AC *pAC, /* pointer to adapter context */ int devNbr) /* what device is to be handled */ { - struct SK_NET_DEVICE *dev; + struct net_device *dev; dev = pAC->dev[devNbr]; @@ -4707,7 +4707,7 @@ SK_AC *pAC, /* pointer to adapter context */ int devNbr) /* what device is to be handled */ { - struct SK_NET_DEVICE *dev; + struct net_device *dev; dev = pAC->dev[devNbr]; From shemminger@osdl.org Mon Nov 15 15:25:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:12 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPqRq005833 for ; Mon, 15 Nov 2004 15:25:52 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPOPE020472 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:25 -0800 Date: Mon, 15 Nov 2004 15:21:06 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com, Christoph Hellwig Subject: [PATCH] (2/25) sk98: handle device rename impact on /proc Message-Id: <20041115152106.22482337@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11865 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Move all /proc related functions into skproc.c and handle device name changes. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile --- a/drivers/net/sk98lin/Makefile 2004-11-15 11:21:41 -08:00 +++ b/drivers/net/sk98lin/Makefile 2004-11-15 11:21:41 -08:00 @@ -27,8 +27,12 @@ sktimer.o \ skvpd.o \ skxmac2.o \ - skproc.o \ skcsum.o + +ifdef CONFIG_PROC_FS +sk98lin-objs += skproc.o +endif + # DBGDEF = \ # -DDEBUG diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:21:41 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:21:41 -08:00 @@ -70,6 +70,19 @@ extern int SkDrvLeaveDiagMode(SK_AC *pAc); #endif +extern int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev); +#ifdef CONFIG_PROC_FS +extern struct proc_dir_entry *SkGeProcCreate(struct net_device *dev); +extern void SkGeProcRemove(struct proc_dir_entry *pe); +extern void SkGeProcInit(void); +extern void SkGeProcExit(void); +#else +#define SkGeProcCreate(dev) (NULL) +#define SkGeProcRemove(pe) do { } while(0) +#define SkGeProcInit() do { } while(0) +#define SkGeProcExit() do { } while(0) +#endif + struct s_DrvRlmtMbuf { SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */ SK_U8 *pData; /* Data buffer (virtually contig.). */ @@ -266,11 +279,12 @@ typedef struct s_DevNet DEV_NET; struct s_DevNet { + SK_AC *pAC; int PortNr; int NetNr; int Mtu; int Up; - SK_AC *pAC; + struct proc_dir_entry *proc; }; typedef struct s_TxPort TX_PORT; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 11:21:41 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 11:21:41 -08:00 @@ -199,7 +199,6 @@ static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct SK_NET_DEVICE *dev); static int SkGeClose(struct SK_NET_DEVICE *dev); -static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev); static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p); static void SkGeSetRxMode(struct SK_NET_DEVICE *dev); static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev); @@ -234,27 +233,6 @@ * Extern Function Prototypes * ******************************************************************************/ -static const char SKRootName[] = "sk98lin"; -static struct proc_dir_entry *pSkRootDir; -extern struct file_operations sk_proc_fops; - -static inline void SkGeProcCreate(struct net_device *dev) -{ - struct proc_dir_entry *pe; - - if (pSkRootDir && - (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) { - pe->proc_fops = &sk_proc_fops; - pe->data = dev; - pe->owner = THIS_MODULE; - } -} - -static inline void SkGeProcRemove(struct net_device *dev) -{ - if (pSkRootDir) - remove_proc_entry(dev->name, pSkRootDir); -} extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); extern void SkDimDisplayModerationSettings(SK_AC *pAC); @@ -1420,7 +1398,7 @@ * WARNING: returning 1 in 'tbusy' case caused system crashes (double * allocated skb's) !!! */ -static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev) +int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev) { DEV_NET *pNet; SK_AC *pAC; @@ -5004,7 +4982,7 @@ memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); - SkGeProcCreate(dev); + pNet->proc = SkGeProcCreate(dev); pNet->PortNr = 0; pNet->NetNr = 0; @@ -5053,7 +5031,7 @@ free_netdev(dev); pAC->dev[1] = pAC->dev[0]; } else { - SkGeProcCreate(dev); + pNet->proc = SkGeProcCreate(dev); memcpy(&dev->dev_addr, &pAC->Addr.Net[1].CurrentMacAddress, 6); @@ -5093,10 +5071,12 @@ SK_AC *pAC = pNet->pAC; struct net_device *otherdev = pAC->dev[1]; - SkGeProcRemove(dev); + SkGeProcRemove(pNet->proc); unregister_netdev(dev); - if (otherdev != dev) - SkGeProcRemove(otherdev); + if (otherdev != dev) { + DEV_NET *otherNet = netdev_priv(otherdev); + SkGeProcRemove(otherNet->proc); + } SkGeYellowLED(pAC, pAC->IoBase, 0); @@ -5163,21 +5143,18 @@ { int error; - pSkRootDir = proc_mkdir(SKRootName, proc_net); - if (pSkRootDir) - pSkRootDir->owner = THIS_MODULE; + SkGeProcInit(); error = pci_register_driver(&skge_driver); if (error) - proc_net_remove(SKRootName); + SkGeProcExit(); return error; } static void __exit skge_exit(void) { pci_unregister_driver(&skge_driver); - proc_net_remove(SKRootName); - + SkGeProcExit(); } module_init(skge_init); diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-15 11:21:41 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-15 11:21:41 -08:00 @@ -31,10 +31,13 @@ #include "h/skdrv2nd.h" #include "h/skversion.h" +static const char SKRootName[] = "sk98lin"; +static struct proc_dir_entry *pSkRootDir; + static int sk_seq_show(struct seq_file *seq, void *v); static int sk_proc_open(struct inode *inode, struct file *file); -struct file_operations sk_proc_fops = { +static struct file_operations sk_proc_fops = { .owner = THIS_MODULE, .open = sk_proc_open, .read = seq_read, @@ -258,8 +261,66 @@ return single_open(file, sk_seq_show, PDE(inode)->data); } -/******************************************************************************* - * - * End of file - * - ******************************************************************************/ + +struct proc_dir_entry *SkGeProcCreate(struct net_device *dev) +{ + struct proc_dir_entry *pe = NULL; + + if (pSkRootDir && + (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) { + pe->proc_fops = &sk_proc_fops; + pe->data = dev; + pe->owner = THIS_MODULE; + } + return pe; +} + +void SkGeProcRemove(struct proc_dir_entry *pe) +{ + char oldname[IFNAMSIZ]; + + if (pe) { + strlcpy(oldname, pe->name, IFNAMSIZ); + remove_proc_entry(oldname, pSkRootDir); + } +} + +/* Callback about network device events. + * Only care if device is this driver and it is a name change + */ +static int skge_device_notifier(struct notifier_block *unused, + unsigned long event, void *ptr) +{ + struct net_device *dev = ptr; + DEV_NET *pNet = netdev_priv(dev); + + if (event == NETDEV_CHANGENAME + && dev->hard_start_xmit == &SkGeXmit + && pNet->proc) { + SkGeProcRemove(pNet->proc); + pNet->proc = SkGeProcCreate(dev); + } + return NOTIFY_DONE; +} + +static struct notifier_block skge_dev_notifier = { + .notifier_call = skge_device_notifier, +}; + +void SkGeProcInit(void) +{ + pSkRootDir = proc_mkdir(SKRootName, proc_net); + if (pSkRootDir) { + pSkRootDir->owner = THIS_MODULE; + register_netdevice_notifier(&skge_dev_notifier); + } +} + +void SkGeProcExit(void) +{ + if (pSkRootDir) { + proc_net_remove(SKRootName); + unregister_netdevice_notifier(&skge_dev_notifier); + } +} + From shemminger@osdl.org Mon Nov 15 15:25:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:26:10 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNPpan005817 for ; Mon, 15 Nov 2004 15:25:51 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAFNPQPE020476 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 15:25:26 -0800 Date: Mon, 15 Nov 2004 15:22:14 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (6/25) sk98: get rid of #define's for C99 types Message-Id: <20041115152214.1eb0da66@zqx3.pdx.osdl.net> In-Reply-To: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11864 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of #define's for type's and use proper kernel types. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:24:00 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:24:00 -08:00 @@ -123,18 +123,6 @@ #define SK_IN16(b,a,pv) (*(pv) = readw((b)+(a))) #define SK_IN32(b,a,pv) (*(pv) = readl((b)+(a))) -#define int8_t char -#define int16_t short -#define int32_t long -#define int64_t long long -#define uint8_t u_char -#define uint16_t u_short -#define uint32_t u_long -#define uint64_t unsigned long long -#define t_scalar_t int -#define t_uscalar_t unsigned int -#define uintptr_t unsigned long - #ifdef DEBUG #define SK_DBG_PRINTF printk #ifndef SK_DEBUG_CHKMOD diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 11:24:00 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 11:24:00 -08:00 @@ -194,7 +194,7 @@ static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); -static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); +static void SetupRing(SK_AC*, void*, u64, RXD**, RXD**, RXD**, int*, SK_BOOL); static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct net_device *dev); @@ -251,8 +251,8 @@ extern struct ethtool_ops SkGeEthtoolOps; /* local variables **********************************************************/ -static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; -static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; +static u32 TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; +static u32 RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; /***************************************************************************** * @@ -763,7 +763,7 @@ static void SetupRing( SK_AC *pAC, void *pMemArea, /* a pointer to the memory area for the ring */ -uintptr_t VMemArea, /* the virtual bus address of the memory area */ +u64 VMemArea, /* the virtual bus address of the memory area */ RXD **ppRingHead, /* address where the head should be written */ RXD **ppRingTail, /* address where the tail should be written */ RXD **ppRingPrev, /* address where the tail should be written */ @@ -776,7 +776,7 @@ RXD *pDescr; /* pointer to a descriptor (receive or transmit) */ RXD *pNextDescr; /* pointer to the next descriptor */ RXD *pPrevDescr; /* pointer to the previous descriptor */ -uintptr_t VNextDescr; /* the virtual bus address of the next descriptor */ +u64 VNextDescr; /* the virtual bus address of the next descriptor */ if (IsTx == SK_TRUE) { DescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * @@ -839,22 +839,22 @@ /* set address of first descriptor of ring in BMU */ SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ Q_DA_L, - (uint32_t)(((caddr_t) + (u32)(((caddr_t) (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) - pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing + pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) & 0xFFFFFFFF)); SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ Q_DA_H, - (uint32_t)(((caddr_t) + (u32)(((caddr_t) (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) - pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing + pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) >> 32)); SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+Q_DA_L, - (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - + (u32)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - pAC->RxPort[PortIndex].pRxDescrRing + pAC->RxPort[PortIndex].VRxDescrRing) & 0xFFFFFFFF)); SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+Q_DA_H, - (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - + (u32)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - pAC->RxPort[PortIndex].pRxDescrRing + pAC->RxPort[PortIndex].VRxDescrRing) >> 32)); } /* PortReInitBmu */ From pmeda@akamai.com Mon Nov 15 15:28:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:28:57 -0800 (PST) Received: from smtp3.akamai.com (smtp3.akamai.com [63.116.109.25]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNSqBP009349 for ; Mon, 15 Nov 2004 15:28:52 -0800 Received: from smtp3.akamai.com (vwall2.sanmateo.corp.akamai.com [172.23.1.72]) by smtp3.akamai.com (8.12.10/8.12.10) with ESMTP id iAFNSUHM007506 for ; Mon, 15 Nov 2004 15:28:31 -0800 (PST) Received: from akamai.com (allur.sanmateo.corp.akamai.com [172.23.10.223]) by smtp3.akamai.com (8.12.10/8.12.10) with ESMTP id iAFNSU0P007502; Mon, 15 Nov 2004 15:28:30 -0800 (PST) Message-ID: <419949EF.9DB07BFB@akamai.com> Date: Mon, 15 Nov 2004 16:29:35 -0800 From: Prasanna Meda X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.2.16-3 i686) X-Accept-Language: en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: accept behaviour on EMFILE/ENFILE Content-Type: multipart/mixed; boundary="------------7C53B0311A9A5A0DF002B8EC" X-archive-position: 11866 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pmeda@akamai.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------7C53B0311A9A5A0DF002B8EC Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------7C53B0311A9A5A0DF002B8EC Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: from USMA1EX-GATE1.kendall.corp.akamai.com ([172.17.0.215]) by USCA1EX-PRIV1.sanmateo.corp.akamai.com with Microsoft SMTPSVC(5.0.2195.6713); Mon, 15 Nov 2004 15:26:41 -0800 Received: from smtp3.akamai.com ([172.23.1.16]) by USMA1EX-GATE1.kendall.corp.akamai.com with Microsoft SMTPSVC(5.0.2195.6713); Mon, 15 Nov 2004 18:26:40 -0500 Received: from smtp3.akamai.com (vwall2.sanmateo.corp.akamai.com [172.23.1.72]) by smtp3.akamai.com (8.12.10/8.12.10) with ESMTP id iAFNQgHK007389 for ; Mon, 15 Nov 2004 15:26:42 -0800 (PST) Received: from akamai.com (allur.sanmateo.corp.akamai.com [172.23.10.223]) by smtp3.akamai.com (8.12.10/8.12.10) with ESMTP id iAFNQf0P007385; Mon, 15 Nov 2004 15:26:41 -0800 (PST) Sender: pmeda@akamai.com Message-ID: <41994983.9471C8A1@akamai.com> Date: Mon, 15 Nov 2004 16:27:47 -0800 From: Prasanna Meda X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.2.16-3 i686) X-Accept-Language: en MIME-Version: 1.0 To: davem@redhat.com CC: linux-kernel@vger.kernel.org, devnet@oss.sgi.com, akpm@osdl.org Subject: accept behaviour on EMFILE/ENFILE Content-Type: multipart/mixed; boundary="------------7894B69DEFF544A4C995CC20" Return-Path: pmeda@akamai.com X-OriginalArrivalTime: 15 Nov 2004 23:26:40.0438 (UTC) FILETIME=[8F4D0D60:01C4CB6A] This is a multi-part message in MIME format. --------------7894B69DEFF544A4C995CC20 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When accept returns EMFILE or ENFILE, it also drops a pending connection. You may argue that is corner case, but still it can be avoided by code adjustment. The example program is attached. --- linux-2.6.9/net/socket.c Mon Oct 18 14:53:50 2004 +++ linux/net/socket.c Mon Nov 15 16:09:37 2004 @@ -362,7 +362,7 @@ * but we take care of internal coherence yet. */ -int sock_map_fd(struct socket *sock) +int sock_create_fd(struct socket *sock, struct file **filep) { int fd; struct qstr this; @@ -372,6 +372,7 @@ * Find a file descriptor suitable for return to the user. */ + *filep = NULL; fd = get_unused_fd(); if (fd >= 0) { struct file *file = get_empty_filp(); @@ -404,13 +405,36 @@ file->f_mode = FMODE_READ | FMODE_WRITE; file->f_flags = O_RDWR; file->f_pos = 0; - fd_install(fd, file); + *filep = file; } out: return fd; } +static inline void sock_install_fd(struct sock *sock, int fd, struct file *file) +{ + fd_install(fd, file); +} + +static inline void sock_release_fd(struct sock *sock, int fd, struct file *file) +{ + fput(file); + put_unused_fd(fd); +} + +int sock_map_fd(struct sock *sock) +{ + int fd; + struct file *file; + + fd = sock_create_fd(sock, &file); + if (fd >= 0) + sock_install_fd(sock, fd, file); + + return fd; +} + /** * sockfd_lookup - Go from a file number to its socket slot * @fd: file handle @@ -1349,6 +1373,8 @@ struct socket *sock, *newsock; int err, len; char address[MAX_SOCK_ADDR]; + int newfd; + struct file *newfile; sock = sockfd_lookup(fd, &err); if (!sock) @@ -1371,24 +1397,29 @@ */ __module_get(newsock->ops->owner); + newfd = sock_create_fd(newsock, &newfile); + if (newfd < 0) { + err = newfd; + goto out_release; + } + err = sock->ops->accept(sock, newsock, sock->file->f_flags); if (err < 0) - goto out_release; + goto out_fd; if (upeer_sockaddr) { if(newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 2)<0) { err = -ECONNABORTED; - goto out_release; + goto out_fd; } err = move_addr_to_user(address, len, upeer_sockaddr, upeer_addrlen); if (err < 0) - goto out_release; + goto out_fd; } /* File flags are not inherited via accept() unlike another OSes. */ - if ((err = sock_map_fd(newsock)) < 0) - goto out_release; + sock_install_fd(newsock, newfd, newfile); security_socket_post_accept(sock, newsock); @@ -1396,6 +1427,8 @@ sockfd_put(sock); out: return err; +out_fd: + sock_release_fd(newsock, newfd, newfile); out_release: sock_release(newsock); goto out_put; --------------7894B69DEFF544A4C995CC20 Content-Type: text/plain; charset=us-ascii; name="acceptonmaxfd.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="acceptonmaxfd.c" #include #include #include #include #include #include #include #include #include #include #include /* */ int *diskfds; int maxdiskfd; int curdiskfd; int cfd, sfd, nfd; void pexit(const char *msg) { perror(msg); close(sfd); close(cfd); close(nfd); printf("TEST FAILED\n"); exit(1); } int main(int argc, char *argv[]) { struct sockaddr_in myaddr, servaddr, cliaddr; int len = sizeof(struct sockaddr_in), yes = 1; unsigned short sport; int *olddiskfds; if (argc < 2) { printf("Usage:%s port\n", argv[0]); exit(1); } sport = atoi(argv[1]); /* Setup connection */ cfd = socket(PF_INET, SOCK_STREAM, 0); sfd = socket(PF_INET, SOCK_STREAM, 0); if (cfd < 0 || sfd < 0) pexit("socket"); memset((void *)&myaddr, sizeof(myaddr), 0); memset((void *)&servaddr, sizeof(myaddr), 0); memset((void *)&cliaddr, sizeof(myaddr), 0); myaddr.sin_port = servaddr.sin_port = htons(sport); myaddr.sin_family = servaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_addr.s_addr = 0; if (bind(sfd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) pexit("bind"); if (setsockopt(sfd, SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) < 0) perror("setsockopt"); if (listen(sfd, 10) < 0) pexit("listen"); if (fcntl(sfd, F_SETFL, O_NONBLOCK) < 0) perror("fnctl"); if (connect(cfd, (struct sockaddr *)&servaddr, len) < 0) pexit("connect"); printf("Client connected to server!\n"); /* consume fds */ while (1) { if (curdiskfd == maxdiskfd) { maxdiskfd = (!maxdiskfd)?1:(maxdiskfd<<1); olddiskfds = diskfds; if (!(diskfds = (int *)malloc(sizeof(int)*maxdiskfd))) pexit("malloc"); memcpy(diskfds, olddiskfds, (maxdiskfd >> 1)); free(olddiskfds); } if ((diskfds[curdiskfd] = open("/dev/null", O_RDONLY)) < 0) { printf("Server opened %d diks fds!\n", curdiskfd); break; } curdiskfd++; } nfd = accept(sfd, (struct sockaddr *)&cliaddr, &len); if (nfd < 0) { perror("1st accept"); close(diskfds[--curdiskfd]); nfd = accept(sfd, (struct sockaddr *)&cliaddr, &len); if (nfd < 0) pexit("2nd accept"); } printf("Server got connection from %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port); printf("TEST PASSED\n"); return (0); } --------------7894B69DEFF544A4C995CC20-- --------------7C53B0311A9A5A0DF002B8EC-- From davem@davemloft.net Mon Nov 15 15:29:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:29:06 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNT1VH009384 for ; Mon, 15 Nov 2004 15:29:01 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CTq2z-00012U-00; Mon, 15 Nov 2004 15:14:09 -0800 Date: Mon, 15 Nov 2004 15:14:08 -0800 From: "David S. Miller" To: Arnaldo Carvalho de Melo Cc: netdev@oss.sgi.com Subject: Re: [PATCH][NET] Assign inet transport sockets to the right module Message-Id: <20041115151408.2aad7c55.davem@davemloft.net> In-Reply-To: <41984A76.70406@conectiva.com.br> References: <41984A76.70406@conectiva.com.br> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11867 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 15 Nov 2004 04:19:34 -0200 Arnaldo Carvalho de Melo wrote: > Hi David, > > Please take a look if it makes sense, if so please pull from: > > bk://kernel.bkbits.net/acme/sock-2.6 Ok, but deferred to 2.6.11 From tgraf@suug.ch Mon Nov 15 15:38:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:38:15 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNc8SL010155 for ; Mon, 15 Nov 2004 15:38:08 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 15AFFF; Tue, 16 Nov 2004 00:37:25 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 8B0DE1C0EA; Tue, 16 Nov 2004 00:38:06 +0100 (CET) Date: Tue, 16 Nov 2004 00:38:06 +0100 From: Thomas Graf To: alchemyx@uznam.net.pl Cc: netdev@oss.sgi.com, Andrew Morton Subject: Re: Fw: [Bugme-new] [Bug 3747] New: HTB causes machine lockups Message-ID: <20041115233806.GC31969@postel.suug.ch> References: <20041115122059.4cfcd213.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041115122059.4cfcd213.akpm@osdl.org> X-archive-position: 11868 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev > Date: Mon, 15 Nov 2004 04:46:38 -0800 > From: bugme-daemon@osdl.org > To: bugme-new@lists.osdl.org > Subject: [Bugme-new] [Bug 3747] New: HTB causes machine lockups > > I have some network traffic shaping rules used on a Linux box. For example I > have hundreds of them on eth1. I am using HTB in all cases (sometimes attaching > SFQ to HTB rules). Everything works fine, until I issue: > > tc qdisc del dev eth1 root > > Which causes a machine lockup. Sometimes it happens day after day, but sometimes > once a month. There are no traces in logs, no oopses, and so on. Machine just > freezes (you see login on your screen, but can't type anything, can't ping that > machine, ctrl-alt-del or sysrq doesn't work). Problem was on kernels from 2.4.21 > up to 2.4.26. Haven't tried 2.4.27 and 2.6.x on that box yet. > > Steps to reproduce: > Hard to tell really. You need to set up a script creating hunderds of HTB rules > and regenerating them every (let say) 15 minutes, issuing 'tc qdisc del dev > ethX' everytime. Did you ever experience the same problems with other classful qdiscs such as CBQ? Would it be possible for you to run a similar CBQ setup on a dummy device and see if it happens as well? Is anything going on at the time of the deadlocks like an interface going down etc.? From ravinandan.arakali@s2io.com Mon Nov 15 15:51:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 15:51:37 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [142.46.200.198]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAFNpV4d010760 for ; Mon, 15 Nov 2004 15:51:32 -0800 Received: from guinness.s2io.com (sentry.s2io.com [142.46.200.199]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id iAFNouje016165; Mon, 15 Nov 2004 18:50:56 -0500 (EST) Received: from rarakali ([10.16.16.152]) by guinness.s2io.com (8.12.6/8.12.6) with SMTP id iAFNoq39010490; Mon, 15 Nov 2004 18:50:53 -0500 (EST) Reply-To: From: "Ravinandan Arakali" To: "'Jeff Garzik'" Cc: , , , Subject: RE: [PATCH 2.6.9-rc2 12/12] S2io: styling Date: Mon, 15 Nov 2004 15:51:07 -0800 Message-ID: <001601c4cb6d$fa341e90$9810100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2911.0) x-mimeole: Produced By Microsoft MimeOLE V6.00.2900.2180 Importance: Normal In-Reply-To: <41992ED8.7080906@pobox.com> X-Scanned-By: MIMEDefang 2.34 X-archive-position: 11869 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ravinandan.arakali@s2io.com Precedence: bulk X-list: netdev Jeff, You have not missed any of the patches. I guess the changes will appear in a future release since I don't see it yet in 2.6.10rc2. We will send one more patch to address Krishna Kumar's comments. Thanks, Ravi -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Monday, November 15, 2004 2:34 PM To: ravinandan.arakali@s2io.com Cc: raghavendra.koushik@s2io.com; romieu@fr.zoreil.com; netdev@oss.sgi.com; leonid.grossman@s2io.com Subject: Re: [PATCH 2.6.9-rc2 12/12] S2io: styling Ravinandan Arakali wrote: > Jeff, > We received couple of comments from Krishna Kumar. Other than that > we are waiting for further comments. If there are no other, we can > submit one final patch to address Krishna Kumar's comments. > > In one of your earlier mails(on 10/28), you mentioned "patches pass > review". > Pls let us know. See attached for the list of patches I've applied. If I am missing any, please let me know. Jeff From tgraf@suug.ch Mon Nov 15 16:10:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:10:37 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0AWlG011727 for ; Mon, 15 Nov 2004 16:10:32 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id D46D4F; Tue, 16 Nov 2004 01:09:50 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 897231C0EA; Tue, 16 Nov 2004 01:10:29 +0100 (CET) Date: Tue, 16 Nov 2004 01:10:29 +0100 From: Thomas Graf To: Stephen Hemminger Cc: netdev@oss.sgi.com Subject: [PATCH] iproute2: gnet_stats Message-ID: <20041116001029.GD31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 11870 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Stephen, Here is the patch for iproute2 covering all statistic users. I moved the dumping code to tc_util.c and introduced print_tcstats2_attr for new code while print_tcstats_attr handles both. I'm not sure whether you got my previous patch so this one includes all changes. diff -Nru iproute2-2.6.9.orig/include/linux/gen_stats.h iproute2-2.6.9/include/linux/gen_stats.h --- iproute2-2.6.9.orig/include/linux/gen_stats.h 1970-01-01 01:00:00.000000000 +0100 +++ iproute2-2.6.9/include/linux/gen_stats.h 2004-10-21 18:17:31.000000000 +0200 @@ -0,0 +1,62 @@ +#ifndef __LINUX_GEN_STATS_H +#define __LINUX_GEN_STATS_H + +#include + +enum { + TCA_STATS_UNSPEC, + TCA_STATS_BASIC, + TCA_STATS_RATE_EST, + TCA_STATS_QUEUE, + TCA_STATS_APP, + __TCA_STATS_MAX, +}; +#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) + +/** + * @bytes: number of seen bytes + * @packets: number of seen packets + */ +struct gnet_stats_basic +{ + __u64 bytes; + __u32 packets; +}; + +/** + * @bps: current byte rate + * @pps: current packet rate + */ +struct gnet_stats_rate_est +{ + __u32 bps; + __u32 pps; +}; + +/** + * @qlen: queue length + * @backlog: backlog size of queue + * @drops: number of dropped packets + * @requeues: number of requeues + */ +struct gnet_stats_queue +{ + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +/** + * @interval: sampling period + * @ewma_log: the log of measurement window weight + */ +struct gnet_estimator +{ + signed char interval; + unsigned char ewma_log; +}; + + +#endif /* __LINUX_GEN_STATS_H */ diff -Nru iproute2-2.6.9.orig/include/linux/rtnetlink.h iproute2-2.6.9/include/linux/rtnetlink.h --- iproute2-2.6.9.orig/include/linux/rtnetlink.h 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/include/linux/rtnetlink.h 2004-11-16 00:49:24.000000000 +0100 @@ -698,6 +698,8 @@ TCA_XSTATS, TCA_RATE, TCA_FCNT, + TCA_STATS2, + TCA_ACT_STATS, __TCA_MAX }; diff -Nru iproute2-2.6.9.orig/tc/m_action.c iproute2-2.6.9/tc/m_action.c --- iproute2-2.6.9.orig/tc/m_action.c 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/tc/m_action.c 2004-11-16 00:50:54.000000000 +0100 @@ -261,9 +261,9 @@ if (0 > err) return err; - if (show_stats && tb[TCA_STATS]) { - fprintf(f, "\t"); - print_tcstats_attr(f, tb[TCA_STATS]); + if (show_stats && tb[TCA_ACT_STATS]) { + fprintf(f, "\tAction statistics:\n"); + print_tcstats2_attr(f, tb[TCA_ACT_STATS], "\t", NULL); fprintf(f, "\n"); } diff -Nru iproute2-2.6.9.orig/tc/tc_class.c iproute2-2.6.9/tc/tc_class.c --- iproute2-2.6.9.orig/tc/tc_class.c 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/tc/tc_class.c 2004-10-21 21:21:33.000000000 +0200 @@ -216,12 +216,14 @@ } fprintf(fp, "\n"); if (show_stats) { - if (tb[TCA_STATS]) { - print_tcstats_attr(fp, tb[TCA_STATS]); + struct rtattr *xstats = NULL; + + if (tb[TCA_STATS] || tb[TCA_STATS2]) { + print_tcstats_attr(fp, tb, " ", &xstats); fprintf(fp, "\n"); } - if (q && tb[TCA_XSTATS] && q->print_xstats) { - q->print_xstats(q, fp, tb[TCA_XSTATS]); + if (q && (xstats || tb[TCA_XSTATS]) && q->print_xstats) { + q->print_xstats(q, fp, xstats ? : tb[TCA_XSTATS]); fprintf(fp, "\n"); } } diff -Nru iproute2-2.6.9.orig/tc/tc_filter.c iproute2-2.6.9/tc/tc_filter.c --- iproute2-2.6.9.orig/tc/tc_filter.c 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/tc/tc_filter.c 2004-10-21 21:22:27.000000000 +0200 @@ -254,8 +254,8 @@ } fprintf(fp, "\n"); - if (show_stats && tb[TCA_STATS]) { - print_tcstats_attr(fp, tb[TCA_STATS]); + if (show_stats && (tb[TCA_STATS] || tb[TCA_STATS2])) { + print_tcstats_attr(fp, tb, " ", NULL); fprintf(fp, "\n"); } diff -Nru iproute2-2.6.9.orig/tc/tc_qdisc.c iproute2-2.6.9/tc/tc_qdisc.c --- iproute2-2.6.9.orig/tc/tc_qdisc.c 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/tc/tc_qdisc.c 2004-11-16 00:52:38.000000000 +0100 @@ -167,39 +167,6 @@ return 0; } - -void print_tcstats_attr(FILE *fp, const struct rtattr *rta) -{ - struct tc_stats st; - SPRINT_BUF(b1); - - /* handle case where kernel returns more/less than we know about */ - memset(&st, 0, sizeof(st)); - memcpy(&st, RTA_DATA(rta), MIN(RTA_PAYLOAD(rta), sizeof(st))); - - fprintf(fp, " Sent %llu bytes %u pkts (dropped %u, overlimits %u) ", - (unsigned long long)st.bytes, st.packets, st.drops, - st.overlimits); - - if (st.bps || st.pps || st.qlen || st.backlog) { - fprintf(fp, "\n "); - if (st.bps || st.pps) { - fprintf(fp, "rate "); - if (st.bps) - fprintf(fp, "%s ", sprint_rate(st.bps, b1)); - if (st.pps) - fprintf(fp, "%upps ", st.pps); - } - if (st.qlen || st.backlog) { - fprintf(fp, "backlog "); - if (st.backlog) - fprintf(fp, "%s ", sprint_size(st.backlog, b1)); - if (st.qlen) - fprintf(fp, "%up ", st.qlen); - } - } -} - static int filter_ifindex; static int print_qdisc(const struct sockaddr_nl *who, @@ -264,13 +231,15 @@ } fprintf(fp, "\n"); if (show_stats) { - if (tb[TCA_STATS]) { - print_tcstats_attr(fp, tb[TCA_STATS]); + struct rtattr *xstats = NULL; + + if (tb[TCA_STATS] || tb[TCA_STATS2] || tb[TCA_XSTATS]) { + print_tcstats_attr(fp, tb, " ", &xstats); fprintf(fp, "\n"); } - if (q && tb[TCA_XSTATS] && q->print_xstats) { - q->print_xstats(q, fp, tb[TCA_XSTATS]); + if (q && xstats && q->print_xstats) { + q->print_xstats(q, fp, xstats); fprintf(fp, "\n"); } } diff -Nru iproute2-2.6.9.orig/tc/tc_util.c iproute2-2.6.9/tc/tc_util.c --- iproute2-2.6.9.orig/tc/tc_util.c 2004-10-19 22:49:02.000000000 +0200 +++ iproute2-2.6.9/tc/tc_util.c 2004-11-16 00:48:34.000000000 +0100 @@ -425,3 +425,91 @@ if (tm->expires != 0) fprintf(f, " expires %d sec", tm->expires/hz); } + +void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats) +{ + SPRINT_BUF(b1); + struct rtattr *tbs[TCA_STATS_MAX + 1] = {0}; + + parse_rtattr(tbs, TCA_STATS_MAX, RTA_DATA(rta), RTA_PAYLOAD(rta)); + + if (tbs[TCA_STATS_BASIC]) { + struct gnet_stats_basic bs = {0}; + memcpy(&bs, RTA_DATA(tbs[TCA_STATS_BASIC]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC]), sizeof(bs))); + fprintf(fp, "%sSent %llu bytes %u pkt", + prefix, bs.bytes, bs.packets); + } + + if (tbs[TCA_STATS_QUEUE]) { + struct gnet_stats_queue q = {0}; + memcpy(&q, RTA_DATA(tbs[TCA_STATS_QUEUE]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_QUEUE]), sizeof(q))); + fprintf(fp, " (dropped %u, overlimits %u requeues %u) ", + q.drops, q.overlimits, q.requeues); + } + + if (tbs[TCA_STATS_RATE_EST]) { + struct gnet_stats_rate_est re = {0}; + memcpy(&re, RTA_DATA(tbs[TCA_STATS_RATE_EST]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_RATE_EST]), sizeof(re))); + fprintf(fp, "\n%srate %s %upps ", + prefix, sprint_rate(re.bps, b1), re.pps); + } + + if (tbs[TCA_STATS_QUEUE]) { + struct gnet_stats_queue q = {0}; + memcpy(&q, RTA_DATA(tbs[TCA_STATS_QUEUE]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_QUEUE]), sizeof(q))); + if (!tbs[TCA_STATS_RATE_EST]) + fprintf(fp, "\n%s", prefix); + fprintf(fp, "backlog %s %up requeues %u ", + sprint_size(q.backlog, b1), q.qlen, q.requeues); + } + + if (xstats) + *xstats = tbs[TCA_STATS_APP] ? : NULL; +} + +void print_tcstats_attr(FILE *fp, struct rtattr *tb[], char *prefix, struct rtattr **xstats) +{ + SPRINT_BUF(b1); + + if (tb[TCA_STATS2]) { + print_tcstats2_attr(fp, tb[TCA_STATS2], prefix, xstats); + if (xstats && NULL == *xstats) + goto compat_xstats; + return; + } + /* backward compatibility */ + if (tb[TCA_STATS]) { + struct tc_stats st; + + /* handle case where kernel returns more/less than we know about */ + memset(&st, 0, sizeof(st)); + memcpy(&st, RTA_DATA(tb[TCA_STATS]), MIN(RTA_PAYLOAD(tb[TCA_STATS]), sizeof(st))); + + fprintf(fp, "%sSent %llu bytes %u pkts (dropped %u, overlimits %u) ", + prefix, (unsigned long long)st.bytes, st.packets, st.drops, + st.overlimits); + + if (st.bps || st.pps || st.qlen || st.backlog) { + fprintf(fp, "\n%s", prefix); + if (st.bps || st.pps) { + fprintf(fp, "rate "); + if (st.bps) + fprintf(fp, "%s ", sprint_rate(st.bps, b1)); + if (st.pps) + fprintf(fp, "%upps ", st.pps); + } + if (st.qlen || st.backlog) { + fprintf(fp, "backlog "); + if (st.backlog) + fprintf(fp, "%s ", sprint_size(st.backlog, b1)); + if (st.qlen) + fprintf(fp, "%up ", st.qlen); + } + } + } + +compat_xstats: + if (tb[TCA_XSTATS] && xstats) + *xstats = tb[TCA_XSTATS]; +} + diff -Nru iproute2-2.6.9.orig/tc/tc_util.h iproute2-2.6.9/tc/tc_util.h --- iproute2-2.6.9.orig/tc/tc_util.h 2004-11-16 01:04:38.000000000 +0100 +++ iproute2-2.6.9/tc/tc_util.h 2004-11-16 00:48:03.000000000 +0100 @@ -4,6 +4,7 @@ #define MAX_MSG 16384 #include #include +#include #include "tc_core.h" struct qdisc_util @@ -58,7 +59,8 @@ extern char * sprint_usecs(__u32 usecs, char *buf); extern char * sprint_percent(__u32 percent, char *buf); -extern void print_tcstats_attr(FILE *fp, const struct rtattr *ts); +extern void print_tcstats_attr(FILE *fp, struct rtattr *tb[], char *prefix, struct rtattr **xstats); +extern void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats); extern int get_tc_classid(__u32 *h, const char *str); extern int print_tc_classid(char *buf, int len, __u32 h); From tgraf@suug.ch Mon Nov 15 16:15:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:15:29 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0FPml012155 for ; Mon, 15 Nov 2004 16:15:25 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 36830F; Tue, 16 Nov 2004 01:14:44 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id D85CD1C0EA; Tue, 16 Nov 2004 01:15:26 +0100 (CET) Date: Tue, 16 Nov 2004 01:15:26 +0100 From: Thomas Graf To: Stephen Hemminger Cc: netdev@oss.sgi.com Subject: [PATCH] iproute2: ndm states should be handled as flags Message-ID: <20041116001526.GE31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 11871 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Stephen, ndm states are actually flags. diff -Nru iproute2-2.6.9.orig/ip/ipneigh.c iproute2-2.6.9/ip/ipneigh.c --- iproute2-2.6.9.orig/ip/ipneigh.c 2004-10-19 22:49:02.000000000 +0200 +++ iproute2-2.6.9/ip/ipneigh.c 2004-11-16 01:12:59.000000000 +0100 @@ -86,33 +86,6 @@ return 0; } -char * nud_state_n2a(__u8 state, char *buf, int len) -{ - switch (state) { - case NUD_NONE: - return "none"; - case NUD_INCOMPLETE: - return "incomplete"; - case NUD_REACHABLE: - return "reachable"; - case NUD_STALE: - return "stale"; - case NUD_DELAY: - return "delay"; - case NUD_PROBE: - return "probe"; - case NUD_FAILED: - return "failed"; - case NUD_NOARP: - return "noarp"; - case NUD_PERMANENT: - return "permanent"; - default: - snprintf(buf, len, "%x", state); - return buf; - } -} - static int flush_update(void) { if (rtnl_send(filter.rth, filter.flushb, filter.flushp) < 0) { @@ -316,8 +289,20 @@ } if (r->ndm_state) { - SPRINT_BUF(b1); - fprintf(fp, " nud %s", nud_state_n2a(r->ndm_state, b1, sizeof(b1))); + int nud = r->ndm_state; + fprintf(fp, " "); + +#define PRINT_FLAG(f) if (nud & NUD_##f) { \ + nud &= ~NUD_##f; fprintf(fp, #f "%s", nud ? "," : ""); } + PRINT_FLAG(INCOMPLETE); + PRINT_FLAG(REACHABLE); + PRINT_FLAG(STALE); + PRINT_FLAG(DELAY); + PRINT_FLAG(PROBE); + PRINT_FLAG(FAILED); + PRINT_FLAG(NOARP); + PRINT_FLAG(PERMANENT); +#undef PRINT_FLAG } fprintf(fp, "\n"); From shemminger@osdl.org Mon Nov 15 16:34:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:12 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y0rA016144 for ; Mon, 15 Nov 2004 16:34:00 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XaPE027070 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:37 -0800 Date: Mon, 15 Nov 2004 15:55:54 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (22/25) sk98: use PCI_SLOT macro Message-Id: <20041115155554.5f8b2dd0@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11873 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Don't need to parse the PCI name (*yuck*) just to find the slot, there is a macro already available to find it. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:45:00 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:45:00 -08:00 @@ -212,7 +212,6 @@ static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*); #ifdef SK_DIAG_SUPPORT -static SK_U32 ParseDeviceNbrFromSlotName(const char *SlotName); static int SkDrvInitAdapter(SK_AC *pAC, int devNbr); static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr); #endif @@ -2879,7 +2878,7 @@ */ * ((SK_U32 *)pMemBuf) = 0; * ((SK_U32 *)pMemBuf + 1) = pdev->bus->number; - * ((SK_U32 *)pMemBuf + 2) = ParseDeviceNbrFromSlotName(pdev->slot_name); + * ((SK_U32 *)pMemBuf + 2) = PCI_SLOT(pdev->devfn); if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_diag; @@ -4413,62 +4412,6 @@ SkDrvInitAdapter(pAc, 1); /* second device */ } return(0); -} - -/***************************************************************************** - * - * ParseDeviceNbrFromSlotName - Evaluate PCI device number - * - * Description: - * This function parses the PCI slot name information string and will - * retrieve the devcie number out of it. The slot_name maintianed by - * linux is in the form of '02:0a.0', whereas the first two characters - * represent the bus number in hex (in the sample above this is - * pci bus 0x02) and the next two characters the device number (0x0a). - * - * Returns: - * SK_U32: The device number from the PCI slot name - */ - -static SK_U32 ParseDeviceNbrFromSlotName( -const char *SlotName) /* pointer to pci slot name eg. '02:0a.0' */ -{ - char *CurrCharPos = (char *) SlotName; - int FirstNibble = -1; - int SecondNibble = -1; - SK_U32 Result = 0; - - while (*CurrCharPos != '\0') { - if (*CurrCharPos == ':') { - while (*CurrCharPos != '.') { - CurrCharPos++; - if ( (*CurrCharPos >= '0') && - (*CurrCharPos <= '9')) { - if (FirstNibble == -1) { - /* dec. value for '0' */ - FirstNibble = *CurrCharPos - 48; - } else { - SecondNibble = *CurrCharPos - 48; - } - } else if ( (*CurrCharPos >= 'a') && - (*CurrCharPos <= 'f') ) { - if (FirstNibble == -1) { - FirstNibble = *CurrCharPos - 87; - } else { - SecondNibble = *CurrCharPos - 87; - } - } else { - Result = 0; - } - } - - Result = FirstNibble; - Result = Result << 4; /* first nibble is higher one */ - Result = Result | SecondNibble; - } - CurrCharPos++; /* next character */ - } - return (Result); } /**************************************************************************** From shemminger@osdl.org Mon Nov 15 16:34:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:25 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y3hd016151 for ; Mon, 15 Nov 2004 16:34:03 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XcPE027082 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:39 -0800 Date: Mon, 15 Nov 2004 15:58:32 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (23/25) sk98: eliminate Pnmi scratchpad Message-Id: <20041115155832.264aa86f@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11875 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of 44K of space in the driver structure which was just being used as a scratch pad when making the calls to read stats. PnmiStruct can just be kmalloc'd/kfree in those cases. PNMI initialization can be done in one place using existing macro's for consitency Don't need to cast and mask when converting u64 to u32. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 14:53:23 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 14:53:23 -08:00 @@ -402,9 +402,9 @@ spinlock_t SlowPathLock; /* Normal IRQ lock */ struct timer_list BlinkTimer; /* for LED blinking */ int LedsOn; - SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */ - int RlmtMode; /* link check mode to set */ - int RlmtNets; /* Number of nets */ + + int RlmtMode; /* link check mode to set */ + int RlmtNets; /* Number of nets */ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ @@ -442,7 +442,6 @@ #ifdef SK_DIAG_SUPPORT SK_U32 DiagModeActive; /* is diag active? */ SK_BOOL DiagFlowCtrl; /* for control purposes */ - SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while * DIAG is busy with NIC */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-15 14:53:23 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-15 14:53:23 -08:00 @@ -261,9 +261,26 @@ static void sk98_get_ethstats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { - const DEV_NET *pNet = netdev_priv(dev); - const SK_AC *pAC = pNet->pAC; - const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + unsigned long flags; + unsigned int size; + int err; + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, flags); + err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); + + if (err) + return; *data++ = pPnmiStruct->Stat[0].StatRxOkCts; *data++ = pPnmiStruct->Stat[0].StatTxOkCts; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:53:23 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:53:23 -08:00 @@ -205,7 +205,7 @@ static void ClearTxRing(SK_AC*, TX_PORT*); static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); -static int SkGeIocMib(DEV_NET*, unsigned int, int); +static unsigned int SkGeIocMib(DEV_NET*, SK_PNMI_STRUCT_DATA *,unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); static void StartDrvCleanupTimer(SK_AC *pAC); static void StopDrvCleanupTimer(SK_AC *pAC); @@ -1323,10 +1323,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: done ")); - SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA)); - SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); - pAC->MaxPorts--; return (0); @@ -2703,13 +2699,18 @@ SK_AC *pAC = pNet->pAC; SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ -SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */ unsigned int Size; /* size of pnmi struct */ unsigned long Flags; /* for spin lock */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeStats starts now...\n")); - pPnmiStruct = &pAC->PnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_ATOMIC); + if (!pPnmiStruct) + goto out; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + Size = sizeof(*pPnmiStruct); #ifdef SK_DIAG_SUPPORT if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && @@ -2725,7 +2726,6 @@ #endif pPnmiStat = &pPnmiStruct->Stat[0]; - pPnmiConf = &pPnmiStruct->Conf[0]; pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; @@ -2764,7 +2764,9 @@ pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; pAC->stats.tx_window_errors = (SK_U32) 0; - return(&pAC->stats); + kfree(pPnmiStruct); + out: + return &pAC->stats; } /* SkGeStats */ @@ -2788,9 +2790,7 @@ void *pMemBuf; struct pci_dev *pdev = NULL; SK_GE_IOCTL Ioctl; -unsigned int Err = 0; -int Size = 0; -int Ret = 0; +int Err = 0; unsigned int Length = 0; int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); @@ -2809,27 +2809,35 @@ case SK_IOCTL_PRESETMIB: if (!capable(CAP_NET_ADMIN)) return -EPERM; case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, - Ioctl.LenPnmiStruct)? - Ioctl.Len : sizeof(pAC->PnmiStruct))) { - return -EFAULT; - } - Size = SkGeIocMib(pNet, Ioctl.Len, cmd); - if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct, - Ioctl.Lenifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + { + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + + if (copy_from_user(pPnmiStruct, Ioctl.pData, + min(sizeof(*pPnmiStruct), Ioctl.Len))) return -EFAULT; + + Length = SkGeIocMib(pNet, pPnmiStruct, Ioctl.Len, cmd); + if (copy_to_user(Ioctl.pData, pPnmiStruct, + min(Length, Ioctl.Len))) + Err = -EFAULT; + else { + Ioctl.Len = Length; + if (copy_to_user(rq->ifr_data, &Ioctl, + sizeof(SK_GE_IOCTL))) + Err = -EFAULT; } + kfree(pPnmiStruct); break; + } case SK_IOCTL_GEN: - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } @@ -2837,16 +2845,16 @@ Err = -EFAULT; goto fault_gen; } - if ((Ret = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { + if ((Err = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { Err = -EFAULT; goto fault_gen; } - if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { + if (copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_gen; } Ioctl.Len = Length; - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + if (copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { Err = -EFAULT; goto fault_gen; } @@ -2856,15 +2864,14 @@ #ifdef SK_DIAG_SUPPORT case SK_IOCTL_DIAG: if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } - if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { + + if (copy_from_user(pMemBuf, Ioctl.pData, Length)) { Err = -EFAULT; goto fault_diag; } @@ -2900,7 +2907,6 @@ } /* SkGeIoctl */ - /***************************************************************************** * * SkGeIocMib - handle a GetMib, SetMib- or PresetMib-ioctl message @@ -2918,8 +2924,9 @@ * Returns: * returned size from PNMI call */ -static int SkGeIocMib( +static unsigned int SkGeIocMib( DEV_NET *pNet, /* pointer to the adapter context */ +SK_PNMI_STRUCT_DATA *pPnmiStruct, /* structure for all Pnmi-Data */ unsigned int Size, /* length of ioctl data */ int mode) /* flag for set/preset */ { @@ -2933,16 +2940,13 @@ spin_lock_irqsave(&pAC->SlowPathLock, Flags); switch(mode) { case SK_IOCTL_GETMIB: - SkPnmiGetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_PRESETMIB: - SkPnmiPreSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiPreSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_SETMIB: - SkPnmiSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; default: break; @@ -4353,9 +4357,6 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); - pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { if (netif_running(pAC->dev[0])) { @@ -4397,8 +4398,6 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - SK_MEMCPY(&(pAc->PnmiStruct), &(pAc->PnmiBackup), - sizeof(SK_PNMI_STRUCT_DATA)); pAc->DiagModeActive = DIAG_NOTACTIVE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) { @@ -4782,10 +4781,6 @@ /* Save the hardware revision */ pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + (pAC->GIni.GIPciHwRev & 0x0F); - - /* Set driver globals */ - memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); - memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); #ifdef USE_SK_RX_CHECKSUM pAC->RxPort[0].UseRxCsum = SK_TRUE; diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-15 14:53:23 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-15 14:53:23 -08:00 @@ -63,33 +63,26 @@ struct net_device *dev = seq->private; DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; - SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + SK_PNMI_STRUCT_DATA *pPnmiStruct; unsigned long Flags; unsigned int Size; char sens_msg[50]; int t; int i; + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + /* NetIndex in GetStruct is now required, zero is only dummy */ for (t=pAC->GIni.GIMacsFound; t > 0; t--) { if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1) t--; + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); spin_lock_irqsave(&pAC->SlowPathLock, Flags); Size = SK_PNMI_STRUCT_SIZE; -#ifdef SK_DIAG_SUPPORT - if (pAC->BoardLevel == SK_INIT_DATA) { - SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); - if (pAC->DiagModeActive == DIAG_NOTACTIVE) { - pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; - } - } else { - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); - } -#else - SkPnmiGetStruct(pAC, pAC->IoBase, - pPnmiStruct, &Size, t-1); -#endif + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->dev[t-1] == dev) { @@ -243,6 +236,7 @@ } } + kfree(pPnmiStruct); return 0; } From shemminger@osdl.org Mon Nov 15 16:34:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:13 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y1sG016145 for ; Mon, 15 Nov 2004 16:34:01 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XbPE027074 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:38 -0800 Date: Mon, 15 Nov 2004 15:44:32 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (14/25) sk98: add module version Message-Id: <20041115154432.751cac27@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11874 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Add module version Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:37:00 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:37:00 -08:00 @@ -334,6 +334,7 @@ MODULE_AUTHOR("Mirko Lindner "); MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver"); MODULE_LICENSE("GPL"); +MODULE_VERSION(VER_STRING); #ifdef LINK_SPEED_A static char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED; From shemminger@osdl.org Mon Nov 15 16:34:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:30 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y6RV016160 for ; Mon, 15 Nov 2004 16:34:06 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XfPE027093 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:42 -0800 Date: Mon, 15 Nov 2004 16:00:30 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (24/25) sk98: get_stats cleanup Message-Id: <20041115160030.2413f0a5@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11877 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Cleanup indentation and casting in the get statistics routine. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:56:52 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:56:52 -08:00 @@ -2695,15 +2695,15 @@ */ static struct net_device_stats *SkGeStats(struct net_device *dev) { -DEV_NET *pNet = netdev_priv(dev); -SK_AC *pAC = pNet->pAC; -SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ -SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ -unsigned int Size; /* size of pnmi struct */ -unsigned long Flags; /* for spin lock */ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ + SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ + unsigned int Size; /* size of pnmi struct */ + unsigned long Flags; /* for spin lock */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeStats starts now...\n")); + ("SkGeStats starts now...\n")); pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_ATOMIC); if (!pPnmiStruct) @@ -2712,60 +2712,46 @@ memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); Size = sizeof(*pPnmiStruct); -#ifdef SK_DIAG_SUPPORT - if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && - (pAC->BoardLevel == SK_INIT_RUN)) { -#endif - SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA)); - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - Size = SK_PNMI_STRUCT_SIZE; - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -#ifdef SK_DIAG_SUPPORT - } -#endif + spin_lock_irqsave(&pAC->SlowPathLock, Flags); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); pPnmiStat = &pPnmiStruct->Stat[0]; - pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; - pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; - pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; - pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; - - if (dev->mtu <= 1500) { - pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; - } else { - pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - - pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF); - } - - - if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) - pAC->stats.rx_errors = pAC->stats.rx_errors - pPnmiStat->StatRxShortsCts; - - pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; - pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF; - pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF; - pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF; - pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; - - /* detailed rx_errors: */ - pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF; - pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF; - pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF; - pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF; - - /* detailed tx_errors */ - pAC->stats.tx_aborted_errors = (SK_U32) 0; - pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF; - pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_window_errors = (SK_U32) 0; + memset(&pAC->stats, 0, sizeof(struct net_device_stats)); + pAC->stats.rx_packets = pPnmiStruct->RxDeliveredCts; + pAC->stats.tx_packets = pPnmiStat->StatTxOkCts; + pAC->stats.rx_bytes = pPnmiStruct->RxOctetsDeliveredCts; + pAC->stats.tx_bytes = pPnmiStat->StatTxOctetsOkCts; + + pAC->stats.rx_errors = pPnmiStruct->InErrorsCts; + if (dev->mtu > 1500) + pAC->stats.rx_errors -= pPnmiStat->StatRxTooLongCts; + + if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) + pAC->stats.rx_errors -= pPnmiStat->StatRxShortsCts; + + pAC->stats.tx_errors = pPnmiStat->StatTxSingleCollisionCts; + pAC->stats.rx_dropped = pPnmiStruct->RxNoBufCts; + pAC->stats.tx_dropped = pPnmiStruct->TxNoBufCts; + pAC->stats.multicast = pPnmiStat->StatRxMulticastOkCts; + pAC->stats.collisions = pPnmiStat->StatTxSingleCollisionCts; + + /* detailed rx_errors: */ + pAC->stats.rx_length_errors = pPnmiStat->StatRxRuntCts; + pAC->stats.rx_over_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_crc_errors = pPnmiStat->StatRxFcsCts; + pAC->stats.rx_frame_errors = pPnmiStat->StatRxFramingCts; + pAC->stats.rx_fifo_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_missed_errors = pPnmiStat->StatRxMissedCts; + + /* detailed tx_errors */ + pAC->stats.tx_carrier_errors = pPnmiStat->StatTxCarrierCts; + pAC->stats.tx_fifo_errors = pPnmiStat->StatTxFifoUnderrunCts; + pAC->stats.tx_heartbeat_errors = pPnmiStat->StatTxCarrierCts; kfree(pPnmiStruct); - out: + out: return &pAC->stats; } /* SkGeStats */ From shemminger@osdl.org Mon Nov 15 16:34:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:27 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y4CN016152 for ; Mon, 15 Nov 2004 16:34:04 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XePE027088 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:40 -0800 Date: Mon, 15 Nov 2004 15:44:45 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: Tommy Christensen , netdev@oss.sgi.com Subject: [PATCH] (15/25) sk98: handle tranmit ring full Message-Id: <20041115154445.701240d7@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11876 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Return correct value when ring is full, and stop queue when reaches maximum. Need to check ring status under lock to avoid race with transmit interrupt. Don't drop skb when returning busy! Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:46:45 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:46:45 -08:00 @@ -1354,67 +1354,47 @@ * Description: * The system calls this function to send frames onto the wire. * It puts the frame in the tx descriptor ring. If the ring is - * full then, the 'tbusy' flag is set. + * full then, the it returns busy and leaves skb alone. * * Returns: - * 0, if everything is ok - * !=0, on error - * WARNING: returning 1 in 'tbusy' case caused system crashes (double - * allocated skb's) !!! + * 0 (NETDEV_TX_OK) if everything is ok + * 1 (NETDEV_TX_BUSY) if ring is full */ int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { -DEV_NET *pNet; -SK_AC *pAC; -int Rc; /* return code of XmitFrame */ - - pNet = netdev_priv(dev); - pAC = pNet->pAC; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + TX_PORT *pTxPort; + int rc; + unsigned long flags; + + if (pAC->RlmtNets == 2) + pTxPort = &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]; + else + pTxPort = &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW]; + + spin_lock_irqsave(&pTxPort->TxDesRingLock, flags); if ((!skb_shinfo(skb)->nr_frags) || - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) { - /* Don't activate scatter-gather and hardware checksum */ - - if (pAC->RlmtNets == 2) - Rc = XmitFrame( - pAC, - &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW], - skb); - else - Rc = XmitFrame( - pAC, - &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], - skb); - } else { - /* scatter-gather and hardware TCP checksumming anabled*/ - if (pAC->RlmtNets == 2) - Rc = XmitFrameSG( - pAC, - &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW], - skb); - else - Rc = XmitFrameSG( - pAC, - &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], - skb); - } - - /* Transmitter out of resources? */ - if (Rc <= 0) { + (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) + rc = XmitFrame(pAC, pTxPort, skb); + else + rc = XmitFrameSG(pAC, pTxPort, skb); + + /* is space left for next transmit? */ + if (rc <= 0) netif_stop_queue(dev); - } + + spin_unlock_irqrestore(&pTxPort->TxDesRingLock, flags); + + /* Transmit failed, out of resources */ + if (unlikely(rc < 0)) + return NETDEV_TX_BUSY; - /* If not taken, give buffer ownership back to the - * queueing layer. - */ - if (Rc < 0) - return (1); - - dev->trans_start = jiffies; - return (0); + dev->trans_start = jiffies; + return NETDEV_TX_OK; } /* SkGeXmit */ - /***************************************************************************** * * XmitFrame - fill one socket buffer into the transmit ring @@ -1444,7 +1424,6 @@ { TXD *pTxd; /* the rxd to fill */ TXD *pOldTxd; - unsigned long Flags; SK_U64 PhysAddr; int Protocol; int IpHeaderLength; @@ -1452,7 +1431,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); - spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE FreeTxDescriptors(pAC, pTxPort); #endif @@ -1463,7 +1441,6 @@ */ FreeTxDescriptors(pAC, pTxPort); if (pTxPort->TxdRingFree == 0) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); SK_PNMI_CNT_NO_TX_BUF(pAC, pTxPort->PortIndex); SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, @@ -1486,7 +1463,6 @@ */ if (BytesSend < C_LEN_ETHERNET_MINSIZE) { if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); return 0; } pMessage->len = C_LEN_ETHERNET_MINSIZE; @@ -1561,16 +1537,7 @@ SK_OUT8(pTxPort->HwAddr, Q_CSR, CSR_START); } - /* - ** after releasing the lock, the skb may immediately be free'd - */ - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - if (pTxPort->TxdRingFree != 0) { - return (BytesSend); - } else { - return (0); - } - + return (pTxPort->TxdRingFree != 0); } /* XmitFrame */ /***************************************************************************** @@ -1603,16 +1570,13 @@ int Protocol; skb_frag_t *sk_frag; SK_U64 PhysAddr; - unsigned long Flags; - spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE FreeTxDescriptors(pAC, pTxPort); #endif if ((skb_shinfo(pMessage)->nr_frags +1) > pTxPort->TxdRingFree) { FreeTxDescriptors(pAC, pTxPort); if ((skb_shinfo(pMessage)->nr_frags + 1) > pTxPort->TxdRingFree) { - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); SK_PNMI_CNT_NO_TX_BUF(pAC, pTxPort->PortIndex); SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, @@ -1744,13 +1708,7 @@ pTxPort->pTxdRingPrev = pTxdLst; pTxPort->pTxdRingHead = pTxd; - spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - - if (pTxPort->TxdRingFree > 0) { - return (BytesSend); - } else { - return (0); - } + return (pTxPort->TxdRingFree > 0); } /***************************************************************************** From shemminger@osdl.org Mon Nov 15 16:33:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:02 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0XuxT016142 for ; Mon, 15 Nov 2004 16:33:57 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XWPE027062 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:32 -0800 Date: Mon, 15 Nov 2004 15:51:44 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (20/25) sk98: ethtool transmit checksum and scatter gather setting Message-Id: <20041115155144.3d2e3d1c@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11872 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Allow control of transmit checksum with ethtool. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-15 14:36:09 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-15 14:36:09 -08:00 @@ -468,9 +468,30 @@ return ret ? -EIO : 0; } +static int sk98_set_sg(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (!pAC->ChipsetType && data) + return -EOPNOTSUPP; + return ethtool_op_set_sg(dev, data); +} + +static int sk98_set_tx_csum(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (!pAC->ChipsetType && data) + return -EOPNOTSUPP; + return ethtool_op_set_tx_csum(dev, data); +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = sk98_get_settings, .set_settings = sk98_set_settings, + .get_link = ethtool_op_get_link, .get_drvinfo = sk98_get_driver_info, .get_strings = sk98_get_strings, .get_stats_count = sk98_stats_count, @@ -478,4 +499,8 @@ .phys_id = sk98_flash_leds, .get_pauseparam = sk98_get_pause_param, .set_pauseparam = sk98_set_pause_param, + .get_sg = ethtool_op_get_sg, + .set_sg = sk98_set_sg, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = sk98_set_tx_csum, }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:36:09 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:36:09 -08:00 @@ -4177,18 +4177,15 @@ printk(" irq moderation: disabled\n"); -#ifdef SK_ZEROCOPY - if (pAC->ChipsetType) -#ifdef USE_SK_TX_CHECKSUM + if (pAC->dev[FromPort]->features & NETIF_F_SG) printk(" scatter-gather: enabled\n"); -#else - printk(" tx-checksum: disabled\n"); -#endif + else + printk(" scatter-gather: disabled\n"); + + if (pAC->dev[FromPort]->features & NETIF_F_IP_CSUM) + printk(" tx-checksum: enabled\n"); else - printk(" scatter-gather: disabled\n"); -#else - printk(" scatter-gather: disabled\n"); -#endif + printk(" tx-checksum: disabled\n"); #ifndef USE_SK_RX_CHECKSUM printk(" rx-checksum: disabled\n"); From shemminger@osdl.org Mon Nov 15 16:34:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:39 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y8HW016172 for ; Mon, 15 Nov 2004 16:34:08 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XiPE027101 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:44 -0800 Date: Mon, 15 Nov 2004 16:36:16 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (25/25) sk98: change type of DiagModeActive Message-Id: <20041115163616.17dfe933@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11885 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev DiagModeActive is just a boolean, doesn't need whole u32 Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 16:24:29 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 16:24:29 -08:00 @@ -378,11 +378,6 @@ SK_TIMER ModTimer; /* just some timer */ }; -#ifdef SK_DIAG_SUPPORT -#define DIAG_ACTIVE 1 -#define DIAG_NOTACTIVE 0 -#endif - /**************************************************************************** * Per board structure / Adapter Context structure: * Allocated within attach(9e) and freed within detach(9e). @@ -440,7 +435,7 @@ * 1 == Yukon family support */ #ifdef SK_DIAG_SUPPORT - SK_U32 DiagModeActive; /* is diag active? */ + SK_BOOL DiagModeActive; /* is diag active? */ SK_BOOL DiagFlowCtrl; /* for control purposes */ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while * DIAG is busy with NIC diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 16:24:29 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 16:24:29 -08:00 @@ -1122,7 +1122,7 @@ ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC)); #ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive == DIAG_ACTIVE) { + if (pAC->DiagModeActive) { if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) { return (-1); /* still in use by diag; deny actions */ } @@ -1238,7 +1238,7 @@ pAC = pNet->pAC; #ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive == DIAG_ACTIVE) { + if (pAC->DiagModeActive) { if (pAC->DiagFlowCtrl == SK_FALSE) { /* ** notify that the interface which has been closed @@ -2492,7 +2492,7 @@ } #ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive == DIAG_ACTIVE) { + if (pAC->DiagModeActive) { if (pAC->DiagFlowCtrl == SK_FALSE) { return -1; /* still in use, deny any actions of MTU */ } else { @@ -4343,7 +4343,7 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - pAC->DiagModeActive = DIAG_ACTIVE; + pAC->DiagModeActive = SK_TRUE; if (pAC->BoardLevel > SK_INIT_DATA) { if (netif_running(pAC->dev[0])) { pAC->WasIfUp[0] = SK_TRUE; @@ -4384,7 +4384,7 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - pAc->DiagModeActive = DIAG_NOTACTIVE; + pAc->DiagModeActive = SK_FALSE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) { pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ From shemminger@osdl.org Mon Nov 15 16:34:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:33 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y7Dl016165 for ; Mon, 15 Nov 2004 16:34:07 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XhPE027097 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:43 -0800 Date: Mon, 15 Nov 2004 15:44:53 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (16/25) sk98: don't redefine DEV_KFREE and IRQ Message-Id: <20041115154453.0eabbcf6@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11878 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Don't redefine DEV_KFREE and irq return types. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:49:08 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:49:08 -08:00 @@ -166,22 +166,12 @@ // #define CON_TYPE {"Auto", } // #define RLMT_MODE {"CheckLinkState", } -#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb) -#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb) -#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb) - - /* Set blink mode*/ #define OEM_CONFIG_VALUE ( SK_ACT_LED_BLINK | \ SK_DUP_LED_NORMAL | \ SK_LED_LINK100_ON) -/* Isr return value */ -#define SkIsrRetVar irqreturn_t -#define SkIsrRetNone IRQ_NONE -#define SkIsrRetHandled IRQ_HANDLED - /******************************************************************************* * @@ -195,8 +185,8 @@ static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); static void SetupRing(SK_AC*, void*, u64, RXD**, RXD**, RXD**, int*, SK_BOOL); -static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); -static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct net_device *dev); static int SkGeClose(struct net_device *dev); static int SkGeSetMacAddr(struct net_device *dev, void *p); @@ -839,7 +829,7 @@ * Returns: N/A * */ -static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; @@ -853,8 +843,8 @@ * Check and process if its our interrupt */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); - if (IntSrc == 0) { - return SkIsrRetNone; + if (IntSrc == 0 || IntSrc == ~0) { + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { @@ -971,7 +961,7 @@ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return SkIsrRetHandled; + return IRQ_HANDLED; } /* SkGeIsr */ @@ -988,7 +978,7 @@ * Returns: N/A * */ -static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { struct net_device *dev = (struct net_device *)dev_id; DEV_NET *pNet; @@ -1002,8 +992,8 @@ * Check and process if its our interrupt */ SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); - if (IntSrc == 0) { - return SkIsrRetNone; + if (IntSrc == 0 || IntSrc == ~0) { + return IRQ_NONE; } while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { @@ -1077,12 +1067,12 @@ * guarded now * ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); - */ + */ /* IRQ is processed - Enable IRQs again*/ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return SkIsrRetHandled; + return IRQ_HANDLED; } /* SkGeIsrOnePort */ #ifdef CONFIG_NET_POLL_CONTROLLER @@ -1777,7 +1767,7 @@ PCI_DMA_TODEVICE); if (Control & BMU_EOF) - DEV_KFREE_SKB_ANY(pTxd->pMBuf); /* free message */ + dev_kfree_skb_any(pTxd->pMBuf); /* free message */ pTxPort->TxdRingFree++; pTxd->TBControl &= ~BMU_SW; @@ -2207,7 +2197,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, ("D")); - DEV_KFREE_SKB(pMsg); + dev_kfree_skb(pMsg); } } /* if not for rlmt */ @@ -2256,7 +2246,7 @@ pAC->dev[pRxPort->PortIndex]->last_rx = jiffies; } else { - DEV_KFREE_SKB(pMsg); + dev_kfree_skb(pMsg); } } /* if packet for rlmt */ @@ -2283,7 +2273,7 @@ PhysAddr, pAC->RxBufSize - 2, PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB_IRQ(pRxd->pMBuf); + dev_kfree_skb_irq(pRxd->pMBuf); pRxd->pMBuf = NULL; pRxPort->RxdRingFree++; pRxPort->pRxdRingHead = pRxd->pNextRxd; @@ -2366,7 +2356,7 @@ PhysAddr, pAC->RxBufSize - 2, PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB(pRxd->pMBuf); + dev_kfree_skb(pRxd->pMBuf); pRxd->pMBuf = NULL; } pRxd->RBControl &= BMU_OWN; @@ -3866,7 +3856,7 @@ pFreeMbuf = pMbuf; do { pNextMbuf = pFreeMbuf->pNext; - DEV_KFREE_SKB_ANY(pFreeMbuf->pOs); + dev_kfree_skb_any(pFreeMbuf->pOs); pFreeMbuf = pNextMbuf; } while ( pFreeMbuf != NULL ); } /* SkDrvFreeRlmtMbuf */ @@ -4337,7 +4327,7 @@ if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW], pMsg) < 0) - DEV_KFREE_SKB_ANY(pMsg); + dev_kfree_skb_any(pMsg); break; case SK_DRV_TIMER: if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) { From shemminger@osdl.org Mon Nov 15 16:34:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:37 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0YC8J016191 for ; Mon, 15 Nov 2004 16:34:12 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XmPE027118 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:48 -0800 Date: Mon, 15 Nov 2004 15:46:46 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (18/25) sk98: lockless transmit Message-Id: <20041115154646.5697055a@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11881 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Sk transmit path has it's own locking so doesn't need locking in device queueing layer. Move net device initiailzation that was done twice (once for each port), to a common place. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:00:29 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:00:29 -08:00 @@ -1349,6 +1349,7 @@ * Returns: * 0 (NETDEV_TX_OK) if everything is ok * 1 (NETDEV_TX_BUSY) if ring is full + * -1(NETDEV_TX_LOCKED) lock collision */ int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { @@ -1363,7 +1364,12 @@ else pTxPort = &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW]; - spin_lock_irqsave(&pTxPort->TxDesRingLock, flags); + local_irq_save(flags); + if (!spin_trylock(&pTxPort->TxDesRingLock)) { + /* Collision - tell upper layer to requeue */ + local_irq_restore(flags); + return NETDEV_TX_LOCKED; + } if ((!skb_shinfo(skb)->nr_frags) || (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) @@ -4746,6 +4752,42 @@ #endif +static void __devinit SkGeNetDevInit(struct net_device *dev, + struct pci_dev *pdev, + const SK_AC *pAC) +{ + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); + SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); + + dev->open = SkGeOpen; + dev->stop = SkGeClose; + dev->hard_start_xmit = SkGeXmit; + dev->get_stats = SkGeStats; + dev->set_multicast_list = SkGeSetRxMode; + dev->set_mac_address = SkGeSetMacAddr; + dev->do_ioctl = SkGeIoctl; + dev->change_mtu = SkGeChangeMtu; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = SkGePollController; +#endif + dev->flags &= ~IFF_RUNNING; + dev->features |= NETIF_F_LLTX; + + if (pdev->dma_mask == DMA_64BIT_MASK) + dev->features |= NETIF_F_HIGHDMA; + + if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { +#ifdef SK_ZEROCOPY + dev->features |= NETIF_F_SG; +#endif +#ifdef USE_SK_TX_CHECKSUM + dev->features |= NETIF_F_IP_CSUM; +#endif + } +} + + static int __devinit skge_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -4792,38 +4834,14 @@ if (error) goto out_free_netdev; - SET_MODULE_OWNER(dev); - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; -#ifdef CONFIG_NET_POLL_CONTROLLER - dev->poll_controller = &SkGePollController; -#endif - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* Use only if yukon hardware */ - /* SK and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif - pAC->Index = boards_found++; error = SkGeBoardInit(dev, pAC); if (error) goto out_free_netdev; + SkGeNetDevInit(dev, pdev, pAC); + /* Register net device */ strcpy(dev->name, "eth%d"); error = register_netdev(dev); @@ -4866,26 +4884,7 @@ pNet->NetNr = 1; pNet->pAC = pAC; - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* SG and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif + SkGeNetDevInit(dev, pdev, pAC); if (register_netdev(dev)) { printk(KERN_WARNING "sk98lin: could not register device for second port.\n"); From shemminger@osdl.org Mon Nov 15 16:34:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:36 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0YBFb016187 for ; Mon, 15 Nov 2004 16:34:11 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XlPE027114 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:47 -0800 Date: Mon, 15 Nov 2004 15:34:08 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (12/25) sk98: device description can be a stack variable Message-Id: <20041115153408.11c45ee9@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11880 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Device name description is only used during the probe process so it doesn't have to be stored in board structure. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:33:22 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:33:22 -08:00 @@ -398,8 +398,6 @@ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ - char DeviceStr[80]; /* adapter string from vpd */ - SK_U32 AllocFlag; /* flag allocation of resources */ struct pci_dev *PciDev; /* for access to pci config space */ SK_U32 PciDevId; /* pci device id */ struct net_device *dev[2]; /* pointer to device struct */ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:33:22 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:33:22 -08:00 @@ -204,7 +204,6 @@ static struct net_device_stats *SkGeStats(struct net_device *dev); static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd); static void GetConfiguration(SK_AC*); -static void ProductStr(SK_AC*); static int XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*); static void FreeTxDescriptors(SK_AC*pAC, TX_PORT*); static void FillRxRing(SK_AC*, RX_PORT*); @@ -3792,25 +3791,14 @@ * * Returns: N/A */ -static void ProductStr( -SK_AC *pAC /* pointer to adapter context */ -) -{ -int StrLen = 80; /* length of the string, defined in SK_AC */ -char Keyword[] = VPD_NAME; /* vpd productname identifier */ -int ReturnCode; /* return code from vpd_read */ -unsigned long Flags; +static inline void ProductStr(SK_AC *pAC, char *buf, int len) +{ + unsigned long flags; - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, pAC->DeviceStr, - &StrLen); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - if (ReturnCode != 0) { - /* there was an error reading the vpd data */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR, - ("Error reading VPD data: %d\n", ReturnCode)); - pAC->DeviceStr[0] = '\0'; - } + spin_lock_irqsave(&pAC->SlowPathLock, flags); + if (VpdRead(pAC, pAC->IoBase, VPD_NAME, buf, &len)) + snprintf(buf, len, "Error reading VPD data\n"); + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); } /* ProductStr */ /***************************************************************************** @@ -4837,6 +4825,7 @@ struct net_device *dev = NULL; static int boards_found = 0; int error = -ENODEV; + char DeviceStr[80]; if (pci_enable_device(pdev)) goto out; @@ -4916,8 +4905,8 @@ } /* Print adapter specific string from vpd */ - ProductStr(pAC); - printk("%s: %s\n", dev->name, pAC->DeviceStr); + ProductStr(pAC, DeviceStr, sizeof(DeviceStr)); + printk("%s: %s\n", dev->name, DeviceStr); /* Print configuration settings */ printk(" PrefPort:%c RlmtMode:%s\n", @@ -4979,7 +4968,7 @@ memcpy(&dev->dev_addr, &pAC->Addr.Net[1].CurrentMacAddress, 6); - printk("%s: %s\n", dev->name, pAC->DeviceStr); + printk("%s: %s\n", dev->name, DeviceStr); printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); } } From shemminger@osdl.org Mon Nov 15 16:34:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:34 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0XxWO016143 for ; Mon, 15 Nov 2004 16:33:59 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XYPE027066 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:34 -0800 Date: Mon, 15 Nov 2004 15:54:18 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (21/25) sk98: receive checksum settings via ethtool Message-Id: <20041115155418.76c2689d@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11879 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Allow controlling receive checksum offload with ethtool. Linux doesn't need the "portable" checksum offload code, just creating a CHECKSUM_HW skb does the right thing and is faster. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile --- a/drivers/net/sk98lin/Makefile 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/Makefile 2004-11-15 14:40:44 -08:00 @@ -26,8 +26,7 @@ skrlmt.o \ sktimer.o \ skvpd.o \ - skxmac2.o \ - skcsum.o + skxmac2.o ifdef CONFIG_PROC_FS sk98lin-objs += skproc.o @@ -81,7 +80,8 @@ # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources # SK_DBGCAT_DRV_EVENT 0x08000000 driver events -EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) +EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT \ + -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) clean: rm -f core *.o *.a *.s diff -Nru a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h --- a/drivers/net/sk98lin/h/skcsum.h 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/h/skcsum.h 2004-11-15 14:40:44 -08:00 @@ -155,11 +155,11 @@ * s_Csum - The CSUM module context structure. */ typedef struct s_Csum { +#ifdef SK_USE_CSUM /* Enabled receive SK_PROTO_XXX bit flags. */ unsigned ReceiveFlags[SK_MAX_NETS]; -#ifdef TX_CSUM unsigned TransmitFlags[SK_MAX_NETS]; -#endif /* TX_CSUM */ +#endif /* The protocol statistics structure; one per supported protocol. */ SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 14:40:44 -08:00 @@ -71,14 +71,6 @@ #include #include - -#define SK_CS_CALCULATE_CHECKSUM -#ifndef CONFIG_X86_64 -#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff) -#else -#define SkCsCalculateChecksum(p,l) ((~ip_fast_csum(p, l)) & 0xffff) -#endif - #include "h/sktypes.h" #include "h/skerror.h" #include "h/skdebug.h" diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 14:40:44 -08:00 @@ -213,6 +213,13 @@ #define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */ #define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */ +/* +** Hardware supports receive checksumming starting at two offsets +** Linux only uses the first one (skip ether header). +*/ +#define SK_CHECKSUM_OFFSET_1 ETH_HLEN +#define SK_CHECKSUM_OFFSET_2 (ETH_HLEN + 20) + /* TX and RX descriptors *****************************************************/ typedef struct s_RxD RXD; /* the receive descriptor */ @@ -316,6 +323,7 @@ int RxFillLimit; /* limit for buffers in ring */ SK_IOC HwAddr; /* bmu registers address */ int PortIndex; /* index number of port (0 or 1) */ + SK_BOOL UseRxCsum; /* use Rx checksumming (yes/no) */ }; /* Definitions needed for interrupt moderation *******************************/ @@ -420,10 +428,6 @@ /* the port structures with descriptor rings */ TX_PORT TxPort[SK_MAX_MACS][2]; RX_PORT RxPort[SK_MAX_MACS]; - - unsigned int CsOfs1; /* for checksum calculation */ - unsigned int CsOfs2; /* for checksum calculation */ - SK_U32 CsOfs; /* for checksum calculation */ SK_BOOL CheckQueue; /* check event queue soon */ SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ diff -Nru a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c --- a/drivers/net/sk98lin/skcsum.c 2004-11-15 14:40:44 -08:00 +++ /dev/null Wed Dec 31 16:00:00 196900 @@ -1,871 +0,0 @@ -/****************************************************************************** - * - * Name: skcsum.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 2003/08/20 13:55:53 $ - * Purpose: Store/verify Internet checksum in send/receive packets. - * - ******************************************************************************/ - -/****************************************************************************** - * - * (C)Copyright 1998-2003 SysKonnect GmbH. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -#ifdef SK_USE_CSUM /* Check if CSUM is to be used. */ - -#ifndef lint -static const char SysKonnectFileId[] = - "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect."; -#endif /* !lint */ - -/****************************************************************************** - * - * Description: - * - * This is the "GEnesis" common module "CSUM". - * - * This module contains the code necessary to calculate, store, and verify the - * Internet Checksum of IP, TCP, and UDP frames. - * - * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" - * and is the code name of this SysKonnect project. - * - * Compilation Options: - * - * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an - * empty module. - * - * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id - * definitions. In this case, all SKCS_PROTO_xxx definitions must be made - * external. - * - * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status - * definitions. In this case, all SKCS_STATUS_xxx definitions must be made - * external. - * - * Include File Hierarchy: - * - * "h/skdrv1st.h" - * "h/skcsum.h" - * "h/sktypes.h" - * "h/skqueue.h" - * "h/skdrv2nd.h" - * - ******************************************************************************/ - -#include "h/skdrv1st.h" -#include "h/skcsum.h" -#include "h/skdrv2nd.h" - -/* defines ********************************************************************/ - -/* The size of an Ethernet MAC header. */ -#define SKCS_ETHERNET_MAC_HEADER_SIZE (6+6+2) - -/* The size of the used topology's MAC header. */ -#define SKCS_MAC_HEADER_SIZE SKCS_ETHERNET_MAC_HEADER_SIZE - -/* The size of the IP header without any option fields. */ -#define SKCS_IP_HEADER_SIZE 20 - -/* - * Field offsets within the IP header. - */ - -/* "Internet Header Version" and "Length". */ -#define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH 0 - -/* "Total Length". */ -#define SKCS_OFS_IP_TOTAL_LENGTH 2 - -/* "Flags" "Fragment Offset". */ -#define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET 6 - -/* "Next Level Protocol" identifier. */ -#define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL 9 - -/* Source IP address. */ -#define SKCS_OFS_IP_SOURCE_ADDRESS 12 - -/* Destination IP address. */ -#define SKCS_OFS_IP_DESTINATION_ADDRESS 16 - - -/* - * Field offsets within the UDP header. - */ - -/* UDP checksum. */ -#define SKCS_OFS_UDP_CHECKSUM 6 - -/* IP "Next Level Protocol" identifiers (see RFC 790). */ -#define SKCS_PROTO_ID_TCP 6 /* Transport Control Protocol */ -#define SKCS_PROTO_ID_UDP 17 /* User Datagram Protocol */ - -/* IP "Don't Fragment" bit. */ -#define SKCS_IP_DONT_FRAGMENT SKCS_HTON16(0x4000) - -/* Add a byte offset to a pointer. */ -#define SKCS_IDX(pPtr, Ofs) ((void *) ((char *) (pPtr) + (Ofs))) - -/* - * Macros that convert host to network representation and vice versa, i.e. - * little/big endian conversion on little endian machines only. - */ -#ifdef SK_LITTLE_ENDIAN -#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8)) -#endif /* SK_LITTLE_ENDIAN */ -#ifdef SK_BIG_ENDIAN -#define SKCS_HTON16(Val16) (Val16) -#endif /* SK_BIG_ENDIAN */ -#define SKCS_NTOH16(Val16) SKCS_HTON16(Val16) - -/* typedefs *******************************************************************/ - -/* function prototypes ********************************************************/ - -/****************************************************************************** - * - * SkCsGetSendInfo - get checksum information for a send packet - * - * Description: - * Get all checksum information necessary to send a TCP or UDP packet. The - * function checks the IP header passed to it. If the high-level protocol - * is either TCP or UDP the pseudo header checksum is calculated and - * returned. - * - * The function returns the total length of the IP header (including any - * IP option fields), which is the same as the start offset of the IP data - * which in turn is the start offset of the TCP or UDP header. - * - * The function also returns the TCP or UDP pseudo header checksum, which - * should be used as the start value for the hardware checksum calculation. - * (Note that any actual pseudo header checksum can never calculate to - * zero.) - * - * Note: - * There is a bug in the GENESIS ASIC which may lead to wrong checksums. - * - * Arguments: - * pAc - A pointer to the adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the IP header *not* - * including any option fields, i.e. at least 20 bytes. - * - * Note: This pointer will be used to address 8-, 16-, and 32-bit - * variables with the respective alignment offsets relative to the pointer. - * Thus, the pointer should point to a 32-bit aligned address. If the - * target system cannot address 32-bit variables on non 32-bit aligned - * addresses, then the pointer *must* point to a 32-bit aligned address. - * - * pPacketInfo - A pointer to the packet information structure for this - * packet. Before calling this SkCsGetSendInfo(), the following field must - * be initialized: - * - * ProtocolFlags - Initialize with any combination of - * SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on - * the protocols specified here. Any protocol(s) not specified - * here will be ignored. - * - * Note: Only one checksum can be calculated in hardware. Thus, if - * SKCS_PROTO_IP is specified in the 'ProtocolFlags', - * SkCsGetSendInfo() must calculate the IP header checksum in - * software. It might be a better idea to have the calling - * protocol stack calculate the IP header checksum. - * - * Returns: N/A - * On return, the following fields in 'pPacketInfo' may or may not have - * been filled with information, depending on the protocol(s) found in the - * packet: - * - * ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s) - * that were both requested by the caller and actually found in the packet. - * Protocol(s) not specified by the caller and/or not found in the packet - * will have their respective SKCS_PROTO_XXX bit flags reset. - * - * Note: For IP fragments, TCP and UDP packet information is ignored. - * - * IpHeaderLength - The total length in bytes of the complete IP header - * including any option fields is returned here. This is the start offset - * of the IP data, i.e. the TCP or UDP header if present. - * - * IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the - * 16-bit Internet Checksum of the IP header is returned here. This value - * is to be stored into the packet's 'IP Header Checksum' field. - * - * PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP - * has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum - * of the TCP or UDP pseudo header is returned here. - */ -void SkCsGetSendInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -SKCS_PACKET_INFO *pPacketInfo, /* Packet information struct. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Bit field specifiying the desired/found protocols. */ - unsigned ProtocolFlags; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* TCP/UDP pseudo header checksum. */ - unsigned long PseudoHeaderChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - pPacketInfo->IpHeaderLength = IpHeaderLength; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* This is an IPv4 frame with a header of valid length. */ - - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++; - - /* Check if we should calculate the IP header checksum. */ - - ProtocolFlags = pPacketInfo->ProtocolFlags; - - if (ProtocolFlags & SKCS_PROTO_IP) { - pPacketInfo->IpHeaderChecksum = - SkCsCalculateChecksum(pIpHeader, IpHeaderLength); - } - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = - *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - return; - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - NextLevelProtoStats->TxUnableCts++; - return; - } - - /* - * Calculate the TCP/UDP pseudo header checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - /* Calculate the sum of all pseudo header fields (16-bit). */ - - PseudoHeaderChecksum = - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength); - - /* Add-in any carries. */ - - SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - pPacketInfo->ProtocolFlags = ProtocolFlags; - NextLevelProtoStats->TxOkCts++; /* Success. */ -} /* SkCsGetSendInfo */ - - -/****************************************************************************** - * - * SkCsGetReceiveInfo - verify checksum information for a received packet - * - * Description: - * Verify a received frame's checksum. The function returns a status code - * reflecting the result of the verification. - * - * Note: - * Before calling this function you have to verify that the frame is - * not padded and Checksum1 and Checksum2 are bigger than 1. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the length in bytes - * of the received IP header including any option fields. For UDP packets, - * 8 additional bytes are needed to access the UDP checksum. - * - * Note: The actual length of the IP header is stored in the lower four - * bits of the first octet of the IP header as the number of 4-byte words, - * so it must be multiplied by four to get the length in bytes. Thus, the - * maximum IP header length is 15 * 4 = 60 bytes. - * - * Checksum1 - The first 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Checksum2 - The second 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Returns: - * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. - * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. - * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. - * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame - * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). - * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). - * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). - * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). - * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. - * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. - * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. - * - * Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values - * returned here can be defined in some header file by the module using CSUM. - * In this way, the calling module can assign return values for its own needs, - * e.g. by assigning bit flags to the individual protocols. - */ -SKCS_STATUS SkCsGetReceiveInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -unsigned Checksum1, /* Hardware checksum 1. */ -unsigned Checksum2, /* Hardware checksum 2. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* IP header checksum. */ - unsigned IpHeaderChecksum; - - /* IP header options checksum, if any. */ - unsigned IpOptionsChecksum; - - /* IP data checksum, i.e. TCP/UDP checksum. */ - unsigned IpDataChecksum; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* The checksum of the "next level protocol", i.e. TCP or UDP. */ - unsigned long NextLevelProtocolChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++; - return (SKCS_STATUS_UNKNOWN_IP_VERSION); - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* This is an IPv4 frame with a header of valid length. */ - - /* Get the IP header and data checksum. */ - - IpDataChecksum = Checksum2; - - /* - * The IP header checksum is calculated as follows: - * - * IpHeaderChecksum = Checksum1 - Checksum2 - */ - - SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2); - - /* Check if any IP header options. */ - - if (IpHeaderLength > SKCS_IP_HEADER_SIZE) { - - /* Get the IP options checksum. */ - - IpOptionsChecksum = SkCsCalculateChecksum( - SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE), - IpHeaderLength - SKCS_IP_HEADER_SIZE); - - /* Adjust the IP header and IP data checksums. */ - - SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum); - - SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum); - } - - /* - * Check if the IP header checksum is ok. - * - * NOTE: We must check the IP header checksum even if the caller just wants - * us to check upper-layer checksums, because we cannot do any further - * processing of the packet without a valid IP checksum. - */ - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - if (IpHeaderChecksum != 0xffff) { - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - /* the NDIS tester wants to know the upper level protocol too */ - if (NextLevelProtocol == SKCS_PROTO_ID_TCP) { - return(SKCS_STATUS_IP_CSUM_ERROR_TCP); - } - else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) { - return(SKCS_STATUS_IP_CSUM_ERROR_UDP); - } - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - return (SKCS_STATUS_IP_CSUM_OK); - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - NextLevelProtoStats->RxUnableCts++; - return (SKCS_STATUS_IP_FRAGMENT); - } - - /* - * 08-May-2000 ra - * - * From RFC 768 (UDP) - * If the computed checksum is zero, it is transmitted as all ones (the - * equivalent in one's complement arithmetic). An all zero transmitted - * checksum value means that the transmitter generated no checksum (for - * debugging or for higher level protocols that don't care). - */ - - if (NextLevelProtocol == SKCS_PROTO_ID_UDP && - *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) { - - NextLevelProtoStats->RxOkCts++; - - return (SKCS_STATUS_IP_CSUM_OK_NO_UDP); - } - - /* - * Calculate the TCP/UDP checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - NextLevelProtocolChecksum = - - /* Calculate the pseudo header checksum. */ - - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength) + - - /* Add the TCP/UDP header checksum. */ - - (unsigned long) IpDataChecksum; - - /* Add-in any carries. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Check if the TCP/UDP checksum is ok. */ - - if ((unsigned) NextLevelProtocolChecksum == 0xffff) { - - /* TCP/UDP checksum ok. */ - - NextLevelProtoStats->RxOkCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK); - } - - /* TCP/UDP checksum error. */ - - NextLevelProtoStats->RxErrCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR); -} /* SkCsGetReceiveInfo */ - - -/****************************************************************************** - * - * SkCsSetReceiveFlags - set checksum receive flags - * - * Description: - * Use this function to set the various receive flags. According to the - * protocol flags set by the caller, the start offsets within received - * packets of the two hardware checksums are returned. These offsets must - * be stored in all receive descriptors. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols - * for which the caller wants checksum information on received frames. - * - * pChecksum1Offset - The start offset of the first receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * pChecksum2Offset - The start offset of the second receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * Returns: N/A - * Returns the two hardware checksum start offsets. - */ -void SkCsSetReceiveFlags( -SK_AC *pAc, /* Adapter context struct. */ -unsigned ReceiveFlags, /* New receive flags. */ -unsigned *pChecksum1Offset, /* Offset for hardware checksum 1. */ -unsigned *pChecksum2Offset, /* Offset for hardware checksum 2. */ -int NetNumber) -{ - /* Save the receive flags. */ - - pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags; - - /* First checksum start offset is the IP header. */ - *pChecksum1Offset = SKCS_MAC_HEADER_SIZE; - - /* - * Second checksum start offset is the IP data. Note that this may vary - * if there are any IP header options in the actual packet. - */ - *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE; -} /* SkCsSetReceiveFlags */ - -#ifndef SK_CS_CALCULATE_CHECKSUM - -/****************************************************************************** - * - * SkCsCalculateChecksum - calculate checksum for specified data - * - * Description: - * Calculate and return the 16-bit Internet Checksum for the specified - * data. - * - * Arguments: - * pData - Pointer to data for which the checksum shall be calculated. - * Note: The pointer should be aligned on a 16-bit boundary. - * - * Length - Length in bytes of data to checksum. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -unsigned SkCsCalculateChecksum( -void *pData, /* Data to checksum. */ -unsigned Length) /* Length of data. */ -{ - SK_U16 *pU16; /* Pointer to the data as 16-bit words. */ - unsigned long Checksum; /* Checksum; must be at least 32 bits. */ - - /* Sum up all 16-bit words. */ - - pU16 = (SK_U16 *) pData; - for (Checksum = 0; Length > 1; Length -= 2) { - Checksum += *pU16++; - } - - /* If this is an odd number of bytes, add-in the last byte. */ - - if (Length > 0) { -#ifdef SK_BIG_ENDIAN - /* Add the last byte as the high byte. */ - Checksum += ((unsigned) *(SK_U8 *) pU16) << 8; -#else /* !SK_BIG_ENDIAN */ - /* Add the last byte as the low byte. */ - Checksum += *(SK_U8 *) pU16; -#endif /* !SK_BIG_ENDIAN */ - } - - /* Add-in any carries. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Note: All bits beyond the 16-bit limit are now zero. */ - - return ((unsigned) Checksum); -} /* SkCsCalculateChecksum */ - -#endif /* SK_CS_CALCULATE_CHECKSUM */ - -/****************************************************************************** - * - * SkCsEvent - the CSUM event dispatcher - * - * Description: - * This is the event handler for the CSUM module. - * - * Arguments: - * pAc - Pointer to adapter context. - * - * Ioc - I/O context. - * - * Event - Event id. - * - * Param - Event dependent parameter. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -int SkCsEvent( -SK_AC *pAc, /* Pointer to adapter context. */ -SK_IOC Ioc, /* I/O context. */ -SK_U32 Event, /* Event id. */ -SK_EVPARA Param) /* Event dependent parameter. */ -{ - int ProtoIndex; - int NetNumber; - - switch (Event) { - /* - * Clear protocol statistics. - * - * Param - Protocol index, or -1 for all protocols. - * - Net number. - */ - case SK_CSUM_EVENT_CLEAR_PROTO_STATS: - - ProtoIndex = (int)Param.Para32[1]; - NetNumber = (int)Param.Para32[0]; - if (ProtoIndex < 0) { /* Clear for all protocols. */ - if (NetNumber >= 0) { - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber])); - } - } - else { /* Clear for individual protocol. */ - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex])); - } - break; - default: - break; - } - return (0); /* Success. */ -} /* SkCsEvent */ - -#endif /* SK_USE_CSUM */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-15 14:40:44 -08:00 @@ -488,6 +488,27 @@ return ethtool_op_set_tx_csum(dev, data); } +static u32 sk98_get_rx_csum(struct net_device *dev) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + return pAC->RxPort[pNet->PortNr].UseRxCsum; +} + +static int sk98_set_rx_csum(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (data && + !(pAC->GIni.GIChipId == CHIP_ID_GENESIS || pAC->ChipsetType)) + return -EOPNOTSUPP; + + pAC->RxPort[pNet->PortNr].UseRxCsum = data; + return 0; +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = sk98_get_settings, .set_settings = sk98_set_settings, @@ -503,4 +524,6 @@ .set_sg = sk98_set_sg, .get_tx_csum = ethtool_op_get_tx_csum, .set_tx_csum = sk98_set_tx_csum, + .get_rx_csum = sk98_get_rx_csum, + .set_rx_csum = sk98_set_rx_csum, }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:40:44 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:40:44 -08:00 @@ -535,11 +535,6 @@ goto out_free_irq; } - SkCsSetReceiveFlags(pAC, - SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP, - &pAC->CsOfs1, &pAC->CsOfs2, 0); - pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; - BoardInitMem(pAC); /* tschilling: New common function with minimum size check. */ if (SkGeInitAssignRamToQueues( pAC, @@ -757,7 +752,9 @@ /* set the pointers right */ pDescr->VNextRxd = VNextDescr & 0xffffffffULL; pDescr->pNextRxd = pNextDescr; - pDescr->TcpSumStarts = pAC->CsOfs; + pDescr->TcpSumStarts = SK_CHECKSUM_OFFSET_1 + | (SK_CHECKSUM_OFFSET_2 << 16); + /* advance one step */ pPrevDescr = pDescr; @@ -1927,7 +1924,6 @@ struct sk_buff *pMsg; /* pointer to message holding frame */ struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ int FrameLength; /* total length of received frame */ -int IpFrameLength; SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ SK_EVPARA EvPara; /* an event parameter union */ unsigned long Flags; /* for spin lock */ @@ -1940,10 +1936,6 @@ SK_BOOL IsBadFrame; /* Bad frame */ SK_U32 FrameStat; -unsigned short Csum1; -unsigned short Csum2; -unsigned short Type; -int Result; SK_U64 PhysAddr; rx_start: @@ -2101,67 +2093,13 @@ /* set length in message */ skb_put(pMsg, FrameLength); - /* hardware checksum */ - Type = ntohs(*((short*)&pMsg->data[12])); - -#ifdef USE_SK_RX_CHECKSUM - if (Type == 0x800) { - Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); - Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); - IpFrameLength = (int) ntohs((unsigned short) - ((unsigned short *) pMsg->data)[8]); - - /* - * Test: If frame is padded, a check is not possible! - * Frame not padded? Length difference must be 14 (0xe)! - */ - if ((FrameLength - IpFrameLength) != 0xe) { - /* Frame padded => TCP offload not possible! */ - pMsg->ip_summed = CHECKSUM_NONE; - } else { - /* Frame not padded => TCP offload! */ - if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || - (pAC->ChipsetType)) { - Result = SkCsGetReceiveInfo(pAC, - &pMsg->data[14], - Csum1, Csum2, pRxPort->PortIndex); - if (Result == - SKCS_STATUS_IP_FRAGMENT || - Result == - SKCS_STATUS_IP_CSUM_OK || - Result == - SKCS_STATUS_TCP_CSUM_OK || - Result == - SKCS_STATUS_UDP_CSUM_OK) { - pMsg->ip_summed = - CHECKSUM_UNNECESSARY; - } - else if (Result == - SKCS_STATUS_TCP_CSUM_ERROR || - Result == - SKCS_STATUS_UDP_CSUM_ERROR || - Result == - SKCS_STATUS_IP_CSUM_ERROR_UDP || - Result == - SKCS_STATUS_IP_CSUM_ERROR_TCP || - Result == - SKCS_STATUS_IP_CSUM_ERROR ) { - /* HW Checksum error */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, - ("skge: CRC error. Frame dropped!\n")); - goto rx_failed; - } else { - pMsg->ip_summed = - CHECKSUM_NONE; - } - }/* checksumControl calculation valid */ - } /* Frame length check */ - } /* IP frame */ -#else - pMsg->ip_summed = CHECKSUM_NONE; -#endif + pMsg->ip_summed = CHECKSUM_NONE; /* initial default */ + + /* Use hardware checksum of complete packet */ + if (pRxPort->UseRxCsum) { + pMsg->csum = le16_to_cpu(pRxd->TcpSums & 0xffff); + pMsg->ip_summed = CHECKSUM_HW; + } } /* frame > SK_COPY_TRESHOLD */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); @@ -4187,9 +4125,10 @@ else printk(" tx-checksum: disabled\n"); -#ifndef USE_SK_RX_CHECKSUM + if (pAC->RxPort[FromPort].UseRxCsum) + printk(" rx-checksum: enabled\n"); + else printk(" rx-checksum: disabled\n"); -#endif } else { DoPrintInterfaceChange = SK_TRUE; @@ -4904,6 +4843,11 @@ /* Set driver globals */ memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); + +#ifdef USE_SK_RX_CHECKSUM + pAC->RxPort[0].UseRxCsum = SK_TRUE; + pAC->RxPort[1].UseRxCsum = SK_TRUE; +#endif pci_set_drvdata(pdev, dev); return 0; From shemminger@osdl.org Mon Nov 15 16:34:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:37 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0Y93B016177 for ; Mon, 15 Nov 2004 16:34:09 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XjPE027105 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:45 -0800 Date: Mon, 15 Nov 2004 15:30:35 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (11/25) sk98: correct return value from change mtu Message-Id: <20041115153035.4026f076@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11882 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Get rid of bogus comment in change mtu function and return the correct status. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:29:11 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:29:11 -08:00 @@ -2791,20 +2791,7 @@ SkEventDispatcher(pAC, pAC->IoBase); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - /* - ** While testing this driver with latest kernel 2.5 (2.5.70), it - ** seems as if upper layers have a problem to handle a successful - ** return value of '0'. If such a zero is returned, the complete - ** system hangs for several minutes (!), which is in acceptable. - ** - ** Currently it is not clear, what the exact reason for this problem - ** is. The implemented workaround for 2.5 is to return the desired - ** new MTU size if all needed changes for the new MTU size where - ** performed. In kernels 2.2 and 2.4, a zero value is returned, - ** which indicates the successful change of the mtu-size. - */ - return NewMtu; - + return 0; } /* SkGeChangeMtu */ From shemminger@osdl.org Mon Nov 15 16:34:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:39 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0YA0H016182 for ; Mon, 15 Nov 2004 16:34:10 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XkPE027110 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:46 -0800 Date: Mon, 15 Nov 2004 15:44:59 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (17/25) sk98: use jiffies not gettimeofday Message-Id: <20041115154459.19ca5d11@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11884 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Don't use gettimeofday to get clock information. get_jiffies_64 is faster. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 13:49:56 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 13:49:56 -08:00 @@ -91,9 +91,6 @@ #define SK_BIG_ENDIAN #endif -/* we use gethrtime(), return unit: nanoseconds */ -#define SK_TICKS_PER_SEC 100 - #define SK_MEM_MAPPED_IO // #define SK_RLMT_SLOW_LOOKAHEAD diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:49:56 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:49:56 -08:00 @@ -56,7 +56,6 @@ extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); -extern SK_U64 SkOsGetTime(SK_AC*); extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*); extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*); extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*); @@ -96,25 +95,28 @@ }; -/* - * Time macros - */ -#if SK_TICKS_PER_SEC == 100 -#define SK_PNMI_HUNDREDS_SEC(t) (t) +/* Units used for timing measurements. */ +#define SK_TICKS_PER_SEC HZ + +/* OS time value in HZ (1000 or 100) */ +static inline SK_U64 SkOsGetTime(const SK_AC *pAC) +{ + return get_jiffies_64(); +} + +/* Convert OS time units to hundredth's of sec */ +static inline SK_U64 jiffies_64_to_hsecs(u64 t) +{ +#if (HZ % 100) == 0 + do_div(t, HZ / 100); #else -#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t) * 100) / \ - (SK_TICKS_PER_SEC)) + t *= 100; + do_div(x, HZ); #endif - -/* - * New SkOsGetTime - */ -#define SkOsGetTimeCurrent(pAC, pUsec) {\ - struct timeval t;\ - do_gettimeofday(&t);\ - *pUsec = ((((t.tv_sec) * 1000000L)+t.tv_usec)/10000);\ + return t; } +#define SK_PNMI_HUNDREDS_SEC(t) jiffies_64_to_hsecs(t) /* * ioctl definitions diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:49:56 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:49:56 -08:00 @@ -3864,26 +3864,6 @@ /***************************************************************************** * - * SkOsGetTime - provide a time value - * - * Description: - * This routine provides a time value. The unit is 1/HZ (defined by Linux). - * It is not used for absolute time, but only for time differences. - * - * - * Returns: - * Time value - */ -SK_U64 SkOsGetTime(SK_AC *pAC) -{ - SK_U64 PrivateJiffies; - SkOsGetTimeCurrent(pAC, &PrivateJiffies); - return PrivateJiffies; -} /* SkOsGetTime */ - - -/***************************************************************************** - * * SkPciReadCfgDWord - read a 32 bit value from pci config space * * Description: From shemminger@osdl.org Mon Nov 15 16:34:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:40 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0YDdP016195 for ; Mon, 15 Nov 2004 16:34:13 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XnPE027122 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:50 -0800 Date: Mon, 15 Nov 2004 15:35:18 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (13/25) sk98: pci device id not used. Message-Id: <20041115153518.0ba1ab67@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11886 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev PCI device id is saved but never used. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:34:33 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 13:34:33 -08:00 @@ -399,7 +399,6 @@ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ struct pci_dev *PciDev; /* for access to pci config space */ - SK_U32 PciDevId; /* pci device id */ struct net_device *dev[2]; /* pointer to device struct */ int RxBufSize; /* length of receive buffers */ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 13:34:33 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 13:34:33 -08:00 @@ -4853,7 +4853,6 @@ memset(pNet->pAC, 0, sizeof(SK_AC)); pAC = pNet->pAC; pAC->PciDev = pdev; - pAC->PciDevId = pdev->device; pAC->dev[0] = dev; pAC->dev[1] = dev; strcpy(dev->name, pci_name(pdev)); From shemminger@osdl.org Mon Nov 15 16:34:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:34:38 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0YE4w016200 for ; Mon, 15 Nov 2004 16:34:14 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAG0XoPE027126 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 15 Nov 2004 16:33:51 -0800 Date: Mon, 15 Nov 2004 15:48:25 -0800 From: Stephen Hemminger To: Jeff Garzik , Mirko Lindner Cc: netdev@oss.sgi.com Subject: [PATCH] (19/25) sk98: update pci id table Message-Id: <20041115154825.2d5c975d@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11883 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Update pci device id table to values from newer SysKonnect version of the driver and use PCI id define's if available. Add module pci alias. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-15 14:07:37 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-15 14:07:37 -08:00 @@ -4974,23 +4974,45 @@ pci_set_drvdata(pdev, NULL); } -static struct pci_device_id skge_pci_tbl[] = { - { PCI_VENDOR_ID_3COM, 0x1700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, +static struct pci_device_id skge_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C940B, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_SYSKONNECT, 0x9E00, /* SK-9Exx 10/100/1000Base-T Adapter */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4320, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, #if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */ - { PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_MARVELL, 0x4350, /* Fast Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4351, /* Fast Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4360, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4361, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_MARVELL, 0x4362, /* Gigabit Ethernet Controller */ + PCI_ANY_ID, PCI_ANY_ID }, #endif - { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { 0, } + { PCI_VENDOR_ID_MARVELL, 0x5005, /* Marvell (11ab), Belkin */ + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1032, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LINKSYS, PCI_DEVICE_ID_LINKSYS_EG1064, + PCI_ANY_ID, PCI_ANY_ID }, + { 0 } }; + +MODULE_DEVICE_TABLE(pci, skge_pci_tbl); static struct pci_driver skge_driver = { .name = "skge", From jgarzik@pobox.com Mon Nov 15 16:39:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:39:35 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0dUul021321 for ; Mon, 15 Nov 2004 16:39:30 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CTrNG-00043C-Pf; Tue, 16 Nov 2004 00:39:10 +0000 Message-ID: <41994C20.1050201@pobox.com> Date: Mon, 15 Nov 2004 19:38:56 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: ravinandan.arakali@s2io.com CC: raghavendra.koushik@s2io.com, romieu@fr.zoreil.com, netdev@oss.sgi.com, leonid.grossman@s2io.com Subject: Re: [PATCH 2.6.9-rc2 12/12] S2io: styling References: <001601c4cb6d$fa341e90$9810100a@S2IOtech.com> In-Reply-To: <001601c4cb6d$fa341e90$9810100a@S2IOtech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11887 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Ravinandan Arakali wrote: > Jeff, > You have not missed any of the patches. > I guess the changes will appear in a future release since I don't > see it yet in 2.6.10rc2. > We will send one more patch to address Krishna Kumar's comments. Correct, the patches came too late for 2.6.10, but will go upstream as soon as it is released. Jeff From khc@pm.waw.pl Mon Nov 15 16:45:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 16:45:14 -0800 (PST) Received: from inx.pm.waw.pl (postfix@inx.pm.waw.pl [195.116.170.20]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG0j7lX021800 for ; Mon, 15 Nov 2004 16:45:08 -0800 Received: from defiant.pm.waw.pl (cmb190.neoplus.adsl.tpnet.pl [83.31.129.190]) by inx.pm.waw.pl (Postfix) with ESMTP id 2D07DDF92; Tue, 16 Nov 2004 01:47:18 +0100 (CET) Received: by defiant.pm.waw.pl (Postfix, from userid 500) id 27EDD4E9D5; Tue, 16 Nov 2004 01:42:45 +0100 (CET) To: Ferenci Daniel Cc: eis@baty.hanse.de, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: hdlc bridge References: <4198B949.40504@siemens.com> From: Krzysztof Halasa Date: Tue, 16 Nov 2004 01:42:44 +0100 In-Reply-To: <4198B949.40504@siemens.com> (Ferenci Daniel's message of "Mon, 15 Nov 2004 15:12:25 +0100") Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 11888 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: khc@pm.waw.pl Precedence: bulk X-list: netdev Hi, BTW: I would appreciate being Cc:'ied while discussing generic HDLC things, especially the ones which are aimed at the official kernels. Thanks. Added netdev, too. Ferenci Daniel writes: > HDLC bridge is kind of a stack for hdlc bridging. > It can be usefull for sniffing hdlc traffic (within two hdlc interface). Right. Of course, given the isolated nature of such bridge, it can be implemented in either kernel-space or user-space. > sethdlc hdlc0 hdlc-bridge > sethdlc hdlc1 hdlc-bridge You should be able to use more than one bridge I think - the syntax should allow this. Something like: sethdlc hdlc0 hdlc sethdlc hdlc1 add-to-bridge hdlc0 or sethdlc create-hdlc-bridge hdlcbr0 sethdlc hdlc0 add-to-bridge hdlcbr0 sethdlc hdlc1 add-to-bridge hdlcbr0 would probably be better. > +++ linux-2.4.25.intel/include/net/hdlcbridge.h Sat Nov 13 08:21:12 2004 First, I would do all works against 2.6 kernel. You may want to check with Marcelo, Jeff and/or David, but I wouldn't expect them to apply such patches to 2.4 when 2.6 doesn't have them. I wouldn't do that either. > +typedef enum { > + PHYS_OK, > + PHYS_NOK > +} STAT; I don't think such bridge has anything to do with anything "physical". I would rather change "PHYS" into something related to the actual nature of underlying device (which could be virtual, a tunnel, or anything). > +++ linux-2.4.25.intel/net/Config.in Sat Nov 13 08:22:39 2004 > @@ -1,6 +1,8 @@ > # > # Network configuration > # > +# 12.11.2004 Daniel Ferenci added parts for hdlcbridge > + > mainmenu_option next_comment > comment 'Networking options' > tristate 'Packet socket' CONFIG_PACKET > @@ -9,6 +11,9 @@ > fi > tristate 'Netlink device emulation' CONFIG_NETLINK_DEV > +tristate 'Netlink sockets' CONFIG_NETLINK > + I sense something not related to HDLC bridging here. > +++ linux-2.4.25.intel/net/hdlcbridge/hdlc_bridge.c Sat Nov 13 ... > +int phys_bridge_data_received(hdlc_device *hdlc, struct sk_buff *skb) I think it should be run directly in/from hdlc->netif_rx(). Possibly using *_type_trans() etc. Not sure why it has to be that complicated - one more file in drivers/wan would be enough, wouldn't it? > +++ linux-2.4.25.intel/drivers/net/wan/hdlc_bridge.c Sat Nov 13 Exactly such a file. > +static void bridge_rx(struct sk_buff *skb) > +{ > + hdlc_device *hdlc = dev_to_hdlc(skb->dev); > + + printk(KERN_ERR "bridge_rx device: %s", skb->dev->name); > + > + if (phys_bridge_data_received(hdlc, skb) == PHYS_OK) > + return; > + hdlc->stats.rx_errors++; > + dev_kfree_skb_any(skb); > +} bridge_rx() should IMHO just send the frame to the other end, if of course possible (device up etc). This module would better know both ends, right? > +++ linux-2.4.25.intel/drivers/net/wan/hdlc_generic.c Sat Oct 30 > + case IF_PROTO_LAPB: return hdlc_x25_ioctl(hdlc, ifr); Something extra I'd say. > +#include Same here. > +#define IF_GET_ST3 0x0003 Hmm... Not sure. > +#define IF_PROTO_HDLC_BRIDGE 0x200C /* hdlc bridge stack */ This one is probably fine, but not sure about the following two: > +#define IF_PROTO_HDLC_SEND 0x200D /* hdlc bridge stack */ > +#define IF_PROTO_LAPB 0x200E /* lapb stack */ > - > + struct lapb_parms_struct *lapb_stuff; Same here. > + st3_status *st3; > + + buffer *data; > +obj-$(CONFIG_TAHOE9XX) += tahoe9xx.o > +obj-$(CONFIG_X25TAP) += x25tap.o > + Hmm... -- Krzysztof Halasa From acme@conectiva.com.br Mon Nov 15 17:31:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 17:32:04 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG1VwCp023192 for ; Mon, 15 Nov 2004 17:31:58 -0800 Received: from [200.140.204.103] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CTsDJ-0008Mq-00; Mon, 15 Nov 2004 23:32:57 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id B611A1463E; Mon, 15 Nov 2004 23:31:27 -0200 (BRST) Message-ID: <41994A9A.5020308@conectiva.com.br> Date: Mon, 15 Nov 2004 22:32:26 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH][NET] Assign inet transport sockets to the right module References: <41984A76.70406@conectiva.com.br> <20041115151408.2aad7c55.davem@davemloft.net> In-Reply-To: <20041115151408.2aad7c55.davem@davemloft.net> Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11889 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev David S. Miller wrote: > On Mon, 15 Nov 2004 04:19:34 -0200 > Arnaldo Carvalho de Melo wrote: > > >>Hi David, >> >> Please take a look if it makes sense, if so please pull from: >> >>bk://kernel.bkbits.net/acme/sock-2.6 > > > Ok, but deferred to 2.6.11 Not a problem, I have lots of other patches, I submitted this one just because it was more like a fix than a cleanup :-) - Arnaldo From 7.e.Q@syncro-community.de Mon Nov 15 23:45:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 15 Nov 2004 23:45:23 -0800 (PST) Received: from mail.hostunreachable.de (knserv.hostunreachable.de [212.72.163.70]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG7jI5b031708 for ; Mon, 15 Nov 2004 23:45:18 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.hostunreachable.de (Postfix) with ESMTP id 2CCAE61DD6 for ; Tue, 16 Nov 2004 08:44:59 +0100 (CET) Received: from mail.hostunreachable.de ([127.0.0.1]) by localhost (knserv [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 14825-06 for ; Tue, 16 Nov 2004 08:44:54 +0100 (CET) Received: from [127.0.0.1] (d084084.adsl.hansenet.de [80.171.84.84]) by mail.hostunreachable.de (Postfix) with ESMTP id E885361DD3 for ; Tue, 16 Nov 2004 08:44:53 +0100 (CET) Message-ID: <4199AFF4.60407@syncro-community.de> Date: Tue, 16 Nov 2004 08:44:52 +0100 From: Hendrik Wiese <7.e.Q@syncro-community.de> User-Agent: Mozilla Thunderbird 0.9 (Windows/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: VME IP Driver Development - some questions Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hostunreachable.de X-archive-position: 11890 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: 7.e.Q@syncro-community.de Precedence: bulk X-list: netdev Hello, I have got some questions about driver development on Linux 2.6: Is there somebody who can explain, what is meant with wait_event and wake_up? Does it mean, when I run "ifconfig", and the driver says "wait_event", is "ifconfig" blocked until my driver which is continuing his work says "wake_up"? Have I explained this correctly? If I give wait_event a condition, is it right that the driver continues its work and ifconfig is blocked until the driver does something that sets this condition true? Something else: we need a driver, which establishes an IP layer on top of the VME bus to transfer data via a network device (called dpn). On the other side this driver must be able to communicate with passive modules inside the vme-rack by polling their shared memory for data. Is it possible to create two kernel modules which run with the same hardware? One module for the communication with the active VME modules via IP and another one for the communication with the passive VME modules by polling their shared memory? Many questions, I know. But I am an absolute newbie in driver development. And I hope you can help me. If somebody knows a source of informations regarding this topic, which is held in german, please tell me. Thanks a lot kind regards Hendrik (Germany) From SRS0+a30656c8bc9681ad9c8b+450+infradead.org+hch@phoenix.srs.infradead.org Tue Nov 16 00:23:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 00:23:31 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG8NIwi006856 for ; Tue, 16 Nov 2004 00:23:19 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CTyc2-0006Kn-HE; Tue, 16 Nov 2004 08:22:54 +0000 Date: Tue, 16 Nov 2004 08:22:54 +0000 From: Christoph Hellwig To: Stephen Hemminger Cc: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (4/25) sk98: change #define to typedef Message-ID: <20041116082254.GA24321@infradead.org> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> <20041115152203.24adb0ea@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041115152203.24adb0ea@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11891 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Mon, Nov 15, 2004 at 03:22:03PM -0800, Stephen Hemminger wrote: > Change #define of to a typedef. > > Signed-off-by: Stephen Hemminger > > diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h > --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:28 -08:00 > +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-15 11:22:28 -08:00 > @@ -106,7 +106,7 @@ > #define SK_MAX_MACS 2 > #define SK_MAX_NETS 2 > > -#define SK_IOC char __iomem * > +typedef void __iomem *SK_IOC; Why do you need the typedef at all? Just about every driver on the planet is fine with a single void *__iomem iobase; in the per-device structure From SRS0+a30656c8bc9681ad9c8b+450+infradead.org+hch@phoenix.srs.infradead.org Tue Nov 16 00:24:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 00:24:23 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG8OCWp007127 for ; Tue, 16 Nov 2004 00:24:12 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CTycw-0006L5-7b; Tue, 16 Nov 2004 08:23:50 +0000 Date: Tue, 16 Nov 2004 08:23:50 +0000 From: Christoph Hellwig To: Stephen Hemminger Cc: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (5/25) sk98: elimnate nested macro. Message-ID: <20041116082350.GB24321@infradead.org> References: <20041115150910.0f3b8498@zqx3.pdx.osdl.net> <20041115152208.6684c483@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041115152208.6684c483@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11892 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Mon, Nov 15, 2004 at 03:22:08PM -0800, Stephen Hemminger wrote: > Replace nested macros to handle defining 64bit constants with > simpler macro. Would prefer to just remove it but it gets used in multiple > OS common code. I don't think the driver is complex enough for all that os-common mess. If you look at the BSD sk driver it's about a third of the size of the Linux driver because it doesn't have all this mess. From hch@lst.de Tue Nov 16 00:35:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 00:35:50 -0800 (PST) Received: from mail.lst.de (verein.lst.de [213.95.11.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG8ZfiW008794 for ; Tue, 16 Nov 2004 00:35:45 -0800 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAG8ZMla002381 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 16 Nov 2004 09:35:22 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id iAG8ZMGD002379; Tue, 16 Nov 2004 09:35:22 +0100 Date: Tue, 16 Nov 2004 09:35:22 +0100 From: Christoph Hellwig To: paulus@samba.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove bogus exports in ppp Message-ID: <20041116083522.GA2356@lst.de> References: <20041024132504.GC19927@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041024132504.GC19927@lst.de> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 11893 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev On Sun, Oct 24, 2004 at 03:25:04PM +0200, Christoph Hellwig wrote: > even if they are usefull for debugging they're just bad namespace > pollution for mainline ping? --- 1.50/drivers/net/ppp_generic.c 2004-08-29 07:49:19 +02:00 +++ edited/drivers/net/ppp_generic.c 2004-10-23 14:08:17 +02:00 @@ -2721,8 +2721,6 @@ EXPORT_SYMBOL(ppp_output_wakeup); EXPORT_SYMBOL(ppp_register_compressor); EXPORT_SYMBOL(ppp_unregister_compressor); -EXPORT_SYMBOL(all_ppp_units); /* for debugging */ -EXPORT_SYMBOL(all_channels); /* for debugging */ MODULE_LICENSE("GPL"); MODULE_ALIAS_CHARDEV_MAJOR(PPP_MAJOR); MODULE_ALIAS("/dev/ppp"); From chrisw@osdl.org Tue Nov 16 00:42:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 00:42:09 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAG8g2dd009743 for ; Tue, 16 Nov 2004 00:42:02 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAG8fQ901644; Tue, 16 Nov 2004 00:41:26 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAG8fPj11341; Tue, 16 Nov 2004 00:41:25 -0800 Date: Tue, 16 Nov 2004 00:41:25 -0800 From: Chris Wright To: Stephen Smalley Cc: Ross Kendall Axe , netdev@oss.sgi.com, lkml , jmorris@redhat.com Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041116004122.V14339@build.pdx.osdl.net> References: <4197A037.1020307@blueyonder.co.uk> <1100525477.31773.38.camel@moss-spartans.epoch.ncsc.mil> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <1100525477.31773.38.camel@moss-spartans.epoch.ncsc.mil>; from sds@epoch.ncsc.mil on Mon, Nov 15, 2004 at 08:31:17AM -0500 X-archive-position: 11894 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * Stephen Smalley (sds@epoch.ncsc.mil) wrote: > On Sun, 2004-11-14 at 13:13, Ross Kendall Axe wrote: > > With CONFIG_SECURITY_NETWORK=y and CONFIG_SECURITY_SELINUX=y, using > > SOCK_SEQPACKET unix domain sockets causes an oops in the superfluous(?) > > call to security_unix_may_send in sock_dgram_sendmsg. This patch avoids > > making this call for SOCK_SEQPACKET sockets. > > I'd prefer to track down the actual issue in the SELinux code and > correct it than just omit the security hook call entirely. Do you have > the Oops output and a trivial test case? Thanks. Well, there is one simple case that will trigger the Oops. Send a SEQPACKET to a connected but not yet accepted socket. In this case other->sk_socket is still NULL, and SELinux will deref the NULL pointer in selinux_socket_may_send() when geting other_isec. There is already a check in unix_stream_connect, which is all that's used for normal unix stream sockets. But the seqpacket socket then uses unix_dgram_sendmsg, so triggers the may_send check as well. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From alchemyx@uznam.net.pl Tue Nov 16 02:16:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 02:16:39 -0800 (PST) Received: from mail.uznam.net.pl (postfix@gandalf.uznam.net.pl [195.135.236.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGAGXgT018806 for ; Tue, 16 Nov 2004 02:16:33 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.uznam.net.pl (Postfix) with ESMTP id 61F2412EFB; Tue, 16 Nov 2004 11:16:13 +0100 (CET) Received: from mail.uznam.net.pl ([195.135.236.2]) by localhost (gandalf.uznam.net.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 23434-10; Tue, 16 Nov 2004 11:16:12 +0100 (CET) Received: from [195.135.237.2] (cerber.uznam.net.pl [195.135.237.2]) by mail.uznam.net.pl (Postfix) with ESMTP id 8AFBB12EF7; Tue, 16 Nov 2004 11:16:12 +0100 (CET) Message-ID: <4199D369.8030708@uznam.net.pl> Date: Tue, 16 Nov 2004 11:16:09 +0100 From: =?ISO-8859-2?Q?Micha=B3_Margula?= User-Agent: Mozilla Thunderbird 0.8 (X11/20041104) X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Andrew Morton Cc: Bart De Schuymer , netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups References: <20041115122046.1413527e.akpm@osdl.org> <200411152146.02851.bdschuym@pandora.be> <20041115124843.4c3dd72f.akpm@osdl.org> In-Reply-To: <20041115124843.4c3dd72f.akpm@osdl.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at uznam.net.pl X-archive-position: 11895 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alchemyx@uznam.net.pl Precedence: bulk X-list: netdev Andrew Morton napisa(a): >>>The only weird thing I noticed is when I initalise my bridge, is something >>>about that it can't get speed of some interfaces (guessing it is about >>>e1000). I can't give you full error message at the moment, because those >>>have been rotated by logrotate. >>> >>> >>I don't know what that is about... >> >> > You can ignore error about problems with decoding speed on interface. Found source of that. It happens when one of my network cards has cable unplugged. In that case it gets weird numbers (same thing happens with ethtool). About main problem - it has been about 13 hours since changing rules to iptables and nothing happened. We need to wait until tomorrow, to be completly sure. -- Micha Margula, alchemyx@uznam.net.pl, http://alchemyx.uznam.net.pl/ "W yciu pikne s tylko chwile" [Ryszard Riedel] From paulus@ozlabs.org Tue Nov 16 03:45:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 03:45:54 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGBjkkA030875 for ; Tue, 16 Nov 2004 03:45:47 -0800 Received: by ozlabs.org (Postfix, from userid 1003) id 018F22BDB5; Tue, 16 Nov 2004 22:45:21 +1100 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16793.59487.473584.552366@cargo.ozlabs.ibm.com> Date: Tue, 16 Nov 2004 22:45:35 +1100 From: Paul Mackerras To: Christoph Hellwig Cc: netdev@oss.sgi.com Subject: Re: [PATCH] remove bogus exports in ppp In-Reply-To: <20041116083522.GA2356@lst.de> References: <20041024132504.GC19927@lst.de> <20041116083522.GA2356@lst.de> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 11896 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paulus@samba.org Precedence: bulk X-list: netdev Christoph Hellwig writes: > ping? > > --- 1.50/drivers/net/ppp_generic.c 2004-08-29 07:49:19 +02:00 > +++ edited/drivers/net/ppp_generic.c 2004-10-23 14:08:17 +02:00 > @@ -2721,8 +2721,6 @@ > EXPORT_SYMBOL(ppp_output_wakeup); > EXPORT_SYMBOL(ppp_register_compressor); > EXPORT_SYMBOL(ppp_unregister_compressor); > -EXPORT_SYMBOL(all_ppp_units); /* for debugging */ > -EXPORT_SYMBOL(all_channels); /* for debugging */ > MODULE_LICENSE("GPL"); > MODULE_ALIAS_CHARDEV_MAJOR(PPP_MAJOR); > MODULE_ALIAS("/dev/ppp"); Acked-by: Paul Mackerras From cmuser@shaggy.smf.ebay.com Tue Nov 16 03:57:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 03:57:48 -0800 (PST) Received: from smf-camp10.smf.ebay.com (smfcamppool10.emailebay.com [66.135.215.239]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGBvgs7032456 for ; Tue, 16 Nov 2004 03:57:43 -0800 Received: from shaggy.smf.ebay.com (fallback-camp.vip.smf.ebay.com [10.108.160.50]) by smf-camp10.smf.ebay.com (8.12.3/8.12.3) with ESMTP id iAGBvJ2f012049 for ; Tue, 16 Nov 2004 03:57:19 -0800 Received: (from cmuser@localhost) by shaggy.smf.ebay.com (8.11.6+Sun/8.11.6) id iAGBvJB19925; Tue, 16 Nov 2004 03:57:19 -0800 (PST) Date: Tue, 16 Nov 2004 03:57:19 -0800 (PST) From: Unexpected reply handler Message-Id: <200411161157.iAGBvJB19925@shaggy.smf.ebay.com> To: netdev@oss.sgi.com Subject: Re: Administration References: <200411161157.iAGBv4tn007357@mailhost4.sjc.ebay.com> In-Reply-To: <200411161157.iAGBv4tn007357@mailhost4.sjc.ebay.com> Precedence: junk X-Loop: reply@reply.ebay.com X-archive-position: 11897 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cmuser@shaggy.smf.ebay.com Precedence: bulk X-list: netdev Thank you for your response. Please don't reply to this message - it is an automated response and your reply will not be received. If you have a question for eBay Customer Support, please visit the following eBay Help page. This page will help you locate the answer to your question, or assist you in contacting us: http://pages.ebay.com/help/index.html If you would like to change your notification preferences, which determine what type of email you receive from eBay, please follow the steps below: 1. Click "My eBay" located at the top of all eBay pages. You may be asked to sign in. 2. Click the "eBay Preferences" link located under the "My Account" heading. 3. Click the "view/change" link to the right of "Notification Preferences." You may be asked to sign in once more. 4. On the "Change Your Notification Preferences" page, check the boxes to indicate the types of messages you'd like to receive from eBay. Then, uncheck the boxes to indicate the types of messages you don't want to receive from us. 5. Once you're done, be sure to click the "Save Changes" button at the top or bottom of the page. Again, thanks for writing eBay. -- From werner@almesberger.net Tue Nov 16 06:30:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 06:30:57 -0800 (PST) Received: from host.almesberger.net (almesberger.net [63.105.73.238]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGEUpxP018988 for ; Tue, 16 Nov 2004 06:30:51 -0800 Received: from almesberger.net (vpnwa-home [10.200.0.2]) by host.almesberger.net (8.12.8/8.9.3) with ESMTP id iAGEURL6017091 for ; Tue, 16 Nov 2004 06:30:30 -0800 Received: (from werner@localhost) by almesberger.net (8.11.6/8.11.6) id iAGEURR04064 for netdev@oss.sgi.com; Tue, 16 Nov 2004 11:30:27 -0300 Date: Tue, 16 Nov 2004 11:30:27 -0300 From: Werner Almesberger To: netdev@oss.sgi.com Subject: WLAN power saving: brain dump Message-ID: <20041116113027.A4026@almesberger.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 11898 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wa@almesberger.net Precedence: bulk X-list: netdev This is just a brain dump, so that the ideas are out in public. Some day, I might actually implement this, unless somebody else beats me to it :-) These reflections are my own. I made them while reading specifications of WLAN cards with growing horror. Looking at WLAN cards, they uniformly seem to have excessive power consumption even if just laying in wait. This is particularly annoying for devices with otherwise very low power consumption, such as PDAs. It would seem to me that the typical use of such a device would allow for completely powering down the WLAN card if not needed. In particular, all packets reaching a normal PDA are in response to some previous and comparably recent emission from that device. Furthermore, we generally have a fairly good idea of when we still want to send something, and, although to a lesser extent, when we're expecting incoming data. So actively powering down a WLAN card while idle could use the following inputs: - an indication of whether any socket has a non-empty send queue - the time since the last time all send queues were empty (we want to have a certain cool-off period, for various reasons, including connectionless activity like ARP or UDP) - an indication if whether any sockets have a read or a poll or select for reading pending (this is very unreliable, but may provide useful input with some appliations) - time since the last successful reception - an indication of whether any sockets have pending out-of-order data - a manual override All this should be keyed by interface. Things to consider: - the time and power it takes to bring a WLAN card back online - the time we regularly have to wait for something to happen even if we seem to be able, e.g. the delay between sending an HTTP GET and a response (if we can get hints from the Web client, no guessing is needed here) - the correlation between idle time and future idleness from the user There's probably more. For a proof of concept implementation, it should be sufficient to consider ARP, DNS, SSH/SCP, and HTTP(S). - Werner -- _________________________________________________________________________ / Werner Almesberger, Buenos Aires, Argentina wa@almesberger.net / /_http://www.almesberger.net/____________________________________________/ From mlindner@syskonnect.de Tue Nov 16 06:57:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 06:57:29 -0800 (PST) Received: from gatekeeper.syskonnect.de (gatekeeper.syskonnect.de [213.144.13.149]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGEvNQ0024621 for ; Tue, 16 Nov 2004 06:57:24 -0800 Received: from syskonnect.de (skd.de [10.9.15.1]) by gatekeeper.syskonnect.de (8.12.10/8.12.11) with ESMTP id iAGEv8cx017875; Tue, 16 Nov 2004 15:57:08 +0100 (MET) Received: from [10.9.1.171] (localhost [127.0.0.1]) by syskonnect.de (8.12.11/8.12.11) with ESMTP id iAGEuoXD024201; Tue, 16 Nov 2004 15:56:50 +0100 (MET) Message-ID: <419A231F.4020104@syskonnect.de> Date: Tue, 16 Nov 2004 15:56:15 +0000 From: Mirko Lindner User-Agent: Mozilla Thunderbird 0.8 (X11/20041021) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Christoph Hellwig , Stephen Hemminger CC: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com, Ralph Roesler Subject: Re: [PATCH] (4/25) sk98: change #define to typedef X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 11899 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mlindner@syskonnect.de Precedence: bulk X-list: netdev > I don't think the driver is complex enough for all that os-common mess. > If you look at the BSD sk driver it's about a third of the size of the > Linux driver because it doesn't have all this mess. Note that the kernel BSD sk driver was _not_ written by SysKonnect and only supports Genesis and Yukon1; linux supports Genesis (single and dual), Yukon1, Yukon Plus, Yukon EC, Yukon FE and Yukon2 (single and dual). The BSD sk driver supports substantially less functionality than the Linux driver. For example, there is no link failover capability in the sk driver; it has no power management; numerous chip changes and minor tweaks have not been added, since many problems have become apparent through our other supported platforms (some 15 operating systems) and have since been fixed in our common modules; sk has no wake-on-LAN and so on. The official SysKonnect BSD driver (yk) also uses the common modules and is not open source. However, the real point is that the Linux driver (as indeed _all_ of our drivers) shares common code with all our supported platforms and this necessarily introduces some overhead. But it isn't excessive, and the benefits _far_ outweigh the drawbacks, namely, that we have a very wide range of systems sharing common code and thus the probability of finding and fixing bugs is very substantially higher than if we wrote a dedicated driver for each platform. For instance the symbol SK_IOC mentioned in your mail: > -#define SK_IOC char __iomem * > +typedef void __iomem *SK_IOC; is used in a large number of OS independent driver files (e.g. skvpd.c). The -for instance- file skvpd.c used by our Linux driver is used at the same time without any changes by all our other drivers running on other operating systems (e.g. Solaris, Windows). This is the reason why we need to redefine this symbol to the Linux specific implementation (void __iomem). Mirko From shemminger@osdl.org Tue Nov 16 09:10:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 09:10:28 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGHALsW026469 for ; Tue, 16 Nov 2004 09:10:22 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAGH9rPE008192 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 16 Nov 2004 09:09:53 -0800 Date: Tue, 16 Nov 2004 09:12:51 -0800 From: Stephen Hemminger To: Mirko Lindner Cc: Christoph Hellwig , Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com, Ralph Roesler Subject: Re: [PATCH] (4/25) sk98: change #define to typedef Message-Id: <20041116091251.1c6bc765@zqx3.pdx.osdl.net> In-Reply-To: <419A231F.4020104@syskonnect.de> References: <419A231F.4020104@syskonnect.de> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11900 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Tue, 16 Nov 2004 15:56:15 +0000 Mirko Lindner wrote: > > I don't think the driver is complex enough for all that os-common mess. > > If you look at the BSD sk driver it's about a third of the size of the > > Linux driver because it doesn't have all this mess. > > Note that the kernel BSD sk driver was _not_ written by SysKonnect and > only supports Genesis and Yukon1; linux supports Genesis (single and > dual), Yukon1, Yukon Plus, Yukon EC, Yukon FE and Yukon2 (single and > dual). The BSD sk driver supports substantially less functionality than > the Linux driver. For example, there is no link failover capability in > the sk driver; it has no power management; numerous chip changes and > minor tweaks have not been added, since many problems have become > apparent through our other supported platforms (some 15 operating > systems) and have since been fixed in our common modules; sk has no > wake-on-LAN and so on. The official SysKonnect BSD driver (yk) also uses > the common modules and is not open source. > > However, the real point is that the Linux driver (as indeed _all_ of our > drivers) shares common code with all our supported platforms and this > necessarily introduces some overhead. But it isn't excessive, and the > benefits _far_ outweigh the drawbacks, namely, that we have a very wide > range of systems sharing common code and thus the probability of finding > and fixing bugs is very substantially higher than if we wrote a > dedicated driver for each platform. > > For instance the symbol SK_IOC mentioned in your mail: > > > -#define SK_IOC char __iomem * > > +typedef void __iomem *SK_IOC; > > is used in a large number of OS independent driver files (e.g. skvpd.c). > The -for instance- file skvpd.c used by our Linux driver is used > at the same time without any changes by all our other drivers running > on other operating systems (e.g. Solaris, Windows). > > This is the reason why we need to redefine this symbol to the Linux > specific implementation (void __iomem). I understand the benefits of a common driver, but there are costs too. First, it means the community can't really support or fix the common code only SysKonnect can. Also, there is functionality in the common part that really isn't necessary: * Vendor specific MIB support -- what tool could/does use that? * Board specific bridging support If the regular Linux infrastructure was used for these, then the driver would get additional kernel bridge filtering, common management and security fixes. My wish is that the common hardware layer could be used without dragging in all the MIB and bridging stuff. From sri@us.ibm.com Tue Nov 16 09:47:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 09:47:54 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGHlgNK003587 for ; Tue, 16 Nov 2004 09:47:49 -0800 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAGHlI7S829590 for ; Tue, 16 Nov 2004 12:47:18 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAGHlFMT192918 for ; Tue, 16 Nov 2004 10:47:15 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAGHlFMf007209 for ; Tue, 16 Nov 2004 10:47:15 -0700 Received: from w-sridhar.beaverton.ibm.com (w-sridhar.beaverton.ibm.com [9.47.18.19]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAGHlEIN007173; Tue, 16 Nov 2004 10:47:14 -0700 Date: Tue, 16 Nov 2004 09:47:14 -0800 (PST) From: Sridhar Samudrala X-X-Sender: sridhar@w-sridhar.beaverton.ibm.com To: davem@davemloft.net cc: netdev@oss.sgi.com Subject: Assertions when lowering tcp_tso_win_divisor Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11901 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev We are seeing following assertions when running specweb99 with tcp_tso_win_divisor lowered to 4, 2 or 1 on linux 2.6.9 based kernels. KERNEL: assertion (!sk->sk_forward_alloc) failed at net/core/stream.c (279) KERNEL: assertion (!sk->sk_forward_alloc) failed at net/ipv4/af_inet.c (152) looks like an issue with the accounting of sk_forward_alloc with non-default values of tcp_tso_win_divisor. Thanks Sridhar From davem@davemloft.net Tue Nov 16 11:03:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 11:03:12 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGJ3294013898 for ; Tue, 16 Nov 2004 11:03:02 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CU8Mt-0002mz-00; Tue, 16 Nov 2004 10:47:55 -0800 Date: Tue, 16 Nov 2004 10:47:55 -0800 From: "David S. Miller" To: Sridhar Samudrala Cc: netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor Message-Id: <20041116104755.32bdb7a7.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11902 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 16 Nov 2004 09:47:14 -0800 (PST) Sridhar Samudrala wrote: > We are seeing following assertions when running specweb99 with > tcp_tso_win_divisor lowered to 4, 2 or 1 on linux 2.6.9 based kernels. > > KERNEL: assertion (!sk->sk_forward_alloc) failed at net/core/stream.c (279) > KERNEL: assertion (!sk->sk_forward_alloc) failed at net/ipv4/af_inet.c (152) > > looks like an issue with the accounting of sk_forward_alloc with non-default > values of tcp_tso_win_divisor. The issue is if you change the value while there are still existing sockets which used a previous value at least once. Looks like we'll have to cache this inside of the per-socket structure to fix this bug, but realize that once I do that the new sysctl value will not apply to any existing TCP sockets and this will effect your testing. So for example, if the web server was started with one particular value of the sysctl, no matter how many times you change the sysctl after- wards, the old original sysctl value will be used for every web server connection made to the machine. From herbert@gondor.apana.org.au Tue Nov 16 12:40:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 12:40:40 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGKeQrJ019034 for ; Tue, 16 Nov 2004 12:40:27 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUA7E-00015M-00; Wed, 17 Nov 2004 07:39:52 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUA74-0002hr-00; Wed, 17 Nov 2004 07:39:42 +1100 From: Herbert Xu To: davem@davemloft.net (David S. Miller) Subject: Re: Assertions when lowering tcp_tso_win_divisor Cc: sri@us.ibm.com, netdev@oss.sgi.com Organization: Core In-Reply-To: <20041116104755.32bdb7a7.davem@davemloft.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 17 Nov 2004 07:39:42 +1100 X-archive-position: 11903 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev David S. Miller wrote: > >> KERNEL: assertion (!sk->sk_forward_alloc) failed at net/core/stream.c (279) >> KERNEL: assertion (!sk->sk_forward_alloc) failed at net/ipv4/af_inet.c (152) >> >> looks like an issue with the accounting of sk_forward_alloc with non-default >> values of tcp_tso_win_divisor. > > The issue is if you change the value while there are still existing > sockets which used a previous value at least once. Could you elaborate the code path that you've spotted that causes this when the divisor is changed? Perhaps we're not caching the MSS value everywhere where we should be? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Tue Nov 16 12:59:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 13:00:05 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGKxoYO019821 for ; Tue, 16 Nov 2004 12:59:52 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUAQ6-0001LU-00; Wed, 17 Nov 2004 07:59:22 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUAQ2-0002jT-00; Wed, 17 Nov 2004 07:59:18 +1100 From: Herbert Xu To: sri@us.ibm.com (Sridhar Samudrala) Subject: Re: Assertions when lowering tcp_tso_win_divisor Cc: davem@davemloft.net, netdev@oss.sgi.com Organization: Core In-Reply-To: X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 17 Nov 2004 07:59:18 +1100 X-archive-position: 11904 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Sridhar Samudrala wrote: > We are seeing following assertions when running specweb99 with > tcp_tso_win_divisor lowered to 4, 2 or 1 on linux 2.6.9 based kernels. 2.6.9 is known to have bugs in TCP book-keeping. Please try 2.6.10-rc2 instead. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From romieu@fr.zoreil.com Tue Nov 16 14:33:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 14:33:14 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGMX7hq021894 for ; Tue, 16 Nov 2004 14:33:09 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAGMUjvr016779; Tue, 16 Nov 2004 23:30:45 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAGMUeDt016778; Tue, 16 Nov 2004 23:30:40 +0100 Date: Tue, 16 Nov 2004 23:30:40 +0100 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc2-netdev1 1/4] r8169: missing netif_poll_enable and irq ack Message-ID: <20041116223040.GA16715@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11905 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev - (noticed by Jon D. Mason) rtl8169_wait_for_quiescence() needs to disable the NAPI processing but it has no reason to lock any part of the driver which would try to do the same at a later time. Let's reenable NAPI processing as soon as possible. - properly ack any aborted interruption: a reset of the device is not always enough. Signed-off-by: Francois Romieu diff -puN drivers/net/r8169.c~r8169-250 drivers/net/r8169.c --- linux-2.6.10-rc2-mm1.orig/drivers/net/r8169.c~r8169-250 2004-11-15 00:28:53.000000000 +0100 +++ linux-2.6.10-rc2-mm1/drivers/net/r8169.c 2004-11-16 22:32:23.000000000 +0100 @@ -1742,10 +1742,19 @@ static void rtl8169_schedule_work(struct static void rtl8169_wait_for_quiescence(struct net_device *dev) { + struct rtl8169_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + synchronize_irq(dev->irq); /* Wait for any pending NAPI task to complete */ netif_poll_disable(dev); + + RTL_W16(IntrMask, 0x0000); + + RTL_W16(IntrStatus, 0xffff); + + netif_poll_enable(dev); } static void rtl8169_reinit_task(void *_data) _ From romieu@fr.zoreil.com Tue Nov 16 14:37:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 14:37:13 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGMb7eg022265 for ; Tue, 16 Nov 2004 14:37:08 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAGMXWvr016851; Tue, 16 Nov 2004 23:33:32 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAGMXW8X016850; Tue, 16 Nov 2004 23:33:32 +0100 Date: Tue, 16 Nov 2004 23:33:32 +0100 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc2-netdev1 2/4] r8169: C made easy Message-ID: <20041116223332.GA16781@electric-eye.fr.zoreil.com> References: <20041116223040.GA16715@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041116223040.GA16715@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11906 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Back to C101 and code which gives the expected result. Signed-off-by: Francois Romieu diff -puN drivers/net/r8169.c~r8169-255 drivers/net/r8169.c --- linux-2.6.10-rc2-mm1.orig/drivers/net/r8169.c~r8169-255 2004-11-16 20:23:48.000000000 +0100 +++ linux-2.6.10-rc2-mm1/drivers/net/r8169.c 2004-11-16 22:26:14.000000000 +0100 @@ -1978,7 +1978,7 @@ static void rtl8169_pcierr_interrupt(str PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT)); /* The infamous DAC f*ckup only happens at boot time */ - if ((tp->cp_cmd & PCIDAC) && (tp->dirty_rx == tp->cur_rx == 0)) { + if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) { printk(KERN_INFO PFX "%s: disabling PCI DAC.\n", dev->name); tp->cp_cmd &= ~PCIDAC; RTL_W16(CPlusCmd, tp->cp_cmd); _ From romieu@fr.zoreil.com Tue Nov 16 14:37:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 14:37:14 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGMb79n022267 for ; Tue, 16 Nov 2004 14:37:08 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAGMa4vr016874; Tue, 16 Nov 2004 23:36:04 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAGMa4sm016873; Tue, 16 Nov 2004 23:36:04 +0100 Date: Tue, 16 Nov 2004 23:36:04 +0100 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc2-netdev1 4/4] r8169: reduce max MTU for large frames Message-ID: <20041116223604.GC16781@electric-eye.fr.zoreil.com> References: <20041116223040.GA16715@electric-eye.fr.zoreil.com> <20041116223332.GA16781@electric-eye.fr.zoreil.com> <20041116223439.GB16781@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041116223439.GB16781@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11907 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev The device does not support the whole mtu range it claims. Experimenting with the Tx threshold and/or the PCI burst size does not seem to improve the behavior. Signed-off-by: Francois Romieu diff -puN drivers/net/r8169.c~r8169-265 drivers/net/r8169.c --- linux-2.6.10-rc2-mm1.orig/drivers/net/r8169.c~r8169-265 2004-11-16 22:26:06.000000000 +0100 +++ linux-2.6.10-rc2-mm1/drivers/net/r8169.c 2004-11-16 22:26:06.000000000 +0100 @@ -112,7 +112,8 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC */ +#define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC... */ +#define SafeMtu 0x1964 /* ... actually life sucks beyond ~7k */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 @@ -1592,9 +1593,9 @@ static int rtl8169_change_mtu(struct net struct rtl8169_private *tp = netdev_priv(dev); int ret = 0; - if (new_mtu < ETH_ZLEN || new_mtu > RxPacketMaxSize) + if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu) return -EINVAL; - + dev->mtu = new_mtu; if (!netif_running(dev)) _ From romieu@fr.zoreil.com Tue Nov 16 14:37:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 14:37:16 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGMb7nm022266 for ; Tue, 16 Nov 2004 14:37:08 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAGMYdvr016861; Tue, 16 Nov 2004 23:34:39 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAGMYdat016860; Tue, 16 Nov 2004 23:34:39 +0100 Date: Tue, 16 Nov 2004 23:34:39 +0100 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc2-netdev1 3/4] r8169: Large Send enablement Message-ID: <20041116223439.GB16781@electric-eye.fr.zoreil.com> References: <20041116223040.GA16715@electric-eye.fr.zoreil.com> <20041116223332.GA16781@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041116223332.GA16781@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 11908 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Large Send enablement. Acked-by: Francois Romieu Signed-off-by: Jon Mason diff -puN drivers/net/r8169.c~r8169-260 drivers/net/r8169.c --- linux-2.6.10-rc2-mm1.orig/drivers/net/r8169.c~r8169-260 2004-11-16 21:12:34.000000000 +0100 +++ linux-2.6.10-rc2-mm1/drivers/net/r8169.c 2004-11-16 22:26:11.000000000 +0100 @@ -112,7 +112,7 @@ static int multicast_filter_limit = 32; #define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ #define EarlyTxThld 0x3F /* 0x3F means NO early transmit */ -#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */ +#define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define R8169_REGS_SIZE 256 @@ -426,6 +426,9 @@ static void rtl8169_tx_timeout(struct ne static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev); static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, void __iomem *); +static int rtl8169_change_mtu(struct net_device *netdev, int new_mtu); +static void rtl8169_down(struct net_device *dev); + #ifdef CONFIG_R8169_NAPI static int rtl8169_poll(struct net_device *dev, int *budget); #endif @@ -1237,8 +1240,6 @@ rtl8169_init_board(struct pci_dev *pdev, } tp->chipset = i; - tp->rx_buf_sz = RX_BUF_SIZE; - *ioaddr_out = ioaddr; *dev_out = dev; out: @@ -1320,6 +1321,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr; + dev->change_mtu = rtl8169_change_mtu; #ifdef CONFIG_R8169_NAPI dev->poll = rtl8169_poll; @@ -1448,13 +1450,22 @@ static int rtl8169_resume(struct pci_dev #endif /* CONFIG_PM */ -static int -rtl8169_open(struct net_device *dev) +static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, + struct net_device *dev) +{ + unsigned int mtu = dev->mtu; + + tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE; +} + +static int rtl8169_open(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); struct pci_dev *pdev = tp->pci_dev; int retval; + rtl8169_set_rxbufsize(tp, dev); + retval = request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev); if (retval < 0) @@ -1534,8 +1545,8 @@ rtl8169_hw_start(struct net_device *dev) RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(EarlyTxThres, EarlyTxThld); - // For gigabit rtl8169 - RTL_W16(RxMaxSize, RxPacketMaxSize); + // For gigabit rtl8169, MTU + header + CRC + VLAN + RTL_W16(RxMaxSize, tp->rx_buf_sz); // Set Rx Config register i = rtl8169_rx_config | @@ -1576,6 +1587,37 @@ rtl8169_hw_start(struct net_device *dev) netif_start_queue(dev); } +static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) +{ + struct rtl8169_private *tp = netdev_priv(dev); + int ret = 0; + + if (new_mtu < ETH_ZLEN || new_mtu > RxPacketMaxSize) + return -EINVAL; + + dev->mtu = new_mtu; + + if (!netif_running(dev)) + goto out; + + rtl8169_down(dev); + + rtl8169_set_rxbufsize(tp, dev); + + ret = rtl8169_init_ring(dev); + if (ret < 0) + goto out; + + rtl8169_hw_start(dev); + + netif_poll_enable(dev); + + rtl8169_request_timer(dev); + +out: + return ret; +} + static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { desc->addr = 0x0badbadbadbadbadull; @@ -2264,19 +2306,17 @@ static int rtl8169_poll(struct net_devic } #endif -static int -rtl8169_close(struct net_device *dev) +static void rtl8169_down(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); - struct pci_dev *pdev = tp->pci_dev; void __iomem *ioaddr = tp->mmio_addr; + rtl8169_delete_timer(dev); + netif_stop_queue(dev); flush_scheduled_work(); - rtl8169_delete_timer(dev); - spin_lock_irq(&tp->lock); /* Stop the chip's Tx and Rx DMA processes. */ @@ -2291,13 +2331,27 @@ rtl8169_close(struct net_device *dev) spin_unlock_irq(&tp->lock); - free_irq(dev->irq, dev); + synchronize_irq(dev->irq); netif_poll_disable(dev); + /* Give a racing hard_start_xmit a few cycles to complete. */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + rtl8169_tx_clear(tp); rtl8169_rx_clear(tp); +} + +static int rtl8169_close(struct net_device *dev) +{ + struct rtl8169_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + + rtl8169_down(dev); + + free_irq(dev->irq, dev); pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, tp->RxPhyAddr); _ From tmarshall@real.com Tue Nov 16 15:24:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 15:24:58 -0800 (PST) Received: from flawless.real.com (flawless.real.com [207.188.23.141]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAGNOssJ024046 for ; Tue, 16 Nov 2004 15:24:55 -0800 Received: from hashi ([::ffff:172.23.22.199]) (AUTH: PLAIN tmarshall, TLS: TLSv1/SSLv3,128bits,RC4-SHA) by flawless.real.com with esmtp; Tue, 16 Nov 2004 15:24:26 -0800 Received: from tommy by hashi with local (Exim 4.34) id 1CUCgD-0006sO-Ui for netdev@oss.sgi.com; Tue, 16 Nov 2004 15:24:09 -0800 Date: Tue, 16 Nov 2004 15:24:09 -0800 From: Tom Marshall To: netdev@oss.sgi.com Subject: Problem with dual IPv4/IPv6 connect Message-ID: <20041116232409.GB26264@real.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=_flawless.real.com-2243-1100647466-0001-2" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11909 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tmarshall@real.com Precedence: bulk X-list: netdev This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_flawless.real.com-2243-1100647466-0001-2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I'm using kernel 2.6.9 from kernel.org and I think I found a small problem in the dual IPv4/IPv6 connect code. Here's what happens: [Note both peer addresses are the same (Solaris 9) machine] s =3D socket(AF_INET6, SOCK_STREAM, 0) connect(s, [fec0::203:baff:fe88:5a15]:1554) =3D> EINPROGRESS Put socket in select's write set Kernel sends TCPv6 SYN Kernel receives ICMPv6 Time Exceeded (routing error) Socket becomes writable getsockopt(s, SO_ERROR) =3D> EHOSTUNREACH connect(s, 192.168.168.241:1554) =3D> ECONNABORTED At this point, if I call connect again with the same arguments, it behaves normally: EINPROGRESS followed by success. This leads me to believe that the IPv6 connect has not updated the socket state properly. --=20 At Group L, Stoffel oversees six first-rate programmers, a managerial challenge roughly comparable to herding cats. -- The Washington Post Magazine, 9 June, 1985 --=_flawless.real.com-2243-1100647466-0001-2 Content-Type: application/pgp-signature; name="signature.asc" Content-Transfer-Encoding: 7bit Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBmowZqznSmcYu2m8RAoyCAJ9MOc3p9NoYJJBYuKxxUlABADS7CACeMCKM ieFyR4aMHo4ycGbMTEEWQDw= =i9G2 -----END PGP SIGNATURE----- --=_flawless.real.com-2243-1100647466-0001-2-- From davem@davemloft.net Tue Nov 16 16:46:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 16:46:41 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH0kRNj029022 for ; Tue, 16 Nov 2004 16:46:30 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUDj0-00056y-00; Tue, 16 Nov 2004 16:31:06 -0800 Date: Tue, 16 Nov 2004 16:31:06 -0800 From: "David S. Miller" To: Herbert Xu Cc: sri@us.ibm.com, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor Message-Id: <20041116163106.3b62a39a.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11910 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 17 Nov 2004 07:59:18 +1100 Herbert Xu wrote: > Sridhar Samudrala wrote: > > We are seeing following assertions when running specweb99 with > > tcp_tso_win_divisor lowered to 4, 2 or 1 on linux 2.6.9 based kernels. > > 2.6.9 is known to have bugs in TCP book-keeping. Please try 2.6.10-rc2 > instead. Actually, that's true. I missed that this report was against 2.6.9 vanilla, TCP is buggy as can be wrt TSO in that release. From davem@davemloft.net Tue Nov 16 16:47:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 16:47:09 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH0l57e029121 for ; Tue, 16 Nov 2004 16:47:05 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUDja-00057F-00; Tue, 16 Nov 2004 16:31:42 -0800 Date: Tue, 16 Nov 2004 16:31:42 -0800 From: "David S. Miller" To: Herbert Xu Cc: sri@us.ibm.com, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor Message-Id: <20041116163142.2530566d.davem@davemloft.net> In-Reply-To: References: <20041116104755.32bdb7a7.davem@davemloft.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11911 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 17 Nov 2004 07:39:42 +1100 Herbert Xu wrote: > Could you elaborate the code path that you've spotted that causes this > when the divisor is changed? > > Perhaps we're not caching the MSS value everywhere where we should be? Currently I think your theory is better than mine, that 2.6.9 TCP is buggy wrt. TSO. :-) From herbert@gondor.apana.org.au Tue Nov 16 17:36:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 17:37:09 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH1asVj030860 for ; Tue, 16 Nov 2004 17:36:57 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUEkB-0004U2-00; Wed, 17 Nov 2004 12:36:23 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUEk6-00036P-00; Wed, 17 Nov 2004 12:36:18 +1100 From: Herbert Xu To: dubu0874@uidaho.edu (Thomas DuBuisson) Subject: Re: XFRM / DF Flag / Fragmentation Needed Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Organization: Core In-Reply-To: X-Newsgroups: apana.lists.os.linux.kernel User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 17 Nov 2004 12:36:18 +1100 X-archive-position: 11912 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Thomas DuBuisson wrote: > > After A establishes an SSH connection with C and tries to transfer the > patches the size of a packet from A destined for C is quickly reaches 1500 > while the MTU > to A is ~1400. At this point A sends an ICMP 'Fragmentation Needed' > packet to its self (see xfrm_output.c xfrm4_tunnel_check_size(...)). It > seems this packet is never acted on - it just disappears into the > loopback interface. The proper mtu trial/error process never takes > place. There is a known problem in xfrm4_tunnel_check_size if your underlying path MTU is a multiple of 8. So if your path MTU is 1480, you'll need to lower it to 1476 before it will work. You can query the path MTU using "ip r g ". If it is a multiple of 8, you can change it by doing ip r a ... mtu -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From manfred@colorfullife.com Tue Nov 16 21:36:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 16 Nov 2004 21:36:50 -0800 (PST) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH5agBU008137 for ; Tue, 16 Nov 2004 21:36:44 -0800 Received: from dbl.q-ag.de (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAH5aJSL011731; Wed, 17 Nov 2004 06:36:19 +0100 Received: from localhost (manfred@localhost) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAH5aHsL011726; Wed, 17 Nov 2004 06:36:18 +0100 X-Authentication-Warning: dbl.q-ag.de: manfred owned process doing -bs Date: Wed, 17 Nov 2004 06:36:17 +0100 (CET) From: Manfred Spraul X-X-Sender: manfred@dbl.q-ag.de To: netdev@oss.sgi.com, cc: blazara@nvidia.com Subject: [PATCH] forcedeth: add ethtool link speed support Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11913 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Hi, the attached patch adds ethtool get_ and set_settings support to the forcedeth nic driver. This allows to force a certain link speed with ethtool -s. Changelog: - Code reorganization: move ethtool functions further down in forcedeth.c (no code changes within the existing ethtool functions) - add support media detection without autodetection. - implement get_settings and set_settings ethtool functions. Please test it. It works with my 250-Gb board. -- Manfred // $Header$ // Kernel Version: // VERSION = 2 // PATCHLEVEL = 6 // SUBLEVEL = 10 // EXTRAVERSION =-rc1 --- 2.6/drivers/net/forcedeth.c 2004-11-14 14:50:21.000000000 +0100 +++ build-2.6/drivers/net/forcedeth.c 2004-11-17 05:55:13.440930446 +0100 @@ -79,6 +79,8 @@ * 0.30: 25 Sep 2004: rx checksum support for nf 250 Gb. Add rx reset * into nv_close, otherwise reenabling for wol can * cause DMA to kfree'd memory. + * 0.31: 14 Nov 2004: ethtool support for getting/setting link + * capabilities. * * Known bugs: * We suspect that on some hardware no TX done interrupts are generated. @@ -90,7 +92,7 @@ * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * superfluous timer interrupts from the nic. */ -#define FORCEDETH_VERSION "0.30" +#define FORCEDETH_VERSION "0.31" #define DRV_NAME "forcedeth" #include @@ -210,6 +212,7 @@ enum { #define NVREG_LINKSPEED_10 1000 #define NVREG_LINKSPEED_100 100 #define NVREG_LINKSPEED_1000 50 +#define NVREG_LINKSPEED_MASK (0xFFF) NvRegUnknownSetupReg5 = 0x130, #define NVREG_UNKSETUP5_BIT31 (1<<31) NvRegUnknownSetupReg3 = 0x13c, @@ -441,6 +444,8 @@ struct fe_priv { int in_shutdown; u32 linkspeed; int duplex; + int autoneg; + int fixed_mode; int phyaddr; int wolenabled; unsigned int phy_oui; @@ -765,50 +770,6 @@ static struct net_device_stats *nv_get_s return &np->stats; } -static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) -{ - struct fe_priv *np = get_nvpriv(dev); - strcpy(info->driver, "forcedeth"); - strcpy(info->version, FORCEDETH_VERSION); - strcpy(info->bus_info, pci_name(np->pci_dev)); -} - -static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - wolinfo->supported = WAKE_MAGIC; - - spin_lock_irq(&np->lock); - if (np->wolenabled) - wolinfo->wolopts = WAKE_MAGIC; - spin_unlock_irq(&np->lock); -} - -static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - - spin_lock_irq(&np->lock); - if (wolinfo->wolopts == 0) { - writel(0, base + NvRegWakeUpFlags); - np->wolenabled = 0; - } - if (wolinfo->wolopts & WAKE_MAGIC) { - writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); - np->wolenabled = 1; - } - spin_unlock_irq(&np->lock); - return 0; -} - -static struct ethtool_ops ops = { - .get_drvinfo = nv_get_drvinfo, - .get_link = ethtool_op_get_link, - .get_wol = nv_get_wol, - .set_wol = nv_set_wol, -}; - /* * nv_alloc_rx: fill rx ring entries. * Return 1 if the allocations for the skbs failed and the @@ -1286,6 +1247,25 @@ static int nv_update_linkspeed(struct ne goto set_speed; } + if (np->autoneg == 0) { + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: autoneg off, PHY set to 0x%04x.\n", + dev->name, np->fixed_mode); + if (np->fixed_mode & LPA_100FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 1; + } else if (np->fixed_mode & LPA_100HALF) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 0; + } else if (np->fixed_mode & LPA_10FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 1; + } else { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 0; + } + retval = 1; + goto set_speed; + } /* check auto negotiation is complete */ if (!(mii_status & BMSR_ANEGCOMPLETE)) { /* still in autonegotiation - configure nic for 10 MBit HD and wait. */ @@ -1303,7 +1283,7 @@ static int nv_update_linkspeed(struct ne if ((control_1000 & ADVERTISE_1000FULL) && (status_1000 & LPA_1000FULL)) { - dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", dev->name); newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_1000; newdup = 1; @@ -1362,9 +1342,9 @@ set_speed: phyreg &= ~(PHY_HALF|PHY_100|PHY_1000); if (np->duplex == 0) phyreg |= PHY_HALF; - if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_100) + if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_100) phyreg |= PHY_100; - else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_1000) + else if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) phyreg |= PHY_1000; writel(phyreg, base + NvRegPhyInterface); @@ -1500,6 +1480,227 @@ static void nv_do_nic_poll(unsigned long enable_irq(dev->irq); } +static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct fe_priv *np = get_nvpriv(dev); + strcpy(info->driver, "forcedeth"); + strcpy(info->version, FORCEDETH_VERSION); + strcpy(info->bus_info, pci_name(np->pci_dev)); +} + +static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + wolinfo->supported = WAKE_MAGIC; + + spin_lock_irq(&np->lock); + if (np->wolenabled) + wolinfo->wolopts = WAKE_MAGIC; + spin_unlock_irq(&np->lock); +} + +static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + u8 __iomem *base = get_hwbase(dev); + + spin_lock_irq(&np->lock); + if (wolinfo->wolopts == 0) { + writel(0, base + NvRegWakeUpFlags); + np->wolenabled = 0; + } + if (wolinfo->wolopts & WAKE_MAGIC) { + writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); + np->wolenabled = 1; + } + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + int adv; + + spin_lock_irq(&np->lock); + ecmd->port = PORT_MII; + if (!netif_running(dev)) { + /* We do not track link speed / duplex setting if the + * interface is disabled. Force a link check */ + nv_update_linkspeed(dev); + } + switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { + case NVREG_LINKSPEED_10: + ecmd->speed = SPEED_10; + break; + case NVREG_LINKSPEED_100: + ecmd->speed = SPEED_100; + break; + case NVREG_LINKSPEED_1000: + ecmd->speed = SPEED_1000; + break; + } + ecmd->duplex = DUPLEX_HALF; + if (np->duplex) + ecmd->duplex = DUPLEX_FULL; + + ecmd->autoneg = np->autoneg; + + ecmd->advertising = ADVERTISED_MII; + if (np->autoneg) { + ecmd->advertising |= ADVERTISED_Autoneg; + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + } else { + adv = np->fixed_mode; + } + if (adv & ADVERTISE_10HALF) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (adv & ADVERTISE_10FULL) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (adv & ADVERTISE_100HALF) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (adv & ADVERTISE_100FULL) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (np->autoneg && np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + if (adv & ADVERTISE_1000FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + } + + ecmd->supported = (SUPPORTED_Autoneg | + SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | + SUPPORTED_MII); + if (np->gigabit == PHY_GIGABIT) + ecmd->supported |= SUPPORTED_1000baseT_Full; + + ecmd->phy_address = np->phyaddr; + ecmd->transceiver = XCVR_EXTERNAL; + + /* ignore maxtxpkt, maxrxpkt for now */ + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + + if (ecmd->port != PORT_MII) + return -EINVAL; + if (ecmd->transceiver != XCVR_EXTERNAL) + return -EINVAL; + if (ecmd->phy_address != np->phyaddr) { + /* TODO: support switching between multiple phys. Should be + * trivial, but not enabled due to lack of test hardware. */ + return -EINVAL; + } + if (ecmd->autoneg == AUTONEG_ENABLE) { + u32 mask; + + mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; + if (np->gigabit == PHY_GIGABIT) + mask |= ADVERTISED_1000baseT_Full; + + if ((ecmd->advertising & mask) == 0) + return -EINVAL; + + } else if (ecmd->autoneg == AUTONEG_DISABLE) { + /* Note: autonegotiation disable, speed 1000 intentionally + * forbidden - noone should need that. */ + + if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) + return -EINVAL; + if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) + return -EINVAL; + } else { + return -EINVAL; + } + + spin_lock_irq(&np->lock); + if (ecmd->autoneg == AUTONEG_ENABLE) { + int adv, bmcr; + + np->autoneg = 1; + + /* advertise only what has been requested */ + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->advertising & ADVERTISED_10baseT_Half) + adv |= ADVERTISE_10HALF; + if (ecmd->advertising & ADVERTISED_10baseT_Full) + adv |= ADVERTISE_10FULL; + if (ecmd->advertising & ADVERTISED_100baseT_Half) + adv |= ADVERTISE_100HALF; + if (ecmd->advertising & ADVERTISED_100baseT_Full) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + if (ecmd->advertising & ADVERTISED_1000baseT_Full) + adv |= ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + + } else { + int adv, bmcr; + + np->autoneg = 0; + + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_10HALF; + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_10FULL; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_100HALF; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + np->fixed_mode = adv; + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= ~(BMCR_ANENABLE|BMCR_SPEED100|BMCR_FULLDPLX); + if (adv & (ADVERTISE_10FULL|ADVERTISE_100FULL)) + bmcr |= BMCR_FULLDPLX; + if (adv & (ADVERTISE_100HALF|ADVERTISE_100FULL)) + bmcr |= BMCR_SPEED100; + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + + if (netif_running(dev)) { + /* Wait a bit and then reconfigure the nic. */ + udelay(10); + nv_linkchange(dev); + } + } + spin_unlock_irq(&np->lock); + + return 0; +} + +static struct ethtool_ops ops = { + .get_drvinfo = nv_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_wol = nv_get_wol, + .set_wol = nv_set_wol, + .get_settings = nv_get_settings, + .set_settings = nv_set_settings, +}; + static int nv_open(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); @@ -1550,9 +1751,6 @@ static int nv_open(struct net_device *de base + NvRegRingSizes); /* 5) continue setup */ - np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; - np->duplex = 0; - writel(np->linkspeed, base + NvRegLinkSpeed); writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); writel(np->desc_ver, base + NvRegTxRxControl); @@ -1866,6 +2064,11 @@ static int __devinit nv_probe(struct pci phy_init(dev); } + /* set default link speed settings */ + np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + np->duplex = 0; + np->autoneg = 1; + err = register_netdev(dev); if (err) { printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err); From kanna@jcastnet.com Wed Nov 17 00:26:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 00:26:07 -0800 (PST) Received: from mail2.atl.registeredsite.com (nobody@mail2.atl.registeredsite.com [64.224.219.76]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH8PxHh015593 for ; Wed, 17 Nov 2004 00:26:00 -0800 Received: from imta01a2.registeredsite.com (imta01a2.registeredsite.com [64.225.255.10]) by mail2.atl.registeredsite.com (8.12.11/8.12.8) with ESMTP id iAH8PM9E012526; Wed, 17 Nov 2004 08:25:22 GMT Received: from kanna ([203.145.171.168]) by imta01a2.registeredsite.com with SMTP id <20041117082522.ZXLT4801.imta01a2.registeredsite.com@kanna>; Wed, 17 Nov 2004 03:25:22 -0500 Message-ID: <007001c4cc80$9e960ad0$3418fe0a@jcastindia.com> Reply-To: "Kanna" From: "Kanna" To: "bunty" , Cc: , References: <20041117065941.27060.qmail@webmail26.rediffmail.com> Subject: Re: netfilter query Date: Wed, 17 Nov 2004 14:06:59 +0530 Organization: Jcast Networks India Pvt. LTd., MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1437 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 X-archive-position: 11914 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kanna@jcastnet.com Precedence: bulk X-list: netdev The below link may help you to create your own firewall module for linux kernel........ Sample program also available on below url Link . http://www.linuxjournal.com/article/7184 ----- Original Message ----- From: "bunty " To: Cc: ; Sent: Wednesday, November 17, 2004 12:29 PM Subject: netfilter query hello, if I want to insert an extra overhead in packets destined for routers how a netfilters can help me? can netfilter allow to increase the allocated space to packets at NF_IP_LOCAL_OUT? How a netfilter help to write a module that call my own routine. can anybody provide a sample program that calls user routine at netfilter hooks? regards, parag. From akpm@osdl.org Wed Nov 17 01:29:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 01:29:46 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAH9TcHl019883 for ; Wed, 17 Nov 2004 01:29:38 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAH9TE921352; Wed, 17 Nov 2004 01:29:14 -0800 Date: Wed, 17 Nov 2004 01:29:02 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: janfrode@parallab.uib.no Subject: Fw: [Bugme-new] [Bug 3756] New: oops during raid rebuild (ServeRAID 6M) Message-Id: <20041117012902.7deecd8e.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11915 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev That's a networking bug, not a scsi bug. Begin forwarded message: Date: Wed, 17 Nov 2004 01:19:59 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3756] New: oops during raid rebuild (ServeRAID 6M) http://bugme.osdl.org/show_bug.cgi?id=3756 Summary: oops during raid rebuild (ServeRAID 6M) Kernel Version: 2.6.9 Status: NEW Severity: high Owner: andmike@us.ibm.com Submitter: janfrode@parallab.uib.no Distribution: CentOS 3.3 Hardware Environment: Dell PowerEdge 2650, 2x Pentium Xeon, 4 GB memory, IBM ServeRAID 6M Software Environment: Plain 2.6.9 kernel, plus updated ips driver for the ServeRAID adapter. ips v7.10.18. Problem Description: I have a 2-node cluster using IBM ServeRAID 6M with linux 2.6.9 + version 7.10.18 of the ips driver (I'll add the sources to this bug report). Today I tested removing one of the drives in the mirrored volumes. That seemed to work fine. Then I inserted the drive again, and RAID rebuild was automatically started. After a few seconds I got the following oops: --------------------------------------------------------- ------------[ cut here ]------------ kernel BUG at net/ipv4/tcp_output.c:277! invalid operand: 0000 [#1] SMP Modules linked in: mptctl mptbase lp sk98lin ipv6 tg3 ipt_REJECT ipt_state ip_conntrack iptable_filter ip_tables aacraid ips CPU: 2 EIP: 0060:[] Not tainted VLI EFLAGS: 00010246 (2.6.9ips) EIP is at tcp_transmit_skb+0x87b/0x892 eax: f7859d00 ebx: 0000400c ecx: 00000020 edx: f6ce5c80 esi: db7ec274 edi: db7ec274 ebp: f7f66ea8 esp: dda0dda8 ds: 007b es: 007b ss: 0068 Process java (pid: 4680, threadinfo=dda0c000 task=f78d8030) Stack: 00000000 f7b97680 db7ec0e4 00000246 f6ce5c80 f7b97680 db7ec0e4 00000020 f6ce5cb8 db7ec1dc f6ce5c80 db7ec080 0000400c db7ec274 db7ec080 f7f66ea8 c0383633 00000000 00000000 00000000 c2e419c0 dda0de28 00000218 f6641580 Call Trace: [] tcp_rcv_synsent_state_process+0x50c/0x561 [] tcp_rcv_state_process+0x938/0xa1c [] tcp_v4_do_rcv+0x8a/0x10e [] __release_sock+0x3e/0x58 [] release_sock+0x6e/0x70 [] inet_wait_for_connect+0x7d/0xd1 [] autoremove_wake_function+0x0/0x43 [] autoremove_wake_function+0x0/0x43 [] inet6_bind+0x103/0x2de [ipv6] [] inet_stream_connect+0xc8/0x187 [] sys_connect+0x74/0xa0 [] sock_map_fd+0x124/0x13a [] __sock_create+0xe0/0x221 [] copy_from_user+0x54/0x83 [] sys_socketcall+0x9c/0x24b [] sys_gettimeofday+0x24/0x5f [] syscall_call+0x7/0xb Code: ff ff 7f e9 74 f8 ff ff 0f b6 87 3f 01 00 00 84 c0 0f 84 5b f8 ff ff 8b 54 24 1c 0f b6 c0 8d 54 c2 04 89 54 24 1c e9 47 f8 ff ff <0f> 0b 15 01 5a 00 41 c0 e9 cc f7 ff ff b ------------[ cut here ]------------ Kernel panic - not syncing: Fatal exception in interrupt <1>kernel BUG at net/ipv4/tcp_output.c:277! invalid operand: 0000 [#2] SMP Modules linked in: mptctl mptbase lp sk98lin ipv6 tg3 ipt_REJECT ipt_state ip_conntrack iptable_filter ip_tables aacraid ips CPU: 1 EIP: 0060:[] Not tainted VLI EFLAGS: 00010246 (2.6.9ips) EIP is at tcp_transmit_skb+0x87b/0x892 eax: f7f69900 ebx: 0000400c ecx: 00000020 edx: f7b64d80 esi: db7ec774 edi: db7ec774 ebp: f7f356a8 esp: dda0fda8 ds: 007b es: 007b ss: 0068 Process java (pid: 4661, threadinfo=dda0e000 task=c748b930) Stack: 00000000 f6ce4380 db7ec5e4 00000246 f7b64d80 f6ce4380 db7ec5e4 00000020 f7b64db8 db7ec6dc f7b64d80 db7ec580 0000400c db7ec774 db7ec580 f7f356a8 c0383633 00000000 00000000 00000000 c2e399c0 dda0fe28 00000218 f73dc380 Call Trace: [] tcp_rcv_synsent_state_process+0x50c/0x561 [] tcp_rcv_state_process+0x938/0xa1c [] tcp_v4_do_rcv+0x8a/0x10e [] __release_sock+0x3e/0x58 [] release_sock+0x6e/0x70 [] inet_wait_for_connect+0x7d/0xd1 [] autoremove_wake_function+0x0/0x43 [] autoremove_wake_function+0x0/0x43 [] inet6_bind+0x103/0x2de [ipv6] [] inet_stream_connect+0xc8/0x187 [] sys_connect+0x74/0xa0 [] sock_map_fd+0x124/0x13a [] __sock_create+0xe0/0x221 [] copy_from_user+0x54/0x83 [] sys_socketcall+0x9c/0x24b [] sys_gettimeofday+0x24/0x5f [] syscall_call+0x7/0xb Code: ff ff 7f e9 74 f8 ff ff 0f b6 87 3f 01 00 00 84 c0 0f 84 5b f8 ff ff 8b 54 24 1c 0f b6 c0 8d 54 c2 04 89 54 24 1c e9 47 f8 ff ff <0f> 0b 15 01 5a 00 41 c0 e9 cc f7 ff ff b Badness in do_unblank_screen at drivers/char/vt.c:2871 [] do_unblank_screen+0x13d/0x142 [] bust_spinlocks+0x28/0x50 [] die+0xfe/0x173 [] do_invalid_op+0x0/0xed [] do_invalid_op+0x0/0xed [] do_invalid_op+0xeb/0xed --------------------------------------------------------- and the machine seemed dead according to heartbeat, so the other node took over. This node also quickly failed with the following oops: --------------------------------------------------------- ------------[ cut here ]------------ kernel BUG at net/ipv4/tcp_output.c:277! invalid operand: 0000 [#1] SMP Modules linked in: lp mptctl mptbase ipv6 tg3 ipt_REJECT ipt_state ip_conntrack iptable_filter ip_tables aacraid ips CPU: 2 EIP: 0060:[] Not tainted VLI EFLAGS: 00010246 (2.6.9ips) EIP is at tcp_transmit_skb+0x87b/0x892 eax: c2f3eb00 ebx: 0000400c ecx: 00000020 edx: ed162680 esi: ed546774 edi: ed546774 ebp: c2f3e8a8 esp: ed7a7da8 ds: 007b es: 007b ss: 0068 Process java (pid: 3323, threadinfo=ed7a6000 task=ed06a810) Stack: 00000000 ed162080 ed5465e4 00000246 ed162680 ed162080 ed5465e4 00000020 ed1626b8 ed5466dc ed162680 ed546580 0000400c ed546774 ed546580 c2f3e8a8 c0383633 00000000 00000000 00000000 c2e419c0 ed7a7e28 00000218 f7b99680 Call Trace: [] tcp_rcv_synsent_state_process+0x50c/0x561 [] tcp_rcv_state_process+0x938/0xa1c [] tcp_v4_do_rcv+0x8a/0x10e [] __release_sock+0x3e/0x58 [] release_sock+0x6e/0x70 [] inet_wait_for_connect+0x7d/0xd1 --------------------------------------------------------- I'm uncertain if it was really dead at this point, or if it was just hanging waiting for the raid rebuild to finish. Anyway, wasn't patient enough to find out.. and it felt dead. Afterwards I booted back to the RHEL 2.4.21-20 + 7.10.18 ips driver, and the RAID was automatically rebuilt there. But, shouldn't this driver work with 2.6? And, any reason the latest version isn't included in the standard kernels? Steps to reproduce: I expect the same problem to re-appear if I unplug and re-plug a disk in one of the ServeRAID mirrored volumes. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From herbert@gondor.apana.org.au Wed Nov 17 03:29:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 03:29:45 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHBTae0007696 for ; Wed, 17 Nov 2004 03:29:37 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUNzg-0000sx-00; Wed, 17 Nov 2004 22:29:00 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUNzc-00042t-00; Wed, 17 Nov 2004 22:28:56 +1100 From: Herbert Xu To: akpm@osdl.org (Andrew Morton) Subject: Re: Fw: [Bugme-new] [Bug 3756] New: oops during raid rebuild (ServeRAID 6M) Cc: netdev@oss.sgi.com, janfrode@parallab.uib.no Organization: Core In-Reply-To: <20041117012902.7deecd8e.akpm@osdl.org> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Wed, 17 Nov 2004 22:28:56 +1100 X-archive-position: 11916 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Andrew Morton wrote: > > Call Trace: > [] tcp_rcv_synsent_state_process+0x50c/0x561 > [] tcp_rcv_state_process+0x938/0xa1c > [] tcp_v4_do_rcv+0x8a/0x10e This has already been fixed in 2.6.10-rc2. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From SRS0+d343ffc46da10b712893+451+infradead.org+hch@phoenix.srs.infradead.org Wed Nov 17 07:02:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 07:02:11 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHF23DQ020671 for ; Wed, 17 Nov 2004 07:02:05 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CURJO-0002JZ-E3; Wed, 17 Nov 2004 15:01:35 +0000 Date: Wed, 17 Nov 2004 15:01:34 +0000 From: Christoph Hellwig To: Mirko Lindner Cc: Stephen Hemminger , Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com, Ralph Roesler Subject: Re: [PATCH] (4/25) sk98: change #define to typedef Message-ID: <20041117150133.GA8874@infradead.org> References: <419A231F.4020104@syskonnect.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419A231F.4020104@syskonnect.de> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11917 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev > Note that the kernel BSD sk driver was _not_ written by SysKonnect and > only supports Genesis and Yukon1; linux supports Genesis (single and > dual), Yukon1, Yukon Plus, Yukon EC, Yukon FE and Yukon2 (single and > dual). They have Yukon2 support for while - unlike Linux. > The BSD sk driver supports substantially less functionality than > the Linux driver. For example, there is no link failover capability in > the sk driver; Which isn't something that belongs into a driver anyway. It also means you common code is obsfucated enough that no one noticed :) > For instance the symbol SK_IOC mentioned in your mail: > > > -#define SK_IOC char __iomem * > > +typedef void __iomem *SK_IOC; > > is used in a large number of OS independent driver files (e.g. skvpd.c). > The -for instance- file skvpd.c used by our Linux driver is used > at the same time without any changes by all our other drivers running > on other operating systems (e.g. Solaris, Windows). > > This is the reason why we need to redefine this symbol to the Linux > specific implementation (void __iomem). And you still haven't explained why your common code uses such a broken structure instead of having some semi-opaque private data passed around everywhere. Also note that we don't new drivers using such horrible "common code" anymore, you can be happy you sneaked it in at all a few years ago. From nacc@us.ibm.com Wed Nov 17 07:32:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 07:32:58 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHFWl1Y021562 for ; Wed, 17 Nov 2004 07:32:54 -0800 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAHFWMCB263958 for ; Wed, 17 Nov 2004 10:32:23 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAHFW7QC130712 for ; Wed, 17 Nov 2004 08:32:08 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAHFW564031113 for ; Wed, 17 Nov 2004 08:32:06 -0700 Received: from localhost.localdomain (DYN319030BLD.beaverton.ibm.com [9.47.21.103]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAHFW5Re031042; Wed, 17 Nov 2004 08:32:05 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iAHFW2Wr001527; Wed, 17 Nov 2004 07:32:04 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iAH1UxSx004233; Tue, 16 Nov 2004 17:30:59 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Tue, 16 Nov 2004 17:30:59 -0800 From: Nishanth Aravamudan To: janitor@sternwelten.at Cc: netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] Add ssleep_interruptible() Message-ID: <20041117013059.GA4218@us.ibm.com> References: <20041101200749.GF1730@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041101200749.GF1730@us.ibm.com> X-Operating-System: Linux 2.6.9-test-acpi (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11918 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev On Mon, Nov 01, 2004 at 12:07:49PM -0800, Nishanth Aravamudan wrote: > Description: Adds ssleep_interruptible() to allow longer delays to occur > in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with > msleep_interruptible(), ssleep_interruptible() returns the remaining time > left in the delay in terms of seconds. This required dividing the return > value of msleep_interruptible() by 1000, thus a cast to (unsigned long) > to prevent any floating point issues. > > Signed-off-by: Nishanth Aravamudan > > --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 > 15:34:03.000000000 -0700 > +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 > @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s > msleep(seconds * 1000); > } > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > +{ > + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); > +} > + > #endif /* defined(_LINUX_DELAY_H) */ After a discussion on IRC, I believe it is pretty clear that this function has serious issues. Mainly, that if I request a delay of 1 second, but msleep_interruptible() returns after 1 millisecond, then ssleep_interruptible() will return 0, claiming the entire delay was used (due to rounding). Perhaps we should just be satisfied with milliseconds being the grossest (in contrast to fine) measure of time, at least in terms of interruptible delays. ssleep() is unaffected by this problem, of course. Please revert this patch, if applied, as well as any of the other patches I sent using ssleep_interruptible() [only a handful]. Thanks, Nish From max@stro.at Wed Nov 17 10:24:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 10:24:33 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHION9h029277 for ; Wed, 17 Nov 2004 10:24:24 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id A532D5C00B; Wed, 17 Nov 2004 19:24:01 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 17977-04; Wed, 17 Nov 2004 19:24:00 +0100 (CET) Received: from sputnik (sputnik.itp.tuwien.ac.at [128.131.48.177]) by baikonur.stro.at (Postfix) with ESMTP id DE8DA5C00A; Wed, 17 Nov 2004 19:24:00 +0100 (CET) Received: from max by sputnik with local (Exim 4.34) id 1CUUTL-0002If-Fi; Wed, 17 Nov 2004 19:24:03 +0100 Date: Wed, 17 Nov 2004 19:24:03 +0100 From: maximilian attems To: netdev@oss.sgi.com Cc: Daniele Venzano , Pavel Machek Subject: sis900 oops on resume Message-ID: <20041117182403.GC2252@stro.at> Mail-Followup-To: netdev@oss.sgi.com, Daniele Venzano , Pavel Machek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 11919 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev happens since the use of guessnet, guessnet is based on divine and sends arp requests to network. network was down after the oops, but beside resume system worked. uname -a: Linux sputnik 2.6.10-rc2-bk1.041116 #1 Tue Nov 16 18:35:42 CET 2004 i686 GNU/Linux shall i enable CONFIG_PM_DEBUG? "normal" suspend: -- Nov 9 19:43:23 sputnik kernel: Stopping tasks: ======================| Nov 9 19:43:24 sputnik kernel: Freeing memory... done (80439 pages freed) Nov 9 19:43:24 sputnik kernel: .........................................swsusp: Need to copy 7094 pages Nov 9 19:43:24 sputnik kernel: .<6>ACPI: PCI interrupt 0000:00:01.4[B] -> GSI 11 (level, low) -> IRQ 11 Nov 9 19:43:24 sputnik kernel: Restarting tasks... done Nov 9 19:43:25 sputnik kernel: eth0: Abnormal interrupt,status 0x03008001. Nov 9 19:43:27 sputnik kernel: eth0: Media Link On 100mbps full-duplex or Nov 16 17:51:04 sputnik kernel: Stopping tasks: ============================| Nov 16 17:51:06 sputnik kernel: Freeing memory... done (9559 pages freed) Nov 16 17:51:06 sputnik kernel: ................swsusp: Need to copy 6608 pages Nov 16 17:51:06 sputnik kernel: .<6>ACPI: PCI interrupt 0000:00:01.4[B] -> GSI 11 (level, low) -> IRQ 11 Nov 16 17:51:06 sputnik kernel: spurious 8259A interrupt: IRQ7. Nov 16 17:51:06 sputnik kernel: Restarting tasks... done Nov 16 17:51:08 sputnik kernel: eth0: Media Link On 100mbps full-duplex Nov 16 17:51:09 sputnik kernel: eth0: Abnormal interrupt,status 0x03008001. -- -- oops snipp Nov 16 20:15:36 sputnik kernel: Stopping tasks: ============================| Nov 16 20:15:37 sputnik kernel: Freeing memory... done (37019 pages freed) Nov 16 20:15:37 sputnik kernel: ..........................................swsusp : Need to copy 10075 pages Nov 16 20:15:37 sputnik kernel: .<6>eth0: Abnormal interrupt,status 0x03008000. Nov 16 20:15:37 sputnik kernel: irq 10: nobody cared! Nov 16 20:15:37 sputnik kernel: [] __report_bad_irq+0x24/0x90 Nov 16 20:15:37 sputnik kernel: [] note_interrupt+0x61/0x90 Nov 16 20:15:37 sputnik kernel: [] __do_IRQ+0x11b/0x130 Nov 16 20:15:37 sputnik kernel: [] do_IRQ+0x5c/0x60 Nov 16 20:15:37 sputnik kernel: [] common_interrupt+0x1a/0x20 Nov 16 20:15:37 sputnik kernel: [] handle_IRQ_event+0x20/0x60 Nov 16 20:15:37 sputnik kernel: [] __do_IRQ+0xca/0x130 Nov 16 20:15:37 sputnik kernel: [] do_IRQ+0x3e/0x60 Nov 16 20:15:37 sputnik kernel: ======================= Nov 16 20:15:37 sputnik kernel: [] common_interrupt+0x1a/0x20 Nov 16 20:15:37 sputnik kernel: [] sisdrv_irq_install+0xbb/0x160 Nov 16 20:15:37 sputnik kernel: [] i8042_command+0xc4/0xf0 Nov 16 20:15:37 sputnik kernel: [] i8042_enable_mux_mode+0x21/0x90 Nov 16 20:15:37 sputnik kernel: [] i8042_controller_resume+0xdc/0x120 Nov 16 20:15:37 sputnik kernel: [] platform_resume+0x3d/0x40 Nov 16 20:15:37 sputnik kernel: [] resume_device+0x16/0x20 Nov 16 20:15:37 sputnik kernel: [] dpm_resume+0xa7/0xb0 Nov 16 20:15:37 sputnik kernel: [] device_resume+0x11/0x20 Nov 16 20:15:37 sputnik kernel: [] finish+0x5/0x40 Nov 16 20:15:37 sputnik kernel: [] pm_suspend_disk+0x3c/0x70 Nov 16 20:15:37 sputnik kernel: [] enter_state+0x65/0x70 Nov 16 20:15:37 sputnik kernel: [] state_store+0xa3/0xab Nov 16 20:15:37 sputnik kernel: [] state_store+0x0/0xab Nov 16 20:15:37 sputnik kernel: [] subsys_attr_store+0x36/0x40 Nov 16 20:15:37 sputnik kernel: [] flush_write_buffer+0x2e/0x40 Nov 16 20:15:37 sputnik kernel: [] sysfs_write_file+0x51/0x60 Nov 16 20:15:37 sputnik kernel: [] vfs_write+0xd1/0x120 Nov 16 20:15:37 sputnik kernel: [] sys_write+0x47/0x80 Nov 16 20:15:37 sputnik kernel: [] syscall_call+0x7/0xb Nov 16 20:15:37 sputnik kernel: [] (sis900_interrupt+0x0/0x100 [sis900]) Nov 16 20:15:37 sputnik kernel: Disabling IRQ #10 -- maks From pavel@ucw.cz Wed Nov 17 12:10:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 12:10:47 -0800 (PST) Received: from amd.ucw.cz (postfix@gprs214-133.eurotel.cz [160.218.214.133]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHKAY0s001448 for ; Wed, 17 Nov 2004 12:10:37 -0800 Received: by amd.ucw.cz (Postfix, from userid 8) id 9445A2BE66; Wed, 17 Nov 2004 21:10:08 +0100 (CET) Date: Wed, 17 Nov 2004 21:10:08 +0100 From: Pavel Machek To: netdev@oss.sgi.com, Daniele Venzano Subject: Re: sis900 oops on resume Message-ID: <20041117201008.GA11439@elf.ucw.cz> References: <20041117182403.GC2252@stro.at> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041117182403.GC2252@stro.at> X-Warning: Reading this can be dangerous to your mental health. User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11920 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pavel@ucw.cz Precedence: bulk X-list: netdev Hi! > happens since the use of guessnet, > guessnet is based on divine and sends arp requests to network. > network was down after the oops, but beside resume system worked. And where do you see the oops? Irq 10 does not work, that's only backtrace. Fix the sis900 driver... Pavel > Nov 16 20:15:36 sputnik kernel: Stopping tasks: ============================| > Nov 16 20:15:37 sputnik kernel: Freeing memory... done (37019 pages freed) > Nov 16 20:15:37 sputnik kernel: ..........................................swsusp > : Need to copy 10075 pages > Nov 16 20:15:37 sputnik kernel: .<6>eth0: Abnormal interrupt,status 0x03008000. > Nov 16 20:15:37 sputnik kernel: irq 10: nobody cared! > Nov 16 20:15:37 sputnik kernel: [] __report_bad_irq+0x24/0x90 > Nov 16 20:15:37 sputnik kernel: [] note_interrupt+0x61/0x90 > Nov 16 20:15:37 sputnik kernel: [] __do_IRQ+0x11b/0x130 > Nov 16 20:15:37 sputnik kernel: [] do_IRQ+0x5c/0x60 > Nov 16 20:15:37 sputnik kernel: [] common_interrupt+0x1a/0x20 > Nov 16 20:15:37 sputnik kernel: [] handle_IRQ_event+0x20/0x60 > Nov 16 20:15:37 sputnik kernel: [] __do_IRQ+0xca/0x130 > Nov 16 20:15:37 sputnik kernel: [] do_IRQ+0x3e/0x60 > Nov 16 20:15:37 sputnik kernel: ======================= > Nov 16 20:15:37 sputnik kernel: [] common_interrupt+0x1a/0x20 > Nov 16 20:15:37 sputnik kernel: [] sisdrv_irq_install+0xbb/0x160 > Nov 16 20:15:37 sputnik kernel: [] i8042_command+0xc4/0xf0 > Nov 16 20:15:37 sputnik kernel: [] i8042_enable_mux_mode+0x21/0x90 > Nov 16 20:15:37 sputnik kernel: [] i8042_controller_resume+0xdc/0x120 > Nov 16 20:15:37 sputnik kernel: [] platform_resume+0x3d/0x40 > Nov 16 20:15:37 sputnik kernel: [] resume_device+0x16/0x20 > Nov 16 20:15:37 sputnik kernel: [] dpm_resume+0xa7/0xb0 > Nov 16 20:15:37 sputnik kernel: [] device_resume+0x11/0x20 > Nov 16 20:15:37 sputnik kernel: [] finish+0x5/0x40 > Nov 16 20:15:37 sputnik kernel: [] pm_suspend_disk+0x3c/0x70 > Nov 16 20:15:37 sputnik kernel: [] enter_state+0x65/0x70 > Nov 16 20:15:37 sputnik kernel: [] state_store+0xa3/0xab > Nov 16 20:15:37 sputnik kernel: [] state_store+0x0/0xab > Nov 16 20:15:37 sputnik kernel: [] subsys_attr_store+0x36/0x40 > Nov 16 20:15:37 sputnik kernel: [] flush_write_buffer+0x2e/0x40 > Nov 16 20:15:37 sputnik kernel: [] sysfs_write_file+0x51/0x60 > Nov 16 20:15:37 sputnik kernel: [] vfs_write+0xd1/0x120 > Nov 16 20:15:37 sputnik kernel: [] sys_write+0x47/0x80 > Nov 16 20:15:37 sputnik kernel: [] syscall_call+0x7/0xb > Nov 16 20:15:37 sputnik kernel: [] (sis900_interrupt+0x0/0x100 [sis900]) > Nov 16 20:15:37 sputnik kernel: Disabling IRQ #10 -- People were complaining that M$ turns users into beta-testers... ...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl! From linville@ra.tuxdriver.com Wed Nov 17 12:16:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 12:16:39 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHKGWLh001885 for ; Wed, 17 Nov 2004 12:16:32 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAHKCiG04164; Wed, 17 Nov 2004 15:12:44 -0500 Date: Wed, 17 Nov 2004 15:12:44 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, jgarzik@pobox.com, grant.grundler@hp.com, charlie.brett@hp.com Subject: [patch 2.6.10-rc2] tulip: make tulip_stop_rxtx() wait for DMA to fully stop Message-ID: <20041117151244.B31363@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com, grant.grundler@hp.com, charlie.brett@hp.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11921 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function call name implies. Acked-by: Grant Grundler Acked-by: Charlie Brett Signed-off-by: John W. Linville --- This was submitted through my employer -- I am not the original author of this patch. However, I passed it by Jeff Garizk and he expressed interest in having it upstream. drivers/net/tulip/21142.c | 2 +- drivers/net/tulip/eeprom.c | 1 + drivers/net/tulip/interrupt.c | 2 +- drivers/net/tulip/media.c | 1 + drivers/net/tulip/pnic.c | 1 + drivers/net/tulip/pnic2.c | 2 +- drivers/net/tulip/timer.c | 1 + drivers/net/tulip/tulip.h | 15 ++++++++++++++- drivers/net/tulip/tulip_core.c | 2 +- 9 files changed, 22 insertions(+), 5 deletions(-) --- tulip_stop_rxtx-2.6/drivers/net/tulip/tulip_core.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/tulip_core.c @@ -26,8 +26,8 @@ #include -#include "tulip.h" #include +#include "tulip.h" #include #include #include --- tulip_stop_rxtx-2.6/drivers/net/tulip/media.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/media.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "tulip.h" --- tulip_stop_rxtx-2.6/drivers/net/tulip/21142.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/21142.c @@ -14,9 +14,9 @@ */ -#include "tulip.h" #include #include +#include "tulip.h" static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, }; --- tulip_stop_rxtx-2.6/drivers/net/tulip/timer.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/timer.c @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" --- tulip_stop_rxtx-2.6/drivers/net/tulip/tulip.h.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/tulip.h @@ -149,6 +149,9 @@ enum status_bits { TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000 enum tulip_mode_bits { TxThreshold = (1 << 22), @@ -460,9 +463,19 @@ static inline void tulip_stop_rxtx(struc u32 csr6 = ioread32(ioaddr + CSR6); if (csr6 & RxTx) { + unsigned i=1300/10; iowrite32(csr6 & ~RxTx, ioaddr + CSR6); barrier(); - (void) ioread32(ioaddr + CSR6); /* mmio sync */ + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50 us on 100BT. + */ + while (--i && (ioread32(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) + udelay(10); + + if (!i) + printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed\n", + tp->pdev->slot_name); } } --- tulip_stop_rxtx-2.6/drivers/net/tulip/pnic.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/pnic.c @@ -15,6 +15,7 @@ */ #include +#include #include "tulip.h" --- tulip_stop_rxtx-2.6/drivers/net/tulip/pnic2.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/pnic2.c @@ -76,8 +76,8 @@ -#include "tulip.h" #include +#include "tulip.h" #include --- tulip_stop_rxtx-2.6/drivers/net/tulip/eeprom.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/eeprom.c @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" #include #include --- tulip_stop_rxtx-2.6/drivers/net/tulip/interrupt.c.orig +++ tulip_stop_rxtx-2.6/drivers/net/tulip/interrupt.c @@ -14,10 +14,10 @@ */ +#include #include "tulip.h" #include #include -#include int tulip_rx_copybreak; unsigned int tulip_max_interrupt_work; From linville@ra.tuxdriver.com Wed Nov 17 12:19:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 12:19:44 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHKJeS4005496 for ; Wed, 17 Nov 2004 12:19:40 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAHKFrI04211; Wed, 17 Nov 2004 15:15:53 -0500 Date: Wed, 17 Nov 2004 15:15:53 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, jgarzik@pobox.com, grant.grundler@hp.com, charlie.brett@hp.com Subject: [patch 2.4.28-rc3] tulip: make tulip_stop_rxtx() wait for DMA to fully stop Message-ID: <20041117151553.C31363@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com, grant.grundler@hp.com, charlie.brett@hp.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11922 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function call name implies. Acked-by: Grant Grundler Acked-by: Charlie Brett Signed-off-by: John W. Linville --- This was submitted through my employer -- I am not the original author of this patch. However, I passed it by Jeff Garizk and he expressed interest in having it upstream. drivers/net/tulip/21142.c | 2 +- drivers/net/tulip/eeprom.c | 1 + drivers/net/tulip/interrupt.c | 2 +- drivers/net/tulip/media.c | 1 + drivers/net/tulip/pnic.c | 1 + drivers/net/tulip/pnic2.c | 2 +- drivers/net/tulip/timer.c | 1 + drivers/net/tulip/tulip.h | 15 ++++++++++++++- drivers/net/tulip/tulip_core.c | 2 +- 9 files changed, 22 insertions(+), 5 deletions(-) --- tulip_stop_rxtx-2.4/drivers/net/tulip/tulip_core.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/tulip_core.c @@ -20,8 +20,8 @@ #include #include -#include "tulip.h" #include +#include "tulip.h" #include #include #include --- tulip_stop_rxtx-2.4/drivers/net/tulip/media.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/media.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "tulip.h" --- tulip_stop_rxtx-2.4/drivers/net/tulip/21142.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/21142.c @@ -14,8 +14,8 @@ */ -#include "tulip.h" #include +#include "tulip.h" #include --- tulip_stop_rxtx-2.4/drivers/net/tulip/timer.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/timer.c @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" --- tulip_stop_rxtx-2.4/drivers/net/tulip/tulip.h.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/tulip.h @@ -146,6 +146,9 @@ enum status_bits { TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000 enum tulip_mode_bits { TxThreshold = (1 << 22), @@ -484,9 +487,19 @@ static inline void tulip_stop_rxtx(struc u32 csr6 = inl(ioaddr + CSR6); if (csr6 & RxTx) { + unsigned i=1300/10; outl(csr6 & ~RxTx, ioaddr + CSR6); barrier(); - (void) inl(ioaddr + CSR6); /* mmio sync */ + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50us on 100BT. + */ + while (--i && (inl(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) + udelay(10); + + if (!i) + printk (KERN_DEBUG "%s: tulip_stop_rxtx() failed\n", + tp->pdev->slot_name); } } --- tulip_stop_rxtx-2.4/drivers/net/tulip/pnic.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/pnic.c @@ -15,6 +15,7 @@ */ #include +#include #include "tulip.h" --- tulip_stop_rxtx-2.4/drivers/net/tulip/pnic2.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/pnic2.c @@ -76,8 +76,8 @@ -#include "tulip.h" #include +#include "tulip.h" #include --- tulip_stop_rxtx-2.4/drivers/net/tulip/eeprom.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/eeprom.c @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" #include #include --- tulip_stop_rxtx-2.4/drivers/net/tulip/interrupt.c.orig +++ tulip_stop_rxtx-2.4/drivers/net/tulip/interrupt.c @@ -14,10 +14,10 @@ */ +#include #include "tulip.h" #include #include -#include int tulip_rx_copybreak; From linville@ra.tuxdriver.com Wed Nov 17 13:05:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 13:05:16 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHL5AZw006573 for ; Wed, 17 Nov 2004 13:05:11 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAHL1Mj04929; Wed, 17 Nov 2004 16:01:22 -0500 Date: Wed, 17 Nov 2004 16:01:22 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, jgarzik@pobox.com, akpm@osdl.org Subject: [patch 2.6.10-rc2] 3c59x: reload EEPROM values at rmmod for needy cards Message-ID: <20041117160122.A4824@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com, akpm@osdl.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11923 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Enable reload of EEPROM values in reset at rmmod for cards that need it, similar to old EEPROM_NORESET flag but in reverse. Signed-off-by: John W. Linville --- 3c905 cards need an additional bit unmasked in the reset at rmmod or else they don't get reinitialized properly when the driver is reloaded. This is a repost -- the previous patch appears to have been lost in the shuffle. This is the combination of the two patches posted previously regarding EEPROM_NORESET. drivers/net/3c59x.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) --- 3c59x-reset-2.6/drivers/net/3c59x.c.orig +++ 3c59x-reset-2.6/drivers/net/3c59x.c @@ -417,7 +417,7 @@ enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_C HAS_PWR_CTRL=0x20, HAS_MII=0x40, HAS_NWAY=0x80, HAS_CB_FNS=0x100, INVERT_MII_PWR=0x200, INVERT_LED_PWR=0x400, MAX_COLLISION_RESET=0x800, EEPROM_OFFSET=0x1000, HAS_HWCKSM=0x2000, WNO_XCVR_PWR=0x4000, - EXTRA_PREAMBLE=0x8000, }; + EXTRA_PREAMBLE=0x8000, EEPROM_RESET=0x10000, }; enum vortex_chips { CH_3C590 = 0, @@ -505,9 +505,9 @@ static struct vortex_chip_info { {"3c900B-FL Cyclone 10base-FL", PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905 Boomerang 100baseTx", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905 Boomerang 100baseT4", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905B Cyclone 100baseTx", PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, @@ -3169,7 +3169,8 @@ static void __devexit vortex_remove_one pci_restore_state(VORTEX_PCI(vp)); } /* Should really use issue_and_wait() here */ - outw(TotalReset|0x14, dev->base_addr + EL3_CMD); + outw(TotalReset | ((vp->drv_flags & EEPROM_RESET) ? 0x04 : 0x14), + dev->base_addr + EL3_CMD); pci_free_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE From linville@ra.tuxdriver.com Wed Nov 17 13:06:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 13:06:49 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHL6jbU006875 for ; Wed, 17 Nov 2004 13:06:45 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAHL2wo04953; Wed, 17 Nov 2004 16:02:58 -0500 Date: Wed, 17 Nov 2004 16:02:57 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, jgarzik@pobox.com, akpm@osdl.org Subject: [patch 2.4.28-rc3] 3c59x: reload EEPROM values at rmmod for needy cards Message-ID: <20041117160257.A4933@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com, akpm@osdl.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11924 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Enable reload of EEPROM values in reset at rmmod for cards that need it, similar to old EEPROM_NORESET flag but in reverse. Signed-off-by: John W. Linville --- 3c905 cards need an additional bit unmasked in the reset at rmmod or else they don't get reinitialized properly when the driver is reloaded. This is a repost -- the previous patch appears to have been lost in the shuffle. This is the combination of the two patches posted previously regarding EEPROM_NORESET. drivers/net/3c59x.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) --- 3c59x-reset-2.4/drivers/net/3c59x.c.orig +++ 3c59x-reset-2.4/drivers/net/3c59x.c @@ -413,7 +413,7 @@ enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_C HAS_PWR_CTRL=0x20, HAS_MII=0x40, HAS_NWAY=0x80, HAS_CB_FNS=0x100, INVERT_MII_PWR=0x200, INVERT_LED_PWR=0x400, MAX_COLLISION_RESET=0x800, EEPROM_OFFSET=0x1000, HAS_HWCKSM=0x2000, WNO_XCVR_PWR=0x4000, - EXTRA_PREAMBLE=0x8000, }; + EXTRA_PREAMBLE=0x8000, EEPROM_RESET=0x10000, }; enum vortex_chips { CH_3C590 = 0, @@ -502,9 +502,9 @@ static struct vortex_chip_info { {"3c900B-FL Cyclone 10base-FL", PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905 Boomerang 100baseTx", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905 Boomerang 100baseT4", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905B Cyclone 100baseTx", PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, @@ -3094,7 +3094,8 @@ static void __devexit vortex_remove_one pci_restore_state(VORTEX_PCI(vp), vp->power_state); } /* Should really use issue_and_wait() here */ - outw(TotalReset|0x14, dev->base_addr + EL3_CMD); + outw(TotalReset | ((vp->drv_flags & EEPROM_RESET) ? 0x04 : 0x14), + dev->base_addr + EL3_CMD); pci_free_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE From grundler@cup.hp.com Wed Nov 17 13:10:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 13:10:38 -0800 (PST) Received: from palrel12.hp.com (palrel12.hp.com [156.153.255.237]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHLANf1007497 for ; Wed, 17 Nov 2004 13:10:30 -0800 Received: from hpuxmail.cup.hp.com (hpuxmail.cup.hp.com [15.13.189.207]) by palrel12.hp.com (Postfix) with ESMTP id 9172141427C; Wed, 17 Nov 2004 13:10:04 -0800 (PST) Received: from debian.cup.hp.com (postfix@debian.cup.hp.com [15.244.57.47]) by hpuxmail.cup.hp.com (8.9.3 (PHNE_29774)/8.8.6) with ESMTP id NAA14962; Wed, 17 Nov 2004 13:10:04 -0800 (PST) Received: by debian.cup.hp.com (Postfix, from userid 1001) id 170602FA3A; Wed, 17 Nov 2004 13:09:55 -0800 (PST) Date: Wed, 17 Nov 2004 13:09:54 -0800 From: Grant Grundler To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com, grant.grundler@hp.com, charlie.brett@hp.com Subject: Re: [patch 2.6.10-rc2] tulip: make tulip_stop_rxtx() wait for DMA to fully stop Message-ID: <20041117210954.GH4422@cup.hp.com> References: <20041117151244.B31363@tuxdriver.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041117151244.B31363@tuxdriver.com> User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11925 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: iod00d@hp.com Precedence: bulk X-list: netdev On Wed, Nov 17, 2004 at 03:12:44PM -0500, John W. Linville wrote: > tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function > call name implies. > > Acked-by: Grant Grundler John, I can provide a proper: Signed-off-by: Grant Grundler ditto for the 2.4.28 version of the patch. > This was submitted through my employer -- I am not the original author > of this patch. However, I passed it by Jeff Garizk and he expressed > interest in having it upstream. Excellent! thanks, grant From ross.axe@blueyonder.co.uk Wed Nov 17 13:30:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 13:30:07 -0800 (PST) Received: from smtp-out3.blueyonder.co.uk (smtp-out3.blueyonder.co.uk [195.188.213.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHLTxqH008122 for ; Wed, 17 Nov 2004 13:30:00 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out3.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Wed, 17 Nov 2004 21:30:08 +0000 Message-ID: <419BC2C2.6020100@blueyonder.co.uk> Date: Wed, 17 Nov 2004 21:29:38 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com CC: Stephen Smalley , lkml , jmorris@redhat.com Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <4197A037.1020307@blueyonder.co.uk> <1100525477.31773.38.camel@moss-spartans.epoch.ncsc.mil> <20041116004122.V14339@build.pdx.osdl.net> In-Reply-To: <20041116004122.V14339@build.pdx.osdl.net> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigD148A6950C18B5194DE33259" X-OriginalArrivalTime: 17 Nov 2004 21:30:08.0812 (UTC) FILETIME=[9CCB16C0:01C4CCEC] X-archive-position: 11926 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigD148A6950C18B5194DE33259 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Chris Wright wrote: > * Stephen Smalley (sds@epoch.ncsc.mil) wrote: > >>On Sun, 2004-11-14 at 13:13, Ross Kendall Axe wrote: >> >>>With CONFIG_SECURITY_NETWORK=y and CONFIG_SECURITY_SELINUX=y, using >>>SOCK_SEQPACKET unix domain sockets causes an oops in the superfluous(?) >>>call to security_unix_may_send in sock_dgram_sendmsg. This patch avoids >>>making this call for SOCK_SEQPACKET sockets. >> >>I'd prefer to track down the actual issue in the SELinux code and >>correct it than just omit the security hook call entirely. Do you have >>the Oops output and a trivial test case? Thanks. > Oops at http://www.rossaxe.pwp.blueyonder.co.uk/seqpacket-oops/seqpacket-oops.txt and test case at http://www.rossaxe.pwp.blueyonder.co.uk/seqpacket-oops/seqpacket-killer.tar.gz Just run 'seqpacket-crashd & seqpacket-crash' a couple of times. > > Well, there is one simple case that will trigger the Oops. Send a > SEQPACKET to a connected but not yet accepted socket. In this case > other->sk_socket is still NULL, and SELinux will deref the NULL pointer > in selinux_socket_may_send() when geting other_isec. There is already > a check in unix_stream_connect, which is all that's used for normal unix > stream sockets. But the seqpacket socket then uses unix_dgram_sendmsg, > so triggers the may_send check as well. > > thanks, > -chris A possibility that hadn't occurred to me was using sendto to send packets without connecting. Is this supposed to work? If so, then my patch is indeed inappropriate. If not, then that needs fixing also. Ross --------------enigD148A6950C18B5194DE33259 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBm8LC9bR4xmappRARAqNJAKCs6TwkFyR/ammEiK+B1VsDT0zqDwCfUpi0 OfFWZzLkSFoq9Fn+aQyi338= =0AW9 -----END PGP SIGNATURE----- --------------enigD148A6950C18B5194DE33259-- From akpm@osdl.org Wed Nov 17 13:40:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 13:40:49 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHLeiX7008593 for ; Wed, 17 Nov 2004 13:40:44 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAHLeB926628; Wed, 17 Nov 2004 13:40:11 -0800 Date: Wed, 17 Nov 2004 13:44:25 -0800 From: Andrew Morton To: "John W. Linville" Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [patch 2.6.10-rc2] 3c59x: reload EEPROM values at rmmod for needy cards Message-Id: <20041117134425.62034944.akpm@osdl.org> In-Reply-To: <20041117160122.A4824@tuxdriver.com> References: <20041117160122.A4824@tuxdriver.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11927 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev "John W. Linville" wrote: > > 3c905 cards need an additional bit unmasked in the reset at rmmod or > else they don't get reinitialized properly when the driver is reloaded. This has been in -mm kernels since you first sent it out. I'm intending to hold off until post-2.6.10 so we get a full kernel cycle for any problems to get shaken out. From shemminger@osdl.org Wed Nov 17 15:18:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 15:18:44 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHNIcBU011385 for ; Wed, 17 Nov 2004 15:18:39 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAHNIDPE000851 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 17 Nov 2004 15:18:14 -0800 Date: Wed, 17 Nov 2004 15:21:16 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] random: remove TCP MD4 code if !CONFIG_INET Message-Id: <20041117152116.6934bfa9@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11928 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev The code in the random driver for tcp sequence number randomization is only needed if INET is configured. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/char/random.c b/drivers/char/random.c --- a/drivers/char/random.c 2004-11-17 15:19:35 -08:00 +++ b/drivers/char/random.c 2004-11-17 15:19:35 -08:00 @@ -2046,6 +2046,7 @@ * ********************************************************************/ +#ifdef CONFIG_INET /* * TCP initial sequence number picking. This uses the random number * generator to pick an initial secret value. This value is hashed @@ -2445,3 +2446,4 @@ return (cookie - tmp[17]) & COOKIEMASK; /* Leaving the data behind */ } #endif +#endif /* CONFIG_INET */ From shemminger@osdl.org Wed Nov 17 15:27:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 15:27:56 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAHNRnHw011918 for ; Wed, 17 Nov 2004 15:27:49 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAHNRMPE001636 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 17 Nov 2004 15:27:22 -0800 Date: Wed, 17 Nov 2004 15:30:25 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: Michael Vittrup Larsen , netdev@oss.sgi.com Subject: [PATCH] tcp: efficient port randomisation (revised) Message-Id: <20041117153025.160eaa04@zqx3.pdx.osdl.net> In-Reply-To: <200411051103.59032.michael.vittrup.larsen@ericsson.com> References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411020854.44745.michael.vittrup.larsen@ericsson.com> <20041104100104.570e67cd@dxpl.pdx.osdl.net> <200411051103.59032.michael.vittrup.larsen@ericsson.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11929 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Here is a more conservative version of earlier patch vthat keeps the same port rover locking and global port rover. This randomizes TCP ephemeral ports of incoming connections using variation of existing sequence number hash. Thanks to original author Michael Larsen. http://www.ietf.org/internet-drafts/draft-larsen-tsvwg-port-randomisation-00.txt It behaves correctly if someone is perverse and sets low > high and it separates the outgoing port rover (tcp_port_rover) from the incoming port rover (start_rover). Signed-off-by: Stephen Hemminger diff -Nru a/drivers/char/random.c b/drivers/char/random.c --- a/drivers/char/random.c 2004-11-17 15:21:43 -08:00 +++ b/drivers/char/random.c 2004-11-17 15:21:43 -08:00 @@ -2347,6 +2347,24 @@ return halfMD4Transform(hash, keyptr->secret); } +/* Generate secure starting point for ephemeral TCP port search */ +u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport) +{ + struct keydata *keyptr = get_keyptr(); + u32 hash[4]; + + /* + * Pick a unique starting offset for each ephemeral port search + * (saddr, daddr, dport) and 48bits of random data. + */ + hash[0] = saddr; + hash[1] = daddr; + hash[2] = dport ^ keyptr->secret[10]; + hash[3] = keyptr->secret[11]; + + return halfMD4Transform(hash, keyptr->secret); +} + #ifdef CONFIG_SYN_COOKIES /* * Secure SYN cookie computation. This is the algorithm worked out by diff -Nru a/include/linux/random.h b/include/linux/random.h --- a/include/linux/random.h 2004-11-17 15:21:43 -08:00 +++ b/include/linux/random.h 2004-11-17 15:21:43 -08:00 @@ -52,6 +52,7 @@ void generate_random_uuid(unsigned char uuid_out[16]); extern __u32 secure_ip_id(__u32 daddr); +extern u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport); extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, __u16 sport, __u16 dport); extern __u32 secure_tcp_syn_cookie(__u32 saddr, __u32 daddr, diff -Nru a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c --- a/net/ipv4/tcp_ipv4.c 2004-11-17 15:21:43 -08:00 +++ b/net/ipv4/tcp_ipv4.c 2004-11-17 15:21:43 -08:00 @@ -636,6 +636,13 @@ return -EADDRNOTAVAIL; } +static inline u32 connect_port_offset(const struct sock *sk) +{ + const struct inet_opt *inet = inet_sk(sk); + return secure_tcp_port_ephemeral(inet->rcv_saddr, inet->daddr, + inet->dport); +} + /* * Bind a port for a connect operation and hash it. */ @@ -647,10 +654,12 @@ int ret; if (!snum) { - int rover; - int low = sysctl_local_port_range[0]; - int high = sysctl_local_port_range[1]; - int remaining = (high - low) + 1; + const u16 low = sysctl_local_port_range[0]; + const u16 high = sysctl_local_port_range[1]; + u16 rover = low; + int remaining = (high-low) + 1; + u32 offset = connect_port_offset(sk); + static u32 rover_start; struct hlist_node *node; struct tcp_tw_bucket *tw = NULL; @@ -660,7 +669,7 @@ * tcp_portalloc_lock before next submission to Linus. * As soon as we touch this place at all it is time to think. * - * Now it protects single _advisory_ variable tcp_port_rover, + * Now it protects single _advisory_ variable rover_start, * hence it is mostly useless. * Code will work nicely if we just delete it, but * I am afraid in contented case it will work not better or @@ -670,12 +679,9 @@ * memory pingpong. Any ideas how to do this in a nice way? */ spin_lock(&tcp_portalloc_lock); - rover = tcp_port_rover; - - do { - rover++; - if ((rover < low) || (rover > high)) - rover = low; + while (remaining > 0) { + rover = low + (rover_start + offset) % + (high - low); head = &tcp_bhash[tcp_bhashfn(rover)]; spin_lock(&head->lock); @@ -706,8 +712,9 @@ next_port: spin_unlock(&head->lock); - } while (--remaining > 0); - tcp_port_rover = rover; + --remaining; + ++rover_start; + } spin_unlock(&tcp_portalloc_lock); local_bh_enable(); @@ -716,7 +723,6 @@ ok: /* All locks still held and bhs disabled */ - tcp_port_rover = rover; spin_unlock(&tcp_portalloc_lock); tcp_bind_hash(sk, tb, rover); From ross.axe@blueyonder.co.uk Wed Nov 17 16:10:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 16:10:19 -0800 (PST) Received: from smtp-out5.blueyonder.co.uk (smtp-out5.blueyonder.co.uk [195.188.213.8]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI0ABQ1013135 for ; Wed, 17 Nov 2004 16:10:11 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out5.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Thu, 18 Nov 2004 00:10:20 +0000 Message-ID: <419BE847.90307@blueyonder.co.uk> Date: Thu, 18 Nov 2004 00:09:43 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Ross Kendall Axe CC: netdev@oss.sgi.com, Stephen Smalley , lkml , jmorris@redhat.com, chrisw@osdl.org Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <4197A037.1020307@blueyonder.co.uk> <1100525477.31773.38.camel@moss-spartans.epoch.ncsc.mil> <20041116004122.V14339@build.pdx.osdl.net> <419BC2C2.6020100@blueyonder.co.uk> In-Reply-To: <419BC2C2.6020100@blueyonder.co.uk> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig49C53ACCF8B12CA95AB09638" X-OriginalArrivalTime: 18 Nov 2004 00:10:20.0468 (UTC) FILETIME=[FDC96740:01C4CD02] X-archive-position: 11930 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig49C53ACCF8B12CA95AB09638 Content-Type: multipart/mixed; boundary="------------060605050504050302020502" This is a multi-part message in MIME format. --------------060605050504050302020502 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Ross Kendall Axe wrote: > > > A possibility that hadn't occurred to me was using sendto to send packets > without connecting. Is this supposed to work? If so, then my patch is > indeed inappropriate. If not, then that needs fixing also. > > Ross > Well, my reading of socket(2) suggests that it's _not_ supposed to work. This patch causes sendmsg on SOCK_SEQPACKET unix domain sockets to return EISCONN or ENOTSUPP as appropriate if the 'to' address is specified. It also causes recvmsg to return EINVAL on unconnected sockets. This behaviour is consistent with SOCK_STREAM sockets. signed-off-by: Ross Axe --------------060605050504050302020502 Content-Type: text/x-patch; name="unix-SOCK_SEQPACKET-unconnected-fix-2.6.10-rc2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="unix-SOCK_SEQPACKET-unconnected-fix-2.6.10-rc2.patch" --- linux-2.6.10-rc2/net/unix/af_unix.c.orig 2004-11-17 22:26:38.000000000 +0000 +++ linux-2.6.10-rc2/net/unix/af_unix.c 2004-11-17 23:13:37.000000000 +0000 @@ -1272,6 +1272,11 @@ static int unix_dgram_sendmsg(struct kio goto out; if (msg->msg_namelen) { + if (sk->sk_type == SOCK_SEQPACKET) { + err = sk->sk_state == TCP_ESTABLISHED + ? -EISCONN : -EOPNOTSUPP; + goto out; + } err = unix_mkname(sunaddr, msg->msg_namelen, &hash); if (err < 0) goto out; @@ -1531,6 +1536,11 @@ static int unix_dgram_recvmsg(struct kio struct sk_buff *skb; int err; + err = -EINVAL; + if (sk->sk_type == SOCK_SEQPACKET && + sk->sk_state != TCP_ESTABLISHED) + goto out; + err = -EOPNOTSUPP; if (flags&MSG_OOB) goto out; --------------060605050504050302020502-- --------------enig49C53ACCF8B12CA95AB09638 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBm+hM9bR4xmappRARAmeWAJ9hJYj2natS8n9IFjw/Xwvw3qWhkACcCQfY voPbHXw4XGjkXUp7esA9d+A= =sl9m -----END PGP SIGNATURE----- --------------enig49C53ACCF8B12CA95AB09638-- From davem@davemloft.net Wed Nov 17 16:21:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 16:21:19 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI0L5NU016924 for ; Wed, 17 Nov 2004 16:21:06 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUZnl-0008Ek-00; Wed, 17 Nov 2004 16:05:29 -0800 Date: Wed, 17 Nov 2004 16:05:29 -0800 From: "David S. Miller" To: Arnaldo Carvalho de Melo Cc: netdev@oss.sgi.com Subject: Re: [PATCH][NET] Assign inet transport sockets to the right module Message-Id: <20041117160529.6d7be54a.davem@davemloft.net> In-Reply-To: <41984A76.70406@conectiva.com.br> References: <41984A76.70406@conectiva.com.br> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11931 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 15 Nov 2004 04:19:34 -0200 Arnaldo Carvalho de Melo wrote: > Please take a look if it makes sense, if so please pull from: > > bk://kernel.bkbits.net/acme/sock-2.6 This really does fix bugs, so I've pulled it into my 2.6.10 pending tree. Thanks a lot Arnaldo. From max@stro.at Wed Nov 17 18:14:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 18:14:52 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI2Ekk4005997 for ; Wed, 17 Nov 2004 18:14:47 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id 97D3C5C00B; Thu, 18 Nov 2004 03:14:24 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 00023-05; Thu, 18 Nov 2004 03:14:24 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id E1B915C00A; Thu, 18 Nov 2004 03:14:23 +0100 (CET) Received: from max by sputnik with local (Exim 4.34) id 1CUboX-00017R-L6; Thu, 18 Nov 2004 03:14:25 +0100 Date: Thu, 18 Nov 2004 03:14:25 +0100 From: maximilian attems To: Pavel Machek Cc: netdev@oss.sgi.com, Daniele Venzano Subject: Re: sis900 oops on resume Message-ID: <20041118021425.GA2128@stro.at> Mail-Followup-To: Pavel Machek , netdev@oss.sgi.com, Daniele Venzano References: <20041117182403.GC2252@stro.at> <20041117201008.GA11439@elf.ucw.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041117201008.GA11439@elf.ucw.cz> User-Agent: Mutt/1.5.6+20040722i X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 11932 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev On Wed, 17 Nov 2004, Pavel Machek wrote: > Hi! > > > happens since the use of guessnet, > > guessnet is based on divine and sends arp requests to network. > > network was down after the oops, but beside resume system worked. > > And where do you see the oops? Irq 10 does not work, that's only > backtrace. Fix the sis900 driver... > > Pavel ok, i'm not that familiar with suspend pathes, what's going wrong in sis900_resume() or sis900_suspend()? maks From jmorris@redhat.com Wed Nov 17 19:43:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 19:43:18 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI3h8bZ010685 for ; Wed, 17 Nov 2004 19:43:12 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAI3gcGC016571; Wed, 17 Nov 2004 22:42:43 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAI3gcr31825; Wed, 17 Nov 2004 22:42:38 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAI3gZhu016120; Wed, 17 Nov 2004 22:42:35 -0500 Date: Wed, 17 Nov 2004 22:42:37 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Ross Kendall Axe cc: netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <419BE847.90307@blueyonder.co.uk> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11933 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Ross Kendall Axe wrote: > Ross Kendall Axe wrote: > > > > A possibility that hadn't occurred to me was using sendto to send packets > > without connecting. Is this supposed to work? If so, then my patch is > > indeed inappropriate. If not, then that needs fixing also. > > > > Well, my reading of socket(2) suggests that it's _not_ supposed to work. sendto() on a non connected socket should fail with ENOTCONN. > This patch causes sendmsg on SOCK_SEQPACKET unix domain sockets to return > EISCONN or ENOTSUPP as appropriate if the 'to' address is specified. For sendto(): The address must be ignored on a connected mode socket (i.e. in this case). According to the send(2) man page, we may return EISCONN if the address and addr length are not NULL and zero. I think that the man page is incorrect. Posix says that EISCONN means "A destination address was specified and the socket is already connected", not "A destination address was specified and the socket is connected mode". i.e. we should only return EISCONN if the socket is in a connected state. I'm not sure if we should return any error at all if an address is supplied to sendto() on SOCK_SEQPACKET. We're only required to ignore it. I would say that we should return an error as it is likely a progamming mistake in the application and we should let them know. However, as mentioned above, I don't think EISCONN is appropriate in this case. EINVAL might be better. > It also causes recvmsg to return EINVAL on unconnected sockets. This > behaviour is consistent with SOCK_STREAM sockets. This seems incorrect too, Posix says to use ENOTCONN. There is a non SELinux-related bug lurking in this code. I got this oops when trying to kill a modified version of seqpacket-crash which keeps sending in a loop and uses sendto() and an address with SOCK_SEQPACKET. ------------[ cut here ]------------ kernel BUG at include/asm/spinlock.h:133! invalid operand: 0000 [#1] PREEMPT SMP Modules linked in: ipv6 binfmt_misc video ac e1000 3c59x CPU: 0 EIP: 0060:[] Not tainted VLI EFLAGS: 00010282 (2.6.10-rc2) EIP is at _spin_lock_bh+0x4b/0x55 eax: 0000000e ebx: f757b04c ecx: c038c60c edx: 00000292 esi: f757b04c edi: f73f096c ebp: c1bf8ed4 esp: c1bf8ec8 ds: 007b es: 007b ss: 0068 Process seqpacket-crash (pid: 4989, threadinfo=c1bf8000 task=f75fd530) Stack: c034c39c c02c171e f757b02c c1bf8ee4 c02c171e f79448d4 f73f098c c1bf8f0c c02be9d4 f73f0960 f757b02c 00000000 00000000 ffffffff f73f098c 00000000 dfff3b20 c1bf8f1c c02be96b 00000000 f79448d4 c1bf8f38 c0151b2c f73f098c Call Trace: [] show_stack+0x7a/0x90 [] show_registers+0x152/0x1ca [] die+0x100/0x184 [] do_invalid_op+0xd2/0xea [] error_code+0x2b/0x30 [] lock_sock+0x20/0x50 [] sock_fasync+0x45/0x147 [] sock_close+0x19/0x3d [] __fput+0x11d/0x15b [] filp_close+0x42/0x74 [] put_files_struct+0x87/0xfc [] do_exit+0x17b/0x48d [] do_group_exit+0x32/0x9e [] sysenter_past_esp+0x52/0x -------------------- i.e.: static inline void _raw_spin_lock(spinlock_t *lock) { #ifdef CONFIG_DEBUG_SPINLOCK if (unlikely(lock->magic != SPINLOCK_MAGIC)) { printk("eip: %p\n", __builtin_return_address(0)); BUG(); } #endif - James -- James Morris From jmorris@redhat.com Wed Nov 17 20:26:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 20:26:09 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI4Q47C014933 for ; Wed, 17 Nov 2004 20:26:04 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAI4PeA0026131; Wed, 17 Nov 2004 23:25:40 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAI4Pdr08736; Wed, 17 Nov 2004 23:25:39 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAI4Pbhu018454; Wed, 17 Nov 2004 23:25:37 -0500 Date: Wed, 17 Nov 2004 23:25:39 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Ross Kendall Axe cc: netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11934 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Wed, 17 Nov 2004, James Morris wrote: > There is a non SELinux-related bug lurking in this code. I also got this when trying to kill the server (which seems to run at 100% during exit after receving a message sent with sendto() + address): Badness in sk_del_node_init at include/net/sock.h:343 [] dump_stack+0x17/0x19 [] __unix_remove_socket+0x64/0x66 [] unix_release_sock+0x2b/0x259 [] sock_release+0x7a/0xda [] sock_close+0x21/0x3d [] __fput+0x11d/0x15b [] filp_close+0x42/0x74 [] sysenter_past_esp+0x52/0x71 Which is: static __inline__ int sk_del_node_init(struct sock *sk) { int rc = __sk_del_node_init(sk); if (rc) { /* paranoid for a while -acme */ WARN_ON(atomic_read(&sk->sk_refcnt) == 1); <-- here - James -- James Morris From akpm@osdl.org Wed Nov 17 21:18:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 21:19:03 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI5Iw99016021 for ; Wed, 17 Nov 2004 21:18:58 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAI5IY911493; Wed, 17 Nov 2004 21:18:34 -0800 Date: Wed, 17 Nov 2004 21:18:22 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: bugtracker@surasoft.com Subject: Fw: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use Message-Id: <20041117211822.243aa8bd.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11935 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Well this is novel. I'd be suspecting a hardware problem. Are you sure the power supply isn't overloaded, or in need of replacement? Begin forwarded message: Date: Wed, 17 Nov 2004 21:13:36 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use http://bugme.osdl.org/show_bug.cgi?id=3765 Summary: Network link down, when writting to sata disk AND network in use Kernel Version: linux-kernel 2.6.9 Status: NEW Severity: high Owner: other_other@kernel-bugs.osdl.org Submitter: bugtracker@surasoft.com Distribution: Gentoo Hardware Environment: P4 2.66ghz Motherboard: ASUS P4PE (with onboard lan) Promise Sata150 TX4 PCI (sata expansion card) Software Environment: Kernel 2.6.9 - onboard LAN: driver in use - "Broadcom 4400 ethernet support" compiled into kernel - Promise Sata150 TX4 PCI (sata expansion card) - Driver "Promise SATA TX2/TX4 support" compiled into kernel - 200GB Western Digital SATA drive attached to PCI sata card Problem Description: If data is being copied to the SATA drive (eg from another DISK which is on motherboard IDE controller) AND I start a network data transfer where data is goung through the Broadcom lan the following occurs (from kernel log) Nov 18 11:43:10 synapse b44: eth0: Link is down. Nov 18 11:43:15 synapse b44: eth0: Link is up at 100 Mbps, full duplex. Nov 18 11:43:15 synapse b44: eth0: Flow control is on for TX and on for RX. Nov 18 11:43:19 synapse b44: eth0: Link is down. Nov 18 11:43:21 synapse b44: eth0: Link is up at 100 Mbps, full duplex. Link keeps going up and down, as long as there's data movment from the SATA drive, and a network movement (network download doesn't have to be saving to the sata drive) I've disabled APCI, problem persits. Steps to reproduce: 1. copy data to Sata drive CONNECTED to PCI controller 2. Download file from network via onboard LAN, doesn't matter which drive you save it 3. Onboards lan "link" goes up and down, causing disruption to network useage. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From chrisw@osdl.org Wed Nov 17 22:08:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 22:08:36 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI68SE4017287 for ; Wed, 17 Nov 2004 22:08:29 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAI680918049; Wed, 17 Nov 2004 22:08:00 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAI67xH13243; Wed, 17 Nov 2004 22:07:59 -0800 Date: Wed, 17 Nov 2004 22:07:59 -0800 From: Chris Wright To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041117220756.N2357@build.pdx.osdl.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Wed, Nov 17, 2004 at 11:25:39PM -0500 X-archive-position: 11936 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > On Wed, 17 Nov 2004, James Morris wrote: > > > There is a non SELinux-related bug lurking in this code. > > I also got this when trying to kill the server (which seems to run at 100% > during exit after receving a message sent with sendto() + address): I was seeing similar with my test (w/out SELinux), but got garbage for back trace. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From surakshan@surasoft.com Wed Nov 17 22:33:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 22:33:59 -0800 (PST) Received: from asclepius.uwa.edu.au ([130.95.128.60]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI6XhJ9018164 for ; Wed, 17 Nov 2004 22:33:46 -0800 Received: from asclepius.kas (localhost.localdomain [127.0.0.1]) by asclepius.uwa.edu.au (Postfix) with SMTP id 33DD1183985; Thu, 18 Nov 2004 14:32:07 +0800 (WST) Received: from asclepius (localhost.localdomain [127.0.0.1]) by asclepius.prekas (Postfix) with SMTP id 18314183F56; Thu, 18 Nov 2004 14:32:07 +0800 (WST) X-UWA-Client-IP: 130.95.190.50 (UWA) Received: from stmc50.stmc.uwa.edu.au (stmc50.stmc.uwa.edu.au [130.95.190.50]) by asclepius.input (Postfix) with ESMTP id 0176D183985; Thu, 18 Nov 2004 14:32:02 +0800 (WST) Subject: Re: Fw: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use From: Surakshan Mendis To: Andrew Morton Cc: netdev@oss.sgi.com, bugtracker@surasoft.com In-Reply-To: <20041117211822.243aa8bd.akpm@osdl.org> References: <20041117211822.243aa8bd.akpm@osdl.org> Content-Type: text/plain Date: Thu, 18 Nov 2004 14:33:04 +0800 Message-Id: <1100759584.11758.0.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-SpamTest-Info: Profile: Formal (161/041116) X-SpamTest-Info: Profile: Detect Hard [UCS 290904] X-SpamTest-Info: Profile: SysLog X-SpamTest-Info: Profile: Marking Spam - Subject (UCS) [02-08-04] X-SpamTest-Status: Not detected X-SpamTest-Version: SMTP-Filter Version 2.0.0 [0125], KAS/Release X-archive-position: 11937 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: surakshan@surasoft.com Precedence: bulk X-list: netdev Yes quite strange. I've reproduced the issue again after doing the following a) disconnecting extra fan, disconnecting extra HDD, disconnecting cd/dvd rom drives. In fact it was probably consume power less than ever. b) I moved the sata cable to a different connector, same issue. Can't do much with onboard network card, since its onboard.. I'm perplexed why the link goes up and down like this. The syslog doesn't indiciate more than link is up and link is down. Network is stable when no activity on the sata drive. Network goes does when there is activity on the drive AND I do something network related, just getting a large ftp directory listing in mozilla triggers the "Link is down". As I said before this only happens when the drive is in use as well Surakshan On Wed, 2004-11-17 at 21:18 -0800, Andrew Morton wrote: > > Well this is novel. I'd be suspecting a hardware problem. Are you sure > the power supply isn't overloaded, or in need of replacement? > > > Begin forwarded message: > > Date: Wed, 17 Nov 2004 21:13:36 -0800 > From: bugme-daemon@osdl.org > To: bugme-new@lists.osdl.org > Subject: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use > > > http://bugme.osdl.org/show_bug.cgi?id=3765 > > Summary: Network link down, when writting to sata disk AND > network in use > Kernel Version: linux-kernel 2.6.9 > Status: NEW > Severity: high > Owner: other_other@kernel-bugs.osdl.org > Submitter: bugtracker@surasoft.com > > > Distribution: Gentoo > > Hardware Environment: > P4 2.66ghz > Motherboard: ASUS P4PE (with onboard lan) > Promise Sata150 TX4 PCI (sata expansion card) > > Software Environment: > Kernel 2.6.9 > - onboard LAN: driver in use > - "Broadcom 4400 ethernet support" compiled into kernel > > - Promise Sata150 TX4 PCI (sata expansion card) > - Driver "Promise SATA TX2/TX4 support" compiled into kernel > - 200GB Western Digital SATA drive attached to PCI sata card > > Problem Description: > If data is being copied to the SATA drive (eg from another DISK which is on > motherboard IDE controller) AND I start a network data transfer where data is > goung through the Broadcom lan the following occurs (from kernel log) > > Nov 18 11:43:10 synapse b44: eth0: Link is down. > Nov 18 11:43:15 synapse b44: eth0: Link is up at 100 Mbps, full duplex. > Nov 18 11:43:15 synapse b44: eth0: Flow control is on for TX and on for RX. > Nov 18 11:43:19 synapse b44: eth0: Link is down. > Nov 18 11:43:21 synapse b44: eth0: Link is up at 100 Mbps, full duplex. > > Link keeps going up and down, as long as there's data movment from the SATA > drive, and a network movement (network download doesn't have to be saving to the > sata drive) > > I've disabled APCI, problem persits. > > Steps to reproduce: > 1. copy data to Sata drive CONNECTED to PCI controller > 2. Download file from network via onboard LAN, doesn't matter which drive you > save it > 3. Onboards lan "link" goes up and down, causing disruption to network useage. > > ------- You are receiving this mail because: ------- > You are on the CC list for the bug, or are watching someone who is. > > From ross.axe@blueyonder.co.uk Wed Nov 17 23:26:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 17 Nov 2004 23:26:13 -0800 (PST) Received: from smtp-out5.blueyonder.co.uk (smtp-out5.blueyonder.co.uk [195.188.213.8]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI7Q6Mm019641 for ; Wed, 17 Nov 2004 23:26:07 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out5.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Thu, 18 Nov 2004 07:26:16 +0000 Message-ID: <419C4E72.5050307@blueyonder.co.uk> Date: Thu, 18 Nov 2004 07:25:38 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: James Morris CC: netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: In-Reply-To: X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigFA96D0167C4E289837EFC6F4" X-OriginalArrivalTime: 18 Nov 2004 07:26:16.0546 (UTC) FILETIME=[E4062C20:01C4CD3F] X-archive-position: 11938 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigFA96D0167C4E289837EFC6F4 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit James Morris wrote: > On Thu, 18 Nov 2004, Ross Kendall Axe wrote: > > >>Ross Kendall Axe wrote: >> >>>A possibility that hadn't occurred to me was using sendto to send packets >>>without connecting. Is this supposed to work? If so, then my patch is >>>indeed inappropriate. If not, then that needs fixing also. >>> >> >>Well, my reading of socket(2) suggests that it's _not_ supposed to work. > > > sendto() on a non connected socket should fail with ENOTCONN. > > >>This patch causes sendmsg on SOCK_SEQPACKET unix domain sockets to return >>EISCONN or ENOTSUPP as appropriate if the 'to' address is specified. > > > For sendto(): > > The address must be ignored on a connected mode socket (i.e. in this > case). > > According to the send(2) man page, we may return EISCONN if the address > and addr length are not NULL and zero. I think that the man page is > incorrect. Posix says that EISCONN means "A destination address was > specified and the socket is already connected", not "A destination address > was specified and the socket is connected mode". i.e. we should only > return EISCONN if the socket is in a connected state. > The man page then goes on to say "the error ENOTCONN is returned when the socket was not actually connected". Admittedly, this is not what my patch does; it returns ENOTSUPP, as do SOCK_STREAM sockets. > I'm not sure if we should return any error at all if an address is > supplied to sendto() on SOCK_SEQPACKET. We're only required to ignore it. > > I would say that we should return an error as it is likely a progamming > mistake in the application and we should let them know. This was, after all, the point of the patch. Well, that and closing the security hole opened by my earlier patch :-) > > However, as mentioned above, I don't think EISCONN is appropriate in this > case. EINVAL might be better. > I would say that ENOTSUPP all the time would be more sensible. However, my choice of error codes was determined by the ones used by SOCK_STREAM. SOCK_SEQPACKET and SOCK_STREAM should use the same error codes, I would say. Further, they should use the codes specified by POSIX. > >>It also causes recvmsg to return EINVAL on unconnected sockets. This >>behaviour is consistent with SOCK_STREAM sockets. > > > This seems incorrect too, Posix says to use ENOTCONN. That seems eminently sensible. Again, I was just cut-n'-pasting from SOCK_STREAM. If these error codes are wrong, then SOCK_STREAM also needs fixing. > > There is a non SELinux-related bug lurking in this code. IMHO, there never was an SELinux bug here. SELinux merely exposed an existing bug. > I got this oops > when trying to kill a modified version of seqpacket-crash which keeps > sending in a loop and uses sendto() and an address with SOCK_SEQPACKET. > I'm unable to reproduce that, or the bug you mention in your other message. Care to send us your code? > > - James I think that af_unix.c needs a bit of cleaning up. All of the functions are named as being stream vs dgram, even when the issue is connectionless vs connection-oriented. For example, unix_connectionless_connect would make a lot more sense than unix_dgram_connect. sendmsg and recvmsg are the worst since they require a mixture of SOCK_STREAM and SOCK_DGRAM semantics. It would be nice to rewite unix_dgram_recvmsg and unix_stream_recvmsg as four helper functions dealing with the connectionless, connection-oriented, datagram and stream operations and then have 3 wrapper functions (one for each socket type) calling the appropriate helpers. This is all strictly IMHO, of course. Ross --------------enigFA96D0167C4E289837EFC6F4 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBnE559bR4xmappRARAtfvAJwIitwnMWlUhuwv/CPP0N8nlDlUfACfUrE8 QXR2N7qu6sN8E3ebYRTcD1k= =xPML -----END PGP SIGNATURE----- --------------enigFA96D0167C4E289837EFC6F4-- From jmorris@redhat.com Thu Nov 18 00:00:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 00:00:24 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI80J85020831 for ; Thu, 18 Nov 2004 00:00:19 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAI7xnej007374; Thu, 18 Nov 2004 02:59:54 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAI7xhr11204; Thu, 18 Nov 2004 02:59:44 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAI7xfhu029088; Thu, 18 Nov 2004 02:59:41 -0500 Date: Thu, 18 Nov 2004 02:59:43 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Ross Kendall Axe cc: netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <419C4E72.5050307@blueyonder.co.uk> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11939 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Ross Kendall Axe wrote: > That seems eminently sensible. Again, I was just cut-n'-pasting from > SOCK_STREAM. If these error codes are wrong, then SOCK_STREAM also needs > fixing. An issue here though is that what impact will this have on existing applications? > > > > There is a non SELinux-related bug lurking in this code. > > IMHO, there never was an SELinux bug here. SELinux merely exposed an > existing bug. Looks like it, testing a fix now. > I'm unable to reproduce that, or the bug you mention in your other > message. Care to send us your code? See http://people.redhat.com/jmorris/net/seqpacket-killer-jm.tar.bz2 > I think that af_unix.c needs a bit of cleaning up. All of the functions > are named as being stream vs dgram, even when the issue is connectionless > vs connection-oriented. Agreed. - James -- James Morris From jmorris@redhat.com Thu Nov 18 00:28:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 00:28:18 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI8S9F9024993 for ; Thu, 18 Nov 2004 00:28:11 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAI8Rh1N013849; Thu, 18 Nov 2004 03:27:43 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAI8Rhr15602; Thu, 18 Nov 2004 03:27:43 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAI8Rfhu030561; Thu, 18 Nov 2004 03:27:41 -0500 Date: Thu, 18 Nov 2004 03:27:42 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Ross Kendall Axe cc: netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11940 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev Here's a fix for the SELinux related problem. What's happening is that mixing stream and dgram ops for SEQPACKET is having some unfortunate side effects. One of these is that there is a race between client sendmsg() and server accept(). The server child socket is attached via sock_graft() after the client has entered unix_dgram_sendmsg() and called security_unix_may_send(sk->sk_socket, other->sk_socket); other->sk_socket will thus be null, causing the oops in SELinux and any other LSM which tries to dereference the pointer. The fix is a combination of some of Ross's ideas: 1) SOCK_SEQPACKET is connection oriented, and there no need to call security_unix_may_send() for each packet. security_unix_stream_connect() is sufficient. 2) Ensure that unix_dgram_sendmsg() fails for SOCK_SEQPACKET sockets which are not connected, otherwise someone could bypass LSM by sending on an unconnected socket. Note that this only solves the problem for the LSM hook. Patch below, please review. The other issue discussed -- server goes into a hard loop (and/or various lock/refcount related bugs) when the client sends a message via sendto() with an address supplied -- needs to be resolved separately. --- net/unix/af_unix.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff -purN -X dontdiff linux-2.6.10-rc2.o/net/unix/af_unix.c linux-2.6.10-rc2.w/net/unix/af_unix.c --- linux-2.6.10-rc2.o/net/unix/af_unix.c 2004-11-15 13:18:56.000000000 -0500 +++ linux-2.6.10-rc2.w/net/unix/af_unix.c 2004-11-18 02:54:03.283777544 -0500 @@ -1261,6 +1261,9 @@ static int unix_dgram_sendmsg(struct kio long timeo; struct scm_cookie tmp_scm; + if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) + return -ENOTCONN; + if (NULL == siocb->scm) siocb->scm = &tmp_scm; err = scm_send(sock, msg, siocb->scm); @@ -1354,9 +1357,11 @@ restart: if (other->sk_shutdown & RCV_SHUTDOWN) goto out_unlock; - err = security_unix_may_send(sk->sk_socket, other->sk_socket); - if (err) - goto out_unlock; + if (sk->sk_type != SOCK_SEQPACKET) { + err = security_unix_may_send(sk->sk_socket, other->sk_socket); + if (err) + goto out_unlock; + } if (unix_peer(other) != sk && (skb_queue_len(&other->sk_receive_queue) > From webvenza@libero.it Thu Nov 18 00:44:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 00:44:59 -0800 (PST) Received: from gateway.milesteg.arr (venza@adsl-96-231.38-151.net24.it [151.38.231.96]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI8irMv025663 for ; Thu, 18 Nov 2004 00:44:54 -0800 Date: Thu, 18 Nov 2004 09:44:31 +0100 From: Daniele Venzano To: maximilian attems Cc: NetDev , Pavel Machek Subject: Re: sis900 oops on resume Message-ID: <20041118084431.GA13870@gateway.milesteg.arr> Mail-Followup-To: maximilian attems , NetDev , Pavel Machek References: <20041117182403.GC2252@stro.at> <20041117201008.GA11439@elf.ucw.cz> <20041118021425.GA2128@stro.at> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118021425.GA2128@stro.at> X-Operating-System: Debian GNU/Linux on kernel Linux 2.4.27-grsec X-Copyright: Forwarding or publishing without permission is prohibited. X-Truth: La vita e' una questione di culo, o ce l'hai o te lo fanno. X-GPG-Fingerprint: 642A A345 1CEF B6E3 925C 23CE DAB9 8764 25B3 57ED User-Agent: Mutt/1.5.6i X-archive-position: 11941 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webvenza@libero.it Precedence: bulk X-list: netdev On Thu, Nov 18, 2004 at 03:14:25AM +0100, maximilian attems wrote: > On Wed, 17 Nov 2004, Pavel Machek wrote: > > > happens since the use of guessnet, > > > guessnet is based on divine and sends arp requests to network. > > > network was down after the oops, but beside resume system worked. > > > > And where do you see the oops? Irq 10 does not work, that's only > > backtrace. Fix the sis900 driver... > > ok, i'm not that familiar with suspend pathes, > what's going wrong in sis900_resume() or sis900_suspend()? I'm aware of this problem, sis900 looses the first interrupt after resume, I have to check the code. On my tests the card, after that lost interrupt, worked normally. Is that your case, or do you have a non working sis900 after resume ? -- ----------------------------- Daniele Venzano Web: http://teg.homeunix.org From max@stro.at Thu Nov 18 01:46:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 01:46:28 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAI9kNiI029904 for ; Thu, 18 Nov 2004 01:46:24 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id 53C575C00B; Thu, 18 Nov 2004 10:46:01 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 20450-06; Thu, 18 Nov 2004 10:46:00 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id B03BE5C00A; Thu, 18 Nov 2004 10:46:00 +0100 (CET) Received: from max by sputnik with local (Exim 4.34) id 1CUira-0001Cl-PX; Thu, 18 Nov 2004 10:46:02 +0100 Date: Thu, 18 Nov 2004 10:46:02 +0100 From: maximilian attems To: NetDev , Pavel Machek Subject: Re: sis900 oops on resume Message-ID: <20041118094602.GB2287@stro.at> Mail-Followup-To: NetDev , Pavel Machek References: <20041117182403.GC2252@stro.at> <20041117201008.GA11439@elf.ucw.cz> <20041118021425.GA2128@stro.at> <20041118084431.GA13870@gateway.milesteg.arr> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118084431.GA13870@gateway.milesteg.arr> User-Agent: Mutt/1.5.6+20040722i X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 11942 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Daniele Venzano wrote: > On Thu, Nov 18, 2004 at 03:14:25AM +0100, maximilian attems wrote: > > On Wed, 17 Nov 2004, Pavel Machek wrote: > > > > happens since the use of guessnet, > > > > guessnet is based on divine and sends arp requests to network. > > > > network was down after the oops, but beside resume system worked. > > > > > > And where do you see the oops? Irq 10 does not work, that's only > > > backtrace. Fix the sis900 driver... > > > > ok, i'm not that familiar with suspend pathes, > > what's going wrong in sis900_resume() or sis900_suspend()? > > I'm aware of this problem, sis900 looses the first interrupt after > resume, I have to check the code. > On my tests the card, after that lost interrupt, worked normally. Is > that your case, or do you have a non working sis900 after resume ? well it works, as long as i do not use guessnet(8), as described in the bug report, but the lost interrupt is reported on every resume. -- maks From alchemyx@uznam.net.pl Thu Nov 18 03:28:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 03:28:06 -0800 (PST) Received: from mail.uznam.net.pl (postfix@gandalf.uznam.net.pl [195.135.236.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIBRupX002138 for ; Thu, 18 Nov 2004 03:27:59 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.uznam.net.pl (Postfix) with ESMTP id F08F312F1E; Thu, 18 Nov 2004 12:27:33 +0100 (CET) Received: from mail.uznam.net.pl ([195.135.236.2]) by localhost (gandalf.uznam.net.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 00514-07; Thu, 18 Nov 2004 12:27:33 +0100 (CET) Received: from [195.135.237.2] (cerber.uznam.net.pl [195.135.237.2]) by mail.uznam.net.pl (Postfix) with ESMTP id 26A4A12F12; Thu, 18 Nov 2004 12:27:33 +0100 (CET) Message-ID: <419C8724.20006@uznam.net.pl> Date: Thu, 18 Nov 2004 12:27:32 +0100 From: =?ISO-8859-2?Q?Micha=B3_Margula?= User-Agent: Mozilla Thunderbird 0.8 (X11/20041104) X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Andrew Morton Cc: Bart De Schuymer , netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups References: <20041115122046.1413527e.akpm@osdl.org> <200411152146.02851.bdschuym@pandora.be> <20041115124843.4c3dd72f.akpm@osdl.org> In-Reply-To: <20041115124843.4c3dd72f.akpm@osdl.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at uznam.net.pl X-archive-position: 11943 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alchemyx@uznam.net.pl Precedence: bulk X-list: netdev > > >Bart De Schuymer wrote: > > >>>Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such problem >>>on 2.4.26. >>> >>> >>Can you do something similar with iptables rules to see if it's specific to >>ebtables (which I doubt)? >> >> Over 50 hours after converting rules from ebtables to iptables and still no lockup. Everything is fine and I am sure it will go stable for days (as mentioned before lockup with ebtables happens in less than 24 hours). -- Micha Margula, alchemyx@uznam.net.pl, http://alchemyx.uznam.net.pl/ "W yciu pikne s tylko chwile" [Ryszard Riedel] From chrisw@osdl.org Thu Nov 18 08:45:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 08:45:27 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIGjJ2B018714 for ; Thu, 18 Nov 2004 08:45:20 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAIGio911218; Thu, 18 Nov 2004 08:44:50 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAIGiou12380; Thu, 18 Nov 2004 08:44:50 -0800 Date: Thu, 18 Nov 2004 08:44:49 -0800 From: Chris Wright To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118084449.Z14339@build.pdx.osdl.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Thu, Nov 18, 2004 at 03:27:42AM -0500 X-archive-position: 11944 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > What's happening is that mixing stream and dgram ops for SEQPACKET is > having some unfortunate side effects. Agreed. > One of these is that there is a race between client sendmsg() and server > accept(). The server child socket is attached via sock_graft() after the > client has entered unix_dgram_sendmsg() and called > > security_unix_may_send(sk->sk_socket, other->sk_socket); > > other->sk_socket will thus be null, causing the oops in SELinux and any > other LSM which tries to dereference the pointer. Yup. And it's not much of a race, the window is wide open. One malicious app simply has to do: bind() listen() connect() send() <-- Oops > The fix is a combination of some of Ross's ideas: > > 1) SOCK_SEQPACKET is connection oriented, and there no need to call > security_unix_may_send() for each packet. security_unix_stream_connect() > is sufficient. Why not make a unix_seq_sendmsg, which is a very small wrapper? e.g. static int unix_seq_sendmsg(struct kiocb *kiocb, struct socket *sock, struct msghdr *msg, size_t len) { struct sock *sk = sock->sk; if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) return -ENOTCONN; if (msg->msg_name || msg->msg_namelen) return -EINVAL; return unix_dgram_sendmsg(kiocb, sock, msg, len); } Also, I missed how MSG_EOR is honored. > 2) Ensure that unix_dgram_sendmsg() fails for SOCK_SEQPACKET sockets which > are not connected, otherwise someone could bypass LSM by sending on an > unconnected socket. Agreed, not connected, it should fail IMHO. > Note that this only solves the problem for the LSM hook. Does the above stop the other issue? My laptop died, so I'm not able to test ATM. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From jmorris@redhat.com Thu Nov 18 09:02:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:02:21 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIH2Gqj019572 for ; Thu, 18 Nov 2004 09:02:17 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAIH1e09003246; Thu, 18 Nov 2004 12:01:45 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAIH1Yr04568; Thu, 18 Nov 2004 12:01:34 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAIH1Whu000620; Thu, 18 Nov 2004 12:01:32 -0500 Date: Thu, 18 Nov 2004 12:01:34 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Chris Wright cc: Ross Kendall Axe , , Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <20041118084449.Z14339@build.pdx.osdl.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11945 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Chris Wright wrote: > Why not make a unix_seq_sendmsg, which is a very small wrapper? Good idea, patch forthcoming. > Does the above stop the other issue? My laptop died, so I'm not able to > test ATM. No, it seems to be caused when addrlen in sendto() is non-zero, causing unix_find_other() to be called instead of unix_peer_get(), which is screwing up reference counts. As for MSG_EOR, apart from the generic socket code, nothing is being done. This would be a separate issue. - James -- James Morris From chrisw@osdl.org Thu Nov 18 09:07:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:07:40 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIH7YTe019986 for ; Thu, 18 Nov 2004 09:07:34 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAIH76915786; Thu, 18 Nov 2004 09:07:06 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAIH76I13061; Thu, 18 Nov 2004 09:07:06 -0800 Date: Thu, 18 Nov 2004 09:07:06 -0800 From: Chris Wright To: James Morris Cc: Chris Wright , Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118090706.O2357@build.pdx.osdl.net> References: <20041118084449.Z14339@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Thu, Nov 18, 2004 at 12:01:34PM -0500 X-archive-position: 11946 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > On Thu, 18 Nov 2004, Chris Wright wrote: > > > Why not make a unix_seq_sendmsg, which is a very small wrapper? > > Good idea, patch forthcoming. > > > Does the above stop the other issue? My laptop died, so I'm not able to > > test ATM. > > No, it seems to be caused when addrlen in sendto() is non-zero, causing > unix_find_other() to be called instead of unix_peer_get(), which is > screwing up reference counts. Right, but the snippet I posted guards against that I think. It forces unix_peer_get() in dgram_sendmsg. > As for MSG_EOR, apart from the generic socket code, nothing is being done. > This would be a separate issue. Yup, just noting the bits that looked broken to me. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From jmorris@redhat.com Thu Nov 18 09:11:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:11:48 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIHBiFw020392 for ; Thu, 18 Nov 2004 09:11:44 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAIHBJJ4006457; Thu, 18 Nov 2004 12:11:19 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAIHBJr08398; Thu, 18 Nov 2004 12:11:19 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAIHBGhu001424; Thu, 18 Nov 2004 12:11:16 -0500 Date: Thu, 18 Nov 2004 12:11:18 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Chris Wright cc: Ross Kendall Axe , , Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <20041118090706.O2357@build.pdx.osdl.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11947 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Chris Wright wrote: > Right, but the snippet I posted guards against that I think. It forces > unix_peer_get() in dgram_sendmsg. Correct. We could also add more code to dgram_sendmsg() to simply ignore any address passed in for SOCK_SEQPACKETs, but again, I think that is a programming error and I think we should signal that, especially as this is a new feature. - James -- James Morris From jmorris@redhat.com Thu Nov 18 09:25:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:25:57 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIHPq16021753 for ; Thu, 18 Nov 2004 09:25:52 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAIHPLKY011860; Thu, 18 Nov 2004 12:25:27 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAIHPLr15122; Thu, 18 Nov 2004 12:25:21 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAIHPJhu002805; Thu, 18 Nov 2004 12:25:19 -0500 Date: Thu, 18 Nov 2004 12:25:21 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Chris Wright cc: Ross Kendall Axe , , Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11948 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev Updated patch below (with Chris Wright's wrapper idea). This now fixes both issues. 1) Don't call security_unix_may_send() hook during sendmsg() for SOCK_SEQPACKET, and ensure that sendmsg() can only be called on a connected socket so as not to bypass the security_unix_stream_connect() hook. 2) Return -EINVAL if sendto() is called on SOCK_SEQPACKET with an address supplied. Please review and apply if ok. Signed-off-by: James Morris --- net/unix/af_unix.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-) diff -purN -X dontdiff linux-2.6.10-rc2.o/net/unix/af_unix.c linux-2.6.10-rc2.w2/net/unix/af_unix.c --- linux-2.6.10-rc2.o/net/unix/af_unix.c 2004-11-15 13:18:56.000000000 -0500 +++ linux-2.6.10-rc2.w2/net/unix/af_unix.c 2004-11-18 12:09:44.255462368 -0500 @@ -466,6 +466,8 @@ static int unix_dgram_recvmsg(struct kio struct msghdr *, size_t, int); static int unix_dgram_connect(struct socket *, struct sockaddr *, int, int); +static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, + struct msghdr *, size_t); static struct proto_ops unix_stream_ops = { .family = PF_UNIX, @@ -524,7 +526,7 @@ static struct proto_ops unix_seqpacket_o .shutdown = unix_shutdown, .setsockopt = sock_no_setsockopt, .getsockopt = sock_no_getsockopt, - .sendmsg = unix_dgram_sendmsg, + .sendmsg = unix_seqpacket_sendmsg, .recvmsg = unix_dgram_recvmsg, .mmap = sock_no_mmap, .sendpage = sock_no_sendpage, @@ -1354,9 +1356,11 @@ restart: if (other->sk_shutdown & RCV_SHUTDOWN) goto out_unlock; - err = security_unix_may_send(sk->sk_socket, other->sk_socket); - if (err) - goto out_unlock; + if (sk->sk_type != SOCK_SEQPACKET) { + err = security_unix_may_send(sk->sk_socket, other->sk_socket); + if (err) + goto out_unlock; + } if (unix_peer(other) != sk && (skb_queue_len(&other->sk_receive_queue) > @@ -1506,6 +1510,20 @@ out_err: return sent ? : err; } +static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, + struct msghdr *msg, size_t len) +{ + struct sock *sk = sock->sk; + + if (sk->sk_state != TCP_ESTABLISHED) + return -ENOTCONN; + + if (msg->msg_name || msg->msg_namelen) + return -EINVAL; + + return unix_dgram_sendmsg(kiocb, sock, msg, len); +} + static void unix_copy_addr(struct msghdr *msg, struct sock *sk) { struct unix_sock *u = unix_sk(sk); From alan@lxorguk.ukuu.org.uk Thu Nov 18 09:49:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:49:10 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIHn4ff022383 for ; Thu, 18 Nov 2004 09:49:05 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iAIGjHG7006235; Thu, 18 Nov 2004 16:45:18 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iAIGjGaq006234; Thu, 18 Nov 2004 16:45:16 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Alan Cox To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1100796294.6019.8.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Thu, 18 Nov 2004 16:45:14 +0000 X-archive-position: 11949 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Iau, 2004-11-18 at 03:42, James Morris wrote: > > Well, my reading of socket(2) suggests that it's _not_ supposed to work. > > sendto() on a non connected socket should fail with ENOTCONN. Not entirely true at all. A network protocol can implement lazy binding and do implicit binding on the sendto. Other protocols might not actually have a receiving component so have no bind() functionality at all. > According to the send(2) man page, we may return EISCONN if the address > and addr length are not NULL and zero. I think that the man page is > incorrect. Posix says that EISCONN means "A destination address was > specified and the socket is already connected", not "A destination address > was specified and the socket is connected mode". i.e. we should only > return EISCONN if the socket is in a connected state. POSIX 1003.1g draft 6.4 permits a user to pass a "null" address for various things. Indeed some systems implement send() as sendto() with a NULL, 0 address component and some user space does likewise. It also has a lot to say on the other cases although I don't think it ever fully got past draft state. You also want to look at TCP/IP illustrated to see some of the assumptions handed down from on high by BSD and which should not be broken. From alan@lxorguk.ukuu.org.uk Thu Nov 18 09:52:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:52:45 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIHqeSF022757 for ; Thu, 18 Nov 2004 09:52:40 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iAIGn66i006239; Thu, 18 Nov 2004 16:49:06 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iAIGn3a6006238; Thu, 18 Nov 2004 16:49:04 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Alan Cox To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1100796518.6019.11.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Thu, 18 Nov 2004 16:49:00 +0000 X-archive-position: 11950 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Iau, 2004-11-18 at 08:27, James Morris wrote: > 2) Ensure that unix_dgram_sendmsg() fails for SOCK_SEQPACKET sockets which > are not connected, otherwise someone could bypass LSM by sending on an > unconnected socket. What about half closed and other connected states ? This patch seems inadequate for things like X.25 From afleming@freescale.com Thu Nov 18 09:52:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 09:53:02 -0800 (PST) Received: from motgate3.mot.com (motgate3.mot.com [144.189.100.103]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIHquQR022858 for ; Thu, 18 Nov 2004 09:52:57 -0800 Received: from az33exr04.mot.com (pobox4.mot.com [10.64.251.243]) by motgate3.mot.com (8.12.11/Motgate3) with ESMTP id iAIHuRnH018596; Thu, 18 Nov 2004 10:56:31 -0700 (MST) Received: from [10.82.16.241] ([10.82.16.241]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id iAIFq3Tp012259; Thu, 18 Nov 2004 09:52:03 -0600 In-Reply-To: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> Mime-Version: 1.0 (Apple Message framework v619) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> Content-Transfer-Encoding: 7bit Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org From: Andy Fleming Subject: Re: [PATCH] MII bus API for PHY devices Date: Thu, 18 Nov 2004 11:52:25 -0600 To: jason.mcmullan@timesys.com X-Mailer: Apple Mail (2.619) X-archive-position: 11951 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: afleming@freescale.com Precedence: bulk X-list: netdev Replying this to the netdev list for their perusal. First, I'm flattered that you've based this on the gianfar phy code, which I stole shamelessly from Benh's code, but Benh changed his code, and so I stole once more (the sungem_phy code he mentioned). The current 2.6.9 gianfar driver has a completely different PHY infrastructure. One which is a better model, I think, for abstraction than my previous code. Which brings me to item #2: I have taken the code from the previous patch, and combined it with my newer PHY code, which should ease the way for someone to add some of the WOL features, and such. I have compiled, and tested this code, and it works with the gianfar driver. However, I've got a few questions for the network device community, on how best to finish this off. The primary issue is how to classify the MII bus. Should it be a proper bus, fitting within the new driver model? This seems like the proper method to me, since the MII bus is, in fact, a bus. But it's a bit of a strange bus. The bus is attached at two ends. One end has some number of PHY devices, and the corresponding drivers for them. The other end has some number of ethernet controllers, and their drivers. So we have 3 implementation decisions which are affected by this: 1) How should we pass initialization information from the system to the bus. Information like which irq to use for each PHY, and what the address space for the bus's controls is. I would like to enforce encapsulation so that the ethernet drivers don't need to know this information, or pass it to the bus. 2) How should we reflect the dependency of the ethernet driver on the mii bus driver? 3) How should we bind ethernet drivers to PHY drivers? Oh, and a 4th side-issue: Should each PHY have its own file? Or should we dump all the PHY drivers in one file? And if so, should THAT file be separate from the mii bus implementation file? Andy Fleming Open Source Team Freescale Semiconductor, Inc From alan@lxorguk.ukuu.org.uk Thu Nov 18 10:01:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:01:51 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAII1jNn023645 for ; Thu, 18 Nov 2004 10:01:46 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iAIGwB1A006248; Thu, 18 Nov 2004 16:58:11 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iAIGw9od006247; Thu, 18 Nov 2004 16:58:09 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Alan Cox To: James Morris Cc: Chris Wright , Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1100797066.6019.20.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Thu, 18 Nov 2004 16:58:07 +0000 X-archive-position: 11952 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Iau, 2004-11-18 at 17:25, James Morris wrote: > 1) Don't call security_unix_may_send() hook during sendmsg() for > SOCK_SEQPACKET, and ensure that sendmsg() can only be called on a > connected socket so as not to bypass the security_unix_stream_connect() > hook. > > 2) Return -EINVAL if sendto() is called on SOCK_SEQPACKET with an address > supplied. Consider shutdown(). A sendmsg into shutdown must return the pending ECONNRESET first. From jmorris@redhat.com Thu Nov 18 10:28:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:29:03 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIISvlA024401 for ; Thu, 18 Nov 2004 10:28:57 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAIISNAf001611; Thu, 18 Nov 2004 13:28:23 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAIISNr07223; Thu, 18 Nov 2004 13:28:23 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAIISLhu008061; Thu, 18 Nov 2004 13:28:21 -0500 Date: Thu, 18 Nov 2004 13:28:23 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Alan Cox cc: Ross Kendall Axe , , Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <1100796294.6019.8.camel@localhost.localdomain> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11953 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Alan Cox wrote: > On Iau, 2004-11-18 at 03:42, James Morris wrote: > > > Well, my reading of socket(2) suggests that it's _not_ supposed to work. > > > > sendto() on a non connected socket should fail with ENOTCONN. > > Not entirely true at all. A network protocol can implement lazy binding > and do implicit binding on the sendto. Other protocols might not > actually have a receiving component so have no bind() functionality at > all. I got this from the Linux man page for sendto(): If sendto is used on a connection-mode (SOCK_STREAM, SOCK_SEQPACKET) socket, the parameters to and tolen are ignored (and the error EISCONN may be returned when they are not NULL and 0), and the error ENOTCONN is returned when the socket was not actually connected. And Posix 1003.1 offers the following error code for sendto(): The sendto() function shall fail if: ... [ENOTCONN] The socket is connection-mode but is not connected. (I'm not saying you're wrong). > POSIX 1003.1g draft 6.4 permits a user to pass a "null" address for > various things. Indeed some systems implement send() as sendto() with a > NULL, 0 address component and some user space does likewise. It also has > a lot to say on the other cases although I don't think it ever fully got > past draft state. sendto() with a NULL address will still work fine. - James -- James Morris From chrisw@osdl.org Thu Nov 18 10:34:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:34:47 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIIYe6p024763 for ; Thu, 18 Nov 2004 10:34:41 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAIIYC902178; Thu, 18 Nov 2004 10:34:12 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAIIYCV15753; Thu, 18 Nov 2004 10:34:12 -0800 Date: Thu, 18 Nov 2004 10:34:11 -0800 From: Chris Wright To: Alan Cox Cc: James Morris , Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118103411.P2357@build.pdx.osdl.net> References: <1100796294.6019.8.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <1100796294.6019.8.camel@localhost.localdomain>; from alan@lxorguk.ukuu.org.uk on Thu, Nov 18, 2004 at 04:45:14PM +0000 X-archive-position: 11954 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * Alan Cox (alan@lxorguk.ukuu.org.uk) wrote: > On Iau, 2004-11-18 at 03:42, James Morris wrote: > > > Well, my reading of socket(2) suggests that it's _not_ supposed to work. > > > > sendto() on a non connected socket should fail with ENOTCONN. > > Not entirely true at all. A network protocol can implement lazy binding > and > do implicit binding on the sendto. Other protocols might not actually > have > a receiving component so have no bind() functionality at all. Just to be clear, this fix is not at socket layer, but specific to UNIX domain socket protocol layer. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From jmorris@redhat.com Thu Nov 18 10:41:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:41:12 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIIf7BB025197 for ; Thu, 18 Nov 2004 10:41:08 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAIIefWt006003; Thu, 18 Nov 2004 13:40:41 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAIIear12233; Thu, 18 Nov 2004 13:40:36 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAIIeYhu009112; Thu, 18 Nov 2004 13:40:34 -0500 Date: Thu, 18 Nov 2004 13:40:35 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Alan Cox cc: Ross Kendall Axe , , Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <1100796518.6019.11.camel@localhost.localdomain> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11955 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Alan Cox wrote: > On Iau, 2004-11-18 at 08:27, James Morris wrote: > > 2) Ensure that unix_dgram_sendmsg() fails for SOCK_SEQPACKET sockets which > > are not connected, otherwise someone could bypass LSM by sending on an > > unconnected socket. > > What about half closed and other connected states ? This patch seems > inadequate for things like X.25 The patch only affects the Unix code and does not change existing semantics for other connected states. One thing that looks broken (unrelated to the patch I posted) is that unix_dgram_sendmsg() already does not check sk->sk_shutdown & SEND_SHUTDOWN for SOCK_SEQPACKET. - James -- James Morris From roland@topspin.com Thu Nov 18 10:46:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:46:51 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIIkbOo025593 for ; Thu, 18 Nov 2004 10:46:37 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 10:46:17 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 10:46:17 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CUrII-0008Ax-U5; Thu, 18 Nov 2004 10:46:17 -0800 Cc: netdev@oss.sgi.com In-Reply-To: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> X-Mailer: roland_patchbomb Date: Thu, 18 Nov 2004 10:46:10 -0800 Message-Id: <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> Mime-Version: 1.0 To: roland@topspin.com From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 18 Nov 2004 18:46:17.0599 (UTC) FILETIME=[E358C8F0:01C4CD9E] X-archive-position: 11956 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add a driver that implements the (IPoIB) IP-over-InfiniBand protocol. This is a network device driver of type ARPHRD_INFINIBAND (and addr_len 20 bytes). The ARP/ND implementation for this driver is not completely straightforward, because InfiniBand requires an additional path lookup be performed (through an IB-specific mechanism) after a remote hardware address has been resolved. We are very open to suggestions of a better way to handle this than the current implementation. The IPoIB protocol/encapsulation is described in the Internet-Drafts http://www.ietf.org/internet-drafts/draft-ietf-ipoib-architecture-04.txt http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Roland Dreier Index: linux-bk/drivers/infiniband/Kconfig =================================================================== --- linux-bk.orig/drivers/infiniband/Kconfig 2004-11-18 10:43:30.511089415 -0800 +++ linux-bk/drivers/infiniband/Kconfig 2004-11-18 10:43:32.436806329 -0800 @@ -8,6 +8,7 @@ any protocols you wish to use as well as drivers for your InfiniBand hardware. +source "drivers/infiniband/ulp/Kconfig" source "drivers/infiniband/hw/Kconfig" endmenu Index: linux-bk/drivers/infiniband/Makefile =================================================================== --- linux-bk.orig/drivers/infiniband/Makefile 2004-11-18 10:43:30.485093236 -0800 +++ linux-bk/drivers/infiniband/Makefile 2004-11-18 10:43:32.412809856 -0800 @@ -1 +1 @@ -obj-$(CONFIG_INFINIBAND) += core/ hw/ +obj-$(CONFIG_INFINIBAND) += core/ ulp/ hw/ Index: linux-bk/drivers/infiniband/ulp/Kconfig =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/Kconfig 2004-11-18 10:43:32.532792218 -0800 @@ -0,0 +1,33 @@ +config INFINIBAND_IPOIB + tristate "IP-over-InfiniBand" + depends on INFINIBAND && NETDEVICES && INET + ---help--- + Support for the IP-over-InfiniBand protocol (IPoIB). This + transports IP packets over InfiniBand so you can use your IB + device as a fancy NIC. + + The IPoIB protocol is defined by the IETF ipoib working + group: . + +config INFINIBAND_IPOIB_DEBUG + bool "IP-over-InfiniBand debugging" + depends on INFINIBAND_IPOIB + ---help--- + This option causes debugging code to be compiled into the + IPoIB driver. The output can be turned on via the + debug_level and mcast_debug_level module parameters (which + can also be set after the driver is loaded through sysfs). + + This option also creates an "ipoib_debugfs," which can be + mounted to expose debugging information about IB multicast + groups used by the IPoIB driver. + +config INFINIBAND_IPOIB_DEBUG_DATA + bool "IP-over-InfiniBand data path debugging" + depends on INFINIBAND_IPOIB_DEBUG + ---help--- + This option compiles debugging code into the the data path + of the IPoIB driver. The output can be turned on by setting + the debug_level parameter to 2; however, even with output + turned off, this debugging code will have some performance + impact. Index: linux-bk/drivers/infiniband/ulp/Makefile =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/Makefile 2004-11-18 10:43:32.496797510 -0800 @@ -0,0 +1 @@ +obj-$(CONFIG_INFINIBAND_IPOIB) += ipoib/ Index: linux-bk/drivers/infiniband/ulp/ipoib/Makefile =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/Makefile 2004-11-18 10:43:32.592783399 -0800 @@ -0,0 +1,14 @@ +EXTRA_CFLAGS += -Idrivers/infiniband/include + +obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o + +ib_ipoib-objs := \ + ipoib_main.o \ + ipoib_ib.o \ + ipoib_multicast.o \ + ipoib_verbs.o \ + ipoib_vlan.o + +ifeq ($(CONFIG_INFINIBAND_IPOIB_DEBUG),y) + ib_ipoib-objs += ipoib_fs.o +endif Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib.h 2004-11-18 10:43:32.615780019 -0800 @@ -0,0 +1,311 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib.h 1254 2004-11-17 17:19:12Z roland $ + */ + +#ifndef _IPOIB_H +#define _IPOIB_H + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ipoib_proto.h" + +#include +#include +#include + +/* constants */ + +enum { + IPOIB_PACKET_SIZE = 2048, + IPOIB_BUF_SIZE = IPOIB_PACKET_SIZE + IB_GRH_BYTES, + + IPOIB_ENCAP_LEN = 4, + IPOIB_HW_ADDR_LEN = 20, + + IPOIB_RX_RING_SIZE = 128, + IPOIB_TX_RING_SIZE = 64, + + IPOIB_NUM_WC = 4, + + IPOIB_MAX_PATH_REC_QUEUE = 3, + IPOIB_MAX_MCAST_QUEUE = 3, + + IPOIB_FLAG_TX_FULL = 0, + IPOIB_FLAG_OPER_UP = 1, + IPOIB_FLAG_ADMIN_UP = 2, + IPOIB_PKEY_ASSIGNED = 3, + IPOIB_PKEY_STOP = 4, + IPOIB_FLAG_SUBINTERFACE = 5, + IPOIB_MCAST_RUN = 6, + IPOIB_STOP_REAPER = 7, + + IPOIB_MAX_BACKOFF_SECONDS = 16, + + IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ + IPOIB_MCAST_FLAG_SENDONLY = 1, + IPOIB_MCAST_FLAG_BUSY = 2, /* joining or already joined */ + IPOIB_MCAST_FLAG_ATTACHED = 3, +}; + +/* structs */ + +struct ipoib_header { + u16 proto; + u16 reserved; +}; + +struct ipoib_pseudoheader { + u8 hwaddr[IPOIB_HW_ADDR_LEN]; +}; + +struct ipoib_mcast; + +struct ipoib_buf { + struct sk_buff *skb; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +struct ipoib_dev_priv { + spinlock_t lock; + + struct net_device *dev; + + unsigned long flags; + + struct semaphore mcast_mutex; + + struct ipoib_mcast *broadcast; + struct list_head multicast_list; + struct rb_root multicast_tree; + + struct work_struct pkey_task; + struct work_struct mcast_task; + struct work_struct flush_task; + struct work_struct restart_task; + struct work_struct ah_reap_task; + + struct ib_device *ca; + u8 port; + u16 pkey; + struct ib_pd *pd; + struct ib_mr *mr; + struct ib_cq *cq; + struct ib_qp *qp; + u32 qkey; + + union ib_gid local_gid; + u16 local_lid; + + unsigned int admin_mtu; + unsigned int mcast_mtu; + + struct ipoib_buf *rx_ring; + + struct ipoib_buf *tx_ring; + unsigned tx_head; + unsigned tx_tail; + + struct ib_wc ibwc[IPOIB_NUM_WC]; + + struct list_head dead_ahs; + + struct ib_event_handler event_handler; + + struct net_device_stats stats; + + struct net_device *parent; + struct list_head child_intfs; + struct list_head list; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG + struct dentry *mcg_dentry; +#endif +}; + +struct ipoib_ah { + struct net_device *dev; + struct ib_ah *ah; + struct list_head list; + struct kref ref; + unsigned last_send; +}; + +struct ipoib_path { + struct ipoib_ah *ah; + struct sk_buff_head queue; + + struct net_device *dev; + struct neighbour *neighbour; +}; + +#define IPOIB_PATH(neigh) (*(struct ipoib_path **) ((neigh)->ha + 24)) + +extern struct workqueue_struct *ipoib_workqueue; + +/* list of IPoIB network devices */ +extern struct semaphore ipoib_device_mutex; +extern struct list_head ipoib_device_list; + +/* functions */ + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr); +void ipoib_free_ah(struct kref *kref); +static inline void ipoib_put_ah(struct ipoib_ah *ah) +{ + kref_put(&ah->ref, ipoib_free_ah); +} + +int ipoib_add_pkey_attr(struct net_device *dev); + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn); +void ipoib_reap_ah(void *dev_ptr); + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *format); + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_ib_dev_flush(void *dev); +void ipoib_ib_dev_cleanup(struct net_device *dev); + +int ipoib_ib_dev_open(struct net_device *dev); +int ipoib_ib_dev_up(struct net_device *dev); +int ipoib_ib_dev_down(struct net_device *dev); +int ipoib_ib_dev_stop(struct net_device *dev); + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_dev_cleanup(struct net_device *dev); + +void ipoib_mcast_join_task(void *dev_ptr); +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb); + +void ipoib_mcast_restart_task(void *dev_ptr); +int ipoib_mcast_start_thread(struct net_device *dev); +int ipoib_mcast_stop_thread(struct net_device *dev); + +void ipoib_mcast_dev_down(struct net_device *dev); +void ipoib_mcast_dev_flush(struct net_device *dev); + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter); +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *gid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only); + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); + +int ipoib_qp_create(struct net_device *dev); +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca); +void ipoib_transport_dev_cleanup(struct net_device *dev); + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey); +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey); + +void ipoib_pkey_poll(void *dev); +int ipoib_pkey_dev_delay_open(struct net_device *dev); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int ipoib_create_debug_file(struct net_device *dev); +void ipoib_delete_debug_file(struct net_device *dev); +int ipoib_register_debugfs(void); +void ipoib_unregister_debugfs(void); +#else +static inline int ipoib_create_debug_file(struct net_device *dev) { return 0; } +static inline void ipoib_delete_debug_file(struct net_device *dev) { } +static inline int ipoib_register_debugfs(void) { return 0; } +static inline void ipoib_unregister_debugfs(void) { } +#endif + + +#define ipoib_printk(level, priv, format, arg...) \ + printk(level "%s: " format, ((struct ipoib_dev_priv *) priv)->dev->name , ## arg) +#define ipoib_warn(priv, format, arg...) \ + ipoib_printk(KERN_WARNING, priv, format , ## arg) + + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +extern int debug_level; +extern int mcast_debug_level; + +#define ipoib_dbg(priv, format, arg...) \ + do { \ + if (debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { \ + if (mcast_debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG */ +#define ipoib_dbg(priv, format, arg...) \ + do { (void) (priv); } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG */ + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define ipoib_dbg_data(priv, format, arg...) \ + do { \ + if (debug_level > 1) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ +#define ipoib_dbg_data(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ + + +#define IPOIB_GID_FMT "%x:%x:%x:%x:%x:%x:%x:%x" + +#define IPOIB_GID_ARG(gid) be16_to_cpup((__be16 *) ((gid).raw + 0)), \ + be16_to_cpup((__be16 *) ((gid).raw + 2)), \ + be16_to_cpup((__be16 *) ((gid).raw + 4)), \ + be16_to_cpup((__be16 *) ((gid).raw + 6)), \ + be16_to_cpup((__be16 *) ((gid).raw + 8)), \ + be16_to_cpup((__be16 *) ((gid).raw + 10)), \ + be16_to_cpup((__be16 *) ((gid).raw + 12)), \ + be16_to_cpup((__be16 *) ((gid).raw + 14)) + +#endif /* _IPOIB_H */ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2004-11-18 10:43:32.639776491 -0800 @@ -0,0 +1,247 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id$ + */ + +#include +#include + +#include "ipoib.h" + +enum { + IPOIB_MAGIC = 0x49504942 /* "IPIB" */ +}; + +static struct dentry *ipoib_root; +static struct super_block *ipoib_sb; + +static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos) +{ + struct ipoib_mcast_iter *iter; + loff_t n = *pos; + + iter = ipoib_mcast_iter_init(file->private); + if (!iter) + return NULL; + + while (n--) { + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + } + + return iter; +} + +static void *ipoib_mcg_seq_next(struct seq_file *file, void *iter_ptr, + loff_t *pos) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + + (*pos)++; + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +static void ipoib_mcg_seq_stop(struct seq_file *file, void *iter_ptr) +{ + /* nothing for now */ +} + +static int ipoib_mcg_seq_show(struct seq_file *file, void *iter_ptr) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + char gid_buf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"]; + union ib_gid mgid; + int i, n; + unsigned long created; + unsigned int queuelen, complete, send_only; + + if (iter) { + ipoib_mcast_iter_read(iter, &mgid, &created, &queuelen, + &complete, &send_only); + + for (n = 0, i = 0; i < sizeof mgid / 2; ++i) { + n += sprintf(gid_buf + n, "%x", + be16_to_cpu(((u16 *)mgid.raw)[i])); + if (i < sizeof mgid / 2 - 1) + gid_buf[n++] = ':'; + } + } + + seq_printf(file, "GID: %*s", -(1 + (int) sizeof gid_buf), gid_buf); + + seq_printf(file, + " created: %10ld queuelen: %4d complete: %d send_only: %d\n", + created, queuelen, complete, send_only); + + return 0; +} + +static struct seq_operations ipoib_seq_ops = { + .start = ipoib_mcg_seq_start, + .next = ipoib_mcg_seq_next, + .stop = ipoib_mcg_seq_stop, + .show = ipoib_mcg_seq_show, +}; + +static int ipoib_mcg_open(struct inode *inode, struct file *file) +{ + struct seq_file *seq; + int ret; + + ret = seq_open(file, &ipoib_seq_ops); + if (ret) + return ret; + + seq = file->private_data; + seq->private = inode->u.generic_ip; + + return 0; +} + +static struct file_operations ipoib_fops = { + .owner = THIS_MODULE, + .open = ipoib_mcg_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +static struct inode *ipoib_get_inode(void) +{ + struct inode *inode = new_inode(ipoib_sb); + + if (inode) { + inode->i_mode = S_IFREG | S_IRUGO; + inode->i_uid = 0; + inode->i_gid = 0; + inode->i_blksize = PAGE_CACHE_SIZE; + inode->i_blocks = 0; + inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; + inode->i_fop = &ipoib_fops; + } + + return inode; +} + +int ipoib_create_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dentry *dentry; + struct inode *inode; + char name[IFNAMSIZ + sizeof "_mcg"]; + + if (!ipoib_sb) + return 0; + + snprintf(name, sizeof name, "%s_mcg", dev->name); + + dentry = d_alloc_name(ipoib_root, name); + if (!dentry) + return -ENOMEM; + + inode = ipoib_get_inode(); + if (!inode) { + dput(dentry); + return -ENOMEM; + } + + inode->u.generic_ip = dev; + priv->mcg_dentry = dentry; + + d_add(dentry, inode); + + return 0; +} + +void ipoib_delete_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (ipoib_sb && priv->mcg_dentry) { + d_drop(priv->mcg_dentry); + simple_unlink(ipoib_root->d_inode, priv->mcg_dentry); + } +} + +static int ipoib_fill_super(struct super_block *sb, void *data, int silent) +{ + static struct tree_descr ipoib_files[] = { + { "" } + }; + struct ipoib_dev_priv *priv; + int ret; + + printk(KERN_DEBUG "ipoib_fill_super called.\n"); + + ret = simple_fill_super(sb, IPOIB_MAGIC, ipoib_files); + if (ret) + return ret; + + ipoib_root = sb->s_root; + ipoib_sb = sb; + + down(&ipoib_device_mutex); + list_for_each_entry(priv, &ipoib_device_list, list) { + ret = ipoib_create_debug_file(priv->dev); + if (ret) + break; + } + up(&ipoib_device_mutex); + + return ret; +} + +static struct super_block *ipoib_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) +{ + return get_sb_single(fs_type, flags, data, ipoib_fill_super); +} + +static void ipoib_kill_sb(struct super_block *sb) +{ + ipoib_sb = NULL; + kill_litter_super(sb); +} + +static struct file_system_type ipoib_fs_type = { + .owner = THIS_MODULE, + .name = "ipoib_debugfs", + .get_sb = ipoib_get_sb, + .kill_sb = ipoib_kill_sb, +}; + +int ipoib_register_debugfs(void) +{ + return register_filesystem(&ipoib_fs_type); +} + +void ipoib_unregister_debugfs(void) +{ + unregister_filesystem(&ipoib_fs_type); +} Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_ib.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2004-11-18 10:43:32.674771347 -0800 @@ -0,0 +1,626 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_ib.c 1254 2004-11-17 17:19:12Z roland $ + */ + +#include + +#include + +#include "ipoib.h" + +#define IPOIB_OP_RECV (1ul << 31) + +static DECLARE_MUTEX(pkey_sem); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr) +{ + struct ipoib_ah *ah; + + ah = kmalloc(sizeof *ah, GFP_KERNEL); + if (!ah) + return NULL; + + ah->dev = dev; + ah->last_send = 0; + kref_init(&ah->ref); + + ah->ah = ib_create_ah(pd, attr); + if (IS_ERR(ah->ah)) { + kfree(ah); + ah = NULL; + } else + ipoib_dbg(netdev_priv(dev), "Created ah %p\n", ah->ah); + + return ah; +} + +void ipoib_free_ah(struct kref *kref) +{ + struct ipoib_ah *ah = container_of(kref, struct ipoib_ah, ref); + struct ipoib_dev_priv *priv = netdev_priv(ah->dev); + + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + if (ah->last_send <= priv->tx_tail) { + ipoib_dbg(priv, "Freeing ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } else + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static inline int ipoib_ib_receive(struct ipoib_dev_priv *priv, + unsigned int wr_id, + dma_addr_t addr) +{ + struct ib_sge list = { + .addr = addr, + .length = IPOIB_BUF_SIZE, + .lkey = priv->mr->lkey, + }; + struct ib_recv_wr param = { + .wr_id = wr_id | IPOIB_OP_RECV, + .sg_list = &list, + .num_sge = 1, + .recv_flags = IB_RECV_SIGNALED + }; + struct ib_recv_wr *bad_wr; + + return ib_post_recv(priv->qp, ¶m, &bad_wr); +} + +static int ipoib_ib_post_receive(struct net_device *dev, int id) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *skb; + dma_addr_t addr; + int ret; + + skb = dev_alloc_skb(IPOIB_BUF_SIZE + 4); + if (!skb) { + ipoib_warn(priv, "failed to allocate receive buffer\n"); + + priv->rx_ring[id].skb = NULL; + return -ENOMEM; + } + skb_reserve(skb, 4); /* 16 byte align IP header */ + priv->rx_ring[id].skb = skb; + addr = pci_map_single(priv->ca->dma_device, + skb->data, IPOIB_BUF_SIZE, + PCI_DMA_FROMDEVICE); + pci_unmap_addr_set(&priv->rx_ring[id], mapping, addr); + + ret = ipoib_ib_receive(priv, id, addr); + if (ret) { + ipoib_warn(priv, "ipoib_ib_receive failed for buf %d (%d)\n", + id, ret); + priv->rx_ring[id].skb = NULL; + } + + return ret; +} + +static int ipoib_ib_post_receives(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) { + if (ipoib_ib_post_receive(dev, i)) { + ipoib_warn(priv, "ipoib_ib_post_receive failed for buf %d\n", i); + return -EIO; + } + } + + return 0; +} + +static void ipoib_ib_handle_wc(struct net_device *dev, + struct ib_wc *wc) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned int wr_id = wc->wr_id; + + ipoib_dbg_data(priv, "called: id %d, op %d, status: %d\n", + wr_id, wc->opcode, wc->status); + + if (wr_id & IPOIB_OP_RECV) { + wr_id &= ~IPOIB_OP_RECV; + + if (wr_id < IPOIB_RX_RING_SIZE) { + struct sk_buff *skb = priv->rx_ring[wr_id].skb; + + priv->rx_ring[wr_id].skb = NULL; + + pci_unmap_single(priv->ca->dma_device, + pci_unmap_addr(&priv->rx_ring[wr_id], + mapping), + IPOIB_BUF_SIZE, + PCI_DMA_FROMDEVICE); + + if (wc->status != IB_WC_SUCCESS) { + if (wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed recv event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + dev_kfree_skb_any(skb); + return; + } + + ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n", + wc->byte_len, wc->slid); + + skb_put(skb, wc->byte_len); + skb_pull(skb, IB_GRH_BYTES); + + if (wc->slid != priv->local_lid || + wc->src_qp != priv->qp->qp_num) { + skb->protocol = ((struct ipoib_header *) skb->data)->proto; + + skb_pull(skb, IPOIB_ENCAP_LEN); + + dev->last_rx = jiffies; + ++priv->stats.rx_packets; + priv->stats.rx_bytes += skb->len; + + skb->dev = dev; + /* XXX get correct PACKET_ type here */ + skb->pkt_type = PACKET_HOST; + netif_rx_ni(skb); + } else { + ipoib_dbg_data(priv, "dropping loopback packet\n"); + dev_kfree_skb_any(skb); + } + + /* repost receive */ + if (ipoib_ib_post_receive(dev, wr_id)) + ipoib_warn(priv, "ipoib_ib_post_receive failed " + "for buf %d\n", wr_id); + } else + ipoib_warn(priv, "completion event with wrid %d\n", + wr_id); + + } else { + struct ipoib_buf *tx_req; + unsigned long flags; + + if (wr_id >= IPOIB_TX_RING_SIZE) { + ipoib_warn(priv, "completion event with wrid %d (> %d)\n", + wr_id, IPOIB_TX_RING_SIZE); + return; + } + + ipoib_dbg_data(priv, "send complete, wrid %d\n", wr_id); + + tx_req = &priv->tx_ring[wr_id]; + + pci_unmap_single(priv->ca->dma_device, + pci_unmap_addr(tx_req, mapping), + tx_req->skb->len, + PCI_DMA_TODEVICE); + + ++priv->stats.tx_packets; + priv->stats.tx_bytes += tx_req->skb->len; + + dev_kfree_skb_any(tx_req->skb); + + spin_lock_irqsave(&priv->lock, flags); + ++priv->tx_tail; + if (priv->tx_head - priv->tx_tail <= IPOIB_TX_RING_SIZE / 2) + netif_wake_queue(dev); + spin_unlock_irqrestore(&priv->lock, flags); + + if (wc->status != IB_WC_SUCCESS && + wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed send event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + } +} + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr) +{ + struct net_device *dev = (struct net_device *) dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int n, i; + + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + do { + n = ib_poll_cq(cq, IPOIB_NUM_WC, priv->ibwc); + for (i = 0; i < n; ++i) + ipoib_ib_handle_wc(dev, priv->ibwc + i); + } while (n == IPOIB_NUM_WC); +} + +static inline int post_send(struct ipoib_dev_priv *priv, + unsigned int wr_id, + struct ib_ah *address, u32 qpn, + dma_addr_t addr, int len) +{ + struct ib_sge list = { + .addr = addr, + .length = len, + .lkey = priv->mr->lkey, + }; + struct ib_send_wr param = { + .wr_id = wr_id, + .opcode = IB_WR_SEND, + .sg_list = &list, + .num_sge = 1, + .wr = { + .ud = { + .remote_qpn = qpn, + .remote_qkey = priv->qkey, + .ah = address + }, + }, + .send_flags = IB_SEND_SIGNALED, + }; + struct ib_send_wr *bad_wr; + + return ib_post_send(priv->qp, ¶m, &bad_wr); +} + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_buf *tx_req; + dma_addr_t addr; + + if (skb->len > dev->mtu + IPOIB_HW_ADDR_LEN) { + ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n", + skb->len, dev->mtu + IPOIB_HW_ADDR_LEN); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + return; + } + + if (!(skb = skb_unshare(skb, GFP_ATOMIC))) { + ipoib_warn(priv, "failed to unshare sk_buff. Dropping\n"); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + return; + } + + ipoib_dbg_data(priv, "sending packet, length=%d address=%p qpn=0x%06x\n", + skb->len, address, qpn); + + /* + * We put the skb into the tx_ring _before_ we call post_send() + * because it's entirely possible that the completion handler will + * run before we execute anything after the post_send(). That + * means we have to make sure everything is properly recorded and + * our state is consistent before we call post_send(). + */ + tx_req = &priv->tx_ring[priv->tx_head & (IPOIB_TX_RING_SIZE - 1)]; + tx_req->skb = skb; + addr = pci_map_single(priv->ca->dma_device, + skb->data, skb->len, + PCI_DMA_TODEVICE); + pci_unmap_addr_set(tx_req, mapping, addr); + + if (post_send(priv, priv->tx_head & (IPOIB_TX_RING_SIZE - 1), + address->ah, qpn, addr, skb->len)) { + ipoib_warn(priv, "post_send failed\n"); + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + } else { + unsigned long flags; + + dev->trans_start = jiffies; + + address->last_send = priv->tx_head; + ++priv->tx_head; + + spin_lock_irqsave(&priv->lock, flags); + if (priv->tx_head - priv->tx_tail == IPOIB_TX_RING_SIZE) { + ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); + netif_stop_queue(dev); + } + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +void __ipoib_reap_ah(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_ah *ah, *tah; + LIST_HEAD(remove_list); + + spin_lock_irq(&priv->lock); + list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list) + if (ah->last_send <= priv->tx_tail) { + list_del(&ah->list); + list_add_tail(&ah->list, &remove_list); + } + spin_unlock_irq(&priv->lock); + + list_for_each_entry_safe(ah, tah, &remove_list, list) { + ipoib_dbg(priv, "Reaping ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } +} + +void ipoib_reap_ah(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + __ipoib_reap_ah(dev); + + if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); +} + +int ipoib_ib_dev_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + ret = ipoib_qp_create(dev); + if (ret) { + ipoib_warn(priv, "ipoib_qp_create returned %d\n", ret); + return -1; + } + + ret = ipoib_ib_post_receives(dev); + if (ret) { + ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret); + return -1; + } + + clear_bit(IPOIB_STOP_REAPER, &priv->flags); + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); + + return 0; +} + +int ipoib_ib_dev_up(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + set_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + + return ipoib_mcast_start_thread(dev); +} + +int ipoib_ib_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "downing ib_dev\n"); + + clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + netif_carrier_off(dev); + + /* Shutdown the P_Key thread if still active */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + set_bit(IPOIB_PKEY_STOP, &priv->flags); + cancel_delayed_work(&priv->pkey_task); + up(&pkey_sem); + flush_workqueue(ipoib_workqueue); + } + + ipoib_mcast_stop_thread(dev); + + /* + * Flush the multicast groups first so we stop any multicast joins. The + * completion thread may have already died and we may deadlock waiting + * for the completion thread to finish some multicast joins. + */ + ipoib_mcast_dev_flush(dev); + + /* Delete broadcast and local addresses since they will be recreated */ + ipoib_mcast_dev_down(dev); + + return 0; +} + +static int recvs_pending(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + return 1; + + return 0; +} + +int ipoib_ib_dev_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr qp_attr; + int attr_mask; + int i; + + /* Kill the existing QP and allocate a new one */ + qp_attr.qp_state = IB_QPS_ERR; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to ERROR state\n"); + + /* Wait for all sends and receives to complete */ + while (priv->tx_head != priv->tx_tail || recvs_pending(dev)) + yield(); + + ipoib_dbg(priv, "All sends and receives done.\n"); + + qp_attr.qp_state = IB_QPS_RESET; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to RESET state\n"); + + /* Wait for all AHs to be reaped */ + set_bit(IPOIB_STOP_REAPER, &priv->flags); + cancel_delayed_work(&priv->ah_reap_task); + flush_workqueue(ipoib_workqueue); + while (!list_empty(&priv->dead_ahs)) { + __ipoib_reap_ah(dev); + yield(); + } + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + ipoib_warn(priv, "Recv skb still around @ %d\n", i); + + return 0; +} + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + priv->ca = ca; + priv->port = port; + priv->qp = NULL; + + if (ipoib_transport_dev_init(dev, ca)) { + printk(KERN_WARNING "%s: ipoib_transport_dev_init failed\n", ca->name); + return -ENODEV; + } + + if (dev->flags & IFF_UP) { + if (ipoib_ib_dev_open(dev)) { + ipoib_transport_dev_cleanup(dev); + return -ENODEV; + } + } + + return 0; +} + +void ipoib_ib_dev_flush(void *_dev) +{ + struct net_device *dev = (struct net_device *)_dev; + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv; + + if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + return; + + ipoib_dbg(priv, "flushing\n"); + + ipoib_ib_dev_down(dev); + + /* + * The device could have been brought down between the start and when + * we get here, don't bring it back up if it's not configured up + */ + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_ib_dev_up(dev); + + /* Flush any child interfaces too */ + list_for_each_entry(cpriv, &priv->child_intfs, list) + ipoib_ib_dev_flush(&cpriv->dev); +} + +void ipoib_ib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "cleaning up ib_dev\n"); + + ipoib_mcast_stop_thread(dev); + + /* Delete the broadcast address and the local address */ + ipoib_mcast_dev_down(dev); + + ipoib_transport_dev_cleanup(dev); +} + +/* + * Delayed P_Key Assigment Interim Support + * + * The following is initial implementation of delayed P_Key assigment + * mechanism. It is using the same approach implemented for the multicast + * group join. The single goal of this implementation is to quickly address + * Bug #2507. This implementation will probably be removed when the P_Key + * change async notification is available. + */ +int ipoib_open(struct net_device *dev); + +static void ipoib_pkey_dev_check_presence(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + u16 pkey_index = 0; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + else + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); +} + +void ipoib_pkey_poll(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_pkey_dev_check_presence(dev); + + if (test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) + ipoib_open(dev); + else { + down(&pkey_sem); + if (!test_bit(IPOIB_PKEY_STOP, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + } +} + +int ipoib_pkey_dev_delay_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Look for the interface pkey value in the IB Port P_Key table and */ + /* set the interface pkey assigment flag */ + ipoib_pkey_dev_check_presence(dev); + + /* P_Key value not assigned yet - start polling */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + clear_bit(IPOIB_PKEY_STOP, &priv->flags); + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + return 1; + } + + return 0; +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_main.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_main.c 2004-11-18 10:43:32.698767819 -0800 @@ -0,0 +1,945 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_main.c 1262 2004-11-18 17:38:36Z roland $ + */ + +#include "ipoib.h" + +#include +#include + +#include +#include +#include + +#include /* For ARPHRD_xxx */ + +#include +#include + +MODULE_AUTHOR("Roland Dreier"); +MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int debug_level; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define DATA_PATH_DEBUG_HELP " and data path tracing if > 1" +#else +#define DATA_PATH_DEBUG_HELP "" +#endif + +module_param(debug_level, int, 0644); +MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0" DATA_PATH_DEBUG_HELP); + +int mcast_debug_level; + +module_param(mcast_debug_level, int, 0644); +MODULE_PARM_DESC(mcast_debug_level, + "Enable multicast debug tracing if > 0"); +#endif + +DECLARE_MUTEX(ipoib_device_mutex); +LIST_HEAD(ipoib_device_list); + +static const u8 ipv4_bcast_addr[] = { + 0x00, 0xff, 0xff, 0xff, + 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff +}; + +struct workqueue_struct *ipoib_workqueue; + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + *ca = priv->ca; + *port_num = priv->port; + *gid = priv->local_gid; + *pkey = priv->pkey; + + return 0; +} +EXPORT_SYMBOL(ipoib_device_handle); + +int ipoib_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "bringing up interface\n"); + + set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + if (ipoib_pkey_dev_delay_open(dev)) + return 0; + + if (ipoib_ib_dev_open(dev)) + return -EINVAL; + + if (ipoib_ib_dev_up(dev)) + return -EINVAL; + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring up any child interfaces too */ + down(&ipoib_device_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (flags & IFF_UP) + continue; + + dev_change_flags(cpriv->dev, flags | IFF_UP); + } + up(&ipoib_device_mutex); + } + + netif_start_queue(dev); + + return 0; +} + +static int ipoib_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "stopping interface\n"); + + clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + netif_stop_queue(dev); + + ipoib_ib_dev_down(dev); + ipoib_ib_dev_stop(dev); + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring down any child interfaces too */ + down(&ipoib_device_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (!(flags & IFF_UP)) + continue; + + dev_change_flags(cpriv->dev, flags & ~IFF_UP); + } + up(&ipoib_device_mutex); + } + + return 0; +} + +static int ipoib_change_mtu(struct net_device *dev, int new_mtu) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN) + return -EINVAL; + + priv->admin_mtu = new_mtu; + + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + return 0; +} + +static void path_rec_completion(int status, + struct ib_sa_path_rec *pathrec, + void *path_ptr) +{ + struct ipoib_path *path = path_ptr; + struct ipoib_dev_priv *priv = netdev_priv(path->dev); + struct sk_buff *skb; + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status != IB_WC_SUCCESS) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(path->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + path->ah = ah; + + ipoib_dbg(priv, "created address handle %p for LID 0x%04x, SL %d\n", + ah, pathrec->dlid, pathrec->sl); + + while ((skb = __skb_dequeue(&path->queue))) { + skb->dev = path->dev; + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue packet\n"); + } + + return; + +err: + while ((skb = __skb_dequeue(&path->queue))) + dev_kfree_skb(skb); + + if (path->neighbour) + IPOIB_PATH(path->neighbour) = NULL; + + kfree(path); +} + +static int path_rec_start(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (!path) + goto err; + + path->ah = NULL; + path->dev = dev; + skb_queue_head_init(&path->queue); + __skb_queue_tail(&path->queue, skb); + path->neighbour = NULL; + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, skb->dst->neighbour->ha + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX there's a race here if path record completion runs + * before we get to finish up. Add a lock to path struct? + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + path_rec_completion, + path, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + goto err; + } + + path->neighbour = skb->dst->neighbour; + IPOIB_PATH(skb->dst->neighbour) = path; + return 0; + +err: + kfree(path); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +static int path_lookup(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + + /* Look up path record for unicasts */ + if (skb->dst->neighbour->ha[4] != 0xff) + return path_rec_start(skb, dev); + + /* Add in the P_Key */ + skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; + skb->dst->neighbour->ha[9] = priv->pkey & 0xff; + ipoib_mcast_send(dev, + (union ib_gid *) (skb->dst->neighbour->ha + 4), + skb); + return 0; +} + +static void unicast_arp_completion(int status, + struct ib_sa_path_rec *pathrec, + void *skb_ptr) +{ + struct sk_buff *skb = skb_ptr; + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(skb->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + *(struct ipoib_ah **) skb->cb = ah; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue ARP packet\n"); + + return; + +err: + dev_kfree_skb(skb); +} + +static void unicast_arp_finish(struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah = *(struct ipoib_ah **) skb->cb; + unsigned long flags; + + if (ah) { + spin_lock_irqsave(&priv->lock, flags); + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +/* + * For unicast packets with no skb->dst->neighbour (unicast ARPs are + * the main example), we fire off a path record query for each packet. + * This is pretty bad for scalability (since this is going to hammer + * the SM on a big fabric) but it's the best I can think of for now. + * + * Also we might have a problem if a path changes, because ARPs will + * still go through (since we'll get the new path from the SM for + * these queries) so we'll never update the neighbour. + */ +static int unicast_arp_start(struct sk_buff *skb, struct net_device *dev, + struct ipoib_pseudoheader *phdr) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *tmp_skb; + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (skb->destructor) { + tmp_skb = skb; + skb = skb_clone(tmp_skb, GFP_ATOMIC); + dev_kfree_skb_any(tmp_skb); + if (!skb) { + ++priv->stats.tx_dropped; + return 0; + } + } + + skb->dev = dev; + skb->destructor = unicast_arp_finish; + memset(skb->cb, 0, sizeof skb->cb); + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, phdr->hwaddr + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX We need to keep a record of the skb and TID somewhere + * so that we can cancel the request if the device goes down + * before it finishes. + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + unicast_arp_completion, + skb, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + } + + return 0; +} + +static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path; + + if (skb->dst && skb->dst->neighbour) { + if (unlikely(!IPOIB_PATH(skb->dst->neighbour))) + return path_lookup(skb, dev); + + path = IPOIB_PATH(skb->dst->neighbour); + + if (likely(path->ah)) { + ipoib_send(dev, skb, path->ah, + be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); + return 0; + } + + if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) + __skb_queue_tail(&path->queue, skb); + else + goto err; + } else { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb->data; + skb_pull(skb, sizeof *phdr); + + if (phdr->hwaddr[4] == 0xff) { + /* Add in the P_Key */ + phdr->hwaddr[8] = (priv->pkey >> 8) & 0xff; + phdr->hwaddr[9] = priv->pkey & 0xff; + + ipoib_mcast_send(dev, (union ib_gid *) (phdr->hwaddr + 4), skb); + } + else { + /* unicast GID -- ARP reply?? */ + + /* + * If destructor is unicast_arp_finish, we've + * already been through the path lookup and + * now we can just send the packet. + */ + if (skb->destructor == unicast_arp_finish) { + ipoib_send(dev, skb, *(struct ipoib_ah **) skb->cb, + be32_to_cpup((u32 *) phdr->hwaddr)); + return 0; + } + + if (be16_to_cpup((u16 *) skb->data) != ETH_P_ARP) { + ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x " + IPOIB_GID_FMT "\n", + skb->dst ? "neigh" : "dst", + be16_to_cpup((u16 *) skb->data), + be32_to_cpup((u32 *) phdr->hwaddr), + IPOIB_GID_ARG(*(union ib_gid *) (phdr->hwaddr + 4))); + dev_kfree_skb_any(skb); + ++priv->stats.tx_dropped; + return 0; + } + + /* put the pseudoheader back on */ + skb_push(skb, sizeof *phdr); + return unicast_arp_start(skb, dev, phdr); + } + } + + return 0; + +err: + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +struct net_device_stats *ipoib_get_stats(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return &priv->stats; +} + +static void ipoib_timeout(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_warn(priv, "transmit timeout: latency %ld\n", + jiffies - dev->trans_start); + /* XXX reset QP, etc. */ +} + +static int ipoib_hard_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + void *daddr, void *saddr, unsigned len) +{ + struct ipoib_header *header; + + header = (struct ipoib_header *) skb_push(skb, sizeof *header); + + header->proto = htons(type); + header->reserved = 0; + + /* + * If we don't have a neighbour structure, stuff the + * destination address onto the front of the skb so we can + * figure out where to send the packet later. + */ + if (!skb->dst || !skb->dst->neighbour) { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); + memcpy(phdr->hwaddr, daddr, IPOIB_HW_ADDR_LEN); + } + + return 0; +} + +static void ipoib_set_mcast_list(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + schedule_work(&priv->restart_task); +} + +static void ipoib_neigh_destructor(struct neighbour *neigh) +{ + struct ipoib_path *path = IPOIB_PATH(neigh); + + ipoib_dbg(netdev_priv(neigh->dev), + "neigh_destructor for %06x " IPOIB_GID_FMT "\n", + be32_to_cpup((__be32 *) neigh->ha), + IPOIB_GID_ARG(*((union ib_gid *) (neigh->ha + 4)))); + + if (path && path->ah) { + ipoib_put_ah(path->ah); + kfree(path); + } +} + +static int ipoib_neigh_setup(struct neighbour *neigh) +{ + /* + * Is this kosher? I can't find anybody in the kernel that + * sets neigh->destructor, so we should be able to set it here + * without trouble. + */ + neigh->ops->destructor = ipoib_neigh_destructor; + + return 0; +} + +static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) +{ + parms->neigh_setup = ipoib_neigh_setup; + + return 0; +} + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Allocate RX/TX "rings" to hold queued skbs */ + + priv->rx_ring = kmalloc(IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->rx_ring) { + printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", + ca->name, IPOIB_RX_RING_SIZE); + goto out; + } + memset(priv->rx_ring, 0, + IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf)); + + priv->tx_ring = kmalloc(IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->tx_ring) { + printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", + ca->name, IPOIB_TX_RING_SIZE); + goto out_rx_ring_cleanup; + } + memset(priv->tx_ring, 0, + IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf)); + + /* priv->tx_head & tx_tail are already 0 */ + + if (ipoib_ib_dev_init(dev, ca, port)) + goto out_tx_ring_cleanup; + + return 0; + +out_tx_ring_cleanup: + kfree(priv->tx_ring); + +out_rx_ring_cleanup: + kfree(priv->rx_ring); + +out: + return -ENOMEM; +} + +void ipoib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv, *tcpriv; + + ipoib_delete_debug_file(dev); + + /* Delete any child interfaces first */ + /* Safe since it's either protected by ipoib_device_mutex or empty */ + list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) { + unregister_netdev(cpriv->dev); + ipoib_dev_cleanup(cpriv->dev); + + list_del(&cpriv->list); + + kfree(cpriv); + } + + ipoib_ib_dev_cleanup(dev); + + if (priv->rx_ring) { + kfree(priv->rx_ring); + priv->rx_ring = NULL; + } + + if (priv->tx_ring) { + kfree(priv->tx_ring); + priv->tx_ring = NULL; + } +} + +static void ipoib_setup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + dev->open = ipoib_open; + dev->stop = ipoib_stop; + dev->change_mtu = ipoib_change_mtu; + dev->hard_start_xmit = ipoib_start_xmit; + dev->get_stats = ipoib_get_stats; + dev->tx_timeout = ipoib_timeout; + dev->hard_header = ipoib_hard_header; + dev->set_multicast_list = ipoib_set_mcast_list; + dev->neigh_setup = ipoib_neigh_setup_dev; + + dev->watchdog_timeo = HZ; + + dev->rebuild_header = NULL; + dev->set_mac_address = NULL; + dev->header_cache_update = NULL; + + dev->flags |= IFF_BROADCAST | IFF_MULTICAST; + + /* + * We add in IPOIB_HW_ADDR_LEN to allow for the destination + * address "pseudoheader" for skbs without neighbour struct. + */ + dev->hard_header_len = IPOIB_ENCAP_LEN + IPOIB_HW_ADDR_LEN; + dev->addr_len = IPOIB_HW_ADDR_LEN; + dev->type = ARPHRD_INFINIBAND; + dev->tx_queue_len = IPOIB_TX_RING_SIZE * 2; + + /* MTU will be reset when mcast join happens */ + dev->mtu = IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN; + priv->mcast_mtu = priv->admin_mtu = dev->mtu; + + memcpy(dev->broadcast, ipv4_bcast_addr, IPOIB_HW_ADDR_LEN); + + netif_carrier_off(dev); + + SET_MODULE_OWNER(dev); + + priv->dev = dev; + + spin_lock_init(&priv->lock); + + sema_init(&priv->mcast_mutex, 1); + + INIT_LIST_HEAD(&priv->child_intfs); + INIT_LIST_HEAD(&priv->dead_ahs); + INIT_LIST_HEAD(&priv->multicast_list); + + INIT_WORK(&priv->pkey_task, ipoib_pkey_poll, priv->dev); + INIT_WORK(&priv->mcast_task, ipoib_mcast_join_task, priv->dev); + INIT_WORK(&priv->flush_task, ipoib_ib_dev_flush, priv->dev); + INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task, priv->dev); + INIT_WORK(&priv->ah_reap_task, ipoib_reap_ah, priv->dev); +} + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *name) +{ + struct net_device *dev; + + dev = alloc_netdev((int) sizeof (struct ipoib_dev_priv), name, + ipoib_setup); + if (!dev) + return NULL; + + return netdev_priv(dev); +} + +static ssize_t show_pkey(struct class_device *cdev, char *buf) +{ + struct ipoib_dev_priv *priv = + netdev_priv(container_of(cdev, struct net_device, class_dev)); + + return sprintf(buf, "0x%04x\n", priv->pkey); +} +static CLASS_DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL); + +static ssize_t create_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_add(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(create_child, S_IWUGO, NULL, create_child); + +static ssize_t delete_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_delete(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; + +} +static CLASS_DEVICE_ATTR(delete_child, S_IWUGO, NULL, delete_child); + +int ipoib_add_pkey_attr(struct net_device *dev) +{ + return class_device_create_file(&dev->class_dev, + &class_device_attr_pkey); +} + +static int ipoib_add_port(const char *format, struct ib_device *hca, u8 port) +{ + struct ipoib_dev_priv *priv; + int result = -ENOMEM; + + priv = ipoib_intf_alloc(format); + if (!priv) + goto alloc_mem_failed; + + SET_NETDEV_DEV(priv->dev, &hca->dma_device->dev); + + result = ib_query_pkey(hca, port, 0, &priv->pkey); + if (result) { + printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } + + priv->dev->broadcast[8] = priv->pkey >> 8; + priv->dev->broadcast[9] = priv->pkey & 0xff; + + result = ib_query_gid(hca, port, 0, &priv->local_gid); + if (result) { + printk(KERN_WARNING "%s: ib_query_gid port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + + result = ipoib_dev_init(priv->dev, hca, port); + if (result < 0) { + printk(KERN_WARNING "%s: failed to initialize port %d (ret = %d)\n", + hca->name, port, result); + goto device_init_failed; + } + + INIT_IB_EVENT_HANDLER(&priv->event_handler, + priv->ca, ipoib_event); + result = ib_register_event_handler(&priv->event_handler); + if (result < 0) { + printk(KERN_WARNING "%s: ib_register_event_handler failed for " + "port %d (ret = %d)\n", + hca->name, port, result); + goto event_failed; + } + + result = register_netdev(priv->dev); + if (result) { + printk(KERN_WARNING "%s: couldn't register ipoib port %d; error %d\n", + hca->name, port, result); + goto register_failed; + } + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_create_child)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_delete_child)) + goto sysfs_failed; + + down(&ipoib_device_mutex); + list_add_tail(&priv->list, &ipoib_device_list); + up(&ipoib_device_mutex); + + return 0; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ib_unregister_event_handler(&priv->event_handler); + +event_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +alloc_mem_failed: + return result; +} + +static void ipoib_add_one(struct ib_device *device) +{ + int port; + + if (device->node_type == IB_NODE_SWITCH) + ipoib_add_port("ib%d", device, 0); + else + for (port = 1; port <= device->phys_port_cnt; ++port) + ipoib_add_port("ib%d", device, port); +} + +static void ipoib_remove_one(struct ib_device *device) +{ + struct ipoib_dev_priv *priv, *tmp; + + LIST_HEAD(delete); + + down(&ipoib_device_mutex); + list_for_each_entry_safe(priv, tmp, &ipoib_device_list, list) { + if (priv->ca == device) { + list_del(&priv->list); + list_add_tail(&priv->list, &delete); + } + } + up(&ipoib_device_mutex); + + list_for_each_entry_safe(priv, tmp, &delete, list) { + unregister_netdev(priv->dev); + ib_unregister_event_handler(&priv->event_handler); + ipoib_dev_cleanup(priv->dev); + free_netdev(priv->dev); + } +} + +static struct ib_client ipoib_client = { + .name = "ipoib", + .add = ipoib_add_one, + .remove = ipoib_remove_one +}; + +static int __init ipoib_init_module(void) +{ + int ret; + + ret = ipoib_register_debugfs(); + if (ret) + return ret; + + /* + * We create our own workqueue mainly because we want to be + * able to flush it when devices are being removed. We can't + * use schedule_work()/flush_scheduled_work() because both + * unregister_netdev() and linkwatch_event take the rtnl lock, + * so flush_scheduled_work() can deadlock during device + * removal. + */ + ipoib_workqueue = create_singlethread_workqueue("ipoib"); + if (!ipoib_workqueue) { + ret = -ENOMEM; + goto err_fs; + } + + ret = ib_register_client(&ipoib_client); + if (ret) + goto err_wq; + + return 0; + +err_fs: + ipoib_unregister_debugfs(); + +err_wq: + destroy_workqueue(ipoib_workqueue); + + return ret; +} + +static void __exit ipoib_cleanup_module(void) +{ + ipoib_unregister_debugfs(); + ib_unregister_client(&ipoib_client); + destroy_workqueue(ipoib_workqueue); +} + +module_init(ipoib_init_module); +module_exit(ipoib_cleanup_module); + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2004-11-18 10:43:32.721764439 -0800 @@ -0,0 +1,929 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_multicast.c 1262 2004-11-18 17:38:36Z roland $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ipoib.h" + +static DECLARE_MUTEX(mcast_mutex); + +/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */ +struct ipoib_mcast { + struct ib_sa_mcmember_rec mcmember; + struct ipoib_ah *ah; + + struct rb_node rb_node; + struct list_head list; + struct completion done; + + int query_id; + struct ib_sa_query *query; + + unsigned long created; + unsigned long backoff; + + unsigned long flags; + unsigned char logcount; + + struct sk_buff_head pkt_queue; + + struct net_device *dev; +}; + +struct ipoib_mcast_iter { + struct net_device *dev; + union ib_gid mgid; + unsigned long created; + unsigned int queuelen; + unsigned int complete; + unsigned int send_only; +}; + +static void ipoib_mcast_free(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + + ipoib_dbg_mcast(netdev_priv(dev), + "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + if (mcast->ah) + ipoib_put_ah(mcast->ah); + + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + dev_kfree_skb_any(skb); + } + + kfree(mcast); +} + +static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev, + int can_sleep) +{ + struct ipoib_mcast *mcast; + + mcast = kmalloc(sizeof (*mcast), can_sleep ? GFP_KERNEL : GFP_ATOMIC); + if (!mcast) + return NULL; + + memset(mcast, 0, sizeof (*mcast)); + + init_completion(&mcast->done); + + mcast->dev = dev; + mcast->created = jiffies; + mcast->backoff = HZ; + mcast->logcount = 0; + + INIT_LIST_HEAD(&mcast->list); + skb_queue_head_init(&mcast->pkt_queue); + + mcast->ah = NULL; + mcast->query = NULL; + + return mcast; +} + +static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node *n = priv->multicast_tree.rb_node; + + while (n) { + struct ipoib_mcast *mcast; + int ret; + + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + ret = memcmp(mgid->raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = n->rb_left; + else if (ret > 0) + n = n->rb_right; + else + return mcast; + } + + return NULL; +} + +static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node **n = &priv->multicast_tree.rb_node, *pn = NULL; + + while (*n) { + struct ipoib_mcast *tmcast; + int ret; + + pn = *n; + tmcast = rb_entry(pn, struct ipoib_mcast, rb_node); + + ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = &pn->rb_left; + else if (ret > 0) + n = &pn->rb_right; + else + return -EEXIST; + } + + rb_link_node(&mcast->rb_node, pn, n); + rb_insert_color(&mcast->rb_node, &priv->multicast_tree); + + return 0; +} + +static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, + struct ib_sa_mcmember_rec *mcmember) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + mcast->mcmember = *mcmember; + + /* Set the cached Q_Key before we attach if it's the broadcast group */ + if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid))) + priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); + + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + ipoib_warn(priv, "multicast group " IPOIB_GID_FMT + " already attached\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + return 0; + } + + ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret < 0) { + ipoib_warn(priv, "couldn't attach QP to multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); + return ret; + } + } + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(mcast->mcmember.mlid), + .port_num = priv->port, + .sl = mcast->mcmember.sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = IB_AH_GRH, + .grh = { + .flow_label = be32_to_cpu(mcast->mcmember.flow_label), + .hop_limit = mcast->mcmember.hop_limit, + .sgid_index = 0, + .traffic_class = mcast->mcmember.traffic_class + } + }; + + av.grh.dgid = mcast->mcmember.mgid; + + mcast->ah = ipoib_create_ah(dev, priv->pd, &av); + if (!mcast->ah) { + ipoib_warn(priv, "ib_address_create failed\n"); + } else { + ipoib_dbg_mcast(priv, "MGID " IPOIB_GID_FMT + " AV %p, LID 0x%04x, SL %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + mcast->ah->ah, + be16_to_cpu(mcast->mcmember.mlid), + mcast->mcmember.sl); + } + } + + /* actually send any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed to requeue packet\n"); + } + + return 0; +} + +static void +ipoib_mcast_sendonly_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + + if (!status) + ipoib_mcast_join_finish(mcast, mcmember); + else { + if (mcast->logcount++ < 20) + ipoib_dbg_mcast(netdev_priv(dev), "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + /* Flush out any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + dev_kfree_skb_any(skb); + } + + /* Clear the busy flag so we try again */ + clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); + } + + complete(&mcast->done); +} + +static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { +#if 0 /* Some SMs don't support send-only yet */ + .join_state = 4 +#else + .join_state = 1 +#endif + }; + int ret = 0; + + if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { + ipoib_dbg_mcast(priv, "device shutting down, no multicast joins\n"); + return -ENODEV; + } + + if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "multicast entry busy, skipping\n"); + return -EBUSY; + } + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 1000, GFP_ATOMIC, + ipoib_mcast_sendonly_join_complete, + mcast, &mcast->query); + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed (ret = %d)\n", + ret); + } else { + ipoib_dbg_mcast(priv, "no multicast record for " IPOIB_GID_FMT + ", starting join\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + mcast->query_id = ret; + } + + return ret; +} + +static void ipoib_mcast_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "join completion for " IPOIB_GID_FMT + " (status %d)\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + if (!status && !ipoib_mcast_join_finish(mcast, mcmember)) { + mcast->backoff = HZ; + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + complete(&mcast->done); + return; + } + + if (status == -EINTR) { + complete(&mcast->done); + return; + } + + if (status && mcast->logcount++ < 20) { + if (status == -ETIMEDOUT || status == -EINTR) { + ipoib_dbg_mcast(priv, "multicast join failed for " IPOIB_GID_FMT + ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } else { + ipoib_warn(priv, "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } + } + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + mcast->query = NULL; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) { + if (status == -ETIMEDOUT) + queue_work(ipoib_workqueue, &priv->mcast_task); + else + queue_delayed_work(ipoib_workqueue, &priv->mcast_task, + mcast->backoff * HZ); + } else + complete(&mcast->done); + up(&mcast_mutex); + + return; +} + +static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, + int create) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + ib_sa_comp_mask comp_mask; + int ret = 0; + + ipoib_dbg_mcast(priv, "joining MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + comp_mask = + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE; + + if (create) { + comp_mask |= + IB_SA_MCMEMBER_REC_QKEY | + IB_SA_MCMEMBER_REC_SL | + IB_SA_MCMEMBER_REC_FLOW_LABEL | + IB_SA_MCMEMBER_REC_TRAFFIC_CLASS; + + rec.qkey = priv->broadcast->mcmember.qkey; + rec.sl = priv->broadcast->mcmember.sl; + rec.flow_label = priv->broadcast->mcmember.flow_label; + rec.traffic_class = priv->broadcast->mcmember.traffic_class; + } + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, comp_mask, + mcast->backoff * 1000, GFP_ATOMIC, + ipoib_mcast_join_complete, + mcast, &mcast->query); + + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed, status %d\n", ret); + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, + mcast->backoff); + up(&mcast_mutex); + } else + mcast->query_id = ret; +} + +void ipoib_mcast_join_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned long flags; + + if (!test_bit(IPOIB_MCAST_RUN, &priv->flags)) + return; + + if (ib_query_gid(priv->ca, priv->port, 0, &priv->local_gid)) + ipoib_warn(priv, "ib_gid_entry_get() failed\n"); + else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + if (!priv->broadcast) { + priv->broadcast = ipoib_mcast_alloc(dev, 1); + if (!priv->broadcast) { + ipoib_warn(priv, "failed to allocate broadcast group\n"); + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, HZ); + up(&mcast_mutex); + return; + } + + memcpy(priv->broadcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid)); + + spin_lock_irqsave(&priv->lock, flags); + __ipoib_mcast_add(dev, priv->broadcast); + spin_unlock_irqrestore(&priv->lock, flags); + } + + if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { + ipoib_mcast_join(dev, priv->broadcast, 0); + return; + } + + while (1) { + struct ipoib_mcast *mcast = NULL; + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + /* Found the next unjoined group */ + break; + } + } + spin_unlock_irqrestore(&priv->lock, flags); + + if (&mcast->list == &priv->multicast_list) { + /* All done */ + break; + } + + ipoib_mcast_join(dev, mcast, 1); + return; + } + + { + struct ib_port_attr attr; + + if (!ib_query_port(priv->ca, priv->port, &attr)) + priv->local_lid = attr.lid; + else + ipoib_warn(priv, "ib_query_port failed\n"); + } + + priv->mcast_mtu = ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu) - + IPOIB_ENCAP_LEN; + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n"); + + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + netif_carrier_on(dev); +} + +int ipoib_mcast_start_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "starting multicast thread\n"); + + down(&mcast_mutex); + if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + + return 0; +} + +int ipoib_mcast_stop_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + + ipoib_dbg_mcast(priv, "stopping multicast thread\n"); + + down(&mcast_mutex); + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + cancel_delayed_work(&priv->mcast_task); + up(&mcast_mutex); + + flush_workqueue(ipoib_workqueue); + + if (priv->broadcast && priv->broadcast->query) { + ib_sa_cancel_query(priv->broadcast->query_id, priv->broadcast->query); + priv->broadcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for bcast\n"); + wait_for_completion(&priv->broadcast->done); + } + + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (mcast->query) { + ib_sa_cancel_query(mcast->query_id, mcast->query); + mcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + wait_for_completion(&mcast->done); + } + } + + return 0; +} + +int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + int ret = 0; + + if (!test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) + return 0; + + ipoib_dbg_mcast(priv, "leaving MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + /* Remove ourselves from the multicast group */ + ret = ipoib_mcast_detach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret) + ipoib_warn(priv, "ipoib_mcast_detach failed (result = %d)\n", ret); + + /* + * Just make one shot at leaving and don't wait for a reply; + * if we fail, too bad. + */ + ret = ib_sa_mcmember_rec_delete(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 0, GFP_ATOMIC, NULL, + mcast, &mcast->query); + if (ret < 0) + ipoib_warn(priv, "ib_sa_mcmember_rec_delete failed " + "for leave (result = %d)\n", ret); + + return 0; +} + +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + mcast = __ipoib_mcast_find(dev, mgid); + if (!mcast) { + /* Let's create a new send only group now */ + ipoib_dbg_mcast(priv, "setting up send only multicast group for " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(*mgid)); + + mcast = ipoib_mcast_alloc(dev, 0); + if (!mcast) { + ipoib_warn(priv, "unable to allocate memory for " + "multicast structure\n"); + dev_kfree_skb_any(skb); + goto out; + } + + set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); + mcast->mcmember.mgid = *mgid; + __ipoib_mcast_add(dev, mcast); + list_add_tail(&mcast->list, &priv->multicast_list); + } + + if (!mcast->ah) { + if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) + skb_queue_tail(&mcast->pkt_queue, skb); + else + dev_kfree_skb_any(skb); + + if (mcast->query) + ipoib_dbg_mcast(priv, "no address vector, " + "but multicast join already started\n"); + else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) + ipoib_mcast_sendonly_join(mcast); + + /* + * If lookup completes between here and out:, don't + * want to send packet twice. + */ + mcast = NULL; + } + +out: + spin_unlock_irqrestore(&priv->lock, flags); + if (mcast && mcast->ah) { + if (skb->dst && + skb->dst->neighbour && + !IPOIB_PATH(skb->dst->neighbour)) { + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + + if (path) { + kref_get(&mcast->ah->ref); + path->ah = mcast->ah; + path->dev = dev; + path->neighbour = skb->dst->neighbour; + IPOIB_PATH(skb->dst->neighbour) = path; + } + } + + ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); + } +} + +void ipoib_mcast_dev_flush(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + LIST_HEAD(remove_list); + struct ipoib_mcast *mcast, *tmcast, *nmcast; + unsigned long flags; + + ipoib_dbg_mcast(priv, "flushing multicast list\n"); + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->flags = + mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY); + + nmcast->mcmember.mgid = mcast->mcmember.mgid; + + /* Add the new group in before the to-be-destroyed group */ + list_add_tail(&nmcast->list, &mcast->list); + list_del_init(&mcast->list); + + rb_replace_node(&mcast->rb_node, &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&mcast->list, &remove_list); + } else { + ipoib_warn(priv, "could not reallocate multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + } + } + + if (priv->broadcast) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->mcmember.mgid = priv->broadcast->mcmember.mgid; + + rb_replace_node(&priv->broadcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&priv->broadcast->list, &remove_list); + } + + priv->broadcast = nmcast; + } + + spin_unlock_irqrestore(&priv->lock, flags); + + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(dev, mcast); + ipoib_mcast_free(mcast); + } +} + +void ipoib_mcast_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned long flags; + + /* Delete broadcast since it will be recreated */ + if (priv->broadcast) { + ipoib_dbg_mcast(priv, "deleting broadcast group\n"); + + spin_lock_irqsave(&priv->lock, flags); + rb_erase(&priv->broadcast->rb_node, &priv->multicast_tree); + spin_unlock_irqrestore(&priv->lock, flags); + ipoib_mcast_leave(dev, priv->broadcast); + ipoib_mcast_free(priv->broadcast); + priv->broadcast = NULL; + } +} + +void ipoib_mcast_restart_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dev_mc_list *mclist; + struct ipoib_mcast *mcast, *tmcast; + LIST_HEAD(remove_list); + unsigned long flags; + + ipoib_dbg_mcast(priv, "restarting multicast task\n"); + + ipoib_mcast_stop_thread(dev); + + spin_lock_irqsave(&priv->lock, flags); + + /* + * Unfortunately, the networking core only gives us a list of all of + * the multicast hardware addresses. We need to figure out which ones + * are new and which ones have been removed + */ + + /* Clear out the found flag */ + list_for_each_entry(mcast, &priv->multicast_list, list) + clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + + /* Mark all of the entries that are found or don't exist */ + for (mclist = dev->mc_list; mclist; mclist = mclist->next) { + union ib_gid mgid; + + memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid); + + /* Add in the P_Key */ + mgid.raw[4] = (priv->pkey >> 8) & 0xff; + mgid.raw[5] = priv->pkey & 0xff; + + mcast = __ipoib_mcast_find(dev, &mgid); + if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + struct ipoib_mcast *nmcast; + + /* Not found or send-only group, let's add a new entry */ + ipoib_dbg_mcast(priv, "adding multicast entry for mgid " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(mgid)); + + nmcast = ipoib_mcast_alloc(dev, 0); + if (!nmcast) { + ipoib_warn(priv, "unable to allocate memory for multicast structure\n"); + continue; + } + + set_bit(IPOIB_MCAST_FLAG_FOUND, &nmcast->flags); + + nmcast->mcmember.mgid = mgid; + + if (mcast) { + /* Destroy the send only entry */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + + rb_replace_node(&mcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + } else + __ipoib_mcast_add(dev, nmcast); + + list_add_tail(&nmcast->list, &priv->multicast_list); + } + + if (mcast) + set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + } + + /* Remove all of the entries don't exist anymore */ + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && + !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rb_erase(&mcast->rb_node, &priv->multicast_tree); + + /* Move to the remove list */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + } + } + spin_unlock_irqrestore(&priv->lock, flags); + + /* We have to cancel outside of the spinlock */ + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(mcast->dev, mcast); + ipoib_mcast_free(mcast); + } + + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_mcast_start_thread(dev); +} + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev) +{ + struct ipoib_mcast_iter *iter; + + iter = kmalloc(sizeof *iter, GFP_KERNEL); + if (!iter) + return NULL; + + iter->dev = dev; + memset(iter->mgid.raw, 0, sizeof iter->mgid); + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter) +{ + kfree(iter); +} + +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter) +{ + struct ipoib_dev_priv *priv = netdev_priv(iter->dev); + struct rb_node *n; + struct ipoib_mcast *mcast; + int ret = 1; + + spin_lock_irq(&priv->lock); + + n = rb_first(&priv->multicast_tree); + + while (n) { + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)) < 0) { + iter->mgid = mcast->mcmember.mgid; + iter->created = mcast->created; + iter->queuelen = skb_queue_len(&mcast->pkt_queue); + iter->complete = !!mcast->ah; + iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); + + ret = 0; + + break; + } + + n = rb_next(n); + } + + spin_unlock_irq(&priv->lock); + + return ret; +} + +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *mgid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only) +{ + *mgid = iter->mgid; + *created = iter->created; + *queuelen = iter->queuelen; + *complete = iter->complete; + *send_only = iter->send_only; +} Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_proto.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_proto.h 2004-11-18 10:43:32.744761058 -0800 @@ -0,0 +1,37 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_proto.h 1254 2004-11-17 17:19:12Z roland $ + */ + +#ifndef _IPOIB_PROTO_H +#define _IPOIB_PROTO_H + +#include +#include + +/* + * Public functions + */ + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey); + +#endif /* _IPOIB_PROTO_H */ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_verbs.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_verbs.c 2004-11-18 10:43:32.768757531 -0800 @@ -0,0 +1,248 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_verbs.c 1262 2004-11-18 17:38:36Z roland $ + */ + +#include + +#include "ipoib.h" + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr *qp_attr; + int attr_mask; + int ret; + u16 pkey_index; + + ret = -ENOMEM; + qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL); + if (!qp_attr) + goto out; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + ret = -ENXIO; + goto out; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + /* set correct QKey for QP */ + qp_attr->qkey = priv->qkey; + attr_mask = IB_QP_QKEY; + ret = ib_modify_qp(priv->qp, qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP, ret = %d\n", ret); + goto out; + } + + /* attach QP to multicast group */ + down(&priv->mcast_mutex); + ret = ib_attach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "failed to attach to multicast group, ret = %d\n", ret); + +out: + kfree(qp_attr); + return ret; +} + +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + down(&priv->mcast_mutex); + ret = ib_detach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "ib_detach_mcast failed (result = %d)\n", ret); + + return ret; +} + +int ipoib_qp_create(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + u16 pkey_index; + struct ib_qp_attr qp_attr; + int attr_mask; + + /* + * Search through the port P_Key table for the requested pkey value. + * The port has to be assigned to the respective IB partition in + * advance. + */ + ret = ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index); + if (ret) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + return ret; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + qp_attr.qp_state = IB_QPS_INIT; + qp_attr.qkey = 0; + qp_attr.port_num = priv->port; + qp_attr.pkey_index = pkey_index; + attr_mask = + IB_QP_QKEY | + IB_QP_PORT | + IB_QP_PKEY_INDEX | + IB_QP_STATE; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to init, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTR; + /* Can't set this in a INIT->RTR transition */ + attr_mask &= ~IB_QP_PORT; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTR, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTS; + qp_attr.sq_psn = 0; + attr_mask |= IB_QP_SQ_PSN; + attr_mask &= ~IB_QP_PKEY_INDEX; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTS, ret = %d\n", ret); + goto out_fail; + } + + return 0; + +out_fail: + ib_destroy_qp(priv->qp); + priv->qp = NULL; + + return -EINVAL; +} + +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_init_attr init_attr = { + .cap = { + .max_send_wr = IPOIB_TX_RING_SIZE, + .max_recv_wr = IPOIB_RX_RING_SIZE, + .max_send_sge = 1, + .max_recv_sge = 1 + }, + .sq_sig_type = IB_SIGNAL_ALL_WR, + .rq_sig_type = IB_SIGNAL_ALL_WR, + .qp_type = IB_QPT_UD + }; + + priv->pd = ib_alloc_pd(priv->ca); + if (IS_ERR(priv->pd)) { + printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); + return -ENODEV; + } + + priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, + IPOIB_TX_RING_SIZE + IPOIB_RX_RING_SIZE + 1); + if (IS_ERR(priv->cq)) { + printk(KERN_WARNING "%s: failed to create CQ\n", ca->name); + goto out_free_pd; + } + + if (ib_req_notify_cq(priv->cq, IB_CQ_NEXT_COMP)) + goto out_free_cq; + + priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(priv->mr)) { + printk(KERN_WARNING "%s: ib_reg_phys_mr failed\n", ca->name); + goto out_free_cq; + } + + init_attr.send_cq = priv->cq; + init_attr.recv_cq = priv->cq, + + priv->qp = ib_create_qp(priv->pd, &init_attr); + if (IS_ERR(priv->qp)) { + printk(KERN_WARNING "%s: failed to create QP\n", ca->name); + goto out_free_mr; + } + + priv->dev->dev_addr[1] = (priv->qp->qp_num >> 16) & 0xff; + priv->dev->dev_addr[2] = (priv->qp->qp_num >> 8) & 0xff; + priv->dev->dev_addr[3] = (priv->qp->qp_num ) & 0xff; + + return 0; + +out_free_mr: + ib_dereg_mr(priv->mr); + +out_free_cq: + ib_destroy_cq(priv->cq); + +out_free_pd: + ib_dealloc_pd(priv->pd); + return -ENODEV; +} + +void ipoib_transport_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (priv->qp) { + if (ib_destroy_qp(priv->qp)) + ipoib_warn(priv, "ib_qp_destroy failed\n"); + + priv->qp = NULL; + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + } + + if (ib_dereg_mr(priv->mr)) + ipoib_warn(priv, "ib_dereg_mr failed\n"); + + if (ib_destroy_cq(priv->cq)) + ipoib_warn(priv, "ib_cq_destroy failed\n"); + + if (ib_dealloc_pd(priv->pd)) + ipoib_warn(priv, "ib_dealloc_pd failed\n"); +} + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record) +{ + struct ipoib_dev_priv *priv = + container_of(handler, struct ipoib_dev_priv, event_handler); + + if (record->event == IB_EVENT_PORT_ACTIVE) { + ipoib_dbg(priv, "Port active event\n"); + schedule_work(&priv->flush_task); + } +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c 2004-11-18 10:43:32.792754003 -0800 @@ -0,0 +1,176 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_vlan.c 1254 2004-11-17 17:19:12Z roland $ + */ + +#include +#include + +#include +#include +#include + +#include + +#include "ipoib.h" + +/* + * We use this mutex to serialize child interface creation. This + * closes the race where userspace might create the same child + * interface twice at exactly the same time. + */ +static DECLARE_MUTEX(vlan_mutex); + +static ssize_t show_parent(struct class_device *class_dev, char *buf) +{ + struct net_device *dev = + container_of(class_dev, struct net_device, class_dev); + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return sprintf(buf, "%s\n", priv->parent->name); +} +static CLASS_DEVICE_ATTR(parent, S_IRUGO, show_parent, NULL); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv; + char intf_name[IFNAMSIZ]; + int result; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + down(&vlan_mutex); + + ppriv = netdev_priv(pdev); + + /* + * First ensure this isn't a duplicate. We check the parent device and + * then all of the child interfaces to make sure the Pkey doesn't match. + */ + if (ppriv->pkey == pkey) { + result = -ENOTUNIQ; + goto err; + } + + down(&ipoib_device_mutex); + list_for_each_entry(priv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + up(&ipoib_device_mutex); + result = -ENOTUNIQ; + goto err; + } + } + up(&ipoib_device_mutex); + + snprintf(intf_name, sizeof intf_name, "%s.%04x", + ppriv->dev->name, pkey); + priv = ipoib_intf_alloc(intf_name); + if (!priv) { + result = -ENOMEM; + goto err; + } + + set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); + + priv->pkey = pkey; + + memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, IPOIB_HW_ADDR_LEN); + priv->dev->broadcast[8] = pkey >> 8; + priv->dev->broadcast[9] = pkey & 0xff; + + result = ipoib_dev_init(priv->dev, ppriv->ca, ppriv->port); + if (result < 0) { + ipoib_warn(ppriv, "failed to initialize subinterface: " + "device %s, port %d", + ppriv->ca->name, ppriv->port); + goto device_init_failed; + } + + result = register_netdev(priv->dev); + if (result) { + ipoib_warn(priv, "failed to initialize; error %i", result); + goto register_failed; + } + + priv->parent = ppriv->dev; + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_parent)) + goto sysfs_failed; + + down(&ipoib_device_mutex); + list_add_tail(&priv->list, &ppriv->child_intfs); + up(&ipoib_device_mutex); + up(&vlan_mutex); + + return 0; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +err: + up(&vlan_mutex); + return result; +} + +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv, *tpriv; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + down(&ipoib_device_mutex); + list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); + + list_del(&priv->list); + + kfree(priv); + up(&ipoib_device_mutex); + + return 0; + } + } + up(&ipoib_device_mutex); + + return -ENOENT; +} From roland@topspin.com Thu Nov 18 10:48:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 10:48:31 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIImRSI025884 for ; Thu, 18 Nov 2004 10:48:27 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 10:48:08 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 10:48:08 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CUrK7-0008Bc-BD for netdev@oss.sgi.com; Thu, 18 Nov 2004 10:48:08 -0800 To: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> From: Roland Dreier Date: Thu, 18 Nov 2004 10:48:03 -0800 In-Reply-To: <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> (Roland Dreier's message of "Thu, 18 Nov 2004 10:46:10 -0800") Message-ID: <52r7mrkn8c.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 18 Nov 2004 18:48:08.0645 (UTC) FILETIME=[25890F50:01C4CD9F] X-archive-position: 11957 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev This patch escaped before it was ready! Please ignore it for now (a new version will be coming in a few days) Sorry, Roland From ctindel@calma.pair.com Thu Nov 18 11:03:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:03:20 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAIJ3GAl026571 for ; Thu, 18 Nov 2004 11:03:16 -0800 Received: (qmail 8359 invoked by uid 3059); 18 Nov 2004 19:02:57 -0000 Date: Thu, 18 Nov 2004 14:02:57 -0500 From: "Chad N. Tindel" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041118190257.GA7084@calma.pair.com> References: <20041109205358.GA64015@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-archive-position: 11958 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev > /proc/net/tcp is an obsolete interface. It is inherently unreliable > in that a record may be read using two read(2) calls. Those two calls > may end up looking at two different records. > > So please use the netlink interface or ss(8) from the iproute package. OK, so just out of sheer morbid curiousity, I added an ioctl which will accept 4 parameters (the address/port pairs), and will return the user id associated with that socket. I also changed pidentd to call this ioctl instead of looking at /proc/net/tcp. This should theoretically get rid of all race conditions. However, the problem still happens. We see many instances of the kernel reporting the wrong user id. What is even more interesting is that we added a retry loop, and many times the problem goes away after re-trying. Sometimes the first retry gets the correct username, and sometimes it takes 4 or 5 retries. So there is definitely some sort of race condition going on here. We have verified that when this problem occurs the process holding the socket endpoint in question is still running, so it isn't some problem caused by doing an identd lookup after the other end has gone away. Does anybody have any idea why the userid associated with the socket's inode might be changing mid-stream? What are the chances of a defect where two sockets are using the same inode memory or something like that? Chad From linville@ra.tuxdriver.com Thu Nov 18 11:08:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:08:44 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJ8dlG027015 for ; Thu, 18 Nov 2004 11:08:39 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAIJ4bi20733; Thu, 18 Nov 2004 14:04:37 -0500 Date: Thu, 18 Nov 2004 14:04:36 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org, linux-net@vger.kernel.org, netdev@oss.sgi.com Cc: greearb@candelatech.com, vlan@scry.wanfear.com Subject: [patch netdev-2.6] vlan_dev: return 0 on vlan_dev_change_mtu success Message-ID: <20041118140436.A16007@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, linux-net@vger.kernel.org, netdev@oss.sgi.com, greearb@candelatech.com, vlan@scry.wanfear.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11959 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev The VLAN net driver needs to return 0 from vlan_dev_change_mtu() on success. Signed-off-by: John W. Linville --- The proper sucessful return code for the change_mtu() method is zero. For some reason, vlan_dev_change_mtu() is returning the new mtu value instead. net/8021q/vlan_dev.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) --- 1.23/net/8021q/vlan_dev.c 2004-10-28 19:23:09 -04:00 +++ 1.24/net/8021q/vlan_dev.c 2004-11-18 11:12:36 -05:00 @@ -527,7 +527,7 @@ dev->mtu = new_mtu; - return new_mtu; + return 0; } int vlan_dev_set_ingress_priority(char *dev_name, __u32 skb_prio, short vlan_prio) From linville@ra.tuxdriver.com Thu Nov 18 11:18:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:18:38 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJIY6H027463 for ; Thu, 18 Nov 2004 11:18:34 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAIJEZf20961; Thu, 18 Nov 2004 14:14:35 -0500 Date: Thu, 18 Nov 2004 14:14:35 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Cc: cgoos@syskonnect.de, mlindner@syskonnect.de, jgarzik@pobox.com Subject: [patch netdev-2.6] skge: return 0 on success from SkGeChangeMtu Message-ID: <20041118141435.B16007@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, cgoos@syskonnect.de, mlindner@syskonnect.de, jgarzik@pobox.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11960 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev The SKGE driver needs to return 0 from SkGeChangeMtu() on success. Signed-off-by: John W. Linville --- The proper sucessful return code for the change_mtu() method is zero. For some reason, SkGeChangeMtu() is returning the new mtu value instead. The comments would seem to indicate past problems, but the current correct behaviour is clear. drivers/net/sk98lin/skge.c | 14 +------------- 1 files changed, 1 insertion(+), 13 deletions(-) --- 1.54/drivers/net/sk98lin/skge.c 2004-11-03 17:31:05 -05:00 +++ 1.55/drivers/net/sk98lin/skge.c 2004-11-18 11:12:36 -05:00 @@ -2849,19 +2849,7 @@ SkEventDispatcher(pAC, pAC->IoBase); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - /* - ** While testing this driver with latest kernel 2.5 (2.5.70), it - ** seems as if upper layers have a problem to handle a successful - ** return value of '0'. If such a zero is returned, the complete - ** system hangs for several minutes (!), which is in acceptable. - ** - ** Currently it is not clear, what the exact reason for this problem - ** is. The implemented workaround for 2.5 is to return the desired - ** new MTU size if all needed changes for the new MTU size where - ** performed. In kernels 2.2 and 2.4, a zero value is returned, - ** which indicates the successful change of the mtu-size. - */ - return NewMtu; + return 0; } /* SkGeChangeMtu */ From linville@ra.tuxdriver.com Thu Nov 18 11:31:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:31:56 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJVojD027966 for ; Thu, 18 Nov 2004 11:31:51 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAIJRng21161; Thu, 18 Nov 2004 14:27:49 -0500 Date: Thu, 18 Nov 2004 14:27:49 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org, linux-net@vger.kernel.org, netdev@oss.sgi.com Cc: greearb@candelatech.com, jgarzik@pobox.com Subject: [patch netdev-2.4] vlan_dev: return 0 on vlan_dev_change_mtu success Message-ID: <20041118142749.C16007@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, linux-net@vger.kernel.org, netdev@oss.sgi.com, greearb@candelatech.com, jgarzik@pobox.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 11961 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev The VLAN net driver needs to return 0 from vlan_dev_change_mtu() on success. Signed-off-by: John W. Linville --- The proper sucessful return code for the change_mtu() method is zero. For some reason, vlan_dev_change_mtu() is returning the new mtu value instead. net/8021q/vlan_dev.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) --- 1.14/net/8021q/vlan_dev.c 2004-07-05 19:34:03 -04:00 +++ edited/net/8021q/vlan_dev.c 2004-11-18 14:26:29 -05:00 @@ -528,7 +528,7 @@ dev->mtu = new_mtu; - return new_mtu; + return 0; } int vlan_dev_set_ingress_priority(char *dev_name, __u32 skb_prio, short vlan_prio) From jason.mcmullan@timesys.com Thu Nov 18 11:35:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:35:25 -0800 (PST) Received: from exchange.timesys.com (mail.timesys.com [65.117.135.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJZILH028318 for ; Thu, 18 Nov 2004 11:35:18 -0800 Received: from jmcmullan by owa.timesys.com; 18 Nov 2004 14:34:49 -0500 Subject: Re: [PATCH] MII bus API for PHY devices From: Jason McMullan To: Andy Fleming Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org In-Reply-To: <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Thu, 18 Nov 2004 14:34:49 -0500 Message-Id: <1100806489.14467.47.camel@jmcmullan> Mime-Version: 1.0 X-Mailer: Evolution 2.0.1-1mdk X-archive-position: 11962 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jason.mcmullan@timesys.com Precedence: bulk X-list: netdev On Thu, 2004-11-18 at 11:52 -0600, Andy Fleming wrote: > 1) How should we pass initialization information from the system to the > bus. Information like which irq to use for each PHY, and what the > address space for the bus's controls is. I would like to enforce > encapsulation so that the ethernet drivers don't need to know this > information, or pass it to the bus. (Just an off-the-cuff answer here) In line with the OCP->platform work I've been doing, I would think that creating 'phy' devices on the platform bus would be appropriate, with 'platform_data' that describes (a) the platform device ethernet it's bus is on and (b) it's PHY ID on that bus. The PHY's IRQ would be in it's platform resources. > 2) How should we reflect the dependency of the ethernet driver on the > mii bus driver? Hmm. Don't really know from a sysfs perspective... > 3) How should we bind ethernet drivers to PHY drivers? A PHY 'platform_data' struct like: struct phy_device_data { struct { const char *name; int id; } ethernet_platform_device_parent; int phy_id; } > Oh, and a 4th side-issue: > Should each PHY have its own file? Actually, each PHY should have it's own device directory, like every other device. Eventually, PHYs should have /dev/phy* entries, where user-space can read/write PHY registers. -- Jason McMullan From nobody@adrenaline.netsender.net Thu Nov 18 11:44:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:44:37 -0800 (PST) Received: from adrenaline.netsender.net (ns3.netsender.net [216.66.21.12]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJiUGU028769 for ; Thu, 18 Nov 2004 11:44:30 -0800 Received: from nobody by adrenaline.netsender.net with local (Exim 4.43) id 1CUsCY-0003wc-9p for netdev@oss.sgi.com; Thu, 18 Nov 2004 13:44:18 -0600 To: netdev@oss.sgi.com Subject: Request for confirmation From: "Webmaster" Reply-To: noreply@adhost.gr X-Mailer: PHPlist version 2.8.11 (www.phplist.com) X-MessageID: systemmessage Message-Id: Date: Thu, 18 Nov 2004 13:44:18 -0600 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - adrenaline.netsender.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [99 32003] / [47 12] X-AntiAbuse: Sender Address Domain - adrenaline.netsender.net X-Source: X-Source-Args: /usr/local/apache/bin/httpd -DSSL X-Source-Dir: adhost.gr:/public_html/list/admin X-archive-position: 11963 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: noreply@adhost.gr Precedence: bulk X-list: netdev Almost welcome to our mailinglist(s) ... Someone, hopefully you, has subscribed your email address to the following mailinglists: * adhost list If this is correct, please click this URL to confirm your subscription: http://adhost.gr/list/?p=confirm&uid=547b3489a8dba9b5612222d25d3bfb2b If this is not correct, you do not need to do anything, simply delete this message. Thank you From afleming@freescale.com Thu Nov 18 11:51:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:51:34 -0800 (PST) Received: from motgate7.mot.com (motgate7.mot.com [129.188.136.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJpTsp029194 for ; Thu, 18 Nov 2004 11:51:30 -0800 Received: from az33exr04.mot.com (pobox4.mot.com [10.64.251.243]) by motgate7.mot.com (Motorola/Motgate7) with ESMTP id iAIJh4ZL011670; Thu, 18 Nov 2004 12:43:08 -0700 (MST) Received: from [10.82.16.241] ([10.82.16.241]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id iAIHoZTp011958; Thu, 18 Nov 2004 11:50:36 -0600 In-Reply-To: <1100806489.14467.47.camel@jmcmullan> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100806489.14467.47.camel@jmcmullan> Mime-Version: 1.0 (Apple Message framework v619) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: <2B68D9FA-399B-11D9-96F6-000393C30512@freescale.com> Content-Transfer-Encoding: 7bit Cc: "" , "" From: Andy Fleming Subject: Re: [PATCH] MII bus API for PHY devices Date: Thu, 18 Nov 2004 13:50:59 -0600 To: Jason McMullan X-Mailer: Apple Mail (2.619) X-archive-position: 11964 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: afleming@freescale.com Precedence: bulk X-list: netdev On Nov 18, 2004, at 13:34, Jason McMullan wrote: >> 3) How should we bind ethernet drivers to PHY drivers? > > A PHY 'platform_data' struct like: > > struct phy_device_data { > struct { > const char *name; > int id; > } ethernet_platform_device_parent; > int phy_id; > } So you would have each PHY know the controller to which it's attached? I would have thought the other way around... Hm. I will definitely have to read up on my driver model stuff > >> Oh, and a 4th side-issue: >> Should each PHY have its own file? > > Actually, each PHY should have it's own device directory, like every > other device. Eventually, PHYs should have /dev/phy* entries, where > user-space can read/write PHY registers. I think you misunderstood. Are you talking about sysfs? I was talking about actual source files. i.e. should there be dm9161.c, m88e1101.c, cis8201.c, etc. Also, do we need user-space to read/write PHY registers. ethtool has this capability, I believe, and the interfaces there are settled. Andy Fleming From bdschuym@pandora.be Thu Nov 18 11:56:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 11:56:45 -0800 (PST) Received: from europa.telenet-ops.be (europa.telenet-ops.be [195.130.132.60]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIJucpL029720 for ; Thu, 18 Nov 2004 11:56:38 -0800 Received: from localhost (localhost.localdomain [127.0.0.1]) by europa.telenet-ops.be (Postfix) with SMTP id 7EA49198227; Thu, 18 Nov 2004 20:56:18 +0100 (MET) Received: from 192.168.0.138 (D5763CA9.kabel.telenet.be [213.118.60.169]) by europa.telenet-ops.be (Postfix) with ESMTP id 600B3198209; Thu, 18 Nov 2004 20:56:14 +0100 (MET) From: Bart De Schuymer To: =?utf-8?q?Micha=C5=82=20Margula?= , Andrew Morton Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups Date: Thu, 18 Nov 2004 20:59:38 +0100 User-Agent: KMail/1.5 Cc: netdev@oss.sgi.com References: <20041115122046.1413527e.akpm@osdl.org> <20041115124843.4c3dd72f.akpm@osdl.org> <419C8724.20006@uznam.net.pl> In-Reply-To: <419C8724.20006@uznam.net.pl> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Message-Id: <200411182059.38445.bdschuym@pandora.be> Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iAIJucpL029720 X-archive-position: 11965 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bdschuym@pandora.be Precedence: bulk X-list: netdev On Thursday 18 November 2004 12:27, Micha Margula wrote: > >Bart De Schuymer wrote: > >>>Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such > >>> problem on 2.4.26. > >> > >>Can you do something similar with iptables rules to see if it's specific > >> to ebtables (which I doubt)? > > Over 50 hours after converting rules from ebtables to iptables and still > no lockup. Everything is fine and I am sure it will go stable for days > (as mentioned before lockup with ebtables happens in less than 24 hours). OK. As far as I know the ebtables code in 2.6 and the code in the 2.4 patch are equivalent. I'll get back to you (too busy right now). Bart From SRS0+06aa5fe88c463190124e+452+infradead.org+hch@phoenix.srs.infradead.org Thu Nov 18 12:00:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 12:00:46 -0800 (PST) Received: from phoenix.infradead.org (phoenix.infradead.org [81.187.226.98]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIK0dWh030234 for ; Thu, 18 Nov 2004 12:00:39 -0800 Received: from hch by phoenix.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CUsS2-000736-CP; Thu, 18 Nov 2004 20:00:18 +0000 Date: Thu, 18 Nov 2004 20:00:18 +0000 From: Christoph Hellwig To: Roland Dreier Cc: netdev@oss.sgi.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Message-ID: <20041118200017.GA26976@infradead.org> References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by phoenix.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 11966 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ linux-bk/drivers/infiniband/ulp/ipoib/Makefile 2004-11-18 10:43:32.592783399 -0800 > @@ -0,0 +1,14 @@ > +EXTRA_CFLAGS += -Idrivers/infiniband/include Please avoid -I statements for kernel code wherever possible. Just put the Infiniband Kernel Internal API into $(TOPDIR)/include/infiniband/ > +obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o > + > +ib_ipoib-objs := \ > + ipoib_main.o \ > + ipoib_ib.o \ > + ipoib_multicast.o \ > + ipoib_verbs.o \ > + ipoib_vlan.o > + > +ifeq ($(CONFIG_INFINIBAND_IPOIB_DEBUG),y) > + ib_ipoib-objs += ipoib_fs.o > +endif This should read more like: ib_ipoib-y += ipoib_main.o ipoib_ib.o \ ipoib_multicast.o \ ipoib_verbs.o ipoib_vlan.o ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_DEBUG) += ipoib_fs.o obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o Also ib_ipoib is a rather strange name, the double ib doesn't make much sense. > + * This software is available to you under a choice of one of two > + * licenses. You may choose to be licensed under the terms of the GNU > + * General Public License (GPL) Version 2, available at > + * , or the OpenIB.org BSD > + * license, available in the LICENSE.TXT file accompanying this > + * software. These details are also available at > + * . Please don't refer to licenses at urls as they can changed easily. There's a toplevel COPYING file you can reference, and if you want additional license bits I'd suggets to keep them simple enough to be in the file header. Or better just stop the dual-licensing sillyness - you'll copy code from other parts of the kernel sooner or later that are GPL-only. > +#define IPOIB_PATH(neigh) (*(struct ipoib_path **) ((neigh)->ha + 24)) Please make this and inline so you have proper typechecking. (And give it a less shouting name) > > + > +extern struct workqueue_struct *ipoib_workqueue; > + > +/* list of IPoIB network devices */ > +extern struct semaphore ipoib_device_mutex; > +extern struct list_head ipoib_device_list; Please try to avoid global lists. Looking at the code this is used in two places: (1) the debugging pseudo fs (2) ipoib_remove_one the latter would be much better served with a per ib_device list anyway, and for (1) there must be a better way than the global list either. > + pci_unmap_single(priv->ca->dma_device, > + pci_unmap_addr(&priv->rx_ring[wr_id], > + mapping), > + IPOIB_BUF_SIZE, > + PCI_DMA_FROMDEVICE); Please don't use PCI dma calls in highlevel protocol handlers. At least use the dma_* calls or even better restructure the code to avoid dma mapping outside the HCA driver. From roland@topspin.com Thu Nov 18 12:07:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 12:07:53 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIK7mVe030684 for ; Thu, 18 Nov 2004 12:07:48 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 12:07:29 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Thu, 18 Nov 2004 12:07:28 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CUsYt-00031h-GL; Thu, 18 Nov 2004 12:07:28 -0800 To: Christoph Hellwig Cc: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> From: Roland Dreier Date: Thu, 18 Nov 2004 12:07:23 -0800 In-Reply-To: <20041118200017.GA26976@infradead.org> (Christoph Hellwig's message of "Thu, 18 Nov 2004 20:00:18 +0000") Message-ID: <52actekjk4.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 18 Nov 2004 20:07:28.0927 (UTC) FILETIME=[3AE272F0:01C4CDAA] X-archive-position: 11967 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Thanks for the comments (although as I said before my original email was a mistake and should have been ignored :) I'll try to address these before the real submission :) - Roland From jason.mcmullan@timesys.com Thu Nov 18 13:01:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 13:01:18 -0800 (PST) Received: from exchange.timesys.com (mail.timesys.com [65.117.135.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIL1CuC003356 for ; Thu, 18 Nov 2004 13:01:12 -0800 Received: from jmcmullan by owa.timesys.com; 18 Nov 2004 16:00:47 -0500 Subject: Re: [PATCH] MII bus API for PHY devices From: Jason McMullan To: Andy Fleming Cc: "" , "" In-Reply-To: <2B68D9FA-399B-11D9-96F6-000393C30512@freescale.com> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100806489.14467.47.camel@jmcmullan> <2B68D9FA-399B-11D9-96F6-000393C30512@freescale.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Thu, 18 Nov 2004 16:00:47 -0500 Message-Id: <1100811647.14467.52.camel@jmcmullan> Mime-Version: 1.0 X-Mailer: Evolution 2.0.1-1mdk X-archive-position: 11968 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jason.mcmullan@timesys.com Precedence: bulk X-list: netdev On Thu, 2004-11-18 at 13:50 -0600, Andy Fleming wrote: > Jason McMullan said: > > > > Actually, each PHY should have it's own device directory, like every > > other device. Eventually, PHYs should have /dev/phy* entries, where > > user-space can read/write PHY registers. > > I think you misunderstood. Are you talking about sysfs? I was talking > about actual source files. i.e. should there be dm9161.c, m88e1101.c, > cis8201.c, etc. Yes, I am talking about sysfs. And yes, I think every PHY should have it's own .c file. (although most people could get away with using a non-IRQ 'drivers/net/phy/phy-generic.c' > Also, do we need user-space to read/write PHY registers. ethtool has > this capability, I believe, and the interfaces there are settled. Doh! I forgot. -- Jason McMullan From herbert@gondor.apana.org.au Thu Nov 18 13:03:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 13:03:43 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIL3YnC003667 for ; Thu, 18 Nov 2004 13:03:35 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUtQt-0008Gv-00; Fri, 19 Nov 2004 08:03:11 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUtQp-0002UM-00; Fri, 19 Nov 2004 08:03:07 +1100 Date: Fri, 19 Nov 2004 08:03:07 +1100 To: "Chad N. Tindel" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041118210307.GA9557@gondor.apana.org.au> References: <20041109205358.GA64015@calma.pair.com> <20041118190257.GA7084@calma.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118190257.GA7084@calma.pair.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11969 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Thu, Nov 18, 2004 at 02:02:57PM -0500, Chad N. Tindel wrote: > > OK, so just out of sheer morbid curiousity, I added an ioctl which will > accept 4 parameters (the address/port pairs), and will return the user id > associated with that socket. I also changed pidentd to call this ioctl > instead of looking at /proc/net/tcp. This should theoretically get rid > of all race conditions. Please show us the code of your ioctl. Have you tried netlink yet? Does it exhibit the same problem? -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From shemminger@osdl.org Thu Nov 18 13:24:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 13:25:04 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAILOuug004616 for ; Thu, 18 Nov 2004 13:24:59 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAILNqPE023652 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 18 Nov 2004 13:23:52 -0800 Date: Thu, 18 Nov 2004 13:27:00 -0800 From: Stephen Hemminger To: Herbert Xu Cc: "Chad N. Tindel" , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-Id: <20041118132700.29c23d00@zqx3.pdx.osdl.net> In-Reply-To: <20041118210307.GA9557@gondor.apana.org.au> References: <20041109205358.GA64015@calma.pair.com> <20041118190257.GA7084@calma.pair.com> <20041118210307.GA9557@gondor.apana.org.au> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11970 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Fri, 19 Nov 2004 08:03:07 +1100 Herbert Xu wrote: > On Thu, Nov 18, 2004 at 02:02:57PM -0500, Chad N. Tindel wrote: > > > > OK, so just out of sheer morbid curiousity, I added an ioctl which will > > accept 4 parameters (the address/port pairs), and will return the user id > > associated with that socket. I also changed pidentd to call this ioctl > > instead of looking at /proc/net/tcp. This should theoretically get rid > > of all race conditions. > > Please show us the code of your ioctl. > > Have you tried netlink yet? Does it exhibit the same problem? It could also be the sockets are shared between processes with uid's or that the real/effective uid or different or even the uid is that of the original creator and the file was inherited across exec. From raghavendra.koushik@s2io.com Thu Nov 18 13:36:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 13:36:39 -0800 (PST) Received: from linux.site (adsl-67-120-213-161.dsl.sntc01.pacbell.net [67.120.213.161]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAILaTik005103 for ; Thu, 18 Nov 2004 13:36:30 -0800 Received: by linux.site (Postfix, from userid 0) id 1081C32887; Thu, 18 Nov 2004 13:35:06 -0800 (PST) To: jgarzik@pobox.com, netdev@oss.sgi.com, kumarkr@us.ibm.com Cc: rapuru.sriram@s2io.com, leonid.grossman@s2io.com, alicia.pena@s2io.com, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com From: Koushik Subject: [PATCH 2.6.9-rc2 1/1] S2io: fixes in free_shared_mem function Message-Id: <20041118213506.1081C32887@linux.site> Date: Thu, 18 Nov 2004 13:35:06 -0800 (PST) X-archive-position: 11971 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@s2io.com Precedence: bulk X-list: netdev Hello All, As per KK's review comment received on Nov 8 about the free_shared_mem function, Iam sending the following patch. The change log includes: 1. Break from the main 'for loop' if ba[i] is NULL. 2. In the second level 'for loop', if ba[i][j] is NULL, instead of continuing as was done previously, we now free the ba[i] pointer and break from the main 'for loop'. 3. In the 'while loop' inside the second tier 'for loop', if any of the three pointers (ba or ba->ba_0_org or ba->ba_1_org) is found to be NULL, then ba[i], ba[i][j] and the non NULL buffer pointer if any (ba_0_org or ba_1_org) is freed and break from the main 'for loop'. Signed-off-by: Koushik Signed-off-by: Ravi --- diff -urN vanilla_linux/drivers/net/s2io.c linux-2.6.8.1/drivers/net/s2io.c --- vanilla_linux/drivers/net/s2io.c 2004-11-16 16:42:16.429560736 -0800 +++ linux-2.6.8.1/drivers/net/s2io.c 2004-11-18 10:07:47.553183896 -0800 @@ -560,21 +560,35 @@ for (i = 0; i < config->rx_ring_num; i++) { blk_cnt = config->rx_cfg[i].num_rxd / (MAX_RXDS_PER_BLOCK + 1); + if (!nic->ba[i]) + goto end_free; for (j = 0; j < blk_cnt; j++) { int k = 0; - if (!nic->ba[i][j]) - continue; + if (!nic->ba[i][j]) { + kfree(nic->ba[i]); + goto end_free; + } while (k != MAX_RXDS_PER_BLOCK) { buffAdd_t *ba = &nic->ba[i][j][k]; + if (!ba || !ba->ba_0_org || !ba->ba_1_org) + { + kfree(nic->ba[i]); + kfree(nic->ba[i][j]); + if(ba->ba_0_org) + kfree(ba->ba_0_org); + if(ba->ba_1_org) + kfree(ba->ba_1_org); + goto end_free; + } kfree(ba->ba_0_org); kfree(ba->ba_1_org); k++; } kfree(nic->ba[i][j]); } - if (nic->ba[i]) - kfree(nic->ba[i]); + kfree(nic->ba[i]); } +end_free: #endif if (mac_control->stats_mem) { From davem@davemloft.net Thu Nov 18 14:08:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:08:20 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIM8EBx006316 for ; Thu, 18 Nov 2004 14:08:14 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUuCV-0001z7-00; Thu, 18 Nov 2004 13:52:23 -0800 Date: Thu, 18 Nov 2004 13:52:22 -0800 From: "David S. Miller" To: "Randy.Dunlap" Cc: netdev@oss.sgi.com, sri@us.ibm.com Subject: Re: [PATCH] sctp/socket: fix printk arg. type Message-Id: <20041118135222.67651b21.davem@davemloft.net> In-Reply-To: <419906AA.8010705@osdl.org> References: <419906AA.8010705@osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11973 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 15 Nov 2004 11:42:34 -0800 "Randy.Dunlap" wrote: > fix printk argument type warning: > net/sctp/socket.c:2672: warning: format argument is not a pointer (arg 5) Applied, thanks Randy. From herbert@gondor.apana.org.au Thu Nov 18 14:07:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:08:02 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIM7rDE006230 for ; Thu, 18 Nov 2004 14:07:54 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUuR0-0000Ls-00; Fri, 19 Nov 2004 09:07:22 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUuQx-0002Zm-00; Fri, 19 Nov 2004 09:07:19 +1100 Date: Fri, 19 Nov 2004 09:07:19 +1100 To: Stephen Hemminger Cc: "Chad N. Tindel" , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041118220719.GA9890@gondor.apana.org.au> References: <20041109205358.GA64015@calma.pair.com> <20041118190257.GA7084@calma.pair.com> <20041118210307.GA9557@gondor.apana.org.au> <20041118132700.29c23d00@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118132700.29c23d00@zqx3.pdx.osdl.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11972 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Thu, Nov 18, 2004 at 01:27:00PM -0800, Stephen Hemminger wrote: > > It could also be the sockets are shared between processes with uid's or that > the real/effective uid or different or even the uid is that of the original > creator and the file was inherited across exec. You're right. However, I think the original poster is getting different results between calls on the same connection. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From dlstevens@us.ibm.com Thu Nov 18 14:17:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:17:12 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMH1Yv007087; Thu, 18 Nov 2004 14:17:07 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAIMGbAD417284; Thu, 18 Nov 2004 17:16:37 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAIMGaVR189650; Thu, 18 Nov 2004 15:16:36 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAIMGa32005007; Thu, 18 Nov 2004 15:16:36 -0700 Received: from d03nm121.boulder.ibm.com (d03nm121.boulder.ibm.com [9.17.195.147]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAIMGYVY004943; Thu, 18 Nov 2004 15:16:36 -0700 In-Reply-To: <20041118220719.GA9890@gondor.apana.org.au> To: Herbert Xu Cc: "Chad N. Tindel" , linux-net@vger.kernel.org, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, Stephen Hemminger MIME-Version: 1.0 Subject: Re: Wrong UIDs reported in /proc/net/tcp X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Thu, 18 Nov 2004 14:16:33 -0800 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/18/2004 15:16:35, Serialize complete at 11/18/2004 15:16:35 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 11974 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Isn't the read itself atomic? Assuming so, another solution would be to stat/fstat the file, add some to it to account for growth, allocate a buffer that big and read the whole thing in one shot. Then the results should be self-consistent. +-DLS From davem@davemloft.net Thu Nov 18 14:30:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:30:19 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMUE1G007587 for ; Thu, 18 Nov 2004 14:30:14 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUuXY-000237-00; Thu, 18 Nov 2004 14:14:08 -0800 Date: Thu, 18 Nov 2004 14:14:08 -0800 From: "David S. Miller" To: "John W. Linville" Cc: linux-kernel@vger.kernel.org, linux-net@vger.kernel.org, netdev@oss.sgi.com, greearb@candelatech.com, vlan@scry.wanfear.com Subject: Re: [patch netdev-2.6] vlan_dev: return 0 on vlan_dev_change_mtu success Message-Id: <20041118141408.686e7b16.davem@davemloft.net> In-Reply-To: <20041118140436.A16007@tuxdriver.com> References: <20041118140436.A16007@tuxdriver.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11975 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Thu, 18 Nov 2004 14:04:36 -0500 "John W. Linville" wrote: > The VLAN net driver needs to return 0 from vlan_dev_change_mtu() > on success. > > Signed-off-by: John W. Linville Both 2.4.x and 2.6.x variants applied, thanks John. From davem@davemloft.net Thu Nov 18 14:32:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:32:26 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMWLma007882 for ; Thu, 18 Nov 2004 14:32:21 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUuZq-000240-00; Thu, 18 Nov 2004 14:16:30 -0800 Date: Thu, 18 Nov 2004 14:16:30 -0800 From: "David S. Miller" To: Christoph Hellwig Cc: netdev@oss.sgi.com Subject: Re: [PATCH] kill drivers/net/net_init.c Message-Id: <20041118141630.490a4087.davem@davemloft.net> In-Reply-To: <20041114101637.GA31739@lst.de> References: <20041114101637.GA31739@lst.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11976 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 14 Nov 2004 11:16:37 +0100 Christoph Hellwig wrote: > After the last patch only three routines are left in this file, but all > of the fir into net/core/dev.c much better: > > - {un,}register_netdev are just wrappers around {un,}register_netdevice > from dev.c > - alloc_netdev's counterpart, free_netdev is in dev.c aswell. > > So move over the remaining contents and add some kerneldoc comments > describing the functions. Queued for 2.6.11, thanks Christoph. From davem@davemloft.net Thu Nov 18 14:38:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:38:40 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMcZge008299 for ; Thu, 18 Nov 2004 14:38:35 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUufs-00024p-00; Thu, 18 Nov 2004 14:22:44 -0800 Date: Thu, 18 Nov 2004 14:22:44 -0800 From: "David S. Miller" To: Christoph Hellwig Cc: netdev@oss.sgi.com Subject: Re: [PATCH] use local_softirq_pending instead of softirq_pending in netif_rx_ni Message-Id: <20041118142244.0de3378a.davem@davemloft.net> In-Reply-To: <20041114103846.GA32024@lst.de> References: <20041114103846.GA32024@lst.de> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11977 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 14 Nov 2004 11:38:46 +0100 Christoph Hellwig wrote: > Some architectures can optimize local_softirq_pending much better than > softirq_pending(smp_processor_id()), and for all others the former is > just a macro expanding to the later. > > Also this is the last use of softirq_pending() in common code, once this > is in we can soon kill the notation of beeing able to query other cpus > softirq pending count. Queued for 2.6.11, thanks Christoph. From davem@davemloft.net Thu Nov 18 14:48:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:48:13 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMm8JW008738 for ; Thu, 18 Nov 2004 14:48:08 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUup8-00026f-00; Thu, 18 Nov 2004 14:32:18 -0800 Date: Thu, 18 Nov 2004 14:32:18 -0800 From: "David S. Miller" To: Stephen Hemminger Cc: netdev@oss.sgi.com Subject: Re: [PATCH] random: remove TCP MD4 code if !CONFIG_INET Message-Id: <20041118143218.19f90b0e.davem@davemloft.net> In-Reply-To: <20041117152116.6934bfa9@zqx3.pdx.osdl.net> References: <20041117152116.6934bfa9@zqx3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11978 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 17 Nov 2004 15:21:16 -0800 Stephen Hemminger wrote: > The code in the random driver for tcp sequence number randomization > is only needed if INET is configured. > > Signed-off-by: Stephen Hemminger Applied, thanks Stephen. From davem@davemloft.net Thu Nov 18 14:50:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 14:50:54 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAIMomWI009097 for ; Thu, 18 Nov 2004 14:50:48 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CUurb-00027J-00; Thu, 18 Nov 2004 14:34:51 -0800 Date: Thu, 18 Nov 2004 14:34:51 -0800 From: "David S. Miller" To: James Morris Cc: chrisw@osdl.org, ross.axe@blueyonder.co.uk, netdev@oss.sgi.com, sds@epoch.ncsc.mil, linux-kernel@vger.kernel.org Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-Id: <20041118143451.3dae3ffb.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11979 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Thu, 18 Nov 2004 12:25:21 -0500 (EST) James Morris wrote: > Updated patch below (with Chris Wright's wrapper idea). > > This now fixes both issues. > > 1) Don't call security_unix_may_send() hook during sendmsg() for > SOCK_SEQPACKET, and ensure that sendmsg() can only be called on a > connected socket so as not to bypass the security_unix_stream_connect() > hook. > > 2) Return -EINVAL if sendto() is called on SOCK_SEQPACKET with an address > supplied. > > Please review and apply if ok. > > > Signed-off-by: James Morris Looks good, applied thanks James. From benh@kernel.crashing.org Thu Nov 18 15:30:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 15:30:31 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAINUP0M011002 for ; Thu, 18 Nov 2004 15:30:25 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAINQxgJ011653; Thu, 18 Nov 2004 17:27:00 -0600 Subject: Re: [PATCH] MII bus API for PHY devices From: Benjamin Herrenschmidt To: Andy Fleming Cc: jason.mcmullan@timesys.com, netdev@oss.sgi.com, Linux Kernel list In-Reply-To: <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> Content-Type: text/plain Date: Fri, 19 Nov 2004 10:26:31 +1100 Message-Id: <1100820391.25521.14.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 11980 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev On Thu, 2004-11-18 at 11:52 -0600, Andy Fleming wrote: > 1) How should we pass initialization information from the system to the > bus. Information like which irq to use for each PHY, and what the > address space for the bus's controls is. I would like to enforce > encapsulation so that the ethernet drivers don't need to know this > information, or pass it to the bus. Unfortunately, this is all quite platform specific and the ethernet driver may be the only one to know what to do here... add to that various special cases of the way the PHY is wired or controlled, I think we can't completely avoid special casing... > 2) How should we reflect the dependency of the ethernet driver on the > mii bus driver? The ethernet driver can instanciate the PHYs at it's childs, though the case of several MACs sharing PHYs will be difficult to represent... > 3) How should we bind ethernet drivers to PHY drivers? I would have them instanciated by the ethernet driver. Besides, the PHY driver will need to be able to identify it's "parent" driver in some ways to deal with special cases. It would be nice to have a library of utility code to independently deal with link tracking (basically what drivers like sungem do independently), with a callback to the ethernet driver to inform it of actual changes (notifier ?). MACs often have autopoll features and PHY often have interrupts, but from experience, that's not very useful and a good old timer based polling tend to do a better job most of the time. > Oh, and a 4th side-issue: > Should each PHY have its own file? Or should we dump all the PHY > drivers in one file? And if so, should THAT file be separate from the > mii bus implementation file? I'd put all bcm5xxx in the same file ... they can be put together by families... Also, From herbert@gondor.apana.org.au Thu Nov 18 15:41:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 15:41:53 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAINfd1d011621; Thu, 18 Nov 2004 15:41:40 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUvth-0001RB-00; Fri, 19 Nov 2004 10:41:05 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUvta-0002jF-00; Fri, 19 Nov 2004 10:40:58 +1100 Date: Fri, 19 Nov 2004 10:40:58 +1100 To: David Stevens Cc: "Chad N. Tindel" , linux-net@vger.kernel.org, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, Stephen Hemminger Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041118234057.GA10475@gondor.apana.org.au> References: <20041118220719.GA9890@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 11981 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Thu, Nov 18, 2004 at 02:16:33PM -0800, David Stevens wrote: > > Assuming so, another solution would be to stat/fstat the file, add some to > it to account > for growth, allocate a buffer that big and read the whole thing in one > shot. Then the > results should be self-consistent. You can read at most one page at a time for a /proc file. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From ctindel@calma.pair.com Thu Nov 18 15:49:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 15:49:36 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAINnUi8012072 for ; Thu, 18 Nov 2004 15:49:30 -0800 Received: (qmail 66789 invoked by uid 3059); 18 Nov 2004 23:49:11 -0000 Date: Thu, 18 Nov 2004 18:49:11 -0500 From: "Chad N. Tindel" To: David Stevens Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, Stephen Hemminger Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041118234911.GA66056@calma.pair.com> References: <20041118220719.GA9890@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-archive-position: 11982 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev > Assuming so, another solution would be to stat/fstat the file, add some to > it to account > for growth, allocate a buffer that big and read the whole thing in one > shot. Then the > results should be self-consistent. Yeah the kernel doesn't let you read more than 1 page of data. Thats how big the block of memory that it passes to the proc handler is. http://lxr.linux.no/source/fs/proc/generic.c#L61 IIRC, each line in /proc/net/tcp is 115 bytes or something like that, so if a page is 4k, then you can only read 4096/115 = 35 sockets worth of info per read() call. Chad From dlstevens@us.ibm.com Thu Nov 18 15:57:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 15:57:14 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAINv9u9012646; Thu, 18 Nov 2004 15:57:10 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAINuj7S795648; Thu, 18 Nov 2004 18:56:45 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAINujVR255380; Thu, 18 Nov 2004 16:56:45 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAINui3w019284; Thu, 18 Nov 2004 16:56:45 -0700 Received: from d03nm121.boulder.ibm.com (d03nm121.boulder.ibm.com [9.17.195.147]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAINuigG019277; Thu, 18 Nov 2004 16:56:44 -0700 In-Reply-To: <20041118234911.GA66056@calma.pair.com> To: "Chad N. Tindel" Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, Stephen Hemminger MIME-Version: 1.0 Subject: Re: Wrong UIDs reported in /proc/net/tcp X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Thu, 18 Nov 2004 15:56:43 -0800 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/18/2004 16:56:44, Serialize complete at 11/18/2004 16:56:44 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 11983 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Hmm, well, for fixed-length records, at least you could make the buffer (pagesize/recordsize) * recordsize and avoid getting partial records, though you could still miss some or get duplicates. At least they would be complete records rather than a mix of unrelated ones. Might be more intuitive semantics if the first read resulted in a complete copy of the data at that point, fed back to the application in whatever chunks it wants, but only if the buffering didn't eat lots of memory. +-DLS From aris@cathedrallabs.org Thu Nov 18 16:06:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 16:06:47 -0800 (PST) Received: from smtp.uol.com.br (smtpout5.uol.com.br [200.221.11.58]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ06Yt2013480 for ; Thu, 18 Nov 2004 16:06:39 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by scorpion5.uol.com.br (Postfix) with ESMTP id 014B47CD9 for ; Thu, 18 Nov 2004 22:06:50 -0200 (BRST) Received: by cathedrallabs.org (Postfix, from userid 1000) id 7F1FB23653; Thu, 18 Nov 2004 21:41:03 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:41:03 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 5/5: eepro: fix auto-detection option Message-ID: <20041118234103.GJ24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="gIHggtDV96iaw8wO" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11984 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --gIHggtDV96iaw8wO Content-Type: multipart/mixed; boundary="oJFDFiWc3BlD0xT/" Content-Disposition: inline --oJFDFiWc3BlD0xT/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable --=20 Aristeu --oJFDFiWc3BlD0xT/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="05-eepro-fix_autodetect_option.patch" Content-Transfer-Encoding: quoted-printable eepro: fix auto-detection option Signed-off-by: Aristeu Sergio Rozanski Filho --- 2.6-dual/drivers/net/eepro.c.orig 2004-10-05 22:27:55.000000000 -0300 +++ 2.6-dual/drivers/net/eepro.c 2004-10-05 21:44:23.000000000 -0300 @@ -1779,7 +1779,9 @@ static struct ethtool_ops eepro_ethtool_ #define MAX_EEPRO 8 static struct net_device *dev_eepro[MAX_EEPRO]; =20 -static int io[MAX_EEPRO]; +static int io[MAX_EEPRO] =3D { + [0 ... MAX_EEPRO-1] =3D -1 +}; static int irq[MAX_EEPRO]; static int mem[MAX_EEPRO] =3D { /* Size of the rx buffer in KB */ [0 ... MAX_EEPRO-1] =3D RCV_DEFAULT_RAM/1024 @@ -1808,19 +1810,21 @@ init_module(void) { struct net_device *dev; int i; - if (io[0] =3D=3D 0 && autodetect =3D=3D 0) { + if (io[0] =3D=3D -1 && autodetect =3D=3D 0) { printk(KERN_WARNING "eepro_init_module: Probe is very dangerous in ISA b= oards!\n"); printk(KERN_WARNING "eepro_init_module: Please add \"autodetect=3D1\" to= force probe\n"); return -ENODEV; } else if (autodetect) { /* if autodetect is set then we must force detection */ - io[0] =3D 0; + for (i =3D 0; i < MAX_EEPRO; i++) { + io[i] =3D 0; + } =20 printk(KERN_INFO "eepro_init_module: Auto-detecting boards (May God prot= ect us...)\n"); } =20 - for (i =3D 0; i < MAX_EEPRO; i++) { + for (i =3D 0; io[i] !=3D -1 && i < MAX_EEPRO; i++) { dev =3D alloc_etherdev(sizeof(struct eepro_local)); if (!dev) break; --oJFDFiWc3BlD0xT/-- --gIHggtDV96iaw8wO Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTMPRRJOudsVYbMRAnsIAJ9agNzsJBBjqfP5Xopd1mXv9RB5MACeLjGI mFOm/TsfbP6/71o+uz66wOU= =gDax -----END PGP SIGNATURE----- --gIHggtDV96iaw8wO-- From shemminger@osdl.org Thu Nov 18 16:21:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 16:21:20 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ0LDAI017223 for ; Thu, 18 Nov 2004 16:21:13 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJ0KhPE011195 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 18 Nov 2004 16:20:43 -0800 Date: Thu, 18 Nov 2004 16:23:52 -0800 From: Stephen Hemminger To: Christoph Hellwig Cc: Mirko Lindner , Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com, Ralph Roesler Subject: Re: [PATCH] (4/25) sk98: change #define to typedef Message-Id: <20041118162352.7dda3e4c@zqx3.pdx.osdl.net> In-Reply-To: <20041117150133.GA8874@infradead.org> References: <419A231F.4020104@syskonnect.de> <20041117150133.GA8874@infradead.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 11985 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Wed, 17 Nov 2004 15:01:34 +0000 Christoph Hellwig wrote: > > Note that the kernel BSD sk driver was _not_ written by SysKonnect and > > only supports Genesis and Yukon1; linux supports Genesis (single and > > dual), Yukon1, Yukon Plus, Yukon EC, Yukon FE and Yukon2 (single and > > dual). > > They have Yukon2 support for while - unlike Linux. > > > The BSD sk driver supports substantially less functionality than > > the Linux driver. For example, there is no link failover capability in > > the sk driver; Is it even possible to do link failover with existing Open Source tools? Also the whole Remote Link Mangement (RLMT) stuff has no security so if it is used over a hostile network look out. I intrigued by the idea of of porting FreeBSD driver to Linux. But this card is already taking more time than I want to spend. From alan@lxorguk.ukuu.org.uk Thu Nov 18 16:43:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 16:43:39 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ0hYvK017826 for ; Thu, 18 Nov 2004 16:43:35 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iAINdZ4G006585; Thu, 18 Nov 2004 23:39:36 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iAINdYSI006584; Thu, 18 Nov 2004 23:39:34 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Alan Cox To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1100821144.6005.40.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Thu, 18 Nov 2004 23:39:32 +0000 X-archive-position: 11986 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Iau, 2004-11-18 at 18:40, James Morris wrote: > One thing that looks broken (unrelated to the patch I posted) is that > unix_dgram_sendmsg() already does not check sk->sk_shutdown & > SEND_SHUTDOWN for SOCK_SEQPACKET. Looks like a real bug yes. As to the other stuff I think the only change needed is to check the queued asynchronous error and report that before going on to the connected test From aris@cathedrallabs.org Thu Nov 18 16:54:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 16:54:41 -0800 (PST) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ0sRFC018264 for ; Thu, 18 Nov 2004 16:54:28 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by panda.sul.com.br (Postfix) with ESMTP id F04BD32674 for ; Thu, 18 Nov 2004 22:54:49 -0200 (BRDT) Received: by cathedrallabs.org (Postfix, from userid 1000) id 0571A23650; Thu, 18 Nov 2004 21:40:49 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:40:48 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 2/5: eepro: use module_param macros Message-ID: <20041118234048.GG24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ggdAeHltlv4tpqCr" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11987 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --ggdAeHltlv4tpqCr Content-Type: multipart/mixed; boundary="oiL9LJXJsdjS5rzq" Content-Disposition: inline --oiL9LJXJsdjS5rzq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable --=20 Aristeu --oiL9LJXJsdjS5rzq Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="02-eepro-module_param.patch" Content-Transfer-Encoding: quoted-printable eepro: use module_param macros Signed-off-by: Aristeu Sergio Rozanski Filho --- 2.6-pre/drivers/net/eepro.c 2004-08-26 14:38:29.000000000 -0300 +++ 2.6-work/drivers/net/eepro.c 2004-09-13 13:37:20.000000000 -0300 @@ -1720,10 +1720,11 @@ MODULE_AUTHOR("Pascal Dupuis, and aris@c MODULE_DESCRIPTION("Intel i82595 ISA EtherExpressPro10/10+ driver"); MODULE_LICENSE("GPL"); =20 -MODULE_PARM(io, "1-" __MODULE_STRING(MAX_EEPRO) "i"); -MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_EEPRO) "i"); -MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_EEPRO) "i"); -MODULE_PARM(autodetect, "1-" __MODULE_STRING(1) "i"); +static int num_params; +module_param_array(io, int, num_params, 0); +module_param_array(irq, int, num_params, 0); +module_param_array(mem, int, num_params, 0); +module_param(autodetect, int, 0); MODULE_PARM_DESC(io, "EtherExpress Pro/10 I/O base addres(es)"); MODULE_PARM_DESC(irq, "EtherExpress Pro/10 IRQ number(s)"); MODULE_PARM_DESC(mem, "EtherExpress Pro/10 Rx buffer size(es) in kB (3-29)= "); --oiL9LJXJsdjS5rzq-- --ggdAeHltlv4tpqCr Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTMARRJOudsVYbMRAj8zAJ4jFzTa3vI8YKTBiyqS7mG5uNTylwCfcG2q cQd7mu3B56/V+rSAriCNwIk= =GQF7 -----END PGP SIGNATURE----- --ggdAeHltlv4tpqCr-- From aris@cathedrallabs.org Thu Nov 18 17:02:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 17:02:32 -0800 (PST) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ12MPn018813 for ; Thu, 18 Nov 2004 17:02:24 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by panda.sul.com.br (Postfix) with ESMTP id E27D93261F for ; Thu, 18 Nov 2004 23:02:47 -0200 (BRDT) Received: by cathedrallabs.org (Postfix, from userid 1000) id 79B9E23651; Thu, 18 Nov 2004 21:40:53 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:40:53 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 3/5: eepro: basic ethtool support Message-ID: <20041118234053.GH24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="mejza3ZMMA5Za1mX" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11989 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --mejza3ZMMA5Za1mX Content-Type: multipart/mixed; boundary="Iys0Un1O+0sigPHU" Content-Disposition: inline --Iys0Un1O+0sigPHU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable --=20 Aristeu --Iys0Un1O+0sigPHU Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="03-eepro-ethtool_basic.patch" Content-Transfer-Encoding: quoted-printable eepro: basic ethtool support Signed-off-by: Aristeu Sergio Rozanski Filho --- 2.6-inc/drivers/net/eepro.c 2004-09-14 13:47:07.000000000 -0300 +++ 2.6-work/drivers/net/eepro.c 2004-09-14 14:33:20.000000000 -0300 @@ -23,6 +23,7 @@ This is a compatibility hardware problem. =20 Versions: + 0.13b basic ethtool support (aris, 09/13/2004) 0.13a in memory shortage, drop packets also in board (Michael Westermann , 07/30/2002) 0.13 irq sharing, rewrote probe function, fixed a nasty bug in @@ -104,7 +105,7 @@ */ =20 static const char version[] =3D - "eepro.c: v0.13 11/08/2001 aris@cathedrallabs.org\n"; + "eepro.c: v0.13b 09/13/2004 aris@cathedrallabs.org\n"; =20 #include =20 @@ -145,6 +146,7 @@ static const char version[] =3D #include #include #include +#include =20 #include #include @@ -152,13 +154,14 @@ static const char version[] =3D #include =20 #define DRV_NAME "eepro" +#define DRV_VERSION "0.13b" =20 #define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) ) /* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */ #define SLOW_DOWN inb(0x80) /* udelay(2) */ #define compat_init_data __initdata - +enum iftype { AUI=3D0, BNC=3D1, TPE=3D2 }; =20 /* First, a few definitions that the brave might change. */ /* A zero-terminated list of I/O addresses to be probed. */ @@ -743,16 +746,17 @@ static void __init eepro_print_info (str printEEPROMInfo(dev); } =20 +static struct ethtool_ops eepro_ethtool_ops; + /* This is the real probe routine. Linux has a history of friendly device probes on the ISA bus. A good device probe avoids doing writes, and verifies that the correct device exists and functions. */ =20 static int __init eepro_probe1(struct net_device *dev, int autoprobe) { - unsigned short station_addr[6], id, counter; + unsigned short station_addr[3], id, counter; int i; struct eepro_local *lp; - enum iftype { AUI=3D0, BNC=3D1, TPE=3D2 }; int ioaddr =3D dev->base_addr; =20 /* Grab the region so we can find another board if autoIRQ fails. */ @@ -862,6 +866,7 @@ static int __init eepro_probe1(struct ne dev->set_multicast_list =3D &set_multicast_list; dev->tx_timeout =3D eepro_tx_timeout; dev->watchdog_timeo =3D TX_TIMEOUT; + dev->ethtool_ops =3D &eepro_ethtool_ops; =20 /* print boot time info */ eepro_print_info(dev); @@ -1082,8 +1087,6 @@ static int eepro_open(struct net_device=20 old9 =3D inb(ioaddr + 9); =20 if (irqMask=3D=3Dee_FX_INT2IRQ) { - enum iftype { AUI=3D0, BNC=3D1, TPE=3D2 }; - if (net_debug > 3) { printk(KERN_DEBUG "IrqMask: %#x\n",irqMask); printk(KERN_DEBUG "i82595FX detected!\n"); @@ -1713,6 +1716,64 @@ eepro_transmit_interrupt(struct net_devi } } =20 +static int eepro_ethtool_get_settings(struct net_device *dev, + struct ethtool_cmd *cmd) +{ + struct eepro_local *lp =3D (struct eepro_local *)dev->priv; + + cmd->supported =3D SUPPORTED_10baseT_Half |=20 + SUPPORTED_10baseT_Full | + SUPPORTED_Autoneg; + cmd->advertising =3D ADVERTISED_10baseT_Half | + ADVERTISED_10baseT_Full | + ADVERTISED_Autoneg; + + if (GetBit(lp->word[5], ee_PortTPE)) { + cmd->supported |=3D SUPPORTED_TP; + cmd->advertising |=3D ADVERTISED_TP; + } + if (GetBit(lp->word[5], ee_PortBNC)) { + cmd->supported |=3D SUPPORTED_BNC; + cmd->advertising |=3D ADVERTISED_BNC; + } + if (GetBit(lp->word[5], ee_PortAUI)) { + cmd->supported |=3D SUPPORTED_AUI; + cmd->advertising |=3D ADVERTISED_AUI; + } + + cmd->speed =3D SPEED_10; + + if (dev->if_port =3D=3D TPE && lp->word[1] & ee_Duplex) { + cmd->duplex =3D DUPLEX_FULL; + } + else { + cmd->duplex =3D DUPLEX_HALF; + } + + cmd->port =3D dev->if_port; + cmd->phy_address =3D dev->base_addr; + cmd->transceiver =3D XCVR_INTERNAL; + + if (lp->word[0] & ee_AutoNeg) { + cmd->autoneg =3D 1; + } + + return 0; +} + +static void eepro_ethtool_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *drvinfo) +{ + strcpy(drvinfo->driver, DRV_NAME); + strcpy(drvinfo->version, DRV_VERSION); + sprintf(drvinfo->bus_info, "ISA 0x%lx", dev->base_addr); +} + +static struct ethtool_ops eepro_ethtool_ops =3D { + .get_settings =3D eepro_ethtool_get_settings, + .get_drvinfo =3D eepro_ethtool_get_drvinfo, +}; + #ifdef MODULE =20 #define MAX_EEPRO 8 @@ -1728,7 +1789,7 @@ static int autodetect; static int n_eepro; /* For linux 2.1.xx */ =20 -MODULE_AUTHOR("Pascal Dupuis, and aris@cathedrallabs.org"); +MODULE_AUTHOR("Pascal Dupuis and others"); MODULE_DESCRIPTION("Intel i82595 ISA EtherExpressPro10/10+ driver"); MODULE_LICENSE("GPL"); =20 --Iys0Un1O+0sigPHU-- --mejza3ZMMA5Za1mX Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTMFRRJOudsVYbMRAtI0AKCpQCJ7zTfnOGbrlKDFsCQwln4FGwCgx814 7rwaoFnqL2VLevjKUtweYOI= =FbBi -----END PGP SIGNATURE----- --mejza3ZMMA5Za1mX-- From aris@cathedrallabs.org Thu Nov 18 17:02:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 17:02:30 -0800 (PST) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ12Nsl018814 for ; Thu, 18 Nov 2004 17:02:24 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by panda.sul.com.br (Postfix) with ESMTP id 88C9F326B1 for ; Thu, 18 Nov 2004 23:02:49 -0200 (BRDT) Received: by cathedrallabs.org (Postfix, from userid 1000) id 780502364E; Thu, 18 Nov 2004 21:40:39 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:40:39 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 0/5: eepro driver updates Message-ID: <20041118234039.GE24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="9aCKuHbn5v2q3RVc" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11988 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --9aCKuHbn5v2q3RVc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, these patches fixes some very old issues (I'm scared that nobody noticed these before, maybe I'm the last guy who still use these cards) and finally implements basic ethtool support (promised to Jeff Garzik two years ago :P) 01-eepro-cache_eeprom_values.patch eepro: cache EEPROM values 02-eepro-module_param.patch eepro: use module_param macros 03-eepro-ethtool_basic.patch eepro: basic ethtool support 04-eepro-fix_return_value_in_init.patch eepro: fix return value in init_module() 05-eepro-fix_autodetect_option.patch eepro: fix auto-detection option --=20 Aristeu --9aCKuHbn5v2q3RVc Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTL3RRJOudsVYbMRAjDnAJ9Ut09G+1hYcMVlxICqyHT09XAPXACfdBRf BhMIaSWHXmVPCACK+igzTcA= =Py/u -----END PGP SIGNATURE----- --9aCKuHbn5v2q3RVc-- From aris@cathedrallabs.org Thu Nov 18 17:02:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 17:02:43 -0800 (PST) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ12Ys2018868 for ; Thu, 18 Nov 2004 17:02:36 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by panda.sul.com.br (Postfix) with ESMTP id 880653261F for ; Thu, 18 Nov 2004 23:03:00 -0200 (BRDT) Received: by cathedrallabs.org (Postfix, from userid 1000) id 5AED62364F; Thu, 18 Nov 2004 21:40:43 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:40:43 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 1/5: eepro: cache EEPROM values Message-ID: <20041118234043.GF24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5VuzLDXibKSJvVYD" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11990 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --5VuzLDXibKSJvVYD Content-Type: multipart/mixed; boundary="M0YLxmUXciMpOLPE" Content-Disposition: inline --M0YLxmUXciMpOLPE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable --=20 Aristeu --M0YLxmUXciMpOLPE Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="01-eepro-cache_eeprom_values.patch" Content-Transfer-Encoding: quoted-printable eepro: cache EEPROM values Signed-off-by: Aristeu Sergio Rozanski Filho --- 2.6-inc/drivers/net/eepro.c 2004-09-13 15:54:43.000000000 -0300 +++ 2.6-foo/drivers/net/eepro.c 2004-09-14 13:46:15.000000000 -0300 @@ -214,6 +214,7 @@ struct eepro_local { short rcv_lower_limit; short rcv_upper_limit; unsigned char eeprom_reg; + unsigned short word[8]; }; =20 /* The station (ethernet) address prefix, used for IDing the board. */ @@ -608,16 +609,22 @@ out: } #endif =20 -static void __init printEEPROMInfo(short ioaddr, struct net_device *dev) +static void __init printEEPROMInfo(struct net_device *dev) { + struct eepro_local *lp =3D (struct eepro_local *)dev->priv; + int ioaddr =3D dev->base_addr; unsigned short Word; int i,j; =20 - for (i=3D0, j=3Dee_Checksum; iword[i]; + for ( ; i < ee_SIZE; i++) + j +=3D read_eeprom(ioaddr, i, dev); + printk(KERN_DEBUG "Checksum: %#x\n",j&0xffff); =20 - Word=3Dread_eeprom(ioaddr, 0, dev); + Word =3D lp->word[0]; printk(KERN_DEBUG "Word0:\n"); printk(KERN_DEBUG " Plug 'n Pray: %d\n",GetBit(Word,ee_PnP)); printk(KERN_DEBUG " Buswidth: %d\n",(GetBit(Word,ee_BusWidth)+1)*8 ); @@ -625,7 +632,7 @@ static void __init printEEPROMInfo(short printk(KERN_DEBUG " IO Address: %#x\n", (Word>>ee_IO0)<<4); =20 if (net_debug>4) { - Word=3Dread_eeprom(ioaddr, 1, dev); + Word =3D lp->word[1]; printk(KERN_DEBUG "Word1:\n"); printk(KERN_DEBUG " INT: %d\n", Word & ee_IntMask); printk(KERN_DEBUG " LI: %d\n", GetBit(Word,ee_LI)); @@ -636,7 +643,7 @@ static void __init printEEPROMInfo(short printk(KERN_DEBUG " Duplex: %d\n", GetBit(Word,ee_Duplex)); } =20 - Word=3Dread_eeprom(ioaddr, 5, dev); + Word =3D lp->word[5]; printk(KERN_DEBUG "Word5:\n"); printk(KERN_DEBUG " BNC: %d\n",GetBit(Word,ee_BNC_TPE)); printk(KERN_DEBUG " NumConnectors: %d\n",GetBit(Word,ee_NumConn)); @@ -646,12 +653,12 @@ static void __init printEEPROMInfo(short if (GetBit(Word,ee_PortAUI)) printk(KERN_DEBUG "AUI "); printk(KERN_DEBUG "port(s) \n"); =20 - Word=3Dread_eeprom(ioaddr, 6, dev); + Word =3D lp->word[6]; printk(KERN_DEBUG "Word6:\n"); printk(KERN_DEBUG " Stepping: %d\n",Word & ee_StepMask); printk(KERN_DEBUG " BoardID: %d\n",Word>>ee_BoardID); =20 - Word=3Dread_eeprom(ioaddr, 7, dev); + Word =3D lp->word[7]; printk(KERN_DEBUG "Word7:\n"); printk(KERN_DEBUG " INT to IRQ:\n"); =20 @@ -725,7 +732,7 @@ static void __init eepro_print_info (str printk(", %s.\n", ifmap[dev->if_port]); =20 if (net_debug > 3) { - i =3D read_eeprom(dev->base_addr, 5, dev); + i =3D lp->word[5]; if (i & 0x2000) /* bit 13 of EEPROM word 5 */ printk(KERN_DEBUG "%s: Concurrent Processing is " "enabled but not used!\n", dev->name); @@ -733,7 +740,7 @@ static void __init eepro_print_info (str =20 /* Check the station address for the manufacturer's code */ if (net_debug>3) - printEEPROMInfo(dev->base_addr, dev); + printEEPROMInfo(dev); } =20 /* This is the real probe routine. Linux has a history of friendly device @@ -796,11 +803,16 @@ static int __init eepro_probe1(struct ne lp->xmt_bar =3D XMT_BAR_10; station_addr[0] =3D read_eeprom(ioaddr, 2, dev); } - station_addr[1] =3D read_eeprom(ioaddr, 3, dev); - station_addr[2] =3D read_eeprom(ioaddr, 4, dev); + + /* get all words at once. will be used here and for ethtool */ + for (i =3D 0; i < 8; i++) { + lp->word[i] =3D read_eeprom(ioaddr, i, dev); + } + station_addr[1] =3D lp->word[3]; + station_addr[2] =3D lp->word[4]; =20 if (!lp->eepro) { - if (read_eeprom(ioaddr,7,dev)=3D=3D ee_FX_INT2IRQ) + if (lp->word[7] =3D=3D ee_FX_INT2IRQ) lp->eepro =3D 2; else if (station_addr[2] =3D=3D SA_ADDR1) lp->eepro =3D 1; @@ -817,15 +829,15 @@ static int __init eepro_probe1(struct ne /* calculate {xmt,rcv}_{lower,upper}_limit */ eepro_recalc(dev); =20 - if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE)) + if (GetBit(lp->word[5], ee_BNC_TPE)) dev->if_port =3D BNC; else dev->if_port =3D TPE; =20 if (dev->irq < 2 && lp->eepro !=3D 0) { /* Mask off INT number */ - int count =3D read_eeprom(ioaddr, 1, dev) & 7; - unsigned irqMask =3D read_eeprom(ioaddr, 7, dev); + int count =3D lp->word[1] & 7; + unsigned irqMask =3D lp->word[7]; =20 while (count--) irqMask &=3D irqMask - 1; @@ -941,7 +953,7 @@ static int eepro_open(struct net_device=20 if (net_debug > 3) printk(KERN_DEBUG "%s: entering eepro_open routine.\n", dev->name); =20 - irqMask =3D read_eeprom(ioaddr,7,dev); + irqMask =3D lp->word[7]; =20 if (lp->eepro =3D=3D LAN595FX_10ISA) { if (net_debug > 3) printk(KERN_DEBUG "p->eepro =3D 3;\n"); --M0YLxmUXciMpOLPE-- --5VuzLDXibKSJvVYD Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTL7RRJOudsVYbMRAgumAKC90412zmACQmAz8snwXbVAbGfrvwCfUKRr gXg4AR8hsJj870jxJuK6FiQ= =c30U -----END PGP SIGNATURE----- --5VuzLDXibKSJvVYD-- From aris@cathedrallabs.org Thu Nov 18 17:02:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 17:02:44 -0800 (PST) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ12Yfw018873 for ; Thu, 18 Nov 2004 17:02:36 -0800 Received: from cathedrallabs.org (unknown [200.193.150.85]) by panda.sul.com.br (Postfix) with ESMTP id E76F032674 for ; Thu, 18 Nov 2004 23:03:00 -0200 (BRDT) Received: by cathedrallabs.org (Postfix, from userid 1000) id 53F6923652; Thu, 18 Nov 2004 21:40:59 -0200 (GMT+2) Date: Thu, 18 Nov 2004 21:40:59 -0200 From: Aristeu Sergio Rozanski Filho To: netdev@oss.sgi.com Subject: [PATCH] 4/5: eepro: fix return value in init_module() Message-ID: <20041118234059.GI24080@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="A1VS04HCCjrR2aaM" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 11991 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --A1VS04HCCjrR2aaM Content-Type: multipart/mixed; boundary="hIO1AjEoFJ7b3ahE" Content-Disposition: inline --hIO1AjEoFJ7b3ahE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable --=20 Aristeu --hIO1AjEoFJ7b3ahE Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="04-eepro-fix_return_value_in_init.patch" eepro: fix return value in init_module() Signed-off-by: Aristeu Sergio Rozanski Filho --- 2.6/drivers/net/eepro.c.orig 2004-10-05 22:26:48.000000000 -0300 +++ 2.6/drivers/net/eepro.c 2004-10-05 22:27:00.000000000 -0300 @@ -1811,7 +1811,7 @@ init_module(void) if (io[0] == 0 && autodetect == 0) { printk(KERN_WARNING "eepro_init_module: Probe is very dangerous in ISA boards!\n"); printk(KERN_WARNING "eepro_init_module: Please add \"autodetect=1\" to force probe\n"); - return 1; + return -ENODEV; } else if (autodetect) { /* if autodetect is set then we must force detection */ --hIO1AjEoFJ7b3ahE-- --A1VS04HCCjrR2aaM Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnTMLRRJOudsVYbMRAhH0AKCXtxiehjz/ceMitrB0LIZzzyG+bgCggVQc oxBQYi0RWbpO23Eow6NUk2I= =0pom -----END PGP SIGNATURE----- --A1VS04HCCjrR2aaM-- From herbert@gondor.apana.org.au Thu Nov 18 17:26:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 17:27:01 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ1Qi45020741; Thu, 18 Nov 2004 17:26:48 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CUxXQ-0002JG-00; Fri, 19 Nov 2004 12:26:14 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CUxXO-0002td-00; Fri, 19 Nov 2004 12:26:10 +1100 From: Herbert Xu To: dlstevens@us.ibm.com (David Stevens) Subject: Re: Wrong UIDs reported in /proc/net/tcp Cc: chad@tindel.net, linux-net@vger.kernel.org, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, shemminger@osdl.org Organization: Core In-Reply-To: X-Newsgroups: apana.lists.os.linux.net,apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Fri, 19 Nov 2004 12:26:10 +1100 X-archive-position: 11992 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev David Stevens wrote: > > Might be more intuitive semantics if the first read resulted in a complete > copy of the data at that point, fed back to the application in whatever > chunks it wants, but only if the buffering didn't eat lots of memory. There is no point in fixing this. We already have a working replacement called tcp_diag. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From random@72616e646f6d20323030342d30342d31360a.nosense.org Thu Nov 18 18:28:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 18:28:23 -0800 (PST) Received: from mail.nosense.org (67.cust1.sa.dsl.ozemail.com.au [210.84.224.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ2SC8C022832 for ; Thu, 18 Nov 2004 18:28:16 -0800 Received: from mail.nosense.org (mail.nosense.org [127.0.0.1]) by mail.nosense.org (Postfix) with SMTP id 44F7B62A81 for ; Fri, 19 Nov 2004 12:57:48 +1030 (CST) Date: Fri, 19 Nov 2004 12:57:47 +1030 From: Mark Smith To: netdev@oss.sgi.com Subject: Feature suggestion - ability to disable broadcast reception on ethernet interfaces Message-Id: <20041119125747.47c80c0d.random@72616e646f6d20323030342d30342d31360a.nosense.org> Organization: The No Sense Organisation X-Mailer: Sylpheed version 1.0.0beta1 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 11993 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: random@72616e646f6d20323030342d30342d31360a.nosense.org Precedence: bulk X-list: netdev Hi, I'd like to suggest a feature which could be useful to people attaching IPv6 only nodes to mixed IPv4 and IPv6 (and other layer 3 protocol) LANs - the ability to disable reception of ethernet broadcast frames on an IPv6 only interface. It would also be useful to people running Appletalk only interfaces, as I'm pretty sure Appletalk only uses multicasts for address resolution etc, or those small number of people who might want to simulate a non-broadcast multiple access network when playing with routing protocols. The main benefit would be to avoid broadcast frames from causing interrupts on nodes that have no interest in them. I've worked on some large LANs which have a large number of broadcast frames, caused by IPv4 and IPX (10MB of data in broadcast frames within 25 minutes is very scary!). While these were certainly networks that should be redesigned, I think it would be useful for (linux) nodes that weren't interested in receiving broadcasts to either ignore them by default, or be able to be configured to ignore them. I've looked up the spec sheets for a few of the ethernet chips / cards I have (NS8390 used on NE2K, SMSC LAN83C171 used on SMC EPIC100, NS83815 used on Netgear FA311/FA312), and it appears that broadcast address recognition is an option that is separately settable to unicast and multicast address recognition. I'm not sure if this is representative of the majority of ethernet chipsets, although with these cards being commodity cards, ranging over quite a number of years of design and manufacture, I'd think being able to separately enable / disable broadcast address recognition would probably be a common feature for a lot of ethernet chipsets. Rather than it being an interface "layer 2" specific switch or option, another way to implement it could be similar to the way Novell Netware works when it comes to enabling layer 3 protocols on a layer 2 interfaces. Under Novell Netware, if you want to enable IPv4 on an interface, you need to"bind" IPv4 to the interface. Other interfaces on the Netware server won't process packets for the "bound" protocol. I'm not sure if this happens on Novell Netware, however, I could see how when a layer 3 protocol is bound to a layer 2 interface, a set of required address recognition features (i.e., unicast, multicast, broadcast) are passed down to the device driver, which the device driver then enables on the card itself. For example, if IPv6 was bound to an interface, IPv6 would request only unicast and multicast address recognition from the interface device driver. An IPv6 only interface would then ignore any ethernet broadcast frames. If IPv4 was then bound to the same interface, it would request unicast and broadcast address recognition, and optionally multicast address recognition if IPv4 multicast was supported. The device driver would then also enable broadcast address recognition to allow IPv4 to work in conjunction with IPv6. I'd love to have a go at implementing this my self, unfortunately I don't know anywhere near enough C or kernel programming to do so. The suggestion is the best I can do at the moment, other than testing. If somebody with the right skills and time thinks this idea would be useful, I'm certainly quite willing to spend time testing any preliminary implementation. Thanks, Mark. From linux-kernel@vger.kernel.org Thu Nov 18 18:33:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 18:33:30 -0800 (PST) Received: from bee6 (beenet.airotech.c2pro.net [203.77.223.45]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAJ2Wlld023200 for ; Thu, 18 Nov 2004 18:32:53 -0800 Date: Fri, 19 Nov 2004 09:32:40 +0700 To: netdev@oss.sgi.com Subject: :) From: linux-kernel@vger.kernel.org Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------ucrdedlyildmkulqecnb" X-archive-position: 11994 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux-kernel@vger.kernel.org Precedence: bulk X-list: netdev ----------ucrdedlyildmkulqecnb Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Looking forward for a response :P password: 07274 ----------ucrdedlyildmkulqecnb Content-Type: application/octet-stream; name="TextDocument.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="TextDocument.zip" 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 clBLBQYAAAAAAQABADkAAABstAEAAAA= ----------ucrdedlyildmkulqecnb-- From jmorris@redhat.com Thu Nov 18 19:12:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 19:12:49 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ3CdI5024981 for ; Thu, 18 Nov 2004 19:12:42 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAJ3CD9H000419; Thu, 18 Nov 2004 22:12:13 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAJ3CDr21121; Thu, 18 Nov 2004 22:12:13 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAJ3CBhu016420; Thu, 18 Nov 2004 22:12:11 -0500 Date: Thu, 18 Nov 2004 22:12:13 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Alan Cox cc: Ross Kendall Axe , , Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <1100821144.6005.40.camel@localhost.localdomain> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11995 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Alan Cox wrote: > As to the other stuff I think the only change needed is to check the > queued asynchronous error and report that before going on to the > connected test How about this? (Also now ignores any supplied address per http://www.opengroup.org/onlinepubs/009695399/functions/sendto.html) --- Signed-off-by: James Morris diff -purN -X dontdiff linux-2.6.10-rc2.o/net/unix/af_unix.c linux-2.6.10-rc2.w3/net/unix/af_unix.c --- linux-2.6.10-rc2.o/net/unix/af_unix.c 2004-11-15 13:18:56.000000000 -0500 +++ linux-2.6.10-rc2.w3/net/unix/af_unix.c 2004-11-18 21:54:12.650029672 -0500 @@ -466,6 +466,8 @@ static int unix_dgram_recvmsg(struct kio struct msghdr *, size_t, int); static int unix_dgram_connect(struct socket *, struct sockaddr *, int, int); +static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, + struct msghdr *, size_t); static struct proto_ops unix_stream_ops = { .family = PF_UNIX, @@ -524,7 +526,7 @@ static struct proto_ops unix_seqpacket_o .shutdown = unix_shutdown, .setsockopt = sock_no_setsockopt, .getsockopt = sock_no_getsockopt, - .sendmsg = unix_dgram_sendmsg, + .sendmsg = unix_seqpacket_sendmsg, .recvmsg = unix_dgram_recvmsg, .mmap = sock_no_mmap, .sendpage = sock_no_sendpage, @@ -1354,9 +1356,11 @@ restart: if (other->sk_shutdown & RCV_SHUTDOWN) goto out_unlock; - err = security_unix_may_send(sk->sk_socket, other->sk_socket); - if (err) - goto out_unlock; + if (sk->sk_type != SOCK_SEQPACKET) { + err = security_unix_may_send(sk->sk_socket, other->sk_socket); + if (err) + goto out_unlock; + } if (unix_peer(other) != sk && (skb_queue_len(&other->sk_receive_queue) > @@ -1506,6 +1510,25 @@ out_err: return sent ? : err; } +static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, + struct msghdr *msg, size_t len) +{ + int err; + struct sock *sk = sock->sk; + + err = sock_error(sk); + if (err) + return err; + + if (sk->sk_state != TCP_ESTABLISHED) + return -ENOTCONN; + + if (msg->msg_namelen) + msg->msg_namelen = 0; + + return unix_dgram_sendmsg(kiocb, sock, msg, len); +} + static void unix_copy_addr(struct msghdr *msg, struct sock *sk) { struct unix_sock *u = unix_sk(sk); From ross.axe@blueyonder.co.uk Thu Nov 18 19:24:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 19:24:22 -0800 (PST) Received: from smtp-out4.blueyonder.co.uk (smtp-out4.blueyonder.co.uk [195.188.213.7]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ3OGZM025722 for ; Thu, 18 Nov 2004 19:24:16 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out4.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Fri, 19 Nov 2004 03:24:25 +0000 Message-ID: <419D6746.2020603@blueyonder.co.uk> Date: Fri, 19 Nov 2004 03:23:50 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Chris Wright CC: James Morris , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <20041118084449.Z14339@build.pdx.osdl.net> In-Reply-To: <20041118084449.Z14339@build.pdx.osdl.net> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig2BDD3484146A7E1EC73F5BEF" X-OriginalArrivalTime: 19 Nov 2004 03:24:25.0731 (UTC) FILETIME=[45514530:01C4CDE7] X-archive-position: 11996 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig2BDD3484146A7E1EC73F5BEF Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Chris Wright wrote: > > Why not make a unix_seq_sendmsg, which is a very small wrapper? > e.g. > static int unix_seq_sendmsg(struct kiocb *kiocb, struct socket *sock, > struct msghdr *msg, size_t len) > { > struct sock *sk = sock->sk; > > if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) > return -ENOTCONN; > if (msg->msg_name || msg->msg_namelen) > return -EINVAL; > return unix_dgram_sendmsg(kiocb, sock, msg, len); > } > > > -chris Taking this idea further, couldn't we split unix_dgram_sendmsg into 2 functions, do_unix_dgram_sendmsg and do_unix_connectionless_sendmsg (and similarly for unix_stream_sendmsg), then all we'd need is: static int do_unix_dgram_sendmsg(...); static int do_unix_stream_sendmsg(...); static int do_unix_connectionless_sendmsg(...); static int do_unix_connectional_sendmsg(...); static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, struct msghdr *msg, size_t len) { return do_unix_connectionless_sendmsg(kiocb, sock, msg, len, do_unix_dgram_sendmsg); } static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, struct msghdr *msg, size_t len) { return do_unix_connectional_sendmsg(kiocb, sock, msg, len, do_unix_stream_sendmsg); } static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, struct msghdr *msg, size_t len) { return do_unix_connectional_sendmsg(kiocb, sock, msg, len, do_unix_dgram_sendmsg); } What do we think? Ross --------------enig2BDD3484146A7E1EC73F5BEF Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBnWdK9bR4xmappRARAihLAKCzFZPZApRyoBKS4/FQXpqjTV6XYACg2nl3 wa0It2/jwa5kPymDxtXygjk= =1TBd -----END PGP SIGNATURE----- --------------enig2BDD3484146A7E1EC73F5BEF-- From lanxue@soe.ucsc.edu Thu Nov 18 22:27:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 22:27:46 -0800 (PST) Received: from services.cse.ucsc.edu (services.cse.ucsc.edu [128.114.48.10]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ6Rg2p002343 for ; Thu, 18 Nov 2004 22:27:42 -0800 Received: from moondance.cse.ucsc.edu (moondance.cse.ucsc.edu [128.114.49.1]) by services.cse.ucsc.edu (8.13.1/8.13.1) with ESMTP id iAJ6RNmK008847 for ; Thu, 18 Nov 2004 22:27:23 -0800 (PST) Date: Thu, 18 Nov 2004 22:27:23 -0800 (PST) From: Lan Xue X-X-Sender: lanxue@moondance.cse.ucsc.edu To: netdev@oss.sgi.com Subject: assign IP address to NIC Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 11997 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lanxue@soe.ucsc.edu Precedence: bulk X-list: netdev Hi, I was wondering how does the Linux kernel assign IP addresses to NICs within the localhost. Say a host have multiple NICs, and it has got multiple IP addresses, how to map/bind the IP address to the corresponding adapter? What are the APIs to achieve that? Basically, it's sth that ifconfig does internally... Thanks, Lan From 7.e.Q@syncro-community.de Thu Nov 18 22:30:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 22:30:31 -0800 (PST) Received: from mail.hostunreachable.de (knserv.hostunreachable.de [212.72.163.70]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ6UPUW002623 for ; Thu, 18 Nov 2004 22:30:26 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.hostunreachable.de (Postfix) with ESMTP id B1D1C61DD6; Fri, 19 Nov 2004 07:30:05 +0100 (CET) Received: from mail.hostunreachable.de ([127.0.0.1]) by localhost (knserv [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 12856-08; Fri, 19 Nov 2004 07:30:02 +0100 (CET) Received: from [127.0.0.1] (c169065.adsl.hansenet.de [213.39.169.65]) by mail.hostunreachable.de (Postfix) with ESMTP id 3A24161DD3; Fri, 19 Nov 2004 07:30:02 +0100 (CET) Message-ID: <419D929A.9040906@syncro-community.de> Date: Fri, 19 Nov 2004 07:28:42 +0100 From: Hendrik Wiese <7.e.Q@syncro-community.de> User-Agent: Mozilla Thunderbird 0.9 (Windows/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Hendrik Wiese <7.e.Q@syncro-community.de> Cc: netdev@oss.sgi.com Subject: MOD_[INC|DEC]_USE_COUNT & Kernel 2.6 References: <4199AFF4.60407@syncro-community.de> In-Reply-To: <4199AFF4.60407@syncro-community.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hostunreachable.de X-archive-position: 11998 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: 7.e.Q@syncro-community.de Precedence: bulk X-list: netdev Hello there, can somebody please explain me how to use 'usecount' with kernel 2.6 modules? My compiler tells me that MOD_[INC|DEC]_USE_COUNT are deprecated. So how to do this in kernel 2.6 (implementing a net_device)? Thanks a lot Kind regards, Hendrik Wiese From chrisw@osdl.org Thu Nov 18 23:01:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 23:01:56 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ71f1T003693 for ; Thu, 18 Nov 2004 23:01:41 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAJ719907428; Thu, 18 Nov 2004 23:01:09 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAJ719k04504; Thu, 18 Nov 2004 23:01:09 -0800 Date: Thu, 18 Nov 2004 23:01:09 -0800 From: Chris Wright To: James Morris Cc: Alan Cox , Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118230109.V2357@build.pdx.osdl.net> References: <1100821144.6005.40.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Thu, Nov 18, 2004 at 10:12:13PM -0500 X-archive-position: 11999 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > On Thu, 18 Nov 2004, Alan Cox wrote: > > > As to the other stuff I think the only change needed is to check the > > queued asynchronous error and report that before going on to the > > connected test > > How about this? The other patch is already committed, so relative diff would be needed. > (Also now ignores any supplied address per > http://www.opengroup.org/onlinepubs/009695399/functions/sendto.html) Nitpick, but I missed where it said ignore the address. And it seems counter intuitive to provide address, only to have it ignored and delivered elsewhere. thanks, -chris From jmorris@redhat.com Thu Nov 18 23:13:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 23:13:35 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ7DUnC004345 for ; Thu, 18 Nov 2004 23:13:31 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAJ7CwMM022341; Fri, 19 Nov 2004 02:12:58 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAJ7Cwr30483; Fri, 19 Nov 2004 02:12:58 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAJ7Cuhu028215; Fri, 19 Nov 2004 02:12:56 -0500 Date: Fri, 19 Nov 2004 02:12:58 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Chris Wright cc: Alan Cox , Ross Kendall Axe , , Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <20041118230109.V2357@build.pdx.osdl.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12000 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Chris Wright wrote: > > (Also now ignores any supplied address per > > http://www.opengroup.org/onlinepubs/009695399/functions/sendto.html) > > Nitpick, but I missed where it said ignore the address. And it seems > counter intuitive to provide address, only to have it ignored and > delivered elsewhere. For sendto(): "If the socket is connection-mode, dest_addr shall be ignored." For sendmsg(): "If the socket is connection-mode, the destination address in msghdr shall be ignored." I agree that it's counter intuitive (and surely an application bug), but some feedback I've had suggests we follow the spec. - James -- James Morris From chrisw@osdl.org Thu Nov 18 23:20:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 23:20:17 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ7KBcp004771 for ; Thu, 18 Nov 2004 23:20:11 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAJ7Jh912210; Thu, 18 Nov 2004 23:19:43 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAJ7Jhj05198; Thu, 18 Nov 2004 23:19:43 -0800 Date: Thu, 18 Nov 2004 23:19:43 -0800 From: Chris Wright To: Ross Kendall Axe Cc: Chris Wright , James Morris , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118231943.B14339@build.pdx.osdl.net> References: <20041118084449.Z14339@build.pdx.osdl.net> <419D6746.2020603@blueyonder.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <419D6746.2020603@blueyonder.co.uk>; from ross.axe@blueyonder.co.uk on Fri, Nov 19, 2004 at 03:23:50AM +0000 X-archive-position: 12001 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * Ross Kendall Axe (ross.axe@blueyonder.co.uk) wrote: > Taking this idea further, couldn't we split unix_dgram_sendmsg into 2 > functions, do_unix_dgram_sendmsg and do_unix_connectionless_sendmsg (and > similarly for unix_stream_sendmsg), then all we'd need is: > > > static int do_unix_dgram_sendmsg(...); > static int do_unix_stream_sendmsg(...); > static int do_unix_connectionless_sendmsg(...); > static int do_unix_connectional_sendmsg(...); We could probably break it down to better functions and helpers, but I'm not sure that's quite the breakdown. That looks to me like an indirect way to pass a flag which is already encoded in the ops and sk_type. At anyrate, for 2.6.10 the changes should be small and obvious. Better refactoring should be left for 2.6.11. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From chrisw@osdl.org Thu Nov 18 23:28:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 23:28:59 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ7Stdt005170 for ; Thu, 18 Nov 2004 23:28:55 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAJ7SS913703; Thu, 18 Nov 2004 23:28:28 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAJ7SRW05383; Thu, 18 Nov 2004 23:28:27 -0800 Date: Thu, 18 Nov 2004 23:28:27 -0800 From: Chris Wright To: James Morris Cc: Chris Wright , Alan Cox , Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-ID: <20041118232827.X2357@build.pdx.osdl.net> References: <20041118230109.V2357@build.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Fri, Nov 19, 2004 at 02:12:58AM -0500 X-archive-position: 12002 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > For sendto(): > "If the socket is connection-mode, dest_addr shall be ignored." Yup, I read right past it, thanks. Guess the standards have spoken ;-) thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From michael.vittrup.larsen@ericsson.com Thu Nov 18 23:39:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 18 Nov 2004 23:39:20 -0800 (PST) Received: from albatross.ericsson.se (albatross.ericsson.se [193.180.251.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ7dAng005727 for ; Thu, 18 Nov 2004 23:39:11 -0800 Received: from esealmw140.al.sw.ericsson.se ([153.88.254.121]) by albatross.ericsson.se (8.12.10/8.12.10/WIREfire-1.8b) with ESMTP id iAJ7covD027798 for ; Fri, 19 Nov 2004 08:38:50 +0100 (MET) Received: from esealnt611.al.sw.ericsson.se ([153.88.254.121]) by esealmw140.al.sw.ericsson.se with Microsoft SMTPSVC(6.0.3790.211); Fri, 19 Nov 2004 08:38:49 +0100 Received: from unixmail.ted.dk.eu.ericsson.se (knud.ted.dk.eu.ericsson.se [213.159.188.246]) by esealnt611.al.sw.ericsson.se with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id WHLRL05H; Fri, 19 Nov 2004 08:38:48 +0100 Received: from diadem.ted.dk.eu.ericsson.se (diadem.ted.dk.eu.ericsson.se [213.159.189.76]) by unixmail.ted.dk.eu.ericsson.se (8.10.1/8.10.1/TEDmain-1.0) with ESMTP id iAJ7cd325352; Fri, 19 Nov 2004 08:38:46 +0100 (MET) X-Sybari-Trust: 0f624248 bfd556f1 47c125ae 00000139 From: Michael Vittrup Larsen Organization: Ericsson To: Stephen Hemminger Subject: Re: [PATCH] tcp: efficient port randomisation (revised) Date: Fri, 19 Nov 2004 08:38:37 +0100 User-Agent: KMail/1.7 Cc: "David S. Miller" , netdev@oss.sgi.com References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411051103.59032.michael.vittrup.larsen@ericsson.com> <20041117153025.160eaa04@zqx3.pdx.osdl.net> In-Reply-To: <20041117153025.160eaa04@zqx3.pdx.osdl.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411190838.37802.michael.vittrup.larsen@ericsson.com> X-OriginalArrivalTime: 19 Nov 2004 07:38:49.0020 (UTC) FILETIME=[CEF257C0:01C4CE0A] X-archive-position: 12003 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: michael.vittrup.larsen@ericsson.com Precedence: bulk X-list: netdev I have looked through this patch and found no problems - thank you for implementing the draft. /Michael On Thursday 18 November 2004 00:30, Stephen Hemminger wrote: > Here is a more conservative version of earlier patch vthat keeps the same > port rover locking and global port rover. This randomizes TCP ephemeral > ports of incoming connections using variation of existing sequence number > hash. > > Thanks to original author Michael Larsen. > http://www.ietf.org/internet-drafts/draft-larsen-tsvwg-port-randomisation-0 >0.txt > > It behaves correctly if someone is perverse and sets low > high > and it separates the outgoing port rover (tcp_port_rover) from the incoming > port rover (start_rover). > > Signed-off-by: Stephen Hemminger > > diff -Nru a/drivers/char/random.c b/drivers/char/random.c > --- a/drivers/char/random.c 2004-11-17 15:21:43 -08:00 > +++ b/drivers/char/random.c 2004-11-17 15:21:43 -08:00 > @@ -2347,6 +2347,24 @@ > return halfMD4Transform(hash, keyptr->secret); > } > > +/* Generate secure starting point for ephemeral TCP port search */ > +u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport) > +{ > + struct keydata *keyptr = get_keyptr(); > + u32 hash[4]; > + > + /* > + * Pick a unique starting offset for each ephemeral port search > + * (saddr, daddr, dport) and 48bits of random data. > + */ > + hash[0] = saddr; > + hash[1] = daddr; > + hash[2] = dport ^ keyptr->secret[10]; > + hash[3] = keyptr->secret[11]; > + > + return halfMD4Transform(hash, keyptr->secret); > +} > + > #ifdef CONFIG_SYN_COOKIES > /* > * Secure SYN cookie computation. This is the algorithm worked out by > diff -Nru a/include/linux/random.h b/include/linux/random.h > --- a/include/linux/random.h 2004-11-17 15:21:43 -08:00 > +++ b/include/linux/random.h 2004-11-17 15:21:43 -08:00 > @@ -52,6 +52,7 @@ > void generate_random_uuid(unsigned char uuid_out[16]); > > extern __u32 secure_ip_id(__u32 daddr); > +extern u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 > dport); extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, > __u16 sport, __u16 dport); > extern __u32 secure_tcp_syn_cookie(__u32 saddr, __u32 daddr, > diff -Nru a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c > --- a/net/ipv4/tcp_ipv4.c 2004-11-17 15:21:43 -08:00 > +++ b/net/ipv4/tcp_ipv4.c 2004-11-17 15:21:43 -08:00 > @@ -636,6 +636,13 @@ > return -EADDRNOTAVAIL; > } > > +static inline u32 connect_port_offset(const struct sock *sk) > +{ > + const struct inet_opt *inet = inet_sk(sk); > + return secure_tcp_port_ephemeral(inet->rcv_saddr, inet->daddr, > + inet->dport); > +} > + > /* > * Bind a port for a connect operation and hash it. > */ > @@ -647,10 +654,12 @@ > int ret; > > if (!snum) { > - int rover; > - int low = sysctl_local_port_range[0]; > - int high = sysctl_local_port_range[1]; > - int remaining = (high - low) + 1; > + const u16 low = sysctl_local_port_range[0]; > + const u16 high = sysctl_local_port_range[1]; > + u16 rover = low; > + int remaining = (high-low) + 1; > + u32 offset = connect_port_offset(sk); > + static u32 rover_start; > struct hlist_node *node; > struct tcp_tw_bucket *tw = NULL; > > @@ -660,7 +669,7 @@ > * tcp_portalloc_lock before next submission to Linus. > * As soon as we touch this place at all it is time to think. > * > - * Now it protects single _advisory_ variable tcp_port_rover, > + * Now it protects single _advisory_ variable rover_start, > * hence it is mostly useless. > * Code will work nicely if we just delete it, but > * I am afraid in contented case it will work not better or > @@ -670,12 +679,9 @@ > * memory pingpong. Any ideas how to do this in a nice way? > */ > spin_lock(&tcp_portalloc_lock); > - rover = tcp_port_rover; > - > - do { > - rover++; > - if ((rover < low) || (rover > high)) > - rover = low; > + while (remaining > 0) { > + rover = low + (rover_start + offset) % > + (high - low); > head = &tcp_bhash[tcp_bhashfn(rover)]; > spin_lock(&head->lock); > > @@ -706,8 +712,9 @@ > > next_port: > spin_unlock(&head->lock); > - } while (--remaining > 0); > - tcp_port_rover = rover; > + --remaining; > + ++rover_start; > + } > spin_unlock(&tcp_portalloc_lock); > > local_bh_enable(); > @@ -716,7 +723,6 @@ > > ok: > /* All locks still held and bhs disabled */ > - tcp_port_rover = rover; > spin_unlock(&tcp_portalloc_lock); > > tcp_bind_hash(sk, tb, rover); From ross.axe@blueyonder.co.uk Fri Nov 19 01:41:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 01:41:32 -0800 (PST) Received: from smtp-out5.blueyonder.co.uk (smtp-out5.blueyonder.co.uk [195.188.213.8]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ9fNxA012083 for ; Fri, 19 Nov 2004 01:41:24 -0800 Received: from [192.168.0.3] ([82.36.124.90]) by smtp-out5.blueyonder.co.uk with Microsoft SMTPSVC(5.0.2195.6713); Fri, 19 Nov 2004 09:41:33 +0000 Message-ID: <419DBFA7.7000705@blueyonder.co.uk> Date: Fri, 19 Nov 2004 09:40:55 +0000 From: Ross Kendall Axe User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Chris Wright CC: James Morris , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <20041118084449.Z14339@build.pdx.osdl.net> <419D6746.2020603@blueyonder.co.uk> <20041118231943.B14339@build.pdx.osdl.net> In-Reply-To: <20041118231943.B14339@build.pdx.osdl.net> X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig5D86439C9872B78DC700D940" X-OriginalArrivalTime: 19 Nov 2004 09:41:33.0058 (UTC) FILETIME=[F4415E20:01C4CE1B] X-archive-position: 12004 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ross.axe@blueyonder.co.uk Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig5D86439C9872B78DC700D940 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Chris Wright wrote: > * Ross Kendall Axe (ross.axe@blueyonder.co.uk) wrote: > >>Taking this idea further, couldn't we split unix_dgram_sendmsg into 2 >>functions, do_unix_dgram_sendmsg and do_unix_connectionless_sendmsg (and >>similarly for unix_stream_sendmsg), then all we'd need is: >> >> >>static int do_unix_dgram_sendmsg(...); >>static int do_unix_stream_sendmsg(...); >>static int do_unix_connectionless_sendmsg(...); >>static int do_unix_connectional_sendmsg(...); > > > We could probably break it down to better functions and helpers, but I'm > not sure that's quite the breakdown. That looks to me like an indirect > way to pass a flag which is already encoded in the ops and sk_type. The idea of that breakdown was to encode the semantics purely into the ops and mostly ignore sk_type. An alternative would be to create a couple of macros is_connectionless and is_stream and lump it all together in one big unix_sendmsg. Unfortunately, unix_sendmsg could end up a bit too large. IMHO, unix_{dgram,stream}_sendmsg are large as it is. > At anyrate, for 2.6.10 the changes should be small and obvious. > Better refactoring should be left for 2.6.11. Agreed. I had my eye on 2.6.11 anyway. > > thanks, > -chris Ross --------------enig5D86439C9872B78DC700D940 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBnb+t9bR4xmappRARAi2wAJ9j7e1W+67cJEZxRB+3mqwomuALlgCgnlD9 askyxQzduUklgL76DWcDKaQ= =frax -----END PGP SIGNATURE----- --------------enig5D86439C9872B78DC700D940-- From herbert@gondor.apana.org.au Fri Nov 19 01:50:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 01:50:32 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJ9oLeW012523 for ; Fri, 19 Nov 2004 01:50:23 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CV5Oc-0004yN-00; Fri, 19 Nov 2004 20:49:38 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CV5OO-00011Y-00; Fri, 19 Nov 2004 20:49:24 +1100 Date: Fri, 19 Nov 2004 20:49:24 +1100 To: "David S. Miller" Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com, acme@conectiva.com.br, Jeff Garzik Subject: Fix ipv6_ifa_notify race (was: IPv6 "badness" in recent releases) Message-ID: <20041119094924.GA3726@gondor.apana.org.au> References: <4197AC20.6020707@pobox.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="azLHFNyN32YCQGCU" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12005 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --azLHFNyN32YCQGCU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Nov 15, 2004 at 07:35:17AM +1100, Herbert Xu wrote: > > Could you please apply this patch and see if the warning triggers > before the underflows start coming in? We already know that if it > does then it can cause underflows but I want to make sure that > this is what's causing your problems. Well I think it's time to fix this bug so that we don't release 2.6.10 with it. This is only a temporary hack that should be rolled back once the locking in addrconf.c is fixed properly. At the moment the locking is just too twisted to fix properly for 2.6.10 :( This patch doesn't even fix all the races in ipv6_ifa_notify. For example, the anycast/multicast addresses may be left standing should the race strike. However, they should have a much milder effect compared to a dead route in the routing table :) Signed-off-by: Herbert Xu May I ask this question again: Is it possible to move some of this complexity to user-space? addrconf.c is by far the biggest file in net/ipv6. This is also not the first time we've had a serious bug in this file. I recall fixing another timer-related bug in this file a year ago that left dangling references on devices. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --azLHFNyN32YCQGCU Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv6/addrconf.c 1.120 vs edited ===== --- 1.120/net/ipv6/addrconf.c 2004-11-16 09:08:09 +11:00 +++ edited/net/ipv6/addrconf.c 2004-11-19 20:43:45 +11:00 @@ -2987,8 +2987,13 @@ switch (event) { case RTM_NEWADDR: dst_hold(&ifp->rt->u.dst); - if (ip6_ins_rt(ifp->rt, NULL, NULL)) + spin_lock_bh(&ifp->lock); + + if (ifp->dead || ip6_ins_rt(ifp->rt, NULL, NULL)) dst_release(&ifp->rt->u.dst); + + spin_unlock_bh(&ifp->lock); + if (ifp->idev->cnf.forwarding) addrconf_join_anycast(ifp); break; @@ -2996,11 +3001,16 @@ if (ifp->idev->cnf.forwarding) addrconf_leave_anycast(ifp); addrconf_leave_solict(ifp->idev, &ifp->addr); + dst_hold(&ifp->rt->u.dst); + spin_lock_bh(&ifp->lock); + if (ip6_del_rt(ifp->rt, NULL, NULL)) dst_free(&ifp->rt->u.dst); else dst_release(&ifp->rt->u.dst); + + spin_unlock_bh(&ifp->lock); break; } } --azLHFNyN32YCQGCU-- From webvenza@libero.it Fri Nov 19 02:02:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 02:02:12 -0800 (PST) Received: from gateway.milesteg.arr (venza@adsl-96-231.38-151.net24.it [151.38.231.96]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJA27VT013211 for ; Fri, 19 Nov 2004 02:02:08 -0800 Date: Fri, 19 Nov 2004 11:01:46 +0100 From: Daniele Venzano To: maximilian attems Cc: NetDev Subject: Re: sis900 oops on resume Message-ID: <20041119100146.GA26017@picchio.gall.it> Mail-Followup-To: maximilian attems , NetDev References: <20041117182403.GC2252@stro.at> <20041117201008.GA11439@elf.ucw.cz> <20041118021425.GA2128@stro.at> <20041118084431.GA13870@gateway.milesteg.arr> <20041118094602.GB2287@stro.at> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118094602.GB2287@stro.at> X-Operating-System: Debian GNU/Linux on kernel Linux 2.4.27-grsec X-Copyright: Forwarding or publishing without permission is prohibited. X-Truth: La vita e' una questione di culo, o ce l'hai o te lo fanno. X-GPG-Fingerprint: 642A A345 1CEF B6E3 925C 23CE DAB9 8764 25B3 57ED X-archive-position: 12006 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webvenza@libero.it Precedence: bulk X-list: netdev On Thu, Nov 18, 2004 at 10:46:02AM +0100, maximilian attems wrote: > On Thu, 18 Nov 2004, Daniele Venzano wrote: > > I'm aware of this problem, sis900 looses the first interrupt after > > resume, I have to check the code. > > On my tests the card, after that lost interrupt, worked normally. Is > > that your case, or do you have a non working sis900 after resume ? > > well it works, as long as i do not use guessnet(8), > as described in the bug report, but the lost interrupt is reported > on every resume. Unfortunately I'm no longer able to reproduce this problem. I just tried to suspend/resume with a running ping -f and I can't see any lost or abnormal interrupts. There is a noticeable delay after resume and before the NIC is on line and able to handle traffic, but that is caused by the link detection/autonegotiation and I can do little to speed things up. Have you tried delaying the guessnet invocation ? -- ----------------------------- Daniele Venzano Web: http://teg.homeunix.org From surakshan@surasoft.com Fri Nov 19 04:06:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 04:07:05 -0800 (PST) Received: from asclepius.uwa.edu.au (asclepius3.uwa.edu.au [130.95.128.60]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJC6vmN018200 for ; Fri, 19 Nov 2004 04:06:58 -0800 Received: from asclepius.kas (localhost.localdomain [127.0.0.1]) by asclepius.uwa.edu.au (Postfix) with SMTP id 2F1BB1837D0; Fri, 19 Nov 2004 20:05:38 +0800 (WST) Received: from asclepius (localhost.localdomain [127.0.0.1]) by asclepius.prekas (Postfix) with SMTP id 1D0851836F7; Fri, 19 Nov 2004 20:05:38 +0800 (WST) X-UWA-Client-IP: 130.95.190.50 (UWA) Received: from stmc50.stmc.uwa.edu.au (stmc50.stmc.uwa.edu.au [130.95.190.50]) by asclepius.input (Postfix) with ESMTP id 0F740183613; Fri, 19 Nov 2004 20:05:38 +0800 (WST) Subject: Re: Fw: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use From: Surakshan Mendis To: Andrew Morton Cc: netdev@oss.sgi.com, bugtracker@surasoft.com In-Reply-To: <20041117211822.243aa8bd.akpm@osdl.org> References: <20041117211822.243aa8bd.akpm@osdl.org> Content-Type: text/plain Date: Fri, 19 Nov 2004 20:06:39 +0800 Message-Id: <1100865999.13851.7.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-SpamTest-Info: Profile: Formal (163/041118) X-SpamTest-Info: Profile: Detect Hard [UCS 290904] X-SpamTest-Info: Profile: SysLog X-SpamTest-Info: Profile: Marking Spam - Subject (UCS) [02-08-04] X-SpamTest-Status: Not detected X-SpamTest-Version: SMTP-Filter Version 2.0.0 [0125], KAS/Release X-archive-position: 12007 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: surakshan@surasoft.com Precedence: bulk X-list: netdev FYI I've just added a realtek based card using the 8139too kernel module. The "issue" mention below DOES NOT happen with this network card. Only with the onboard b44 card! On Wed, 2004-11-17 at 21:18 -0800, Andrew Morton wrote: > > Well this is novel. I'd be suspecting a hardware problem. Are you sure > the power supply isn't overloaded, or in need of replacement? > > > Begin forwarded message: > > Date: Wed, 17 Nov 2004 21:13:36 -0800 > From: bugme-daemon@osdl.org > To: bugme-new@lists.osdl.org > Subject: [Bugme-new] [Bug 3765] New: Network link down, when writting to sata disk AND network in use > > > http://bugme.osdl.org/show_bug.cgi?id=3765 > > Summary: Network link down, when writting to sata disk AND > network in use > Kernel Version: linux-kernel 2.6.9 > Status: NEW > Severity: high > Owner: other_other@kernel-bugs.osdl.org > Submitter: bugtracker@surasoft.com > > > Distribution: Gentoo > > Hardware Environment: > P4 2.66ghz > Motherboard: ASUS P4PE (with onboard lan) > Promise Sata150 TX4 PCI (sata expansion card) > > Software Environment: > Kernel 2.6.9 > - onboard LAN: driver in use > - "Broadcom 4400 ethernet support" compiled into kernel > > - Promise Sata150 TX4 PCI (sata expansion card) > - Driver "Promise SATA TX2/TX4 support" compiled into kernel > - 200GB Western Digital SATA drive attached to PCI sata card > > Problem Description: > If data is being copied to the SATA drive (eg from another DISK which is on > motherboard IDE controller) AND I start a network data transfer where data is > goung through the Broadcom lan the following occurs (from kernel log) > > Nov 18 11:43:10 synapse b44: eth0: Link is down. > Nov 18 11:43:15 synapse b44: eth0: Link is up at 100 Mbps, full duplex. > Nov 18 11:43:15 synapse b44: eth0: Flow control is on for TX and on for RX. > Nov 18 11:43:19 synapse b44: eth0: Link is down. > Nov 18 11:43:21 synapse b44: eth0: Link is up at 100 Mbps, full duplex. > > Link keeps going up and down, as long as there's data movment from the SATA > drive, and a network movement (network download doesn't have to be saving to the > sata drive) > > I've disabled APCI, problem persits. > > Steps to reproduce: > 1. copy data to Sata drive CONNECTED to PCI controller > 2. Download file from network via onboard LAN, doesn't matter which drive you > save it > 3. Onboards lan "link" goes up and down, causing disruption to network useage. > > ------- You are receiving this mail because: ------- > You are on the CC list for the bug, or are watching someone who is. > > From alan@lxorguk.ukuu.org.uk Fri Nov 19 04:43:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 04:43:39 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJChXhV022361 for ; Fri, 19 Nov 2004 04:43:33 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iAJBdSbc008158; Fri, 19 Nov 2004 11:39:28 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iAJBdQBc008157; Fri, 19 Nov 2004 11:39:26 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET From: Alan Cox To: James Morris Cc: Ross Kendall Axe , netdev@oss.sgi.com, Stephen Smalley , lkml , Chris Wright , "David S. Miller" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1100864358.8127.5.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Fri, 19 Nov 2004 11:39:22 +0000 X-archive-position: 12008 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Gwe, 2004-11-19 at 03:12, James Morris wrote: > On Thu, 18 Nov 2004, Alan Cox wrote: > > > As to the other stuff I think the only change needed is to check the > > queued asynchronous error and report that before going on to the > > connected test > > How about this? Looks right to me, the ECONNRESET is no longer being lost. From acme@conectiva.com.br Fri Nov 19 06:04:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 06:04:35 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJE4Si5024274 for ; Fri, 19 Nov 2004 06:04:29 -0800 Received: from [200.138.46.101] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CV9OR-0003ta-00; Fri, 19 Nov 2004 12:05:43 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 356C31463D; Fri, 19 Nov 2004 12:04:04 -0200 (BRST) Message-ID: <419DEF98.9040303@conectiva.com.br> Date: Fri, 19 Nov 2004 11:05:28 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Chris Wright Cc: Ross Kendall Axe , James Morris , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <20041118084449.Z14339@build.pdx.osdl.net> <419D6746.2020603@blueyonder.co.uk> <20041118231943.B14339@build.pdx.osdl.net> In-Reply-To: <20041118231943.B14339@build.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12009 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Chris Wright wrote: > * Ross Kendall Axe (ross.axe@blueyonder.co.uk) wrote: > >>Taking this idea further, couldn't we split unix_dgram_sendmsg into 2 >>functions, do_unix_dgram_sendmsg and do_unix_connectionless_sendmsg (and >>similarly for unix_stream_sendmsg), then all we'd need is: >> >> >>static int do_unix_dgram_sendmsg(...); >>static int do_unix_stream_sendmsg(...); >>static int do_unix_connectionless_sendmsg(...); >>static int do_unix_connectional_sendmsg(...); > > > We could probably break it down to better functions and helpers, but I'm > not sure that's quite the breakdown. That looks to me like an indirect > way to pass a flag which is already encoded in the ops and sk_type. > At anyrate, for 2.6.10 the changes should be small and obvious. > Better refactoring should be left for 2.6.11. Hey, go ahead, do the split and please, please use sk->sk_prot, that is the way to do the proper split and will allow us to nuke several pointers in struct sock (sk_slab, sk_owner for now) :-) I have a friend doing this for X.25, will submit his patches as soon as we do some more testing and 2.6.10 is out. - Arnaldo From acme@conectiva.com.br Fri Nov 19 06:15:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 06:15:35 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJEFTAb025375 for ; Fri, 19 Nov 2004 06:15:30 -0800 Received: from [200.138.46.101] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CV9Z7-0003x6-00; Fri, 19 Nov 2004 12:16:45 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id DA2451463D; Fri, 19 Nov 2004 12:15:06 -0200 (BRST) Message-ID: <419DF22E.5080102@conectiva.com.br> Date: Fri, 19 Nov 2004 11:16:30 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Arnaldo Carvalho de Melo Cc: Chris Wright , Ross Kendall Axe , James Morris , netdev@oss.sgi.com, Stephen Smalley , lkml , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET References: <20041118084449.Z14339@build.pdx.osdl.net> <419D6746.2020603@blueyonder.co.uk> <20041118231943.B14339@build.pdx.osdl.net> <419DEF98.9040303@conectiva.com.br> In-Reply-To: <419DEF98.9040303@conectiva.com.br> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12010 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Arnaldo Carvalho de Melo wrote: > > > Chris Wright wrote: > >> * Ross Kendall Axe (ross.axe@blueyonder.co.uk) wrote: >> >>> Taking this idea further, couldn't we split unix_dgram_sendmsg into 2 >>> functions, do_unix_dgram_sendmsg and do_unix_connectionless_sendmsg >>> (and similarly for unix_stream_sendmsg), then all we'd need is: >>> >>> >>> static int do_unix_dgram_sendmsg(...); >>> static int do_unix_stream_sendmsg(...); >>> static int do_unix_connectionless_sendmsg(...); >>> static int do_unix_connectional_sendmsg(...); >> >> >> >> We could probably break it down to better functions and helpers, but I'm >> not sure that's quite the breakdown. That looks to me like an indirect >> way to pass a flag which is already encoded in the ops and sk_type. >> At anyrate, for 2.6.10 the changes should be small and obvious. >> Better refactoring should be left for 2.6.11. > > > Hey, go ahead, do the split and please, please use sk->sk_prot, that is > the way to do the proper split and will allow us to nuke several > pointers in struct sock (sk_slab, sk_owner for now) :-) > > I have a friend doing this for X.25, will submit his patches as soon > as we do some more testing and 2.6.10 is out. Ah, this is the way the inet transport protos have been working for years, and I've been factoring out the struct proto_ops methods from TCP into the networking core, look at net/core/stream.c and the sock_common_ prefixed functions in net/core/sock.c. - Arnaldo From hno@marasystems.com Fri Nov 19 06:27:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 06:27:49 -0800 (PST) Received: from filer.marasystems.com (marasystems.com [83.241.133.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJERhwP025869 for ; Fri, 19 Nov 2004 06:27:44 -0800 Received: from localhost (henrik@localhost) by filer.marasystems.com (8.11.6/8.11.6) with ESMTP id iAJER2v12583; Fri, 19 Nov 2004 15:27:03 +0100 Date: Fri, 19 Nov 2004 15:27:02 +0100 (CET) From: Henrik Nordstrom To: "Chad N. Tindel" cc: Herbert Xu , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp In-Reply-To: <20041118190257.GA7084@calma.pair.com> Message-ID: References: <20041109205358.GA64015@calma.pair.com> <20041118190257.GA7084@calma.pair.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 12011 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hno@marasystems.com Precedence: bulk X-list: netdev On Thu, 18 Nov 2004, Chad N. Tindel wrote: > However, the problem still happens. We see many instances of the kernel > reporting the wrong user id. Have you aquired the proper read lock on the tcp connection hash? Regards Henrik From jmorris@redhat.com Fri Nov 19 08:24:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 08:24:43 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJGOcm8001423 for ; Fri, 19 Nov 2004 08:24:39 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAJGO9hj030567; Fri, 19 Nov 2004 11:24:09 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAJGO3r29718; Fri, 19 Nov 2004 11:24:04 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAJGO1hu001113; Fri, 19 Nov 2004 11:24:01 -0500 Date: Fri, 19 Nov 2004 11:24:03 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Alan Cox cc: Ross Kendall Axe , , Stephen Smalley , lkml , Chris Wright , "David S. Miller" Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET In-Reply-To: <1100864358.8127.5.camel@localhost.localdomain> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12012 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Fri, 19 Nov 2004, Alan Cox wrote: > Looks right to me, the ECONNRESET is no longer being lost. Ok, here is a relative patch for Dave. Please apply. Signed-off-by: James Morris --- diff -purN -X dontdiff linux-2.6.10-rc2.w2/net/unix/af_unix.c linux-2.6.10-rc2.w3/net/unix/af_unix.c --- linux-2.6.10-rc2.w2/net/unix/af_unix.c 2004-11-18 12:09:44.000000000 -0500 +++ linux-2.6.10-rc2.w3/net/unix/af_unix.c 2004-11-18 21:54:12.000000000 -0500 @@ -1513,13 +1513,18 @@ out_err: static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, struct msghdr *msg, size_t len) { + int err; struct sock *sk = sock->sk; + err = sock_error(sk); + if (err) + return err; + if (sk->sk_state != TCP_ESTABLISHED) return -ENOTCONN; - if (msg->msg_name || msg->msg_namelen) - return -EINVAL; + if (msg->msg_namelen) + msg->msg_namelen = 0; return unix_dgram_sendmsg(kiocb, sock, msg, len); } From yoshfuji@linux-ipv6.org Fri Nov 19 08:32:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 08:33:00 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJGWpYZ001852 for ; Fri, 19 Nov 2004 08:32:52 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 4333033CE5; Sat, 20 Nov 2004 01:33:45 +0900 (JST) Date: Fri, 19 Nov 2004 11:33:44 -0500 (EST) Message-Id: <20041119.113344.48190868.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, netdev@oss.sgi.com, acme@conectiva.com.br, jgarzik@pobox.com, yoshfuji@linux-ipv6.org Subject: Re: Fix ipv6_ifa_notify race From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041119094924.GA3726@gondor.apana.org.au> References: <4197AC20.6020707@pobox.com> <20041119094924.GA3726@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12013 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20041119094924.GA3726@gondor.apana.org.au> (at Fri, 19 Nov 2004 20:49:24 +1100), Herbert Xu says: > May I ask this question again: Is it possible to move some of > this complexity to user-space? I strongly believe it should be implemented in kernel. --yoshfuji From yoshfuji@linux-ipv6.org Fri Nov 19 08:36:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 08:36:10 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJGa4Hq002221 for ; Fri, 19 Nov 2004 08:36:04 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 66D4133CE5; Sat, 20 Nov 2004 01:36:59 +0900 (JST) Date: Fri, 19 Nov 2004 11:36:58 -0500 (EST) Message-Id: <20041119.113658.109538461.yoshfuji@linux-ipv6.org> To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, netdev@oss.sgi.com, acme@conectiva.com.br, jgarzik@pobox.com, yoshfuji@linux-ipv6.org Subject: Re: Fix ipv6_ifa_notify race From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041119094924.GA3726@gondor.apana.org.au> References: <4197AC20.6020707@pobox.com> <20041119094924.GA3726@gondor.apana.org.au> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12014 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20041119094924.GA3726@gondor.apana.org.au> (at Fri, 19 Nov 2004 20:49:24 +1100), Herbert Xu says: > On Mon, Nov 15, 2004 at 07:35:17AM +1100, Herbert Xu wrote: > > > > Could you please apply this patch and see if the warning triggers > > before the underflows start coming in? We already know that if it > > does then it can cause underflows but I want to make sure that > > this is what's causing your problems. > > Well I think it's time to fix this bug so that we don't release > 2.6.10 with it. > > This is only a temporary hack that should be rolled back once > the locking in addrconf.c is fixed properly. At the moment > the locking is just too twisted to fix properly for 2.6.10 :( This patch is wrong (dead is not protected appropriately). I have another idea to fix this. I'll send it tomorrow. --yoshfuji From jason.mcmullan@timesys.com Fri Nov 19 08:42:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 08:42:09 -0800 (PST) Received: from exchange.timesys.com (mail.timesys.com [65.117.135.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJGg33a002638 for ; Fri, 19 Nov 2004 08:42:03 -0800 Received: from jmcmullan by owa.timesys.com; 19 Nov 2004 11:41:38 -0500 Subject: Re: [PATCH] MII bus API for PHY devices From: Jason McMullan To: Benjamin Herrenschmidt Cc: Andy Fleming , netdev@oss.sgi.com, Linux Kernel list In-Reply-To: <1100820391.25521.14.camel@gaston> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100820391.25521.14.camel@gaston> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Fri, 19 Nov 2004 11:41:38 -0500 Message-Id: <1100882498.14467.58.camel@jmcmullan> Mime-Version: 1.0 X-Mailer: Evolution 2.0.1-1mdk X-archive-position: 12015 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jason.mcmullan@timesys.com Precedence: bulk X-list: netdev On Fri, 2004-11-19 at 10:26 +1100, Benjamin Herrenschmidt wrote: > The ethernet driver can instanciate the PHYs at it's childs, though the > case of several MACs sharing PHYs will be difficult to represent... I think *requiring* a binding to ethernet devices is a bad idea. For example, on many MPC8260 embedded systems, the MII bus is controlled by GPIO pins, not an ethernet MDIO system. Some applications may use the MII bus to control non-PHY devices, such as Broadcom ethernet switches. I'm working for a general MII bus that ethernet PHYs and other devices can all use. -- Jason McMullan From magnus@alum.mit.edu Fri Nov 19 09:14:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 09:14:14 -0800 (PST) Received: from mail4.speakeasy.net (mail4.speakeasy.net [216.254.0.204]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJHE3cr003534 for ; Fri, 19 Nov 2004 09:14:03 -0800 Received: (qmail 31382 invoked from network); 19 Nov 2004 17:13:43 -0000 Received: from dsl092-162-116.wdc2.dsl.speakeasy.net (HELO m5.risacher.org) ([66.92.162.116]) (envelope-sender ) by mail4.speakeasy.net (qmail-ldap-1.03) with SMTP for ; 19 Nov 2004 17:13:43 -0000 Received: from magnus by m5.risacher.org with local (Exim 3.36 #1 (Debian)) id 1CVCKI-0006S1-00 for ; Fri, 19 Nov 2004 12:13:38 -0500 From: Daniel Risacher To: netdev@oss.sgi.com Subject: source address for UDP broadcasts with aliased interfaces? Reply-to: magnus@alum.mit.edu Message-Id: Date: Fri, 19 Nov 2004 12:13:38 -0500 X-archive-position: 12016 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: magnus@alum.mit.edu Precedence: bulk X-list: netdev (previously posted on LKML; resent here per suggestion from Alan Cox) I'm not sure if this is a bug or a feature. There seems to be no way to get the kernel to send a UDP broadcast packet to INADDR_BROADCAST from a specific address, short of using iptables. I would think that bind()ing a socket to a local address would determine the source address, but the kernel seems to ignore the bound address. I'm trying to write a program that communicates with multiple hosts on a local net, several of which have firewall rules that drop packets from external addresses. The source computer has multiple aliased addresses on the eth0 interface. I therefore want to broadcast from a specific non-routable internal address. I've experimented with bind() and setsockopt(,SO_BINDTODEVICE,) to determine the source address and/or interface but the kernel seems to pick whatever it wants. Is there a correct way to specify the sender address/interface? Dan Risacher (reference code follows; testing was done on Linux 2.6.9) struct sockaddr_in to_addr; struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(0); /***** find_if_addr() will return 10.0.0.7 (the address of eth0) ******/ my_addr.sin_addr.s_addr = find_if_addr(interface); to_addr.sin_family = AF_INET; to_addr.sin_port = htons(11415); to_addr.sin_addr.s_addr = INADDR_BROADCAST; fd = socket(PF_INET, SOCK_DGRAM, 0); res = setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)); if (res) perror ("setsockopt (SO_BROADCAST)"); /***** this should bind the source to 10.0.0.7, I think *****/ res = bind(fd, (struct sockaddr*) &my_addr, sizeof(struct sockaddr_in)); if (res) perror ("bind"); res = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, interface, 1+strlen(interface)); if (res) perror ("setsockopt (SO_BINDTODEVICE)"); /***** when sent, the packet is actually coming from 66.92.162.116 (eth0:wan) *****/ res = sendto(fd, mesg, strlen(mesg), MSG_DONTROUTE, (struct sockaddr *)&to_addr, sizeof(struct sockaddr_in)); if (res == -1) perror ("sendto"); From gianluca@linux.it Fri Nov 19 10:08:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:08:38 -0800 (PST) Received: from coredumps.org (ppp-217-133-101-8.cust-adsl.tiscali.it [217.133.101.8]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAJI8W3B007432 for ; Fri, 19 Nov 2004 10:08:33 -0800 Received: (qmail 29630 invoked from network); 19 Nov 2004 18:10:47 -0000 Received: from unknown (HELO coredumps.org) (127.0.0.1) by localhost with SMTP; 19 Nov 2004 18:10:47 -0000 From: "Gianluca" To: netdev@oss.sgi.com Subject: IPv6 route buffer space problem Date: Fri, 19 Nov 2004 19:10:47 +0100 Message-Id: <20041119175924.M79505@coredumps.org> X-Mailer: Open WebMail 2.41 20040926 X-OriginatingIP: 82.89.255.232 (gianluca@coredumps.org) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-archive-position: 12017 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gianluca@linux.it Precedence: bulk X-list: netdev Hi, i have a problem when i add more than 500/540 sit interfaces on my linux box (debian), if i add a new interface (with iptunnel and ifconfig) i haven't errors but when i add a new router for the interface i have this error "No buffer space available". I had search on /proc for increment the buffer but i dont have found anythink, i think that i need to modify the kernel sources. Please help me. Gianluca. From manfred@colorfullife.com Fri Nov 19 10:13:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:13:45 -0800 (PST) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIDbp5007830 for ; Fri, 19 Nov 2004 10:13:38 -0800 Received: from dbl.q-ag.de (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAJIDHSL032605; Fri, 19 Nov 2004 19:13:17 +0100 Received: from localhost (manfred@localhost) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAJIDFAL032601; Fri, 19 Nov 2004 19:13:16 +0100 X-Authentication-Warning: dbl.q-ag.de: manfred owned process doing -bs Date: Fri, 19 Nov 2004 19:13:15 +0100 (CET) From: Manfred Spraul X-X-Sender: manfred@dbl.q-ag.de To: jgarzik@pobox.com cc: netdev@oss.sgi.com Subject: [PATCH 2.6.10-rc2] forcedeth: add ethtool get/set_settings support Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12018 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev The patch adds ethtool get_ and set_settings support to the forcedeth nic driver. This allows to force a certain link speed with ethtool -s. Supported link speeds: 10 HD&FD, 100 HD&FD, 1000 FD 1000 HD is not supported (probably a hardware restriction), 1000 FD is only supported with autonegotiation enabled. Changelog: - Code reorganization: move ethtool functions further down in forcedeth.c (no code changes within the existing ethtool functions) - add support for setting the link setting bits in the nic with autodetection in the PHY disabled (i.e. use a netdev_priv() variable instead of querying the PHY) - implement get_settings and set_settings ethtool functions. Signed-Off-By: Manfred Spraul // Kernel Version: // VERSION = 2 // PATCHLEVEL = 6 // SUBLEVEL = 10 // EXTRAVERSION =-rc1 --- 2.6/drivers/net/forcedeth.c 2004-11-14 14:50:21.000000000 +0100 +++ build-2.6/drivers/net/forcedeth.c 2004-11-17 05:55:13.440930446 +0100 @@ -79,6 +79,8 @@ * 0.30: 25 Sep 2004: rx checksum support for nf 250 Gb. Add rx reset * into nv_close, otherwise reenabling for wol can * cause DMA to kfree'd memory. + * 0.31: 14 Nov 2004: ethtool support for getting/setting link + * capabilities. * * Known bugs: * We suspect that on some hardware no TX done interrupts are generated. @@ -90,7 +92,7 @@ * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * superfluous timer interrupts from the nic. */ -#define FORCEDETH_VERSION "0.30" +#define FORCEDETH_VERSION "0.31" #define DRV_NAME "forcedeth" #include @@ -210,6 +212,7 @@ enum { #define NVREG_LINKSPEED_10 1000 #define NVREG_LINKSPEED_100 100 #define NVREG_LINKSPEED_1000 50 +#define NVREG_LINKSPEED_MASK (0xFFF) NvRegUnknownSetupReg5 = 0x130, #define NVREG_UNKSETUP5_BIT31 (1<<31) NvRegUnknownSetupReg3 = 0x13c, @@ -441,6 +444,8 @@ struct fe_priv { int in_shutdown; u32 linkspeed; int duplex; + int autoneg; + int fixed_mode; int phyaddr; int wolenabled; unsigned int phy_oui; @@ -765,50 +770,6 @@ static struct net_device_stats *nv_get_s return &np->stats; } -static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) -{ - struct fe_priv *np = get_nvpriv(dev); - strcpy(info->driver, "forcedeth"); - strcpy(info->version, FORCEDETH_VERSION); - strcpy(info->bus_info, pci_name(np->pci_dev)); -} - -static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - wolinfo->supported = WAKE_MAGIC; - - spin_lock_irq(&np->lock); - if (np->wolenabled) - wolinfo->wolopts = WAKE_MAGIC; - spin_unlock_irq(&np->lock); -} - -static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - - spin_lock_irq(&np->lock); - if (wolinfo->wolopts == 0) { - writel(0, base + NvRegWakeUpFlags); - np->wolenabled = 0; - } - if (wolinfo->wolopts & WAKE_MAGIC) { - writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); - np->wolenabled = 1; - } - spin_unlock_irq(&np->lock); - return 0; -} - -static struct ethtool_ops ops = { - .get_drvinfo = nv_get_drvinfo, - .get_link = ethtool_op_get_link, - .get_wol = nv_get_wol, - .set_wol = nv_set_wol, -}; - /* * nv_alloc_rx: fill rx ring entries. * Return 1 if the allocations for the skbs failed and the @@ -1286,6 +1247,25 @@ static int nv_update_linkspeed(struct ne goto set_speed; } + if (np->autoneg == 0) { + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: autoneg off, PHY set to 0x%04x.\n", + dev->name, np->fixed_mode); + if (np->fixed_mode & LPA_100FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 1; + } else if (np->fixed_mode & LPA_100HALF) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; + newdup = 0; + } else if (np->fixed_mode & LPA_10FULL) { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 1; + } else { + newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + newdup = 0; + } + retval = 1; + goto set_speed; + } /* check auto negotiation is complete */ if (!(mii_status & BMSR_ANEGCOMPLETE)) { /* still in autonegotiation - configure nic for 10 MBit HD and wait. */ @@ -1303,7 +1283,7 @@ static int nv_update_linkspeed(struct ne if ((control_1000 & ADVERTISE_1000FULL) && (status_1000 & LPA_1000FULL)) { - dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: GBit ethernet detected.\n", dev->name); newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_1000; newdup = 1; @@ -1362,9 +1342,9 @@ set_speed: phyreg &= ~(PHY_HALF|PHY_100|PHY_1000); if (np->duplex == 0) phyreg |= PHY_HALF; - if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_100) + if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_100) phyreg |= PHY_100; - else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_1000) + else if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) phyreg |= PHY_1000; writel(phyreg, base + NvRegPhyInterface); @@ -1500,6 +1480,227 @@ static void nv_do_nic_poll(unsigned long enable_irq(dev->irq); } +static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct fe_priv *np = get_nvpriv(dev); + strcpy(info->driver, "forcedeth"); + strcpy(info->version, FORCEDETH_VERSION); + strcpy(info->bus_info, pci_name(np->pci_dev)); +} + +static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + wolinfo->supported = WAKE_MAGIC; + + spin_lock_irq(&np->lock); + if (np->wolenabled) + wolinfo->wolopts = WAKE_MAGIC; + spin_unlock_irq(&np->lock); +} + +static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = get_nvpriv(dev); + u8 __iomem *base = get_hwbase(dev); + + spin_lock_irq(&np->lock); + if (wolinfo->wolopts == 0) { + writel(0, base + NvRegWakeUpFlags); + np->wolenabled = 0; + } + if (wolinfo->wolopts & WAKE_MAGIC) { + writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); + np->wolenabled = 1; + } + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + int adv; + + spin_lock_irq(&np->lock); + ecmd->port = PORT_MII; + if (!netif_running(dev)) { + /* We do not track link speed / duplex setting if the + * interface is disabled. Force a link check */ + nv_update_linkspeed(dev); + } + switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { + case NVREG_LINKSPEED_10: + ecmd->speed = SPEED_10; + break; + case NVREG_LINKSPEED_100: + ecmd->speed = SPEED_100; + break; + case NVREG_LINKSPEED_1000: + ecmd->speed = SPEED_1000; + break; + } + ecmd->duplex = DUPLEX_HALF; + if (np->duplex) + ecmd->duplex = DUPLEX_FULL; + + ecmd->autoneg = np->autoneg; + + ecmd->advertising = ADVERTISED_MII; + if (np->autoneg) { + ecmd->advertising |= ADVERTISED_Autoneg; + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + } else { + adv = np->fixed_mode; + } + if (adv & ADVERTISE_10HALF) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (adv & ADVERTISE_10FULL) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (adv & ADVERTISE_100HALF) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (adv & ADVERTISE_100FULL) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (np->autoneg && np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + if (adv & ADVERTISE_1000FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + } + + ecmd->supported = (SUPPORTED_Autoneg | + SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | + SUPPORTED_MII); + if (np->gigabit == PHY_GIGABIT) + ecmd->supported |= SUPPORTED_1000baseT_Full; + + ecmd->phy_address = np->phyaddr; + ecmd->transceiver = XCVR_EXTERNAL; + + /* ignore maxtxpkt, maxrxpkt for now */ + spin_unlock_irq(&np->lock); + return 0; +} + +static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) +{ + struct fe_priv *np = netdev_priv(dev); + + if (ecmd->port != PORT_MII) + return -EINVAL; + if (ecmd->transceiver != XCVR_EXTERNAL) + return -EINVAL; + if (ecmd->phy_address != np->phyaddr) { + /* TODO: support switching between multiple phys. Should be + * trivial, but not enabled due to lack of test hardware. */ + return -EINVAL; + } + if (ecmd->autoneg == AUTONEG_ENABLE) { + u32 mask; + + mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; + if (np->gigabit == PHY_GIGABIT) + mask |= ADVERTISED_1000baseT_Full; + + if ((ecmd->advertising & mask) == 0) + return -EINVAL; + + } else if (ecmd->autoneg == AUTONEG_DISABLE) { + /* Note: autonegotiation disable, speed 1000 intentionally + * forbidden - noone should need that. */ + + if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) + return -EINVAL; + if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) + return -EINVAL; + } else { + return -EINVAL; + } + + spin_lock_irq(&np->lock); + if (ecmd->autoneg == AUTONEG_ENABLE) { + int adv, bmcr; + + np->autoneg = 1; + + /* advertise only what has been requested */ + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->advertising & ADVERTISED_10baseT_Half) + adv |= ADVERTISE_10HALF; + if (ecmd->advertising & ADVERTISED_10baseT_Full) + adv |= ADVERTISE_10FULL; + if (ecmd->advertising & ADVERTISED_100baseT_Half) + adv |= ADVERTISE_100HALF; + if (ecmd->advertising & ADVERTISED_100baseT_Full) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + if (ecmd->advertising & ADVERTISED_1000baseT_Full) + adv |= ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + + } else { + int adv, bmcr; + + np->autoneg = 0; + + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_10HALF; + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_10FULL; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_100HALF; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + np->fixed_mode = adv; + + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= ~(BMCR_ANENABLE|BMCR_SPEED100|BMCR_FULLDPLX); + if (adv & (ADVERTISE_10FULL|ADVERTISE_100FULL)) + bmcr |= BMCR_FULLDPLX; + if (adv & (ADVERTISE_100HALF|ADVERTISE_100FULL)) + bmcr |= BMCR_SPEED100; + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + + if (netif_running(dev)) { + /* Wait a bit and then reconfigure the nic. */ + udelay(10); + nv_linkchange(dev); + } + } + spin_unlock_irq(&np->lock); + + return 0; +} + +static struct ethtool_ops ops = { + .get_drvinfo = nv_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_wol = nv_get_wol, + .set_wol = nv_set_wol, + .get_settings = nv_get_settings, + .set_settings = nv_set_settings, +}; + static int nv_open(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); @@ -1550,9 +1751,6 @@ static int nv_open(struct net_device *de base + NvRegRingSizes); /* 5) continue setup */ - np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; - np->duplex = 0; - writel(np->linkspeed, base + NvRegLinkSpeed); writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); writel(np->desc_ver, base + NvRegTxRxControl); @@ -1866,6 +2064,11 @@ static int __devinit nv_probe(struct pci phy_init(dev); } + /* set default link speed settings */ + np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; + np->duplex = 0; + np->autoneg = 1; + err = register_netdev(dev); if (err) { printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err); From shemminger@osdl.org Fri Nov 19 10:40:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:40:52 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIekKf008543 for ; Fri, 19 Nov 2004 10:40:46 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJIeKPE004281 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 19 Nov 2004 10:40:21 -0800 Date: Fri, 19 Nov 2004 10:43:31 -0800 From: Stephen Hemminger Cc: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (23/25) sk98: eliminate Pnmi scratchpad Message-Id: <20041119104331.70a45312@zqx3.pdx.osdl.net> In-Reply-To: <20041115155832.264aa86f@zqx3.pdx.osdl.net> References: <20041115155832.264aa86f@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12019 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev (Resend to deal with line wrap and other issues) Get rid of 44K of space in the driver structure which was just being used as a scratch pad when making the calls to read stats. PnmiStruct can just be kmalloc'd/kfree in those cases. PNMI initialization can be done in one place using existing macro's for consitency Don't need to cast and mask when converting u64 to u32. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-19 10:38:39 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-19 10:38:39 -08:00 @@ -404,9 +404,9 @@ spinlock_t SlowPathLock; /* Normal IRQ lock */ struct timer_list BlinkTimer; /* for LED blinking */ int LedsOn; - SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */ - int RlmtMode; /* link check mode to set */ - int RlmtNets; /* Number of nets */ + + int RlmtMode; /* link check mode to set */ + int RlmtNets; /* Number of nets */ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */ @@ -445,7 +445,6 @@ #ifdef SK_DIAG_SUPPORT SK_U32 DiagModeActive; /* is diag active? */ SK_BOOL DiagFlowCtrl; /* for control purposes */ - SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while * DIAG is busy with NIC */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-19 10:38:39 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-19 10:38:39 -08:00 @@ -261,9 +261,26 @@ static void sk98_get_ethstats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { - const DEV_NET *pNet = netdev_priv(dev); - const SK_AC *pAC = pNet->pAC; - const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + unsigned long flags; + unsigned int size; + int err; + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, flags); + err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); + + if (err) + return; *data++ = pPnmiStruct->Stat[0].StatRxOkCts; *data++ = pPnmiStruct->Stat[0].StatTxOkCts; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-19 10:38:39 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-19 10:38:39 -08:00 @@ -205,7 +205,7 @@ static void ClearTxRing(SK_AC*, TX_PORT*); static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); -static int SkGeIocMib(DEV_NET*, unsigned int, int); +static unsigned int SkGeIocMib(DEV_NET*, SK_PNMI_STRUCT_DATA *,unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); static void StartDrvCleanupTimer(SK_AC *pAC); static void StopDrvCleanupTimer(SK_AC *pAC); @@ -1356,10 +1356,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: done ")); - SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA)); - SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); - pAC->MaxPorts--; return (0); @@ -2736,13 +2732,18 @@ SK_AC *pAC = pNet->pAC; SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ -SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */ unsigned int Size; /* size of pnmi struct */ unsigned long Flags; /* for spin lock */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeStats starts now...\n")); - pPnmiStruct = &pAC->PnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_ATOMIC); + if (!pPnmiStruct) + goto out; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + Size = sizeof(*pPnmiStruct); #ifdef SK_DIAG_SUPPORT if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && @@ -2758,7 +2759,6 @@ #endif pPnmiStat = &pPnmiStruct->Stat[0]; - pPnmiConf = &pPnmiStruct->Conf[0]; pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; @@ -2797,7 +2797,9 @@ pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; pAC->stats.tx_window_errors = (SK_U32) 0; - return(&pAC->stats); + kfree(pPnmiStruct); + out: + return &pAC->stats; } /* SkGeStats */ @@ -2821,9 +2823,7 @@ void *pMemBuf; struct pci_dev *pdev = NULL; SK_GE_IOCTL Ioctl; -unsigned int Err = 0; -int Size = 0; -int Ret = 0; +int Err = 0; unsigned int Length = 0; int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); @@ -2842,27 +2842,35 @@ case SK_IOCTL_PRESETMIB: if (!capable(CAP_NET_ADMIN)) return -EPERM; case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, - Ioctl.LenPnmiStruct)? - Ioctl.Len : sizeof(pAC->PnmiStruct))) { - return -EFAULT; - } - Size = SkGeIocMib(pNet, Ioctl.Len, cmd); - if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct, - Ioctl.Lenifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + { + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + + if (copy_from_user(pPnmiStruct, Ioctl.pData, + min(sizeof(*pPnmiStruct), Ioctl.Len))) return -EFAULT; + + Length = SkGeIocMib(pNet, pPnmiStruct, Ioctl.Len, cmd); + if (copy_to_user(Ioctl.pData, pPnmiStruct, + min(Length, Ioctl.Len))) + Err = -EFAULT; + else { + Ioctl.Len = Length; + if (copy_to_user(rq->ifr_data, &Ioctl, + sizeof(SK_GE_IOCTL))) + Err = -EFAULT; } + kfree(pPnmiStruct); break; + } case SK_IOCTL_GEN: - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } @@ -2870,16 +2878,16 @@ Err = -EFAULT; goto fault_gen; } - if ((Ret = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { + if ((Err = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { Err = -EFAULT; goto fault_gen; } - if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { + if (copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_gen; } Ioctl.Len = Length; - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + if (copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { Err = -EFAULT; goto fault_gen; } @@ -2889,15 +2897,14 @@ #ifdef SK_DIAG_SUPPORT case SK_IOCTL_DIAG: if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } - if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { + + if (copy_from_user(pMemBuf, Ioctl.pData, Length)) { Err = -EFAULT; goto fault_diag; } @@ -2933,7 +2940,6 @@ } /* SkGeIoctl */ - /***************************************************************************** * * SkGeIocMib - handle a GetMib, SetMib- or PresetMib-ioctl message @@ -2951,8 +2957,9 @@ * Returns: * returned size from PNMI call */ -static int SkGeIocMib( +static unsigned int SkGeIocMib( DEV_NET *pNet, /* pointer to the adapter context */ +SK_PNMI_STRUCT_DATA *pPnmiStruct, /* structure for all Pnmi-Data */ unsigned int Size, /* length of ioctl data */ int mode) /* flag for set/preset */ { @@ -2966,16 +2973,13 @@ spin_lock_irqsave(&pAC->SlowPathLock, Flags); switch(mode) { case SK_IOCTL_GETMIB: - SkPnmiGetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_PRESETMIB: - SkPnmiPreSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiPreSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_SETMIB: - SkPnmiSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; default: break; @@ -4386,9 +4390,6 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct), - sizeof(SK_PNMI_STRUCT_DATA)); - pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { if (netif_running(pAC->dev[0])) { @@ -4430,8 +4431,6 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - SK_MEMCPY(&(pAc->PnmiStruct), &(pAc->PnmiBackup), - sizeof(SK_PNMI_STRUCT_DATA)); pAc->DiagModeActive = DIAG_NOTACTIVE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) { @@ -4823,9 +4822,6 @@ /* Set driver globals */ pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; - - memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); - memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); #ifdef USE_SK_RX_CHECKSUM pAC->RxPort[0].UseRxCsum = SK_TRUE; diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c 2004-11-19 10:38:39 -08:00 +++ b/drivers/net/sk98lin/skproc.c 2004-11-19 10:38:39 -08:00 @@ -63,33 +63,26 @@ struct net_device *dev = seq->private; DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; - SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + SK_PNMI_STRUCT_DATA *pPnmiStruct; unsigned long Flags; unsigned int Size; char sens_msg[50]; int t; int i; + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + /* NetIndex in GetStruct is now required, zero is only dummy */ for (t=pAC->GIni.GIMacsFound; t > 0; t--) { if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1) t--; + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); spin_lock_irqsave(&pAC->SlowPathLock, Flags); Size = SK_PNMI_STRUCT_SIZE; -#ifdef SK_DIAG_SUPPORT - if (pAC->BoardLevel == SK_INIT_DATA) { - SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); - if (pAC->DiagModeActive == DIAG_NOTACTIVE) { - pAC->Pnmi.DiagAttached = SK_DIAG_IDLE; - } - } else { - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); - } -#else - SkPnmiGetStruct(pAC, pAC->IoBase, - pPnmiStruct, &Size, t-1); -#endif + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->dev[t-1] == dev) { @@ -243,6 +236,7 @@ } } + kfree(pPnmiStruct); return 0; } From shemminger@osdl.org Fri Nov 19 10:41:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:41:24 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIfKmj008864 for ; Fri, 19 Nov 2004 10:41:20 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJIetPE004321 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 19 Nov 2004 10:40:56 -0800 Date: Fri, 19 Nov 2004 10:44:06 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (18/25) sk98: lockless transmit Message-Id: <20041119104406.55899db0@zqx3.pdx.osdl.net> In-Reply-To: <20041115154646.5697055a@zqx3.pdx.osdl.net> References: <20041115154646.5697055a@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12020 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev (Previous patch would apply clean, try this) Sk transmit path has it's own locking so doesn't need locking in device queueing layer. Move net device initiailzation that was done twice (once for each port), to a common place. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-19 10:35:08 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-19 10:35:08 -08:00 @@ -1382,6 +1382,7 @@ * Returns: * 0 (NETDEV_TX_OK) if everything is ok * 1 (NETDEV_TX_BUSY) if ring is full + * -1(NETDEV_TX_LOCKED) lock collision */ int SkGeXmit(struct sk_buff *skb, struct net_device *dev) { @@ -1396,7 +1397,12 @@ else pTxPort = &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW]; - spin_lock_irqsave(&pTxPort->TxDesRingLock, flags); + local_irq_save(flags); + if (!spin_trylock(&pTxPort->TxDesRingLock)) { + /* Collision - tell upper layer to requeue */ + local_irq_restore(flags); + return NETDEV_TX_LOCKED; + } if ((!skb_shinfo(skb)->nr_frags) || (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) @@ -4779,6 +4785,42 @@ #endif +static void __devinit SkGeNetDevInit(struct net_device *dev, + struct pci_dev *pdev, + const SK_AC *pAC) +{ + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); + SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); + + dev->open = SkGeOpen; + dev->stop = SkGeClose; + dev->hard_start_xmit = SkGeXmit; + dev->get_stats = SkGeStats; + dev->set_multicast_list = SkGeSetRxMode; + dev->set_mac_address = SkGeSetMacAddr; + dev->do_ioctl = SkGeIoctl; + dev->change_mtu = SkGeChangeMtu; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = SkGePollController; +#endif + dev->flags &= ~IFF_RUNNING; + dev->features |= NETIF_F_LLTX; + + if (pdev->dma_mask == DMA_64BIT_MASK) + dev->features |= NETIF_F_HIGHDMA; + + if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { +#ifdef SK_ZEROCOPY + dev->features |= NETIF_F_SG; +#endif +#ifdef USE_SK_TX_CHECKSUM + dev->features |= NETIF_F_IP_CSUM; +#endif + } +} + + static int __devinit skge_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -4827,37 +4869,13 @@ goto out_free_netdev; } - SET_MODULE_OWNER(dev); - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; -#ifdef CONFIG_NET_POLL_CONTROLLER - dev->poll_controller = &SkGePollController; -#endif - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* Use only if yukon hardware */ - /* SK and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif - pAC->Index = boards_found++; if (SkGeBoardInit(dev, pAC)) goto out_free_netdev; + SkGeNetDevInit(dev, pdev, pAC); + /* Register net device */ if (register_netdev(dev)) { printk(KERN_ERR "SKGE: Could not register device.\n"); @@ -4903,26 +4921,7 @@ pNet->NetNr = 1; pNet->pAC = pAC; - dev->open = &SkGeOpen; - dev->stop = &SkGeClose; - dev->hard_start_xmit = &SkGeXmit; - dev->get_stats = &SkGeStats; - dev->set_multicast_list = &SkGeSetRxMode; - dev->set_mac_address = &SkGeSetMacAddr; - dev->do_ioctl = &SkGeIoctl; - dev->change_mtu = &SkGeChangeMtu; - dev->flags &= ~IFF_RUNNING; - SET_NETDEV_DEV(dev, &pdev->dev); - SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); - -#ifdef SK_ZEROCOPY -#ifdef USE_SK_TX_CHECKSUM - if (pAC->ChipsetType) { - /* SG and ZEROCOPY - fly baby... */ - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; - } -#endif -#endif + SkGeNetDevInit(dev, pdev, pAC); if (register_netdev(dev)) { printk(KERN_ERR "SKGE: Could not register device.\n"); From shemminger@osdl.org Fri Nov 19 10:42:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:42:44 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIgX6E009705 for ; Fri, 19 Nov 2004 10:42:33 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJIg7PE004455 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 19 Nov 2004 10:42:08 -0800 Date: Fri, 19 Nov 2004 10:45:18 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (21/25) sk98: receive checksum settings via ethtool Message-Id: <20041119104518.1f0dc17b@zqx3.pdx.osdl.net> In-Reply-To: <20041115155418.76c2689d@zqx3.pdx.osdl.net> References: <20041115155418.76c2689d@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12021 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev (Another patch which didn't apply clean). Allow controlling receive checksum offload with ethtool. Linux doesn't need the "portable" checksum offload code, just creating a CHECKSUM_HW skb does the right thing and is faster. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile --- a/drivers/net/sk98lin/Makefile 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/Makefile 2004-11-19 10:34:02 -08:00 @@ -26,8 +26,7 @@ skrlmt.o \ sktimer.o \ skvpd.o \ - skxmac2.o \ - skcsum.o + skxmac2.o ifdef CONFIG_PROC_FS sk98lin-objs += skproc.o @@ -81,7 +80,8 @@ # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources # SK_DBGCAT_DRV_EVENT 0x08000000 driver events -EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) +EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT \ + -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) clean: rm -f core *.o *.a *.s diff -Nru a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h --- a/drivers/net/sk98lin/h/skcsum.h 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/h/skcsum.h 2004-11-19 10:34:02 -08:00 @@ -155,11 +155,11 @@ * s_Csum - The CSUM module context structure. */ typedef struct s_Csum { +#ifdef SK_USE_CSUM /* Enabled receive SK_PROTO_XXX bit flags. */ unsigned ReceiveFlags[SK_MAX_NETS]; -#ifdef TX_CSUM unsigned TransmitFlags[SK_MAX_NETS]; -#endif /* TX_CSUM */ +#endif /* The protocol statistics structure; one per supported protocol. */ SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/h/skdrv1st.h 2004-11-19 10:34:02 -08:00 @@ -71,14 +71,6 @@ #include #include - -#define SK_CS_CALCULATE_CHECKSUM -#ifndef CONFIG_X86_64 -#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff) -#else -#define SkCsCalculateChecksum(p,l) ((~ip_fast_csum(p, l)) & 0xffff) -#endif - #include "h/sktypes.h" #include "h/skerror.h" #include "h/skdebug.h" diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-19 10:34:02 -08:00 @@ -213,6 +213,13 @@ #define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */ #define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */ +/* +** Hardware supports receive checksumming starting at two offsets +** Linux only uses the first one (skip ether header). +*/ +#define SK_CHECKSUM_OFFSET_1 ETH_HLEN +#define SK_CHECKSUM_OFFSET_2 (ETH_HLEN + 20) + /* TX and RX descriptors *****************************************************/ typedef struct s_RxD RXD; /* the receive descriptor */ @@ -316,6 +323,7 @@ int RxFillLimit; /* limit for buffers in ring */ SK_IOC HwAddr; /* bmu registers address */ int PortIndex; /* index number of port (0 or 1) */ + SK_BOOL UseRxCsum; /* use Rx checksumming (yes/no) */ }; /* Definitions needed for interrupt moderation *******************************/ @@ -423,10 +431,6 @@ /* the port structures with descriptor rings */ TX_PORT TxPort[SK_MAX_MACS][2]; RX_PORT RxPort[SK_MAX_MACS]; - - unsigned int CsOfs1; /* for checksum calculation */ - unsigned int CsOfs2; /* for checksum calculation */ - SK_U32 CsOfs; /* for checksum calculation */ SK_BOOL CheckQueue; /* check event queue soon */ SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ diff -Nru a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c --- a/drivers/net/sk98lin/skcsum.c 2004-11-19 10:34:02 -08:00 +++ /dev/null Wed Dec 31 16:00:00 196900 @@ -1,871 +0,0 @@ -/****************************************************************************** - * - * Name: skcsum.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 2003/08/20 13:55:53 $ - * Purpose: Store/verify Internet checksum in send/receive packets. - * - ******************************************************************************/ - -/****************************************************************************** - * - * (C)Copyright 1998-2003 SysKonnect GmbH. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -#ifdef SK_USE_CSUM /* Check if CSUM is to be used. */ - -#ifndef lint -static const char SysKonnectFileId[] = - "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect."; -#endif /* !lint */ - -/****************************************************************************** - * - * Description: - * - * This is the "GEnesis" common module "CSUM". - * - * This module contains the code necessary to calculate, store, and verify the - * Internet Checksum of IP, TCP, and UDP frames. - * - * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" - * and is the code name of this SysKonnect project. - * - * Compilation Options: - * - * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an - * empty module. - * - * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id - * definitions. In this case, all SKCS_PROTO_xxx definitions must be made - * external. - * - * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status - * definitions. In this case, all SKCS_STATUS_xxx definitions must be made - * external. - * - * Include File Hierarchy: - * - * "h/skdrv1st.h" - * "h/skcsum.h" - * "h/sktypes.h" - * "h/skqueue.h" - * "h/skdrv2nd.h" - * - ******************************************************************************/ - -#include "h/skdrv1st.h" -#include "h/skcsum.h" -#include "h/skdrv2nd.h" - -/* defines ********************************************************************/ - -/* The size of an Ethernet MAC header. */ -#define SKCS_ETHERNET_MAC_HEADER_SIZE (6+6+2) - -/* The size of the used topology's MAC header. */ -#define SKCS_MAC_HEADER_SIZE SKCS_ETHERNET_MAC_HEADER_SIZE - -/* The size of the IP header without any option fields. */ -#define SKCS_IP_HEADER_SIZE 20 - -/* - * Field offsets within the IP header. - */ - -/* "Internet Header Version" and "Length". */ -#define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH 0 - -/* "Total Length". */ -#define SKCS_OFS_IP_TOTAL_LENGTH 2 - -/* "Flags" "Fragment Offset". */ -#define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET 6 - -/* "Next Level Protocol" identifier. */ -#define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL 9 - -/* Source IP address. */ -#define SKCS_OFS_IP_SOURCE_ADDRESS 12 - -/* Destination IP address. */ -#define SKCS_OFS_IP_DESTINATION_ADDRESS 16 - - -/* - * Field offsets within the UDP header. - */ - -/* UDP checksum. */ -#define SKCS_OFS_UDP_CHECKSUM 6 - -/* IP "Next Level Protocol" identifiers (see RFC 790). */ -#define SKCS_PROTO_ID_TCP 6 /* Transport Control Protocol */ -#define SKCS_PROTO_ID_UDP 17 /* User Datagram Protocol */ - -/* IP "Don't Fragment" bit. */ -#define SKCS_IP_DONT_FRAGMENT SKCS_HTON16(0x4000) - -/* Add a byte offset to a pointer. */ -#define SKCS_IDX(pPtr, Ofs) ((void *) ((char *) (pPtr) + (Ofs))) - -/* - * Macros that convert host to network representation and vice versa, i.e. - * little/big endian conversion on little endian machines only. - */ -#ifdef SK_LITTLE_ENDIAN -#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8)) -#endif /* SK_LITTLE_ENDIAN */ -#ifdef SK_BIG_ENDIAN -#define SKCS_HTON16(Val16) (Val16) -#endif /* SK_BIG_ENDIAN */ -#define SKCS_NTOH16(Val16) SKCS_HTON16(Val16) - -/* typedefs *******************************************************************/ - -/* function prototypes ********************************************************/ - -/****************************************************************************** - * - * SkCsGetSendInfo - get checksum information for a send packet - * - * Description: - * Get all checksum information necessary to send a TCP or UDP packet. The - * function checks the IP header passed to it. If the high-level protocol - * is either TCP or UDP the pseudo header checksum is calculated and - * returned. - * - * The function returns the total length of the IP header (including any - * IP option fields), which is the same as the start offset of the IP data - * which in turn is the start offset of the TCP or UDP header. - * - * The function also returns the TCP or UDP pseudo header checksum, which - * should be used as the start value for the hardware checksum calculation. - * (Note that any actual pseudo header checksum can never calculate to - * zero.) - * - * Note: - * There is a bug in the GENESIS ASIC which may lead to wrong checksums. - * - * Arguments: - * pAc - A pointer to the adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the IP header *not* - * including any option fields, i.e. at least 20 bytes. - * - * Note: This pointer will be used to address 8-, 16-, and 32-bit - * variables with the respective alignment offsets relative to the pointer. - * Thus, the pointer should point to a 32-bit aligned address. If the - * target system cannot address 32-bit variables on non 32-bit aligned - * addresses, then the pointer *must* point to a 32-bit aligned address. - * - * pPacketInfo - A pointer to the packet information structure for this - * packet. Before calling this SkCsGetSendInfo(), the following field must - * be initialized: - * - * ProtocolFlags - Initialize with any combination of - * SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on - * the protocols specified here. Any protocol(s) not specified - * here will be ignored. - * - * Note: Only one checksum can be calculated in hardware. Thus, if - * SKCS_PROTO_IP is specified in the 'ProtocolFlags', - * SkCsGetSendInfo() must calculate the IP header checksum in - * software. It might be a better idea to have the calling - * protocol stack calculate the IP header checksum. - * - * Returns: N/A - * On return, the following fields in 'pPacketInfo' may or may not have - * been filled with information, depending on the protocol(s) found in the - * packet: - * - * ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s) - * that were both requested by the caller and actually found in the packet. - * Protocol(s) not specified by the caller and/or not found in the packet - * will have their respective SKCS_PROTO_XXX bit flags reset. - * - * Note: For IP fragments, TCP and UDP packet information is ignored. - * - * IpHeaderLength - The total length in bytes of the complete IP header - * including any option fields is returned here. This is the start offset - * of the IP data, i.e. the TCP or UDP header if present. - * - * IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the - * 16-bit Internet Checksum of the IP header is returned here. This value - * is to be stored into the packet's 'IP Header Checksum' field. - * - * PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP - * has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum - * of the TCP or UDP pseudo header is returned here. - */ -void SkCsGetSendInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -SKCS_PACKET_INFO *pPacketInfo, /* Packet information struct. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Bit field specifiying the desired/found protocols. */ - unsigned ProtocolFlags; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* TCP/UDP pseudo header checksum. */ - unsigned long PseudoHeaderChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - pPacketInfo->IpHeaderLength = IpHeaderLength; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, - ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pPacketInfo->ProtocolFlags = 0; - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; - return; - } - - /* This is an IPv4 frame with a header of valid length. */ - - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++; - - /* Check if we should calculate the IP header checksum. */ - - ProtocolFlags = pPacketInfo->ProtocolFlags; - - if (ProtocolFlags & SKCS_PROTO_IP) { - pPacketInfo->IpHeaderChecksum = - SkCsCalculateChecksum(pIpHeader, IpHeaderLength); - } - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = - *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP; - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - return; - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; - NextLevelProtoStats->TxUnableCts++; - return; - } - - /* - * Calculate the TCP/UDP pseudo header checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - /* Calculate the sum of all pseudo header fields (16-bit). */ - - PseudoHeaderChecksum = - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength); - - /* Add-in any carries. */ - - SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0); - - pPacketInfo->ProtocolFlags = ProtocolFlags; - NextLevelProtoStats->TxOkCts++; /* Success. */ -} /* SkCsGetSendInfo */ - - -/****************************************************************************** - * - * SkCsGetReceiveInfo - verify checksum information for a received packet - * - * Description: - * Verify a received frame's checksum. The function returns a status code - * reflecting the result of the verification. - * - * Note: - * Before calling this function you have to verify that the frame is - * not padded and Checksum1 and Checksum2 are bigger than 1. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * pIpHeader - Pointer to IP header. Must be at least the length in bytes - * of the received IP header including any option fields. For UDP packets, - * 8 additional bytes are needed to access the UDP checksum. - * - * Note: The actual length of the IP header is stored in the lower four - * bits of the first octet of the IP header as the number of 4-byte words, - * so it must be multiplied by four to get the length in bytes. Thus, the - * maximum IP header length is 15 * 4 = 60 bytes. - * - * Checksum1 - The first 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Checksum2 - The second 16-bit Internet Checksum calculated by the - * hardware starting at the offset returned by SkCsSetReceiveFlags(). - * - * Returns: - * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. - * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. - * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. - * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame - * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). - * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). - * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). - * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). - * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. - * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. - * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. - * - * Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values - * returned here can be defined in some header file by the module using CSUM. - * In this way, the calling module can assign return values for its own needs, - * e.g. by assigning bit flags to the individual protocols. - */ -SKCS_STATUS SkCsGetReceiveInfo( -SK_AC *pAc, /* Adapter context struct. */ -void *pIpHeader, /* IP header. */ -unsigned Checksum1, /* Hardware checksum 1. */ -unsigned Checksum2, /* Hardware checksum 2. */ -int NetNumber) /* Net number */ -{ - /* Internet Header Version found in IP header. */ - unsigned InternetHeaderVersion; - - /* Length of the IP header as found in IP header. */ - unsigned IpHeaderLength; - - /* Length of IP data portion. */ - unsigned IpDataLength; - - /* IP header checksum. */ - unsigned IpHeaderChecksum; - - /* IP header options checksum, if any. */ - unsigned IpOptionsChecksum; - - /* IP data checksum, i.e. TCP/UDP checksum. */ - unsigned IpDataChecksum; - - /* Next level protocol identifier found in IP header. */ - unsigned NextLevelProtocol; - - /* The checksum of the "next level protocol", i.e. TCP or UDP. */ - unsigned long NextLevelProtocolChecksum; - - /* Pointer to next level protocol statistics structure. */ - SKCS_PROTO_STATS *NextLevelProtoStats; - - /* Temporary variable. */ - unsigned Tmp; - - Tmp = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); - - /* Get the Internet Header Version (IHV). */ - /* Note: The IHV is stored in the upper four bits. */ - - InternetHeaderVersion = Tmp >> 4; - - /* Check the Internet Header Version. */ - /* Note: We currently only support IP version 4. */ - - if (InternetHeaderVersion != 4) { /* IPv4? */ - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Unknown Internet Header Version %u.\n", - InternetHeaderVersion)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++; - return (SKCS_STATUS_UNKNOWN_IP_VERSION); - } - - /* Get the IP header length (IHL). */ - /* - * Note: The IHL is stored in the lower four bits as the number of - * 4-byte words. - */ - - IpHeaderLength = (Tmp & 0xf) * 4; - - /* Check the IP header length. */ - - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ - - if (IpHeaderLength < 5*4) { - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, - ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength)); - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* This is an IPv4 frame with a header of valid length. */ - - /* Get the IP header and data checksum. */ - - IpDataChecksum = Checksum2; - - /* - * The IP header checksum is calculated as follows: - * - * IpHeaderChecksum = Checksum1 - Checksum2 - */ - - SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2); - - /* Check if any IP header options. */ - - if (IpHeaderLength > SKCS_IP_HEADER_SIZE) { - - /* Get the IP options checksum. */ - - IpOptionsChecksum = SkCsCalculateChecksum( - SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE), - IpHeaderLength - SKCS_IP_HEADER_SIZE); - - /* Adjust the IP header and IP data checksums. */ - - SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum); - - SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum); - } - - /* - * Check if the IP header checksum is ok. - * - * NOTE: We must check the IP header checksum even if the caller just wants - * us to check upper-layer checksums, because we cannot do any further - * processing of the packet without a valid IP checksum. - */ - - /* Get the next level protocol identifier. */ - - NextLevelProtocol = *(SK_U8 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - - if (IpHeaderChecksum != 0xffff) { - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; - /* the NDIS tester wants to know the upper level protocol too */ - if (NextLevelProtocol == SKCS_PROTO_ID_TCP) { - return(SKCS_STATUS_IP_CSUM_ERROR_TCP); - } - else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) { - return(SKCS_STATUS_IP_CSUM_ERROR_UDP); - } - return (SKCS_STATUS_IP_CSUM_ERROR); - } - - /* - * Check if this is a TCP or UDP frame and if we should calculate the - * TCP/UDP pseudo header checksum. - * - * Also clear all protocol bit flags of protocols not present in the - * frame. - */ - - if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_TCP) { - /* TCP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; - } - else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 && - NextLevelProtocol == SKCS_PROTO_ID_UDP) { - /* UDP/IP frame. */ - NextLevelProtoStats = - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; - } - else { - /* - * Either not a TCP or UDP frame and/or TCP/UDP processing not - * specified. - */ - return (SKCS_STATUS_IP_CSUM_OK); - } - - /* Check if this is an IP fragment. */ - - /* - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" - * and the "More Fragments" are zero, it is *not* a fragment. We can - * easily check both at the same time since they are in the same 16-bit - * word. - */ - - if ((*(SK_U16 *) - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & - ~SKCS_IP_DONT_FRAGMENT) != 0) { - /* IP fragment; ignore all other protocols. */ - NextLevelProtoStats->RxUnableCts++; - return (SKCS_STATUS_IP_FRAGMENT); - } - - /* - * 08-May-2000 ra - * - * From RFC 768 (UDP) - * If the computed checksum is zero, it is transmitted as all ones (the - * equivalent in one's complement arithmetic). An all zero transmitted - * checksum value means that the transmitter generated no checksum (for - * debugging or for higher level protocols that don't care). - */ - - if (NextLevelProtocol == SKCS_PROTO_ID_UDP && - *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) { - - NextLevelProtoStats->RxOkCts++; - - return (SKCS_STATUS_IP_CSUM_OK_NO_UDP); - } - - /* - * Calculate the TCP/UDP checksum. - */ - - /* Get total length of IP header and data. */ - - IpDataLength = - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); - - /* Get length of IP data portion. */ - - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; - - NextLevelProtocolChecksum = - - /* Calculate the pseudo header checksum. */ - - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + - (unsigned long) SKCS_HTON16(NextLevelProtocol) + - (unsigned long) SKCS_HTON16(IpDataLength) + - - /* Add the TCP/UDP header checksum. */ - - (unsigned long) IpDataChecksum; - - /* Add-in any carries. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); - - /* Check if the TCP/UDP checksum is ok. */ - - if ((unsigned) NextLevelProtocolChecksum == 0xffff) { - - /* TCP/UDP checksum ok. */ - - NextLevelProtoStats->RxOkCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK); - } - - /* TCP/UDP checksum error. */ - - NextLevelProtoStats->RxErrCts++; - - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? - SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR); -} /* SkCsGetReceiveInfo */ - - -/****************************************************************************** - * - * SkCsSetReceiveFlags - set checksum receive flags - * - * Description: - * Use this function to set the various receive flags. According to the - * protocol flags set by the caller, the start offsets within received - * packets of the two hardware checksums are returned. These offsets must - * be stored in all receive descriptors. - * - * Arguments: - * pAc - Pointer to adapter context struct. - * - * ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols - * for which the caller wants checksum information on received frames. - * - * pChecksum1Offset - The start offset of the first receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * pChecksum2Offset - The start offset of the second receive descriptor - * hardware checksum to be calculated for received frames is returned - * here. - * - * Returns: N/A - * Returns the two hardware checksum start offsets. - */ -void SkCsSetReceiveFlags( -SK_AC *pAc, /* Adapter context struct. */ -unsigned ReceiveFlags, /* New receive flags. */ -unsigned *pChecksum1Offset, /* Offset for hardware checksum 1. */ -unsigned *pChecksum2Offset, /* Offset for hardware checksum 2. */ -int NetNumber) -{ - /* Save the receive flags. */ - - pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags; - - /* First checksum start offset is the IP header. */ - *pChecksum1Offset = SKCS_MAC_HEADER_SIZE; - - /* - * Second checksum start offset is the IP data. Note that this may vary - * if there are any IP header options in the actual packet. - */ - *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE; -} /* SkCsSetReceiveFlags */ - -#ifndef SK_CS_CALCULATE_CHECKSUM - -/****************************************************************************** - * - * SkCsCalculateChecksum - calculate checksum for specified data - * - * Description: - * Calculate and return the 16-bit Internet Checksum for the specified - * data. - * - * Arguments: - * pData - Pointer to data for which the checksum shall be calculated. - * Note: The pointer should be aligned on a 16-bit boundary. - * - * Length - Length in bytes of data to checksum. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -unsigned SkCsCalculateChecksum( -void *pData, /* Data to checksum. */ -unsigned Length) /* Length of data. */ -{ - SK_U16 *pU16; /* Pointer to the data as 16-bit words. */ - unsigned long Checksum; /* Checksum; must be at least 32 bits. */ - - /* Sum up all 16-bit words. */ - - pU16 = (SK_U16 *) pData; - for (Checksum = 0; Length > 1; Length -= 2) { - Checksum += *pU16++; - } - - /* If this is an odd number of bytes, add-in the last byte. */ - - if (Length > 0) { -#ifdef SK_BIG_ENDIAN - /* Add the last byte as the high byte. */ - Checksum += ((unsigned) *(SK_U8 *) pU16) << 8; -#else /* !SK_BIG_ENDIAN */ - /* Add the last byte as the low byte. */ - Checksum += *(SK_U8 *) pU16; -#endif /* !SK_BIG_ENDIAN */ - } - - /* Add-in any carries. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Add-in any new carry. */ - - SKCS_OC_ADD(Checksum, Checksum, 0); - - /* Note: All bits beyond the 16-bit limit are now zero. */ - - return ((unsigned) Checksum); -} /* SkCsCalculateChecksum */ - -#endif /* SK_CS_CALCULATE_CHECKSUM */ - -/****************************************************************************** - * - * SkCsEvent - the CSUM event dispatcher - * - * Description: - * This is the event handler for the CSUM module. - * - * Arguments: - * pAc - Pointer to adapter context. - * - * Ioc - I/O context. - * - * Event - Event id. - * - * Param - Event dependent parameter. - * - * Returns: - * The 16-bit Internet Checksum for the specified data. - * - * Note: The checksum is calculated in the machine's natural byte order, - * i.e. little vs. big endian. Thus, the resulting checksum is different - * for the same input data on little and big endian machines. - * - * However, when written back to the network packet, the byte order is - * always in correct network order. - */ -int SkCsEvent( -SK_AC *pAc, /* Pointer to adapter context. */ -SK_IOC Ioc, /* I/O context. */ -SK_U32 Event, /* Event id. */ -SK_EVPARA Param) /* Event dependent parameter. */ -{ - int ProtoIndex; - int NetNumber; - - switch (Event) { - /* - * Clear protocol statistics. - * - * Param - Protocol index, or -1 for all protocols. - * - Net number. - */ - case SK_CSUM_EVENT_CLEAR_PROTO_STATS: - - ProtoIndex = (int)Param.Para32[1]; - NetNumber = (int)Param.Para32[0]; - if (ProtoIndex < 0) { /* Clear for all protocols. */ - if (NetNumber >= 0) { - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber])); - } - } - else { /* Clear for individual protocol. */ - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, - sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex])); - } - break; - default: - break; - } - return (0); /* Success. */ -} /* SkCsEvent */ - -#endif /* SK_USE_CSUM */ diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-19 10:34:02 -08:00 @@ -488,6 +488,27 @@ return ethtool_op_set_tx_csum(dev, data); } +static u32 sk98_get_rx_csum(struct net_device *dev) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + return pAC->RxPort[pNet->PortNr].UseRxCsum; +} + +static int sk98_set_rx_csum(struct net_device *dev, u32 data) +{ + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + if (data && + !(pAC->GIni.GIChipId == CHIP_ID_GENESIS || pAC->ChipsetType)) + return -EOPNOTSUPP; + + pAC->RxPort[pNet->PortNr].UseRxCsum = data; + return 0; +} + struct ethtool_ops SkGeEthtoolOps = { .get_settings = sk98_get_settings, .set_settings = sk98_set_settings, @@ -503,4 +524,6 @@ .set_sg = sk98_set_sg, .get_tx_csum = ethtool_op_get_tx_csum, .set_tx_csum = sk98_set_tx_csum, + .get_rx_csum = sk98_get_rx_csum, + .set_rx_csum = sk98_set_rx_csum, }; diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-19 10:34:02 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-19 10:34:02 -08:00 @@ -568,11 +568,6 @@ return(-EAGAIN); } - SkCsSetReceiveFlags(pAC, - SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP, - &pAC->CsOfs1, &pAC->CsOfs2, 0); - pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; - BoardInitMem(pAC); /* tschilling: New common function with minimum size check. */ DualNet = SK_FALSE; @@ -790,7 +785,9 @@ /* set the pointers right */ pDescr->VNextRxd = VNextDescr & 0xffffffffULL; pDescr->pNextRxd = pNextDescr; - pDescr->TcpSumStarts = pAC->CsOfs; + pDescr->TcpSumStarts = SK_CHECKSUM_OFFSET_1 + | (SK_CHECKSUM_OFFSET_2 << 16); + /* advance one step */ pPrevDescr = pDescr; @@ -1960,7 +1957,6 @@ struct sk_buff *pMsg; /* pointer to message holding frame */ struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ int FrameLength; /* total length of received frame */ -int IpFrameLength; SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ SK_EVPARA EvPara; /* an event parameter union */ unsigned long Flags; /* for spin lock */ @@ -1973,10 +1969,6 @@ SK_BOOL IsBadFrame; /* Bad frame */ SK_U32 FrameStat; -unsigned short Csum1; -unsigned short Csum2; -unsigned short Type; -int Result; SK_U64 PhysAddr; rx_start: @@ -2134,67 +2126,13 @@ /* set length in message */ skb_put(pMsg, FrameLength); - /* hardware checksum */ - Type = ntohs(*((short*)&pMsg->data[12])); - -#ifdef USE_SK_RX_CHECKSUM - if (Type == 0x800) { - Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); - Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); - IpFrameLength = (int) ntohs((unsigned short) - ((unsigned short *) pMsg->data)[8]); - - /* - * Test: If frame is padded, a check is not possible! - * Frame not padded? Length difference must be 14 (0xe)! - */ - if ((FrameLength - IpFrameLength) != 0xe) { - /* Frame padded => TCP offload not possible! */ - pMsg->ip_summed = CHECKSUM_NONE; - } else { - /* Frame not padded => TCP offload! */ - if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || - (pAC->ChipsetType)) { - Result = SkCsGetReceiveInfo(pAC, - &pMsg->data[14], - Csum1, Csum2, pRxPort->PortIndex); - if (Result == - SKCS_STATUS_IP_FRAGMENT || - Result == - SKCS_STATUS_IP_CSUM_OK || - Result == - SKCS_STATUS_TCP_CSUM_OK || - Result == - SKCS_STATUS_UDP_CSUM_OK) { - pMsg->ip_summed = - CHECKSUM_UNNECESSARY; - } - else if (Result == - SKCS_STATUS_TCP_CSUM_ERROR || - Result == - SKCS_STATUS_UDP_CSUM_ERROR || - Result == - SKCS_STATUS_IP_CSUM_ERROR_UDP || - Result == - SKCS_STATUS_IP_CSUM_ERROR_TCP || - Result == - SKCS_STATUS_IP_CSUM_ERROR ) { - /* HW Checksum error */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, - ("skge: CRC error. Frame dropped!\n")); - goto rx_failed; - } else { - pMsg->ip_summed = - CHECKSUM_NONE; - } - }/* checksumControl calculation valid */ - } /* Frame length check */ - } /* IP frame */ -#else - pMsg->ip_summed = CHECKSUM_NONE; -#endif + pMsg->ip_summed = CHECKSUM_NONE; /* initial default */ + + /* Use hardware checksum of complete packet */ + if (pRxPort->UseRxCsum) { + pMsg->csum = le16_to_cpu(pRxd->TcpSums & 0xffff); + pMsg->ip_summed = CHECKSUM_HW; + } } /* frame > SK_COPY_TRESHOLD */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); @@ -4220,9 +4158,10 @@ else printk(" tx-checksum: disabled\n"); -#ifndef USE_SK_RX_CHECKSUM + if (pAC->RxPort[FromPort].UseRxCsum) + printk(" rx-checksum: enabled\n"); + else printk(" rx-checksum: disabled\n"); -#endif } else { DoPrintInterfaceChange = SK_TRUE; @@ -4944,6 +4883,11 @@ memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); + +#ifdef USE_SK_RX_CHECKSUM + pAC->RxPort[0].UseRxCsum = SK_TRUE; + pAC->RxPort[1].UseRxCsum = SK_TRUE; +#endif pci_set_drvdata(pdev, dev); return 0; From tmarshall@real.com Fri Nov 19 10:44:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:44:18 -0800 (PST) Received: from scarface.real.com (scarface.real.com [207.188.7.230]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIiEiH010950 for ; Fri, 19 Nov 2004 10:44:14 -0800 Received: from hashi ([::ffff:172.23.22.199]) (AUTH: PLAIN tmarshall, TLS: TLSv1/SSLv3,128bits,RC4-SHA) by scarface.real.com with esmtp; Fri, 19 Nov 2004 10:43:47 -0800 Received: from tommy by hashi with local (Exim 4.34) id 1CVDjF-0000z7-0v; Fri, 19 Nov 2004 10:43:29 -0800 Date: Fri, 19 Nov 2004 10:43:29 -0800 From: Tom Marshall To: Pekka Savola Cc: davem@davemloft.net, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [Fwd: Problem with dual IPv4/IPv6 connect] Message-ID: <20041119184328.GB3396@real.com> References: <20041118184950.GB3972@real.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=_scarface.real.com-16157-1100889827-0001-2" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12022 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tmarshall@real.com Precedence: bulk X-list: netdev This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_scarface.real.com-16157-1100889827-0001-2 Content-Type: multipart/mixed; boundary="0eh6TmSyL6TZE2Uz" Content-Disposition: inline --0eh6TmSyL6TZE2Uz Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable > I'd suggest you resend it to netdev, but also attach a minimal,=20 > trivial test case .c file which allows anyone to easily experiment=20 > with the behaviour, test a fix, etc. Recap of the issue: s =3D socket(AF_INET6, SOCK_STREAM, 0) connect(s, [fec0::203:baff:fe88:5a15]:1554) =3D> EINPROGRESS Put socket in select's write set Kernel sends TCPv6 SYN Kernel receives ICMPv6 Time Exceeded (routing error) Socket becomes writable getsockopt(s, SO_ERROR) =3D> EHOSTUNREACH connect(s, [:ffff:192.168.168.241]:1554) =3D> ECONNABORTED Okay I've attached a fairly small repro. Sorry it's not smaller but it takes a few lines of code to do the required setup. The trickier part of the setup is probably getting a ICMPv6 Time Exceeded error. My particular setup was using vtun for an IPv6 route through a dumb switch and a bogus route on the remote vtun endpoint, but there are surely other ways to get this error. The app expects you to specify an IPv6 address, an IPv4 address (glibc's inet_pton requires it be in V4MAPPED form), a port, and a nonblocking value= =2E=20 The addresses don't necessarily need to be for the same host. Results for kernel 2.6.9 and 2.6.10-rc2 are the same, as follows: $ gcc -Wall -o dualconnect dualconnect.c $ ./dualconnect fec0::203:baff:fe88:5a15 ::ffff:192.168.168.241 22 1 async connect to fec0::203:baff:fe88:5a15 returned No route to host sync connect to ::ffff:192.168.168.241 returned Software caused connecti= on abort async connect to ::ffff:192.168.168.241 returned Success $ ./dualconnect fec0::203:baff:fe88:5a15 ::ffff:192.168.168.241 22 0 sync connect to fec0::203:baff:fe88:5a15 returned No route to host sync connect to ::ffff:192.168.168.241 returned No route to host sync connect to ::ffff:192.168.168.241 returned Transport endpoint is al= ready connected In the nonblocking case (which we use, and prompted the report), the socket appears to correct its internal state and the second IPv4 connect succeeds. In the blocking case, the socket appears to actually connect even though it reports an error. I just discovered this today because I was hoping to get a smaller repro by avoiding using select. :-/ --=20 Don't get suckered in by the comments -- they can be terribly misleading.= =20 Debug only code. -- Dave Storer --0eh6TmSyL6TZE2Uz Content-Type: text/x-csrc; charset=us-ascii Content-Disposition: attachment; filename="dualconnect.c" #include #include #include #include #include #include #include #include #include #include int do_connect(int s, const char* destaddr, unsigned short destport) { struct sockaddr_in6 sa; socklen_t len; int rc; len = sizeof(struct sockaddr_in6); memset(&sa, 0, len); sa.sin6_family = AF_INET6; if (inet_pton(AF_INET6, destaddr, &sa.sin6_addr) <= 0) { printf("inet_pton failed\n"); exit(1); } sa.sin6_port = htons(destport); rc = connect(s, (struct sockaddr*)&sa, len); if (rc == -1 && errno == EINPROGRESS) { fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); do { rc = select(s+1, NULL, &fds, NULL, NULL); } while (rc == -1 && errno == EINTR); if (rc != 1) { printf("select failed\n"); exit(1); } len = sizeof(rc); if (getsockopt(s, SOL_SOCKET, SO_ERROR, &rc, &len) != 0) { printf("get SO_ERROR failed\n"); exit(1); } printf("async connect to %s returned %s\n", destaddr, strerror(rc)); return rc; } printf("sync connect to %s returned %s\n", destaddr, strerror(errno)); return errno; } int main(int argc, char** argv) { int s; int rc; int tmp; if (argc != 5) { printf("usage: %s \n", argv[0]); exit(1); } s = socket(AF_INET6, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } tmp = atoi(argv[4]); ioctl(s, FIONBIO, &tmp); /* attempt v6 connect, verify EHOSTUNREACH */ rc = do_connect(s, argv[1], atoi(argv[3])); if (rc == 0) { exit(1); } /* attempt v4 connect, 2.6.x returns ECONNABORTED */ rc = do_connect(s, argv[2], atoi(argv[3])); if (rc == 0) { exit(1); } /* retry, verify success */ rc = do_connect(s, argv[2], atoi(argv[3])); if (rc == 0) { exit(1); } close(s); return 0; } --0eh6TmSyL6TZE2Uz-- --=_scarface.real.com-16157-1100889827-0001-2 Content-Type: application/pgp-signature; name="signature.asc" Content-Transfer-Encoding: 7bit Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBnj7QqznSmcYu2m8RAgp/AJ4jx8CJFFbJJGjyIax/hUz2BKF24gCfU8Jw JCefzxNauyyWjdUR9/pJCos= =VeTQ -----END PGP SIGNATURE----- --=_scarface.real.com-16157-1100889827-0001-2-- From yoshfuji@linux-ipv6.org Fri Nov 19 10:56:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 10:57:03 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJIuwBY017171 for ; Fri, 19 Nov 2004 10:56:59 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id D358833CE5; Sat, 20 Nov 2004 03:57:53 +0900 (JST) Date: Fri, 19 Nov 2004 13:57:50 -0500 (EST) Message-Id: <20041119.135750.63434487.yoshfuji@linux-ipv6.org> To: tmarshall@real.com Cc: pekkas@netcore.fi, davem@davemloft.net, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [Fwd: Problem with dual IPv4/IPv6 connect] From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041119184328.GB3396@real.com> References: <20041118184950.GB3972@real.com> <20041119184328.GB3396@real.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12023 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20041119184328.GB3396@real.com> (at Fri, 19 Nov 2004 10:43:29 -0800), Tom Marshall says: > > I'd suggest you resend it to netdev, but also attach a minimal, > > trivial test case .c file which allows anyone to easily experiment > > with the behaviour, test a fix, etc. > > Recap of the issue: > > s = socket(AF_INET6, SOCK_STREAM, 0) > connect(s, [fec0::203:baff:fe88:5a15]:1554) => EINPROGRESS > Put socket in select's write set > Kernel sends TCPv6 SYN > Kernel receives ICMPv6 Time Exceeded (routing error) > Socket becomes writable > getsockopt(s, SO_ERROR) => EHOSTUNREACH (*) > connect(s, [:ffff:192.168.168.241]:1554) => ECONNABORTED At the point of (*), the state of socket if undefined. you need to create another socket to connect another peer. --yoshfuji From romieu@fr.zoreil.com Fri Nov 19 11:13:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 11:13:50 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJJDith018241 for ; Fri, 19 Nov 2004 11:13:45 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAJJBHvr014769; Fri, 19 Nov 2004 20:11:17 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAJJBHCx014768; Fri, 19 Nov 2004 20:11:17 +0100 Date: Fri, 19 Nov 2004 20:11:17 +0100 From: Francois Romieu To: Stephen Hemminger Cc: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (23/25) sk98: eliminate Pnmi scratchpad Message-ID: <20041119191117.GA13556@electric-eye.fr.zoreil.com> References: <20041115155832.264aa86f@zqx3.pdx.osdl.net> <20041119104331.70a45312@zqx3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041119104331.70a45312@zqx3.pdx.osdl.net> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12024 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Stephen Hemminger : [...] > diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c > --- a/drivers/net/sk98lin/skethtool.c 2004-11-19 10:38:39 -08:00 > +++ b/drivers/net/sk98lin/skethtool.c 2004-11-19 10:38:39 -08:00 > @@ -261,9 +261,26 @@ > static void sk98_get_ethstats(struct net_device *dev, > struct ethtool_stats *stats, u64 *data) > { > - const DEV_NET *pNet = netdev_priv(dev); > - const SK_AC *pAC = pNet->pAC; > - const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; > + DEV_NET *pNet = netdev_priv(dev); > + SK_AC *pAC = pNet->pAC; > + unsigned long flags; > + unsigned int size; > + int err; > + SK_PNMI_STRUCT_DATA *pPnmiStruct; > + > + > + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); > + if (!pPnmiStruct) > + return; > + > + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); > + size = sizeof(*pPnmiStruct); > + spin_lock_irqsave(&pAC->SlowPathLock, flags); > + err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); > + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); > + > + if (err) > + return; If SkPnmiGetStruct() does not frees pPnmiStruct, the code leaks (if it does free, it is a bit ugly imho). [...] > --- a/drivers/net/sk98lin/skge.c 2004-11-19 10:38:39 -08:00 > +++ b/drivers/net/sk98lin/skge.c 2004-11-19 10:38:39 -08:00 > @@ -2842,27 +2842,35 @@ > case SK_IOCTL_PRESETMIB: > if (!capable(CAP_NET_ADMIN)) return -EPERM; > case SK_IOCTL_GETMIB: > - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, > - Ioctl.LenPnmiStruct)? > - Ioctl.Len : sizeof(pAC->PnmiStruct))) { > - return -EFAULT; > - } > - Size = SkGeIocMib(pNet, Ioctl.Len, cmd); > - if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct, > - Ioctl.Len - return -EFAULT; > - } > - Ioctl.Len = Size; > - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { > + { > + SK_PNMI_STRUCT_DATA *pPnmiStruct; > + > + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); > + if (!pPnmiStruct) > + return -ENOMEM; > + > + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); > + > + if (copy_from_user(pPnmiStruct, Ioctl.pData, > + min(sizeof(*pPnmiStruct), Ioctl.Len))) > return -EFAULT; -> leak. So far I have not applied the whole serie of patches to check for more leaks in this patch. -- Ueimor From herbert@gondor.apana.org.au Fri Nov 19 11:35:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 11:35:50 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJJZfiP018868 for ; Fri, 19 Nov 2004 11:35:42 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CVEXL-0001Pd-00; Sat, 20 Nov 2004 06:35:15 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CVEXA-0001vc-00; Sat, 20 Nov 2004 06:35:04 +1100 Date: Sat, 20 Nov 2004 06:35:04 +1100 To: "YOSHIFUJI Hideaki / ?$B5HF#1QL@" Cc: davem@davemloft.net, netdev@oss.sgi.com, acme@conectiva.com.br, jgarzik@pobox.com Subject: Re: Fix ipv6_ifa_notify race Message-ID: <20041119193504.GB7339@gondor.apana.org.au> References: <4197AC20.6020707@pobox.com> <20041119094924.GA3726@gondor.apana.org.au> <20041119.113658.109538461.yoshfuji@linux-ipv6.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041119.113658.109538461.yoshfuji@linux-ipv6.org> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12025 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Fri, Nov 19, 2004 at 11:36:58AM -0500, YOSHIFUJI Hideaki / ?$B5HF#1QL@ wrote: > > This patch is wrong (dead is not protected appropriately). I don't understand your point. ifp->dead is an int and it's read and written atomically. > I have another idea to fix this. Great. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From shemminger@osdl.org Fri Nov 19 11:38:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 11:38:54 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJJcmOP019228 for ; Fri, 19 Nov 2004 11:38:48 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJJcGPE008608 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 19 Nov 2004 11:38:16 -0800 Date: Fri, 19 Nov 2004 11:41:27 -0800 From: Stephen Hemminger To: Francois Romieu Cc: Jeff Garzik , Mirko Lindner , netdev@oss.sgi.com Subject: Re: [PATCH] (23/25) sk98: eliminate Pnmi scratchpad Message-Id: <20041119114127.3858355b@zqx3.pdx.osdl.net> In-Reply-To: <20041119191117.GA13556@electric-eye.fr.zoreil.com> References: <20041115155832.264aa86f@zqx3.pdx.osdl.net> <20041119104331.70a45312@zqx3.pdx.osdl.net> <20041119191117.GA13556@electric-eye.fr.zoreil.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12026 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev This fixes the leak in the ethtool statistics code from the last patch. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c --- a/drivers/net/sk98lin/skethtool.c 2004-11-19 11:40:14 -08:00 +++ b/drivers/net/sk98lin/skethtool.c 2004-11-19 11:40:14 -08:00 @@ -268,7 +268,6 @@ int err; SK_PNMI_STRUCT_DATA *pPnmiStruct; - pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); if (!pPnmiStruct) return; @@ -279,8 +278,8 @@ err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); spin_unlock_irqrestore(&pAC->SlowPathLock, flags); - if (err) - return; + if (err) + goto out; *data++ = pPnmiStruct->Stat[0].StatRxOkCts; *data++ = pPnmiStruct->Stat[0].StatTxOkCts; @@ -309,6 +308,9 @@ *data++ = pPnmiStruct->Stat[0].StatTxFifoUnderrunCts; *data++ = pPnmiStruct->Stat[0].StatTxCarrierCts; *data++ = pAC->stats.tx_window_errors; + + out: + kfree(pPnmiStruct); } From shemminger@osdl.org Fri Nov 19 11:49:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 11:49:52 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJJnldN019709 for ; Fri, 19 Nov 2004 11:49:47 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAJJnMPE009416 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 19 Nov 2004 11:49:22 -0800 Date: Fri, 19 Nov 2004 11:52:33 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (addendum) sk98: elimnate AllocFlag Message-Id: <20041119115233.0a41354f@zqx3.pdx.osdl.net> In-Reply-To: <20041115163616.17dfe933@zqx3.pdx.osdl.net> References: <20041115163616.17dfe933@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12027 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Don't need AllocFlag in device structure since FreeResources only called in case where allocation was done. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-19 11:49:15 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-19 11:49:15 -08:00 @@ -316,25 +316,13 @@ */ static void FreeResources(struct net_device *dev) { -SK_U32 AllocFlag; -DEV_NET *pNet; -SK_AC *pAC; - - pNet = netdev_priv(dev); - pAC = pNet->pAC; - AllocFlag = pAC->AllocFlag; - if (pAC->PciDev) { - pci_release_regions(pAC->PciDev); - } - if (AllocFlag & SK_ALLOC_IRQ) { - free_irq(dev->irq, dev); - } - if (pAC->IoBase) { - iounmap(pAC->IoBase); - } - if (pAC->pDescrMem) { - BoardFreeMem(pAC); - } + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + + pci_release_regions(pAC->PciDev); + free_irq(dev->irq, dev); + iounmap(pAC->IoBase); + BoardFreeMem(pAC); } /* FreeResources */ @@ -559,7 +547,6 @@ dev->irq); return -EAGAIN; } - pAC->AllocFlag |= SK_ALLOC_IRQ; /* Alloc memory for this board (Mem for RxD/TxD) : */ if(!BoardAllocMem(pAC)) { From manfred@colorfullife.com Fri Nov 19 12:18:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 12:18:52 -0800 (PST) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJKIkYi020498 for ; Fri, 19 Nov 2004 12:18:47 -0800 Received: from [127.0.0.2] (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id iAJKILSL003500; Fri, 19 Nov 2004 21:18:22 +0100 Message-ID: <419E550B.7030107@colorfullife.com> Date: Fri, 19 Nov 2004 21:18:19 +0100 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andy Fleming , Jason McMullan CC: Linux Kernel Mailing List , Netdev Subject: Re: [PATCH] MII bus API for PHY devices Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12028 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Hi, I don't like the polling/interrupt setup part: - for a nic driver, there is no irq line that could be requested by mii_phy_irq_enable(). - if the mii bus driver uses it's own timers, then locking within the nics will be more difficult. Could you make that part optional? For a nic driver, I would prefer if I could just call the ->startup part without the request_irq. If the nic irq handler notices that the nic got an event, then it would call an appropriate mii_bus function. This also applies for something like /dev/phy/xy: With natsemi, it would be very tricky to add proper locking. The nic as an internal phy and an external mii bus. The internal phy is partially visible on the external bus and any accesses to the phy id of the internal phy on the external bus cause lockups. No big deal, I just move the internal phy around [the phy id doesn't matter], but I would prefer if I have to do that just for ethtool, not for multiple interfaces. -- Manfred From afleming@freescale.com Fri Nov 19 13:01:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 13:02:00 -0800 (PST) Received: from motgate8.mot.com (motgate8.mot.com [129.188.136.8]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJL1sIJ024863 for ; Fri, 19 Nov 2004 13:01:54 -0800 Received: from az33exr04.mot.com (pobox4.mot.com [10.64.251.243]) by motgate8.mot.com (Motorola/Motgate8) with ESMTP id iAJL30Nu012235; Fri, 19 Nov 2004 14:03:00 -0700 (MST) Received: from [10.82.17.240] ([10.82.17.240]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id iAJJ0vTp028259; Fri, 19 Nov 2004 13:00:57 -0600 In-Reply-To: <419E550B.7030107@colorfullife.com> References: <419E550B.7030107@colorfullife.com> Mime-Version: 1.0 (Apple Message framework v619) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: <2A6C102E-3A6E-11D9-B023-000393C30512@freescale.com> Content-Transfer-Encoding: 7bit Cc: Jason McMullan , Linux Kernel Mailing List , Netdev From: Andy Fleming Subject: Re: [PATCH] MII bus API for PHY devices Date: Fri, 19 Nov 2004 15:01:21 -0600 To: Manfred Spraul X-Mailer: Apple Mail (2.619) X-archive-position: 12029 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: afleming@freescale.com Precedence: bulk X-list: netdev On Nov 19, 2004, at 14:18, Manfred Spraul wrote: > Hi, > > I don't like the polling/interrupt setup part: > - for a nic driver, there is no irq line that could be requested by > mii_phy_irq_enable(). > - if the mii bus driver uses it's own timers, then locking within the > nics will be more difficult. I'm not sure I accept the argument that locking will be more difficult. Jason's patch requires that a callback be registered for the interrupt or the polling (My update has a similar scheme). The function you register is essentially like an extra interrupt, except it is never invoked at interrupt time. All the function has to do is react properly to link state. If, previously, you checked link state in your interrupt handler, you could still do it there, I suspect. > > Could you make that part optional? For a nic driver, I would prefer if > I could just call the ->startup part without the request_irq. If the > nic irq handler notices that the nic got an event, then it would call > an appropriate mii_bus function. I think it would be doable to arrange the interface such that drivers could adopt only the PHY configuration infrastructure, and not any of the polling/interrupt infrastructure. Of course, as it is, it is at least WHOLLY optional, so no driver has to use it at all. > > This also applies for something like /dev/phy/xy: With natsemi, it > would be very tricky to add proper locking. The nic as an internal phy > and an external mii bus. The internal phy is partially visible on the > external bus and any accesses to the phy id of the internal phy on the > external bus cause lockups. No big deal, I just move the internal phy > around [the phy id doesn't matter], but I would prefer if I have to do > that just for ethtool, not for multiple interfaces. I agree with this point -- Accessing the PHY through /dev registers is a recipe for some mess. Though I could be convinced that it is manageable. I do think, however, that the ethtool interface is sufficient to the task. From ctindel@calma.pair.com Fri Nov 19 13:02:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 13:02:21 -0800 (PST) Received: from calma.pair.com (calma.pair.com [209.68.1.95]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAJL2Fhf024886 for ; Fri, 19 Nov 2004 13:02:16 -0800 Received: (qmail 7018 invoked by uid 3059); 19 Nov 2004 21:01:56 -0000 Date: Fri, 19 Nov 2004 16:01:56 -0500 From: "Chad N. Tindel" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: Wrong UIDs reported in /proc/net/tcp Message-ID: <20041119210156.GA6513@calma.pair.com> References: <20041109205358.GA64015@calma.pair.com> <20041118190257.GA7084@calma.pair.com> <20041118210307.GA9557@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041118210307.GA9557@gondor.apana.org.au> User-Agent: Mutt/1.4.2.1i X-archive-position: 12030 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chad@tindel.net Precedence: bulk X-list: netdev > > OK, so just out of sheer morbid curiousity, I added an ioctl which will > > accept 4 parameters (the address/port pairs), and will return the user id > > associated with that socket. I also changed pidentd to call this ioctl > > instead of looking at /proc/net/tcp. This should theoretically get rid > > of all race conditions. > > Please show us the code of your ioctl. Hi- I found the problem... it was a bug in my pidentd changes where I wasn't properly handling an ioctl failure. So, using an ioctl to do a direct hash table lookup makes the userid mismatches go away. We've been running tests for 12 hours without any failures. > Have you tried netlink yet? Does it exhibit the same problem? Only so many test systems to go around. ;-) Will start these tests tonight and report back. Chad From afleming@freescale.com Fri Nov 19 13:19:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 13:19:19 -0800 (PST) Received: from motgate6.mot.com (motgate6.mot.com [144.189.100.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJLJDRn025905 for ; Fri, 19 Nov 2004 13:19:13 -0800 Received: from az33exr04.mot.com (pobox4.mot.com [10.64.251.243]) by motgate6.mot.com (Motorola/Motgate6) with ESMTP id iAJLIox9015733; Fri, 19 Nov 2004 14:18:50 -0700 (MST) Received: from [10.82.17.240] ([10.82.17.240]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id iAJJIJTp026406; Fri, 19 Nov 2004 13:18:20 -0600 In-Reply-To: <1100820391.25521.14.camel@gaston> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100820391.25521.14.camel@gaston> Mime-Version: 1.0 (Apple Message framework v619) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: <97DA0EF0-3A70-11D9-B023-000393C30512@freescale.com> Content-Transfer-Encoding: 7bit Cc: , Linux Kernel list , , Andy Fleming From: Andy Fleming Subject: Re: [PATCH] MII bus API for PHY devices Date: Fri, 19 Nov 2004 15:18:44 -0600 To: Benjamin Herrenschmidt X-Mailer: Apple Mail (2.619) X-archive-position: 12031 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: afleming@freescale.com Precedence: bulk X-list: netdev On Nov 18, 2004, at 17:26, Benjamin Herrenschmidt wrote: > On Thu, 2004-11-18 at 11:52 -0600, Andy Fleming wrote: > >> 1) How should we pass initialization information from the system to >> the >> bus. Information like which irq to use for each PHY, and what the >> address space for the bus's controls is. I would like to enforce >> encapsulation so that the ethernet drivers don't need to know this >> information, or pass it to the bus. > > Unfortunately, this is all quite platform specific and the ethernet > driver may be the only one to know what to do here... add to that > various special cases of the way the PHY is wired or controlled, I > think > we can't completely avoid special casing... Well, under the system I'm currently envisioning, the driver would be able to provide the data needed by the mii bus, but the hope would be to enable board files (for when the PHY is soldered on the motherboard, and the enet is not -- like on an MPC85xx) to provide this information instead, and leave out the enet as middleman. > >> 2) How should we reflect the dependency of the ethernet driver on the >> mii bus driver? > > The ethernet driver can instanciate the PHYs at it's childs, though the > case of several MACs sharing PHYs will be difficult to represent... I really don't want the driver to intantiate PHYs directly. The PHY is its own device, and the less net drivers have to understand their inner workings, the better. However, I hadn't considered the possibility of multiple MACs sharing the same PHY. It does, as you say, support my argument, though. With some careful design, the mii bus should be able to handle this type of setup easily. One of my goals, personally, is to allow multiple net drivers to share the same mii bus, as in the case of the FCC enet controllers' PHYs on an 8560 ADS, which can be accessed through TSEC1's MII Management bus. > >> 3) How should we bind ethernet drivers to PHY drivers? > > I would have them instanciated by the ethernet driver. Besides, the PHY > driver will need to be able to identify it's "parent" driver in some > ways to deal with special cases. It would be nice to have a library of > utility code to independently deal with link tracking (basically what > drivers like sungem do independently), with a callback to the ethernet > driver to inform it of actual changes (notifier ?). MACs often have > autopoll features and PHY often have interrupts, but from experience, > that's not very useful and a good old timer based polling tend to do a > better job most of the time. So when you say instantiated, would you consider calling an "attach" function with the phy_id and bus_id of the desired PHY instantiation? I'm fine with that. The PHY would need to be able to send notifications to the enet controller (currently done through a callback). I'm interested in ideas on how the notifier could be used (I have a distaste for callbacks). Autopoll features sound pretty neat. I think the system should support that. PHY interrupts are supported (they work quite well on my 85xx system), as is timer-based polling. Do you really think that there are special cases which can't be handled using a library similar to the sungem_phy one? > >> Oh, and a 4th side-issue: >> Should each PHY have its own file? Or should we dump all the PHY >> drivers in one file? And if so, should THAT file be separate from the >> mii bus implementation file? > > I'd put all bcm5xxx in the same file ... they can be put together by > families... Yeah, that sounds good. Andy Fleming Open Source Team Freescale Semiconductor, Inc From acme@conectiva.com.br Fri Nov 19 14:21:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 14:21:04 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJMKxu5027035 for ; Fri, 19 Nov 2004 14:21:00 -0800 Received: from [200.138.46.101] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CVH91-0000F5-00; Fri, 19 Nov 2004 20:22:20 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 2CF231463D; Fri, 19 Nov 2004 20:20:39 -0200 (BRST) Message-ID: <419E63EC.4050501@conectiva.com.br> Date: Fri, 19 Nov 2004 19:21:48 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Gianluca Cc: netdev@oss.sgi.com Subject: Re: IPv6 route buffer space problem References: <20041119175924.M79505@coredumps.org> In-Reply-To: <20041119175924.M79505@coredumps.org> Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12032 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Gianluca wrote: > Hi, i have a problem when i add more than 500/540 sit interfaces on my linux > box (debian), if i add a new interface (with iptunnel and ifconfig) i > haven't errors but when i add a new router for the interface i have this > error "No buffer space available". > I had search on /proc for increment the buffer but i dont have found > anythink, i think that i need to modify the kernel sources. > Please help me. Humm, time to look at the relevant codepaths and find some bogus return -ENOBUFS? What kernel version exactly? - Arnaldo From benh@kernel.crashing.org Fri Nov 19 14:43:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 14:43:40 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJMhZti028015 for ; Fri, 19 Nov 2004 14:43:35 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAJMeGgJ003621; Fri, 19 Nov 2004 16:40:17 -0600 Subject: Re: [PATCH] MII bus API for PHY devices From: Benjamin Herrenschmidt To: Andy Fleming Cc: netdev@oss.sgi.com, Linux Kernel list , jason.mcmullan@timesys.com, Andy Fleming In-Reply-To: <97DA0EF0-3A70-11D9-B023-000393C30512@freescale.com> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100820391.25521.14.camel@gaston> <97DA0EF0-3A70-11D9-B023-000393C30512@freescale.com> Content-Type: text/plain Date: Sat, 20 Nov 2004 09:43:04 +1100 Message-Id: <1100904184.3856.46.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 12033 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev On Fri, 2004-11-19 at 15:18 -0600, Andy Fleming wrote: > So when you say instantiated, would you consider calling an "attach" > function with the phy_id and bus_id of the desired PHY instantiation? > I'm fine with that. The PHY would need to be able to send > notifications to the enet controller (currently done through a > callback). I'm interested in ideas on how the notifier could be used > (I have a distaste for callbacks). Look at the notifier lists in include/linux/notifier.h > Autopoll features sound pretty neat. I think the system should support > that. But that becomes MAC-dependant again... That means you'd need 1) a way for the MAC driver to ask the PHY driver what register it wants autopolled, and a function in the PHY driver for the MAC to call when it detects a change. Also, autopoll is broken in some MACs... > PHY interrupts are supported (they work quite well on my 85xx > system), as is timer-based polling. Do you really think that there are > special cases which can't be handled using a library similar to the > sungem_phy one? Nope. I think timer based polling with a sungem-like fallback mecanism to forced speeds would be nice. Ben. From akpm@osdl.org Fri Nov 19 15:04:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 15:04:22 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJN4Iha028836 for ; Fri, 19 Nov 2004 15:04:18 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAJN3r903797 for ; Fri, 19 Nov 2004 15:03:53 -0800 Date: Fri, 19 Nov 2004 15:08:08 -0800 From: Andrew Morton To: netdev@oss.sgi.com Subject: Fw: [Bugme-new] [Bug 3777] New: tun driver fails to open when built in, must be modular Message-Id: <20041119150808.578154d3.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12034 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Fri, 19 Nov 2004 14:19:35 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3777] New: tun driver fails to open when built in, must be modular http://bugme.osdl.org/show_bug.cgi?id=3777 Summary: tun driver fails to open when built in, must be modular Kernel Version: 2.6.10-rc2 Status: NEW Severity: normal Owner: jgarzik@pobox.com Submitter: bill@crowellsystems.com Distribution: slackware/mfxlinux Hardware Environment:i386 Software Environment: Problem Description: kernel will not assign/open a tun device when tun.o is compiled as a built-in. ifconfig gives 'unable to open /dev/net/tun' error. compiling as a module fixes. Steps to reproduce: Compile kernel with tun/tap device driver as a built-in. Run ifconfig to see error. recompile as a module, modprobe tun and run ifconfig - no error. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From kdorn@lilah.hetzel.org Fri Nov 19 15:22:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 15:22:57 -0800 (PST) Received: from lilah.hetzel.org (lilah.hetzel.org [199.250.128.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAJNMmqB029518 for ; Fri, 19 Nov 2004 15:22:49 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iAK0iBh2006989 for ; Fri, 19 Nov 2004 19:44:11 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iAK0iBc6006988 for netdev@oss.sgi.com; Fri, 19 Nov 2004 19:44:11 -0500 Date: Fri, 19 Nov 2004 19:44:11 -0500 From: Dorn Hetzel To: netdev@oss.sgi.com Subject: Re: r8169.c Message-ID: <20041120004411.GA6921@lilah.hetzel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 12035 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev On Fri, Nov 19, 2004 at 09:12:03PM +0100, Francois Romieu wrote: > Dorn Hetzel : > [Abit AA8 experience] > > Do something else: > - take a look at the changes for the 8169 driver in Jeff Garzik's -netdev > patchkit (included in -mm). It may be interesting to know how it behaves; Thank you very much for the pointers. I have been using Linux for ages (well, since 1993 anyway), but this is my first attempt at fixing something in the kernel. (first time I've needed to :) ) I'm off to look for and try the -mm patchkit after I write this? Will it apply to 2.6.10-rc2? (I had to get to rc2 to get my SATA controller to work) :) > - less +/8169 MAINTAINERS; > - provide a more elaborate description of the issue with your computer > (+ gcc version, lspci -vx, dmesg at boot, lsmod, /proc/interrupts, ifconfig); with regard to the "original" version shipping with 2.6.10-rc2 (which seems to be identical to the version in 2.6.9)... gcc version = 2.95.4 (happy to update that if you think it will help) see http://www.hetzel.org/8169/orig/lspci.txt for the lspci -vx see http://www.hetzel.org/8169/orig/dmesg.txt for the dmesg lsmod returns empty because though I have module support enabled, I'm building everything I'm using in directly... see http://www.hetzel.org/8169/orig/interrupts.txt for the /proc/interrupts see http://www.hetzel.org/8169/orig/ifconfig.txt for the ifconfig -a "NETDEV WATCHDOG: eth0: transmit timed out" is one of the observed errors. "RX: no buffer available" (or similar, from memory) is another. with regard to version "2.3" (my hacked version)... gcc version = 2.95.4 (happy to update that if you think it will help) see http://www.hetzel.org/8169/v23/lspci.txt for the lspci -vx see http://www.hetzel.org/8169/v23/dmesg.txt for the dmesg lsmod returns empty because though I have module support enabled, I'm building everything I'm using in directly... see http://www.hetzel.org/8169/v23/interrupts.txt for the /proc/interrupts see http://www.hetzel.org/8169/v23/ifconfig.txt for the ifconfig -a > - realize that the so called version number in 2.6.9 has no meaning. > By this, do you mean that the comment of version number in the r8169.c of 2.6.9 is no longer related to the version numbers at Realtek? > Last time I looked at Realtek's driver (linux-8169(220).zip), it still > contained bugs which had been fixed in mainline (though it merges some > part of it) and I did not find anything which should do a difference > from a correctness POV. Intermediate versions of Realtek's code are > not available and the datasheet has disappeared from their website. > With due respect for Realtek's work (serious, really) it does not make > my life fun _at all_ (and I guess that "my" is also accurate for anyone > who tries to work with the 8169 driver on the long run). > Yeah, I noticed just one version and no history, but to the good, it does work for me, at least so far, after the minor patch :) > Btw merging a 20 megaton patch is not the way network drivers changes > are submitted. People expect a serie of small changes whose effects > are clearly explained (see http://linux.yyz.us/patch-format.html for > the suggested format). > I was pretty sure the Godzilla patch was not the answer, I just couldn't figure out what the answer was... I had fixed *my* problem, for now, but it would be nice to share it if it's worth sharing... > Imho your issue is not completely specific to the 8169 hardware. With > a wet finger in the wind, I'd suspect something related to timing or irq > (duration of locking or such). > > Please Cc: netdev@oss.sgi.com on further messages. Cc: jgarzik@pobox.com > for network devices patches is also suggested. Done. -Dorn ----- End forwarded message ----- From afleming@freescale.com Fri Nov 19 16:04:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 16:04:44 -0800 (PST) Received: from motgate4.mot.com (motgate4.mot.com [144.189.100.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK04c7d030470 for ; Fri, 19 Nov 2004 16:04:39 -0800 Received: from az33exr04.mot.com (pobox4.mot.com [10.64.251.243]) by motgate4.mot.com (8.12.11/Motgate4) with ESMTP id iAK06KDn013448; Fri, 19 Nov 2004 17:06:20 -0700 (MST) Received: from [10.82.17.240] ([10.82.17.240]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id iAJM3hTp005426; Fri, 19 Nov 2004 16:03:43 -0600 In-Reply-To: <1100904184.3856.46.camel@gaston> References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100820391.25521.14.camel@gaston> <97DA0EF0-3A70-11D9-B023-000393C30512@freescale.com> <1100904184.3856.46.camel@gaston> Mime-Version: 1.0 (Apple Message framework v619) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: Content-Transfer-Encoding: 7bit Cc: Jason McMullan , Linux Kernel list , Netdev From: Andy Fleming Subject: Re: [PATCH] MII bus API for PHY devices Date: Fri, 19 Nov 2004 18:04:07 -0600 To: Benjamin Herrenschmidt X-Mailer: Apple Mail (2.619) X-archive-position: 12036 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: afleming@freescale.com Precedence: bulk X-list: netdev On Nov 19, 2004, at 16:43, Benjamin Herrenschmidt wrote: > On Fri, 2004-11-19 at 15:18 -0600, Andy Fleming wrote: > >> So when you say instantiated, would you consider calling an "attach" >> function with the phy_id and bus_id of the desired PHY instantiation? >> I'm fine with that. The PHY would need to be able to send >> notifications to the enet controller (currently done through a >> callback). I'm interested in ideas on how the notifier could be used >> (I have a distaste for callbacks). > > Look at the notifier lists in include/linux/notifier.h Ok, will do. > >> Autopoll features sound pretty neat. I think the system should >> support >> that. > > But that becomes MAC-dependant again... That means you'd need 1) a way > for the MAC driver to ask the PHY driver what register it wants > autopolled, and a function in the PHY driver for the MAC to call when > it > detects a change. Also, autopoll is broken in some MACs... What I'm envisioning here is that the driver would be able to tell the PHY infrastructure that it's going to do its own thing, and then make use of the reading/configuring part of the infrastructure, similar to how sungem and gianfar are currently set up. But they would have the option of letting the infrastructure also handle the status updates. And, of course, the driver would not go through the effort to use autopoll if it were broken. > >> PHY interrupts are supported (they work quite well on my 85xx >> system), as is timer-based polling. Do you really think that there >> are >> special cases which can't be handled using a library similar to the >> sungem_phy one? > > Nope. I think timer based polling with a sungem-like fallback mecanism > to forced speeds would be nice. Yes, I agree. The system I currently have does fallback to forced, though it doesn't yet support the "magic aneg" feature you mentioned. But that should be easy to add, and so it shall be. Andy Fleming From romieu@fr.zoreil.com Fri Nov 19 16:41:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 16:41:46 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK0feqK002020 for ; Fri, 19 Nov 2004 16:41:40 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAK0eSvr021405 for ; Sat, 20 Nov 2004 01:40:28 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAK0eSFK021403 for netdev@oss.sgi.com; Sat, 20 Nov 2004 01:40:28 +0100 Resent-Message-Id: <200411200040.iAK0eSFK021403@electric-eye.fr.zoreil.com> Date: Sat, 20 Nov 2004 01:29:46 +0100 From: Francois Romieu To: Dorn Hetzel Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com.jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041120002946.GA18059@electric-eye.fr.zoreil.com> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041120003754.GA32133@lilah.hetzel.org> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. Resent-From: romieu@fr.zoreil.com Resent-Date: Sat, 20 Nov 2004 01:40:28 +0100 Resent-To: netdev@oss.sgi.com X-archive-position: 12037 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Dorn Hetzel : [...] > Thank you very much for the pointers. I have been using Linux for > ages (well, since 1993 anyway), but this is my first attempt at fixing > something in the kernel. (first time I've needed to :) ) > > I'm off to look for and try the -mm patchkit after I write this? > Will it apply to 2.6.10-rc2? (I had to get to rc2 to get my SATA controller > to work) :) You have two options (or more) on top of 2.6.10-rc2: - ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.10-rc2/2.6.10-rc2-mm2/2.6.10-rc2-mm2.bz2 - http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc2-netdev1.patch.bz2 Once you have applied one of the patch above, the patch below will improve your "transmit timed out" (please apply in order and enable NAPI): http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-250.patch http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-255.patch If things perform better you may want to use bigger frames and apply as well r8169-260.patch and r8169-265.patch. http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-260.patch http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-265.patch [...] > with regard to the "original" version shipping with 2.6.10-rc2 > (which seems to be identical to the version in 2.6.9)... Yes. I hope the current set of changes in -mm/-netdev will be merged in early post-2.6.10. > gcc version = 2.95.4 (happy to update that if you think it will help) You will be welcome to upgrade. [...] > > - realize that the so called version number in 2.6.9 has no meaning. > > > By this, do you mean that the comment of version number in the r8169.c > of 2.6.9 is no longer related to the version numbers at Realtek? Exactly. One year ago, Realtek's driver was split and merged in the kernel. That and the contributions of many people took several months to achieve a (imho) decently stable driver. At the same time, no change appeared on Realtek's side. Still some months later Realtek issues a new driver with a rev number bump (2.2). Its code suggests that it includes a partial merge from some of the changes made to the in-kernel driver as well as some internal experiments (hooks for missing code). The drivers are now quite different. A change of version number is included in the -mm/-netdev driver to protect the innocent but it seems I'll have to push weirder numbers. :o) [...] > Yeah, I noticed just one version and no history, but to the good, it > does work for me, at least so far, after the minor patch :) 1 - netif_stop_queue() race between the Tx xmit and the Tx IRQ handler. 2 - "entry" can overflow in rtl8169_tx_interrupt() -> read of random status and early free of Tx buffer. When the in-kernel version had similar code, it translated into "r8169 hangs under load". -- Ueimor From sri@us.ibm.com Fri Nov 19 18:00:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:01:06 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK20m2E003844 for ; Fri, 19 Nov 2004 18:00:59 -0800 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e34.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAK20MAD553400 for ; Fri, 19 Nov 2004 21:00:22 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAK20MH2154758 for ; Fri, 19 Nov 2004 19:00:22 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAK20Mef016046 for ; Fri, 19 Nov 2004 19:00:22 -0700 Received: from w-sridhar.beaverton.ibm.com (w-sridhar.beaverton.ibm.com [9.47.18.19]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAK20L78016024; Fri, 19 Nov 2004 19:00:21 -0700 Date: Fri, 19 Nov 2004 18:00:21 -0800 (PST) From: Sridhar Samudrala X-X-Sender: sridhar@w-sridhar.beaverton.ibm.com To: "David S. Miller" cc: Herbert Xu , netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor In-Reply-To: <20041116163106.3b62a39a.davem@davemloft.net> Message-ID: References: <20041116163106.3b62a39a.davem@davemloft.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12038 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev On Tue, 16 Nov 2004, David S. Miller wrote: > On Wed, 17 Nov 2004 07:59:18 +1100 > Herbert Xu wrote: > > > Sridhar Samudrala wrote: > > > We are seeing following assertions when running specweb99 with > > > tcp_tso_win_divisor lowered to 4, 2 or 1 on linux 2.6.9 based kernels. > > > > 2.6.9 is known to have bugs in TCP book-keeping. Please try 2.6.10-rc2 > > instead. > > Actually, that's true. I missed that this report was against > 2.6.9 vanilla, TCP is buggy as can be wrt TSO in that > release. Unfortunately as we cannot upgrade to 2.6.10-rc2, i tried to locate all the TSO accounting related bugfixes that went in after 2.6.9 and came up with the following 4 patches. [TCP]: Fix new packet len calc in tcp_fragment() http://linux.bkbits.net:8080/linux-2.5/cset@4175f423T1X-UctOUzkYgMxq16ODAw?nav=index.html|src/|src/net|src/net/ipv4|related/net/ipv4/tcp_output.c [TCP]: Fix tcp_trim_head() calculations. http://linux.bkbits.net:8080/linux-2.5/cset@41789ca8a4gfwR352SuIgAl6GbQmbQ?nav=index.html|src/|src/net|src/net/ipv4|related/net/ipv4/tcp_output.c [TCP]: Only re-set TSO size for packet which was TSO to begin with. http://linux.bkbits.net:8080/linux-2.5/cset@417982139wJw8yO-JClu818UQuoa_g?nav=index.html|src/|src/net|src/net/ipv4|related/net/ipv4/tcp_output.c [TCP]: Handle real partial-ACKs of TSO frames correctly. http://linux.bkbits.net:8080/linux-2.5/cset@417dcb39pNYZ1fRBQTQES0JVcUji2g?nav=index.html|src/|src/net|src/net/ipv4|related/net/ipv4/tcp_output.c Even with these 4 patches applied, we are still seeing the assertions. Also, the webserver is started only after lowering tcp_tso_win_divisor and the value is is not changed again. Are there any other TSO related patches apart from the above 4 that went in after 2.6.9? Or could it be that this bug is still there? Thanks Sridhar From janitor@sternwelten.at Fri Nov 19 18:43:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:43:24 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2hIfH005061 for ; Fri, 19 Nov 2004 18:43:18 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id 853A75C00B; Sat, 20 Nov 2004 03:42:55 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02035-01; Sat, 20 Nov 2004 03:42:55 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id CE42F5C00A; Sat, 20 Nov 2004 03:42:54 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLDF-00026h-OK; Sat, 20 Nov 2004 03:42:58 +0100 Subject: [patch 1/2] linux-2.6.7/net/8021q/vlan.c: add error check To: davem@davemloft.net Cc: netdev@oss.sgi.com, janitor@sternwelten.at, WHarms@bfs.de, wharms@bfs.de From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:42:57 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12039 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Content-type: text/plain; charset=us-ascii Hi list, the patches are still for 2.6.7. The remaining issues are solved (hopefully). i have added spaces before and after "=". in ipx i moved the __init strings back and added a comment form acme to say why. unfortunly my hopes of having a working smtp mail system didnt come true. so i have still to use c&p what may result in -> probelms. --------------------------------------------------------- add error check for register_netdevice_notifier() Signed-off-by: walter harms Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/net/8021q/vlan.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN net/8021q/vlan.c~check-register_netdevice_notifier-net_8021q_vlan net/8021q/vlan.c --- linux-2.6.10-rc2-bk4/net/8021q/vlan.c~check-register_netdevice_notifier-net_8021q_vlan 2004-11-20 03:01:53.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/net/8021q/vlan.c 2004-11-20 03:01:53.000000000 +0100 @@ -102,7 +102,12 @@ static int __init vlan_proto_init(void) dev_add_pack(&vlan_packet_type); /* Register us to receive netdevice events */ - register_netdevice_notifier(&vlan_notifier_block); + err = register_netdevice_notifier(&vlan_notifier_block); + if (err < 0) { + dev_remove_pack(&vlan_packet_type); + vlan_proc_cleanup(); + return 1; + } vlan_ioctl_set(vlan_ioctl_handler); _ From janitor@sternwelten.at Fri Nov 19 18:43:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:43:24 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2hKRM005066 for ; Fri, 19 Nov 2004 18:43:20 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id 56D775C00B; Sat, 20 Nov 2004 03:42:58 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02129-10; Sat, 20 Nov 2004 03:42:58 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id D87705C00A; Sat, 20 Nov 2004 03:42:57 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLDJ-00028Y-3q; Sat, 20 Nov 2004 03:43:01 +0100 Subject: [patch 2/2] linux-2.6.7/net/atm/mpc.c: add error check To: davem@davemloft.net Cc: netdev@oss.sgi.com, janitor@sternwelten.at, WHarms@bfs.de, wharms@bfs.de From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:43:00 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12040 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Content-type: text/plain; charset=us-ascii add errorcheck for register_netdevice_notifier() Signed-off-by: walter harms Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/net/atm/mpc.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) diff -puN net/atm/mpc.c~check-register_netdevice_notifier-net_atm_mpc net/atm/mpc.c --- linux-2.6.10-rc2-bk4/net/atm/mpc.c~check-register_netdevice_notifier-net_atm_mpc 2004-11-20 03:04:37.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/net/atm/mpc.c 2004-11-20 03:04:37.000000000 +0100 @@ -761,7 +761,10 @@ int atm_mpoa_mpoad_attach (struct atm_vc mpc_timer_refresh(); /* This lets us now how our LECs are doing */ - register_netdevice_notifier(&mpoa_notifier); + if (register_netdevice_notifier(&mpoa_notifier) < 0) { + del_timer(&mpc_timer); + return -1; + } } mpc = find_mpc_by_itfnum(arg); _ From janitor@sternwelten.at Fri Nov 19 18:45:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:45:27 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2jNt1005719 for ; Fri, 19 Nov 2004 18:45:24 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id 97A715C01A; Sat, 20 Nov 2004 03:45:01 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02035-04; Sat, 20 Nov 2004 03:45:01 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id EBBE35C00A; Sat, 20 Nov 2004 03:45:00 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLFI-0002EK-6k; Sat, 20 Nov 2004 03:45:04 +0100 Subject: [patch 2/4] list_for_each: net-ipv6-ip6_fib.c To: jgarzik@pobox.com Cc: netdev@oss.sgi.com, janitor@sternwelten.at, domen@coderock.org From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:45:03 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12042 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Hi. s/for/list_for_each/ Compile tested. Signed-off-by: Domen Puncer Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/net/ipv6/ip6_fib.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN net/ipv6/ip6_fib.c~list-for-each-drivers_net_ipv6_ip6_fib net/ipv6/ip6_fib.c --- linux-2.6.10-rc2-bk4/net/ipv6/ip6_fib.c~list-for-each-drivers_net_ipv6_ip6_fib 2004-11-19 17:15:17.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/net/ipv6/ip6_fib.c 2004-11-19 17:15:17.000000000 +0100 @@ -99,7 +99,7 @@ struct fib6_walker_t fib6_walker_list = .next = &fib6_walker_list, }; -#define FOR_WALKERS(w) for ((w)=fib6_walker_list.next; (w) != &fib6_walker_list; (w)=(w)->next) +#define FOR_WALKERS(w) list_for_each((w), &fib6_walker_list) static __inline__ u32 fib6_new_sernum(void) { _ From janitor@sternwelten.at Fri Nov 19 18:45:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:45:27 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2jKUJ005714 for ; Fri, 19 Nov 2004 18:45:21 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id B8E4C5C00B; Sat, 20 Nov 2004 03:44:58 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 06699-02; Sat, 20 Nov 2004 03:44:58 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id DD0BE5C00A; Sat, 20 Nov 2004 03:44:57 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLFE-0002CL-PU; Sat, 20 Nov 2004 03:45:01 +0100 Subject: [patch 1/4] net/ne2k-pci: module_param conversion To: jgarzik@pobox.com Cc: netdev@oss.sgi.com, janitor@sternwelten.at, domen@coderock.org From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:45:00 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12041 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Hi. Simple module_param_array conversions. Get rid of debug option, since it's only used once. Add some KERN_* constants to printk's. Compile tested. Signed-off-by: Domen Puncer Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/drivers/net/ne2k-pci.c | 25 +++++++----------------- 1 files changed, 8 insertions(+), 17 deletions(-) diff -puN drivers/net/ne2k-pci.c~module_parm-net_ne2k-pci drivers/net/ne2k-pci.c --- linux-2.6.10-rc2-bk4/drivers/net/ne2k-pci.c~module_parm-net_ne2k-pci 2004-11-20 03:04:54.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/drivers/net/ne2k-pci.c 2004-11-20 03:04:54.000000000 +0100 @@ -29,12 +29,6 @@ #define DRV_VERSION "1.03" #define DRV_RELDATE "9/22/2003" - -/* The user-configurable values. - These may be modified when a driver module is loaded.*/ - -static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ - #define MAX_UNITS 8 /* More are supported, limit only on options */ /* Used to pass the full-duplex flag, etc. */ static int full_duplex[MAX_UNITS]; @@ -77,10 +71,8 @@ MODULE_AUTHOR("Donald Becker / Paul Gort MODULE_DESCRIPTION("PCI NE2000 clone driver"); MODULE_LICENSE("GPL"); -MODULE_PARM(debug, "i"); -MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM_DESC(debug, "debug level (1-2)"); +module_param_array(options, int, NULL, 0); +module_param_array(full_duplex, int, NULL, 0); MODULE_PARM_DESC(options, "Bit 5: full duplex"); MODULE_PARM_DESC(full_duplex, "full duplex setting(s) (1)"); @@ -366,7 +358,7 @@ static int __devinit ne2k_pci_init_one ( if (i) goto err_out_free_netdev; - printk("%s: %s found at %#lx, IRQ %d, ", + printk(KERN_INFO "%s: %s found at %#lx, IRQ %d, ", dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq); for(i = 0; i < 6; i++) { printk("%2.2X%s", SA_prom[i], i == 5 ? ".\n": ":"); @@ -443,8 +435,7 @@ static void ne2k_pci_reset_8390(struct n { unsigned long reset_start_time = jiffies; - if (debug > 1) printk("%s: Resetting the 8390 t=%ld...", - dev->name, jiffies); + printk(KERN_INFO "%s: Resetting the 8390 t=%ld...", dev->name, jiffies); outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET); @@ -454,7 +445,7 @@ static void ne2k_pci_reset_8390(struct n /* This check _should_not_ be necessary, omit eventually. */ while ((inb(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) if (jiffies - reset_start_time > 2) { - printk("%s: ne2k_pci_reset_8390() did not complete.\n", dev->name); + printk(KERN_NOTICE "%s: ne2k_pci_reset_8390() did not complete.\n", dev->name); break; } outb(ENISR_RESET, NE_BASE + EN0_ISR); /* Ack intr. */ @@ -471,7 +462,7 @@ static void ne2k_pci_get_8390_hdr(struct /* This *shouldn't* happen. If it does, it's the last thing you'll see */ if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne2k_pci_get_8390_hdr " + printk(KERN_ERR "%s: DMAing conflict in ne2k_pci_get_8390_hdr " "[DMAstat:%d][irqlock:%d].\n", dev->name, ei_status.dmaing, ei_status.irqlock); return; @@ -509,7 +500,7 @@ static void ne2k_pci_block_input(struct /* This *shouldn't* happen. If it does, it's the last thing you'll see */ if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne2k_pci_block_input " + printk(KERN_ERR "%s: DMAing conflict in ne2k_pci_block_input " "[DMAstat:%d][irqlock:%d].\n", dev->name, ei_status.dmaing, ei_status.irqlock); return; @@ -564,7 +555,7 @@ static void ne2k_pci_block_output(struct /* This *shouldn't* happen. If it does, it's the last thing you'll see */ if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne2k_pci_block_output." + printk(KERN_ERR "%s: DMAing conflict in ne2k_pci_block_output." "[DMAstat:%d][irqlock:%d]\n", dev->name, ei_status.dmaing, ei_status.irqlock); return; _ From janitor@sternwelten.at Fri Nov 19 18:45:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:45:31 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2jQ8Q005725 for ; Fri, 19 Nov 2004 18:45:27 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id B8EC75C00B; Sat, 20 Nov 2004 03:45:04 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 06699-03; Sat, 20 Nov 2004 03:45:04 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id 051C85C00A; Sat, 20 Nov 2004 03:45:04 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLFL-0002GJ-8v; Sat, 20 Nov 2004 03:45:07 +0100 Subject: [patch 3/4] list_for_each: drivers-net-tulip-de4x5.c To: jgarzik@pobox.com Cc: netdev@oss.sgi.com, janitor@sternwelten.at, domen@coderock.org From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:45:06 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12043 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Hi. s/for/list_for_each/ Compile tested. Signed-off-by: Domen Puncer Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/drivers/net/tulip/de4x5.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -puN drivers/net/tulip/de4x5.c~list-for-each-drivers_net_tulip_de4x5 drivers/net/tulip/de4x5.c --- linux-2.6.10-rc2-bk4/drivers/net/tulip/de4x5.c~list-for-each-drivers_net_tulip_de4x5 2004-11-19 17:15:18.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/drivers/net/tulip/de4x5.c 2004-11-19 17:15:18.000000000 +0100 @@ -2143,9 +2143,9 @@ srom_search(struct net_device *dev, stru u_long iobase = 0; /* Clear upper 32 bits in Alphas */ int i, j, cfrv; struct de4x5_private *lp = netdev_priv(dev); - struct list_head *walk = &pdev->bus_list; + struct list_head *walk; - for (walk = walk->next; walk != &pdev->bus_list; walk = walk->next) { + list_for_each(walk, &pdev->bus_list) { struct pci_dev *this_dev = pci_dev_b(walk); /* Skip the pci_bus list entry */ _ From janitor@sternwelten.at Fri Nov 19 18:45:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 18:45:36 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK2jTOx005756 for ; Fri, 19 Nov 2004 18:45:30 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id B76225C00B; Sat, 20 Nov 2004 03:45:07 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02035-05; Sat, 20 Nov 2004 03:45:07 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id 430085C00A; Sat, 20 Nov 2004 03:45:07 +0100 (CET) Received: from [127.0.0.1] (helo=localhost.localdomain) by sputnik with esmtp (Exim 4.34) id 1CVLFO-0002Im-G4; Sat, 20 Nov 2004 03:45:10 +0100 Subject: [patch 4/4] 8139cp net driver: add MODULE_VERSION To: jgarzik@pobox.com Cc: netdev@oss.sgi.com, janitor@sternwelten.at, felipewd@terra.com.br From: janitor@sternwelten.at Date: Sat, 20 Nov 2004 03:45:10 +0100 Message-ID: X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12044 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev Hi Jeff, Add MODULE_VERSION to 8139cp net driver. Cheers, Felipe Signed-off-by: Felipe W Damasio Signed-off-by: Maximilian Attems --- linux-2.6.10-rc2-bk4-max/drivers/net/8139cp.c | 1 + 1 files changed, 1 insertion(+) diff -puN drivers/net/8139cp.c~add_module_version-drivers_net_8139cp drivers/net/8139cp.c --- linux-2.6.10-rc2-bk4/drivers/net/8139cp.c~add_module_version-drivers_net_8139cp 2004-11-19 17:18:43.000000000 +0100 +++ linux-2.6.10-rc2-bk4-max/drivers/net/8139cp.c 2004-11-19 17:18:43.000000000 +0100 @@ -91,6 +91,7 @@ KERN_INFO DRV_NAME ": 10/100 PCI Etherne MODULE_AUTHOR("Jeff Garzik "); MODULE_DESCRIPTION("RealTek RTL-8139C+ series 10/100 PCI Ethernet driver"); +MODULE_VERSION(DRV_VERSION); MODULE_LICENSE("GPL"); static int debug = -1; _ From felipewd@terra.com.br Fri Nov 19 19:08:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 19:08:29 -0800 (PST) Received: from itapoa.terra.com.br (itapoa.terra.com.br [200.154.55.227]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK38PvT007393 for ; Fri, 19 Nov 2004 19:08:25 -0800 Received: from talara.terra.com.br (talara.terra.com.br [200.154.55.136]) by itapoa.terra.com.br (Postfix) with ESMTP id CC65A30C329; Sat, 20 Nov 2004 01:08:04 -0200 (BRST) X-Terra-Karma: -2% X-Terra-Hash: 82f33161a3504c3a26a3e2c2c7fd810c Received: from [192.168.0.100] (200-180-175-077.paemt7006.dsl.brasiltelecom.net.br [200.180.175.77]) (authenticated user felipewd) by talara.terra.com.br (Postfix) with ESMTP id E0C5C3C03E; Sat, 20 Nov 2004 01:08:03 -0200 (BRST) Message-ID: <419EB396.9020406@terra.com.br> Date: Sat, 20 Nov 2004 01:01:42 -0200 From: Felipe W Damasio User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040927 X-Accept-Language: pt-br, en-us, en MIME-Version: 1.0 To: janitor@sternwelten.at Cc: jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch 4/4] 8139cp net driver: add MODULE_VERSION References: In-Reply-To: X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12045 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: felipewd@terra.com.br Precedence: bulk X-list: netdev Hi Max. That has been on Jeff's net-dev queue for a while, Cheers, Felipe janitor@sternwelten.at wrote: > > > Hi Jeff, > > Add MODULE_VERSION to 8139cp net driver. > > Cheers, > > Felipe > > > Signed-off-by: Felipe W Damasio > Signed-off-by: Maximilian Attems > > --- > > linux-2.6.10-rc2-bk4-max/drivers/net/8139cp.c | 1 + > 1 files changed, 1 insertion(+) > > diff -puN drivers/net/8139cp.c~add_module_version-drivers_net_8139cp drivers/net/8139cp.c > --- linux-2.6.10-rc2-bk4/drivers/net/8139cp.c~add_module_version-drivers_net_8139cp 2004-11-19 17:18:43.000000000 +0100 > +++ linux-2.6.10-rc2-bk4-max/drivers/net/8139cp.c 2004-11-19 17:18:43.000000000 +0100 > @@ -91,6 +91,7 @@ KERN_INFO DRV_NAME ": 10/100 PCI Etherne > > MODULE_AUTHOR("Jeff Garzik "); > MODULE_DESCRIPTION("RealTek RTL-8139C+ series 10/100 PCI Ethernet driver"); > +MODULE_VERSION(DRV_VERSION); > MODULE_LICENSE("GPL"); > > static int debug = -1; > _ > > From mrenzmann@web.de Fri Nov 19 21:28:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 21:28:10 -0800 (PST) Received: from smtp08.web.de (smtp08.web.de [217.72.192.226]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK5S5O2014661 for ; Fri, 19 Nov 2004 21:28:06 -0800 Received: from [195.14.203.51] (helo=[192.168.2.42]) by smtp08.web.de with asmtp (TLSv1:RC4-MD5:128) (WEB.DE 4.102 #165) id 1CVNme-000301-00 for netdev@oss.sgi.com; Sat, 20 Nov 2004 06:27:40 +0100 Message-ID: <419ED5CB.3080106@web.de> Date: Sat, 20 Nov 2004 06:27:39 +0100 From: Michael Renzmann User-Agent: Mozilla Thunderbird 0.8 (X11/20040916) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3777] New: tun driver fails to open when built in, must be modular References: <20041119150808.578154d3.akpm@osdl.org> In-Reply-To: <20041119150808.578154d3.akpm@osdl.org> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Sender: mrenzmann@web.de X-archive-position: 12046 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mrenzmann@web.de Precedence: bulk X-list: netdev Hi. Andrew Morton wrote: > Problem Description: kernel will not assign/open a tun device when tun.o is > compiled as a built-in. ifconfig gives 'unable to open /dev/net/tun' error. > compiling as a module fixes. If anyone can give me a small general hints for what might be the cause of this problem, I could take a look at it. I already have some patches for tun.o (that needs to be sent to the maintainer), another one doesn't hurt :) But since I'm not yet too experienced with programming of kernel modules, any help would be appreciated. Bye, Mike From shemminger@osdl.org Fri Nov 19 21:33:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 21:33:16 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK5XACZ015015 for ; Fri, 19 Nov 2004 21:33:10 -0800 Received: from www.osdl.org (fire.osdl.org [65.172.181.4]) by fire-1.osdl.org (8.12.8/8.12.8) with SMTP id iAK5WjPD022506; Fri, 19 Nov 2004 21:32:45 -0800 Received: from 63.170.215.71 (SquirrelMail authenticated user shemminger) by www.osdl.org with HTTP; Fri, 19 Nov 2004 21:32:45 -0800 (PST) Message-ID: <60957.63.170.215.71.1100928765.squirrel@www.osdl.org> In-Reply-To: <419ED5CB.3080106@web.de> References: <20041119150808.578154d3.akpm@osdl.org> <419ED5CB.3080106@web.de> Date: Fri, 19 Nov 2004 21:32:45 -0800 (PST) Subject: Re: Fw: [Bugme-new] [Bug 3777] New: tun driver fails to open whenbuilt in, must be modular From: shemminger@osdl.org To: "Michael Renzmann" Cc: netdev@oss.sgi.com User-Agent: SquirrelMail/1.4.2-1_osdl_00 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 Importance: Normal Received-SPF: pass (domain of shemminger@osdl.org designates 65.172.181.4 as permitted sender) X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12047 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev > Hi. > > Andrew Morton wrote: >> Problem Description: kernel will not assign/open a tun device when tun.o >> is >> compiled as a built-in. ifconfig gives 'unable to open /dev/net/tun' >> error. >> compiling as a module fixes. > > If anyone can give me a small general hints for what might be the cause > of this problem, I could take a look at it. I already have some patches > for tun.o (that needs to be sent to the maintainer), another one doesn't > hurt :) But since I'm not yet too experienced with programming of kernel > modules, any help would be appreciated. > > Bye, Mike > See if it successfully registers with the misc driver (misc_register). I suspect it is an initialization order type thing. Probably the code to register with the misc driver (to create the device) should just be delayed until the network device is brought up (ie dev->open) is called. Good luck. From davem@davemloft.net Fri Nov 19 22:51:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 22:52:11 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK6pvEe016372 for ; Fri, 19 Nov 2004 22:51:58 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CVOqF-0004tr-00; Fri, 19 Nov 2004 22:35:27 -0800 Date: Fri, 19 Nov 2004 22:35:27 -0800 From: "David S. Miller" To: Sridhar Samudrala Cc: herbert@gondor.apana.org.au, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor Message-Id: <20041119223527.1f243d6e.davem@davemloft.net> In-Reply-To: References: <20041116163106.3b62a39a.davem@davemloft.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12048 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Fri, 19 Nov 2004 18:00:21 -0800 (PST) Sridhar Samudrala wrote: > Unfortunately as we cannot upgrade to 2.6.10-rc2 This doesn't work. You cannot expect upstream maintainers to work with you if you're not willing to or able to try things out with the latest kernels. I have an inkling as to the reason why you're restricted in this way, which is that you're limited to some vendor's kernel. Am I right? In that case, work with the vendor unless you can find some way to remove the lack of flexibility you have in using newer kernels. From davem@davemloft.net Fri Nov 19 23:27:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 19 Nov 2004 23:27:40 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK7RQCQ017282 for ; Fri, 19 Nov 2004 23:27:26 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CVPOe-0004zg-00; Fri, 19 Nov 2004 23:11:00 -0800 Date: Fri, 19 Nov 2004 23:11:00 -0800 From: "David S. Miller" To: James Morris Cc: alan@lxorguk.ukuu.org.uk, ross.axe@blueyonder.co.uk, netdev@oss.sgi.com, sds@epoch.ncsc.mil, linux-kernel@vger.kernel.org, chrisw@osdl.org Subject: Re: [PATCH] linux 2.9.10-rc1: Fix oops in unix_dgram_sendmsg when using SELinux and SOCK_SEQPACKET Message-Id: <20041119231100.34b32431.davem@davemloft.net> In-Reply-To: References: <1100864358.8127.5.camel@localhost.localdomain> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12049 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Fri, 19 Nov 2004 11:24:03 -0500 (EST) James Morris wrote: > On Fri, 19 Nov 2004, Alan Cox wrote: > > > Looks right to me, the ECONNRESET is no longer being lost. > > Ok, here is a relative patch for Dave. > > Please apply. > > Signed-off-by: James Morris Applied, thanks for fixing this up. From max@stro.at Sat Nov 20 00:43:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 00:43:54 -0800 (PST) Received: from baikonur.stro.at (baikonur.stro.at [213.239.196.228]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAK8hnfA021885 for ; Sat, 20 Nov 2004 00:43:50 -0800 Received: from localhost (localhost [127.0.0.1]) by baikonur.stro.at (Postfix) with ESMTP id D13755C00B; Sat, 20 Nov 2004 09:43:26 +0100 (CET) Received: from baikonur.stro.at ([127.0.0.1]) by localhost (baikonur [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 10024-07; Sat, 20 Nov 2004 09:43:26 +0100 (CET) Received: from sputnik (stallburg.stro.at [128.131.216.190]) by baikonur.stro.at (Postfix) with ESMTP id 446385C00A; Sat, 20 Nov 2004 09:43:26 +0100 (CET) Received: from max by sputnik with local (Exim 4.34) id 1CVQq9-0001B0-Uf; Sat, 20 Nov 2004 09:43:29 +0100 Date: Sat, 20 Nov 2004 09:43:29 +0100 From: maximilian attems To: Felipe W Damasio Cc: jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch 4/4] 8139cp net driver: add MODULE_VERSION Message-ID: <20041120084329.GA3858@stro.at> Mail-Followup-To: Felipe W Damasio , jgarzik@pobox.com, netdev@oss.sgi.com References: <419EB396.9020406@terra.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419EB396.9020406@terra.com.br> User-Agent: Mutt/1.5.6+20040722i X-Virus-Scanned: by Amavis (ClamAV) at stro.at X-archive-position: 12050 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: janitor@sternwelten.at Precedence: bulk X-list: netdev hello felipe! On Sat, 20 Nov 2004, Felipe W Damasio wrote: > Hi Max. > > That has been on Jeff's net-dev queue for a while, > > Cheers, > > Felipe ooh cool, will better double check -mm next time. :) thanks maks From akpm@osdl.org Sat Nov 20 13:28:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 13:28:33 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAKLSPtw015540 for ; Sat, 20 Nov 2004 13:28:26 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAKLS0929209 for ; Sat, 20 Nov 2004 13:28:00 -0800 Date: Sat, 20 Nov 2004 13:27:49 -0800 From: Andrew Morton To: netdev@oss.sgi.com Subject: Fw: [Bugme-new] [Bug 3784] New: Kernel Panic on huge portrange TCP scan (using nmap portscanner). Message-Id: <20041120132749.5001bef1.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12051 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Sat, 20 Nov 2004 13:14:27 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3784] New: Kernel Panic on huge portrange TCP scan (using nmap portscanner). http://bugme.osdl.org/show_bug.cgi?id=3784 Summary: Kernel Panic on huge portrange TCP scan (using nmap portscanner). Kernel Version: Linux version 2.6.9 (slawek@ivision) (gcc version 3.3.4) #1 Sat Status: NEW Severity: normal Owner: shemminger@osdl.org Submitter: czkaw@poczta.fm Distribution: Slackware 10.0 Hardware Environment: processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 10 model name : AMD Athlon(tm) XP 2500+ stepping : 0 cpu MHz : 1837.442 cache size : 512 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow bogomips : 3629.05 Software Environment: Linux ivision 2.6.9 #1 Sat Nov 20 20:38:14 CET 2004 i686 unknown unknown GNU/Linux Gnu C 3.3.4 Gnu make 3.80 binutils 2.15.90.0.3 util-linux 2.12a mount 2.12a module-init-tools 3.0 e2fsprogs 1.35 reiserfsprogs 3.6.17 reiser4progs line Linux C Library 2.3.2 Dynamic linker (ldd) 2.3.2 Linux C++ Library 5.0.6 Procps 3.2.1 Net-tools 1.60 Kbd 1.12 Sh-utils 5.2.1 Modules Loaded (none) Problem Description: I've got Kernel Panic when i run 'nmap localhost -p 1-60000'. It says : Kernel BUG at net/ipv4/tcp_output.c:227. Steps to reproduce: Install nmap 3.50 ( http://www.insecure.org/nmap/ ) and scan with it 60000 ports on localhost 'nmap localhost -p 1-60000' localhost should be 127.0.0.1 ( lo interface ) ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From sri@us.ibm.com Sat Nov 20 15:20:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 15:20:38 -0800 (PST) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAKNKOTR011657 for ; Sat, 20 Nov 2004 15:20:33 -0800 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e3.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAKNJuW7694954 for ; Sat, 20 Nov 2004 18:19:56 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAKNJuQR225564 for ; Sat, 20 Nov 2004 18:19:56 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAKNJt2h005468 for ; Sat, 20 Nov 2004 18:19:56 -0500 Received: from w-sridhar.beaverton.ibm.com (w-sridhar.beaverton.ibm.com [9.47.18.19]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAKNJtZD005463; Sat, 20 Nov 2004 18:19:55 -0500 Date: Sat, 20 Nov 2004 15:19:54 -0800 (PST) From: Sridhar Samudrala X-X-Sender: sridhar@w-sridhar.beaverton.ibm.com To: "David S. Miller" cc: herbert@gondor.apana.org.au, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor In-Reply-To: <20041119223527.1f243d6e.davem@davemloft.net> Message-ID: References: <20041116163106.3b62a39a.davem@davemloft.net> <20041119223527.1f243d6e.davem@davemloft.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12052 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev On Fri, 19 Nov 2004, David S. Miller wrote: > On Fri, 19 Nov 2004 18:00:21 -0800 (PST) > Sridhar Samudrala wrote: > > > Unfortunately as we cannot upgrade to 2.6.10-rc2 > > This doesn't work. You cannot expect upstream maintainers > to work with you if you're not willing to or able to > try things out with the latest kernels. > > I have an inkling as to the reason why you're restricted > in this way, which is that you're limited to some vendor's > kernel. Am I right? Yes. You are right. It is a vendor kernel based on 2.6.9 along with some vendor specific kernel patches. I agree that it is not always possible to support older kernels and i was not expecting you to do that. I tried to do this myself by identifying the tso related patches that went in after 2.6.9 and just wanted to find out if i missed any other patches that may have fixed the tso related assertions. We will try to see if this problem can be reproduced with 2.6.10-rc2. Thanks Sridhar From tgraf@suug.ch Sat Nov 20 15:52:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 15:52:24 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAKNqHiJ012666 for ; Sat, 20 Nov 2004 15:52:17 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 31825F; Sun, 21 Nov 2004 00:51:32 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 796021C0EA; Sun, 21 Nov 2004 00:52:13 +0100 (CET) Date: Sun, 21 Nov 2004 00:52:13 +0100 From: Thomas Graf To: czkaw@poczta.fm Cc: netdev@oss.sgi.com, Andrew Morton Subject: Re: Fw: [Bugme-new] [Bug 3784] New: Kernel Panic on huge portrange TCP scan (using nmap portscanner). Message-ID: <20041120235213.GZ31969@postel.suug.ch> References: <20041120132749.5001bef1.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041120132749.5001bef1.akpm@osdl.org> X-archive-position: 12053 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev * Andrew Morton <20041120132749.5001bef1.akpm@osdl.org> 2004-11-20 13:27 > Summary: Kernel Panic on huge portrange TCP scan (using nmap > portscanner). > Kernel Version: Linux version 2.6.9 (slawek@ivision) (gcc version 3.3.4) 2.6.9 has a buggy TCP, can you please confirm against at least 2.6.10-rc2. I was not able to repdroduce this in the described way. Thanks. From acme@conectiva.com.br Sat Nov 20 16:44:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 16:45:08 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAL0iu0C016998 for ; Sat, 20 Nov 2004 16:44:57 -0800 Received: from [200.138.46.101] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CVfrs-0002zm-00; Sat, 20 Nov 2004 22:46:16 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id E353E1463D; Sat, 20 Nov 2004 22:44:29 -0200 (BRST) Message-ID: <419FE4F7.8000700@conectiva.com.br> Date: Sat, 20 Nov 2004 22:44:39 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Sridhar Samudrala Cc: "David S. Miller" , herbert@gondor.apana.org.au, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor References: <20041116163106.3b62a39a.davem@davemloft.net> <20041119223527.1f243d6e.davem@davemloft.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12054 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Sridhar Samudrala wrote: > On Fri, 19 Nov 2004, David S. Miller wrote: > > >>On Fri, 19 Nov 2004 18:00:21 -0800 (PST) >>Sridhar Samudrala wrote: >> >> >>>Unfortunately as we cannot upgrade to 2.6.10-rc2 >> >>This doesn't work. You cannot expect upstream maintainers >>to work with you if you're not willing to or able to >>try things out with the latest kernels. >> >>I have an inkling as to the reason why you're restricted >>in this way, which is that you're limited to some vendor's >>kernel. Am I right? > > > Yes. You are right. It is a vendor kernel based on 2.6.9 along > with some vendor specific kernel patches. > I agree that it is not always possible to support older kernels > and i was not expecting you to do that. > I tried to do this myself by identifying the tso related patches > that went in after 2.6.9 and just wanted to find out if i missed > any other patches that may have fixed the tso related assertions. > > We will try to see if this problem can be reproduced with > 2.6.10-rc2. That will help figuring out the problem, even if afterwards you continue using 2.6.9, by determining if the problem was solved already 8) i.e. it may be another bug, not the tso related ones solved in 2.6.10-rc2. - Arnaldo From davem@davemloft.net Sat Nov 20 19:42:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 20 Nov 2004 19:42:29 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAL3gH0F019841 for ; Sat, 20 Nov 2004 19:42:17 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CViLy-0006gx-00; Sat, 20 Nov 2004 19:25:30 -0800 Date: Sat, 20 Nov 2004 19:25:30 -0800 From: "David S. Miller" To: Sridhar Samudrala Cc: herbert@gondor.apana.org.au, netdev@oss.sgi.com Subject: Re: Assertions when lowering tcp_tso_win_divisor Message-Id: <20041120192530.31d8b113.davem@davemloft.net> In-Reply-To: References: <20041116163106.3b62a39a.davem@davemloft.net> <20041119223527.1f243d6e.davem@davemloft.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12055 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sat, 20 Nov 2004 15:19:54 -0800 (PST) Sridhar Samudrala wrote: > I tried to do this myself by identifying the tso related patches > that went in after 2.6.9 and just wanted to find out if i missed > any other patches that may have fixed the tso related assertions. At a minimum you missed the net/core/skbuff.c patch Herbert Xu made to fix missing of copying around tso bits when copying/cloning SKBs. From paul@clubi.ie Sun Nov 21 00:17:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 00:17:44 -0800 (PST) Received: from hibernia.jakma.org (hibernia.jakma.org [212.17.55.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAL8H49A027394 for ; Sun, 21 Nov 2004 00:17:05 -0800 Received: from hibernia.jakma.org (IDENT:paul@hibernia.jakma.org [192.168.0.3]) by hibernia.jakma.org (8.12.11/8.12.11) with ESMTP id iAL8GYgQ028665; Sun, 21 Nov 2004 08:16:34 GMT Date: Sun, 21 Nov 2004 08:16:34 +0000 (GMT) From: Paul Jakma X-X-Sender: paul@hibernia.jakma.org To: Jeff Garzik cc: Thomas Spatzier , linux-kernel@vger.kernel.org, Netdev Subject: Re: [patch 4/10] s390: network driver. In-Reply-To: Message-ID: References: <4196B4E9.40502@pobox.com> Mail-Followup-To: paul@hibernia.jakma.org X-NSA: arafat al aqsar jihad musharef jet-A1 avgas ammonium qran inshallah allah al-akbar martyr iraq saddam hammas hisballah rabin ayatollah korea vietnam revolt mustard gas british airways washington MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 12056 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@clubi.ie Precedence: bulk X-list: netdev On Mon, 15 Nov 2004, Paul Jakma wrote: > non-raw/header-included sockets, eg BGP tcp sockets, a user like > GNU Zebra / Quagga would much prefer packets to be dropped. Ur... not for TCP.. obviously. Anyway, is there any advice on how applications that use a single socket for raw/udp should deal with this new behaviour? All of the link-orientated routing protocol daemons in Quagga/GNU Zebra are going to break on Linux with this new behaviour. Should such applications be changed to open a seperate socket per interface? Or could we have a SO_DROP_DONT_QUEUE sockopt to allow a privileged application to retain the previous behaviour, or some way to flush the queue for a socket? Using a socket per interface wont address problem of sending quite stale packets when a link comes back after a long time down, AUI. (not a huge problem - but not nice). Jeff??? regards, -- Paul Jakma paul@clubi.ie paul@jakma.org Key ID: 64A2FF6A Fortune: Be incomprehensible. If they can't understand, they can't disagree. From rich@phekda.gotadsl.co.uk Sun Nov 21 05:17:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 05:17:38 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALDHMoE017756 for ; Sun, 21 Nov 2004 05:17:23 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (81-6-225-165.dyn.gotadsl.co.uk [81.6.225.165]) by smtp.nildram.co.uk (Postfix) with ESMTP id B5B89255F00 for ; Sun, 21 Nov 2004 13:16:56 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id C201636E; Sun, 21 Nov 2004 13:16:49 +0000 (GMT) Message-ID: <41A09541.5040405@phekda.gotadsl.co.uk> Date: Sun, 21 Nov 2004 13:16:49 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: Me Subject: Acer Aspire 1524WLMi and RealTek 8169 - very slow Content-Type: multipart/mixed; boundary="------------010102020007060902080303" X-archive-position: 12057 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------010102020007060902080303 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hello. I recently bought an Acer Aspire 1524WLMi, which is a laptop with an AMD Athlon64 3400, a RealTek 8169 GigE chip and a bunch of other stuff. I'm currently not able to get more than about 30KB/sec throughput out of the RealTek built-in network adapter. I get a lot of packet loss. The packet loss seems to increase with packet size. Using ping I see that around 1500 bytes packets very little data passes at all. I'm running Fedora Core 3. Here are the different kernels I've tried: * kernel-2.6.9-1.678_FC3; * kernel-2.6.9-1.678_FC3 with a backport of the VIA 8233 PCI quirk; * kernel-2.6.9-1.678_FC3 with a backport of version 1.6LK of the 8169 driver from 2.6.10-rc2-mm2; * 2.6.10-rc2; * 2.6.10-rc2-mm2; * 2.6.10-rc2-mm2 with sound completely disabled (the network card shares an IRQ with the sound chip - I thought this might help). Sadly these all had the same terrible performance. Strangely at one point I did get good performance from the network card. The laptop came with Windows XP Home SP2. I installed Fedora Core 3 on it pretty quickly. Maybe there was some initialisation that XP did that Linux doesn't? I'm attaching the following: * results of various pings; * my kernel config (based on FC3 kernel's); * dmesg; * ethtool -d eth0; * ethtool -i eth0; * ifconfig; * lspci -vvx; * /proc/interrupts. I've also attached a couple of patches against the kernel and ethtool. I think the r8169 driver mispopulates the info->driver data with a long text string. Other drivers seem to populate it with just the driver name, e.g.: "8139too". I've attached a patch against ethtool which allows me to run -d against my network card. It requires the kernel patch. Let me know if there's any more information I can give you or any debugging or patches you want me to try out. Please CC me on replies, since I'm not subscribed to the list. Thanks, regards, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek --------------010102020007060902080303 Content-Type: text/plain; name="ping-default.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ping-default.txt" PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=0 ttl=255 time=0.399 ms 64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=0.400 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=0.397 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=0.398 ms 64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=0.399 ms 64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=0.418 ms 64 bytes from 192.168.1.1: icmp_seq=6 ttl=255 time=0.396 ms 64 bytes from 192.168.1.1: icmp_seq=7 ttl=255 time=0.399 ms 64 bytes from 192.168.1.1: icmp_seq=8 ttl=255 time=0.398 ms 64 bytes from 192.168.1.1: icmp_seq=9 ttl=255 time=0.399 ms 64 bytes from 192.168.1.1: icmp_seq=10 ttl=255 time=0.400 ms 64 bytes from 192.168.1.1: icmp_seq=11 ttl=255 time=0.396 ms 64 bytes from 192.168.1.1: icmp_seq=12 ttl=255 time=0.511 ms 64 bytes from 192.168.1.1: icmp_seq=13 ttl=255 time=0.398 ms 64 bytes from 192.168.1.1: icmp_seq=14 ttl=255 time=0.385 ms 64 bytes from 192.168.1.1: icmp_seq=15 ttl=255 time=0.399 ms 64 bytes from 192.168.1.1: icmp_seq=16 ttl=255 time=0.421 ms 64 bytes from 192.168.1.1: icmp_seq=17 ttl=255 time=0.396 ms 64 bytes from 192.168.1.1: icmp_seq=19 ttl=255 time=0.394 ms 64 bytes from 192.168.1.1: icmp_seq=20 ttl=255 time=0.396 ms --------------010102020007060902080303 Content-Type: text/plain; name="ping-1024.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ping-1024.txt" PING 192.168.1.1 (192.168.1.1) 1024(1052) bytes of data. 1032 bytes from 192.168.1.1: icmp_seq=0 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=1.15 ms 1032 bytes from 192.168.1.1: icmp_seq=7 ttl=255 time=1.20 ms 1032 bytes from 192.168.1.1: icmp_seq=8 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=9 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=10 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=11 ttl=255 time=1.18 ms 1032 bytes from 192.168.1.1: icmp_seq=12 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=13 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=15 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=17 ttl=255 time=1.15 ms 1032 bytes from 192.168.1.1: icmp_seq=18 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=19 ttl=255 time=1.16 ms 1032 bytes from 192.168.1.1: icmp_seq=20 ttl=255 time=1.27 ms --------------010102020007060902080303 Content-Type: text/plain; name="ping-1472.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ping-1472.txt" PING 192.168.1.1 (192.168.1.1) 1472(1500) bytes of data. 1480 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=1.50 ms 1480 bytes from 192.168.1.1: icmp_seq=7 ttl=255 time=1.51 ms 1480 bytes from 192.168.1.1: icmp_seq=9 ttl=255 time=1.51 ms 1480 bytes from 192.168.1.1: icmp_seq=15 ttl=255 time=1.50 ms 1480 bytes from 192.168.1.1: icmp_seq=18 ttl=255 time=1.51 ms 1480 bytes from 192.168.1.1: icmp_seq=20 ttl=255 time=1.51 ms 1480 bytes from 192.168.1.1: icmp_seq=21 ttl=255 time=1.51 ms --------------010102020007060902080303 Content-Type: text/plain; name="ping-2048.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ping-2048.txt" --------------010102020007060902080303 Content-Type: text/plain; name="config-2.6.10-rc2-mm2" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="config-2.6.10-rc2-mm2" # # Automatically generated make config: don't edit # Linux kernel version: 2.6.10-rc2-mm2 # Sun Nov 21 09:39:56 2004 # CONFIG_X86_64=y CONFIG_64BIT=y CONFIG_X86=y CONFIG_MMU=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_X86_CMPXCHG=y CONFIG_EARLY_PRINTK=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y # # General setup # CONFIG_LOCALVERSION="" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_SYSCTL=y CONFIG_AUDIT=y CONFIG_AUDITSYSCALL=y CONFIG_LOG_BUF_SHIFT=17 CONFIG_HOTPLUG=y CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_FUTEX=y CONFIG_EPOLL=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SHMEM=y CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set # # Loadable module support # CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y CONFIG_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y # # Processor type and features # # CONFIG_MK8 is not set # CONFIG_MPSC is not set CONFIG_GENERIC_CPU=y CONFIG_X86_L1_CACHE_BYTES=128 CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_TSC=y CONFIG_X86_GOOD_APIC=y CONFIG_MICROCODE=m CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_MTRR=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set # CONFIG_NUMA is not set CONFIG_GART_IOMMU=y CONFIG_SWIOTLB=y CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_PROBE=y # # Power management options # CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_SOFTWARE_SUSPEND is not set # # ACPI (Advanced Configuration and Power Interface) Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=m CONFIG_ACPI_BATTERY=m CONFIG_ACPI_BUTTON=m CONFIG_ACPI_VIDEO=m CONFIG_ACPI_FAN=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_THERMAL=y CONFIG_ACPI_ASUS=m CONFIG_ACPI_IBM=m CONFIG_ACPI_TOSHIBA=m CONFIG_ACPI_BLACKLIST_YEAR=2001 # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_BUS=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y # CONFIG_ACPI_CONTAINER is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y # CONFIG_CPU_FREQ_DEBUG is not set # CONFIG_CPU_FREQ_PROC_INTF is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=y # CONFIG_CPU_FREQ_24_API is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=m CONFIG_CPU_FREQ_TABLE=y # # CPUFreq processor drivers # CONFIG_X86_POWERNOW_K8=y CONFIG_X86_POWERNOW_K8_ACPI=y CONFIG_X86_SPEEDSTEP_CENTRINO=y CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y CONFIG_X86_ACPI_CPUFREQ=m # # shared options # # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y # CONFIG_UNORDERED_IO is not set CONFIG_PCI_MSI=y CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set # # PCCARD (PCMCIA/CardBus) support # CONFIG_PCCARD=m # CONFIG_PCMCIA_DEBUG is not set # CONFIG_PCMCIA_OBSOLETE is not set CONFIG_PCMCIA=m CONFIG_CARDBUS=y # # PC-card bridges # CONFIG_YENTA=m CONFIG_PD6729=m CONFIG_I82092=m CONFIG_TCIC=m # # PCI Hotplug Support # CONFIG_HOTPLUG_PCI=y # CONFIG_HOTPLUG_PCI_FAKE is not set # CONFIG_HOTPLUG_PCI_ACPI is not set # CONFIG_HOTPLUG_PCI_CPCI is not set CONFIG_HOTPLUG_PCI_PCIE=m CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE=y CONFIG_HOTPLUG_PCI_SHPC=m CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE=y # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_UID16=y # # Performance-monitoring counters support # # CONFIG_PERFCTR is not set # CONFIG_KEXEC is not set # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # CONFIG_MTD=m # CONFIG_MTD_DEBUG is not set CONFIG_MTD_PARTITIONS=y CONFIG_MTD_CONCAT=m CONFIG_MTD_REDBOOT_PARTS=m # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set CONFIG_MTD_CMDLINE_PARTS=y # # User Modules And Translation Layers # CONFIG_MTD_CHAR=m CONFIG_MTD_BLOCK=m CONFIG_MTD_BLOCK_RO=m CONFIG_FTL=m CONFIG_NFTL=m CONFIG_NFTL_RW=y CONFIG_INFTL=m # # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=m CONFIG_MTD_JEDECPROBE=m CONFIG_MTD_GEN_PROBE=m # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set CONFIG_MTD_CFI_INTELEXT=m CONFIG_MTD_CFI_AMDSTD=m CONFIG_MTD_CFI_AMDSTD_RETRY=3 CONFIG_MTD_CFI_STAA=m CONFIG_MTD_CFI_UTIL=m CONFIG_MTD_RAM=m CONFIG_MTD_ROM=m CONFIG_MTD_ABSENT=m # CONFIG_MTD_XIP is not set # # Mapping drivers for chip access # CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_PNC2000 is not set CONFIG_MTD_SC520CDP=m CONFIG_MTD_NETSC520=m CONFIG_MTD_TS5500=m CONFIG_MTD_SBC_GXX=m CONFIG_MTD_ELAN_104NC=m CONFIG_MTD_SCx200_DOCFLASH=m # CONFIG_MTD_AMD76XROM is not set # CONFIG_MTD_ICHXROM is not set CONFIG_MTD_SCB2_FLASH=m # CONFIG_MTD_NETtel is not set # CONFIG_MTD_DILNETPC is not set # CONFIG_MTD_L440GX is not set CONFIG_MTD_PCI=m # # Self-contained MTD device drivers # CONFIG_MTD_PMC551=m # CONFIG_MTD_PMC551_BUGFIX is not set # CONFIG_MTD_PMC551_DEBUG is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set CONFIG_MTD_MTDRAM=m CONFIG_MTDRAM_TOTAL_SIZE=4096 CONFIG_MTDRAM_ERASE_SIZE=128 # CONFIG_MTD_BLKMTD is not set # # Disk-On-Chip Device Drivers # CONFIG_MTD_DOC2000=m # CONFIG_MTD_DOC2001 is not set CONFIG_MTD_DOC2001PLUS=m CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m # CONFIG_MTD_DOCPROBE_ADVANCED is not set CONFIG_MTD_DOCPROBE_ADDRESS=0 # # NAND Flash Device Drivers # CONFIG_MTD_NAND=m # CONFIG_MTD_NAND_VERIFY_WRITE is not set CONFIG_MTD_NAND_IDS=m # CONFIG_MTD_NAND_DISKONCHIP is not set # # Parallel port support # CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_PARPORT_PC_CML1=m CONFIG_PARPORT_SERIAL=m # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set CONFIG_PARPORT_PC_PCMCIA=m # CONFIG_PARPORT_OTHER is not set CONFIG_PARPORT_1284=y # # Plug and Play support # CONFIG_PNP=y # CONFIG_PNP_DEBUG is not set # # Protocols # # CONFIG_PNPACPI is not set # # Block devices # CONFIG_BLK_DEV_FD=m # CONFIG_PARIDE is not set CONFIG_BLK_CPQ_DA=m CONFIG_BLK_CPQ_CISS_DA=m CONFIG_CISS_SCSI_TAPE=y CONFIG_BLK_DEV_DAC960=m CONFIG_BLK_DEV_UMEM=m CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_CRYPTOLOOP=m CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_SX8=m # CONFIG_BLK_DEV_UB is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=16384 CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_LBD=y CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD_BUFFERS=8 # CONFIG_CDROM_PKTCDVD_WCACHE is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECS=m CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set CONFIG_BLK_DEV_IDEFLOPPY=y CONFIG_BLK_DEV_IDESCSI=m # CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_IDEPNP is not set CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_OFFBOARD is not set CONFIG_BLK_DEV_GENERIC=y # CONFIG_BLK_DEV_OPTI621 is not set CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_AEC62XX=y CONFIG_BLK_DEV_ALI15X3=y # CONFIG_WDC_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y CONFIG_BLK_DEV_ATIIXP=y CONFIG_BLK_DEV_CMD64X=y CONFIG_BLK_DEV_TRIFLEX=y CONFIG_BLK_DEV_CY82C693=y CONFIG_BLK_DEV_CS5520=y CONFIG_BLK_DEV_CS5530=y CONFIG_BLK_DEV_HPT34X=y # CONFIG_HPT34X_AUTODMA is not set CONFIG_BLK_DEV_HPT366=y # CONFIG_BLK_DEV_SC1200 is not set CONFIG_BLK_DEV_PIIX=y # CONFIG_BLK_DEV_NS87415 is not set CONFIG_BLK_DEV_PDC202XX_OLD=y # CONFIG_PDC202XX_BURST is not set CONFIG_BLK_DEV_PDC202XX_NEW=y CONFIG_BLK_DEV_SVWKS=y CONFIG_BLK_DEV_SIIMAGE=y CONFIG_BLK_DEV_SIS5513=y CONFIG_BLK_DEV_SLC90E66=y # CONFIG_BLK_DEV_TRM290 is not set CONFIG_BLK_DEV_VIA82CXXX=y # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=m CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=m CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=m CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y # # SCSI Transport Attributes # CONFIG_SCSI_SPI_ATTRS=m CONFIG_SCSI_FC_ATTRS=m CONFIG_SCSI_ISCSI_ATTRS=m # # SCSI low-level drivers # CONFIG_BLK_DEV_3W_XXXX_RAID=m CONFIG_SCSI_3W_9XXX=m CONFIG_SCSI_ACARD=m CONFIG_SCSI_AACRAID=m CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=4 CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_DEBUG_ENABLE is not set CONFIG_AIC7XXX_DEBUG_MASK=0 # CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set CONFIG_SCSI_AIC7XXX_OLD=m CONFIG_SCSI_AIC79XX=m CONFIG_AIC79XX_CMDS_PER_DEVICE=4 CONFIG_AIC79XX_RESET_DELAY_MS=15000 # CONFIG_AIC79XX_ENABLE_RD_STRM is not set # CONFIG_AIC79XX_DEBUG_ENABLE is not set CONFIG_AIC79XX_DEBUG_MASK=0 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set CONFIG_MEGARAID_NEWGEN=y CONFIG_MEGARAID_MM=m CONFIG_MEGARAID_MAILBOX=m CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_AHCI=m CONFIG_SCSI_SATA_SVW=m CONFIG_SCSI_ATA_PIIX=m CONFIG_SCSI_SATA_NV=m CONFIG_SCSI_SATA_PROMISE=m CONFIG_SCSI_SATA_SX4=m CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m CONFIG_SCSI_SATA_ULI=m CONFIG_SCSI_SATA_VIA=m CONFIG_SCSI_SATA_VITESSE=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_OMIT_FLASHPOINT is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set CONFIG_SCSI_GDTH=m CONFIG_SCSI_IPS=m CONFIG_SCSI_INITIO=m CONFIG_SCSI_INIA100=m CONFIG_SCSI_PPA=m CONFIG_SCSI_IMM=m # CONFIG_SCSI_IZIP_EPP16 is not set # CONFIG_SCSI_IZIP_SLOW_CTR is not set CONFIG_SCSI_SYM53C8XX_2=m CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_IPR is not set CONFIG_SCSI_QLOGIC_ISP=m # CONFIG_SCSI_QLOGIC_FC is not set CONFIG_SCSI_QLOGIC_1280=m CONFIG_SCSI_QLOGIC_1280_1040=y CONFIG_SCSI_QLA2XXX=m CONFIG_SCSI_QLA21XX=m CONFIG_SCSI_QLA22XX=m CONFIG_SCSI_QLA2300=m CONFIG_SCSI_QLA2322=m CONFIG_SCSI_QLA6312=m CONFIG_SCSI_QLA6322=m # CONFIG_SCSI_DC395x is not set CONFIG_SCSI_DC390T=m # CONFIG_SCSI_DEBUG is not set # # PCMCIA SCSI adapter support # CONFIG_PCMCIA_FDOMAIN=m CONFIG_PCMCIA_QLOGIC=m CONFIG_PCMCIA_SYM53C500=m # # Multi-device support (RAID and LVM) # CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID10=m CONFIG_MD_RAID5=m CONFIG_MD_RAID6=m CONFIG_MD_MULTIPATH=m # CONFIG_MD_FAULTY is not set CONFIG_BLK_DEV_DM=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_MIRROR=m CONFIG_DM_ZERO=m # # Fusion MPT device support # CONFIG_FUSION=m CONFIG_FUSION_MAX_SGE=40 CONFIG_FUSION_CTL=m CONFIG_FUSION_LAN=m # # IEEE 1394 (FireWire) support # CONFIG_IEEE1394=m # # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # Device Drivers # # CONFIG_IEEE1394_PCILYNX is not set CONFIG_IEEE1394_OHCI1394=m # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=m CONFIG_IEEE1394_SBP2=m # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set # CONFIG_IEEE1394_ETH1394 is not set CONFIG_IEEE1394_DV1394=m CONFIG_IEEE1394_RAWIO=m CONFIG_IEEE1394_CMP=m CONFIG_IEEE1394_AMDTP=m # # I2O device support # CONFIG_I2O=m CONFIG_I2O_CONFIG=m CONFIG_I2O_BLOCK=m CONFIG_I2O_SCSI=m CONFIG_I2O_PROC=m # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_NETLINK_DEV=y CONFIG_UNIX=y CONFIG_IPMI_SOCKET=m CONFIG_NET_KEY=m CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_FWMARK=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m CONFIG_INET_TUNNEL=m CONFIG_IP_TCPDIAG=m CONFIG_IP_TCPDIAG_IPV6=y # # IP: Virtual Server Configuration # CONFIG_IP_VS=m # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y # # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_INET6_TUNNEL=m CONFIG_IPV6_TUNNEL=m CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_BRIDGE_NETFILTER=y # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_CT_ACCT=y CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CT_PROTO_SCTP=m CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_PHYSDEV=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_REALM=m CONFIG_IP_NF_MATCH_SCTP=m CONFIG_IP_NF_MATCH_COMMENT=m CONFIG_IP_NF_MATCH_CONNMARK=m CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m CONFIG_IP_NF_NAT_LOCAL=y CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_CONNMARK=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_TARGET_NOTRACK=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_IP_NF_COMPAT_IPCHAINS is not set # CONFIG_IP_NF_COMPAT_IPFWADM is not set # # IPv6: Netfilter Configuration # # CONFIG_IP6_NF_QUEUE is not set CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_PHYSDEV=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m CONFIG_IP6_NF_RAW=m # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m CONFIG_BRIDGE_EBT_T_NAT=m CONFIG_BRIDGE_EBT_802_3=m CONFIG_BRIDGE_EBT_AMONG=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m CONFIG_BRIDGE_EBT_VLAN=m CONFIG_BRIDGE_EBT_ARPREPLY=m CONFIG_BRIDGE_EBT_DNAT=m CONFIG_BRIDGE_EBT_MARK_T=m CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=m # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y CONFIG_ATM=m CONFIG_ATM_CLIP=m # CONFIG_ATM_CLIP_NO_ICMP is not set CONFIG_ATM_LANE=m # CONFIG_ATM_MPOA is not set CONFIG_ATM_BR2684=m # CONFIG_ATM_BR2684_IPFILTER is not set CONFIG_BRIDGE=m CONFIG_VLAN_8021Q=m # CONFIG_DECNET is not set CONFIG_LLC=y # CONFIG_LLC2 is not set CONFIG_IPX=m # CONFIG_IPX_INTERN is not set CONFIG_ATALK=m CONFIG_DEV_APPLETALK=y CONFIG_IPDDP=m CONFIG_IPDDP_ENCAP=y CONFIG_IPDDP_DECAP=y # CONFIG_X25 is not set # CONFIG_LAPB is not set CONFIG_NET_DIVERT=y # CONFIG_ECONET is not set CONFIG_WAN_ROUTER=m # # QoS and/or fair queueing # CONFIG_NET_SCHED=y CONFIG_NET_SCH_CLK_JIFFIES=y # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set # CONFIG_NET_SCH_CLK_CPU is not set CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_ATM=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_CLS_U32_PERF=y CONFIG_NET_CLS_IND=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m # CONFIG_NET_CLS_ACT is not set CONFIG_NET_CLS_POLICE=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_KGDBOE is not set CONFIG_NETPOLL=y # CONFIG_NETPOLL_RX is not set # CONFIG_NETPOLL_TRAP is not set CONFIG_NET_POLL_CONTROLLER=y # CONFIG_HAMRADIO is not set CONFIG_IRDA=m # # IrDA protocols # CONFIG_IRLAN=m CONFIG_IRNET=m CONFIG_IRCOMM=m # CONFIG_IRDA_ULTRA is not set # # IrDA options # CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set # # Infrared-port device drivers # # # SIR device drivers # CONFIG_IRTTY_SIR=m # # Dongle support # CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m CONFIG_TEKRAM_DONGLE=m CONFIG_LITELINK_DONGLE=m CONFIG_MA600_DONGLE=m CONFIG_GIRBIL_DONGLE=m CONFIG_MCP2120_DONGLE=m CONFIG_OLD_BELKIN_DONGLE=m CONFIG_ACT200L_DONGLE=m # # Old SIR device drivers # CONFIG_IRPORT_SIR=m # # Old Serial dongle support # # CONFIG_DONGLE_OLD is not set # # FIR device drivers # CONFIG_USB_IRDA=m CONFIG_SIGMATEL_FIR=m # CONFIG_VLSI_FIR is not set CONFIG_BT=m CONFIG_BT_L2CAP=m CONFIG_BT_SCO=m CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_CMTP=m CONFIG_BT_HIDP=m # # Bluetooth device drivers # CONFIG_BT_HCIUSB=m CONFIG_BT_HCIUSB_SCO=y CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_BCSP_TXCRC=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIDTL1=m CONFIG_BT_HCIBT3C=m CONFIG_BT_HCIBLUECARD=m CONFIG_BT_HCIBTUART=m CONFIG_BT_HCIVHCI=m CONFIG_NETDEVICES=y CONFIG_DUMMY=m CONFIG_BONDING=m CONFIG_EQUALIZER=m CONFIG_TUN=m CONFIG_ETHERTAP=m CONFIG_NET_SB1000=m # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=m CONFIG_HAPPYMEAL=m CONFIG_SUNGEM=m CONFIG_NET_VENDOR_3COM=y CONFIG_VORTEX=m CONFIG_TYPHOON=m # # Tulip family network device support # CONFIG_NET_TULIP=y CONFIG_DE2104X=m CONFIG_TULIP=m # CONFIG_TULIP_MWI is not set CONFIG_TULIP_MMIO=y # CONFIG_TULIP_NAPI is not set CONFIG_DE4X5=m CONFIG_WINBOND_840=m CONFIG_DM9102=m CONFIG_PCMCIA_XIRCOM=m CONFIG_PCMCIA_XIRTULIP=m # CONFIG_HP100 is not set CONFIG_NET_PCI=y CONFIG_PCNET32=m CONFIG_AMD8111_ETH=m CONFIG_AMD8111E_NAPI=y CONFIG_ADAPTEC_STARFIRE=m CONFIG_ADAPTEC_STARFIRE_NAPI=y CONFIG_B44=m CONFIG_FORCEDETH=m CONFIG_DGRS=m CONFIG_EEPRO100=m CONFIG_E100=m CONFIG_E100_NAPI=y CONFIG_FEALNX=m CONFIG_NATSEMI=m CONFIG_NE2K_PCI=m CONFIG_8139CP=m CONFIG_8139TOO=m CONFIG_8139TOO_PIO=y # CONFIG_8139TOO_TUNE_TWISTER is not set CONFIG_8139TOO_8129=y # CONFIG_8139_OLD_RX_RESET is not set CONFIG_SIS900=m CONFIG_EPIC100=m CONFIG_SUNDANCE=m # CONFIG_SUNDANCE_MMIO is not set CONFIG_VIA_RHINE=m CONFIG_VIA_RHINE_MMIO=y # # Ethernet (1000 Mbit) # CONFIG_ACENIC=m # CONFIG_ACENIC_OMIT_TIGON_I is not set CONFIG_DL2K=m CONFIG_E1000=m CONFIG_E1000_NAPI=y CONFIG_NS83820=m CONFIG_HAMACHI=m CONFIG_YELLOWFIN=m CONFIG_R8169=m CONFIG_R8169_NAPI=y CONFIG_R8169_VLAN=y CONFIG_SK98LIN=m CONFIG_VIA_VELOCITY=m CONFIG_TIGON3=m # # Ethernet (10000 Mbit) # CONFIG_IXGB=m CONFIG_IXGB_NAPI=y CONFIG_S2IO=m CONFIG_S2IO_NAPI=y # CONFIG_2BUFF_MODE is not set # # Token Ring devices # CONFIG_TR=y CONFIG_IBMOL=m CONFIG_3C359=m CONFIG_TMS380TR=m CONFIG_TMSPCI=m CONFIG_ABYSS=m # # Wireless LAN (non-hamradio) # CONFIG_NET_RADIO=y # # Obsolete Wireless cards support (pre-802.11) # # CONFIG_STRIP is not set CONFIG_PCMCIA_WAVELAN=m CONFIG_PCMCIA_NETWAVE=m # # Wireless 802.11 Frequency Hopping cards support # CONFIG_PCMCIA_RAYCS=m # # Wireless 802.11b ISA/PCI cards support # CONFIG_HERMES=m CONFIG_PLX_HERMES=m CONFIG_TMD_HERMES=m CONFIG_PCI_HERMES=m CONFIG_ATMEL=m CONFIG_PCI_ATMEL=m # # Wireless 802.11b Pcmcia/Cardbus cards support # CONFIG_PCMCIA_HERMES=m CONFIG_AIRO_CS=m CONFIG_PCMCIA_ATMEL=m CONFIG_PCMCIA_WL3501=m # # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # CONFIG_PRISM54=m CONFIG_HOSTAP=m CONFIG_HOSTAP_WEP=m CONFIG_HOSTAP_TKIP=m CONFIG_HOSTAP_CCMP=m # CONFIG_HOSTAP_FIRMWARE is not set CONFIG_HOSTAP_PLX=m CONFIG_HOSTAP_PCI=m CONFIG_HOSTAP_CS=m CONFIG_NET_WIRELESS=y # # PCMCIA network device support # CONFIG_NET_PCMCIA=y CONFIG_PCMCIA_3C589=m CONFIG_PCMCIA_3C574=m CONFIG_PCMCIA_FMVJ18X=m CONFIG_PCMCIA_PCNET=m CONFIG_PCMCIA_NMCLAN=m CONFIG_PCMCIA_SMC91C92=m CONFIG_PCMCIA_XIRC2PS=m CONFIG_PCMCIA_AXNET=m # # Wan interfaces # # CONFIG_WAN is not set # # ATM drivers # CONFIG_ATM_TCP=m CONFIG_ATM_LANAI=m CONFIG_ATM_ENI=m # CONFIG_ATM_ENI_DEBUG is not set # CONFIG_ATM_ENI_TUNE_BURST is not set CONFIG_ATM_FIRESTREAM=m # CONFIG_ATM_ZATM is not set CONFIG_ATM_IDT77252=m # CONFIG_ATM_IDT77252_DEBUG is not set # CONFIG_ATM_IDT77252_RCV_ALL is not set CONFIG_ATM_IDT77252_USE_SUNI=y CONFIG_ATM_AMBASSADOR=m # CONFIG_ATM_AMBASSADOR_DEBUG is not set CONFIG_ATM_HORIZON=m # CONFIG_ATM_HORIZON_DEBUG is not set CONFIG_ATM_FORE200E_MAYBE=m # CONFIG_ATM_FORE200E_PCA is not set CONFIG_ATM_HE=m # CONFIG_ATM_HE_USE_SUNI is not set CONFIG_FDDI=y # CONFIG_DEFXX is not set CONFIG_SKFP=m # CONFIG_HIPPI is not set CONFIG_PLIP=m CONFIG_PPP=m CONFIG_PPP_MULTILINK=y CONFIG_PPP_FILTER=y CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_BSDCOMP is not set CONFIG_PPPOE=m CONFIG_PPPOATM=m CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y # CONFIG_SLIP_MODE_SLIP6 is not set CONFIG_NET_FC=y # CONFIG_SHAPER is not set CONFIG_NETCONSOLE=m # # ISDN subsystem # CONFIG_ISDN=m # # Old ISDN4Linux # CONFIG_ISDN_I4L=m CONFIG_ISDN_PPP=y CONFIG_ISDN_PPP_VJ=y CONFIG_ISDN_MPP=y CONFIG_IPPP_FILTER=y # CONFIG_ISDN_PPP_BSDCOMP is not set CONFIG_ISDN_AUDIO=y CONFIG_ISDN_TTY_FAX=y # # ISDN feature submodules # CONFIG_ISDN_DRV_LOOP=m CONFIG_ISDN_DIVERSION=m # # ISDN4Linux hardware drivers # # # Passive cards # CONFIG_ISDN_DRV_HISAX=m # # D-channel protocol features # CONFIG_HISAX_EURO=y CONFIG_DE_AOC=y CONFIG_HISAX_NO_SENDCOMPLETE=y CONFIG_HISAX_NO_LLC=y CONFIG_HISAX_NO_KEYPAD=y CONFIG_HISAX_1TR6=y CONFIG_HISAX_NI1=y CONFIG_HISAX_MAX_CARDS=8 # # HiSax supported cards # CONFIG_HISAX_16_3=y CONFIG_HISAX_TELESPCI=y CONFIG_HISAX_S0BOX=y CONFIG_HISAX_FRITZPCI=y CONFIG_HISAX_AVM_A1_PCMCIA=y CONFIG_HISAX_ELSA=y CONFIG_HISAX_DIEHLDIVA=y CONFIG_HISAX_SEDLBAUER=y CONFIG_HISAX_NETJET=y CONFIG_HISAX_NETJET_U=y CONFIG_HISAX_NICCY=y CONFIG_HISAX_BKM_A4T=y CONFIG_HISAX_SCT_QUADRO=y CONFIG_HISAX_GAZEL=y CONFIG_HISAX_HFC_PCI=y CONFIG_HISAX_W6692=y CONFIG_HISAX_HFC_SX=y CONFIG_HISAX_ENTERNOW_PCI=y # CONFIG_HISAX_DEBUG is not set # # HiSax PCMCIA card service modules # CONFIG_HISAX_SEDLBAUER_CS=m CONFIG_HISAX_ELSA_CS=m CONFIG_HISAX_AVM_A1_CS=m CONFIG_HISAX_TELES_CS=m # # HiSax sub driver modules # CONFIG_HISAX_ST5481=m CONFIG_HISAX_HFCUSB=m CONFIG_HISAX_FRITZ_PCIPNP=m CONFIG_HISAX_HDLC=y # # Active cards # CONFIG_ISDN_DRV_TPAM=m CONFIG_HYSDN=m CONFIG_HYSDN_CAPI=y # # CAPI subsystem # CONFIG_ISDN_CAPI=m CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y CONFIG_ISDN_CAPI_MIDDLEWARE=y CONFIG_ISDN_CAPI_CAPI20=m CONFIG_ISDN_CAPI_CAPIFS_BOOL=y CONFIG_ISDN_CAPI_CAPIFS=m CONFIG_ISDN_CAPI_CAPIDRV=m # # CAPI hardware drivers # # # Active AVM cards # CONFIG_CAPI_AVM=y CONFIG_ISDN_DRV_AVMB1_B1PCI=m CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m CONFIG_ISDN_DRV_AVMB1_AVM_CS=m CONFIG_ISDN_DRV_AVMB1_T1PCI=m CONFIG_ISDN_DRV_AVMB1_C4=m # # Active Eicon DIVA Server cards # # CONFIG_CAPI_EICON is not set # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m # CONFIG_INPUT_TSDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # CONFIG_GAMEPORT=m CONFIG_SOUND_GAMEPORT=m CONFIG_GAMEPORT_NS558=m CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_EMU10K1=m CONFIG_GAMEPORT_VORTEX=m CONFIG_GAMEPORT_FM801=m CONFIG_GAMEPORT_CS461x=m CONFIG_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m CONFIG_MOUSE_VSXXXAA=m CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y CONFIG_JOYSTICK_IFORCE_232=y CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDDLER=m CONFIG_JOYSTICK_DB9=m CONFIG_JOYSTICK_GAMECON=m CONFIG_JOYSTICK_TURBOGRAFX=m CONFIG_JOYSTICK_JOYDUMP=m CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_GUNZE=m CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=m CONFIG_INPUT_UINPUT=m # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_SERIAL_NONSTANDARD=y # CONFIG_COMPUTONE is not set CONFIG_ROCKETPORT=m # CONFIG_CYCLADES is not set # CONFIG_DIGIEPCA is not set # CONFIG_DIGI is not set # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set # CONFIG_ISI is not set # CONFIG_SYNCLINK is not set # CONFIG_SYNCLINKMP is not set CONFIG_N_HDLC=m # CONFIG_RISCOM8 is not set # CONFIG_SPECIALIX is not set # CONFIG_SX is not set # CONFIG_RIO is not set CONFIG_STALDRV=y # CONFIG_STALLION is not set # CONFIG_ISTALLION is not set # # Serial drivers # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CS=m # CONFIG_SERIAL_8250_ACPI is not set CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_MULTIPORT=y CONFIG_SERIAL_8250_RSA=y # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_PRINTER=m CONFIG_LP_CONSOLE=y CONFIG_PPDEV=m CONFIG_TIPAR=m # # IPMI # CONFIG_IPMI_HANDLER=m # CONFIG_IPMI_PANIC_EVENT is not set CONFIG_IPMI_DEVICE_INTERFACE=m CONFIG_IPMI_SI=m CONFIG_IPMI_WATCHDOG=m CONFIG_IPMI_POWEROFF=m # # Watchdog Cards # CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # CONFIG_SOFT_WATCHDOG=m CONFIG_ACQUIRE_WDT=m CONFIG_ADVANTECH_WDT=m CONFIG_ALIM1535_WDT=m CONFIG_ALIM7101_WDT=m CONFIG_SC520_WDT=m CONFIG_EUROTECH_WDT=m CONFIG_IB700_WDT=m CONFIG_WAFER_WDT=m CONFIG_I8XX_TCO=m CONFIG_SC1200_WDT=m # CONFIG_SCx200_WDT is not set # CONFIG_60XX_WDT is not set CONFIG_CPU5_WDT=m CONFIG_W83627HF_WDT=m CONFIG_W83877F_WDT=m CONFIG_MACHZ_WDT=m # # PCI-based Watchdog Cards # CONFIG_PCIPCWATCHDOG=m CONFIG_WDTPCI=m CONFIG_WDT_501_PCI=y # # USB-based Watchdog Cards # CONFIG_USBPCWATCHDOG=m CONFIG_HW_RANDOM=m # CONFIG_NVRAM is not set CONFIG_RTC=y CONFIG_DTLK=m CONFIG_R3964=m # CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set CONFIG_AGP=y CONFIG_AGP_AMD64=y CONFIG_AGP_INTEL_MCH=y CONFIG_DRM=y CONFIG_DRM_TDFX=m CONFIG_DRM_R128=m CONFIG_DRM_RADEON=m CONFIG_DRM_SIS=m # # PCMCIA character devices # CONFIG_SYNCLINK_CS=m CONFIG_MWAVE=m # CONFIG_RAW_DRIVER is not set # CONFIG_HPET is not set CONFIG_HANGCHECK_TIMER=m # # I2C support # CONFIG_I2C=m CONFIG_I2C_CHARDEV=m # # I2C Algorithms # CONFIG_I2C_ALGOBIT=m CONFIG_I2C_ALGOPCF=m CONFIG_I2C_ALGOPCA=m # # I2C Hardware Bus support # CONFIG_I2C_ALI1535=m CONFIG_I2C_ALI1563=m CONFIG_I2C_ALI15X3=m CONFIG_I2C_AMD756=m CONFIG_I2C_AMD756_S4882=m CONFIG_I2C_AMD8111=m CONFIG_I2C_I801=m CONFIG_I2C_I810=m CONFIG_I2C_ISA=m CONFIG_I2C_NFORCE2=m # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set CONFIG_I2C_PROSAVAGE=m CONFIG_I2C_SAVAGE4=m # CONFIG_SCx200_ACB is not set CONFIG_I2C_SIS5595=m CONFIG_I2C_SIS630=m CONFIG_I2C_SIS96X=m CONFIG_I2C_STUB=m CONFIG_I2C_VIA=m CONFIG_I2C_VIAPRO=m CONFIG_I2C_VOODOO3=m CONFIG_I2C_PCA_ISA=m # # Hardware Sensors Chip support # CONFIG_I2C_SENSOR=m CONFIG_SENSORS_ADM1021=m CONFIG_SENSORS_ADM1025=m CONFIG_SENSORS_ADM1031=m CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_DS1621=m CONFIG_SENSORS_FSCHER=m CONFIG_SENSORS_GL518SM=m CONFIG_SENSORS_IT87=m CONFIG_SENSORS_LM63=m CONFIG_SENSORS_LM75=m CONFIG_SENSORS_LM77=m CONFIG_SENSORS_LM78=m CONFIG_SENSORS_LM80=m CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM85=m CONFIG_SENSORS_LM87=m CONFIG_SENSORS_LM90=m CONFIG_SENSORS_MAX1619=m CONFIG_SENSORS_PC87360=m CONFIG_SENSORS_SMSC47M1=m CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_W83781D=m CONFIG_SENSORS_W83L785TS=m CONFIG_SENSORS_W83627HF=m # # Other I2C Chip support # CONFIG_SENSORS_EEPROM=m CONFIG_SENSORS_PCF8574=m CONFIG_SENSORS_PCF8591=m CONFIG_SENSORS_RTC8564=m # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # # CONFIG_IBM_ASM is not set # # Multimedia devices # CONFIG_VIDEO_DEV=m # # Video For Linux # # # Video Adapters # CONFIG_VIDEO_BT848=m CONFIG_VIDEO_BWQCAM=m CONFIG_VIDEO_CQCAM=m CONFIG_VIDEO_W9966=m CONFIG_VIDEO_CPIA=m CONFIG_VIDEO_CPIA_PP=m CONFIG_VIDEO_CPIA_USB=m CONFIG_VIDEO_SAA5246A=m CONFIG_VIDEO_SAA5249=m CONFIG_TUNER_3036=m CONFIG_VIDEO_STRADIS=m CONFIG_VIDEO_ZORAN=m CONFIG_VIDEO_ZORAN_BUZ=m CONFIG_VIDEO_ZORAN_DC10=m CONFIG_VIDEO_ZORAN_DC30=m CONFIG_VIDEO_ZORAN_LML33=m CONFIG_VIDEO_ZORAN_LML33R10=m CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_MXB=m CONFIG_VIDEO_DPC=m CONFIG_VIDEO_HEXIUM_ORION=m CONFIG_VIDEO_HEXIUM_GEMINI=m CONFIG_VIDEO_CX88=m CONFIG_VIDEO_OVCAMCHIP=m # # Radio Adapters # CONFIG_RADIO_GEMTEK_PCI=m CONFIG_RADIO_MAXIRADIO=m CONFIG_RADIO_MAESTRO=m # # Digital Video Broadcasting Devices # CONFIG_DVB=y CONFIG_DVB_CORE=m # # DVB-S (satellite) frontends # CONFIG_DVB_STV0299=m CONFIG_DVB_CX24110=m CONFIG_DVB_GRUNDIG_29504_491=m CONFIG_DVB_MT312=m CONFIG_DVB_VES1X93=m # # DVB-T (terrestrial) frontends # # CONFIG_DVB_SP887X is not set # CONFIG_DVB_ALPS_TDLB7 is not set CONFIG_DVB_ALPS_TDMB7=m CONFIG_DVB_CX22702=m CONFIG_DVB_GRUNDIG_29504_401=m # CONFIG_DVB_TDA1004X is not set CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m CONFIG_DVB_DIB3000MB=m # # DVB-C (cable) frontends # CONFIG_DVB_ATMEL_AT76C651=m CONFIG_DVB_VES1820=m # # Misc. Frontend Modules # CONFIG_DVB_TWINHAN_DST=m # # Supported SAA7146 based PCI Adapters # CONFIG_DVB_AV7110=m CONFIG_DVB_AV7110_OSD=y CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m CONFIG_DVB_BUDGET_PATCH=m # # Supported USB Adapters # CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m CONFIG_DVB_DIBUSB=m CONFIG_DVB_CINERGYT2=m # CONFIG_DVB_CINERGYT2_TUNING is not set # # Supported FlexCopII (B2C2) Adapters # CONFIG_DVB_B2C2_SKYSTAR=m # # Supported BT878 Adapters # CONFIG_DVB_BT8XX=m CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_VIDEO_VIDEOBUF=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_BTCX=m CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y CONFIG_FB_MODE_HELPERS=y CONFIG_FB_TILEBLITTING=y CONFIG_FB_CIRRUS=m # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set CONFIG_FB_VGA16=m CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FB_HGA=m CONFIG_FB_HGA_ACCEL=y CONFIG_FB_RIVA=m # CONFIG_FB_RIVA_I2C is not set # CONFIG_FB_RIVA_DEBUG is not set CONFIG_FB_MATROX=m CONFIG_FB_MATROX_MILLENIUM=y CONFIG_FB_MATROX_MYSTIQUE=y CONFIG_FB_MATROX_G450=y CONFIG_FB_MATROX_G100=y CONFIG_FB_MATROX_I2C=m CONFIG_FB_MATROX_MAVEN=m CONFIG_FB_MATROX_MULTIHEAD=y # CONFIG_FB_RADEON_OLD is not set CONFIG_FB_RADEON=m CONFIG_FB_RADEON_I2C=y # CONFIG_FB_RADEON_DEBUG is not set CONFIG_FB_ATY128=m CONFIG_FB_ATY=m CONFIG_FB_ATY_CT=y # CONFIG_FB_ATY_GENERIC_LCD is not set # CONFIG_FB_ATY_XL_INIT is not set CONFIG_FB_ATY_GX=y CONFIG_FB_SAVAGE=m CONFIG_FB_SAVAGE_I2C=m CONFIG_FB_SAVAGE_ACCEL=m # CONFIG_FB_SIS is not set CONFIG_FB_NEOMAGIC=m CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m CONFIG_FB_3DFX_ACCEL=y CONFIG_FB_VOODOO1=m CONFIG_FB_TRIDENT=m CONFIG_FB_TRIDENT_ACCEL=y # CONFIG_FB_VIRTUAL is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # # Logo configuration # CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # # Sound # CONFIG_SOUND=m # # Advanced Linux Sound Architecture # CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_BIT32_EMUL=m CONFIG_SND_RTCTIMER=m # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # CONFIG_SND_MPU401_UART=m CONFIG_SND_OPL3_LIB=m CONFIG_SND_VX_LIB=m CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m # CONFIG_SND_SERIAL_U16550 is not set CONFIG_SND_MPU401=m # # PCI devices # CONFIG_SND_AC97_CODEC=m CONFIG_SND_ALI5451=m CONFIG_SND_ATIIXP=m CONFIG_SND_ATIIXP_MODEM=m CONFIG_SND_AU8810=m CONFIG_SND_AU8820=m CONFIG_SND_AU8830=m CONFIG_SND_AZT3328=m CONFIG_SND_BT87X=m # CONFIG_SND_BT87X_OVERCLOCK is not set CONFIG_SND_CS46XX=m CONFIG_SND_CS46XX_NEW_DSP=y CONFIG_SND_CS4281=m CONFIG_SND_EMU10K1=m CONFIG_SND_KORG1212=m CONFIG_SND_MIXART=m CONFIG_SND_NM256=m CONFIG_SND_RME32=m CONFIG_SND_RME96=m CONFIG_SND_RME9652=m CONFIG_SND_HDSP=m CONFIG_SND_TRIDENT=m CONFIG_SND_YMFPCI=m CONFIG_SND_ALS4000=m CONFIG_SND_CMIPCI=m CONFIG_SND_ENS1370=m CONFIG_SND_ENS1371=m CONFIG_SND_ES1938=m CONFIG_SND_ES1968=m CONFIG_SND_MAESTRO3=m CONFIG_SND_FM801=m CONFIG_SND_FM801_TEA575X=m CONFIG_SND_ICE1712=m CONFIG_SND_ICE1724=m CONFIG_SND_INTEL8X0=m CONFIG_SND_INTEL8X0M=m CONFIG_SND_SONICVIBES=m CONFIG_SND_VIA82XX=m CONFIG_SND_VX222=m # # USB devices # CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_USX2Y=m # # PCMCIA devices # # # Open Sound System # # CONFIG_SOUND_PRIME is not set # # USB support # CONFIG_USB=y # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y # CONFIG_USB_BANDWIDTH is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_SPLIT_ISO=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_OHCI_HCD=m CONFIG_USB_UHCI_HCD=m # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # # USB Bluetooth TTY can only be used with disabled Bluetooth subsystem # CONFIG_USB_MIDI=m CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_RW_DETECT=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=y # # USB Input Devices # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y CONFIG_HID_FF=y CONFIG_HID_PID=y CONFIG_LOGITECH_FF=y CONFIG_THRUSTMASTER_FF=y CONFIG_USB_HIDDEV=y CONFIG_USB_AIPTEK=m CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m CONFIG_USB_POWERMATE=m CONFIG_USB_MTOUCH=m CONFIG_USB_EGALAX=m CONFIG_USB_XPAD=m CONFIG_USB_ATI_REMOTE=m # # USB Imaging devices # CONFIG_USB_MDC800=m CONFIG_USB_MICROTEK=m CONFIG_USB_HPUSBSCSI=m # # USB Multimedia devices # CONFIG_USB_DABUSB=m CONFIG_USB_VICAM=m CONFIG_USB_DSBR=m CONFIG_USB_IBMCAM=m CONFIG_USB_KONICAWC=m CONFIG_USB_OV511=m CONFIG_USB_SE401=m CONFIG_USB_SN9C102=m CONFIG_USB_STV680=m CONFIG_USB_W9968CF=m # # USB Network Adapters # CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_USBNET=m # # USB Host-to-Host Cables # CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_GENESYS=y CONFIG_USB_NET1080=y CONFIG_USB_PL2301=y CONFIG_USB_KC2190=y # # Intelligent USB Devices/Gadgets # CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_ZAURUS=y CONFIG_USB_CDCETHER=y # # USB Network Adapters # CONFIG_USB_AX8817X=y # # USB port drivers # CONFIG_USB_USS720=m # # USB Serial Converter support # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_CYPRESS_M8=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m # CONFIG_USB_SERIAL_IPW is not set CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_EZUSB=y # # USB Miscellaneous drivers # CONFIG_USB_EMI62=m # CONFIG_USB_EMI26 is not set CONFIG_USB_TIGL=m CONFIG_USB_AUERSWALD=m CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_LED=m # CONFIG_USB_CYTHERM is not set CONFIG_USB_PHIDGETKIT=m CONFIG_USB_PHIDGETSERVO=m CONFIG_USB_TEST=m # # USB ATM/DSL drivers # CONFIG_USB_ATM=m CONFIG_USB_SPEEDTOUCH=m # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # Firmware Drivers # # CONFIG_EDD is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT3_FS=m CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y CONFIG_JBD=m # CONFIG_JBD_DEBUG is not set CONFIG_FS_MBCACHE=y # CONFIG_REISER4_FS is not set CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_REISERFS_FS_SECURITY=y CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_FS_POSIX_ACL=y CONFIG_XFS_FS=m # CONFIG_XFS_RT is not set CONFIG_XFS_QUOTA=y CONFIG_XFS_SECURITY=y CONFIG_XFS_POSIX_ACL=y CONFIG_MINIX_FS=m CONFIG_ROMFS_FS=m CONFIG_QUOTA=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_DNOTIFY=y CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m # # Caches # CONFIG_FSCACHE=m CONFIG_CACHEFS=m # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=y CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="ascii" # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y CONFIG_DEVPTS_FS_SECURITY=y CONFIG_TMPFS=y CONFIG_TMPFS_XATTR=y CONFIG_TMPFS_SECURITY=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set CONFIG_AFFS_FS=m CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m CONFIG_BEFS_FS=m # CONFIG_BEFS_DEBUG is not set CONFIG_BFS_FS=m CONFIG_EFS_FS=m # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=m CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_NAND=y # CONFIG_JFFS2_FS_NOR_ECC is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y # CONFIG_JFFS2_RUBIN is not set CONFIG_CRAMFS=m CONFIG_VXFS_FS=m # CONFIG_HPFS_FS is not set CONFIG_QNX4FS_FS=m # CONFIG_QNX4FS_RW is not set CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set # # Network File Systems # CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFS_V4=y CONFIG_NFS_DIRECTIO=y CONFIG_NFSD=m CONFIG_NFSD_V3=y CONFIG_NFSD_V4=y CONFIG_NFSD_TCP=y CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=m CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_RPCSEC_GSS_KRB5=m CONFIG_RPCSEC_GSS_SPKM3=m CONFIG_SMB_FS=m # CONFIG_SMB_NLS_DEFAULT is not set CONFIG_CIFS=m # CONFIG_CIFS_STATS is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y CONFIG_NCPFS_IOCTL_LOCKING=y CONFIG_NCPFS_STRONG=y CONFIG_NCPFS_NFS_NS=y CONFIG_NCPFS_OS2_NS=y CONFIG_NCPFS_SMALLDOS=y CONFIG_NCPFS_NLS=y CONFIG_NCPFS_EXTRAS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set CONFIG_OSF_PARTITION=y # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y # CONFIG_LDM_PARTITION is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_EFI_PARTITION=y # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m # # Profiling support # CONFIG_PROFILING=y CONFIG_OPROFILE=m # # Kernel hacking # CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_INFO=y # CONFIG_CHECKING is not set CONFIG_INIT_DEBUG=y # CONFIG_IOMMU_DEBUG is not set # CONFIG_KPROBES is not set # CONFIG_KGDB is not set # # Security options # # CONFIG_KEYS is not set CONFIG_SECURITY=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_CAPABILITIES=y # CONFIG_SECURITY_ROOTPLUG is not set CONFIG_SECURITY_SECLVL=m CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y # CONFIG_SECURITY_SELINUX_MLS is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m # CONFIG_CRYPTO_TEST is not set # # Library routines # CONFIG_CRC_CCITT=m CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-dmesg.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-dmesg.txt" Bootdata ok (command line is ro root=/dev/VolGroup00/LogVol00) Linux version 2.6.10-rc2-mm2 (rich@meelo.int.phekda.gotadsl.co.uk) (gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)) #2 Sun Nov 21 10:45:48 GMT 2004 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009f800 (usable) BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved) BIOS-e820: 00000000000d8000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000001ff70000 (usable) BIOS-e820: 000000001ff70000 - 000000001ff7a000 (ACPI data) BIOS-e820: 000000001ff7a000 - 000000001ff80000 (ACPI NVS) BIOS-e820: 000000001ff80000 - 0000000020000000 (reserved) BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved) No mptable found. On node 0 totalpages: 130928 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 126832 pages, LIFO batch:16 HighMem zone: 0 pages, LIFO batch:1 ACPI: RSDP (v000 PTLTD ) @ 0x00000000000f6a60 ACPI: RSDT (v001 PTLTD RSDT 0x06040000 LTP 0x00000000) @ 0x000000001ff73fbd ACPI: FADT (v002 AMDK8 PTLTW 0x06040000 PTL_ 0x000f4240) @ 0x000000001ff79e35 ACPI: SSDT (v001 PTLTD POWERNOW 0x06040000 LTP 0x00000001) @ 0x000000001ff79eb9 ACPI: MADT (v001 PTLTD APIC 0x06040000 LTP 0x00000000) @ 0x000000001ff79fb0 ACPI: DSDT (v001 VIA PTL_ACPI 0x06040000 MSFT 0x0100000e) @ 0x0000000000000000 ACPI: Local APIC address 0xfee00000 ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled) Processor #0 15:4 APIC version 16 ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1]) ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0]) IOAPIC[0]: apic_id 1, version 3, address 0xfec00000, GSI 0-23 ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge) ACPI: IRQ0 used by override. ACPI: IRQ2 used by override. ACPI: IRQ9 used by override. Setting APIC routing to flat Using ACPI (MADT) for SMP configuration information Checking aperture... CPU 0: aperture @ d0000000 size 256 MB Built 1 zonelists Initializing CPU#0 Kernel command line: ro root=/dev/VolGroup00/LogVol00 console=tty0 PID hash table entries: 2048 (order: 11, 65536 bytes) time.c: Using 1.193182 MHz PIT timer. time.c: Detected 2201.337 MHz processor. Console: colour VGA+ 80x25 Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes) Inode-cache hash table entries: 65536 (order: 7, 524288 bytes) Memory: 508116k/523712k available (2660k kernel code, 14824k reserved, 1213k data, 184k init) Calibrating delay loop... 4341.76 BogoMIPS (lpj=2170880) Security Framework v1.0.0 initialized SELinux: Initializing. SELinux: Starting in permissive mode selinux_register_security: Registering secondary module capability Capability LSM initialized as secondary Mount-cache hash table entries: 256 (order: 0, 4096 bytes) CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line) CPU: L2 Cache: 1024K (64 bytes/line) CPU: AMD Athlon(tm) 64 Processor 3400+ stepping 0a Using local APIC NMI watchdog using perfctr0 Using local APIC timer interrupts. Detected 12.507 MHz APIC timer. checking if image is initramfs... it is NET: Registered protocol family 16 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20041105 ACPI: Interpreter enabled ACPI: Using IOAPIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: PCI Interrupt Link [ALKA] (IRQs 16 17 18 19 20 21 22 23) *10, disabled. ACPI: PCI Interrupt Link [ALKB] (IRQs 16 17 18 19 20 21 22 23) *10, disabled. ACPI: PCI Interrupt Link [ALKC] (IRQs 22) *11, disabled. ACPI: PCI Interrupt Link [ALKD] (IRQs 21) *11, disabled. ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 7 9 12 14 15) *10 ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 7 *10 12 14 15) ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 7 *11 12 14 15) ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 7 9 10 *11 12 14 15) ACPI: Embedded Controller [EC] (gpe 11) Linux Plug and Play Support v0.97 (c) Adam Belay usbcore: registered new driver usbfs usbcore: registered new driver hub PCI: Using ACPI for IRQ routing ** PCI interrupts are no longer routed automatically. If this ** causes a device to stop working, it is probably because the ** driver failed to call pci_enable_device(). As a temporary ** workaround, the "pci=routeirq" argument restores the old ** behavior. If this argument makes the device work again, ** please email the output of "lspci" to bjorn.helgaas@hp.com ** so I can fix the driver. agpgart: Detected AGP bridge 0 agpgart: Maximum main memory to use for agp memory: 439M agpgart: AGP aperture is 256M @ 0xd0000000 PCI-DMA: Disabling IOMMU. IA32 emulation $Id: sys_ia32.c,v 1.32 2002/03/24 13:02:28 ak Exp $ audit: initializing netlink socket (disabled) audit(1101035256.358:0): initialized Total HugeTLB memory allocated, 0 VFS: Disk quotas dquot_6.5.1 Dquot-cache hash table entries: 512 (order 0, 4096 bytes) SELinux: Registering netfilter hooks Initializing Cryptographic API pci_hotplug: PCI Hot Plug PCI Core version: 0.5 vesafb: probe of vesafb0 failed with error -6 ACPI: Thermal Zone [THRS] (41 C) ACPI: Thermal Zone [THRC] (52 C) Real Time Clock Driver v1.12 Linux agpgart interface v0.100 (c) Dave Jones [drm] Initialized drm 1.0.0 20040925 ACPI: PS/2 Keyboard Controller [PS2K] at I/O 0x60, 0x64, irq 1 ACPI: PS/2 Mouse Controller [PS2M] at irq 12 i8042.c: Detected active multiplexing controller, rev 1.1. serio: i8042 AUX0 port at 0x60,0x64 irq 12 serio: i8042 AUX1 port at 0x60,0x64 irq 12 serio: i8042 AUX2 port at 0x60,0x64 irq 12 serio: i8042 AUX3 port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing enabled ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A io scheduler noop registered io scheduler anticipatory registered io scheduler deadline registered io scheduler cfq registered RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize divert: not allocating divert_blk for non-ethernet device lo Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx VP_IDE: IDE controller at PCI slot 0000:00:11.1 ACPI: PCI interrupt 0000:00:11.1[A]: no GSI - using IRQ 0 VP_IDE: chipset revision 6 VP_IDE: not 100% native mode: will probe irqs later VP_IDE: VIA vt8235 (rev 00) IDE UDMA133 controller on pci0000:00:11.1 ide0: BM-DMA at 0x1c80-0x1c87, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0x1c88-0x1c8f, BIOS settings: hdc:DMA, hdd:pio Probing IDE interface ide0... hda: IC25N060ATMR04-0, ATA DISK drive elevator: using anticipatory as default io scheduler ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 Probing IDE interface ide1... hdc: TSSTcorpCD/DVDW TS-L532A, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 Probing IDE interface ide2... ide2: Wait for ready failed before probe ! Probing IDE interface ide3... ide3: Wait for ready failed before probe ! Probing IDE interface ide4... ide4: Wait for ready failed before probe ! Probing IDE interface ide5... ide5: Wait for ready failed before probe ! hda: max request size: 1024KiB hda: 117210240 sectors (60011 MB) w/7884KiB Cache, CHS=16383/255/63, UDMA(100) hda: cache flushes supported hda: hda1 hda2 hdc: ATAPI 24X DVD-ROM DVD-R CD-R/RW drive, 2048kB Cache, UDMA(33) Uniform CD-ROM driver Revision: 3.20 ide-floppy driver 0.99.newide usbcore: registered new driver hiddev usbcore: registered new driver usbhid drivers/usb/input/hid-core.c: v2.0:USB HID core driver mice: PS/2 mouse device common for all mice input: AT Translated Set 2 keyboard on isa0060/serio0 Synaptics Touchpad, model: 1 Firmware: 5.8 180 degree mounted touchpad Sensor: 18 new absolute packet format Touchpad has extended capability bits -> 4 multi-buttons, i.e. besides standard buttons -> multifinger detection -> palm detection input: SynPS/2 Synaptics TouchPad on isa0060/serio4 md: md driver 0.90.1 MAX_MD_DEVS=256, MD_SB_DISKS=27 NET: Registered protocol family 2 IP: routing cache hash table of 512 buckets, 28Kbytes TCP: Hash tables configured (established 32768 bind 4681) Initializing IPsec netlink socket NET: Registered protocol family 1 NET: Registered protocol family 17 powernow-k8: Found 1 AMD Athlon 64 / Opteron processors (version 1.00.09e) powernow-k8: 0 : fid 0xe (2200 MHz), vid 0x2 (1500 mV) powernow-k8: 1 : fid 0xc (2000 MHz), vid 0x6 (1400 mV) powernow-k8: 2 : fid 0xa (1800 MHz), vid 0xa (1300 mV) powernow-k8: 3 : fid 0x0 (800 MHz), vid 0x12 (1100 mV) cpu_init done, current fid 0xe, vid 0x0 powernow-k8: ph2 null fid transition 0xe ACPI: (supports S0 S3 S4 S5) ACPI wakeup devices: PCI0 Z007 GLAN LID SLPB Freeing unused kernel memory: 184k freed device-mapper: 4.3.0-ioctl (2004-09-30) initialised: dm-devel@redhat.com cdrom: open failed. kjournald starting. Commit interval 5 seconds EXT3-fs: mounted filesystem with ordered data mode. security: 3 users, 4 roles, 280 types, 16 bools security: 53 classes, 5494 rules SELinux: Completing initialization. SELinux: Setting up existing superblocks. SELinux: initialized (dev dm-0, type ext3), uses xattr SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs SELinux: initialized (dev selinuxfs, type selinuxfs), uses genfs_contexts SELinux: initialized (dev mqueue, type mqueue), not configured for labeling SELinux: initialized (dev hugetlbfs, type hugetlbfs), not configured for labeling SELinux: initialized (dev devpts, type devpts), uses transition SIDs SELinux: initialized (dev eventpollfs, type eventpollfs), uses genfs_contexts SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs SELinux: initialized (dev futexfs, type futexfs), uses genfs_contexts SELinux: initialized (dev pipefs, type pipefs), uses task SIDs SELinux: initialized (dev sockfs, type sockfs), uses task SIDs SELinux: initialized (dev proc, type proc), uses genfs_contexts SELinux: initialized (dev bdev, type bdev), uses genfs_contexts SELinux: initialized (dev rootfs, type rootfs), uses genfs_contexts SELinux: initialized (dev sysfs, type sysfs), uses genfs_contexts SELinux: initialized (dev usbfs, type usbfs), uses genfs_contexts inserting floppy driver for 2.6.10-rc2-mm2 r8169 Gigabit Ethernet driver 1.6LK loaded ACPI: PCI interrupt 0000:00:0c.0[A] -> GSI 22 (level, low) -> IRQ 169 r8169: PCI device 0000:00:0c.0: unknown chip version, assuming RTL8169 r8169: NAPI enabled divert: allocating divert_blk for eth0 eth0: Identified chip type is 'RTL8169'. eth0: RTL8169 at 0xffffc20000022400, 00:0a:e4:5f:3e:85, IRQ 169 via82xx: Assuming DXS channels with 48k fixed sample rate. Please try dxs_support=1 or dxs_support=4 option and report if it works on your machine. ACPI: PCI interrupt 0000:00:11.5[C] -> GSI 22 (level, low) -> IRQ 169 PCI: Via IRQ fixup for 0000:00:11.5, from 11 to 9 PCI: Setting latency timer of device 0000:00:11.5 to 64 ACPI: PCI interrupt 0000:00:10.3[D] -> GSI 21 (level, low) -> IRQ 177 ehci_hcd 0000:00:10.3: EHCI Host Controller ehci_hcd 0000:00:10.3: irq 177, pci mem 0xc0006800 ehci_hcd 0000:00:10.3: new USB bus registered, assigned bus number 1 ehci_hcd 0000:00:10.3: USB 2.0 initialized, EHCI 1.00, driver 26 Oct 2004 hub 1-0:1.0: USB hub found hub 1-0:1.0: 6 ports detected USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:10.0[A] -> GSI 21 (level, low) -> IRQ 177 PCI: Via IRQ fixup for 0000:00:10.0, from 0 to 1 uhci_hcd 0000:00:10.0: UHCI Host Controller uhci_hcd 0000:00:10.0: irq 177, io base 0x1c20 uhci_hcd 0000:00:10.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:10.1[B] -> GSI 21 (level, low) -> IRQ 177 PCI: Via IRQ fixup for 0000:00:10.1, from 0 to 1 uhci_hcd 0000:00:10.1: UHCI Host Controller uhci_hcd 0000:00:10.1: irq 177, io base 0x1c40 uhci_hcd 0000:00:10.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:10.2[C] -> GSI 21 (level, low) -> IRQ 177 PCI: Via IRQ fixup for 0000:00:10.2, from 0 to 1 uhci_hcd 0000:00:10.2: UHCI Host Controller uhci_hcd 0000:00:10.2: irq 177, io base 0x1c60 uhci_hcd 0000:00:10.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected Linux Kernel Card Services options: [pci] [cardbus] [pm] ACPI: PCI interrupt 0000:00:0b.0[A] -> GSI 17 (level, low) -> IRQ 185 Yenta: CardBus bridge found at 0000:00:0b.0 [1025:006e] Yenta: ISA IRQ mask 0x0cf8, PCI irq 185 Socket status: 30000006 PCI: Enabling device 0000:00:0b.1 (0000 -> 0002) ACPI: PCI interrupt 0000:00:0b.1[B] -> GSI 18 (level, low) -> IRQ 193 Yenta: CardBus bridge found at 0000:00:0b.1 [1025:006e] Yenta: ISA IRQ mask 0x0cf8, PCI irq 193 Socket status: 30000006 ohci1394: $Rev: 1223 $ Ben Collins ACPI: PCI interrupt 0000:00:0b.2[C] -> GSI 19 (level, low) -> IRQ 201 ohci1394: fw-host0: OHCI-1394 1.1 (PCI): IRQ=[201] MMIO=[c0005800-c0005fff] Max Packet=[2048] md: Autodetecting RAID arrays. md: autorun ... md: ... autorun DONE. ACPI: AC Adapter [AC] (on-line) ACPI: Battery Slot [BAT0] (battery present) ACPI: Power Button (FF) [PWRF] ACPI: Lid Switch [LID] ACPI: Sleep Button (CM) [SLPB] ibm_acpi: ec object not found ACPI: Video Device [VGA] (multi-head: yes rom: no post: no) ieee1394: Host added: ID:BUS[0-00:1023] GUID[000ae40444105af8] EXT3 FS on dm-0, internal journal cdrom: open failed. kjournald starting. Commit interval 5 seconds EXT3 FS on hda1, internal journal EXT3-fs: mounted filesystem with ordered data mode. SELinux: initialized (dev hda1, type ext3), uses xattr SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs Adding 1015800k swap on /dev/VolGroup00/LogVol01. Priority:-1 extents:1 SELinux: initialized (dev binfmt_misc, type binfmt_misc), uses genfs_contexts parport_pc: Ignoring new-style parameters in presence of obsolete ones parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE] parport0: irq 7 detected ip_tables: (C) 2000-2002 Netfilter core team ip_conntrack version 2.1 (2045 buckets, 16360 max) - 504 bytes per conntrack r8169: eth0: link up SELinux: initialized (dev rpc_pipefs, type rpc_pipefs), uses genfs_contexts parport_pc: Ignoring new-style parameters in presence of obsolete ones parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE] parport0: irq 7 detected lp0: using parport0 (polling). lp0: console ready NET: Registered protocol family 10 Disabled Privacy Extensions on device ffffffff80484f80(lo) IPv6 over IPv4 tunneling driver divert: not allocating divert_blk for non-ethernet device sit0 eth0: no IPv6 routers present --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-ethtool-d.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-ethtool-d.txt" RealTek RTL-8169 registers: ------------------------------ 0x00: MAC Address 00:0a:e4:5f:3e:85 0x08: Multicast Address Filter 0x80008000 0x42000000 0x10: Dump Tally Counter Command 0x3fefff80 0xefeed7fe 0x20: Tx Normal Priority Ring Addr 0x1ad24000 0x00000000 0x28: Tx High Priority Ring Addr 0xbf7b3f00 0xfffbffef 0x30: Flash memory read/write 0x00000000 0x34: Early Rx Byte Count 0 0x36: Early Rx Status 0x0c ERxGood ERxBad 0x37: Command 0x0c Rx on, Tx on 0x3C: Interrupt Mask 0x807f SERR RxFIFO LinkChg RxNoBuf TxErr TxOK RxErr RxOK 0x3E: Interrupt Status 0x0000 0x40: Tx Configuration 0x13000600 0x44: Rx Configuration 0x0000e60e 0x48: Timer count 0x974c28c4 0x4C: Missed packet counter 0x000000 0x50: EEPROM Command 0x00 0x51: Config 0 0x05 0x52: Config 1 0x0d 0x53: Config 2 0x10 0x54: Config 3 0xa1 0x55: Config 4 0x80 0x56: Config 5 0x03 0x58: Timer interrupt 0x00000000 0x5C: Multiple Interrupt Select 0x0000 0x60: PHY access 0x00001200 0x64: TBI control and status 0x00000000 0x68: TBI Autonegotiation advertisement (ANAR) 0x0000 0x6A: TBI Link partner ability (LPAR) 0x0000 0x6C: PHY status 0x0b 0x84: PM wakeup frame 0 0xaeffff77 0x6fddef5f 0x8C: PM wakeup frame 1 0xf3fbbf77 0xf7f69eff 0x94: PM wakeup frame 2 (low) 0xcbeea7b3 0x7fbddfff 0x9C: PM wakeup frame 2 (high) 0xff7dffe3 0xa78bfb9b 0xA4: PM wakeup frame 3 (low) 0x7afebfbe 0xf6bfffbf 0xAC: PM wakeup frame 3 (high) 0x73eff79d 0x75ff8fbb 0xB4: PM wakeup frame 4 (low) 0xda2d96fd 0xff2fdb3b 0xBC: PM wakeup frame 4 (high) 0xdfbbffdf 0xbd75fdf7 0xC4: Wakeup frame 0 CRC 0xdff7 0xC6: Wakeup frame 1 CRC 0xcdf7 0xC8: Wakeup frame 2 CRC 0xeff1 0xCA: Wakeup frame 3 CRC 0xf58c 0xCC: Wakeup frame 4 CRC 0xdbf6 0xDA: RX packet maximum size 0x0800 0xE0: C+ Command 0x2028 RX checksumming PCI Multiple RW 0xE2: Interrupt Mitigation 0x0000 TxTimer: 0 TxPackets: 0 RxTimer: 0 RxPackets: 0 0xE4: Rx Ring Addr 0x1ad08000 0x00000000 0xEC: Early Tx threshold 0x3f --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-ethtool-i.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-ethtool-i.txt" driver: r8169 version: 1.6LK firmware-version: bus-info: 0000:00:0c.0 --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-ifconfig.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-ifconfig.txt" eth0 Link encap:Ethernet HWaddr 00:0A:E4:5F:3E:85 inet addr:192.168.1.128 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20a:e4ff:fe5f:3e85/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:267 errors:0 dropped:0 overruns:0 frame:0 TX packets:315 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:62226 (60.7 KiB) TX bytes:184228 (179.9 KiB) Interrupt:169 Base address:0x2400 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:49 errors:0 dropped:0 overruns:0 frame:0 TX packets:49 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3620 (3.5 KiB) TX bytes:3620 (3.5 KiB) sit0 Link encap:IPv6-in-IPv4 NOARP MTU:1480 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-lspci-vvx.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-lspci-vvx.txt" 00:00.0 Host bridge: VIA Technologies, Inc.: Unknown device 0204 Subsystem: Acer Incorporated [ALI]: Unknown device 006e Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Capabilities: [50] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- Capabilities: [60] HyperTransport: Slave or Primary Interface !!! Possibly incomplete decoding Command: BaseUnitID=0 UnitCnt=3 MastHost- DefDir- Link Control 0: CFlE- CST- CFE- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- Reset- FastB2B- Capabilities: [80] Power Management version 2 Flags: PMEClk- DSI- D1+ D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00: 06 11 88 b1 07 00 30 02 00 00 04 06 00 00 01 00 10: 00 00 00 00 00 00 00 00 00 01 01 00 f0 00 20 22 20: 00 c1 f0 c1 00 e0 f0 ef 00 00 00 00 00 00 00 00 30: 00 00 00 00 80 00 00 00 00 00 00 00 00 00 0c 00 00:0a.0 Ethernet controller: Linksys, A Division of Cisco Systems [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01) Subsystem: AMBIT Microsystem Corp.: Unknown device 0305 Control: I/O+ Mem+ BusMaster- SpecCycle+ MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- Reset+ 16bInt+ PostWrite+ 16-bit legacy interface ports at 0001 00: 4c 10 8e ac 07 00 10 02 00 00 07 06 20 a8 82 00 10: 00 00 00 20 a0 00 00 02 00 02 05 b0 00 00 40 20 20: 00 f0 7f 20 00 00 80 20 00 f0 bf 20 00 44 00 00 30: fc 44 00 00 00 48 00 00 fc 48 00 00 0a 01 c0 05 40: 25 10 6e 00 01 00 00 00 00 00 00 00 00 00 00 00 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:0b.1 CardBus bridge: Texas Instruments PCI7420 CardBus Controller Subsystem: Acer Incorporated [ALI]: Unknown device 006e Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Reset+ 16bInt+ PostWrite+ 16-bit legacy interface ports at 0001 00: 4c 10 8e ac 07 00 10 02 00 00 07 06 20 a8 82 00 10: 00 10 00 20 a0 00 00 02 00 06 09 b0 00 00 c0 20 20: 00 f0 ff 20 00 00 00 21 00 f0 3f 21 00 4c 00 00 30: fc 4c 00 00 00 50 00 00 fc 50 00 00 0b 02 c0 05 40: 25 10 6e 00 01 00 00 00 00 00 00 00 00 00 00 00 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:0b.2 FireWire (IEEE 1394): Texas Instruments PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller (prog-if 10 [OHCI]) Subsystem: Acer Incorporated [ALI]: Unknown device 006e Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- 00: de 10 47 03 07 00 b0 02 a1 00 00 03 00 40 00 00 10: 00 00 00 c1 08 00 00 e0 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 25 10 6e 00 30: 00 00 00 00 60 00 00 00 00 00 00 00 0a 01 05 01 --------------010102020007060902080303 Content-Type: text/plain; name="2.6.10-rc2-mm2-proc-interrupts.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="2.6.10-rc2-mm2-proc-interrupts.txt" CPU0 0: 5528153 IO-APIC-edge timer 1: 4408 IO-APIC-edge i8042 8: 0 IO-APIC-edge rtc 9: 0 IO-APIC-level acpi 12: 51973 IO-APIC-edge i8042 14: 12697 IO-APIC-edge ide0 15: 49292 IO-APIC-edge ide1 169: 617 IO-APIC-level VIA8233, eth0 177: 0 IO-APIC-level ehci_hcd, uhci_hcd, uhci_hcd, uhci_hcd 185: 0 IO-APIC-level yenta 193: 0 IO-APIC-level yenta 201: 3 IO-APIC-level ohci1394 NMI: 159 LOC: 5527262 ERR: 0 MIS: 0 --------------010102020007060902080303 Content-Type: text/plain; name="ethtool-2-r8169.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ethtool-2-r8169.patch" diff -pur ethtool-2/ethtool.c ethtool-2.dev/ethtool.c --- ethtool-2/ethtool.c 2004-07-02 16:28:48.000000000 +0100 +++ ethtool-2.dev/ethtool.c 2004-11-21 10:09:13.000000000 +0000 @@ -996,6 +996,7 @@ static struct { } driver_list[] = { { "8139cp", realtek_dump_regs }, { "8139too", realtek_dump_regs }, + { "r8169", realtek_dump_regs }, { "de2104x", de2104x_dump_regs }, { "e1000", e1000_dump_regs }, { "natsemi", natsemi_dump_regs }, diff -pur ethtool-2/realtek.c ethtool-2.dev/realtek.c --- ethtool-2/realtek.c 2004-04-09 19:44:55.000000000 +0100 +++ ethtool-2.dev/realtek.c 2004-11-21 11:31:29.015997736 +0000 @@ -43,7 +43,7 @@ static struct chip_info { { "RTL-8100B/8139D", HW_REVID(1, 1, 1, 0, 1, 0, 1) }, { "RTL-8139C+", HW_REVID(1, 1, 1, 0, 1, 1, 0) }, { "RTL-8101", HW_REVID(1, 1, 1, 0, 1, 1, 1) }, - { "RTL-8169", HW_REVID(0, 0, 0, 0, 0, 0, 0) }, + { "RTL-8169", HW_REVID(0, 0, 1, 0, 0, 0, 0) }, { } }; --------------010102020007060902080303 Content-Type: text/plain; name="linux-2.6.10-rc2-r8139-ethtool-name.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="linux-2.6.10-rc2-r8139-ethtool-name.patch" --- linux-2.6.10-rc2/drivers/net/r8169.c.orig 2004-11-15 01:27:42.000000000 +0000 +++ linux-2.6.10-rc2/drivers/net/r8169.c 2004-11-21 10:22:13.152200712 +0000 @@ -506,7 +506,7 @@ static void rtl8169_get_drvinfo(struct n { struct rtl8169_private *tp = netdev_priv(dev); - strcpy(info->driver, RTL8169_DRIVER_NAME); + strcpy(info->driver, MODULENAME); strcpy(info->version, RTL8169_VERSION ); strcpy(info->bus_info, pci_name(tp->pci_dev)); } --------------010102020007060902080303-- From rich@phekda.gotadsl.co.uk Sun Nov 21 05:25:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 05:25:18 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALDPDRv018145 for ; Sun, 21 Nov 2004 05:25:13 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (82-133-64-131.dyn.gotadsl.co.uk [82.133.64.131]) by smtp.nildram.co.uk (Postfix) with ESMTP id 335A4254BAB for ; Sun, 21 Nov 2004 13:24:51 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id E56B336E; Sun, 21 Nov 2004 13:24:52 +0000 (GMT) Message-ID: <41A09724.4050905@phekda.gotadsl.co.uk> Date: Sun, 21 Nov 2004 13:24:52 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: Richard Dawe Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow References: <41A09541.5040405@phekda.gotadsl.co.uk> In-Reply-To: <41A09541.5040405@phekda.gotadsl.co.uk> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12058 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev Helo. Richard Dawe wrote: > Hello. > > I recently bought an Acer Aspire 1524WLMi, which is a laptop with an AMD > Athlon64 3400, a RealTek 8169 GigE chip and a bunch of other stuff. > > I'm currently not able to get more than about 30KB/sec throughput out of > the RealTek built-in network adapter. I get a lot of packet loss. The > packet loss seems to increase with packet size. Using ping I see that > around 1500 bytes packets very little data passes at all. > > I'm running Fedora Core 3. Here are the different kernels I've tried: [snip] > Sadly these all had the same terrible performance. [snip] Sorry, I forgot to mention the other networking hardware and what I'd tried there. * Draytek Vigor 2600 ADSL modem, which has a built-in 100Mbs switch. I can get reasonably close to 100Mbs throughput with this switch. I've had no problems with Netgear cards using the "tulip" driver with this switch. * I tried various bits of cable, including ones that I know work. No difference. * I tried a Netgear 100Mbs hub. No difference. I would try a cross-over cable to do point-to-point with my desktop PC, but I don't have any right now. I tried to flip the 8169 into half duplex using: ethtool -s eth0 duplex half but that segfaults and leaves the computer at 100% CPU and unresponsive. That's with ethtool-2 and ethtool-1.8-4 from FC3. The only choice then is to turn the computer off and leave it off for about 10 seconds. If you power it up too quickly, then eth0 will not come back up - perhaps the 8169 is still wedged? Bye, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek From cranium2003@yahoo.com Sun Nov 21 07:32:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 07:32:24 -0800 (PST) Received: from web41403.mail.yahoo.com (web41403.mail.yahoo.com [66.218.93.69]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iALFWIQr020508 for ; Sun, 21 Nov 2004 07:32:18 -0800 Received: (qmail 85912 invoked by uid 60001); 21 Nov 2004 15:31:54 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=S56cSMAhHj6w0bBzqUoKEPBSp2nboN+dw6A6n3sZnJflDjuKAex3C3WHGuCKDlh8//SpxdMUa3BuITCx7E6rmeRQlLxCx0icFyf4LI9jv5q7exfLF68bjDYBFEfhmA2ZhYPOtsxWu1KIGTF7gFx0akSaxZcc3oDjI2q8MhRc5kQ= ; Message-ID: <20041121153154.85910.qmail@web41403.mail.yahoo.com> Received: from [202.56.231.117] by web41403.mail.yahoo.com via HTTP; Sun, 21 Nov 2004 07:31:54 PST Date: Sun, 21 Nov 2004 07:31:54 -0800 (PST) From: cranium2003 Subject: how netfilter handles fragmented packets To: kernelnewbies@nl.linux.org Cc: linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12059 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev hello, In ip_output.c file ip_fragmet function when create a new fragmented packet given to output(skb) function. i want to know which function are actually called by output(skb)? Is that function ip_finish_output? if yes then fragmented packet has not gone through netfilter hooks specially NF_IP_LOCAL_OUT? so does that mean fragmented packets not travel through netfilter hooks? regards, cranium __________________________________ Do you Yahoo!? The all-new My Yahoo! - Get yours free! http://my.yahoo.com From cranium2003@yahoo.com Sun Nov 21 07:34:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 07:34:23 -0800 (PST) Received: from web41404.mail.yahoo.com (web41404.mail.yahoo.com [66.218.93.70]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iALFYJdq020877 for ; Sun, 21 Nov 2004 07:34:19 -0800 Received: (qmail 99559 invoked by uid 60001); 21 Nov 2004 15:33:55 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=tzmMuiYzBB3M2l5pYn7kSR7xWwvMt7ECyzqonghx9Y0/v1/4hSzEjrnhjkItLKSviyucx5R3U1T5pmRz7mmxKPUIxjhtByDetLrRzo57ji/JXd4leyfvgaGalPkcr11NoS65hd7a7lA77TnTPje2rcx9p8KJ6+dSaib+g+g4e20= ; Message-ID: <20041121153354.99557.qmail@web41404.mail.yahoo.com> Received: from [202.56.231.117] by web41404.mail.yahoo.com via HTTP; Sun, 21 Nov 2004 07:33:54 PST Date: Sun, 21 Nov 2004 07:33:54 -0800 (PST) From: cranium2003 Subject: netfilter query To: kernelnewbies@nl.linux.org Cc: linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12060 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev hello, how can i use packets in userspace using netfilter. i want some sample examples that manipulates on packet. Also,which headers are added when packet reaches to netfilter hook NF_IP_LOCAL_OUT? I found TCP/UDP/ICMP ,IP. Is that correct? regards, cranium __________________________________ Do you Yahoo!? The all-new My Yahoo! - Get yours free! http://my.yahoo.com From jengelh@linux01.gwdg.de Sun Nov 21 08:16:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 08:16:21 -0800 (PST) Received: from linux01.gwdg.de (root@linux01.gwdg.de [134.76.13.21]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALGGCQI021892 for ; Sun, 21 Nov 2004 08:16:13 -0800 Received: from linux01.gwdg.de (localhost [127.0.0.1]) by linux01.gwdg.de (8.12.7/8.12.7/SuSE Linux 0.6) with ESMTP id iALGFFh9018771; Sun, 21 Nov 2004 17:15:15 +0100 Received: from localhost (jengelh@localhost) by linux01.gwdg.de (8.12.7/8.12.7/Submit) with ESMTP id iALGFDD0018763; Sun, 21 Nov 2004 17:15:13 +0100 Date: Sun, 21 Nov 2004 17:15:12 +0100 (MET) From: Jan Engelhardt To: cranium2003 cc: kernelnewbies@nl.linux.org, linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com Subject: Re: how netfilter handles fragmented packets In-Reply-To: <20041121153154.85910.qmail@web41403.mail.yahoo.com> Message-ID: References: <20041121153154.85910.qmail@web41403.mail.yahoo.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-archive-position: 12061 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jengelh@linux01.gwdg.de Precedence: bulk X-list: netdev >hello, > In ip_output.c file ip_fragmet function when >create a new fragmented packet given to output(skb) >function. i want to know which function are actually >called by output(skb)? use stack_dump() (or was it dump_stack()?) Jan Engelhardt -- Gesellschaft fr Wissenschaftliche Datenverarbeitung Am Fassberg, 37077 Gttingen, www.gwdg.de From bdschuym@pandora.be Sun Nov 21 08:24:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 08:24:45 -0800 (PST) Received: from europa.telenet-ops.be (europa.telenet-ops.be [195.130.132.60]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALGOa1P025542 for ; Sun, 21 Nov 2004 08:24:36 -0800 Received: from localhost (localhost.localdomain [127.0.0.1]) by europa.telenet-ops.be (Postfix) with SMTP id 5E5D21980EF; Sun, 21 Nov 2004 17:24:16 +0100 (MET) Received: from 192.168.0.138 (D5763CA9.kabel.telenet.be [213.118.60.169]) by europa.telenet-ops.be (Postfix) with ESMTP id 1B53F198008; Sun, 21 Nov 2004 17:24:12 +0100 (MET) From: Bart De Schuymer To: =?utf-8?q?Micha=C5=82=20Margula?= , Andrew Morton Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups Date: Sun, 21 Nov 2004 17:27:43 +0100 User-Agent: KMail/1.5 Cc: netdev@oss.sgi.com References: <20041115122046.1413527e.akpm@osdl.org> <20041115124843.4c3dd72f.akpm@osdl.org> <419C8724.20006@uznam.net.pl> In-Reply-To: <419C8724.20006@uznam.net.pl> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_/HMoBK1B9Y3ldpH" Message-Id: <200411211727.43320.bdschuym@pandora.be> X-archive-position: 12062 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bdschuym@pandora.be Precedence: bulk X-list: netdev --Boundary-00=_/HMoBK1B9Y3ldpH Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Thursday 18 November 2004 12:27, Micha=C5=82 Margula wrote: > >Bart De Schuymer wrote: > >>>Problem is present in 2.6.8.1 and 2.6.9 kernels. There was no such > >>> problem on 2.4.26. > >> > >>Can you do something similar with iptables rules to see if it's specific > >> to ebtables (which I doubt)? > > Over 50 hours after converting rules from ebtables to iptables and still > no lockup. Everything is fine and I am sure it will go stable for days > (as mentioned before lockup with ebtables happens in less than 24 hours). The only thing I can come up with is that your packets are coming in so fas= t=20 that the ebtables user context code cannot get the write_lock_bh. Please apply the attached patch to be sure it hangs on the write_lock_bh, b= y=20 doing # cd /usr/src/linux-2.6.9/ # patch -p1 < patch When your system hangs again, the message "EBTABLES: BEFORE WRITE LOCK" should be in your syslog, and check that it is not followed by "EBTABLES:=20 AFTER WRITE LOCK". Is the bridge still forwarding packets while it hangs? Perhaps try to link all network traffic to one cpu before doing your ebtabl= es=20 updates... I strongly doubt there is a deadlock hidden in the ebtables code. Perhaps=20 other people on this list can throw in possibilities... cheers, Bart --Boundary-00=_/HMoBK1B9Y3ldpH Content-Type: text/x-diff; charset="utf-8"; name="patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="patch" --- linux-2.6.9/net/bridge/netfilter/ebtables.c.old 2004-11-21 17:00:49.000000000 +0100 +++ linux-2.6.9/net/bridge/netfilter/ebtables.c 2004-11-21 17:15:05.000000000 +0100 @@ -971,11 +971,13 @@ static int do_replace(void __user *user, if (ret != 0) goto free_counterstmp; +printk("BEFORE DOWN MUTEX\n"); t = find_table_lock(tmp.name, &ret, &ebt_mutex); if (!t) { ret = -ENOENT; goto free_iterate; } +printk("INSIDE MUTEX PROTECTION\n"); /* the table doesn't like it */ if (t->check && (ret = t->check(newinfo, tmp.valid_hooks))) @@ -996,6 +998,7 @@ static int do_replace(void __user *user, } else if (table->nentries && !newinfo->nentries) module_put(t->me); /* we need an atomic snapshot of the counters */ +printk("EBTABLES: BEFORE WRITE LOCK\n"); write_lock_bh(&t->lock); if (tmp.num_counters) get_counters(t->private->counters, counterstmp, @@ -1003,7 +1006,9 @@ static int do_replace(void __user *user, t->private = newinfo; write_unlock_bh(&t->lock); +printk("EBTABLES: AFTER WRITE LOCK\n"); up(&ebt_mutex); +printk("EBTABLES: AFTER UP MUTEX\n"); /* so, a user can change the chains while having messed up her counter allocation. Only reason why this is done is because this way the lock is held only once, while this doesn't bring the kernel into a --Boundary-00=_/HMoBK1B9Y3ldpH-- From nish.aravamudan@gmail.com Sun Nov 21 09:37:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 09:37:49 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.200]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALHbhWl026718 for ; Sun, 21 Nov 2004 09:37:44 -0800 Received: by rproxy.gmail.com with SMTP id z35so151570rne for ; Sun, 21 Nov 2004 09:37:19 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=t2BQH6GFx6ibYUPdiuRnSKoaoec8oWsZ8UivbLlZjtoMjXk5OHWiDt3AwQJltZsxn2PIt63Z/oXMTBk153kGvoHVwcIYRyuyqKYv0Qaf0+KM7CVLXN0Em39T8qdNnBtqi0QXi/MhgEqjRkHU8wpaibHNOAID+Opx1Xd99LaFE64= Received: by 10.38.104.32 with SMTP id b32mr502117rnc; Sun, 21 Nov 2004 09:37:19 -0800 (PST) Received: by 10.38.77.41 with HTTP; Sun, 21 Nov 2004 09:37:18 -0800 (PST) Message-ID: <29495f1d04112109372bb8ebe4@mail.gmail.com> Date: Sun, 21 Nov 2004 09:37:18 -0800 From: Nish Aravamudan Reply-To: Nish Aravamudan To: Jan Engelhardt Subject: Re: how netfilter handles fragmented packets Cc: cranium2003 , kernelnewbies@nl.linux.org, linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com In-Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <20041121153154.85910.qmail@web41403.mail.yahoo.com> X-archive-position: 12063 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nish.aravamudan@gmail.com Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 17:15:12 +0100 (MET), Jan Engelhardt wrote: > >hello, > > In ip_output.c file ip_fragmet function when > >create a new fragmented packet given to output(skb) > >function. i want to know which function are actually > >called by output(skb)? > > use stack_dump() (or was it dump_stack()?) dump_stack(), if you want to dump the current process' stack context. -Nish From hadi@cyberus.ca Sun Nov 21 09:47:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 09:48:00 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALHlee7027168 for ; Sun, 21 Nov 2004 09:47:54 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CVvo0-0005rY-BW for netdev@oss.sgi.com; Sun, 21 Nov 2004 12:47:20 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CVvnw-0004ha-Q4; Sun, 21 Nov 2004 12:47:17 -0500 Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions From: jamal Reply-To: hadi@cyberus.ca To: "David S. Miller" Cc: Patrick McHardy , netdev@oss.sgi.com In-Reply-To: <20041111150314.576ce699.davem@davemloft.net> References: <41908D1D.50405@trash.net> <20041111150314.576ce699.davem@davemloft.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101059233.1093.151.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 21 Nov 2004 12:47:13 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12064 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Thu, 2004-11-11 at 18:03, David S. Miller wrote: > I agree, and since Jamal also ACK'd it, I've applied > this patch. > Ive just tested the other patch from Patrick and it looks fine. Will put it through more testing later to test the different code paths; basics look good - so it should be fine to go in. Patrick are you going to work on the other cleanups you were thuinking of? ( etc) cheers, jamal From cranium2003@yahoo.com Sun Nov 21 11:42:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 11:42:33 -0800 (PST) Received: from web41407.mail.yahoo.com (web41407.mail.yahoo.com [66.218.93.73]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iALJgQjG028965 for ; Sun, 21 Nov 2004 11:42:27 -0800 Received: (qmail 14583 invoked by uid 60001); 21 Nov 2004 19:42:02 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=ya3gLRnd0NjE33jEth5wMIZmMME4rIvkQQEmfrzTNK8UG1UAlgOKmQXcsGt+K8vuV3dEl2htVS+9NJmgVT8NV5vwscxoTuHMmaa5Keqfq9B3X4DzJuC2gX4Ofnd0DHDRDgthqgtdFLWlH3t0p2PiYqHKnJmRyB86kdzUte4y8pc= ; Message-ID: <20041121194202.14581.qmail@web41407.mail.yahoo.com> Received: from [202.56.231.117] by web41407.mail.yahoo.com via HTTP; Sun, 21 Nov 2004 11:42:02 PST Date: Sun, 21 Nov 2004 11:42:02 -0800 (PST) From: cranium2003 Subject: Re: how netfilter handles fragmented packets To: Nish Aravamudan Cc: kernelnewbies@nl.linux.org, linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com In-Reply-To: <29495f1d04112109372bb8ebe4@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12065 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev --- Nish Aravamudan wrote: Hello Nish, > On Sun, 21 Nov 2004 17:15:12 +0100 (MET), Jan > Engelhardt > wrote: > > >hello, > > > In ip_output.c file ip_fragmet function > when > > >create a new fragmented packet given to > output(skb) > > >function. i want to know which function are > actually > > >called by output(skb)? > > > > use stack_dump() (or was it dump_stack()?) > > dump_stack(), if you want to dump the current > process' stack context. > > -Nish > can you please tell me how can i use dump_stack() method? so using dump_stack i will come to know which function will be called by output(skb) right? But where i get dump_stack()??? regards, cranium __________________________________ Do you Yahoo!? Meet the all-new My Yahoo! - Try it today! http://my.yahoo.com From rich@phekda.gotadsl.co.uk Sun Nov 21 12:06:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 12:06:29 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALK6MN8029828 for ; Sun, 21 Nov 2004 12:06:23 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (82-133-112-51.dyn.gotadsl.co.uk [82.133.112.51]) by smtp.nildram.co.uk (Postfix) with ESMTP id 45617251619 for ; Sun, 21 Nov 2004 20:05:59 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id 3FBB536E; Sun, 21 Nov 2004 19:47:54 +0000 (GMT) Message-ID: <41A0F0D5.9050702@phekda.gotadsl.co.uk> Date: Sun, 21 Nov 2004 19:47:33 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: Richard Dawe Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow References: <41A09541.5040405@phekda.gotadsl.co.uk> In-Reply-To: <41A09541.5040405@phekda.gotadsl.co.uk> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12066 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev Hello. I've got it working with 10Mbps full-duplex now. Here are the lines from modprobe.conf: alias eth0 r8169 options eth0 use_dac=0 media=0x2 I tried to build version 2.2 of the driver from RealTek but that fails, because it uses pci_dma_sync_single(), which now appears to have been split into pci_dma_sync_single_for_cpu() and pci_dma_sync_single_for_device(). Looking at the specs for the 8169, I see there is a version called an 8110SB. I wonder if I have that version? That might explain this message in the dmesg output: r8169: PCI device 0000:00:0c.0: unknown chip version, assuming RTL8169 Bye, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek From romieu@fr.zoreil.com Sun Nov 21 13:01:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 13:01:57 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALL1ji7001804 for ; Sun, 21 Nov 2004 13:01:52 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iALKwEvr022879; Sun, 21 Nov 2004 21:58:14 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iALKwEZS022878; Sun, 21 Nov 2004 21:58:14 +0100 Date: Sun, 21 Nov 2004 21:58:14 +0100 From: Francois Romieu To: Richard Dawe Cc: netdev@oss.sgi.com Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow Message-ID: <20041121205814.GA22460@electric-eye.fr.zoreil.com> References: <41A09541.5040405@phekda.gotadsl.co.uk> <41A0F0D5.9050702@phekda.gotadsl.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A0F0D5.9050702@phekda.gotadsl.co.uk> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12067 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Richard Dawe : [...] > I've got it working with 10Mbps full-duplex now. Here are the lines from > modprobe.conf: > > alias eth0 r8169 > options eth0 use_dac=0 media=0x2 It makes sense. use_dac=1 is reported to badly fail on amd64 most of time. Can you try 2.6.10-rc2 + http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc2-netdev1.patch.bz2 + http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-250.patch + http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-255.patch Is it an option for you to disable ACPI, remove the media specification and simply issue an 'ethtool eth0' a few tens of seconds after insertion of the module ? It takes ages to negotiate here (Netgear switch + 8169 PCI adapter). [...] > I tried to build version 2.2 of the driver from RealTek > but that fails, because it uses > pci_dma_sync_single(), which now appears to have been split into > pci_dma_sync_single_for_cpu() and pci_dma_sync_single_for_device(). This version of the driver is only maintained by Realtek and bears moderate ressemblance to the version of the driver available in the kernel. The version number do not match. Thanks for the get_drvinfo fix btw. Good catch. -- Ueimor From acme@conectiva.com.br Sun Nov 21 13:50:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 13:50:14 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALLo70j002814 for ; Sun, 21 Nov 2004 13:50:07 -0800 Received: from [200.138.46.101] (helo=oops.ghostprotocols.net) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1CVzcP-000423-00; Sun, 21 Nov 2004 19:51:37 -0200 Received: from [192.168.1.6] (amd64.kerneljanitors.org [192.168.1.6]) by oops.ghostprotocols.net (Postfix) with ESMTP id 50C6E1463D; Sun, 21 Nov 2004 19:49:46 -0200 (BRST) Message-ID: <41A10D8C.2070607@conectiva.com.br> Date: Sun, 21 Nov 2004 19:50:04 -0200 From: Arnaldo Carvalho de Melo Organization: Conectiva S.A. User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] export xfrm_policy_delete Content-Type: multipart/mixed; boundary="------------060906030903030105000001" X-archive-position: 12068 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------060906030903030105000001 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi David, In my DCCP work I'm closely following the TCP code, so I need this function exported, please consider applying. Signed-off-by: Arnaldo Carvalho de Melo --------------060906030903030105000001 Content-Type: text/plain; name="xfrm_policy_delete.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xfrm_policy_delete.patch" ===== net/xfrm/xfrm_policy.c 1.58 vs edited ===== --- 1.58/net/xfrm/xfrm_policy.c 2004-11-09 22:44:26 -02:00 +++ edited/net/xfrm/xfrm_policy.c 2004-11-21 19:43:19 -02:00 @@ -548,6 +548,8 @@ } } +EXPORT_SYMBOL(xfrm_policy_delete); + int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol) { struct xfrm_policy *old_pol; --------------060906030903030105000001-- From alchemyx@uznam.net.pl Sun Nov 21 14:21:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 14:22:03 -0800 (PST) Received: from mail.uznam.net.pl (postfix@gandalf.uznam.net.pl [195.135.236.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALMLujW003676 for ; Sun, 21 Nov 2004 14:21:57 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.uznam.net.pl (Postfix) with ESMTP id 58E3912F04; Sun, 21 Nov 2004 23:21:33 +0100 (CET) Received: from mail.uznam.net.pl ([195.135.236.2]) by localhost (gandalf.uznam.net.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 00755-05; Sun, 21 Nov 2004 23:21:33 +0100 (CET) Received: from [195.135.237.2] (cerber.uznam.net.pl [195.135.237.2]) by mail.uznam.net.pl (Postfix) with ESMTP id D5EFD12EFB; Sun, 21 Nov 2004 23:21:32 +0100 (CET) Message-ID: <41A114E3.5070705@uznam.net.pl> Date: Sun, 21 Nov 2004 23:21:23 +0100 From: =?ISO-8859-2?Q?Micha=B3_Margula?= User-Agent: Mozilla Thunderbird 0.8 (X11/20041119) X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Bart De Schuymer Cc: Andrew Morton , netdev@oss.sgi.com Subject: Re: Fw: [Bugme-new] [Bug 3746] New: Bridge causes machine lockups References: <20041115122046.1413527e.akpm@osdl.org> <20041115124843.4c3dd72f.akpm@osdl.org> <419C8724.20006@uznam.net.pl> <200411211727.43320.bdschuym@pandora.be> In-Reply-To: <200411211727.43320.bdschuym@pandora.be> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at uznam.net.pl X-archive-position: 12069 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alchemyx@uznam.net.pl Precedence: bulk X-list: netdev Bart De Schuymer napisa(a): ># cd /usr/src/linux-2.6.9/ ># patch -p1 < patch >When your system hangs again, the message "EBTABLES: BEFORE WRITE LOCK" >should be in your syslog, and check that it is not followed by "EBTABLES: >AFTER WRITE LOCK". > > > I have just applied that patch. Tomorrow I will reboot a new kernel. So in about no more than two days, I should get some results. >Is the bridge still forwarding packets while it hangs? > > > No. Box is completly frozen. >Perhaps try to link all network traffic to one cpu before doing your ebtables >updates... > > Could you give me more details about that? Should it be done before updating ebtables, and after that reverting? And most important - how? :). -- Micha Margula, alchemyx@uznam.net.pl, http://alchemyx.uznam.net.pl/ "W yciu pikne s tylko chwile" [Ryszard Riedel] From netdev@manty.net Sun Nov 21 14:26:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 14:26:31 -0800 (PST) Received: from betawl.net (204.Red-213-96-224.pooles.rima-tde.net [213.96.224.204]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALMQFwj004047 for ; Sun, 21 Nov 2004 14:26:16 -0800 Received: from man.manty.net (man.beta.es [192.168.1.2]) by betawl.net (Postfix) with ESMTP id 2A7EB2B980 for ; Sun, 21 Nov 2004 23:25:48 +0100 (CET) Received: by man.manty.net (Postfix, from userid 1000) id 039DA27D58; Sun, 21 Nov 2004 23:25:47 +0100 (CET) Date: Sun, 21 Nov 2004 23:25:47 +0100 From: Santiago Garcia Mantinan To: netdev@oss.sgi.com Subject: [BUG] 4 extra bytes in xirc2ps_cs driver packages Message-ID: <20041121222547.GA3794@man.manty.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040803i X-archive-position: 12070 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: netdev@manty.net Precedence: bulk X-list: netdev Hi! I don't know who can take a look at the bug in this driver, the thing is that when I tried to use a card with xirc2ps_cs driver as part of a bridge I saw that some of the packages comming through this driver had their length incremented in 4 bytes. We had a similar problem with the 8139too and the rtl8139 drivers, this time it doesn't seem to happen on all packets I believe that it is not happening with the small ones, I can do more tests if somebody is willing to drive me in them and to have a look at the driver's code. The kernel I was using when I did the tests was a 2.4.27 with pcmcia 3.2.5, the machine where I found this internal card is a Digital pentium mmx laptop. I don't know who is maintaining this driver, that's why I'm sending this to the list. I hope I can help tracking this down doing more tests, don't hesitate to contact me. Regards... -- Manty/BestiaTester -> http://manty.net From pablo@eurodev.net Sun Nov 21 14:27:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 14:27:53 -0800 (PST) Received: from smtp06.retemail.es (smtp06.auna.com [62.81.186.16]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALMRkoM004393 for ; Sun, 21 Nov 2004 14:27:46 -0800 Received: from eurodev.net ([217.217.187.247]) by smtp06.retemail.es (InterMail vM.5.01.06.10 201-253-122-130-110-20040306) with ESMTP id <20041121222720.ZLSO23813.smtp06.retemail.es@eurodev.net>; Sun, 21 Nov 2004 23:27:20 +0100 Message-ID: <41A115A3.3020509@eurodev.net> Date: Sun, 21 Nov 2004 23:24:35 +0100 From: Pablo Neira User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, davem@redhat.com, herbert@gondor.apana.org.au Subject: Re: [NETLINK] introduce netlink bucket References: <4187FF18.5050608@eurodev.net> <20041103154833.164e33f5.davem@davemloft.net> In-Reply-To: <20041103154833.164e33f5.davem@davemloft.net> Content-Type: multipart/mixed; boundary="------------070806010308000800010700" X-archive-position: 12071 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pablo@eurodev.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------070806010308000800010700 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit David S. Miller wrote: >On Tue, 02 Nov 2004 22:41:44 +0100 >Pablo Neira wrote: > > > >>This patch introduces the netlink bucket struct, it joins three arrays >>into an array of netlink bucket. >> >>Signed-off-by: Pablo Neira Ayuso >> >> > >Here is the work Herbert and I were talking about. It kind >of makes your patch taken care of already :-) > > Move netlink_kernel and nl_nonroot arrays to nl_table structure. Do you like it? -- Pablo --------------070806010308000800010700 Content-Type: text/plain; name="X" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="X" ===== net/netlink/af_netlink.c 1.62 vs edited ===== --- 1.62/net/netlink/af_netlink.c 2004-11-15 23:57:51 +01:00 +++ edited/net/netlink/af_netlink.c 2004-11-21 20:43:06 +01:00 @@ -91,16 +91,15 @@ struct netlink_table { struct nl_pid_hash hash; struct hlist_head mc_list; + unsigned int nl_nonroot; +#ifdef NL_EMULATE_DEV + struct socket *netlink_kernel; +#endif }; static struct netlink_table *nl_table; static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait); -static unsigned int nl_nonroot[MAX_LINKS]; - -#ifdef NL_EMULATE_DEV -static struct socket *netlink_kernel[MAX_LINKS]; -#endif static int netlink_dump(struct sock *sk); static void netlink_destroy_callback(struct netlink_callback *cb); @@ -442,7 +441,7 @@ static inline int netlink_capable(struct socket *sock, unsigned int flag) { - return (nl_nonroot[sock->sk->sk_protocol] & flag) || + return (nl_table[sock->sk->sk_protocol].nl_nonroot & flag) || capable(CAP_NET_ADMIN); } @@ -1066,7 +1065,7 @@ void netlink_set_nonroot(int protocol, unsigned int flags) { if ((unsigned int)protocol < MAX_LINKS) - nl_nonroot[protocol] = flags; + nl_table[protocol].nl_nonroot = flags; } static void netlink_destroy_callback(struct netlink_callback *cb) @@ -1217,7 +1216,7 @@ return -ENOBUFS; nlk_sk(sk)->handler = function; write_lock_bh(&nl_emu_lock); - netlink_kernel[unit] = sk->sk_socket; + nl_table[unit].netlink_kernel = sk->sk_socket; write_unlock_bh(&nl_emu_lock); return 0; } @@ -1227,8 +1226,8 @@ struct socket *sock; write_lock_bh(&nl_emu_lock); - sock = netlink_kernel[unit]; - netlink_kernel[unit] = NULL; + sock = nl_table[unit].netlink_kernel; + nl_table[unit].netlink_kernel = NULL; write_unlock_bh(&nl_emu_lock); sock_release(sock); @@ -1239,7 +1238,7 @@ struct socket *sock; read_lock(&nl_emu_lock); - sock = netlink_kernel[unit]; + sock = nl_table[unit].netlink_kernel; if (sock) { struct sock *sk = sock->sk; memset(skb->cb, 0, sizeof(skb->cb)); --------------070806010308000800010700-- From uucp@ganesha.gnumonks.org Sun Nov 21 15:07:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 15:07:28 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALN7Lsm005483 for ; Sun, 21 Nov 2004 15:07:21 -0800 Received: from uucp by ganesha.gnumonks.org with local-bsmtp (Exim 4.34) id 1CW0nM-0007b6-Sk for netdev@oss.sgi.com; Mon, 22 Nov 2004 00:07:00 +0100 Received: from laforge by obroa-skai.gnumonks.org with local (Exim 3.36 #1) id 1CVxBc-0002Fi-00; Sun, 21 Nov 2004 20:15:48 +0100 Date: Sun, 21 Nov 2004 20:15:48 +0100 From: Harald Welte To: Hendrik Wiese <7.e.Q@syncro-community.de> Cc: netdev@oss.sgi.com Subject: Re: driver ability to use iptables? Message-ID: <20041121191548.GE4009@obroa-skai.de.gnumonks.org> References: <4198A1CE.7040905@syncro-community.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="wTWi5aaYRw9ix9vO" Content-Disposition: inline In-Reply-To: <4198A1CE.7040905@syncro-community.de> X-Operating-System: Linux obroa-skai.de.gnumonks.org 2.6.9-rc3-bk9gm1 X-Date: Today is Setting Orange, the 33rd day of The Aftermath in the YOLD 3170 User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12072 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@netfilter.org Precedence: bulk X-list: netdev --wTWi5aaYRw9ix9vO Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Nov 15, 2004 at 01:32:14PM +0100, Hendrik Wiese wrote: > Hello there, >=20 > I hope I do right posting this here. So please don't be angry if I'm=20 > wrong. I'm kind of newbie. There is a netfilter-devel@lists.netfilter.org lists for iptables/netfilter related questions. But I think netdev is quite ok in this case, since at this time it is unclear (and I think very unlikely) to be a netfilter/iptables issue. > as soon as we want to use iptables to establish one of the modules as a= =20 > router to the outer world (tp network connected via front panel eth > device) this doesn't work...=20 _please_ give us more detailed descriptions than "doesn't work". > correctly as it works for to eth devices. Is there any ability else a > network device driver must have to work with iptables? no, as iptables is based on netfilter IPv4 hooks which are embedded into the IPv4 stack. Between your driver and iptables is the ipv4 stack and the generic networking core. There is no driver/iptables interface at all. --=20 - Harald Welte http://www.netfilter.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D "Fragmentation is like classful addressing -- an interesting early architectural error that shows how much experimentation was going on while IP was being designed." -- Paul Vixie --wTWi5aaYRw9ix9vO Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBoOljXaXGVTD0i/8RAm5dAKCOs8MrdFv+Ib2U6qr9drAGath8JwCeJCKr ohq0yBrFrkR1aF+x63lCBIo= =mA4e -----END PGP SIGNATURE----- --wTWi5aaYRw9ix9vO-- From uucp@ganesha.gnumonks.org Sun Nov 21 15:07:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 15:07:30 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALN7Lm3005484 for ; Sun, 21 Nov 2004 15:07:21 -0800 Received: from uucp by ganesha.gnumonks.org with local-bsmtp (Exim 4.34) id 1CW0nM-0007bA-Up for netdev@oss.sgi.com; Mon, 22 Nov 2004 00:07:00 +0100 Received: from laforge by obroa-skai.gnumonks.org with local (Exim 3.36 #1) id 1CVxI1-0002G8-00; Sun, 21 Nov 2004 20:22:25 +0100 Date: Sun, 21 Nov 2004 20:22:25 +0100 From: Harald Welte To: Werner Almesberger Cc: netdev@oss.sgi.com Subject: Re: WLAN power saving: brain dump Message-ID: <20041121192225.GF4009@obroa-skai.de.gnumonks.org> References: <20041116113027.A4026@almesberger.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ULyIDA2m8JTe+TiX" Content-Disposition: inline In-Reply-To: <20041116113027.A4026@almesberger.net> X-Operating-System: Linux obroa-skai.de.gnumonks.org 2.6.9-rc3-bk9gm1 X-Date: Today is Setting Orange, the 33rd day of The Aftermath in the YOLD 3170 User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12073 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@gnumonks.org Precedence: bulk X-list: netdev --ULyIDA2m8JTe+TiX Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Werner! On Tue, Nov 16, 2004 at 11:30:27AM -0300, Werner Almesberger wrote: > This is just a brain dump, so that the ideas are out in public. > Some day, I might actually implement this, unless somebody else > beats me to it :-) Mh. Don't recent 802.11 chipsets already have a number of power-saving features, even going as far as having special provisions in the 802.11 protocol for special power saving modes? Sorry for that indefinitive and blurry response, but power saving is the about the single part of 802.11 that I'm actually not really interested in (and thus haven't read up with the docs). The problem when you just 'stupidly' power down a card is that you will loose the association [and thus authentication] with the AP. Thus you have to re-associate and re-authenticate every time you come up from power down mode. Especially when you rune more advanced authentication mechanisms like WPA/WPA2 this process can take quite some time, and involve latency-prone operations such as contacting a radius server from the AP, etc. --=20 - Harald Welte http://www.gnumonks.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Programming is like sex: One mistake and you have to support it your lifeti= me --ULyIDA2m8JTe+TiX Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBoOrwXaXGVTD0i/8RAj4lAJ9uG+YBz/M13ww7JDVCSCNNRd92VwCbB5Qj T810M/fBCg7y3g+1HDb/TZE= =Bvmx -----END PGP SIGNATURE----- --ULyIDA2m8JTe+TiX-- From romieu@fr.zoreil.com Sun Nov 21 15:29:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 15:29:54 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iALNTlPH006892 for ; Sun, 21 Nov 2004 15:29:48 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iALNT0vr026674; Mon, 22 Nov 2004 00:29:00 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iALNSpeC026673; Mon, 22 Nov 2004 00:28:51 +0100 Date: Mon, 22 Nov 2004 00:28:50 +0100 From: Francois Romieu To: Richard Dawe Cc: netdev@oss.sgi.com, davem@davemloft.net, jgarzik@pobox.com Subject: [patch] ethtool (was Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow) Message-ID: <20041121232850.GB22460@electric-eye.fr.zoreil.com> References: <41A09541.5040405@phekda.gotadsl.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A09541.5040405@phekda.gotadsl.co.uk> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12074 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Richard Dawe : > diff -pur ethtool-2/ethtool.c ethtool-2.dev/ethtool.c > --- ethtool-2/ethtool.c 2004-07-02 16:28:48.000000000 +0100 > +++ ethtool-2.dev/ethtool.c 2004-11-21 10:09:13.000000000 +0000 > @@ -996,6 +996,7 @@ static struct { > } driver_list[] = { > { "8139cp", realtek_dump_regs }, > { "8139too", realtek_dump_regs }, > + { "r8169", realtek_dump_regs }, > { "de2104x", de2104x_dump_regs }, > { "e1000", e1000_dump_regs }, > { "natsemi", natsemi_dump_regs }, > diff -pur ethtool-2/realtek.c ethtool-2.dev/realtek.c > --- ethtool-2/realtek.c 2004-04-09 19:44:55.000000000 +0100 > +++ ethtool-2.dev/realtek.c 2004-11-21 11:31:29.015997736 +0000 > @@ -43,7 +43,7 @@ static struct chip_info { > { "RTL-8100B/8139D", HW_REVID(1, 1, 1, 0, 1, 0, 1) }, > { "RTL-8139C+", HW_REVID(1, 1, 1, 0, 1, 1, 0) }, > { "RTL-8101", HW_REVID(1, 1, 1, 0, 1, 1, 1) }, > - { "RTL-8169", HW_REVID(0, 0, 0, 0, 0, 0, 0) }, > + { "RTL-8169", HW_REVID(0, 0, 1, 0, 0, 0, 0) }, The initial value can be found in the datasheet and my Netgear adapter announces HW_REVID(0, 0, 0, 0, 1, 0, 0). Joy. Dave, Jeff, any remark about the patch below ? Index: ethtool.c =================================================================== RCS file: /cvsroot/gkernel/ethtool/ethtool.c,v retrieving revision 1.50 diff -u -p -r1.50 ethtool.c --- ethtool.c 2 Jul 2004 15:35:09 -0000 1.50 +++ ethtool.c 21 Nov 2004 23:22:54 -0000 @@ -996,6 +996,7 @@ static struct { } driver_list[] = { { "8139cp", realtek_dump_regs }, { "8139too", realtek_dump_regs }, + { "r8169", realtek_dump_regs }, { "de2104x", de2104x_dump_regs }, { "e1000", e1000_dump_regs }, { "natsemi", natsemi_dump_regs }, Index: realtek.c =================================================================== RCS file: /cvsroot/gkernel/ethtool/realtek.c,v retrieving revision 1.5 diff -u -p -r1.5 realtek.c --- realtek.c 9 Apr 2004 18:44:55 -0000 1.5 +++ realtek.c 21 Nov 2004 23:22:55 -0000 @@ -22,6 +22,8 @@ enum chip_type { RTL8139Cp, RTL8101, RTL8169, + RTL8169s, + RTL8110 }; enum { @@ -44,6 +46,8 @@ static struct chip_info { { "RTL-8139C+", HW_REVID(1, 1, 1, 0, 1, 1, 0) }, { "RTL-8101", HW_REVID(1, 1, 1, 0, 1, 1, 1) }, { "RTL-8169", HW_REVID(0, 0, 0, 0, 0, 0, 0) }, + { "RTL-8169s", HW_REVID(0, 0, 0, 0, 1, 0, 0) }, + { "RTL-8110", HW_REVID(0, 0, 1, 0, 0, 0, 0) }, { } }; @@ -112,7 +116,10 @@ realtek_dump_regs(struct ethtool_drvinfo data[0x08 >> 2], data[0x0c >> 2]); - if (board_type == RTL8139Cp || board_type == RTL8169) { + if (board_type == RTL8139Cp || + board_type == RTL8169 || + board_type == RTL8169s || + board_type == RTL8110) { fprintf(stdout, "0x10: Dump Tally Counter Command 0x%08x 0x%08x\n", data[0x10 >> 2], @@ -148,7 +155,9 @@ realtek_dump_regs(struct ethtool_drvinfo data[0x2C >> 2]); } - if (board_type == RTL8169) { + if (board_type == RTL8169 || + board_type == RTL8169s || + board_type == RTL8110) { fprintf(stdout, "0x30: Flash memory read/write 0x%08x\n", data[0x30 >> 2]); @@ -183,7 +192,9 @@ realtek_dump_regs(struct ethtool_drvinfo v & (1 << 2) ? "on" : "off", v & (1 << 4) ? ", RESET" : ""); - if (board_type != RTL8169) { + if (board_type != RTL8169 && + board_type != RTL8169s && + board_type != RTL8110) { fprintf(stdout, "0x38: Current Address of Packet Read (C mode) 0x%04x\n" "0x3A: Current Rx buffer address (C mode) 0x%04x\n", @@ -218,7 +229,9 @@ realtek_dump_regs(struct ethtool_drvinfo data8[0x51], data8[0x52]); - if (board_type == RTL8169) { + if (board_type == RTL8169 || + board_type == RTL8169s || + board_type == RTL8110) { fprintf(stdout, "0x53: Config 2 0x%02x\n" "0x54: Config 3 0x%02x\n" @@ -257,7 +270,9 @@ realtek_dump_regs(struct ethtool_drvinfo "0x5C: Multiple Interrupt Select 0x%04x\n", data[0x5c >> 2] & 0xffff); - if (board_type == RTL8169) { + if (board_type == RTL8169 || + board_type == RTL8169s || + board_type == RTL8110) { fprintf(stdout, "0x60: PHY access 0x%08x\n" "0x64: TBI control and status 0x%08x\n", @@ -448,7 +463,10 @@ realtek_dump_regs(struct ethtool_drvinfo } } - if (board_type == RTL8139Cp || board_type == RTL8169) { + if (board_type == RTL8139Cp || + board_type == RTL8169 || + board_type == RTL8169s || + board_type == RTL8110) { v = data[0xE0 >> 2] & 0xffff; fprintf(stdout, "0xE0: C+ Command 0x%04x\n", From werner@almesberger.net Sun Nov 21 16:44:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 16:45:05 -0800 (PST) Received: from host.almesberger.net (almesberger.net [63.105.73.238]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM0iwcl011867 for ; Sun, 21 Nov 2004 16:44:58 -0800 Received: from almesberger.net (vpnwa-home [10.200.0.2]) by host.almesberger.net (8.12.8/8.9.3) with ESMTP id iAM0iTha007614; Sun, 21 Nov 2004 16:44:33 -0800 Received: (from werner@localhost) by almesberger.net (8.11.6/8.11.6) id iAM0iLq22198; Sun, 21 Nov 2004 21:44:21 -0300 Date: Sun, 21 Nov 2004 21:44:21 -0300 From: Werner Almesberger To: Harald Welte Cc: netdev@oss.sgi.com Subject: Re: WLAN power saving: brain dump Message-ID: <20041121214421.B29528@almesberger.net> References: <20041116113027.A4026@almesberger.net> <20041121192225.GF4009@obroa-skai.de.gnumonks.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041121192225.GF4009@obroa-skai.de.gnumonks.org>; from laforge@gnumonks.org on Sun, Nov 21, 2004 at 08:22:25PM +0100 X-archive-position: 12075 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wa@almesberger.net Precedence: bulk X-list: netdev Harald Welte wrote: > Mh. Don't recent 802.11 chipsets already have a number of power-saving > features, even going as far as having special provisions in the 802.11 > protocol for special power saving modes? They do, but they're still very power-hungry. (Well above 100 mW, it seems.) But meanwhile I've been pointed to new technology that should do a lot better in this regard: http://www.semiconductors.philips.com/technologies/wirelessconnectivity/80211b/ So maybe active power management from the host would only be needed for obsolete hardware in the not too distant future. Still, there's a lot of this around ... > Sorry for that indefinitive and blurry response, but power saving is the > about the single part of 802.11 that I'm actually not really interested > in (and thus haven't read up with the docs). With a PDA, it's be about the only thing you think about ;-) > The problem when you just 'stupidly' power down a card is that you will > loose the association [and thus authentication] with the AP. Yes, that's what worries me a bit. A few hundred ms of delay should be fine, but if it takes longer, that might be a problem. - Werner -- _________________________________________________________________________ / Werner Almesberger, Buenos Aires, Argentina wa@almesberger.net / /_http://www.almesberger.net/____________________________________________/ From horms@koto.vergenet.net Sun Nov 21 18:48:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 18:48:51 -0800 (PST) Received: from koto.vergenet.net (koto.vergenet.net [210.128.90.7]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAM2mbBK016021 for ; Sun, 21 Nov 2004 18:48:37 -0800 Received: (qmail 17898 invoked by uid 7100); 22 Nov 2004 02:33:01 -0000 Date: Mon, 22 Nov 2004 11:48:05 +0900 From: Horms To: Nishanth Aravamudan Cc: janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] Add ssleep_interruptible() Message-ID: <20041122024804.GD4146@verge.net.au> Mail-Followup-To: Nishanth Aravamudan , janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org References: <20041101200749.GF1730@us.ibm.com> <20041117013059.GA4218@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041117013059.GA4218@us.ibm.com> X-Cluestick: seven User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12076 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: horms@verge.net.au Precedence: bulk X-list: netdev On Tue, Nov 16, 2004 at 05:30:59PM -0800, Nishanth Aravamudan wrote: > On Mon, Nov 01, 2004 at 12:07:49PM -0800, Nishanth Aravamudan wrote: > > Description: Adds ssleep_interruptible() to allow longer delays to occur > > in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with > > msleep_interruptible(), ssleep_interruptible() returns the remaining time > > left in the delay in terms of seconds. This required dividing the return > > value of msleep_interruptible() by 1000, thus a cast to (unsigned long) > > to prevent any floating point issues. > > > > Signed-off-by: Nishanth Aravamudan > > > > --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 > > 15:34:03.000000000 -0700 > > +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 > > @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s > > msleep(seconds * 1000); > > } > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > +{ > > + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); > > +} > > + > > #endif /* defined(_LINUX_DELAY_H) */ > > After a discussion on IRC, I believe it is pretty clear that this > function has serious issues. Mainly, that if I request a delay of 1 > second, but msleep_interruptible() returns after 1 millisecond, then > ssleep_interruptible() will return 0, claiming the entire delay was > used (due to rounding). > > Perhaps we should just be satisfied with milliseconds being the grossest > (in contrast to fine) measure of time, at least in terms of > interruptible delays. ssleep() is unaffected by this problem, of course. > > Please revert this patch, if applied, as well as any of the other > patches I sent using ssleep_interruptible() [only a handful]. Would making sure that the time slept was always rounded up to the nearest second resolve this problem. I believe that rounding up is a common approach to resolving this type of problem when changing clock resolution. I am thinking of something like this. ===== include/linux/delay.h 1.6 vs edited ===== --- 1.6/include/linux/delay.h 2004-09-03 18:08:32 +09:00 +++ edited/include/linux/delay.h 2004-11-22 11:47:03 +09:00 @@ -46,4 +46,10 @@ static inline void ssleep(unsigned int s msleep(seconds * 1000); } +static inline unsigned long ssleep_interruptible(unsigned int seconds) +{ + return (unsigned long)((msleep_interruptible(seconds * 1000) + 999) / + 1000); +} + #endif /* defined(_LINUX_DELAY_H) */ -- Horms From anton@ozlabs.org Sun Nov 21 20:59:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 20:59:54 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM4xlac022028 for ; Sun, 21 Nov 2004 20:59:48 -0800 Received: by ozlabs.org (Postfix, from userid 1010) id B12A12BDF2; Mon, 22 Nov 2004 15:59:15 +1100 (EST) Date: Mon, 22 Nov 2004 15:55:53 +1100 From: Anton Blanchard To: netdev@oss.sgi.com Cc: ja@ssi.bg Subject: send to self patch Message-ID: <20041122045553.GB32312@krispykreme.ozlabs.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12077 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anton@samba.org Precedence: bulk X-list: netdev Hi, We've been using Julian Anastasov's send to self patch quite a lot. It has been useful for a number of things including POWER5 system test (where we stress a single system with a number of networks) through to e1000 TSO testing more recently. Are there any hopes of getting it merged? :) http://www.ssi.bg/~ja/#loop Anton From akpm@osdl.org Sun Nov 21 22:41:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:41:44 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6fbxc024494 for ; Sun, 21 Nov 2004 22:41:38 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAM6fD900472; Sun, 21 Nov 2004 22:41:13 -0800 Date: Sun, 21 Nov 2004 22:41:01 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: Erik Mckee Subject: Fw: Divide Error in tcp_set_skb_tso_segs Message-Id: <20041121224101.17e7fd95.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12078 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Mon, 22 Nov 2004 00:28:07 -0600 (CST) From: Erik Mckee To: linux-kernel@vger.kernel.org Subject: Divide Error in tcp_set_skb_tso_segs Hello! I am running 2.4.10-rc2 and I have now gotten two instances of the above oops. I haven't managed to record the oops message for it as of yet. I am connecting to the internet over ppp. IIRC, it has appeared both times after ssh-ing to my email provider and running pine. I'm not sure if this had anything to do with it or not. I rembmer that there are some do_IRQ and do_softirq stuff in the traceback, along with something like a line of ========='s.... This is with a non tainted kernel, compiled with GCC 3.4 with PREEMPT turned on... I can try to collect more information if it is desired....I am not on the list, so please CC me with any replies... TIA Erik - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ From akpm@osdl.org Sun Nov 21 22:44:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:38 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iS6m024830 for ; Sun, 21 Nov 2004 22:44:29 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i2900628; Sun, 21 Nov 2004 22:44:02 -0800 Message-Id: <200411220644.iAM6i2900628@mail.osdl.org> Subject: [patch 03/13] X.25: Remove unused header files To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, ahendry@tusc.com.au From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:50 -0800 X-archive-position: 12079 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Andrew Hendry Remove unused header files from X.25 Signed-off-by: Andrew Hendry Signed-off-by: Andrew Morton --- 25-akpm/net/x25/af_x25.c | 9 --------- 25-akpm/net/x25/sysctl_net_x25.c | 1 - 25-akpm/net/x25/x25_dev.c | 19 ------------------- 25-akpm/net/x25/x25_facilities.c | 14 -------------- 25-akpm/net/x25/x25_in.c | 14 -------------- 25-akpm/net/x25/x25_link.c | 13 ------------- 25-akpm/net/x25/x25_out.c | 13 ------------- 25-akpm/net/x25/x25_subr.c | 14 -------------- 25-akpm/net/x25/x25_timer.c | 14 -------------- 9 files changed, 111 deletions(-) diff -puN net/x25/af_x25.c~x25-remove-unused-header-files net/x25/af_x25.c --- 25/net/x25/af_x25.c~x25-remove-unused-header-files 2004-11-21 22:42:30.619027440 -0800 +++ 25-akpm/net/x25/af_x25.c 2004-11-21 22:42:30.634025160 -0800 @@ -34,28 +34,19 @@ #include #include #include -#include -#include -#include #include #include #include #include -#include #include -#include -#include #include #include #include #include #include -#include #include #include #include /* For TIOCINQ/OUTQ */ -#include -#include #include #include #include diff -puN net/x25/sysctl_net_x25.c~x25-remove-unused-header-files net/x25/sysctl_net_x25.c --- 25/net/x25/sysctl_net_x25.c~x25-remove-unused-header-files 2004-11-21 22:42:30.620027288 -0800 +++ 25-akpm/net/x25/sysctl_net_x25.c 2004-11-21 22:42:30.634025160 -0800 @@ -5,7 +5,6 @@ * Added /proc/sys/net/x25 directory entry (empty =) ). [MS] */ -#include #include #include #include diff -puN net/x25/x25_dev.c~x25-remove-unused-header-files net/x25/x25_dev.c --- 25/net/x25/x25_dev.c~x25-remove-unused-header-files 2004-11-21 22:42:30.622026984 -0800 +++ 25-akpm/net/x25/x25_dev.c 2004-11-21 22:42:30.634025160 -0800 @@ -18,29 +18,10 @@ */ #include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include /* For TIOCINQ/OUTQ */ -#include -#include -#include -#include #include #include diff -puN net/x25/x25_facilities.c~x25-remove-unused-header-files net/x25/x25_facilities.c --- 25/net/x25/x25_facilities.c~x25-remove-unused-header-files 2004-11-21 22:42:30.623026832 -0800 +++ 25-akpm/net/x25/x25_facilities.c 2004-11-21 22:42:30.635025008 -0800 @@ -19,24 +19,10 @@ * negotiation. */ -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include /* diff -puN net/x25/x25_in.c~x25-remove-unused-header-files net/x25/x25_in.c --- 25/net/x25/x25_in.c~x25-remove-unused-header-files 2004-11-21 22:42:30.625026528 -0800 +++ 25-akpm/net/x25/x25_in.c 2004-11-21 22:42:30.635025008 -0800 @@ -24,25 +24,11 @@ */ #include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include /* For ip_rcv */ #include -#include -#include -#include -#include #include static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more) diff -puN net/x25/x25_link.c~x25-remove-unused-header-files net/x25/x25_link.c --- 25/net/x25/x25_link.c~x25-remove-unused-header-files 2004-11-21 22:42:30.626026376 -0800 +++ 25-akpm/net/x25/x25_link.c 2004-11-21 22:42:30.636024856 -0800 @@ -21,25 +21,12 @@ * 2000-09-04 Henner Eisen dev_hold() / dev_put() for x25_neigh. */ -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include #include #include -#include -#include #include -#include -#include -#include #include #include diff -puN net/x25/x25_out.c~x25-remove-unused-header-files net/x25/x25_out.c --- 25/net/x25/x25_out.c~x25-remove-unused-header-files 2004-11-21 22:42:30.627026224 -0800 +++ 25-akpm/net/x25/x25_out.c 2004-11-21 22:42:30.636024856 -0800 @@ -22,24 +22,11 @@ * needed cleaned seq-number fields. */ -#include -#include #include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include static int x25_pacsize_to_bytes(unsigned int pacsize) diff -puN net/x25/x25_subr.c~x25-remove-unused-header-files net/x25/x25_subr.c --- 25/net/x25/x25_subr.c~x25-remove-unused-header-files 2004-11-21 22:42:30.629025920 -0800 +++ 25-akpm/net/x25/x25_subr.c 2004-11-21 22:42:30.637024704 -0800 @@ -21,25 +21,11 @@ * jun/24/01 Arnaldo C. Melo use skb_queue_purge, cleanups */ -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include #include #include -#include -#include -#include -#include #include /* diff -puN net/x25/x25_timer.c~x25-remove-unused-header-files net/x25/x25_timer.c --- 25/net/x25/x25_timer.c~x25-remove-unused-header-files 2004-11-21 22:42:30.630025768 -0800 +++ 25-akpm/net/x25/x25_timer.c 2004-11-21 22:42:30.638024552 -0800 @@ -20,24 +20,10 @@ */ #include -#include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include #include #include -#include -#include -#include -#include #include static void x25_heartbeat_expiry(unsigned long); _ From akpm@osdl.org Sun Nov 21 22:44:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:38 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iPPr024821 for ; Sun, 21 Nov 2004 22:44:25 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6hv900601; Sun, 21 Nov 2004 22:43:58 -0800 Message-Id: <200411220643.iAM6hv900601@mail.osdl.org> Subject: [patch 01/13] arcnet fixes To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, simlo@phys.au.dk From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:45 -0800 X-archive-position: 12080 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Esben Nielsen As previously reported the ArcNet driver didn't work with Preempt and SMB on. They do now. I have changed the locking system from being a global arcnet lock to being a lock per device. I used the lock in dev->hard_start_xmit = arcnet_send_packet. Furthermore I added the "CAP mode" encapsulation. As far as I see it it is the only encapsulation which actually makes ArcNet usefull over ethernet. Previously, the driver just ignored the hardware transmit status, now you can get hardware acknowledge and excessive nacks back to userspace via a raw socket. The capmode.c is nearly just a copy of arc-rawmode.c. The difference is that it inserts a ack_tx() handle into the general driver framework. Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/arcnet/Kconfig | 19 + 25-akpm/drivers/net/arcnet/Makefile | 1 25-akpm/drivers/net/arcnet/arc-rawmode.c | 9 25-akpm/drivers/net/arcnet/arcnet.c | 253 +++++++++++++++++-------- 25-akpm/drivers/net/arcnet/capmode.c | 296 ++++++++++++++++++++++++++++++ 25-akpm/drivers/net/arcnet/com20020-isa.c | 1 25-akpm/drivers/net/arcnet/com20020.c | 28 +- 25-akpm/drivers/net/arcnet/rfc1051.c | 3 25-akpm/drivers/net/arcnet/rfc1201.c | 2 25-akpm/include/linux/arcdevice.h | 21 +- 25-akpm/include/linux/com20020.h | 30 +-- 25-akpm/include/linux/if_arcnet.h | 14 + 25-akpm/include/linux/if_ether.h | 1 include/linux/net.h | 0 14 files changed, 574 insertions(+), 104 deletions(-) diff -puN drivers/net/arcnet/arcnet.c~arcnet-fixes drivers/net/arcnet/arcnet.c --- 25/drivers/net/arcnet/arcnet.c~arcnet-fixes 2004-11-21 22:42:30.230086568 -0800 +++ 25-akpm/drivers/net/arcnet/arcnet.c 2004-11-21 22:42:30.254082920 -0800 @@ -53,7 +53,6 @@ #include #include - /* "do nothing" functions for protocol drivers */ static void null_rx(struct net_device *dev, int bufnum, struct archdr *pkthdr, int length); @@ -69,25 +68,28 @@ static int null_prepare_tx(struct net_de * arc_proto_default instead. It also must not be NULL; if you would like * to set it to NULL, set it to &arc_proto_null instead. */ -struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto; + struct ArcProto *arc_proto_map[256], *arc_proto_default, + *arc_bcast_proto, *arc_raw_proto; struct ArcProto arc_proto_null = { .suffix = '?', .mtu = XMTU, + .is_ip = 0, .rx = null_rx, .build_header = null_build_header, .prepare_tx = null_prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; -static spinlock_t arcnet_lock = SPIN_LOCK_UNLOCKED; - /* Exported function prototypes */ int arcnet_debug = ARCNET_DEBUG; EXPORT_SYMBOL(arc_proto_map); EXPORT_SYMBOL(arc_proto_default); EXPORT_SYMBOL(arc_bcast_proto); +EXPORT_SYMBOL(arc_raw_proto); EXPORT_SYMBOL(arc_proto_null); EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_debug); @@ -131,7 +133,7 @@ static int __init arcnet_init(void) #endif /* initialize the protocol map */ - arc_proto_default = arc_bcast_proto = &arc_proto_null; + arc_raw_proto = arc_proto_default = arc_bcast_proto = &arc_proto_null; for (count = 0; count < 256; count++) arc_proto_map[count] = arc_proto_default; @@ -155,7 +157,8 @@ module_exit(arcnet_exit); * Dump the contents of an sk_buff */ #if ARCNET_DEBUG_MAX & D_SKB -void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc) +void arcnet_dump_skb(struct net_device *dev, + struct sk_buff *skb, char *desc) { int i; @@ -176,18 +179,22 @@ EXPORT_SYMBOL(arcnet_dump_skb); * Dump the contents of an ARCnet buffer */ #if (ARCNET_DEBUG_MAX & (D_RX | D_TX)) -void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc) +void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, + int take_arcnet_lock) { struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int i, length; - unsigned long flags; + unsigned long flags = 0; static uint8_t buf[512]; /* hw.copy_from_card expects IRQ context so take the IRQ lock to keep it single threaded */ - spin_lock_irqsave(&arcnet_lock, flags); + if(take_arcnet_lock) + spin_lock_irqsave(&lp->lock, flags); + lp->hw.copy_from_card(dev, bufnum, 0, buf, 512); - spin_unlock_irqrestore(&arcnet_lock, flags); + if(take_arcnet_lock) + spin_unlock_irqrestore(&lp->lock, flags); /* if the offset[0] byte is nonzero, this is a 256-byte packet */ length = (buf[2] ? 256 : 512); @@ -219,6 +226,8 @@ void arcnet_unregister_proto(struct ArcP arc_proto_default = &arc_proto_null; if (arc_bcast_proto == proto) arc_bcast_proto = arc_proto_default; + if (arc_raw_proto == proto) + arc_raw_proto = arc_proto_default; for (count = 0; count < 256; count++) { if (arc_proto_map[count] == proto) @@ -261,8 +270,11 @@ static int get_arcbuf(struct net_device struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int buf = -1, i; - if (!atomic_dec_and_test(&lp->buf_lock)) /* already in this function */ - BUGMSG(D_NORMAL, "get_arcbuf: overlap (%d)!\n", lp->buf_lock.counter); + if (!atomic_dec_and_test(&lp->buf_lock)) { + /* already in this function */ + BUGMSG(D_NORMAL, "get_arcbuf: overlap (%d)!\n", + lp->buf_lock.counter); + } else { /* we can continue */ if (lp->next_buf >= 5) lp->next_buf -= 5; @@ -312,7 +324,7 @@ void arcdev_setup(struct net_device *dev dev->mtu = choose_mtu(); dev->addr_len = ARCNET_ALEN; - dev->tx_queue_len = 30; + dev->tx_queue_len = 100; dev->broadcast[0] = 0x00; /* for us, broadcasts are address 0 */ dev->watchdog_timeo = TX_TIMEOUT; @@ -334,8 +346,16 @@ void arcdev_setup(struct net_device *dev struct net_device *alloc_arcdev(char *name) { - return alloc_netdev(sizeof(struct arcnet_local), - name && *name ? name : "arc%d", arcdev_setup); + struct net_device *dev; + + dev = alloc_netdev(sizeof(struct arcnet_local), + name && *name ? name : "arc%d", arcdev_setup); + if(dev) { + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + lp->lock = SPIN_LOCK_UNLOCKED; + } + + return dev; } /* @@ -351,6 +371,8 @@ static int arcnet_open(struct net_device struct arcnet_local *lp = (struct arcnet_local *) dev->priv; int count, newmtu, error; + BUGMSG(D_INIT,"opened."); + if (!try_module_get(lp->hw.owner)) return -ENODEV; @@ -377,6 +399,8 @@ static int arcnet_open(struct net_device if (newmtu < dev->mtu) dev->mtu = newmtu; + BUGMSG(D_INIT, "arcnet_open: mtu: %d.\n", dev->mtu); + /* autodetect the encapsulation for each host. */ memset(lp->default_proto, 0, sizeof(lp->default_proto)); @@ -390,6 +414,7 @@ static int arcnet_open(struct net_device /* initialize buffers */ atomic_set(&lp->buf_lock, 1); + lp->next_buf = lp->first_free_buf = 0; release_arcbuf(dev, 0); release_arcbuf(dev, 1); @@ -411,17 +436,24 @@ static int arcnet_open(struct net_device BUGMSG(D_NORMAL, "WARNING! Station address FF may confuse " "DOS networking programs!\n"); - if (ASTATUS() & RESETflag) + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); + if (ASTATUS() & RESETflag) { + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); ACOMMAND(CFLAGScmd | RESETclear); + } + + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); /* make sure we're ready to receive IRQ's. */ AINTMASK(0); udelay(1); /* give it time to set the mask before * we reset it again. (may not even be * necessary) */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); lp->intmask = NORXflag | RECONflag; AINTMASK(lp->intmask); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); netif_start_queue(dev); @@ -467,32 +499,41 @@ static int arcnet_header(struct sk_buff daddr ? *(uint8_t *) daddr : -1, type, type, len); - if (len != skb->len) + if (skb->len!=0 && len != skb->len) BUGMSG(D_NORMAL, "arcnet_header: Yikes! skb->len(%d) != len(%d)!\n", skb->len, len); - /* - * if the dest addr isn't provided, we can't choose an encapsulation! - * Store the packet type (eg. ETH_P_IP) for now, and we'll push on a - * real header when we do rebuild_header. - */ - if (!daddr) { + + /* Type is host order - ? */ + if(type == ETH_P_ARCNET) { + proto = arc_raw_proto; + BUGMSG(D_DEBUG, "arc_raw_proto used. proto='%c'\n",proto->suffix); + _daddr = daddr ? *(uint8_t *) daddr : 0; + } + else if (!daddr) { + /* + * if the dest addr isn't provided, we can't choose an encapsulation! + * Store the packet type (eg. ETH_P_IP) for now, and we'll push on a + * real header when we do rebuild_header. + */ *(uint16_t *) skb_push(skb, 2) = type; if (skb->nh.raw - skb->mac.raw != 2) BUGMSG(D_NORMAL, "arcnet_header: Yikes! diff (%d) is not 2!\n", (int)(skb->nh.raw - skb->mac.raw)); return -2; /* return error -- can't transmit yet! */ } - /* otherwise, we can just add the header as usual. */ - _daddr = *(uint8_t *) daddr; - proto_num = lp->default_proto[_daddr]; - proto = arc_proto_map[proto_num]; - BUGMSG(D_DURING, "building header for %02Xh using protocol '%c'\n", - proto_num, proto->suffix); - if (proto == &arc_proto_null && arc_bcast_proto != proto) { - BUGMSG(D_DURING, "actually, let's use '%c' instead.\n", - arc_bcast_proto->suffix); - proto = arc_bcast_proto; + else { + /* otherwise, we can just add the header as usual. */ + _daddr = *(uint8_t *) daddr; + proto_num = lp->default_proto[_daddr]; + proto = arc_proto_map[proto_num]; + BUGMSG(D_DURING, "building header for %02Xh using protocol '%c'\n", + proto_num, proto->suffix); + if (proto == &arc_proto_null && arc_bcast_proto != proto) { + BUGMSG(D_DURING, "actually, let's use '%c' instead.\n", + arc_bcast_proto->suffix); + proto = arc_bcast_proto; + } } return proto->build_header(skb, dev, type, _daddr); } @@ -519,6 +560,7 @@ static int arcnet_rebuild_header(struct return 0; } type = *(uint16_t *) skb_pull(skb, 2); + BUGMSG(D_DURING, "rebuild header for protocol %Xh\n", type); if (type == ETH_P_IP) { #ifdef CONFIG_INET @@ -555,10 +597,12 @@ static int arcnet_send_packet(struct sk_ struct arc_rfc1201 *soft; struct ArcProto *proto; int txbuf; + unsigned long flags; + int freeskb = 0; BUGMSG(D_DURING, - "transmit requested (status=%Xh, txbufs=%d/%d, len=%d)\n", - ASTATUS(), lp->cur_tx, lp->next_tx, skb->len); + "transmit requested (status=%Xh, txbufs=%d/%d, len=%d, protocol %x)\n", + ASTATUS(), lp->cur_tx, lp->next_tx, skb->len,skb->protocol); pkt = (struct archdr *) skb->data; soft = &pkt->soft.rfc1201; @@ -578,38 +622,49 @@ static int arcnet_send_packet(struct sk_ /* We're busy transmitting a packet... */ netif_stop_queue(dev); + spin_lock_irqsave(&lp->lock, flags); AINTMASK(0); txbuf = get_arcbuf(dev); if (txbuf != -1) { - if (proto->prepare_tx(dev, pkt, skb->len, txbuf)) { - /* done right away */ + if (proto->prepare_tx(dev, pkt, skb->len, txbuf) && + !proto->ack_tx) { + /* done right away and we don't want to acknowledge + the package later - forget about it now */ lp->stats.tx_bytes += skb->len; - dev_kfree_skb(skb); + freeskb = 1; } else { /* do it the 'split' way */ lp->outgoing.proto = proto; lp->outgoing.skb = skb; lp->outgoing.pkt = pkt; - if (!proto->continue_tx) - BUGMSG(D_NORMAL, "bug! prep_tx==0, but no continue_tx!\n"); - else if (proto->continue_tx(dev, txbuf)) { - BUGMSG(D_NORMAL, - "bug! continue_tx finished the first time! " - "(proto='%c')\n", proto->suffix); + if (proto->continue_tx && + proto->continue_tx(dev, txbuf)) { + BUGMSG(D_NORMAL, + "bug! continue_tx finished the first time! " + "(proto='%c')\n", proto->suffix); } } lp->next_tx = txbuf; - } else - dev_kfree_skb(skb); + } else { + freeskb = 1; + } + BUGMSG(D_DEBUG, "%s: %d: %s, status: %x\n",__FILE__,__LINE__,__FUNCTION__,ASTATUS()); /* make sure we didn't ignore a TX IRQ while we were in here */ AINTMASK(0); - lp->intmask |= TXFREEflag; + + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); + lp->intmask |= TXFREEflag|EXCNAKflag; AINTMASK(lp->intmask); + BUGMSG(D_DEBUG, "%s: %d: %s, status: %x\n",__FILE__,__LINE__,__FUNCTION__,ASTATUS()); + spin_unlock_irqrestore(&lp->lock, flags); + if (freeskb) { + dev_kfree_skb(skb); + } return 0; /* no need to try again */ } @@ -628,7 +683,7 @@ static int go_tx(struct net_device *dev) if (lp->cur_tx != -1 || lp->next_tx == -1) return 0; - BUGLVL(D_TX) arcnet_dump_packet(dev, lp->next_tx, "go_tx"); + BUGLVL(D_TX) arcnet_dump_packet(dev, lp->next_tx, "go_tx", 0); lp->cur_tx = lp->next_tx; lp->next_tx = -1; @@ -640,7 +695,8 @@ static int go_tx(struct net_device *dev) lp->stats.tx_packets++; lp->lasttrans_dest = lp->lastload_dest; lp->lastload_dest = 0; - lp->intmask |= TXFREEflag; + lp->excnak_pending = 0; + lp->intmask |= TXFREEflag|EXCNAKflag; return 1; } @@ -654,7 +710,7 @@ static void arcnet_timeout(struct net_de int status = ASTATUS(); char *msg; - spin_lock_irqsave(&arcnet_lock, flags); + spin_lock_irqsave(&lp->lock, flags); if (status & TXFREEflag) { /* transmit _DID_ finish */ msg = " - missed IRQ?"; } else { @@ -665,12 +721,12 @@ static void arcnet_timeout(struct net_de } lp->stats.tx_errors++; - /* make sure we didn't miss a TX IRQ */ + /* make sure we didn't miss a TX or a EXC NAK IRQ */ AINTMASK(0); - lp->intmask |= TXFREEflag; + lp->intmask |= TXFREEflag|EXCNAKflag; AINTMASK(lp->intmask); - spin_unlock_irqrestore(&arcnet_lock, flags); + spin_unlock_irqrestore(&lp->lock, flags); if (jiffies - lp->last_timeout > 10*HZ) { BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n", @@ -692,18 +748,19 @@ irqreturn_t arcnet_interrupt(int irq, vo { struct net_device *dev = dev_id; struct arcnet_local *lp; - int recbuf, status, didsomething, boguscount; + int recbuf, status, diagstatus, didsomething, boguscount; + int retval = IRQ_NONE; BUGMSG(D_DURING, "\n"); BUGMSG(D_DURING, "in arcnet_interrupt\n"); - - spin_lock(&arcnet_lock); lp = (struct arcnet_local *) dev->priv; if (!lp) BUG(); + spin_lock(&lp->lock); + /* * RESET flag was enabled - if device is not running, we must clear it right * away (but nothing else). @@ -712,7 +769,7 @@ irqreturn_t arcnet_interrupt(int irq, vo if (ASTATUS() & RESETflag) ACOMMAND(CFLAGScmd | RESETclear); AINTMASK(0); - spin_unlock(&arcnet_lock); + spin_unlock(&lp->lock); return IRQ_HANDLED; } @@ -722,6 +779,10 @@ irqreturn_t arcnet_interrupt(int irq, vo boguscount = 5; do { status = ASTATUS(); + diagstatus = (status >> 8) & 0xFF; + + BUGMSG(D_DEBUG, "%s: %d: %s: status=%x\n", + __FILE__,__LINE__,__FUNCTION__,status); didsomething = 0; /* @@ -761,24 +822,55 @@ irqreturn_t arcnet_interrupt(int irq, vo } didsomething++; } + + if((diagstatus & EXCNAKflag)) { + BUGMSG(D_DURING, "EXCNAK IRQ (diagstat=%Xh)\n", + diagstatus); + + ACOMMAND(NOTXcmd); /* disable transmit */ + lp->excnak_pending = 1; + + ACOMMAND(EXCNAKclear); + lp->intmask &= ~(EXCNAKflag); + didsomething++; + } + + /* a transmit finished, and we're interested in it. */ if ((status & lp->intmask & TXFREEflag) || lp->timed_out) { - lp->intmask &= ~TXFREEflag; + lp->intmask &= ~(TXFREEflag|EXCNAKflag); BUGMSG(D_DURING, "TX IRQ (stat=%Xh)\n", status); - if (lp->cur_tx != -1 && !(status & TXACKflag) && !lp->timed_out) { - if (lp->lasttrans_dest != 0) { - BUGMSG(D_EXTRA, "transmit was not acknowledged! " - "(status=%Xh, dest=%02Xh)\n", - status, lp->lasttrans_dest); - lp->stats.tx_errors++; - lp->stats.tx_carrier_errors++; - } else { - BUGMSG(D_DURING, - "broadcast was not acknowledged; that's normal " - "(status=%Xh, dest=%02Xh)\n", - status, lp->lasttrans_dest); + if (lp->cur_tx != -1 && !lp->timed_out) { + if(!(status & TXACKflag)) { + if (lp->lasttrans_dest != 0) { + BUGMSG(D_EXTRA, + "transmit was not acknowledged! " + "(status=%Xh, dest=%02Xh)\n", + status, lp->lasttrans_dest); + lp->stats.tx_errors++; + lp->stats.tx_carrier_errors++; + } else { + BUGMSG(D_DURING, + "broadcast was not acknowledged; that's normal " + "(status=%Xh, dest=%02Xh)\n", + status, lp->lasttrans_dest); + } + } + + if (lp->outgoing.proto && + lp->outgoing.proto->ack_tx) { + int ackstatus; + if(status & TXACKflag) + ackstatus=2; + else if(lp->excnak_pending) + ackstatus=1; + else + ackstatus=0; + + lp->outgoing.proto + ->ack_tx(dev, ackstatus); } } if (lp->cur_tx != -1) @@ -798,8 +890,11 @@ irqreturn_t arcnet_interrupt(int irq, vo if (lp->outgoing.proto->continue_tx(dev, txbuf)) { /* that was the last segment */ lp->stats.tx_bytes += lp->outgoing.skb->len; - dev_kfree_skb_irq(lp->outgoing.skb); - lp->outgoing.proto = NULL; + if(!lp->outgoing.proto->ack_tx) + { + dev_kfree_skb_irq(lp->outgoing.skb); + lp->outgoing.proto = NULL; + } } lp->next_tx = txbuf; } @@ -810,7 +905,7 @@ irqreturn_t arcnet_interrupt(int irq, vo } /* now process the received packet, if any */ if (recbuf != -1) { - BUGLVL(D_RX) arcnet_dump_packet(dev, recbuf, "rx irq"); + BUGLVL(D_RX) arcnet_dump_packet(dev, recbuf, "rx irq", 0); arcnet_rx(dev, recbuf); release_arcbuf(dev, recbuf); @@ -868,6 +963,10 @@ irqreturn_t arcnet_interrupt(int irq, vo BUGMSG(D_DURING, "not recon: clearing counters anyway.\n"); } + + if(didsomething) { + retval |= IRQ_HANDLED; + } } while (--boguscount && didsomething); @@ -880,8 +979,8 @@ irqreturn_t arcnet_interrupt(int irq, vo udelay(1); AINTMASK(lp->intmask); - spin_unlock(&arcnet_lock); - return IRQ_RETVAL(didsomething); + spin_unlock(&lp->lock); + return retval; } @@ -908,7 +1007,7 @@ void arcnet_rx(struct net_device *dev, i } /* get the full header, if possible */ - if (sizeof(pkt.soft) < length) + if (sizeof(pkt.soft) <= length) lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(pkt.soft)); else { memset(&pkt.soft, 0, sizeof(pkt.soft)); @@ -923,7 +1022,7 @@ void arcnet_rx(struct net_device *dev, i lp->stats.rx_bytes += length + ARC_HDR_SIZE; /* call the right receiver for the protocol */ - if (arc_proto_map[soft->proto] != &arc_proto_null) { + if (arc_proto_map[soft->proto]->is_ip) { BUGLVL(D_PROTO) { struct ArcProto *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]], diff -puN drivers/net/arcnet/arc-rawmode.c~arcnet-fixes drivers/net/arcnet/arc-rawmode.c --- 25/drivers/net/arcnet/arc-rawmode.c~arcnet-fixes 2004-11-21 22:42:30.232086264 -0800 +++ 25-akpm/drivers/net/arcnet/arc-rawmode.c 2004-11-21 22:42:30.254082920 -0800 @@ -42,7 +42,6 @@ static int build_header(struct sk_buff * static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); - struct ArcProto rawmode_proto = { .suffix = 'r', @@ -50,6 +49,8 @@ struct ArcProto rawmode_proto = .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; @@ -121,7 +122,8 @@ static void rx(struct net_device *dev, i BUGLVL(D_SKB) arcnet_dump_skb(dev, skb, "rx"); - skb->protocol = 0; + skb->protocol = __constant_htons(ETH_P_ARCNET); +; netif_rx(skb); dev->last_rx = jiffies; } @@ -190,6 +192,9 @@ static int prepare_tx(struct net_device } else hard->offset[0] = ofs = 256 - length; + BUGMSG(D_DURING, "prepare_tx: length=%d ofs=%d\n", + length,ofs); + lp->hw.copy_to_card(dev, bufnum, 0, hard, ARC_HDR_SIZE); lp->hw.copy_to_card(dev, bufnum, ofs, &pkt->soft, length); diff -puN /dev/null drivers/net/arcnet/capmode.c --- /dev/null 2003-09-15 06:40:47.000000000 -0700 +++ 25-akpm/drivers/net/arcnet/capmode.c 2004-11-21 22:42:30.256082616 -0800 @@ -0,0 +1,296 @@ +/* + * Linux ARCnet driver - "cap mode" packet encapsulation. + * It adds sequence numbers to packets for communicating between a user space + * application and the driver. After a transmit it sends a packet with protocol + * byte 0 back up to the userspace containing the sequence number of the packet + * plus the transmit-status on the ArcNet. + * + * Written 2002-4 by Esben Nielsen, Vestas Wind Systems A/S + * Derived from arc-rawmode.c by Avery Pennarun. + * arc-rawmode was in turned based on skeleton.c, see below. + * + * ********************** + * + * The original copyright of skeleton.c was as follows: + * + * skeleton.c Written 1993 by Donald Becker. + * Copyright 1993 United States Government as represented by the + * Director, National Security Agency. This software may only be used + * and distributed according to the terms of the GNU General Public License as + * modified by SRC, incorporated herein by reference. + * + * ********************** + * + * For more details, see drivers/net/arcnet.c + * + * ********************** + */ + +#include +#include +#include +#include +#include +#include +#include + +#define VERSION "arcnet: cap mode (`c') encapsulation support loaded.\n" + + +static void rx(struct net_device *dev, int bufnum, + struct archdr *pkthdr, int length); +static int build_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + uint8_t daddr); +static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, + int bufnum); +static int ack_tx(struct net_device *dev, int acked); + + +struct ArcProto capmode_proto = +{ + 'r', + XMTU, + 0, + rx, + build_header, + prepare_tx, + NULL, + ack_tx +}; + + +void arcnet_cap_init(void) +{ + int count; + + for (count = 1; count <= 8; count++) + if (arc_proto_map[count] == arc_proto_default) + arc_proto_map[count] = &capmode_proto; + + /* for cap mode, we only set the bcast proto if there's no better one */ + if (arc_bcast_proto == arc_proto_default) + arc_bcast_proto = &capmode_proto; + + arc_proto_default = &capmode_proto; + arc_raw_proto = &capmode_proto; +} + + +#ifdef MODULE + +int __init init_module(void) +{ + printk(VERSION); + arcnet_cap_init(); + return 0; +} + +void cleanup_module(void) +{ + arcnet_unregister_proto(&capmode_proto); +} + +MODULE_LICENSE("GPL"); +#endif /* MODULE */ + + + +/* packet receiver */ +static void rx(struct net_device *dev, int bufnum, + struct archdr *pkthdr, int length) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct sk_buff *skb; + struct archdr *pkt = pkthdr; + char *pktbuf, *pkthdrbuf; + int ofs; + + BUGMSG(D_DURING, "it's a raw(cap) packet (length=%d)\n", length); + + if (length >= MinTU) + ofs = 512 - length; + else + ofs = 256 - length; + + skb = alloc_skb(length + ARC_HDR_SIZE + sizeof(int), GFP_ATOMIC); + if (skb == NULL) { + BUGMSG(D_NORMAL, "Memory squeeze, dropping packet.\n"); + lp->stats.rx_dropped++; + return; + } + skb_put(skb, length + ARC_HDR_SIZE + sizeof(int)); + skb->dev = dev; + + pkt = (struct archdr *) skb->data; + + skb->mac.raw = skb->data; + skb_pull(skb, ARC_HDR_SIZE); + + /* up to sizeof(pkt->soft) has already been copied from the card */ + /* squeeze in an int for the cap encapsulation */ + + /* use these variables to be sure we count in bytes, not in + sizeof(struct archdr) */ + pktbuf=(char*)pkt; + pkthdrbuf=(char*)pkthdr; + memcpy(pktbuf, pkthdrbuf, ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto)); + memcpy(pktbuf+ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto)+sizeof(int), + pkthdrbuf+ARC_HDR_SIZE+sizeof(pkt->soft.cap.proto), + sizeof(struct archdr)-ARC_HDR_SIZE-sizeof(pkt->soft.cap.proto)); + + if (length > sizeof(pkt->soft)) + lp->hw.copy_from_card(dev, bufnum, ofs + sizeof(pkt->soft), + pkt->soft.raw + sizeof(pkt->soft) + + sizeof(int), + length - sizeof(pkt->soft)); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, skb, "rx"); + + skb->protocol = __constant_htons(ETH_P_ARCNET); +; + netif_rx(skb); + dev->last_rx = jiffies; +} + + +/* + * Create the ARCnet hard/soft headers for cap mode. + * There aren't any soft headers in cap mode - not even the protocol id. + */ +static int build_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + uint8_t daddr) +{ + int hdr_size = ARC_HDR_SIZE; + struct archdr *pkt = (struct archdr *) skb_push(skb, hdr_size); + + BUGMSG(D_PROTO, "Preparing header for cap packet %x.\n", + *((int*)&pkt->soft.cap.cookie[0])); + /* + * Set the source hardware address. + * + * This is pretty pointless for most purposes, but it can help in + * debugging. ARCnet does not allow us to change the source address in + * the actual packet sent) + */ + pkt->hard.source = *dev->dev_addr; + + /* see linux/net/ethernet/eth.c to see where I got the following */ + + if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) { + /* + * FIXME: fill in the last byte of the dest ipaddr here to better + * comply with RFC1051 in "noarp" mode. + */ + pkt->hard.dest = 0; + return hdr_size; + } + /* otherwise, just fill it in and go! */ + pkt->hard.dest = daddr; + + return hdr_size; /* success */ +} + + +static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, + int bufnum) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct arc_hardware *hard = &pkt->hard; + int ofs; + + + /* hard header is not included in packet length */ + length -= ARC_HDR_SIZE; + /* And neither is the cookie field */ + length -= sizeof(int); + + BUGMSG(D_DURING, "prepare_tx: txbufs=%d/%d/%d\n", + lp->next_tx, lp->cur_tx, bufnum); + + BUGMSG(D_PROTO, "Sending for cap packet %x.\n", + *((int*)&pkt->soft.cap.cookie[0])); + + if (length > XMTU) { + /* should never happen! other people already check for this. */ + BUGMSG(D_NORMAL, "Bug! prepare_tx with size %d (> %d)\n", + length, XMTU); + length = XMTU; + } + if (length > MinTU) { + hard->offset[0] = 0; + hard->offset[1] = ofs = 512 - length; + } else if (length > MTU) { + hard->offset[0] = 0; + hard->offset[1] = ofs = 512 - length - 3; + } else + hard->offset[0] = ofs = 256 - length; + + BUGMSG(D_DURING, "prepare_tx: length=%d ofs=%d\n", + length,ofs); + + // Copy the arcnet-header + the protocol byte down: + lp->hw.copy_to_card(dev, bufnum, 0, hard, ARC_HDR_SIZE); + lp->hw.copy_to_card(dev, bufnum, ofs, &pkt->soft.cap.proto, + sizeof(pkt->soft.cap.proto)); + + // Skip the extra integer we have written into it as a cookie + // but write the rest of the message: + lp->hw.copy_to_card(dev, bufnum, ofs+1, + ((unsigned char*)&pkt->soft.cap.mes),length-1); + + lp->lastload_dest = hard->dest; + + return 1; /* done */ +} + + +static int ack_tx(struct net_device *dev, int acked) +{ + struct arcnet_local *lp = (struct arcnet_local *) dev->priv; + struct sk_buff *ackskb; + struct archdr *ackpkt; + int length=sizeof(struct arc_cap); + + BUGMSG(D_DURING, "capmode: ack_tx: protocol: %x: result: %d\n", + lp->outgoing.skb->protocol, acked); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, lp->outgoing.skb, "ack_tx"); + + /* Now alloc a skb to send back up through the layers: */ + ackskb = alloc_skb(length + ARC_HDR_SIZE , GFP_ATOMIC); + if (ackskb == NULL) { + BUGMSG(D_NORMAL, "Memory squeeze, can't acknowledge.\n"); + goto free_outskb; + } + + skb_put(ackskb, length + ARC_HDR_SIZE ); + ackskb->dev = dev; + + ackpkt = (struct archdr *) ackskb->data; + + ackskb->mac.raw = ackskb->data; + /* skb_pull(ackskb, ARC_HDR_SIZE); */ + + + memcpy(ackpkt, lp->outgoing.skb->data, ARC_HDR_SIZE+sizeof(struct arc_cap)); + ackpkt->soft.cap.proto=0; /* using protocol 0 for acknowledge */ + ackpkt->soft.cap.mes.ack=acked; + + BUGMSG(D_PROTO, "Ackknowledge for cap packet %x.\n", + *((int*)&ackpkt->soft.cap.cookie[0])); + + ackskb->protocol = __constant_htons(ETH_P_ARCNET); + + BUGLVL(D_SKB) arcnet_dump_skb(dev, ackskb, "ack_tx_recv"); + netif_rx(ackskb); + + free_outskb: + dev_kfree_skb_irq(lp->outgoing.skb); + lp->outgoing.proto = NULL; /* We are always finished when in this protocol */ + + return 0; +} diff -puN drivers/net/arcnet/com20020.c~arcnet-fixes drivers/net/arcnet/com20020.c --- 25/drivers/net/arcnet/com20020.c~arcnet-fixes 2004-11-21 22:42:30.233086112 -0800 +++ 25-akpm/drivers/net/arcnet/com20020.c 2004-11-21 22:42:30.257082464 -0800 @@ -117,7 +117,7 @@ int com20020_check(struct net_device *de lp->config = 0x21 | (lp->timeout << 3) | (lp->backplane << 2); /* set node ID to 0x42 (but transmitter is disabled, so it's okay) */ SETCONF; - outb(0x42, ioaddr + 7); + outb(0x42, ioaddr + BUS_ALIGN*7); status = ASTATUS(); @@ -129,7 +129,7 @@ int com20020_check(struct net_device *de /* Enable TX */ outb(0x39, _CONFIG); - outb(inb(ioaddr + 8), ioaddr + 7); + outb(inb(ioaddr + BUS_ALIGN*8), ioaddr + BUS_ALIGN*7); ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear); @@ -173,7 +173,7 @@ int com20020_found(struct net_device *de dev->set_multicast_list = com20020_set_mc_list; if (!dev->dev_addr[0]) - dev->dev_addr[0] = inb(ioaddr + 8); /* FIXME: do this some other way! */ + dev->dev_addr[0] = inb(ioaddr + BUS_ALIGN*8); /* FIXME: do this some other way! */ SET_SUBADR(SUB_SETUP1); outb(lp->setup, _XREG); @@ -188,7 +188,6 @@ int com20020_found(struct net_device *de outb(0x18, _COMMAND); } - lp->config = 0x20 | (lp->timeout << 3) | (lp->backplane << 2) | 1; /* Default 0x38 + register: Node ID */ SETCONF; @@ -235,15 +234,19 @@ int com20020_found(struct net_device *de static int com20020_reset(struct net_device *dev, int really_reset) { struct arcnet_local *lp = (struct arcnet_local *) dev->priv; - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; u_char inbyte; + BUGMSG(D_DEBUG, "%s: %d: %s: dev: %p, lp: %p, dev->name: %s\n", + __FILE__,__LINE__,__FUNCTION__,dev,lp,dev->name); BUGMSG(D_INIT, "Resetting %s (status=%02Xh)\n", dev->name, ASTATUS()); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2); /* power-up defaults */ SETCONF; + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); if (really_reset) { /* reset the card */ @@ -251,17 +254,22 @@ static int com20020_reset(struct net_dev mdelay(RESETtime * 2); /* COM20020 seems to be slower sometimes */ } /* clear flags & end reset */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear); /* verify that the ARCnet signature byte is present */ + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); com20020_copy_from_card(dev, 0, 0, &inbyte, 1); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); if (inbyte != TESTvalue) { + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); BUGMSG(D_NORMAL, "reset failed: TESTvalue not present.\n"); return 1; } /* enable extended (512-byte) packets */ ACOMMAND(CONFIGcmd | EXTconf); + BUGMSG(D_DEBUG, "%s: %d: %s\n",__FILE__,__LINE__,__FUNCTION__); /* done! return success. */ return 0; @@ -270,22 +278,24 @@ static int com20020_reset(struct net_dev static void com20020_setmask(struct net_device *dev, int mask) { - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; + BUGMSG(D_DURING, "Setting mask to %x at %x\n",mask,ioaddr); AINTMASK(mask); } static void com20020_command(struct net_device *dev, int cmd) { - short ioaddr = dev->base_addr; + u_int ioaddr = dev->base_addr; ACOMMAND(cmd); } static int com20020_status(struct net_device *dev) { - short ioaddr = dev->base_addr; - return ASTATUS(); + u_int ioaddr = dev->base_addr; + + return ASTATUS() + (ADIAGSTATUS()<<8); } static void com20020_close(struct net_device *dev) diff -puN drivers/net/arcnet/com20020-isa.c~arcnet-fixes drivers/net/arcnet/com20020-isa.c --- 25/drivers/net/arcnet/com20020-isa.c~arcnet-fixes 2004-11-21 22:42:30.235085808 -0800 +++ 25-akpm/drivers/net/arcnet/com20020-isa.c 2004-11-21 22:42:30.258082312 -0800 @@ -41,7 +41,6 @@ #include - #define VERSION "arcnet: COM20020 ISA support (by David Woodhouse et al.)\n" diff -puN drivers/net/arcnet/Kconfig~arcnet-fixes drivers/net/arcnet/Kconfig --- 25/drivers/net/arcnet/Kconfig~arcnet-fixes 2004-11-21 22:42:30.236085656 -0800 +++ 25-akpm/drivers/net/arcnet/Kconfig 2004-11-21 22:42:30.258082312 -0800 @@ -59,6 +59,25 @@ config ARCNET_RAW to work unless talking to a copy of the same Linux arcnet driver, but perhaps marginally faster in that case. +config ARCNET_CAP + tristate "Enable CAP mode packet interface" + depends on ARCNET + help + ARCnet "cap mode" packet encapsulation. Used to get the hardware + acknowledge back to userspace. After the initial protocol byte every + packet is stuffed with an extra 4 byte "cookie" which doesn't + actually appear on the network. After transmit the driver will send + back a packet with protocol byte 0 containing the status of the + transmition: + 0=no hardware acknowledge + 1=excessive nak + 2=transmition accepted by the reciever hardware + + Received packets are also stuffed with the extra 4 bytes but it will + be random data. + + Cap only listens to protocol 1-8. + config ARCNET_COM90xx tristate "ARCnet COM90xx (normal) chipset driver" depends on ARCNET diff -puN drivers/net/arcnet/Makefile~arcnet-fixes drivers/net/arcnet/Makefile --- 25/drivers/net/arcnet/Makefile~arcnet-fixes 2004-11-21 22:42:30.238085352 -0800 +++ 25-akpm/drivers/net/arcnet/Makefile 2004-11-21 22:42:30.258082312 -0800 @@ -5,6 +5,7 @@ obj-$(CONFIG_ARCNET) += arcnet.o obj-$(CONFIG_ARCNET_1201) += rfc1201.o obj-$(CONFIG_ARCNET_1051) += rfc1051.o obj-$(CONFIG_ARCNET_RAW) += arc-rawmode.o +obj-$(CONFIG_ARCNET_CAP) += capmode.o obj-$(CONFIG_ARCNET_COM90xx) += com90xx.o obj-$(CONFIG_ARCNET_COM90xxIO) += com90io.o obj-$(CONFIG_ARCNET_RIM_I) += arc-rimi.o diff -puN drivers/net/arcnet/rfc1051.c~arcnet-fixes drivers/net/arcnet/rfc1051.c --- 25/drivers/net/arcnet/rfc1051.c~arcnet-fixes 2004-11-21 22:42:30.239085200 -0800 +++ 25-akpm/drivers/net/arcnet/rfc1051.c 2004-11-21 22:42:30.259082160 -0800 @@ -47,9 +47,12 @@ struct ArcProto rfc1051_proto = { .suffix = 's', .mtu = XMTU - RFC1051_HDR_SIZE, + .is_ip = 1, .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, + .continue_tx = NULL, + .ack_tx = NULL }; diff -puN drivers/net/arcnet/rfc1201.c~arcnet-fixes drivers/net/arcnet/rfc1201.c --- 25/drivers/net/arcnet/rfc1201.c~arcnet-fixes 2004-11-21 22:42:30.240085048 -0800 +++ 25-akpm/drivers/net/arcnet/rfc1201.c 2004-11-21 22:42:30.259082160 -0800 @@ -47,10 +47,12 @@ struct ArcProto rfc1201_proto = { .suffix = 'a', .mtu = 1500, /* could be more, but some receivers can't handle it... */ + .is_ip = 1, /* This is for sending IP and ARP packages */ .rx = rx, .build_header = build_header, .prepare_tx = prepare_tx, .continue_tx = continue_tx, + .ack_tx = NULL }; diff -puN include/linux/arcdevice.h~arcnet-fixes include/linux/arcdevice.h --- 25/include/linux/arcdevice.h~arcnet-fixes 2004-11-21 22:42:30.242084744 -0800 +++ 25-akpm/include/linux/arcdevice.h 2004-11-21 22:42:30.260082008 -0800 @@ -25,7 +25,6 @@ #define bool int #endif - /* * RECON_THRESHOLD is the maximum number of RECON messages to receive * within one minute before printing a "cabling problem" warning. The @@ -74,6 +73,7 @@ #define D_SKB 1024 /* show skb's */ #define D_SKB_SIZE 2048 /* show skb sizes */ #define D_TIMING 4096 /* show time needed to copy buffers to card */ +#define D_DEBUG 8192 /* Very detailed debug line for line */ #ifndef ARCNET_DEBUG_MAX #define ARCNET_DEBUG_MAX (127) /* change to ~0 if you want detailed debugging */ @@ -135,6 +135,7 @@ extern int arcnet_debug; #define TXACKflag 0x02 /* transmitted msg. ackd */ #define RECONflag 0x04 /* network reconfigured */ #define TESTflag 0x08 /* test flag */ +#define EXCNAKflag 0x08 /* excesive nak flag */ #define RESETflag 0x10 /* power-on-reset */ #define RES1flag 0x20 /* reserved - usually set by jumper */ #define RES2flag 0x40 /* reserved - usually set by jumper */ @@ -162,6 +163,8 @@ extern int arcnet_debug; #define RESETclear 0x08 /* power-on-reset */ #define CONFIGclear 0x10 /* system reconfigured */ +#define EXCNAKclear 0x0E /* Clear and acknowledge the excive nak bit */ + /* flags for "load test flags" command */ #define TESTload 0x08 /* test flag (diagnostic) */ @@ -187,6 +190,7 @@ extern int arcnet_debug; struct ArcProto { char suffix; /* a for RFC1201, e for ether-encap, etc. */ int mtu; /* largest possible packet */ + int is_ip; /* This is a ip plugin - not a raw thing */ void (*rx) (struct net_device * dev, int bufnum, struct archdr * pkthdr, int length); @@ -197,9 +201,11 @@ struct ArcProto { int (*prepare_tx) (struct net_device * dev, struct archdr * pkt, int length, int bufnum); int (*continue_tx) (struct net_device * dev, int bufnum); + int (*ack_tx) (struct net_device * dev, int acked); }; -extern struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto; +extern struct ArcProto *arc_proto_map[256], *arc_proto_default, + *arc_bcast_proto, *arc_raw_proto; extern struct ArcProto arc_proto_null; @@ -251,6 +257,10 @@ struct arcnet_local { char *card_name; /* card ident string */ int card_flags; /* special card features */ + + /* On preemtive and SMB a lock is needed */ + spinlock_t lock; + /* * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of * which can be used for either sending or receiving. The new dynamic @@ -279,6 +289,8 @@ struct arcnet_local { int num_recons; /* number of RECONs between first and last. */ bool network_down; /* do we think the network is down? */ + bool excnak_pending; /* We just got an excesive nak interrupt */ + struct { uint16_t sequence; /* sequence number (incs with each packet) */ uint16_t aborted_seq; @@ -323,9 +335,10 @@ void arcnet_dump_skb(struct net_device * #endif #if (ARCNET_DEBUG_MAX & D_RX) || (ARCNET_DEBUG_MAX & D_TX) -void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc); +void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, + int take_arcnet_lock); #else -#define arcnet_dump_packet(dev, bufnum, desc) ; +#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) ; #endif void arcnet_unregister_proto(struct ArcProto *proto); diff -puN include/linux/com20020.h~arcnet-fixes include/linux/com20020.h --- 25/include/linux/com20020.h~arcnet-fixes 2004-11-21 22:42:30.243084592 -0800 +++ 25-akpm/include/linux/com20020.h 2004-11-21 22:42:30.261081856 -0800 @@ -34,17 +34,24 @@ int com20020_found(struct net_device *de #define ARCNET_TOTAL_SIZE 8 /* various register addresses */ -#define _INTMASK (ioaddr+0) /* writable */ -#define _STATUS (ioaddr+0) /* readable */ -#define _COMMAND (ioaddr+1) /* standard arcnet commands */ -#define _DIAGSTAT (ioaddr+1) /* diagnostic status register */ -#define _ADDR_HI (ioaddr+2) /* control registers for IO-mapped memory */ -#define _ADDR_LO (ioaddr+3) -#define _MEMDATA (ioaddr+4) /* data port for IO-mapped memory */ -#define _SUBADR (ioaddr+5) /* the extended port _XREG refers to */ -#define _CONFIG (ioaddr+6) /* configuration register */ -#define _XREG (ioaddr+7) /* extra registers (indexed by _CONFIG - or _SUBADR) */ +#ifdef CONFIG_SA1100_CT6001 +#define BUS_ALIGN 2 /* 8 bit device on a 16 bit bus - needs padding */ +#else +#define BUS_ALIGN 1 +#endif + + +#define _INTMASK (ioaddr+BUS_ALIGN*0) /* writable */ +#define _STATUS (ioaddr+BUS_ALIGN*0) /* readable */ +#define _COMMAND (ioaddr+BUS_ALIGN*1) /* standard arcnet commands */ +#define _DIAGSTAT (ioaddr+BUS_ALIGN*1) /* diagnostic status register */ +#define _ADDR_HI (ioaddr+BUS_ALIGN*2) /* control registers for IO-mapped memory */ +#define _ADDR_LO (ioaddr+BUS_ALIGN*3) +#define _MEMDATA (ioaddr+BUS_ALIGN*4) /* data port for IO-mapped memory */ +#define _SUBADR (ioaddr+BUS_ALIGN*5) /* the extended port _XREG refers to */ +#define _CONFIG (ioaddr+BUS_ALIGN*6) /* configuration register */ +#define _XREG (ioaddr+BUS_ALIGN*7) /* extra registers (indexed by _CONFIG + or _SUBADR) */ /* in the ADDR_HI register */ #define RDDATAflag 0x80 /* next access is a read (not a write) */ @@ -99,6 +106,7 @@ int com20020_found(struct net_device *de } #define ASTATUS() inb(_STATUS) +#define ADIAGSTATUS() inb(_DIAGSTAT) #define ACOMMAND(cmd) outb((cmd),_COMMAND) #define AINTMASK(msk) outb((msk),_INTMASK) diff -puN include/linux/if_arcnet.h~arcnet-fixes include/linux/if_arcnet.h --- 25/include/linux/if_arcnet.h~arcnet-fixes 2004-11-21 22:42:30.245084288 -0800 +++ 25-akpm/include/linux/if_arcnet.h 2004-11-21 22:42:30.261081856 -0800 @@ -23,6 +23,9 @@ * These are the defined ARCnet Protocol ID's. */ +/* CAP mode */ +/* No macro but uses 1-8 */ + /* RFC1201 Protocol ID's */ #define ARC_P_IP 212 /* 0xD4 */ #define ARC_P_IPV6 196 /* 0xC4: RFC2497 */ @@ -86,6 +89,16 @@ struct arc_eth_encap #define ETH_ENCAP_HDR_SIZE 14 +struct arc_cap +{ + uint8_t proto; + uint8_t cookie[sizeof(int)]; /* Actually NOT sent over the network */ + union { + uint8_t ack; + uint8_t raw[0]; /* 507 bytes */ + } mes; +}; + /* * The data needed by the actual arcnet hardware. * @@ -116,6 +129,7 @@ struct archdr struct arc_rfc1201 rfc1201; struct arc_rfc1051 rfc1051; struct arc_eth_encap eth_encap; + struct arc_cap cap; uint8_t raw[0]; /* 508 bytes */ } soft; }; diff -puN include/linux/if_ether.h~arcnet-fixes include/linux/if_ether.h --- 25/include/linux/if_ether.h~arcnet-fixes 2004-11-21 22:42:30.246084136 -0800 +++ 25-akpm/include/linux/if_ether.h 2004-11-21 22:42:30.262081704 -0800 @@ -91,6 +91,7 @@ #define ETH_P_IRDA 0x0017 /* Linux-IrDA */ #define ETH_P_ECONET 0x0018 /* Acorn Econet */ #define ETH_P_HDLC 0x0019 /* HDLC frames */ +#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */ /* * This is an Ethernet frame header. diff -puN include/linux/net.h~arcnet-fixes include/linux/net.h _ From akpm@osdl.org Sun Nov 21 22:44:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:46 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iViF024831 for ; Sun, 21 Nov 2004 22:44:31 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6hx900606; Sun, 21 Nov 2004 22:43:59 -0800 Message-Id: <200411220643.iAM6hx900606@mail.osdl.org> Subject: [patch 02/13] X.25: When receiving a call, check listening sockets for matching call user data. To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, ahendry@tusc.com.au From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:47 -0800 X-archive-position: 12082 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Andrew Hendry If a listening socket sets call user data, ensure it only receives calls with matching call user data. Also ensure incoming calls with matching call user data dont go to another listening socket. Signed-off-by: Andrew Hendry Signed-off-by: Andrew Morton --- 25-akpm/include/net/x25.h | 1 25-akpm/net/x25/af_x25.c | 62 ++++++++++++++++++++++++++++++++++----------- 25-akpm/net/x25/x25_subr.c | 19 +++++++++++++ 3 files changed, 67 insertions(+), 15 deletions(-) diff -puN include/net/x25.h~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data include/net/x25.h --- 25/include/net/x25.h~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data 2004-11-21 22:42:30.462051304 -0800 +++ 25-akpm/include/net/x25.h 2004-11-21 22:42:30.468050392 -0800 @@ -243,6 +243,7 @@ extern int x25_validate_nr(struct sock extern void x25_write_internal(struct sock *, int); extern int x25_decode(struct sock *, struct sk_buff *, int *, int *, int *, int *, int *); extern void x25_disconnect(struct sock *, int, unsigned char, unsigned char); +extern int x25_check_calluserdata(struct x25_calluserdata *,struct x25_calluserdata *); /* x25_timer.c */ extern void x25_start_heartbeat(struct sock *); diff -puN net/x25/af_x25.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data net/x25/af_x25.c --- 25/net/x25/af_x25.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data 2004-11-21 22:42:30.463051152 -0800 +++ 25-akpm/net/x25/af_x25.c 2004-11-21 22:43:04.031947904 -0800 @@ -223,14 +223,19 @@ static void x25_insert_socket(struct soc /* * Find a socket that wants to accept the Call Request we just - * received. + * received. Check the full list for an address/cud match. + * If no cuds match return the next_best thing, an address match. + * Note: if a listening socket has cud set it must only get calls + * with matching cud. */ -static struct sock *x25_find_listener(struct x25_address *addr) +static struct sock *x25_find_listener(struct x25_address *addr, struct x25_calluserdata *calluserdata) { struct sock *s; + struct sock *next_best; struct hlist_node *node; read_lock_bh(&x25_list_lock); + next_best = NULL; sk_for_each(s, node, &x25_list) if ((!strcmp(addr->x25_addr, @@ -238,9 +243,24 @@ static struct sock *x25_find_listener(st !strcmp(addr->x25_addr, null_x25_address.x25_addr)) && s->sk_state == TCP_LISTEN) { - sock_hold(s); - goto found; + + /* + * Found a listening socket, now check the incoming + * call user data vs this sockets call user data + */ + if (x25_check_calluserdata(&x25_sk(s)->calluserdata, calluserdata)) { + sock_hold(s); + goto found; + } + if (x25_sk(s)->calluserdata.cudlength == 0) { + next_best = s; + } } + if (next_best) { + s = next_best; + sock_hold(s); + goto found; + } s = NULL; found: read_unlock_bh(&x25_list_lock); @@ -814,6 +834,7 @@ int x25_rx_call_request(struct sk_buff * struct x25_opt *makex25; struct x25_address source_addr, dest_addr; struct x25_facilities facilities; + struct x25_calluserdata calluserdata; int len, rc; /* @@ -828,9 +849,27 @@ int x25_rx_call_request(struct sk_buff * skb_pull(skb, x25_addr_ntoa(skb->data, &source_addr, &dest_addr)); /* - * Find a listener for the particular address. + * Get the length of the facilities, skip past them for the moment + * get the call user data because this is needed to determine + * the correct listener + */ + len = skb->data[0] + 1; + skb_pull(skb,len); + + /* + * Incoming Call User Data. + */ + if (skb->len >= 0) { + memcpy(calluserdata.cuddata, skb->data, skb->len); + calluserdata.cudlength = skb->len; + } + + skb_push(skb,len); + + /* + * Find a listener for the particular address/cud pair. */ - sk = x25_find_listener(&source_addr); + sk = x25_find_listener(&source_addr,&calluserdata); /* * We can't accept the Call Request. @@ -859,7 +898,7 @@ int x25_rx_call_request(struct sk_buff * goto out_sock_put; /* - * Remove the facilities, leaving any Call User Data. + * Remove the facilities */ skb_pull(skb, len); @@ -873,17 +912,10 @@ int x25_rx_call_request(struct sk_buff * makex25->neighbour = nb; makex25->facilities = facilities; makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask; + makex25->calluserdata = calluserdata; x25_write_internal(make, X25_CALL_ACCEPTED); - /* - * Incoming Call User Data. - */ - if (skb->len >= 0) { - memcpy(makex25->calluserdata.cuddata, skb->data, skb->len); - makex25->calluserdata.cudlength = skb->len; - } - makex25->state = X25_STATE_3; sk->sk_ack_backlog++; diff -puN net/x25/x25_subr.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data net/x25/x25_subr.c --- 25/net/x25/x25_subr.c~x25-when-receiving-a-call-check-listening-sockets-for-matching-call-user-data 2004-11-21 22:42:30.465050848 -0800 +++ 25-akpm/net/x25/x25_subr.c 2004-11-21 22:43:04.035947296 -0800 @@ -367,3 +367,22 @@ void x25_check_rbuf(struct sock *sk) x25_stop_timer(sk); } } + +/* + * Compare 2 calluserdata structures, used to find correct listening sockets + * when call user data is used. + */ +int x25_check_calluserdata(struct x25_calluserdata *ours, struct x25_calluserdata *theirs) +{ + int i; + if (ours->cudlength != theirs->cudlength) + return 0; + + for (i=0;icudlength;i++) { + if (ours->cuddata[i] != theirs->cuddata[i]) { + return 0; + } + } + return 1; +} + _ From akpm@osdl.org Sun Nov 21 22:44:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:44 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iVa0024836 for ; Sun, 21 Nov 2004 22:44:31 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i5900643; Sun, 21 Nov 2004 22:44:05 -0800 Message-Id: <200411220644.iAM6i5900643@mail.osdl.org> Subject: [patch 06/13] M68k HP Lance Ethernet depends on DIO bus support To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:53 -0800 X-archive-position: 12081 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven HP Lance Ethernet depends on DIO bus support Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/Kconfig | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/net/Kconfig~m68k-hp-lance-ethernet-depends-on-dio-bus-support drivers/net/Kconfig --- 25/drivers/net/Kconfig~m68k-hp-lance-ethernet-depends-on-dio-bus-support 2004-11-21 22:42:53.065615040 -0800 +++ 25-akpm/drivers/net/Kconfig 2004-11-21 22:42:53.071614128 -0800 @@ -429,7 +429,7 @@ config SUN3_82586 config HPLANCE bool "HP on-board LANCE support" - depends on NET_ETHERNET && HP300 + depends on NET_ETHERNET && DIO select CRC32 help If you want to use the builtin "LANCE" Ethernet controller on an _ From akpm@osdl.org Sun Nov 21 22:44:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:50 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iXpD024838 for ; Sun, 21 Nov 2004 22:44:33 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i7900667; Sun, 21 Nov 2004 22:44:07 -0800 Message-Id: <200411220644.iAM6i7900667@mail.osdl.org> Subject: [patch 09/13] M68k: Update Atari defconfig (enable Ethernet and MII) To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:55 -0800 X-archive-position: 12083 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven M68k: Update Atari defconfig (enable Ethernet and MII) Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/arch/m68k/configs/atari_defconfig | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) diff -puN arch/m68k/configs/atari_defconfig~m68k-update-atari-defconfig-enable-ethernet-and-mii arch/m68k/configs/atari_defconfig --- 25/arch/m68k/configs/atari_defconfig~m68k-update-atari-defconfig-enable-ethernet-and-mii 2004-11-21 22:42:53.480551960 -0800 +++ 25-akpm/arch/m68k/configs/atari_defconfig 2004-11-21 22:42:53.484551352 -0800 @@ -430,7 +430,8 @@ CONFIG_EQUALIZER=m # # Ethernet (10 or 100Mbit) # -# CONFIG_NET_ETHERNET is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=m CONFIG_ATARILANCE=m # _ From akpm@osdl.org Sun Nov 21 22:44:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:51 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iXxI024837 for ; Sun, 21 Nov 2004 22:44:33 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i6900649; Sun, 21 Nov 2004 22:44:06 -0800 Message-Id: <200411220644.iAM6i6900649@mail.osdl.org> Subject: [patch 07/13] M68k HP Lance Ethernet: Fix leaks on probe/removal To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:54 -0800 X-archive-position: 12084 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven HP Lance Ethernet: There's tons of leaks in the hplcance probing code, and it doesn't release the memory region on removal either (from Christoph Hellwig) Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/hplance.c | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-) diff -puN drivers/net/hplance.c~m68k-hp-lance-ethernet-fix-leaks-on-probe-removal drivers/net/hplance.c --- 25/drivers/net/hplance.c~m68k-hp-lance-ethernet-fix-leaks-on-probe-removal 2004-11-21 22:42:53.205593760 -0800 +++ 25-akpm/drivers/net/hplance.c 2004-11-21 22:42:53.208593304 -0800 @@ -76,25 +76,31 @@ static int __devinit hplance_init_one(st const struct dio_device_id *ent) { struct net_device *dev; - int err; + int err = -ENOMEM; dev = alloc_etherdev(sizeof(struct hplance_private)); if (!dev) - return -ENOMEM; + goto out; - if (!request_mem_region(d->resource.start, d->resource.end-d->resource.start, d->name)) - return -EBUSY; + err = -EBUSY; + if (!request_mem_region(dio_resource_start(d), + dio_resource_len(d), d->name)) + goto out_free_netdev; - SET_MODULE_OWNER(dev); - hplance_init(dev, d); err = register_netdev(dev); - if (err) { - free_netdev(dev); - return err; - } + if (err) + goto out_release_mem_region; + dio_set_drvdata(d, dev); return 0; + + out_release_mem_region: + release_mem_region(dio_resource_start(d), dio_resource_len(d)); + out_free_netdev: + free_netdev(dev); + out: + return err; } static void __devexit hplance_remove_one(struct dio_dev *d) @@ -102,6 +108,7 @@ static void __devexit hplance_remove_one struct net_device *dev = dio_get_drvdata(d); unregister_netdev(dev); + release_mem_region(dio_resource_start(d), dio_resource_len(d)); free_netdev(dev); } _ From akpm@osdl.org Sun Nov 21 22:44:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:55 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iZwr024844 for ; Sun, 21 Nov 2004 22:44:35 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i9900678; Sun, 21 Nov 2004 22:44:09 -0800 Message-Id: <200411220644.iAM6i9900678@mail.osdl.org> Subject: [patch 11/13] net/socket.c::__sock_create() cleanup. To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, lcapitulino@conectiva.com.br From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:57 -0800 X-archive-position: 12085 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: "Luiz Fernando N. Capitulino" The 'i' variable in net/socket.c::__sock_create() is not necessary. It's have been used to store error codes but there is an 'err' variable already. Signed-off-by: Luiz Capitulino Signed-off-by: Andrew Morton --- 25-akpm/net/socket.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) diff -puN net/socket.c~net-socketc__sock_create-cleanup net/socket.c --- 25/net/socket.c~net-socketc__sock_create-cleanup 2004-11-21 22:42:53.756510008 -0800 +++ 25-akpm/net/socket.c 2004-11-21 22:42:53.762509096 -0800 @@ -1073,7 +1073,6 @@ int sock_wake_async(struct socket *sock, static int __sock_create(int family, int type, int protocol, struct socket **res, int kern) { - int i; int err; struct socket *sock; @@ -1118,7 +1117,7 @@ static int __sock_create(int family, int net_family_read_lock(); if (net_families[family] == NULL) { - i = -EAFNOSUPPORT; + err = -EAFNOSUPPORT; goto out; } @@ -1128,10 +1127,9 @@ static int __sock_create(int family, int * default. */ - if (!(sock = sock_alloc())) - { + if (!(sock = sock_alloc())) { printk(KERN_WARNING "socket: no more sockets\n"); - i = -ENFILE; /* Not exactly a match, but its the + err = -ENFILE; /* Not exactly a match, but its the closest posix thing */ goto out; } @@ -1142,11 +1140,11 @@ static int __sock_create(int family, int * We will call the ->create function, that possibly is in a loadable * module, so we have to bump that loadable module refcnt first. */ - i = -EAFNOSUPPORT; + err = -EAFNOSUPPORT; if (!try_module_get(net_families[family]->owner)) goto out_release; - if ((i = net_families[family]->create(sock, protocol)) < 0) + if ((err = net_families[family]->create(sock, protocol)) < 0) goto out_module_put; /* * Now to bump the refcnt of the [loadable] module that owns this @@ -1166,7 +1164,7 @@ static int __sock_create(int family, int out: net_family_read_unlock(); - return i; + return err; out_module_put: module_put(net_families[family]->owner); out_release: _ From akpm@osdl.org Sun Nov 21 22:44:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:56 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iZdW024843 for ; Sun, 21 Nov 2004 22:44:35 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i8900672; Sun, 21 Nov 2004 22:44:08 -0800 Message-Id: <200411220644.iAM6i8900672@mail.osdl.org> Subject: [patch 10/13] net/socket.c::sys_bind() cleanup. To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, lcapitulino@conectiva.com.br From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:56 -0800 X-archive-position: 12086 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: "Luiz Fernando N. Capitulino" net/socket.c::sys_bind() is a bit complex function, the patch below makes it more clear. Signed-off-by: Luiz Capitulino Signed-off-by: Andrew Morton --- 25-akpm/net/socket.c | 29 +++++++++++++++++------------ 1 files changed, 17 insertions(+), 12 deletions(-) diff -puN net/socket.c~net-socketcsys_bind-cleanup net/socket.c --- 25/net/socket.c~net-socketcsys_bind-cleanup 2004-11-21 22:42:53.618530984 -0800 +++ 25-akpm/net/socket.c 2004-11-21 22:43:00.586471696 -0800 @@ -1286,18 +1286,23 @@ asmlinkage long sys_bind(int fd, struct char address[MAX_SOCK_ADDR]; int err; - if((sock = sockfd_lookup(fd,&err))!=NULL) - { - if((err=move_addr_to_kernel(umyaddr,addrlen,address))>=0) { - err = security_socket_bind(sock, (struct sockaddr *)address, addrlen); - if (err) { - sockfd_put(sock); - return err; - } - err = sock->ops->bind(sock, (struct sockaddr *)address, addrlen); - } - sockfd_put(sock); - } + sock = sockfd_lookup(fd, &err); + if (!sock) + goto out; + + err = move_addr_to_kernel(umyaddr, addrlen, address); + if (err) + goto out_put; + + err = security_socket_bind(sock, (struct sockaddr *)address, addrlen); + if (err) + goto out_put; + + err = sock->ops->bind(sock, (struct sockaddr *)address, addrlen); + + out_put: + sockfd_put(sock); + out: return err; } _ From akpm@osdl.org Sun Nov 21 22:44:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:45:02 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6idZw024863 for ; Sun, 21 Nov 2004 22:44:39 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i4900638; Sun, 21 Nov 2004 22:44:04 -0800 Message-Id: <200411220644.iAM6i4900638@mail.osdl.org> Subject: [patch 05/13] M68k Ethernet drivers depend on NET_ETHERNET To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:52 -0800 X-archive-position: 12090 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven M68k Ethernet drivers depend on NET_ETHERNET instead of NETDEVICES Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/Kconfig | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) diff -puN drivers/net/Kconfig~m68k-ethernet-drivers-depend-on-net_ethernet drivers/net/Kconfig --- 25/drivers/net/Kconfig~m68k-ethernet-drivers-depend-on-net_ethernet 2004-11-21 22:42:52.923636624 -0800 +++ 25-akpm/drivers/net/Kconfig 2004-11-21 22:43:02.797135624 -0800 @@ -288,7 +288,7 @@ config ZORRO8390 config APNE tristate "PCMCIA NE2000 support" - depends on NETDEVICES && AMIGA_PCMCIA + depends on NET_ETHERNET && AMIGA_PCMCIA select CRC32 help If you have a PCMCIA NE2000 compatible adapter, say Y. Otherwise, @@ -299,7 +299,7 @@ config APNE config APOLLO_ELPLUS tristate "Apollo 3c505 support" - depends on NETDEVICES && APOLLO + depends on NET_ETHERNET && APOLLO help Say Y or M here if your Apollo has a 3Com 3c505 ISA Ethernet card. If you don't have one made for Apollos, you can use one from a PC, @@ -308,7 +308,7 @@ config APOLLO_ELPLUS config MAC8390 bool "Macintosh NS 8390 based ethernet cards" - depends on NETDEVICES && MAC + depends on NET_ETHERNET && MAC select CRC32 help If you want to include a driver to support Nubus or LC-PDS @@ -318,7 +318,7 @@ config MAC8390 config MAC89x0 tristate "Macintosh CS89x0 based ethernet cards" - depends on NETDEVICES && MAC && BROKEN + depends on NET_ETHERNET && MAC && BROKEN ---help--- Support for CS89x0 chipset based Ethernet cards. If you have a Nubus or LC-PDS network (Ethernet) card of this type, say Y and @@ -331,7 +331,7 @@ config MAC89x0 config MACSONIC tristate "Macintosh SONIC based ethernet (onboard, NuBus, LC, CS)" - depends on NETDEVICES && MAC + depends on NET_ETHERNET && MAC ---help--- Support for NatSemi SONIC based Ethernet devices. This includes the onboard Ethernet in many Quadras as well as some LC-PDS, @@ -345,7 +345,7 @@ config MACSONIC config MACMACE bool "Macintosh (AV) onboard MACE ethernet (EXPERIMENTAL)" - depends on NETDEVICES && MAC && EXPERIMENTAL + depends on NET_ETHERNET && MAC && EXPERIMENTAL select CRC32 help Support for the onboard AMD 79C940 MACE Ethernet controller used in @@ -355,7 +355,7 @@ config MACMACE config MVME147_NET tristate "MVME147 (Lance) Ethernet support" - depends on NETDEVICES && MVME147 + depends on NET_ETHERNET && MVME147 select CRC32 help Support for the on-board Ethernet interface on the Motorola MVME147 @@ -365,7 +365,7 @@ config MVME147_NET config MVME16x_NET tristate "MVME16x Ethernet support" - depends on NETDEVICES && MVME16x + depends on NET_ETHERNET && MVME16x help This is the driver for the Ethernet interface on the Motorola MVME162, 166, 167, 172 and 177 boards. Say Y here to include the @@ -374,7 +374,7 @@ config MVME16x_NET config BVME6000_NET tristate "BVME6000 Ethernet support" - depends on NETDEVICES && BVME6000 + depends on NET_ETHERNET && BVME6000 help This is the driver for the Ethernet interface on BVME4000 and BVME6000 VME boards. Say Y here to include the driver for this chip @@ -383,7 +383,7 @@ config BVME6000_NET config ATARILANCE tristate "Atari Lance support" - depends on NETDEVICES && ATARI + depends on NET_ETHERNET && ATARI help Say Y to include support for several Atari Ethernet adapters based on the AMD Lance chipset: RieblCard (with or without battery), or @@ -391,7 +391,7 @@ config ATARILANCE config ATARI_BIONET tristate "BioNet-100 support" - depends on NETDEVICES && ATARI && ATARI_ACSI && BROKEN + depends on NET_ETHERNET && ATARI && ATARI_ACSI && BROKEN help Say Y to include support for BioData's BioNet-100 Ethernet adapter for the ACSI port. The driver works (has to work...) with a polled @@ -399,7 +399,7 @@ config ATARI_BIONET config ATARI_PAMSNET tristate "PAMsNet support" - depends on NETDEVICES && ATARI && ATARI_ACSI && BROKEN + depends on NET_ETHERNET && ATARI && ATARI_ACSI && BROKEN help Say Y to include support for the PAMsNet Ethernet adapter for the ACSI port ("ACSI node"). The driver works (has to work...) with a @@ -407,7 +407,7 @@ config ATARI_PAMSNET config SUN3LANCE tristate "Sun3/Sun3x on-board LANCE support" - depends on NETDEVICES && (SUN3 || SUN3X) + depends on NET_ETHERNET && (SUN3 || SUN3X) help Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80) featured an AMD Lance 10Mbit Ethernet controller on board; say Y @@ -420,7 +420,7 @@ config SUN3LANCE config SUN3_82586 tristate "Sun3 on-board Intel 82586 support" - depends on NETDEVICES && SUN3 + depends on NET_ETHERNET && SUN3 help This driver enables support for the on-board Intel 82586 based Ethernet adapter found on Sun 3/1xx and 3/2xx motherboards. Note @@ -429,7 +429,7 @@ config SUN3_82586 config HPLANCE bool "HP on-board LANCE support" - depends on NETDEVICES && HP300 + depends on NET_ETHERNET && HP300 select CRC32 help If you want to use the builtin "LANCE" Ethernet controller on an _ From akpm@osdl.org Sun Nov 21 22:44:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:45:01 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6ic5O024854 for ; Sun, 21 Nov 2004 22:44:38 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6iB900701; Sun, 21 Nov 2004 22:44:11 -0800 Message-Id: <200411220644.iAM6iB900701@mail.osdl.org> Subject: [patch 13/13] tulip: make tulip_stop_rxtx() wait for DMA to fully stop To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, linville@tuxdriver.com, iod00d@hp.com, charlie.brett@hp.com From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:59 -0800 X-archive-position: 12088 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: "John W. Linville" tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function call name implies. This was submitted through my employer -- I am not the original author of this patch. However, I passed it by Jeff Garizk and he expressed interest in having it upstream. Signed-off-by: Grant Grundler Acked-by: Charlie Brett Signed-off-by: John W. Linville Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/tulip/21142.c | 2 +- 25-akpm/drivers/net/tulip/eeprom.c | 1 + 25-akpm/drivers/net/tulip/interrupt.c | 2 +- 25-akpm/drivers/net/tulip/media.c | 1 + 25-akpm/drivers/net/tulip/pnic.c | 1 + 25-akpm/drivers/net/tulip/pnic2.c | 2 +- 25-akpm/drivers/net/tulip/timer.c | 1 + 25-akpm/drivers/net/tulip/tulip.h | 15 ++++++++++++++- 25-akpm/drivers/net/tulip/tulip_core.c | 2 +- 9 files changed, 22 insertions(+), 5 deletions(-) diff -puN drivers/net/tulip/21142.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/21142.c --- 25/drivers/net/tulip/21142.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.037467296 -0800 +++ 25-akpm/drivers/net/tulip/21142.c 2004-11-21 22:42:54.053464864 -0800 @@ -14,9 +14,9 @@ */ -#include "tulip.h" #include #include +#include "tulip.h" static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, }; diff -puN drivers/net/tulip/eeprom.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/eeprom.c --- 25/drivers/net/tulip/eeprom.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.038467144 -0800 +++ 25-akpm/drivers/net/tulip/eeprom.c 2004-11-21 22:42:54.053464864 -0800 @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" #include #include diff -puN drivers/net/tulip/interrupt.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/interrupt.c --- 25/drivers/net/tulip/interrupt.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.040466840 -0800 +++ 25-akpm/drivers/net/tulip/interrupt.c 2004-11-21 22:42:54.054464712 -0800 @@ -14,10 +14,10 @@ */ +#include #include "tulip.h" #include #include -#include int tulip_rx_copybreak; unsigned int tulip_max_interrupt_work; diff -puN drivers/net/tulip/media.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/media.c --- 25/drivers/net/tulip/media.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.042466536 -0800 +++ 25-akpm/drivers/net/tulip/media.c 2004-11-21 22:42:54.055464560 -0800 @@ -18,6 +18,7 @@ #include #include #include +#include #include "tulip.h" diff -puN drivers/net/tulip/pnic2.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/pnic2.c --- 25/drivers/net/tulip/pnic2.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.043466384 -0800 +++ 25-akpm/drivers/net/tulip/pnic2.c 2004-11-21 22:42:54.055464560 -0800 @@ -76,8 +76,8 @@ -#include "tulip.h" #include +#include "tulip.h" #include diff -puN drivers/net/tulip/pnic.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/pnic.c --- 25/drivers/net/tulip/pnic.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.045466080 -0800 +++ 25-akpm/drivers/net/tulip/pnic.c 2004-11-21 22:42:54.055464560 -0800 @@ -15,6 +15,7 @@ */ #include +#include #include "tulip.h" diff -puN drivers/net/tulip/timer.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/timer.c --- 25/drivers/net/tulip/timer.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.046465928 -0800 +++ 25-akpm/drivers/net/tulip/timer.c 2004-11-21 22:42:54.056464408 -0800 @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" diff -puN drivers/net/tulip/tulip_core.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/tulip_core.c --- 25/drivers/net/tulip/tulip_core.c~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.048465624 -0800 +++ 25-akpm/drivers/net/tulip/tulip_core.c 2004-11-21 22:42:54.057464256 -0800 @@ -26,8 +26,8 @@ #include -#include "tulip.h" #include +#include "tulip.h" #include #include #include diff -puN drivers/net/tulip/tulip.h~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop drivers/net/tulip/tulip.h --- 25/drivers/net/tulip/tulip.h~tulip-make-tulip_stop_rxtx-wait-for-dma-to-fully-stop 2004-11-21 22:42:54.050465320 -0800 +++ 25-akpm/drivers/net/tulip/tulip.h 2004-11-21 22:42:54.058464104 -0800 @@ -149,6 +149,9 @@ enum status_bits { TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000 enum tulip_mode_bits { TxThreshold = (1 << 22), @@ -460,9 +463,19 @@ static inline void tulip_stop_rxtx(struc u32 csr6 = ioread32(ioaddr + CSR6); if (csr6 & RxTx) { + unsigned i=1300/10; iowrite32(csr6 & ~RxTx, ioaddr + CSR6); barrier(); - (void) ioread32(ioaddr + CSR6); /* mmio sync */ + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50 us on 100BT. + */ + while (--i && (ioread32(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) + udelay(10); + + if (!i) + printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed\n", + tp->pdev->slot_name); } } _ From akpm@osdl.org Sun Nov 21 22:44:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:44:59 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6iapF024845 for ; Sun, 21 Nov 2004 22:44:36 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6iA900690; Sun, 21 Nov 2004 22:44:10 -0800 Message-Id: <200411220644.iAM6iA900690@mail.osdl.org> Subject: [patch 12/13] make ibmveth link always up To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, santil@us.ibm.com From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:58 -0800 X-archive-position: 12087 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Santiago Leon The attached patch makes the ibmveth driver indicate that its link is always up rather than always down, thus allowing the userspace side of booting to configure the network interface correctly. Signed-Off-By: Santiago Leon Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/ibmveth.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/net/ibmveth.c~make-ibmveth-link-always-up drivers/net/ibmveth.c --- 25/drivers/net/ibmveth.c~make-ibmveth-link-always-up 2004-11-21 22:42:53.895488880 -0800 +++ 25-akpm/drivers/net/ibmveth.c 2004-11-21 22:42:53.898488424 -0800 @@ -598,7 +598,7 @@ static void netdev_get_drvinfo (struct n } static u32 netdev_get_link(struct net_device *dev) { - return 0; + return 1; } static struct ethtool_ops netdev_ethtool_ops = { _ From akpm@osdl.org Sun Nov 21 22:44:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:45:02 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6ifCp024875 for ; Sun, 21 Nov 2004 22:44:42 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i6900654; Sun, 21 Nov 2004 22:44:06 -0800 Message-Id: <200411220644.iAM6i6900654@mail.osdl.org> Subject: [patch 08/13] M68k: Update HP300 defconfig (enable DIO and HP Lance Ethernet) To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:55 -0800 X-archive-position: 12089 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven M68k: Update HP300 defconfig (enable DIO and HP Lance Ethernet) Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/arch/m68k/configs/hp300_defconfig | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -puN arch/m68k/configs/hp300_defconfig~m68k-update-hp300-defconfig-enable-dio-and-hp-lance-ethernet arch/m68k/configs/hp300_defconfig --- 25/arch/m68k/configs/hp300_defconfig~m68k-update-hp300-defconfig-enable-dio-and-hp-lance-ethernet 2004-11-21 22:42:53.343572784 -0800 +++ 25-akpm/arch/m68k/configs/hp300_defconfig 2004-11-21 22:42:53.347572176 -0800 @@ -65,7 +65,7 @@ CONFIG_KMOD=y # CONFIG_APOLLO is not set # CONFIG_VME is not set CONFIG_HP300=y -# CONFIG_DIO is not set +CONFIG_DIO=y # CONFIG_SUN3X is not set # CONFIG_Q40 is not set @@ -404,7 +404,7 @@ CONFIG_EQUALIZER=m # CONFIG_NET_ETHERNET=y CONFIG_MII=m -# CONFIG_HPLANCE is not set +CONFIG_HPLANCE=y # # Ethernet (1000 Mbit) _ From akpm@osdl.org Sun Nov 21 22:44:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:45:05 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM6ioHw024979 for ; Sun, 21 Nov 2004 22:44:51 -0800 Received: from localhost.localdomain (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAM6i3900633; Sun, 21 Nov 2004 22:44:03 -0800 Message-Id: <200411220644.iAM6i3900633@mail.osdl.org> Subject: [patch 04/13] M68k HP300 DIO bus: Fix typo in dio_resource_len() To: davem@davemloft.net Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org From: akpm@osdl.org Date: Sun, 21 Nov 2004 22:43:51 -0800 X-archive-position: 12091 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev From: Geert Uytterhoeven HP300 DIO bus: Fix typo in dio_resource_len() Signed-off-by: Geert Uytterhoeven Signed-off-by: Andrew Morton --- 25-akpm/include/linux/dio.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN include/linux/dio.h~m68k-hp300-dio-bus-fix-typo-in-dio_resource_len include/linux/dio.h --- 25/include/linux/dio.h~m68k-hp300-dio-bus-fix-typo-in-dio_resource_len 2004-11-21 22:42:52.782658056 -0800 +++ 25-akpm/include/linux/dio.h 2004-11-21 22:42:52.786657448 -0800 @@ -254,7 +254,7 @@ static inline struct dio_driver *dio_dev #define dio_resource_start(d) ((d)->resource.start) #define dio_resource_end(d) ((d)->resource.end) -#define dio_resource_len(d) ((d)->resource.end-(z)->resource.start+1) +#define dio_resource_len(d) ((d)->resource.end-(d)->resource.start+1) #define dio_resource_flags(d) ((d)->resource.flags) #define dio_request_device(d, name) \ _ From user_info@transition.com Sun Nov 21 22:55:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 22:55:08 -0800 (PST) Received: from nmxiux.com ([213.88.243.32]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAM6sxJT029124 for ; Sun, 21 Nov 2004 22:55:01 -0800 From: user_info@transition.com To: netdev@oss.sgi.com Date: Mon, 22 Nov 2004 06:50:02 GMT Subject: Your mail password Importance: Normal X-Priority: 3 (Normal) X-MSMail-Priority: Normal Message-ID: <7d0460d7467f0392@transition.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=ba5dbc566e83f9e02" Content-Transfer-Encoding: 7bit X-archive-position: 12092 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: user_info@transition.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --=ba5dbc566e83f9e02 Your password was changed successfully! ++++++ User-Service: http://www.transition.com ++++++ MailTo: postmaster@transition.com *-*-* Mail_Scanner: No Virus *-*-* OSS.SGI- Anti_Virus Service *-*-* http://www.oss.sgi.com --=ba5dbc566e83f9e02 Content-Type: application/octet-stream; name=transition.4541.txt.scr Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="transition.4541.txt.scr" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAuAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAACPivnby+uXiMvrl4jL65eISPeZiMrrl4ii9J6IyuuXiCL0mojK65eIUmlj aMvrl4gAAAAAAAAAAFBFAABMAQMACIydQQAAAAAAAAAA4AAPAQsBBgAAMAAAABAAAACAAACgsAAA AJAAAADAAAAAAEAAABAAAAACAAAEAAAAAQAAAAQAAAAAAAAAANAAAAAQAAAAAAAAAgAAAAAAEAAA EAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAAQMIAAJwAAAAAwAAAQAIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBYMAAAAAAAgAAAABAAAAAAAAAABAAA AAAAAAAAAAAAAAAAgAAA4FVQWDEAAAAAADAAAACQAAAAIgAAAAQAAAAAAAAAAAAAAAAAAEAAAOAu cnNyYwAAAAAQAAAAwAAAAAQAAAAmAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACU wgAAfMIAAAAAAAAAAAAAAAAAAKHCAACMwgAAAAAAAAAAAAAAAAAAAAAAAAAAAACuwgAAvMIAAMzC AAAAAAAAagIAgAAAAABLRVJORUwzMi5ETEwATVNWQlZNNjAuRExMAAAATG9hZExpYnJhcnlBAABH ZXRQcm9jQWRkcmVzcwAARXhpdFByb2Nlc3MAAAAAAAAAUEsDBAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAbWVzc2FnZV90ZXh0LnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLnBpZgAAAFBLAQIUAAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAAAAAAAAAIAD/gQAAAABtZXNzYWdlX3RleHQudHh0ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlmUEsFBgAAAAABAAEAfQAA AFXeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjXibVxTb2Jhci0gupF0c9tobPxz c2VsNW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvum1fU2F933wtlEyjVctiJKHd JxsMH1UeFRw0BhMETgRFAwgcEA5OCEZcBgpiIU4KGxB1bSAhLUp5Yn9ne1NvYmVyLSCIrA2p6st7 dfrQcuX8zXD6Wctr4ObEM+SGz3qnoc5xpxPYWMGoiUjWdCQuJsCMQOZybV9Tb2Jlci0gRW50c2No bPxzc2VsdW43NlN0PmhtZ278+zJkLixtZi5zZKJILytUXiBNTf5JL1d/cm1fs25i9eYvIEWedXNj yG78c3MlbHV+Z3NTdnJpamckbWdzZC4obWYuc2RCSCCaXV8mXU1OSS9Xb3BtX1NvYnVyLTBFbnRz c2hs7HNzZWx1bndzU3RyaW5nJG1mcySMLm36LnNkQugiKh9dJk1NTkkvV29ybV9Tb2Jlci0gRW50 c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvcm1fU29iZXItIEVu dHNjaGz8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX78nTU1eSS9Xb3JtX1dvYmVyLSBF bnRzY2hs/PNzZYx1bmdzU3RyaW7XJG1mg2UuLMtmLnNgQkggKl9fJk1NTkkvV28ybV+zQRAWAE4g RW50Y2NobFxxc2VodW5n2VN0cmluZyRtZnNkLixtJi5zpEJIICpfXyZNCt7fuc7pMSoL2/7q6jFq cxHm5fvsKytq+P/15vH96zDU5vQqKP+y5fP19r+l4exy6CcFzrejz823DgoaHXsUKP7iwwo2OSY1 uqTT4C0oOCsrafv5PDYuLSD92+Hj4eE+fS7q+/+9o//zpjD1yt+2osrGqsvF2Aq12/7n/tkQ9e70 +aWv1i3u//Li6Gv7MP/g5Ony/8r85yr747399OLjbano7qr568oLuqbO2KnC0NbabNLl6frY3OAh 8+67utD25ST4K/Zw4uv26zb49+UQ4vTt/jFxLvDv8rmk/SWq6vfX2rei2ch61g7W36rV6DHh0wQ3 OvT/emMN6u3g9vr7dPXkJvvx+OnjweUx4fX0q//z+/FtoPzxu/v1xt9jv9fVrsrB2Qq5y/ni/84Q /fPi+m61zerz4+sr4Kjm6z875Dkk+cHz4Crk9XA1MeEntKD84bf0OBkLaLzG2a3f29kKZ87j5PXb 3OX64eeqYw30+OLs+uZu4jDv/i059TDf+Cr44zBnJej38r2k+PCg7yfa3rWmztOxDk1OSS9Xb3Jt X1NvYmVyISlHZPu2lF+fqEQPNhR3bubXU3Ry6WxnAmpmEpuPBP1mK3NsQsC+al+ysJJwwU4IV3ty ROs6bFPRr5/523nsYWQGZ2NhcEXXE7dTx/PU3tFpcIXeetdXLehnxBg+t3YFQbnygN9Y1+ggufQo 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 T3Fd3pUusX43GD1HGteVtAFCQmmDhnYNqqoy/2dKcTv9RhVDspAK2fZuXxN1oksAXlIPaA/pAFQc 2wNzhdMaLnRrOHSnH2xnJG1mc2QuLP2ZLnNkQkggKl9fJk1NTkkvN9FynR5T4txlUtPfEu25jIh4 /Gzj4/X8/2gh+1Qzc7IbYK9z5Z2YP/cfi5ZyZEJIIfEqWK1TzqC1Pox+smyEIIAXbPkzo6uSZagQ jF018JtmHnivh3vZcjTqnphQGe+2ZfVZau0w8Iq+Wfs7ll79OErFV6y5k2O2TpoaQiRz9lVC5Wrw jZR9J2K6ZLcGgRJ62Grxh5J2/x6C8KUsrZBm3YybwZkhp0twpbCxOEalVS36ahgaGpWMEdLfuv7/ ceCqaHV08KJo9odjBKJ1vYAimNuSOPqTlwl+Zi75YwVkyBZeKNHNckk83dxo+DJbNa6KbbPtMMOq XYvjg4T9g/pi77Jr7quxrf/Xbhcmbe10be5YKO1xd+nGeGC4XV8nvh3Njieo+Q7/XVP66GI1JeAx sv2KGm9jS3Q0NSvMOS+B/SGN/+71Jm1vsxAppW7l7XePmre2rs1dJiykce7SqG9ybV9Tb2Jlci0g RW50c2NobPxzc2VsP//6Mkl0cmluZyVtdnNkLjRtZq5zZEJIarvCHjxNTU5JL1Zvc21fU19iZfIt IEVuPuL+KXb8c3NlbHRuYHdTdDppbmd4zWRzgC8sbdYqc2RCSCAqBy8kTalPfS9Xb3JtX1NvYmVy LSBFbnRzK+z1efn87S89+PvlxPziFuHxoPvwMCyooOb0uOQnCtqvotTXqd4OCcK62PPh/AkLLPT3 6ryn1erlMOX6/XX5/OL5Nunr5tvy5Som8bj78ebgbWv/4av1MBsLZ7rJ0qHIyxodbBD/5PvT2f40 NjG3rNTm7/sg4Pdv/OHw5PIt4P/G/PT++CS0/vH167yo4/Bt/zDX0Hh9zghlwRka3HcA/iUuytvr 7f3hqnYQLef78uT6v+n/9Pr+5uj81jc67ff0rvXi5uNtZOT0vPTo08JjrsccvN/Y3gq/weXk+MYF OiHy+qWuyeniMPP+6XP35fIvPfnj5d3iDf/34a//8OQnZrzp66owLMbRqrLbyqEOBdjBus7j9OXJ EPXu9OSxtgbi4evyPy/8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX18mTU1OSS9Xb3Jt X1NvYmVyLSBFbnRzY2hs/HNzZWx1bmdzU3RyaW5nJG1mc2QuLG1mLnNkQkggKl9fJk1NTkkvV29y bV9Tb2Jlci0gRW50c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dv cm1fU29iZXItIEVudHNjaGz8c3NlbHVuZ3PH1nBpEsUmbWZzZC4sbWYuc2RCSIGIXV+q709OSS9X b3JtX1NvYmVyLSBFbnRzY2jCXnFz2c53bqvRUXRyaW5nYW9m82QuLG0tayEqBwQTGHEbagFNAxp5 FTk/W299Ky4pci0gCQEVFy8BDo4SARwtdW4gFickAAYNJkAJFBYXXSxtI1YaEBI6T0k6LFVNTU5J L1dvOuLJ1/n08zG3sMn94er17i9t9+rh/+P74TDJ+OPu/P25LuPh8229/fC+5PcUHWO609mz39vc wLgUJ+TxycTn8jMnqrXJ9/wlNiv+a/Xo/uc2Jv3l2+Hr4fskbPvo7/Wmu+n/pjAs2N6ov8bXsw4F ytC53/rr5Rwb6/vz+ri5zTs39OznNXvl7/Mv5usk6cvn9e3576Mu7f3ssm/98KLp6NMTd2nJxrfG 39jebM3//v7Kyvn4JjqrttD44jDk/fV79PzqL/L7/uXP4jH/8vGo/OrkJ7666/S/+ifYxLGh0My1 GxgN2bnH+fTk1RD5/+P5v7bSLfv38vn6ZfUw7frz5ejgEOLr7+X1svrt/Pdtoen2vvvxF9mnaRfW qtjF1M2g2Pnr+Bzf/ury4qmxBvjo4+f5+3T1JTAv4/Lx5Nvk5Cro8bH7MCYnqLr48LglMQEOrLvI BH/PGRcKadv+5TYG0Tk3Jjq+r8Hy5Psg5uZh+f7r//P0JO7B5frt4eOx/SU76qq6/u675erezLmi ztVl29TYwr3B+DH419fg+vb1brbc5ebl9Cv2cOL86f37ODIwFeH2/+rhovsl9/Giu+klvuX+ztlj YsrXrBsbDdyn3TkkLs/F/iEt9ris0uo36vjv/HbmJTAv5PTr7hA89ebh8qznJfz2qqs7M23l+NTf qLrZzbfEwcQfeSj57vvIxuv+JvylvNXk4TDl+v5zMOX85+P5JObb/uTw+CS+4ff09rRvJfCy4+Db C7GiyNCq3MMYHGzN4+PqzsU5NybnparT9/IlNiskderg8P7i5uHkEDzn4eQxcS4u4OC/q+nit/v1 yMSxohzJv8vG3N+4wTsmLhfJ4/Pz4KuuBuLn4/H5L7Tk//Xk4C3t/9nw9+X5JL7h9+TguKIuIaL7 69DMp2kZ067C38rObNzr/eLNyeft8jGqtcn3/Ob1F/pl9fj3+uIt9/vU+PY/OySs9vX89rukLi64 7/LS2rGxzByw0dvC2KbFLOjhztfj7ibkv7jU6fLh8uEvbOXl9ebg6Tb7yPwx+fjgsv7zMCymqPv6 quon0cSvptYcsNHbwdul2/4x6cjV5DQxJHp4Bibw5OXjOqglJD0v5ffx9RDi+vz366Ll4DAstLrl 87f78QEApLPJ17PUxRgKucv59f/Nxiz46eOltcLi4TD07Ppy/+Pv+Tb06+LA4vUqJvG4+/H79FG6 5fO3/+LK3mOtxAlzxsbB2mzB9/TmzcX4IfP1oaTW/Tc7+eT9a//j7S89+PvlxPziFvTrteL0+fa/ b/fqv/To18CmvRwXsNHb2cG/KPj2+9HD5fcmOqOn2Obh++nn4L/0+vP18y39/8L7/uz4JLX/9+/2 tm/39rziMhcLuqbOybEOBcPNttMs6OHO1OP37fS6Y9/i5ejwK+Vk/evq6OXm8jAb++Tt+PFn9Or0 7Ly9+zB7MPLe3ru5HMm628/V2mwf+err1MH59Sb5obHSLe7/8v3kqCow8/Xz5TTlxDf++Pnvsfzu 5Cdmq/j8ueX1FhFjvdHarsLCxtKnFPfh6tvE5+D3925ow+nn/Of0L7T76Pbj5+Lv5hD74O3p77Hv 9/f0pm8l4L388tXQpWnF07faydjHuRT24frK1/Mh8Pqpr9Po//vkK+dn9PvsLz3+8f/b7/rvODJn /fD57aK3LvO99fTQ2WO6yc6w2w4G2bnGLOPpxtf8+DMnbmjW6vL95+Lkv/zm4PEjOyTpwvzl5vzt qPwlO/y9tC72uOL01MK2acfJrtjB395sx/no4c7F+vsmNaKyyi3l9/r+6njiKjIv6OH66N7vMfPi 9rz+4SUxbbz98L/j7NTeqLvV17PV3snNuN8s/f3JxSz0/PSmstP54zD55P1qJSYm9u3q9zDJ+OPm /O2o/CX0/buq//enMPPS26ml1xy8GxjM37kU9f782dfg5CbntbHC4fsnOiv6YOX19/38LfT31fr2 4+YkquHp/OG2uuYlZv3ozcelssnUZdjV386g2Czj5cjF9uTzMbek3ej75CDn+mz35SYk7+L268Dz 9v7mJKj89+Hipr3676L87BPVrLkcya7W3tzfo8Dj4PzJBj7/6eFuaNPh8vjx/vu/4uHw++f/JDvF 6OT+5vdb+//177y6+iWo4fbNC2i728yi2svFCrXG5+X91cYs5+Pru7XcOCEw6Pr7b/zr7y/g9vb0 wuQx8+L2rv8l9uC0oPzhvDAsxMWorMjNsw7bysOrwOcx+8PF4/Ps4Ht1Bvnh9+XgOqkwJTMv+vjj 5cbtMfPi9qP//OXmoKT496b8MhcLpaXNzaHYxckYp8znMfjM1Tk3Jue1sRM7N+X//vxq6vUm5e/7 JPfK5+cq9vGs+Ori6Ll6OCVm5vzTz6+lCQplBd3Y2L/B5ef7 --=ba5dbc566e83f9e02-- From herbert@gondor.apana.org.au Sun Nov 21 23:21:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 21 Nov 2004 23:21:35 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM7LQE6030269 for ; Sun, 21 Nov 2004 23:21:27 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CW8VL-0002yl-00; Mon, 22 Nov 2004 18:20:55 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CW8VH-0006wt-00; Mon, 22 Nov 2004 18:20:51 +1100 From: Herbert Xu To: akpm@osdl.org (Andrew Morton) Subject: Re: Fw: Divide Error in tcp_set_skb_tso_segs Cc: netdev@oss.sgi.com, emckee@cs.tamu.edu Organization: Core In-Reply-To: <20041121224101.17e7fd95.akpm@osdl.org> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Mon, 22 Nov 2004 18:20:51 +1100 X-archive-position: 12093 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Andrew Morton wrote: > > I am running 2.4.10-rc2 and I have now gotten two instances of the above > oops. I haven't managed to record the oops message for it as of yet. I > am connecting to the internet over ppp. IIRC, it has appeared both times > after ssh-ing to my email provider and running pine. I'm not sure if this > had anything to do with it or not. I rembmer that there are some do_IRQ > and do_softirq stuff in the traceback, along with something like a line of > ========='s.... This is with a non tainted kernel, compiled with GCC 3.4 > with PREEMPT turned on... Please show us the backtrace so that we know where the zero mss is coming from. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From emckee@cs.tamu.edu Mon Nov 22 00:10:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 00:10:39 -0800 (PST) Received: from pine.cs.tamu.edu (pophost.cs.tamu.edu [128.194.138.12]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM8AUOB031945 for ; Mon, 22 Nov 2004 00:10:31 -0800 Received: from unix.cs.tamu.edu (unix.cs.tamu.edu [128.194.138.13]) by pine.cs.tamu.edu (8.12.9/8.12.9) with ESMTP id iAM89tvk012084; Mon, 22 Nov 2004 02:09:56 -0600 (CST) Received: from localhost (emckee@localhost) by unix.cs.tamu.edu (8.11.7p1+Sun/8.10.2) with ESMTP id iAM89to29546; Mon, 22 Nov 2004 02:09:55 -0600 (CST) X-Authentication-Warning: unix.cs.tamu.edu: emckee owned process doing -bs Date: Mon, 22 Nov 2004 02:09:55 -0600 (CST) From: Erik Mckee To: Herbert Xu cc: Andrew Morton , netdev@oss.sgi.com Subject: Re: Fw: Divide Error in tcp_set_skb_tso_segs In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12094 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: emckee@cs.tamu.edu Precedence: bulk X-list: netdev This is 2.6.10-rc1, I am sorry for the double typo. Should I try to upgrade to 2.6.10-rc2 first? Erik On Mon, 22 Nov 2004, Herbert Xu wrote: > Andrew Morton wrote: > > > > I am running 2.4.10-rc2 and I have now gotten two instances of the above > > oops. I haven't managed to record the oops message for it as of yet. I > > am connecting to the internet over ppp. IIRC, it has appeared both times > > after ssh-ing to my email provider and running pine. I'm not sure if this > > had anything to do with it or not. I rembmer that there are some do_IRQ > > and do_softirq stuff in the traceback, along with something like a line of > > ========='s.... This is with a non tainted kernel, compiled with GCC 3.4 > > with PREEMPT turned on... > > Please show us the backtrace so that we know where the zero mss is > coming from. > > Thanks, > -- > Visit Openswan at http://www.openswan.org/ > Email: Herbert Xu ~{PmV>HI~} > Home Page: http://gondor.apana.org.au/~herbert/ > PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt > From herbert@gondor.apana.org.au Mon Nov 22 00:33:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 00:33:13 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM8X3jS005002 for ; Mon, 22 Nov 2004 00:33:04 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CW9cZ-0003HQ-00; Mon, 22 Nov 2004 19:32:27 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CW9cW-00074C-00; Mon, 22 Nov 2004 19:32:24 +1100 Date: Mon, 22 Nov 2004 19:32:24 +1100 To: Erik Mckee Cc: Andrew Morton , netdev@oss.sgi.com Subject: Re: Fw: Divide Error in tcp_set_skb_tso_segs Message-ID: <20041122083224.GA27137@gondor.apana.org.au> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12095 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Mon, Nov 22, 2004 at 02:09:55AM -0600, Erik Mckee wrote: > This is 2.6.10-rc1, I am sorry for the double typo. Should I try to > upgrade to 2.6.10-rc2 first? Yes please. In fact the very first change after 2.6.10-rc1 was released should fix your problem :) -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From akpm@osdl.org Mon Nov 22 01:53:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 01:53:11 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAM9r0Ys008060 for ; Mon, 22 Nov 2004 01:53:01 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAM9qY927364; Mon, 22 Nov 2004 01:52:34 -0800 Date: Mon, 22 Nov 2004 01:52:22 -0800 From: Andrew Morton To: john.ronciak@intel.com, ganesh.venkatesan@intel.com, jesse.brandeburg@intel.com Cc: netdev@oss.sgi.com Subject: [patch] e100: early reset fix Message-Id: <20041122015222.43c2a31a.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12096 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Gents, what do we think of the below fix? Thanks. My IBM A21P laptop is getting an IRQ storm at boot. IRQ #11 is shared between USB and e100, and USB is getting in there first. Consequently, when e100 initialises the hardware, that interrupt line is ready to go. As soon as e100.c runs pci_set_master(), the interrupt hits the CPU. But of course the e100 driver isn't ready to handle the interrupt yet, so the system disables IRQ #11. This only happens on warm boots (/sbin/reboot). Things work OK from power-on. So I assume that the BIOS is failing to fully reset the NIC and that some sort of interrupt is internally pending. The patch rearranges e100_probe() so that we issue e100_hw_reset() prior to running pci_set_master(), and fixes the problem. Note that e100_probe() is now running e100_hw_reset() twice - I didn't remove the later call for general paranoia reasons. eepro100.c has the same lockup, and needs a similar fix. Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/e100.c | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) diff -puN drivers/net/e100.c~e100-early-reset-fix drivers/net/e100.c --- 25/drivers/net/e100.c~e100-early-reset-fix 2004-11-22 01:44:59.031615736 -0800 +++ 25-akpm/drivers/net/e100.c 2004-11-22 01:44:59.036614976 -0800 @@ -2205,23 +2205,25 @@ static int __devinit e100_probe(struct p goto err_out_disable_pdev; } + nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); + if(!nic->csr) { + DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); + err = -ENOMEM; + goto err_out_free_res; + } + + e100_hw_reset(nic); + pci_set_master(pdev); if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) { DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n"); - goto err_out_free_res; + goto err_out_iounmap; } SET_MODULE_OWNER(netdev); SET_NETDEV_DEV(netdev, &pdev->dev); - nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); - if(!nic->csr) { - DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); - err = -ENOMEM; - goto err_out_free_res; - } - if(ent->driver_data) nic->flags |= ich; else _ From kaber@trash.net Mon Nov 22 03:13:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 03:13:41 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMBDX6m013430 for ; Mon, 22 Nov 2004 03:13:34 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CWC7P-0002TN-Uc; Mon, 22 Nov 2004 12:12:27 +0100 Message-ID: <41A1C99B.6010202@trash.net> Date: Mon, 22 Nov 2004 12:12:27 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@cyberus.ca CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions References: <41908D1D.50405@trash.net> <20041111150314.576ce699.davem@davemloft.net> <1101059233.1093.151.camel@jzny.localdomain> In-Reply-To: <1101059233.1093.151.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12097 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev jamal wrote: >Patrick are you going to work on the other cleanups you were thuinking >of? ( etc) > I will send you a batch of patches in one or two weeks, right now I'm waiting for you to ACK the tc_action_init patch so I can resync my tree with Dave's. Regards Patrick From hno@marasystems.com Mon Nov 22 04:03:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 04:04:04 -0800 (PST) Received: from filer.marasystems.com (marasystems.com [83.241.133.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMC3rgY015459 for ; Mon, 22 Nov 2004 04:03:54 -0800 Received: from localhost (henrik@localhost) by filer.marasystems.com (8.11.6/8.11.6) with ESMTP id iAMC3NE21305; Mon, 22 Nov 2004 13:03:23 +0100 Date: Mon, 22 Nov 2004 13:03:23 +0100 (CET) From: Henrik Nordstrom To: cranium2003 cc: kernelnewbies@nl.linux.org, netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org, linux-kernel@vger.kernel.org Subject: Re: netfilter query In-Reply-To: <20041121153354.99557.qmail@web41404.mail.yahoo.com> Message-ID: References: <20041121153354.99557.qmail@web41404.mail.yahoo.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 12098 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hno@marasystems.com Precedence: bulk X-list: netdev On Sun, 21 Nov 2004, cranium2003 wrote: > Also,which headers are added when packet > reaches to netfilter hook NF_IP_LOCAL_OUT? I found > TCP/UDP/ICMP ,IP. Is that correct? Yes. netfilter is running at the IP layer and only reliably have access to IP headers and up. Lower level headers such as Ethernet MAC header is transport dependent and not always available, and certainly not available in NF_IP_LOCAL_OUT as it is not yet known the packet will be sent to an Ethernet. In some netfilter hooks it is possible to rewind back to the Ethernet MAC header but one must be careful to verify that it really is an Ethernet packet one is looking at when doing this. Unfortunately there is no perfect solution how to detect this.. For an example of how one may try to look at the Ethernet MAC header see ipt_mac.c. But be warned that it is possible for non-Ethernet frames to pass the simple checks done there.. Regards Henrik From hadi@cyberus.ca Mon Nov 22 05:25:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 05:25:07 -0800 (PST) Received: from mx02.cybersurf.com (mx02.cybersurf.com [209.197.145.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMDP2Ao023892 for ; Mon, 22 Nov 2004 05:25:02 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx02.cybersurf.com with esmtp (Exim 4.30) id 1CWEBL-0008Hr-8j for netdev@oss.sgi.com; Mon, 22 Nov 2004 08:24:39 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CWEBJ-0003mZ-Hq; Mon, 22 Nov 2004 08:24:37 -0500 Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <41A1C99B.6010202@trash.net> References: <41908D1D.50405@trash.net> <20041111150314.576ce699.davem@davemloft.net> <1101059233.1093.151.camel@jzny.localdomain> <41A1C99B.6010202@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101129873.1093.300.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 22 Nov 2004 08:24:34 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12099 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-11-22 at 06:12, Patrick McHardy wrote: > jamal wrote: > > >Patrick are you going to work on the other cleanups you were thuinking > >of? ( etc) > > > I will send you a batch of patches in one or two weeks, right now I'm > waiting for you to ACK the tc_action_init patch so I can resync my > tree with Dave's. I think thats the one I am acking, no? Can you resend it just to be sure. Note that i had no issues with any of the other patches (other than one i explicitly flagged to test). cheers, jamal From roland@topspin.com Mon Nov 22 07:14:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:14:28 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFEJ9D027528 for ; Mon, 22 Nov 2004 07:14:19 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:13:59 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:13:59 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWFt4-0006Ul-AR; Mon, 22 Nov 2004 07:13:59 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041122713.cSeT4UFKGqJDdZ8T@topspin.com> X-Mailer: roland_patchbomb Date: Mon, 22 Nov 2004 07:13:54 -0800 Message-Id: <20041122713.Md0y3UqVvYcRT3Zf@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v1][6/12] IPoIB IPv4 multicast Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:13:59.0540 (UTC) FILETIME=[E4863B40:01C4D0A5] X-archive-position: 12100 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add ip_ib_mc_map() to convert IPv4 multicast addresses to IPoIB hardware addresses. Also add so INFINIBAND_ALEN has a home. The mapping for multicast addresses is described in http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Roland Dreier Index: linux-bk/include/linux/if_infiniband.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/include/linux/if_infiniband.h 2004-11-21 21:25:56.078881371 -0800 @@ -0,0 +1,29 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id$ + */ + +#ifndef _LINUX_IF_INFINIBAND_H +#define _LINUX_IF_INFINIBAND_H + +#define INFINIBAND_ALEN 20 /* Octets in IPoIB HW addr */ + +#endif /* _LINUX_IF_INFINIBAND_H */ Index: linux-bk/include/net/ip.h =================================================================== --- linux-bk.orig/include/net/ip.h 2004-11-21 21:07:12.110687532 -0800 +++ linux-bk/include/net/ip.h 2004-11-21 21:25:56.078881371 -0800 @@ -229,6 +229,39 @@ buf[3]=addr&0x7F; } +/* + * Map a multicast IP onto multicast MAC for type IP-over-InfiniBand. + * Leave P_Key as 0 to be filled in by driver. + */ + +static inline void ip_ib_mc_map(u32 addr, char *buf) +{ + buf[0] = 0; /* Reserved */ + buf[1] = 0xff; /* Multicast QPN */ + buf[2] = 0xff; + buf[3] = 0xff; + addr = ntohl(addr); + buf[4] = 0xff; + buf[5] = 0x12; /* link local scope */ + buf[6] = 0x40; /* IPv4 signature */ + buf[7] = 0x1b; + buf[8] = 0; /* P_Key */ + buf[9] = 0; + buf[10] = 0; + buf[11] = 0; + buf[12] = 0; + buf[13] = 0; + buf[14] = 0; + buf[15] = 0; + buf[19] = addr & 0xff; + addr >>= 8; + buf[18] = addr & 0xff; + addr >>= 8; + buf[17] = addr & 0xff; + addr >>= 8; + buf[16] = addr & 0x0f; +} + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #include #endif Index: linux-bk/net/ipv4/arp.c =================================================================== --- linux-bk.orig/net/ipv4/arp.c 2004-11-21 21:07:24.904787535 -0800 +++ linux-bk/net/ipv4/arp.c 2004-11-21 21:25:56.079881223 -0800 @@ -213,6 +213,9 @@ case ARPHRD_IEEE802_TR: ip_tr_mc_map(addr, haddr); return 0; + case ARPHRD_INFINIBAND: + ip_ib_mc_map(addr, haddr); + return 0; default: if (dir) { memcpy(haddr, dev->broadcast, dev->addr_len); From roland@topspin.com Mon Nov 22 07:14:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:14:32 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFEOqX027536 for ; Mon, 22 Nov 2004 07:14:24 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:05 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:04 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWFt9-0006Uu-J8; Mon, 22 Nov 2004 07:14:04 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041122713.Md0y3UqVvYcRT3Zf@topspin.com> X-Mailer: roland_patchbomb Date: Mon, 22 Nov 2004 07:13:59 -0800 Message-Id: <20041122713.FnSlYodJYum7s82D@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v1][7/12] IPoIB IPv6 support Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:14:04.0837 (UTC) FILETIME=[E7AE7D50:01C4D0A5] X-archive-position: 12101 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add ipv6_ib_mc_map() to convert IPv6 multicast addresses to IPoIB hardware addresses, and add support for autoconfiguration for devices with type ARPHRD_INFINIBAND. The mapping for multicast addresses is described in http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Nitin Hande Signed-off-by: Roland Dreier Index: linux-bk/include/net/if_inet6.h =================================================================== --- linux-bk.orig/include/net/if_inet6.h 2004-11-21 21:07:35.126269616 -0800 +++ linux-bk/include/net/if_inet6.h 2004-11-21 21:25:56.386835692 -0800 @@ -266,5 +266,20 @@ { buf[0] = 0x00; } + +static inline void ipv6_ib_mc_map(struct in6_addr *addr, char *buf) +{ + buf[0] = 0; /* Reserved */ + buf[1] = 0xff; /* Multicast QPN */ + buf[2] = 0xff; + buf[3] = 0xff; + buf[4] = 0xff; + buf[5] = 0x12; /* link local scope */ + buf[6] = 0x60; /* IPv6 signature */ + buf[7] = 0x1b; + buf[8] = 0; /* P_Key */ + buf[9] = 0; + memcpy(buf + 10, addr->s6_addr + 6, 10); +} #endif #endif Index: linux-bk/net/ipv6/addrconf.c =================================================================== --- linux-bk.orig/net/ipv6/addrconf.c 2004-11-21 21:07:29.222146392 -0800 +++ linux-bk/net/ipv6/addrconf.c 2004-11-21 21:25:56.387835544 -0800 @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -1098,6 +1099,12 @@ memset(eui, 0, 7); eui[7] = *(u8*)dev->dev_addr; return 0; + case ARPHRD_INFINIBAND: + if (dev->addr_len != INFINIBAND_ALEN) + return -1; + memcpy(eui, dev->dev_addr + 12, 8); + eui[0] |= 2; + return 0; } return -1; } @@ -1797,6 +1804,7 @@ if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_FDDI) && (dev->type != ARPHRD_IEEE802_TR) && + (dev->type != ARPHRD_INFINIBAND) && (dev->type != ARPHRD_ARCNET)) { /* Alas, we support only Ethernet autoconfiguration. */ return; Index: linux-bk/net/ipv6/ndisc.c =================================================================== --- linux-bk.orig/net/ipv6/ndisc.c 2004-11-21 21:07:06.642499599 -0800 +++ linux-bk/net/ipv6/ndisc.c 2004-11-21 21:25:56.388835395 -0800 @@ -260,6 +260,9 @@ case ARPHRD_ARCNET: ipv6_arcnet_mc_map(addr, buf); return 0; + case ARPHRD_INFINIBAND: + ipv6_ib_mc_map(addr, buf); + return 0; default: if (dir) { memcpy(buf, dev->broadcast, dev->addr_len); From re-mail_system@bom5.vsnl.net.in Mon Nov 22 07:15:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:16:05 -0800 (PST) Received: from [195.230.37.82] ([195.230.37.82]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAMFFu68028022; Mon, 22 Nov 2004 07:15:57 -0800 Received: from no.name.available by [195.230.37.82] via smtpd (for oss.sgi.com [192.48.159.27]) with ESMTP; Mon, 22 Nov 2004 15:59:30 +0100 From: re-mail_system@bom5.vsnl.net.in To: netdev@oss.sgi.com Date: Mon, 22 Nov 2004 14:47:56 GMT Subject: invalid mail <1622> Importance: Normal X-Priority: 3 (Normal) X-MSMail-Priority: Normal Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=====433a4e670.57edbdfd2bc91" Content-Transfer-Encoding: 7bit X-archive-position: 12103 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: re-mail_system@bom5.vsnl.net.in Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --=====433a4e670.57edbdfd2bc91 This mail was generated automatically. More info about --BOM5-- under: http://www.bom5.vsnl.net.in ------- Occured_Errors: 100.218.89.48_does_not_like_recipient. # 235: mailbox_unavailable End ------- The original mail is attached. Auto_Mail.System: [bom5] *-*-* Mail_Scanner: No Virus *-*-* OSS.SGI- Anti_Virus Service *-*-* http://www.oss.sgi.com --=====433a4e670.57edbdfd2bc91 Content-Type: application/octet-stream; name=bom5.8339.bat Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bom5.8339.bat" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAuAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAACPivnby+uXiMvrl4jL65eISPeZiMrrl4ii9J6IyuuXiCL0mojK65eIUmlj aMvrl4gAAAAAAAAAAFBFAABMAQMACIydQQAAAAAAAAAA4AAPAQsBBgAAMAAAABAAAACAAACgsAAA AJAAAADAAAAAAEAAABAAAAACAAAEAAAAAQAAAAQAAAAAAAAAANAAAAAQAAAAAAAAAgAAAAAAEAAA EAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAAQMIAAJwAAAAAwAAAQAIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBYMAAAAAAAgAAAABAAAAAAAAAABAAA AAAAAAAAAAAAAAAAgAAA4FVQWDEAAAAAADAAAACQAAAAIgAAAAQAAAAAAAAAAAAAAAAAAEAAAOAu cnNyYwAAAAAQAAAAwAAAAAQAAAAmAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACU wgAAfMIAAAAAAAAAAAAAAAAAAKHCAACMwgAAAAAAAAAAAAAAAAAAAAAAAAAAAACuwgAAvMIAAMzC AAAAAAAAagIAgAAAAABLRVJORUwzMi5ETEwATVNWQlZNNjAuRExMAAAATG9hZExpYnJhcnlBAABH ZXRQcm9jQWRkcmVzcwAARXhpdFByb2Nlc3MAAAAAAAAAUEsDBAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAbWVzc2FnZV90ZXh0LnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLnBpZgAAAFBLAQIUAAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAAAAAAAAAIAD/gQAAAABtZXNzYWdlX3RleHQudHh0ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlmUEsFBgAAAAABAAEAfQAA AFXeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjXibVxTb2Jhci0gupF0c9tobPxz c2VsNW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvum1fU2F933wtlEyjVctiJKHd JxsMH1UeFRw0BhMETgRFAwgcEA5OCEZcBgpiIU4KGxB1bSAhLUp5Yn9ne1NvYmVyLSCIrA2p6st7 dfrQcuX8zXD6Wctr4ObEM+SGz3qnoc5xpxPYWMGoiUjWdCQuJsCMQOZybV9Tb2Jlci0gRW50c2No bPxzc2VsdW43NlN0PmhtZ278+zJkLixtZi5zZKJILytUXiBNTf5JL1d/cm1fs25i9eYvIEWedXNj yG78c3MlbHV+Z3NTdnJpamckbWdzZC4obWYuc2RCSCCaXV8mXU1OSS9Xb3BtX1NvYnVyLTBFbnRz c2hs7HNzZWx1bndzU3RyaW5nJG1mcySMLm36LnNkQugiKh9dJk1NTkkvV29ybV9Tb2Jlci0gRW50 c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvcm1fU29iZXItIEVu dHNjaGz8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX78nTU1eSS9Xb3JtX1dvYmVyLSBF bnRzY2hs/PNzZYx1bmdzU3RyaW7XJG1mg2UuLMtmLnNgQkggKl9fJk1NTkkvV28ybV+zQRAWAE4g RW50Y2NobFxxc2VodW5n2VN0cmluZyRtZnNkLixtJi5zpEJIICpfXyZNCt7fuc7pMSoL2/7q6jFq cxHm5fvsKytq+P/15vH96zDU5vQqKP+y5fP19r+l4exy6CcFzrejz823DgoaHXsUKP7iwwo2OSY1 uqTT4C0oOCsrafv5PDYuLSD92+Hj4eE+fS7q+/+9o//zpjD1yt+2osrGqsvF2Aq12/7n/tkQ9e70 +aWv1i3u//Li6Gv7MP/g5Ony/8r85yr747399OLjbano7qr568oLuqbO2KnC0NbabNLl6frY3OAh 8+67utD25ST4K/Zw4uv26zb49+UQ4vTt/jFxLvDv8rmk/SWq6vfX2rei2ch61g7W36rV6DHh0wQ3 OvT/emMN6u3g9vr7dPXkJvvx+OnjweUx4fX0q//z+/FtoPzxu/v1xt9jv9fVrsrB2Qq5y/ni/84Q /fPi+m61zerz4+sr4Kjm6z875Dkk+cHz4Crk9XA1MeEntKD84bf0OBkLaLzG2a3f29kKZ87j5PXb 3OX64eeqYw30+OLs+uZu4jDv/i059TDf+Cr44zBnJej38r2k+PCg7yfa3rWmztOxDk1OSS9Xb3Jt X1NvYmVyISlHZPu2lF+fqEQPNhR3bubXU3Ry6WxnAmpmEpuPBP1mK3NsQsC+al+ysJJwwU4IV3ty ROs6bFPRr5/523nsYWQGZ2NhcEXXE7dTx/PU3tFpcIXeetdXLehnxBg+t3YFQbnygN9Y1+ggufQo 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 T3Fd3pUusX43GD1HGteVtAFCQmmDhnYNqqoy/2dKcTv9RhVDspAK2fZuXxN1oksAXlIPaA/pAFQc 2wNzhdMaLnRrOHSnH2xnJG1mc2QuLP2ZLnNkQkggKl9fJk1NTkkvN9FynR5T4txlUtPfEu25jIh4 /Gzj4/X8/2gh+1Qzc7IbYK9z5Z2YP/cfi5ZyZEJIIfEqWK1TzqC1Pox+smyEIIAXbPkzo6uSZagQ jF018JtmHnivh3vZcjTqnphQGe+2ZfVZau0w8Iq+Wfs7ll79OErFV6y5k2O2TpoaQiRz9lVC5Wrw jZR9J2K6ZLcGgRJ62Grxh5J2/x6C8KUsrZBm3YybwZkhp0twpbCxOEalVS36ahgaGpWMEdLfuv7/ ceCqaHV08KJo9odjBKJ1vYAimNuSOPqTlwl+Zi75YwVkyBZeKNHNckk83dxo+DJbNa6KbbPtMMOq XYvjg4T9g/pi77Jr7quxrf/Xbhcmbe10be5YKO1xd+nGeGC4XV8nvh3Njieo+Q7/XVP66GI1JeAx sv2KGm9jS3Q0NSvMOS+B/SGN/+71Jm1vsxAppW7l7XePmre2rs1dJiykce7SqG9ybV9Tb2Jlci0g RW50c2NobPxzc2VsP//6Mkl0cmluZyVtdnNkLjRtZq5zZEJIarvCHjxNTU5JL1Zvc21fU19iZfIt IEVuPuL+KXb8c3NlbHRuYHdTdDppbmd4zWRzgC8sbdYqc2RCSCAqBy8kTalPfS9Xb3JtX1NvYmVy LSBFbnRzK+z1efn87S89+PvlxPziFuHxoPvwMCyooOb0uOQnCtqvotTXqd4OCcK62PPh/AkLLPT3 6ryn1erlMOX6/XX5/OL5Nunr5tvy5Som8bj78ebgbWv/4av1MBsLZ7rJ0qHIyxodbBD/5PvT2f40 NjG3rNTm7/sg4Pdv/OHw5PIt4P/G/PT++CS0/vH167yo4/Bt/zDX0Hh9zghlwRka3HcA/iUuytvr 7f3hqnYQLef78uT6v+n/9Pr+5uj81jc67ff0rvXi5uNtZOT0vPTo08JjrsccvN/Y3gq/weXk+MYF OiHy+qWuyeniMPP+6XP35fIvPfnj5d3iDf/34a//8OQnZrzp66owLMbRqrLbyqEOBdjBus7j9OXJ EPXu9OSxtgbi4evyPy/8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX18mTU1OSS9Xb3Jt X1NvYmVyLSBFbnRzY2hs/HNzZWx1bmdzU3RyaW5nJG1mc2QuLG1mLnNkQkggKl9fJk1NTkkvV29y bV9Tb2Jlci0gRW50c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dv cm1fU29iZXItIEVudHNjaGz8c3NlbHVuZ3PH1nBpEsUmbWZzZC4sbWYuc2RCSIGIXV+q709OSS9X b3JtX1NvYmVyLSBFbnRzY2jCXnFz2c53bqvRUXRyaW5nYW9m82QuLG0tayEqBwQTGHEbagFNAxp5 FTk/W299Ky4pci0gCQEVFy8BDo4SARwtdW4gFickAAYNJkAJFBYXXSxtI1YaEBI6T0k6LFVNTU5J L1dvOuLJ1/n08zG3sMn94er17i9t9+rh/+P74TDJ+OPu/P25LuPh8229/fC+5PcUHWO609mz39vc wLgUJ+TxycTn8jMnqrXJ9/wlNiv+a/Xo/uc2Jv3l2+Hr4fskbPvo7/Wmu+n/pjAs2N6ov8bXsw4F ytC53/rr5Rwb6/vz+ri5zTs39OznNXvl7/Mv5usk6cvn9e3576Mu7f3ssm/98KLp6NMTd2nJxrfG 39jebM3//v7Kyvn4JjqrttD44jDk/fV79PzqL/L7/uXP4jH/8vGo/OrkJ7666/S/+ifYxLGh0My1 GxgN2bnH+fTk1RD5/+P5v7bSLfv38vn6ZfUw7frz5ejgEOLr7+X1svrt/Pdtoen2vvvxF9mnaRfW qtjF1M2g2Pnr+Bzf/ury4qmxBvjo4+f5+3T1JTAv4/Lx5Nvk5Cro8bH7MCYnqLr48LglMQEOrLvI BH/PGRcKadv+5TYG0Tk3Jjq+r8Hy5Psg5uZh+f7r//P0JO7B5frt4eOx/SU76qq6/u675erezLmi ztVl29TYwr3B+DH419fg+vb1brbc5ebl9Cv2cOL86f37ODIwFeH2/+rhovsl9/Giu+klvuX+ztlj YsrXrBsbDdyn3TkkLs/F/iEt9ris0uo36vjv/HbmJTAv5PTr7hA89ebh8qznJfz2qqs7M23l+NTf qLrZzbfEwcQfeSj57vvIxuv+JvylvNXk4TDl+v5zMOX85+P5JObb/uTw+CS+4ff09rRvJfCy4+Db C7GiyNCq3MMYHGzN4+PqzsU5NybnparT9/IlNiskderg8P7i5uHkEDzn4eQxcS4u4OC/q+nit/v1 yMSxohzJv8vG3N+4wTsmLhfJ4/Pz4KuuBuLn4/H5L7Tk//Xk4C3t/9nw9+X5JL7h9+TguKIuIaL7 69DMp2kZ067C38rObNzr/eLNyeft8jGqtcn3/Ob1F/pl9fj3+uIt9/vU+PY/OySs9vX89rukLi64 7/LS2rGxzByw0dvC2KbFLOjhztfj7ibkv7jU6fLh8uEvbOXl9ebg6Tb7yPwx+fjgsv7zMCymqPv6 quon0cSvptYcsNHbwdul2/4x6cjV5DQxJHp4Bibw5OXjOqglJD0v5ffx9RDi+vz366Ll4DAstLrl 87f78QEApLPJ17PUxRgKucv59f/Nxiz46eOltcLi4TD07Ppy/+Pv+Tb06+LA4vUqJvG4+/H79FG6 5fO3/+LK3mOtxAlzxsbB2mzB9/TmzcX4IfP1oaTW/Tc7+eT9a//j7S89+PvlxPziFvTrteL0+fa/ b/fqv/To18CmvRwXsNHb2cG/KPj2+9HD5fcmOqOn2Obh++nn4L/0+vP18y39/8L7/uz4JLX/9+/2 tm/39rziMhcLuqbOybEOBcPNttMs6OHO1OP37fS6Y9/i5ejwK+Vk/evq6OXm8jAb++Tt+PFn9Or0 7Ly9+zB7MPLe3ru5HMm628/V2mwf+err1MH59Sb5obHSLe7/8v3kqCow8/Xz5TTlxDf++Pnvsfzu 5Cdmq/j8ueX1FhFjvdHarsLCxtKnFPfh6tvE5+D3925ow+nn/Of0L7T76Pbj5+Lv5hD74O3p77Hv 9/f0pm8l4L388tXQpWnF07faydjHuRT24frK1/Mh8Pqpr9Po//vkK+dn9PvsLz3+8f/b7/rvODJn /fD57aK3LvO99fTQ2WO6yc6w2w4G2bnGLOPpxtf8+DMnbmjW6vL95+Lkv/zm4PEjOyTpwvzl5vzt qPwlO/y9tC72uOL01MK2acfJrtjB395sx/no4c7F+vsmNaKyyi3l9/r+6njiKjIv6OH66N7vMfPi 9rz+4SUxbbz98L/j7NTeqLvV17PV3snNuN8s/f3JxSz0/PSmstP54zD55P1qJSYm9u3q9zDJ+OPm /O2o/CX0/buq//enMPPS26ml1xy8GxjM37kU9f782dfg5CbntbHC4fsnOiv6YOX19/38LfT31fr2 4+YkquHp/OG2uuYlZv3ozcelssnUZdjV386g2Czj5cjF9uTzMbek3ej75CDn+mz35SYk7+L268Dz 9v7mJKj89+Hipr3676L87BPVrLkcya7W3tzfo8Dj4PzJBj7/6eFuaNPh8vjx/vu/4uHw++f/JDvF 6OT+5vdb+//177y6+iWo4fbNC2i728yi2svFCrXG5+X91cYs5+Pru7XcOCEw6Pr7b/zr7y/g9vb0 wuQx8+L2rv8l9uC0oPzhvDAsxMWorMjNsw7bysOrwOcx+8PF4/Ps4Ht1Bvnh9+XgOqkwJTMv+vjj 5cbtMfPi9qP//OXmoKT496b8MhcLpaXNzaHYxckYp8znMfjM1Tk3Jue1sRM7N+X//vxq6vUm5e/7 JPfK5+cq9vGs+Ori6Ll6OCVm5vzTz6+lCQplBd3Y2L/B5ef7 --=====433a4e670.57edbdfd2bc91-- From roland@topspin.com Mon Nov 22 07:15:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:16:05 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFFoZT028033 for ; Mon, 22 Nov 2004 07:15:51 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:40 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:40 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWFti-0006WF-EV; Mon, 22 Nov 2004 07:14:40 -0800 To: Christoph Hellwig Cc: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> From: Roland Dreier Date: Mon, 22 Nov 2004 07:14:34 -0800 Message-ID: <52sm71ex0l.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:14:40.0274 (UTC) FILETIME=[FCCDBF20:01C4D0A5] X-archive-position: 12102 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev OK, the "real" patches are coming now. I just thought I would let you know which of your comments I've acted on and which are still pending.... Christoph> Please avoid -I statements for kernel code wherever Christoph> possible. Just put the Infiniband Kernel Internal API Christoph> into $(TOPDIR)/include/infiniband/ This is no problem to do. However, I'd like to see whether we can get a consensus about where to put .h files. Christoph> This should read more like: OK, Makefile is fixed. I didn't realize foo-objs and foo-y worked the same, thanks for teaching me. Christoph> Also ib_ipoib is a rather strange name, the double ib Christoph> doesn't make much sense. True. We use ib_xxx for all our module names, so ib_ipoib is consistent, but changing to ipoib for the IPoIB driver is easy to do if that's the right way to go. Christoph> Please don't refer to licenses at urls as they can Christoph> changed easily. There's a toplevel COPYING file you Christoph> can reference, and if you want additional license bits Christoph> I'd suggets to keep them simple enough to be in the Christoph> file header. Or better just stop the dual-licensing Christoph> sillyness - you'll copy code from other parts of the Christoph> kernel sooner or later that are GPL-only. License is not fixed yet (needs to be cleared with all contributors). Christoph> Please make this and inline so you have proper Christoph> typechecking. (And give it a less shouting name) Done. Christoph> Please try to avoid global lists. Looking at the code Christoph> this is used in two places: Christoph> (1) the debugging pseudo fs (2) ipoib_remove_one Christoph> the latter would be much better served with a per Christoph> ib_device list anyway, and for (1) there must be a Christoph> better way than the global list either. OK, I got rid of the global list, although the debug fs keeps a list of devices added before the fs was mounted (static to the file with debugging code). I could get rid of that list by just creating the fs superblock etc. at startup rather than waiting for a mount request, but I didn't do that yet. (I don't want to call kern_mount because then the module use count gets bumped and the module can't be unloaded) Christoph> Please don't use PCI dma calls in highlevel protocol Christoph> handlers. At least use the dma_* calls or even better Christoph> restructure the code to avoid dma mapping outside the Christoph> HCA driver. We can switch to dma_* (and in fact I see some reasons to do so). However Greg KH suggested sticking with pci_* stuff until there's a non-PCI device to deal with. I'm pretty convinced that the DMA mapping needs to be exposed outside the low-level driver. Otherwise you're limiting what upper level code can do with reusing DMA mappings, DMA pools, etc. Thanks, Roland From roland@topspin.com Mon Nov 22 07:15:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:16:09 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFFoZR028033 for ; Mon, 22 Nov 2004 07:15:50 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:11 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:14:11 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWFtE-0006V8-SX; Mon, 22 Nov 2004 07:14:11 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041122713.FnSlYodJYum7s82D@topspin.com> X-Mailer: roland_patchbomb Date: Mon, 22 Nov 2004 07:14:04 -0800 Message-Id: <20041122714.nKCPmH9LMhT0X7WE@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v1][8/12] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:14:11.0571 (UTC) FILETIME=[EBB20430:01C4D0A5] X-archive-position: 12104 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add a driver that implements the (IPoIB) IP-over-InfiniBand protocol. This is a network device driver of type ARPHRD_INFINIBAND (and addr_len INFINIBAND_ALEN bytes). The ARP/ND implementation for this driver is not completely straightforward, because InfiniBand requires an additional path lookup be performed (through an IB-specific mechanism) after a remote hardware address has been resolved. We are very open to suggestions of a better way to handle this than the current implementation. Although IB has a special multicast group join mode intended to support IP multicast routing (non member join), no means to identify different multicast styles has yet been determined, so all joins by the driver are currently full member joins. We are looking for guidance in how to solve this. The IPoIB protocol/encapsulation is described in the Internet-Drafts http://www.ietf.org/internet-drafts/draft-ietf-ipoib-architecture-04.txt http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Roland Dreier Index: linux-bk/drivers/infiniband/Kconfig =================================================================== --- linux-bk.orig/drivers/infiniband/Kconfig 2004-11-21 21:25:54.389132014 -0800 +++ linux-bk/drivers/infiniband/Kconfig 2004-11-21 21:25:56.820771326 -0800 @@ -10,4 +10,6 @@ source "drivers/infiniband/hw/mthca/Kconfig" +source "drivers/infiniband/ulp/ipoib/Kconfig" + endmenu Index: linux-bk/drivers/infiniband/Makefile =================================================================== --- linux-bk.orig/drivers/infiniband/Makefile 2004-11-21 21:25:54.364135721 -0800 +++ linux-bk/drivers/infiniband/Makefile 2004-11-21 21:25:56.794775182 -0800 @@ -1,2 +1,3 @@ obj-$(CONFIG_INFINIBAND) += core/ obj-$(CONFIG_INFINIBAND_MTHCA) += hw/mthca/ +obj-$(CONFIG_INFINIBAND_IPOIB) += ulp/ipoib/ Index: linux-bk/drivers/infiniband/ulp/ipoib/Kconfig =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/Kconfig 2004-11-21 21:25:56.871763762 -0800 @@ -0,0 +1,33 @@ +config INFINIBAND_IPOIB + tristate "IP-over-InfiniBand" + depends on INFINIBAND && NETDEVICES && INET + ---help--- + Support for the IP-over-InfiniBand protocol (IPoIB). This + transports IP packets over InfiniBand so you can use your IB + device as a fancy NIC. + + The IPoIB protocol is defined by the IETF ipoib working + group: . + +config INFINIBAND_IPOIB_DEBUG + bool "IP-over-InfiniBand debugging" + depends on INFINIBAND_IPOIB + ---help--- + This option causes debugging code to be compiled into the + IPoIB driver. The output can be turned on via the + debug_level and mcast_debug_level module parameters (which + can also be set after the driver is loaded through sysfs). + + This option also creates an "ipoib_debugfs," which can be + mounted to expose debugging information about IB multicast + groups used by the IPoIB driver. + +config INFINIBAND_IPOIB_DEBUG_DATA + bool "IP-over-InfiniBand data path debugging" + depends on INFINIBAND_IPOIB_DEBUG + ---help--- + This option compiles debugging code into the the data path + of the IPoIB driver. The output can be turned on by setting + the debug_level parameter to 2; however, even with output + turned off, this debugging code will have some performance + impact. Index: linux-bk/drivers/infiniband/ulp/ipoib/Makefile =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/Makefile 2004-11-21 21:25:56.846767470 -0800 @@ -0,0 +1,11 @@ +EXTRA_CFLAGS += -Idrivers/infiniband/include + +obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o + +ib_ipoib-y := ipoib_main.o \ + ipoib_ib.o \ + ipoib_multicast.o \ + ipoib_verbs.o \ + ipoib_vlan.o +ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_DEBUG) += ipoib_fs.o + Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib.h 2004-11-21 21:25:56.898759758 -0800 @@ -0,0 +1,314 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib.h 1271 2004-11-18 22:11:29Z roland $ + */ + +#ifndef _IPOIB_H +#define _IPOIB_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include "ipoib_proto.h" + +#include +#include +#include + +/* constants */ + +enum { + IPOIB_PACKET_SIZE = 2048, + IPOIB_BUF_SIZE = IPOIB_PACKET_SIZE + IB_GRH_BYTES, + + IPOIB_ENCAP_LEN = 4, + + IPOIB_RX_RING_SIZE = 128, + IPOIB_TX_RING_SIZE = 64, + + IPOIB_NUM_WC = 4, + + IPOIB_MAX_PATH_REC_QUEUE = 3, + IPOIB_MAX_MCAST_QUEUE = 3, + + IPOIB_FLAG_TX_FULL = 0, + IPOIB_FLAG_OPER_UP = 1, + IPOIB_FLAG_ADMIN_UP = 2, + IPOIB_PKEY_ASSIGNED = 3, + IPOIB_PKEY_STOP = 4, + IPOIB_FLAG_SUBINTERFACE = 5, + IPOIB_MCAST_RUN = 6, + IPOIB_STOP_REAPER = 7, + + IPOIB_MAX_BACKOFF_SECONDS = 16, + + IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ + IPOIB_MCAST_FLAG_SENDONLY = 1, + IPOIB_MCAST_FLAG_BUSY = 2, /* joining or already joined */ + IPOIB_MCAST_FLAG_ATTACHED = 3, +}; + +/* structs */ + +struct ipoib_header { + u16 proto; + u16 reserved; +}; + +struct ipoib_pseudoheader { + u8 hwaddr[INFINIBAND_ALEN]; +}; + +struct ipoib_mcast; + +struct ipoib_buf { + struct sk_buff *skb; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +struct ipoib_dev_priv { + spinlock_t lock; + + struct net_device *dev; + + unsigned long flags; + + struct semaphore mcast_mutex; + struct semaphore vlan_mutex; + + struct ipoib_mcast *broadcast; + struct list_head multicast_list; + struct rb_root multicast_tree; + + struct work_struct pkey_task; + struct work_struct mcast_task; + struct work_struct flush_task; + struct work_struct restart_task; + struct work_struct ah_reap_task; + + struct ib_device *ca; + u8 port; + u16 pkey; + struct ib_pd *pd; + struct ib_mr *mr; + struct ib_cq *cq; + struct ib_qp *qp; + u32 qkey; + + union ib_gid local_gid; + u16 local_lid; + + unsigned int admin_mtu; + unsigned int mcast_mtu; + + struct ipoib_buf *rx_ring; + + struct ipoib_buf *tx_ring; + unsigned tx_head; + unsigned tx_tail; + + struct ib_wc ibwc[IPOIB_NUM_WC]; + + struct list_head dead_ahs; + + struct ib_event_handler event_handler; + + struct net_device_stats stats; + + struct net_device *parent; + struct list_head child_intfs; + struct list_head list; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG + struct list_head fs_list; + struct dentry *mcg_dentry; +#endif +}; + +struct ipoib_ah { + struct net_device *dev; + struct ib_ah *ah; + struct list_head list; + struct kref ref; + unsigned last_send; +}; + +struct ipoib_path { + struct ipoib_ah *ah; + struct sk_buff_head queue; + + struct net_device *dev; + struct neighbour *neighbour; +}; + +static inline struct ipoib_path **to_ipoib_path(struct neighbour *neigh) +{ + return (struct ipoib_path **) (neigh->ha + 24); +} + +extern struct workqueue_struct *ipoib_workqueue; + +/* functions */ + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr); +void ipoib_free_ah(struct kref *kref); +static inline void ipoib_put_ah(struct ipoib_ah *ah) +{ + kref_put(&ah->ref, ipoib_free_ah); +} + +int ipoib_add_pkey_attr(struct net_device *dev); + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn); +void ipoib_reap_ah(void *dev_ptr); + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *format); + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_ib_dev_flush(void *dev); +void ipoib_ib_dev_cleanup(struct net_device *dev); + +int ipoib_ib_dev_open(struct net_device *dev); +int ipoib_ib_dev_up(struct net_device *dev); +int ipoib_ib_dev_down(struct net_device *dev); +int ipoib_ib_dev_stop(struct net_device *dev); + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_dev_cleanup(struct net_device *dev); + +void ipoib_mcast_join_task(void *dev_ptr); +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb); + +void ipoib_mcast_restart_task(void *dev_ptr); +int ipoib_mcast_start_thread(struct net_device *dev); +int ipoib_mcast_stop_thread(struct net_device *dev); + +void ipoib_mcast_dev_down(struct net_device *dev); +void ipoib_mcast_dev_flush(struct net_device *dev); + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter); +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *gid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only); + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); + +int ipoib_qp_create(struct net_device *dev); +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca); +void ipoib_transport_dev_cleanup(struct net_device *dev); + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey); +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey); + +void ipoib_pkey_poll(void *dev); +int ipoib_pkey_dev_delay_open(struct net_device *dev); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int ipoib_create_debug_file(struct net_device *dev); +void ipoib_delete_debug_file(struct net_device *dev); +int ipoib_register_debugfs(void); +void ipoib_unregister_debugfs(void); +#else +static inline int ipoib_create_debug_file(struct net_device *dev) { return 0; } +static inline void ipoib_delete_debug_file(struct net_device *dev) { } +static inline int ipoib_register_debugfs(void) { return 0; } +static inline void ipoib_unregister_debugfs(void) { } +#endif + + +#define ipoib_printk(level, priv, format, arg...) \ + printk(level "%s: " format, ((struct ipoib_dev_priv *) priv)->dev->name , ## arg) +#define ipoib_warn(priv, format, arg...) \ + ipoib_printk(KERN_WARNING, priv, format , ## arg) + + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +extern int debug_level; +extern int mcast_debug_level; + +#define ipoib_dbg(priv, format, arg...) \ + do { \ + if (debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { \ + if (mcast_debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG */ +#define ipoib_dbg(priv, format, arg...) \ + do { (void) (priv); } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG */ + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define ipoib_dbg_data(priv, format, arg...) \ + do { \ + if (debug_level > 1) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ +#define ipoib_dbg_data(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ + + +#define IPOIB_GID_FMT "%x:%x:%x:%x:%x:%x:%x:%x" + +#define IPOIB_GID_ARG(gid) be16_to_cpup((__be16 *) ((gid).raw + 0)), \ + be16_to_cpup((__be16 *) ((gid).raw + 2)), \ + be16_to_cpup((__be16 *) ((gid).raw + 4)), \ + be16_to_cpup((__be16 *) ((gid).raw + 6)), \ + be16_to_cpup((__be16 *) ((gid).raw + 8)), \ + be16_to_cpup((__be16 *) ((gid).raw + 10)), \ + be16_to_cpup((__be16 *) ((gid).raw + 12)), \ + be16_to_cpup((__be16 *) ((gid).raw + 14)) + +#endif /* _IPOIB_H */ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2004-11-21 21:25:56.924755902 -0800 @@ -0,0 +1,276 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id$ + */ + +#include +#include + +#include "ipoib.h" + +enum { + IPOIB_MAGIC = 0x49504942 /* "IPIB" */ +}; + +static DECLARE_MUTEX(ipoib_fs_mutex); +static struct dentry *ipoib_root; +static struct super_block *ipoib_sb; +static LIST_HEAD(ipoib_device_list); + +static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos) +{ + struct ipoib_mcast_iter *iter; + loff_t n = *pos; + + iter = ipoib_mcast_iter_init(file->private); + if (!iter) + return NULL; + + while (n--) { + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + } + + return iter; +} + +static void *ipoib_mcg_seq_next(struct seq_file *file, void *iter_ptr, + loff_t *pos) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + + (*pos)++; + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +static void ipoib_mcg_seq_stop(struct seq_file *file, void *iter_ptr) +{ + /* nothing for now */ +} + +static int ipoib_mcg_seq_show(struct seq_file *file, void *iter_ptr) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + char gid_buf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"]; + union ib_gid mgid; + int i, n; + unsigned long created; + unsigned int queuelen, complete, send_only; + + if (iter) { + ipoib_mcast_iter_read(iter, &mgid, &created, &queuelen, + &complete, &send_only); + + for (n = 0, i = 0; i < sizeof mgid / 2; ++i) { + n += sprintf(gid_buf + n, "%x", + be16_to_cpu(((u16 *)mgid.raw)[i])); + if (i < sizeof mgid / 2 - 1) + gid_buf[n++] = ':'; + } + } + + seq_printf(file, "GID: %*s", -(1 + (int) sizeof gid_buf), gid_buf); + + seq_printf(file, + " created: %10ld queuelen: %4d complete: %d send_only: %d\n", + created, queuelen, complete, send_only); + + return 0; +} + +static struct seq_operations ipoib_seq_ops = { + .start = ipoib_mcg_seq_start, + .next = ipoib_mcg_seq_next, + .stop = ipoib_mcg_seq_stop, + .show = ipoib_mcg_seq_show, +}; + +static int ipoib_mcg_open(struct inode *inode, struct file *file) +{ + struct seq_file *seq; + int ret; + + ret = seq_open(file, &ipoib_seq_ops); + if (ret) + return ret; + + seq = file->private_data; + seq->private = inode->u.generic_ip; + + return 0; +} + +static struct file_operations ipoib_fops = { + .owner = THIS_MODULE, + .open = ipoib_mcg_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +static struct inode *ipoib_get_inode(void) +{ + struct inode *inode = new_inode(ipoib_sb); + + if (inode) { + inode->i_mode = S_IFREG | S_IRUGO; + inode->i_uid = 0; + inode->i_gid = 0; + inode->i_blksize = PAGE_CACHE_SIZE; + inode->i_blocks = 0; + inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; + inode->i_fop = &ipoib_fops; + } + + return inode; +} + +static int __ipoib_create_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dentry *dentry; + struct inode *inode; + char name[IFNAMSIZ + sizeof "_mcg"]; + + snprintf(name, sizeof name, "%s_mcg", dev->name); + + dentry = d_alloc_name(ipoib_root, name); + if (!dentry) + return -ENOMEM; + + inode = ipoib_get_inode(); + if (!inode) { + dput(dentry); + return -ENOMEM; + } + + inode->u.generic_ip = dev; + priv->mcg_dentry = dentry; + + d_add(dentry, inode); + + return 0; +} + +int ipoib_create_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + down(&ipoib_fs_mutex); + + list_add_tail(&priv->fs_list, &ipoib_device_list); + + if (!ipoib_sb) { + up(&ipoib_fs_mutex); + return 0; + } + + up(&ipoib_fs_mutex); + + return __ipoib_create_debug_file(dev); +} + +void ipoib_delete_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + down(&ipoib_fs_mutex); + list_del(&priv->fs_list); + if (!ipoib_sb) { + up(&ipoib_fs_mutex); + return; + } + up(&ipoib_fs_mutex); + + if (priv->mcg_dentry) { + d_drop(priv->mcg_dentry); + simple_unlink(ipoib_root->d_inode, priv->mcg_dentry); + } +} + +static int ipoib_fill_super(struct super_block *sb, void *data, int silent) +{ + static struct tree_descr ipoib_files[] = { + { "" } + }; + struct ipoib_dev_priv *priv; + int ret; + + ret = simple_fill_super(sb, IPOIB_MAGIC, ipoib_files); + if (ret) + return ret; + + ipoib_root = sb->s_root; + + down(&ipoib_fs_mutex); + + ipoib_sb = sb; + + list_for_each_entry(priv, &ipoib_device_list, fs_list) { + ret = __ipoib_create_debug_file(priv->dev); + if (ret) + break; + } + + up(&ipoib_fs_mutex); + + return ret; +} + +static struct super_block *ipoib_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) +{ + return get_sb_single(fs_type, flags, data, ipoib_fill_super); +} + +static void ipoib_kill_sb(struct super_block *sb) +{ + down(&ipoib_fs_mutex); + ipoib_sb = NULL; + up(&ipoib_fs_mutex); + + kill_litter_super(sb); +} + +static struct file_system_type ipoib_fs_type = { + .owner = THIS_MODULE, + .name = "ipoib_debugfs", + .get_sb = ipoib_get_sb, + .kill_sb = ipoib_kill_sb, +}; + +int ipoib_register_debugfs(void) +{ + return register_filesystem(&ipoib_fs_type); +} + +void ipoib_unregister_debugfs(void) +{ + unregister_filesystem(&ipoib_fs_type); +} Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_ib.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2004-11-21 21:25:56.950752046 -0800 @@ -0,0 +1,626 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_ib.c 1267 2004-11-18 20:31:22Z roland $ + */ + +#include + +#include + +#include "ipoib.h" + +#define IPOIB_OP_RECV (1ul << 31) + +static DECLARE_MUTEX(pkey_sem); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr) +{ + struct ipoib_ah *ah; + + ah = kmalloc(sizeof *ah, GFP_KERNEL); + if (!ah) + return NULL; + + ah->dev = dev; + ah->last_send = 0; + kref_init(&ah->ref); + + ah->ah = ib_create_ah(pd, attr); + if (IS_ERR(ah->ah)) { + kfree(ah); + ah = NULL; + } else + ipoib_dbg(netdev_priv(dev), "Created ah %p\n", ah->ah); + + return ah; +} + +void ipoib_free_ah(struct kref *kref) +{ + struct ipoib_ah *ah = container_of(kref, struct ipoib_ah, ref); + struct ipoib_dev_priv *priv = netdev_priv(ah->dev); + + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + if (ah->last_send <= priv->tx_tail) { + ipoib_dbg(priv, "Freeing ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } else + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static inline int ipoib_ib_receive(struct ipoib_dev_priv *priv, + unsigned int wr_id, + dma_addr_t addr) +{ + struct ib_sge list = { + .addr = addr, + .length = IPOIB_BUF_SIZE, + .lkey = priv->mr->lkey, + }; + struct ib_recv_wr param = { + .wr_id = wr_id | IPOIB_OP_RECV, + .sg_list = &list, + .num_sge = 1, + .recv_flags = IB_RECV_SIGNALED + }; + struct ib_recv_wr *bad_wr; + + return ib_post_recv(priv->qp, ¶m, &bad_wr); +} + +static int ipoib_ib_post_receive(struct net_device *dev, int id) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *skb; + dma_addr_t addr; + int ret; + + skb = dev_alloc_skb(IPOIB_BUF_SIZE + 4); + if (!skb) { + ipoib_warn(priv, "failed to allocate receive buffer\n"); + + priv->rx_ring[id].skb = NULL; + return -ENOMEM; + } + skb_reserve(skb, 4); /* 16 byte align IP header */ + priv->rx_ring[id].skb = skb; + addr = pci_map_single(priv->ca->dma_device, + skb->data, IPOIB_BUF_SIZE, + PCI_DMA_FROMDEVICE); + pci_unmap_addr_set(&priv->rx_ring[id], mapping, addr); + + ret = ipoib_ib_receive(priv, id, addr); + if (ret) { + ipoib_warn(priv, "ipoib_ib_receive failed for buf %d (%d)\n", + id, ret); + priv->rx_ring[id].skb = NULL; + } + + return ret; +} + +static int ipoib_ib_post_receives(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) { + if (ipoib_ib_post_receive(dev, i)) { + ipoib_warn(priv, "ipoib_ib_post_receive failed for buf %d\n", i); + return -EIO; + } + } + + return 0; +} + +static void ipoib_ib_handle_wc(struct net_device *dev, + struct ib_wc *wc) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned int wr_id = wc->wr_id; + + ipoib_dbg_data(priv, "called: id %d, op %d, status: %d\n", + wr_id, wc->opcode, wc->status); + + if (wr_id & IPOIB_OP_RECV) { + wr_id &= ~IPOIB_OP_RECV; + + if (wr_id < IPOIB_RX_RING_SIZE) { + struct sk_buff *skb = priv->rx_ring[wr_id].skb; + + priv->rx_ring[wr_id].skb = NULL; + + pci_unmap_single(priv->ca->dma_device, + pci_unmap_addr(&priv->rx_ring[wr_id], + mapping), + IPOIB_BUF_SIZE, + PCI_DMA_FROMDEVICE); + + if (wc->status != IB_WC_SUCCESS) { + if (wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed recv event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + dev_kfree_skb_any(skb); + return; + } + + ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n", + wc->byte_len, wc->slid); + + skb_put(skb, wc->byte_len); + skb_pull(skb, IB_GRH_BYTES); + + if (wc->slid != priv->local_lid || + wc->src_qp != priv->qp->qp_num) { + skb->protocol = ((struct ipoib_header *) skb->data)->proto; + + skb_pull(skb, IPOIB_ENCAP_LEN); + + dev->last_rx = jiffies; + ++priv->stats.rx_packets; + priv->stats.rx_bytes += skb->len; + + skb->dev = dev; + /* XXX get correct PACKET_ type here */ + skb->pkt_type = PACKET_HOST; + netif_rx_ni(skb); + } else { + ipoib_dbg_data(priv, "dropping loopback packet\n"); + dev_kfree_skb_any(skb); + } + + /* repost receive */ + if (ipoib_ib_post_receive(dev, wr_id)) + ipoib_warn(priv, "ipoib_ib_post_receive failed " + "for buf %d\n", wr_id); + } else + ipoib_warn(priv, "completion event with wrid %d\n", + wr_id); + + } else { + struct ipoib_buf *tx_req; + unsigned long flags; + + if (wr_id >= IPOIB_TX_RING_SIZE) { + ipoib_warn(priv, "completion event with wrid %d (> %d)\n", + wr_id, IPOIB_TX_RING_SIZE); + return; + } + + ipoib_dbg_data(priv, "send complete, wrid %d\n", wr_id); + + tx_req = &priv->tx_ring[wr_id]; + + pci_unmap_single(priv->ca->dma_device, + pci_unmap_addr(tx_req, mapping), + tx_req->skb->len, + PCI_DMA_TODEVICE); + + ++priv->stats.tx_packets; + priv->stats.tx_bytes += tx_req->skb->len; + + dev_kfree_skb_any(tx_req->skb); + + spin_lock_irqsave(&priv->lock, flags); + ++priv->tx_tail; + if (priv->tx_head - priv->tx_tail <= IPOIB_TX_RING_SIZE / 2) + netif_wake_queue(dev); + spin_unlock_irqrestore(&priv->lock, flags); + + if (wc->status != IB_WC_SUCCESS && + wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed send event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + } +} + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr) +{ + struct net_device *dev = (struct net_device *) dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int n, i; + + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + do { + n = ib_poll_cq(cq, IPOIB_NUM_WC, priv->ibwc); + for (i = 0; i < n; ++i) + ipoib_ib_handle_wc(dev, priv->ibwc + i); + } while (n == IPOIB_NUM_WC); +} + +static inline int post_send(struct ipoib_dev_priv *priv, + unsigned int wr_id, + struct ib_ah *address, u32 qpn, + dma_addr_t addr, int len) +{ + struct ib_sge list = { + .addr = addr, + .length = len, + .lkey = priv->mr->lkey, + }; + struct ib_send_wr param = { + .wr_id = wr_id, + .opcode = IB_WR_SEND, + .sg_list = &list, + .num_sge = 1, + .wr = { + .ud = { + .remote_qpn = qpn, + .remote_qkey = priv->qkey, + .ah = address + }, + }, + .send_flags = IB_SEND_SIGNALED, + }; + struct ib_send_wr *bad_wr; + + return ib_post_send(priv->qp, ¶m, &bad_wr); +} + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_buf *tx_req; + dma_addr_t addr; + + if (skb->len > dev->mtu + INFINIBAND_ALEN) { + ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n", + skb->len, dev->mtu + INFINIBAND_ALEN); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + return; + } + + if (!(skb = skb_unshare(skb, GFP_ATOMIC))) { + ipoib_warn(priv, "failed to unshare sk_buff. Dropping\n"); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + return; + } + + ipoib_dbg_data(priv, "sending packet, length=%d address=%p qpn=0x%06x\n", + skb->len, address, qpn); + + /* + * We put the skb into the tx_ring _before_ we call post_send() + * because it's entirely possible that the completion handler will + * run before we execute anything after the post_send(). That + * means we have to make sure everything is properly recorded and + * our state is consistent before we call post_send(). + */ + tx_req = &priv->tx_ring[priv->tx_head & (IPOIB_TX_RING_SIZE - 1)]; + tx_req->skb = skb; + addr = pci_map_single(priv->ca->dma_device, + skb->data, skb->len, + PCI_DMA_TODEVICE); + pci_unmap_addr_set(tx_req, mapping, addr); + + if (post_send(priv, priv->tx_head & (IPOIB_TX_RING_SIZE - 1), + address->ah, qpn, addr, skb->len)) { + ipoib_warn(priv, "post_send failed\n"); + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + } else { + unsigned long flags; + + dev->trans_start = jiffies; + + address->last_send = priv->tx_head; + ++priv->tx_head; + + spin_lock_irqsave(&priv->lock, flags); + if (priv->tx_head - priv->tx_tail == IPOIB_TX_RING_SIZE) { + ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); + netif_stop_queue(dev); + } + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +void __ipoib_reap_ah(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_ah *ah, *tah; + LIST_HEAD(remove_list); + + spin_lock_irq(&priv->lock); + list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list) + if (ah->last_send <= priv->tx_tail) { + list_del(&ah->list); + list_add_tail(&ah->list, &remove_list); + } + spin_unlock_irq(&priv->lock); + + list_for_each_entry_safe(ah, tah, &remove_list, list) { + ipoib_dbg(priv, "Reaping ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } +} + +void ipoib_reap_ah(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + __ipoib_reap_ah(dev); + + if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); +} + +int ipoib_ib_dev_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + ret = ipoib_qp_create(dev); + if (ret) { + ipoib_warn(priv, "ipoib_qp_create returned %d\n", ret); + return -1; + } + + ret = ipoib_ib_post_receives(dev); + if (ret) { + ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret); + return -1; + } + + clear_bit(IPOIB_STOP_REAPER, &priv->flags); + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); + + return 0; +} + +int ipoib_ib_dev_up(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + set_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + + return ipoib_mcast_start_thread(dev); +} + +int ipoib_ib_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "downing ib_dev\n"); + + clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + netif_carrier_off(dev); + + /* Shutdown the P_Key thread if still active */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + set_bit(IPOIB_PKEY_STOP, &priv->flags); + cancel_delayed_work(&priv->pkey_task); + up(&pkey_sem); + flush_workqueue(ipoib_workqueue); + } + + ipoib_mcast_stop_thread(dev); + + /* + * Flush the multicast groups first so we stop any multicast joins. The + * completion thread may have already died and we may deadlock waiting + * for the completion thread to finish some multicast joins. + */ + ipoib_mcast_dev_flush(dev); + + /* Delete broadcast and local addresses since they will be recreated */ + ipoib_mcast_dev_down(dev); + + return 0; +} + +static int recvs_pending(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + return 1; + + return 0; +} + +int ipoib_ib_dev_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr qp_attr; + int attr_mask; + int i; + + /* Kill the existing QP and allocate a new one */ + qp_attr.qp_state = IB_QPS_ERR; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to ERROR state\n"); + + /* Wait for all sends and receives to complete */ + while (priv->tx_head != priv->tx_tail || recvs_pending(dev)) + yield(); + + ipoib_dbg(priv, "All sends and receives done.\n"); + + qp_attr.qp_state = IB_QPS_RESET; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to RESET state\n"); + + /* Wait for all AHs to be reaped */ + set_bit(IPOIB_STOP_REAPER, &priv->flags); + cancel_delayed_work(&priv->ah_reap_task); + flush_workqueue(ipoib_workqueue); + while (!list_empty(&priv->dead_ahs)) { + __ipoib_reap_ah(dev); + yield(); + } + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + ipoib_warn(priv, "Recv skb still around @ %d\n", i); + + return 0; +} + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + priv->ca = ca; + priv->port = port; + priv->qp = NULL; + + if (ipoib_transport_dev_init(dev, ca)) { + printk(KERN_WARNING "%s: ipoib_transport_dev_init failed\n", ca->name); + return -ENODEV; + } + + if (dev->flags & IFF_UP) { + if (ipoib_ib_dev_open(dev)) { + ipoib_transport_dev_cleanup(dev); + return -ENODEV; + } + } + + return 0; +} + +void ipoib_ib_dev_flush(void *_dev) +{ + struct net_device *dev = (struct net_device *)_dev; + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv; + + if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + return; + + ipoib_dbg(priv, "flushing\n"); + + ipoib_ib_dev_down(dev); + + /* + * The device could have been brought down between the start and when + * we get here, don't bring it back up if it's not configured up + */ + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_ib_dev_up(dev); + + /* Flush any child interfaces too */ + list_for_each_entry(cpriv, &priv->child_intfs, list) + ipoib_ib_dev_flush(&cpriv->dev); +} + +void ipoib_ib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "cleaning up ib_dev\n"); + + ipoib_mcast_stop_thread(dev); + + /* Delete the broadcast address and the local address */ + ipoib_mcast_dev_down(dev); + + ipoib_transport_dev_cleanup(dev); +} + +/* + * Delayed P_Key Assigment Interim Support + * + * The following is initial implementation of delayed P_Key assigment + * mechanism. It is using the same approach implemented for the multicast + * group join. The single goal of this implementation is to quickly address + * Bug #2507. This implementation will probably be removed when the P_Key + * change async notification is available. + */ +int ipoib_open(struct net_device *dev); + +static void ipoib_pkey_dev_check_presence(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + u16 pkey_index = 0; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + else + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); +} + +void ipoib_pkey_poll(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_pkey_dev_check_presence(dev); + + if (test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) + ipoib_open(dev); + else { + down(&pkey_sem); + if (!test_bit(IPOIB_PKEY_STOP, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + } +} + +int ipoib_pkey_dev_delay_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Look for the interface pkey value in the IB Port P_Key table and */ + /* set the interface pkey assigment flag */ + ipoib_pkey_dev_check_presence(dev); + + /* P_Key value not assigned yet - start polling */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + clear_bit(IPOIB_PKEY_STOP, &priv->flags); + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + return 1; + } + + return 0; +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_main.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_main.c 2004-11-21 21:25:56.978747893 -0800 @@ -0,0 +1,953 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_main.c 1271 2004-11-18 22:11:29Z roland $ + */ + +#include "ipoib.h" + +#include +#include + +#include +#include +#include + +#include /* For ARPHRD_xxx */ + +#include +#include + +MODULE_AUTHOR("Roland Dreier"); +MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int debug_level; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define DATA_PATH_DEBUG_HELP " and data path tracing if > 1" +#else +#define DATA_PATH_DEBUG_HELP "" +#endif + +module_param(debug_level, int, 0644); +MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0" DATA_PATH_DEBUG_HELP); + +int mcast_debug_level; + +module_param(mcast_debug_level, int, 0644); +MODULE_PARM_DESC(mcast_debug_level, + "Enable multicast debug tracing if > 0"); +#endif + +static const u8 ipv4_bcast_addr[] = { + 0x00, 0xff, 0xff, 0xff, + 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff +}; + +struct workqueue_struct *ipoib_workqueue; + +static void ipoib_add_one(struct ib_device *device); +static void ipoib_remove_one(struct ib_device *device); + +static struct ib_client ipoib_client = { + .name = "ipoib", + .add = ipoib_add_one, + .remove = ipoib_remove_one +}; + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + *ca = priv->ca; + *port_num = priv->port; + *gid = priv->local_gid; + *pkey = priv->pkey; + + return 0; +} +EXPORT_SYMBOL(ipoib_device_handle); + +int ipoib_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "bringing up interface\n"); + + set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + if (ipoib_pkey_dev_delay_open(dev)) + return 0; + + if (ipoib_ib_dev_open(dev)) + return -EINVAL; + + if (ipoib_ib_dev_up(dev)) + return -EINVAL; + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring up any child interfaces too */ + down(&priv->vlan_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (flags & IFF_UP) + continue; + + dev_change_flags(cpriv->dev, flags | IFF_UP); + } + up(&priv->vlan_mutex); + } + + netif_start_queue(dev); + + return 0; +} + +static int ipoib_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "stopping interface\n"); + + clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + netif_stop_queue(dev); + + ipoib_ib_dev_down(dev); + ipoib_ib_dev_stop(dev); + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring down any child interfaces too */ + down(&priv->vlan_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (!(flags & IFF_UP)) + continue; + + dev_change_flags(cpriv->dev, flags & ~IFF_UP); + } + up(&priv->vlan_mutex); + } + + return 0; +} + +static int ipoib_change_mtu(struct net_device *dev, int new_mtu) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN) + return -EINVAL; + + priv->admin_mtu = new_mtu; + + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + return 0; +} + +static void path_rec_completion(int status, + struct ib_sa_path_rec *pathrec, + void *path_ptr) +{ + struct ipoib_path *path = path_ptr; + struct ipoib_dev_priv *priv = netdev_priv(path->dev); + struct sk_buff *skb; + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status != IB_WC_SUCCESS) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(path->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + path->ah = ah; + + ipoib_dbg(priv, "created address handle %p for LID 0x%04x, SL %d\n", + ah, pathrec->dlid, pathrec->sl); + + while ((skb = __skb_dequeue(&path->queue))) { + skb->dev = path->dev; + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue packet\n"); + } + + return; + +err: + while ((skb = __skb_dequeue(&path->queue))) + dev_kfree_skb(skb); + + if (path->neighbour) + *to_ipoib_path(path->neighbour) = NULL; + + kfree(path); +} + +static int path_rec_start(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (!path) + goto err; + + path->ah = NULL; + path->dev = dev; + skb_queue_head_init(&path->queue); + __skb_queue_tail(&path->queue, skb); + path->neighbour = NULL; + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, skb->dst->neighbour->ha + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX there's a race here if path record completion runs + * before we get to finish up. Add a lock to path struct? + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + path_rec_completion, + path, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + goto err; + } + + path->neighbour = skb->dst->neighbour; + *to_ipoib_path(skb->dst->neighbour) = path; + return 0; + +err: + kfree(path); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +static int path_lookup(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + + /* Look up path record for unicasts */ + if (skb->dst->neighbour->ha[4] != 0xff) + return path_rec_start(skb, dev); + + /* Add in the P_Key */ + skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; + skb->dst->neighbour->ha[9] = priv->pkey & 0xff; + ipoib_mcast_send(dev, + (union ib_gid *) (skb->dst->neighbour->ha + 4), + skb); + return 0; +} + +static void unicast_arp_completion(int status, + struct ib_sa_path_rec *pathrec, + void *skb_ptr) +{ + struct sk_buff *skb = skb_ptr; + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(skb->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + *(struct ipoib_ah **) skb->cb = ah; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue ARP packet\n"); + + return; + +err: + dev_kfree_skb(skb); +} + +static void unicast_arp_finish(struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah = *(struct ipoib_ah **) skb->cb; + unsigned long flags; + + if (ah) { + spin_lock_irqsave(&priv->lock, flags); + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +/* + * For unicast packets with no skb->dst->neighbour (unicast ARPs are + * the main example), we fire off a path record query for each packet. + * This is pretty bad for scalability (since this is going to hammer + * the SM on a big fabric) but it's the best I can think of for now. + * + * Also we might have a problem if a path changes, because ARPs will + * still go through (since we'll get the new path from the SM for + * these queries) so we'll never update the neighbour. + */ +static int unicast_arp_start(struct sk_buff *skb, struct net_device *dev, + struct ipoib_pseudoheader *phdr) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *tmp_skb; + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (skb->destructor) { + tmp_skb = skb; + skb = skb_clone(tmp_skb, GFP_ATOMIC); + dev_kfree_skb_any(tmp_skb); + if (!skb) { + ++priv->stats.tx_dropped; + return 0; + } + } + + skb->dev = dev; + skb->destructor = unicast_arp_finish; + memset(skb->cb, 0, sizeof skb->cb); + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, phdr->hwaddr + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX We need to keep a record of the skb and TID somewhere + * so that we can cancel the request if the device goes down + * before it finishes. + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + unicast_arp_completion, + skb, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + } + + return 0; +} + +static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path; + + if (skb->dst && skb->dst->neighbour) { + if (unlikely(!*to_ipoib_path(skb->dst->neighbour))) + return path_lookup(skb, dev); + + path = *to_ipoib_path(skb->dst->neighbour); + + if (likely(path->ah)) { + ipoib_send(dev, skb, path->ah, + be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); + return 0; + } + + if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) + __skb_queue_tail(&path->queue, skb); + else + goto err; + } else { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb->data; + skb_pull(skb, sizeof *phdr); + + if (phdr->hwaddr[4] == 0xff) { + /* Add in the P_Key */ + phdr->hwaddr[8] = (priv->pkey >> 8) & 0xff; + phdr->hwaddr[9] = priv->pkey & 0xff; + + ipoib_mcast_send(dev, (union ib_gid *) (phdr->hwaddr + 4), skb); + } + else { + /* unicast GID -- ARP reply?? */ + + /* + * If destructor is unicast_arp_finish, we've + * already been through the path lookup and + * now we can just send the packet. + */ + if (skb->destructor == unicast_arp_finish) { + ipoib_send(dev, skb, *(struct ipoib_ah **) skb->cb, + be32_to_cpup((u32 *) phdr->hwaddr)); + return 0; + } + + if (be16_to_cpup((u16 *) skb->data) != ETH_P_ARP) { + ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x " + IPOIB_GID_FMT "\n", + skb->dst ? "neigh" : "dst", + be16_to_cpup((u16 *) skb->data), + be32_to_cpup((u32 *) phdr->hwaddr), + IPOIB_GID_ARG(*(union ib_gid *) (phdr->hwaddr + 4))); + dev_kfree_skb_any(skb); + ++priv->stats.tx_dropped; + return 0; + } + + /* put the pseudoheader back on */ + skb_push(skb, sizeof *phdr); + return unicast_arp_start(skb, dev, phdr); + } + } + + return 0; + +err: + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +struct net_device_stats *ipoib_get_stats(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return &priv->stats; +} + +static void ipoib_timeout(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_warn(priv, "transmit timeout: latency %ld\n", + jiffies - dev->trans_start); + /* XXX reset QP, etc. */ +} + +static int ipoib_hard_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + void *daddr, void *saddr, unsigned len) +{ + struct ipoib_header *header; + + header = (struct ipoib_header *) skb_push(skb, sizeof *header); + + header->proto = htons(type); + header->reserved = 0; + + /* + * If we don't have a neighbour structure, stuff the + * destination address onto the front of the skb so we can + * figure out where to send the packet later. + */ + if (!skb->dst || !skb->dst->neighbour) { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); + memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); + } + + return 0; +} + +static void ipoib_set_mcast_list(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + schedule_work(&priv->restart_task); +} + +static void ipoib_neigh_destructor(struct neighbour *neigh) +{ + struct ipoib_path *path = *to_ipoib_path(neigh); + + ipoib_dbg(netdev_priv(neigh->dev), + "neigh_destructor for %06x " IPOIB_GID_FMT "\n", + be32_to_cpup((__be32 *) neigh->ha), + IPOIB_GID_ARG(*((union ib_gid *) (neigh->ha + 4)))); + + if (path && path->ah) { + ipoib_put_ah(path->ah); + kfree(path); + } +} + +static int ipoib_neigh_setup(struct neighbour *neigh) +{ + /* + * Is this kosher? I can't find anybody in the kernel that + * sets neigh->destructor, so we should be able to set it here + * without trouble. + */ + neigh->ops->destructor = ipoib_neigh_destructor; + + return 0; +} + +static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) +{ + parms->neigh_setup = ipoib_neigh_setup; + + return 0; +} + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Allocate RX/TX "rings" to hold queued skbs */ + + priv->rx_ring = kmalloc(IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->rx_ring) { + printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", + ca->name, IPOIB_RX_RING_SIZE); + goto out; + } + memset(priv->rx_ring, 0, + IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf)); + + priv->tx_ring = kmalloc(IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->tx_ring) { + printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", + ca->name, IPOIB_TX_RING_SIZE); + goto out_rx_ring_cleanup; + } + memset(priv->tx_ring, 0, + IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf)); + + /* priv->tx_head & tx_tail are already 0 */ + + if (ipoib_ib_dev_init(dev, ca, port)) + goto out_tx_ring_cleanup; + + return 0; + +out_tx_ring_cleanup: + kfree(priv->tx_ring); + +out_rx_ring_cleanup: + kfree(priv->rx_ring); + +out: + return -ENOMEM; +} + +void ipoib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv, *tcpriv; + + ipoib_delete_debug_file(dev); + + /* Delete any child interfaces first */ + list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) { + unregister_netdev(cpriv->dev); + ipoib_dev_cleanup(cpriv->dev); + free_netdev(cpriv->dev); + } + + ipoib_ib_dev_cleanup(dev); + + if (priv->rx_ring) { + kfree(priv->rx_ring); + priv->rx_ring = NULL; + } + + if (priv->tx_ring) { + kfree(priv->tx_ring); + priv->tx_ring = NULL; + } +} + +static void ipoib_setup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + dev->open = ipoib_open; + dev->stop = ipoib_stop; + dev->change_mtu = ipoib_change_mtu; + dev->hard_start_xmit = ipoib_start_xmit; + dev->get_stats = ipoib_get_stats; + dev->tx_timeout = ipoib_timeout; + dev->hard_header = ipoib_hard_header; + dev->set_multicast_list = ipoib_set_mcast_list; + dev->neigh_setup = ipoib_neigh_setup_dev; + + dev->watchdog_timeo = HZ; + + dev->rebuild_header = NULL; + dev->set_mac_address = NULL; + dev->header_cache_update = NULL; + + dev->flags |= IFF_BROADCAST | IFF_MULTICAST; + + /* + * We add in INFINIBAND_ALEN to allow for the destination + * address "pseudoheader" for skbs without neighbour struct. + */ + dev->hard_header_len = IPOIB_ENCAP_LEN + INFINIBAND_ALEN; + dev->addr_len = INFINIBAND_ALEN; + dev->type = ARPHRD_INFINIBAND; + dev->tx_queue_len = IPOIB_TX_RING_SIZE * 2; + + /* MTU will be reset when mcast join happens */ + dev->mtu = IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN; + priv->mcast_mtu = priv->admin_mtu = dev->mtu; + + memcpy(dev->broadcast, ipv4_bcast_addr, INFINIBAND_ALEN); + + netif_carrier_off(dev); + + SET_MODULE_OWNER(dev); + + priv->dev = dev; + + spin_lock_init(&priv->lock); + + init_MUTEX(&priv->mcast_mutex); + init_MUTEX(&priv->vlan_mutex); + + INIT_LIST_HEAD(&priv->child_intfs); + INIT_LIST_HEAD(&priv->dead_ahs); + INIT_LIST_HEAD(&priv->multicast_list); + + INIT_WORK(&priv->pkey_task, ipoib_pkey_poll, priv->dev); + INIT_WORK(&priv->mcast_task, ipoib_mcast_join_task, priv->dev); + INIT_WORK(&priv->flush_task, ipoib_ib_dev_flush, priv->dev); + INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task, priv->dev); + INIT_WORK(&priv->ah_reap_task, ipoib_reap_ah, priv->dev); +} + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *name) +{ + struct net_device *dev; + + dev = alloc_netdev((int) sizeof (struct ipoib_dev_priv), name, + ipoib_setup); + if (!dev) + return NULL; + + return netdev_priv(dev); +} + +static ssize_t show_pkey(struct class_device *cdev, char *buf) +{ + struct ipoib_dev_priv *priv = + netdev_priv(container_of(cdev, struct net_device, class_dev)); + + return sprintf(buf, "0x%04x\n", priv->pkey); +} +static CLASS_DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL); + +static ssize_t create_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_add(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(create_child, S_IWUGO, NULL, create_child); + +static ssize_t delete_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_delete(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; + +} +static CLASS_DEVICE_ATTR(delete_child, S_IWUGO, NULL, delete_child); + +int ipoib_add_pkey_attr(struct net_device *dev) +{ + return class_device_create_file(&dev->class_dev, + &class_device_attr_pkey); +} + +static struct net_device *ipoib_add_port(const char *format, + struct ib_device *hca, u8 port) +{ + struct ipoib_dev_priv *priv; + int result = -ENOMEM; + + priv = ipoib_intf_alloc(format); + if (!priv) + goto alloc_mem_failed; + + SET_NETDEV_DEV(priv->dev, &hca->dma_device->dev); + + result = ib_query_pkey(hca, port, 0, &priv->pkey); + if (result) { + printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } + + priv->dev->broadcast[8] = priv->pkey >> 8; + priv->dev->broadcast[9] = priv->pkey & 0xff; + + result = ib_query_gid(hca, port, 0, &priv->local_gid); + if (result) { + printk(KERN_WARNING "%s: ib_query_gid port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + + result = ipoib_dev_init(priv->dev, hca, port); + if (result < 0) { + printk(KERN_WARNING "%s: failed to initialize port %d (ret = %d)\n", + hca->name, port, result); + goto device_init_failed; + } + + INIT_IB_EVENT_HANDLER(&priv->event_handler, + priv->ca, ipoib_event); + result = ib_register_event_handler(&priv->event_handler); + if (result < 0) { + printk(KERN_WARNING "%s: ib_register_event_handler failed for " + "port %d (ret = %d)\n", + hca->name, port, result); + goto event_failed; + } + + result = register_netdev(priv->dev); + if (result) { + printk(KERN_WARNING "%s: couldn't register ipoib port %d; error %d\n", + hca->name, port, result); + goto register_failed; + } + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_create_child)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_delete_child)) + goto sysfs_failed; + + return priv->dev; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ib_unregister_event_handler(&priv->event_handler); + +event_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +alloc_mem_failed: + return ERR_PTR(result); +} + +static void ipoib_add_one(struct ib_device *device) +{ + struct list_head *dev_list; + struct net_device *dev; + struct ipoib_dev_priv *priv; + int s, e, p; + + dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL); + if (!dev_list) + return; + + INIT_LIST_HEAD(dev_list); + + if (device->node_type == IB_NODE_SWITCH) { + s = 0; + e = 0; + } else { + s = 1; + e = device->phys_port_cnt; + } + + for (p = s; p <= e; ++p) { + dev = ipoib_add_port("ib%d", device, p); + if (!IS_ERR(dev)) { + priv = netdev_priv(dev); + list_add_tail(&priv->list, dev_list); + } + } + + ib_set_client_data(device, &ipoib_client, dev_list); +} + +static void ipoib_remove_one(struct ib_device *device) +{ + struct ipoib_dev_priv *priv, *tmp; + struct list_head *dev_list; + + dev_list = ib_get_client_data(device, &ipoib_client); + + list_for_each_entry_safe(priv, tmp, dev_list, list) { + ib_unregister_event_handler(&priv->event_handler); + + unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); + free_netdev(priv->dev); + } +} + +static int __init ipoib_init_module(void) +{ + int ret; + + ret = ipoib_register_debugfs(); + if (ret) + return ret; + + /* + * We create our own workqueue mainly because we want to be + * able to flush it when devices are being removed. We can't + * use schedule_work()/flush_scheduled_work() because both + * unregister_netdev() and linkwatch_event take the rtnl lock, + * so flush_scheduled_work() can deadlock during device + * removal. + */ + ipoib_workqueue = create_singlethread_workqueue("ipoib"); + if (!ipoib_workqueue) { + ret = -ENOMEM; + goto err_fs; + } + + ret = ib_register_client(&ipoib_client); + if (ret) + goto err_wq; + + return 0; + +err_fs: + ipoib_unregister_debugfs(); + +err_wq: + destroy_workqueue(ipoib_workqueue); + + return ret; +} + +static void __exit ipoib_cleanup_module(void) +{ + ipoib_unregister_debugfs(); + ib_unregister_client(&ipoib_client); + destroy_workqueue(ipoib_workqueue); +} + +module_init(ipoib_init_module); +module_exit(ipoib_cleanup_module); + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2004-11-21 21:25:57.005743889 -0800 @@ -0,0 +1,929 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_multicast.c 1268 2004-11-18 20:38:29Z roland $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ipoib.h" + +static DECLARE_MUTEX(mcast_mutex); + +/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */ +struct ipoib_mcast { + struct ib_sa_mcmember_rec mcmember; + struct ipoib_ah *ah; + + struct rb_node rb_node; + struct list_head list; + struct completion done; + + int query_id; + struct ib_sa_query *query; + + unsigned long created; + unsigned long backoff; + + unsigned long flags; + unsigned char logcount; + + struct sk_buff_head pkt_queue; + + struct net_device *dev; +}; + +struct ipoib_mcast_iter { + struct net_device *dev; + union ib_gid mgid; + unsigned long created; + unsigned int queuelen; + unsigned int complete; + unsigned int send_only; +}; + +static void ipoib_mcast_free(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + + ipoib_dbg_mcast(netdev_priv(dev), + "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + if (mcast->ah) + ipoib_put_ah(mcast->ah); + + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + dev_kfree_skb_any(skb); + } + + kfree(mcast); +} + +static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev, + int can_sleep) +{ + struct ipoib_mcast *mcast; + + mcast = kmalloc(sizeof (*mcast), can_sleep ? GFP_KERNEL : GFP_ATOMIC); + if (!mcast) + return NULL; + + memset(mcast, 0, sizeof (*mcast)); + + init_completion(&mcast->done); + + mcast->dev = dev; + mcast->created = jiffies; + mcast->backoff = HZ; + mcast->logcount = 0; + + INIT_LIST_HEAD(&mcast->list); + skb_queue_head_init(&mcast->pkt_queue); + + mcast->ah = NULL; + mcast->query = NULL; + + return mcast; +} + +static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node *n = priv->multicast_tree.rb_node; + + while (n) { + struct ipoib_mcast *mcast; + int ret; + + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + ret = memcmp(mgid->raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = n->rb_left; + else if (ret > 0) + n = n->rb_right; + else + return mcast; + } + + return NULL; +} + +static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node **n = &priv->multicast_tree.rb_node, *pn = NULL; + + while (*n) { + struct ipoib_mcast *tmcast; + int ret; + + pn = *n; + tmcast = rb_entry(pn, struct ipoib_mcast, rb_node); + + ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = &pn->rb_left; + else if (ret > 0) + n = &pn->rb_right; + else + return -EEXIST; + } + + rb_link_node(&mcast->rb_node, pn, n); + rb_insert_color(&mcast->rb_node, &priv->multicast_tree); + + return 0; +} + +static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, + struct ib_sa_mcmember_rec *mcmember) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + mcast->mcmember = *mcmember; + + /* Set the cached Q_Key before we attach if it's the broadcast group */ + if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid))) + priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); + + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + ipoib_warn(priv, "multicast group " IPOIB_GID_FMT + " already attached\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + return 0; + } + + ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret < 0) { + ipoib_warn(priv, "couldn't attach QP to multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); + return ret; + } + } + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(mcast->mcmember.mlid), + .port_num = priv->port, + .sl = mcast->mcmember.sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = IB_AH_GRH, + .grh = { + .flow_label = be32_to_cpu(mcast->mcmember.flow_label), + .hop_limit = mcast->mcmember.hop_limit, + .sgid_index = 0, + .traffic_class = mcast->mcmember.traffic_class + } + }; + + av.grh.dgid = mcast->mcmember.mgid; + + mcast->ah = ipoib_create_ah(dev, priv->pd, &av); + if (!mcast->ah) { + ipoib_warn(priv, "ib_address_create failed\n"); + } else { + ipoib_dbg_mcast(priv, "MGID " IPOIB_GID_FMT + " AV %p, LID 0x%04x, SL %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + mcast->ah->ah, + be16_to_cpu(mcast->mcmember.mlid), + mcast->mcmember.sl); + } + } + + /* actually send any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed to requeue packet\n"); + } + + return 0; +} + +static void +ipoib_mcast_sendonly_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + + if (!status) + ipoib_mcast_join_finish(mcast, mcmember); + else { + if (mcast->logcount++ < 20) + ipoib_dbg_mcast(netdev_priv(dev), "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + /* Flush out any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + dev_kfree_skb_any(skb); + } + + /* Clear the busy flag so we try again */ + clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); + } + + complete(&mcast->done); +} + +static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { +#if 0 /* Some SMs don't support send-only yet */ + .join_state = 4 +#else + .join_state = 1 +#endif + }; + int ret = 0; + + if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { + ipoib_dbg_mcast(priv, "device shutting down, no multicast joins\n"); + return -ENODEV; + } + + if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "multicast entry busy, skipping\n"); + return -EBUSY; + } + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 1000, GFP_ATOMIC, + ipoib_mcast_sendonly_join_complete, + mcast, &mcast->query); + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed (ret = %d)\n", + ret); + } else { + ipoib_dbg_mcast(priv, "no multicast record for " IPOIB_GID_FMT + ", starting join\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + mcast->query_id = ret; + } + + return ret; +} + +static void ipoib_mcast_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "join completion for " IPOIB_GID_FMT + " (status %d)\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + if (!status && !ipoib_mcast_join_finish(mcast, mcmember)) { + mcast->backoff = HZ; + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + complete(&mcast->done); + return; + } + + if (status == -EINTR) { + complete(&mcast->done); + return; + } + + if (status && mcast->logcount++ < 20) { + if (status == -ETIMEDOUT || status == -EINTR) { + ipoib_dbg_mcast(priv, "multicast join failed for " IPOIB_GID_FMT + ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } else { + ipoib_warn(priv, "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } + } + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + mcast->query = NULL; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) { + if (status == -ETIMEDOUT) + queue_work(ipoib_workqueue, &priv->mcast_task); + else + queue_delayed_work(ipoib_workqueue, &priv->mcast_task, + mcast->backoff * HZ); + } else + complete(&mcast->done); + up(&mcast_mutex); + + return; +} + +static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, + int create) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + ib_sa_comp_mask comp_mask; + int ret = 0; + + ipoib_dbg_mcast(priv, "joining MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + comp_mask = + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE; + + if (create) { + comp_mask |= + IB_SA_MCMEMBER_REC_QKEY | + IB_SA_MCMEMBER_REC_SL | + IB_SA_MCMEMBER_REC_FLOW_LABEL | + IB_SA_MCMEMBER_REC_TRAFFIC_CLASS; + + rec.qkey = priv->broadcast->mcmember.qkey; + rec.sl = priv->broadcast->mcmember.sl; + rec.flow_label = priv->broadcast->mcmember.flow_label; + rec.traffic_class = priv->broadcast->mcmember.traffic_class; + } + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, comp_mask, + mcast->backoff * 1000, GFP_ATOMIC, + ipoib_mcast_join_complete, + mcast, &mcast->query); + + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed, status %d\n", ret); + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, + mcast->backoff); + up(&mcast_mutex); + } else + mcast->query_id = ret; +} + +void ipoib_mcast_join_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned long flags; + + if (!test_bit(IPOIB_MCAST_RUN, &priv->flags)) + return; + + if (ib_query_gid(priv->ca, priv->port, 0, &priv->local_gid)) + ipoib_warn(priv, "ib_gid_entry_get() failed\n"); + else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + if (!priv->broadcast) { + priv->broadcast = ipoib_mcast_alloc(dev, 1); + if (!priv->broadcast) { + ipoib_warn(priv, "failed to allocate broadcast group\n"); + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, HZ); + up(&mcast_mutex); + return; + } + + memcpy(priv->broadcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid)); + + spin_lock_irqsave(&priv->lock, flags); + __ipoib_mcast_add(dev, priv->broadcast); + spin_unlock_irqrestore(&priv->lock, flags); + } + + if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { + ipoib_mcast_join(dev, priv->broadcast, 0); + return; + } + + while (1) { + struct ipoib_mcast *mcast = NULL; + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + /* Found the next unjoined group */ + break; + } + } + spin_unlock_irqrestore(&priv->lock, flags); + + if (&mcast->list == &priv->multicast_list) { + /* All done */ + break; + } + + ipoib_mcast_join(dev, mcast, 1); + return; + } + + { + struct ib_port_attr attr; + + if (!ib_query_port(priv->ca, priv->port, &attr)) + priv->local_lid = attr.lid; + else + ipoib_warn(priv, "ib_query_port failed\n"); + } + + priv->mcast_mtu = ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu) - + IPOIB_ENCAP_LEN; + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n"); + + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + netif_carrier_on(dev); +} + +int ipoib_mcast_start_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "starting multicast thread\n"); + + down(&mcast_mutex); + if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + + return 0; +} + +int ipoib_mcast_stop_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + + ipoib_dbg_mcast(priv, "stopping multicast thread\n"); + + down(&mcast_mutex); + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + cancel_delayed_work(&priv->mcast_task); + up(&mcast_mutex); + + flush_workqueue(ipoib_workqueue); + + if (priv->broadcast && priv->broadcast->query) { + ib_sa_cancel_query(priv->broadcast->query_id, priv->broadcast->query); + priv->broadcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for bcast\n"); + wait_for_completion(&priv->broadcast->done); + } + + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (mcast->query) { + ib_sa_cancel_query(mcast->query_id, mcast->query); + mcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + wait_for_completion(&mcast->done); + } + } + + return 0; +} + +int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + int ret = 0; + + if (!test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) + return 0; + + ipoib_dbg_mcast(priv, "leaving MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + /* Remove ourselves from the multicast group */ + ret = ipoib_mcast_detach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret) + ipoib_warn(priv, "ipoib_mcast_detach failed (result = %d)\n", ret); + + /* + * Just make one shot at leaving and don't wait for a reply; + * if we fail, too bad. + */ + ret = ib_sa_mcmember_rec_delete(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 0, GFP_ATOMIC, NULL, + mcast, &mcast->query); + if (ret < 0) + ipoib_warn(priv, "ib_sa_mcmember_rec_delete failed " + "for leave (result = %d)\n", ret); + + return 0; +} + +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + mcast = __ipoib_mcast_find(dev, mgid); + if (!mcast) { + /* Let's create a new send only group now */ + ipoib_dbg_mcast(priv, "setting up send only multicast group for " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(*mgid)); + + mcast = ipoib_mcast_alloc(dev, 0); + if (!mcast) { + ipoib_warn(priv, "unable to allocate memory for " + "multicast structure\n"); + dev_kfree_skb_any(skb); + goto out; + } + + set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); + mcast->mcmember.mgid = *mgid; + __ipoib_mcast_add(dev, mcast); + list_add_tail(&mcast->list, &priv->multicast_list); + } + + if (!mcast->ah) { + if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) + skb_queue_tail(&mcast->pkt_queue, skb); + else + dev_kfree_skb_any(skb); + + if (mcast->query) + ipoib_dbg_mcast(priv, "no address vector, " + "but multicast join already started\n"); + else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) + ipoib_mcast_sendonly_join(mcast); + + /* + * If lookup completes between here and out:, don't + * want to send packet twice. + */ + mcast = NULL; + } + +out: + spin_unlock_irqrestore(&priv->lock, flags); + if (mcast && mcast->ah) { + if (skb->dst && + skb->dst->neighbour && + !*to_ipoib_path(skb->dst->neighbour)) { + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + + if (path) { + kref_get(&mcast->ah->ref); + path->ah = mcast->ah; + path->dev = dev; + path->neighbour = skb->dst->neighbour; + *to_ipoib_path(skb->dst->neighbour) = path; + } + } + + ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); + } +} + +void ipoib_mcast_dev_flush(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + LIST_HEAD(remove_list); + struct ipoib_mcast *mcast, *tmcast, *nmcast; + unsigned long flags; + + ipoib_dbg_mcast(priv, "flushing multicast list\n"); + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->flags = + mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY); + + nmcast->mcmember.mgid = mcast->mcmember.mgid; + + /* Add the new group in before the to-be-destroyed group */ + list_add_tail(&nmcast->list, &mcast->list); + list_del_init(&mcast->list); + + rb_replace_node(&mcast->rb_node, &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&mcast->list, &remove_list); + } else { + ipoib_warn(priv, "could not reallocate multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + } + } + + if (priv->broadcast) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->mcmember.mgid = priv->broadcast->mcmember.mgid; + + rb_replace_node(&priv->broadcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&priv->broadcast->list, &remove_list); + } + + priv->broadcast = nmcast; + } + + spin_unlock_irqrestore(&priv->lock, flags); + + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(dev, mcast); + ipoib_mcast_free(mcast); + } +} + +void ipoib_mcast_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned long flags; + + /* Delete broadcast since it will be recreated */ + if (priv->broadcast) { + ipoib_dbg_mcast(priv, "deleting broadcast group\n"); + + spin_lock_irqsave(&priv->lock, flags); + rb_erase(&priv->broadcast->rb_node, &priv->multicast_tree); + spin_unlock_irqrestore(&priv->lock, flags); + ipoib_mcast_leave(dev, priv->broadcast); + ipoib_mcast_free(priv->broadcast); + priv->broadcast = NULL; + } +} + +void ipoib_mcast_restart_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dev_mc_list *mclist; + struct ipoib_mcast *mcast, *tmcast; + LIST_HEAD(remove_list); + unsigned long flags; + + ipoib_dbg_mcast(priv, "restarting multicast task\n"); + + ipoib_mcast_stop_thread(dev); + + spin_lock_irqsave(&priv->lock, flags); + + /* + * Unfortunately, the networking core only gives us a list of all of + * the multicast hardware addresses. We need to figure out which ones + * are new and which ones have been removed + */ + + /* Clear out the found flag */ + list_for_each_entry(mcast, &priv->multicast_list, list) + clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + + /* Mark all of the entries that are found or don't exist */ + for (mclist = dev->mc_list; mclist; mclist = mclist->next) { + union ib_gid mgid; + + memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid); + + /* Add in the P_Key */ + mgid.raw[4] = (priv->pkey >> 8) & 0xff; + mgid.raw[5] = priv->pkey & 0xff; + + mcast = __ipoib_mcast_find(dev, &mgid); + if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + struct ipoib_mcast *nmcast; + + /* Not found or send-only group, let's add a new entry */ + ipoib_dbg_mcast(priv, "adding multicast entry for mgid " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(mgid)); + + nmcast = ipoib_mcast_alloc(dev, 0); + if (!nmcast) { + ipoib_warn(priv, "unable to allocate memory for multicast structure\n"); + continue; + } + + set_bit(IPOIB_MCAST_FLAG_FOUND, &nmcast->flags); + + nmcast->mcmember.mgid = mgid; + + if (mcast) { + /* Destroy the send only entry */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + + rb_replace_node(&mcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + } else + __ipoib_mcast_add(dev, nmcast); + + list_add_tail(&nmcast->list, &priv->multicast_list); + } + + if (mcast) + set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + } + + /* Remove all of the entries don't exist anymore */ + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && + !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rb_erase(&mcast->rb_node, &priv->multicast_tree); + + /* Move to the remove list */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + } + } + spin_unlock_irqrestore(&priv->lock, flags); + + /* We have to cancel outside of the spinlock */ + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(mcast->dev, mcast); + ipoib_mcast_free(mcast); + } + + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_mcast_start_thread(dev); +} + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev) +{ + struct ipoib_mcast_iter *iter; + + iter = kmalloc(sizeof *iter, GFP_KERNEL); + if (!iter) + return NULL; + + iter->dev = dev; + memset(iter->mgid.raw, 0, sizeof iter->mgid); + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter) +{ + kfree(iter); +} + +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter) +{ + struct ipoib_dev_priv *priv = netdev_priv(iter->dev); + struct rb_node *n; + struct ipoib_mcast *mcast; + int ret = 1; + + spin_lock_irq(&priv->lock); + + n = rb_first(&priv->multicast_tree); + + while (n) { + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)) < 0) { + iter->mgid = mcast->mcmember.mgid; + iter->created = mcast->created; + iter->queuelen = skb_queue_len(&mcast->pkt_queue); + iter->complete = !!mcast->ah; + iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); + + ret = 0; + + break; + } + + n = rb_next(n); + } + + spin_unlock_irq(&priv->lock); + + return ret; +} + +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *mgid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only) +{ + *mgid = iter->mgid; + *created = iter->created; + *queuelen = iter->queuelen; + *complete = iter->complete; + *send_only = iter->send_only; +} Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_proto.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_proto.h 2004-11-21 21:25:57.030740181 -0800 @@ -0,0 +1,37 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_proto.h 1254 2004-11-17 17:19:12Z roland $ + */ + +#ifndef _IPOIB_PROTO_H +#define _IPOIB_PROTO_H + +#include +#include + +/* + * Public functions + */ + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey); + +#endif /* _IPOIB_PROTO_H */ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_verbs.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_verbs.c 2004-11-21 21:25:57.056736325 -0800 @@ -0,0 +1,248 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_verbs.c 1262 2004-11-18 17:38:36Z roland $ + */ + +#include + +#include "ipoib.h" + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr *qp_attr; + int attr_mask; + int ret; + u16 pkey_index; + + ret = -ENOMEM; + qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL); + if (!qp_attr) + goto out; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + ret = -ENXIO; + goto out; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + /* set correct QKey for QP */ + qp_attr->qkey = priv->qkey; + attr_mask = IB_QP_QKEY; + ret = ib_modify_qp(priv->qp, qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP, ret = %d\n", ret); + goto out; + } + + /* attach QP to multicast group */ + down(&priv->mcast_mutex); + ret = ib_attach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "failed to attach to multicast group, ret = %d\n", ret); + +out: + kfree(qp_attr); + return ret; +} + +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + down(&priv->mcast_mutex); + ret = ib_detach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "ib_detach_mcast failed (result = %d)\n", ret); + + return ret; +} + +int ipoib_qp_create(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + u16 pkey_index; + struct ib_qp_attr qp_attr; + int attr_mask; + + /* + * Search through the port P_Key table for the requested pkey value. + * The port has to be assigned to the respective IB partition in + * advance. + */ + ret = ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index); + if (ret) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + return ret; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + qp_attr.qp_state = IB_QPS_INIT; + qp_attr.qkey = 0; + qp_attr.port_num = priv->port; + qp_attr.pkey_index = pkey_index; + attr_mask = + IB_QP_QKEY | + IB_QP_PORT | + IB_QP_PKEY_INDEX | + IB_QP_STATE; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to init, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTR; + /* Can't set this in a INIT->RTR transition */ + attr_mask &= ~IB_QP_PORT; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTR, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTS; + qp_attr.sq_psn = 0; + attr_mask |= IB_QP_SQ_PSN; + attr_mask &= ~IB_QP_PKEY_INDEX; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTS, ret = %d\n", ret); + goto out_fail; + } + + return 0; + +out_fail: + ib_destroy_qp(priv->qp); + priv->qp = NULL; + + return -EINVAL; +} + +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_init_attr init_attr = { + .cap = { + .max_send_wr = IPOIB_TX_RING_SIZE, + .max_recv_wr = IPOIB_RX_RING_SIZE, + .max_send_sge = 1, + .max_recv_sge = 1 + }, + .sq_sig_type = IB_SIGNAL_ALL_WR, + .rq_sig_type = IB_SIGNAL_ALL_WR, + .qp_type = IB_QPT_UD + }; + + priv->pd = ib_alloc_pd(priv->ca); + if (IS_ERR(priv->pd)) { + printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); + return -ENODEV; + } + + priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, + IPOIB_TX_RING_SIZE + IPOIB_RX_RING_SIZE + 1); + if (IS_ERR(priv->cq)) { + printk(KERN_WARNING "%s: failed to create CQ\n", ca->name); + goto out_free_pd; + } + + if (ib_req_notify_cq(priv->cq, IB_CQ_NEXT_COMP)) + goto out_free_cq; + + priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(priv->mr)) { + printk(KERN_WARNING "%s: ib_reg_phys_mr failed\n", ca->name); + goto out_free_cq; + } + + init_attr.send_cq = priv->cq; + init_attr.recv_cq = priv->cq, + + priv->qp = ib_create_qp(priv->pd, &init_attr); + if (IS_ERR(priv->qp)) { + printk(KERN_WARNING "%s: failed to create QP\n", ca->name); + goto out_free_mr; + } + + priv->dev->dev_addr[1] = (priv->qp->qp_num >> 16) & 0xff; + priv->dev->dev_addr[2] = (priv->qp->qp_num >> 8) & 0xff; + priv->dev->dev_addr[3] = (priv->qp->qp_num ) & 0xff; + + return 0; + +out_free_mr: + ib_dereg_mr(priv->mr); + +out_free_cq: + ib_destroy_cq(priv->cq); + +out_free_pd: + ib_dealloc_pd(priv->pd); + return -ENODEV; +} + +void ipoib_transport_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (priv->qp) { + if (ib_destroy_qp(priv->qp)) + ipoib_warn(priv, "ib_qp_destroy failed\n"); + + priv->qp = NULL; + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + } + + if (ib_dereg_mr(priv->mr)) + ipoib_warn(priv, "ib_dereg_mr failed\n"); + + if (ib_destroy_cq(priv->cq)) + ipoib_warn(priv, "ib_cq_destroy failed\n"); + + if (ib_dealloc_pd(priv->pd)) + ipoib_warn(priv, "ib_dealloc_pd failed\n"); +} + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record) +{ + struct ipoib_dev_priv *priv = + container_of(handler, struct ipoib_dev_priv, event_handler); + + if (record->event == IB_EVENT_PORT_ACTIVE) { + ipoib_dbg(priv, "Port active event\n"); + schedule_work(&priv->flush_task); + } +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c 2004-11-21 21:25:57.081732617 -0800 @@ -0,0 +1,166 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_vlan.c 1271 2004-11-18 22:11:29Z roland $ + */ + +#include +#include + +#include +#include +#include + +#include + +#include "ipoib.h" + +static ssize_t show_parent(struct class_device *class_dev, char *buf) +{ + struct net_device *dev = + container_of(class_dev, struct net_device, class_dev); + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return sprintf(buf, "%s\n", priv->parent->name); +} +static CLASS_DEVICE_ATTR(parent, S_IRUGO, show_parent, NULL); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv; + char intf_name[IFNAMSIZ]; + int result; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + down(&ppriv->vlan_mutex); + + /* + * First ensure this isn't a duplicate. We check the parent device and + * then all of the child interfaces to make sure the Pkey doesn't match. + */ + if (ppriv->pkey == pkey) { + result = -ENOTUNIQ; + goto err; + } + + list_for_each_entry(priv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + result = -ENOTUNIQ; + goto err; + } + } + + snprintf(intf_name, sizeof intf_name, "%s.%04x", + ppriv->dev->name, pkey); + priv = ipoib_intf_alloc(intf_name); + if (!priv) { + result = -ENOMEM; + goto err; + } + + set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); + + priv->pkey = pkey; + + memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN); + priv->dev->broadcast[8] = pkey >> 8; + priv->dev->broadcast[9] = pkey & 0xff; + + result = ipoib_dev_init(priv->dev, ppriv->ca, ppriv->port); + if (result < 0) { + ipoib_warn(ppriv, "failed to initialize subinterface: " + "device %s, port %d", + ppriv->ca->name, ppriv->port); + goto device_init_failed; + } + + result = register_netdev(priv->dev); + if (result) { + ipoib_warn(priv, "failed to initialize; error %i", result); + goto register_failed; + } + + priv->parent = ppriv->dev; + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_parent)) + goto sysfs_failed; + + list_add_tail(&priv->list, &ppriv->child_intfs); + + up(&ppriv->vlan_mutex); + + return 0; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +err: + up(&ppriv->vlan_mutex); + return result; +} + +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv, *tpriv; + int ret = -ENOENT; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + down(&ppriv->vlan_mutex); + list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); + + list_del(&priv->list); + + kfree(priv); + + ret = 0; + break; + } + } + up(&ppriv->vlan_mutex); + + return ret; +} From SRS0+920d2f4309d681ac93c8+456+infradead.org+hch@pentafluge.srs.infradead.org Mon Nov 22 07:32:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:32:14 -0800 (PST) Received: from pentafluge.infradead.org ([213.146.154.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFW91q029907 for ; Mon, 22 Nov 2004 07:32:10 -0800 Received: from hch by pentafluge.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CWGAK-0001H3-8X; Mon, 22 Nov 2004 15:31:44 +0000 Date: Mon, 22 Nov 2004 15:31:44 +0000 From: Christoph Hellwig To: Roland Dreier Cc: linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com Subject: Re: [PATCH][RFC/v1][11/12] Add InfiniBand Documentation files Message-ID: <20041122153144.GA4821@infradead.org> Mail-Followup-To: Christoph Hellwig , Roland Dreier , linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com References: <20041122714.taTI3zcdWo5JfuMd@topspin.com> <20041122714.AyIOvRY195EGFTaO@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122714.AyIOvRY195EGFTaO@topspin.com> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by pentafluge.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 12105 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev > + When the IPoIB driver is loaded, it creates one interface for each > + port using the P_Key at index 0. To create an interface with a > + different P_Key, write the desired P_Key into the main interface's > + /sys/class/net//create_child file. For example: > + > + echo 0x8001 > /sys/class/net/ib0/create_child > + > + This will create an interface named ib0.8001 with P_Key 0x8001. To > + remove a subinterface, use the "delete_child" file: > + > + echo 0x8001 > /sys/class/net/ib0/delete_child > + > + The P_Key for any interface is given by the "pkey" file, and the > + main interface for a subinterface is in "parent." Any reason this doesn't use an interface similar to the normal vlan code? And what is a P_Key? From SRS0+920d2f4309d681ac93c8+456+infradead.org+hch@pentafluge.srs.infradead.org Mon Nov 22 07:35:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:35:21 -0800 (PST) Received: from pentafluge.infradead.org ([213.146.154.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFZGKd030290 for ; Mon, 22 Nov 2004 07:35:16 -0800 Received: from hch by pentafluge.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CWGDQ-0001IS-H7; Mon, 22 Nov 2004 15:34:56 +0000 Date: Mon, 22 Nov 2004 15:34:56 +0000 From: Christoph Hellwig To: Roland Dreier Cc: Christoph Hellwig , netdev@oss.sgi.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Message-ID: <20041122153456.GA4905@infradead.org> References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> <52sm71ex0l.fsf@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52sm71ex0l.fsf@topspin.com> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by pentafluge.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 12106 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev > We can switch to dma_* (and in fact I see some reasons to do so). > However Greg KH suggested sticking with pci_* stuff until there's a > non-PCI device to deal with. That just means avoidable interface changes sooner or later. The dma_ interfaces also have the added benefit of allowing better control of the type of consistant allocation interface. Note that pathscale already has direct to HT infiniband components, but it's not sure whether they'll ever be supported by the OpenIB codebase. From roland@topspin.com Mon Nov 22 07:37:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:37:45 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFbeVF030696 for ; Mon, 22 Nov 2004 07:37:41 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:37:21 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:37:21 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWGFf-0006ZA-PE; Mon, 22 Nov 2004 07:37:21 -0800 To: Christoph Hellwig Cc: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> <52sm71ex0l.fsf@topspin.com> <20041122153456.GA4905@infradead.org> From: Roland Dreier Date: Mon, 22 Nov 2004 07:37:15 -0800 In-Reply-To: <20041122153456.GA4905@infradead.org> (Christoph Hellwig's message of "Mon, 22 Nov 2004 15:34:56 +0000") Message-ID: <52oehpevys.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:37:21.0228 (UTC) FILETIME=[27FED8C0:01C4D0A9] X-archive-position: 12107 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Christoph> That just means avoidable interface changes sooner or Christoph> later. The dma_ interfaces also have the added benefit Christoph> of allowing better control of the type of consistant Christoph> allocation interface. OK, I have no problem making this change. Christoph> Note that pathscale already has direct to HT infiniband Christoph> components, but it's not sure whether they'll ever be Christoph> supported by the OpenIB codebase. HT actually looks like PCI to software... however I do see advantages to using the dma_* stuff for supporting the pathscale hardware, if they every open up their specs. - R. From roland@topspin.com Mon Nov 22 07:43:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 07:43:12 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMFh7Lm031125 for ; Mon, 22 Nov 2004 07:43:07 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:41:53 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 07:41:52 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWGK3-0006ZK-9d; Mon, 22 Nov 2004 07:41:52 -0800 To: Christoph Hellwig Cc: linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <20041122714.taTI3zcdWo5JfuMd@topspin.com> <20041122714.AyIOvRY195EGFTaO@topspin.com> <20041122153144.GA4821@infradead.org> From: Roland Dreier Date: Mon, 22 Nov 2004 07:41:47 -0800 In-Reply-To: <20041122153144.GA4821@infradead.org> (Christoph Hellwig's message of "Mon, 22 Nov 2004 15:31:44 +0000") Message-ID: <52k6sdevr8.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][RFC/v1][11/12] Add InfiniBand Documentation files Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 15:41:52.0696 (UTC) FILETIME=[C9CD9380:01C4D0A9] X-archive-position: 12108 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Christoph> Any reason this doesn't use an interface similar to the Christoph> normal vlan code? The normal vlan code uses an ioctl(). I thought a simple sysfs interface would be more palatable than a new socket ioctl. Christoph> And what is a P_Key? It is a 16-bit identifier carried by IB packets that says which partition the packet is in. End ports have P_Key tables that list which partitions they are members of (a port can be a member of one or more partitions, and can only receive packets from that partition). - Roland From trofimov@iae.nsk.su Mon Nov 22 08:27:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 08:27:10 -0800 (PST) Received: from oss.sgi.com ([194.90.99.86]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMGR4U5004013 for ; Mon, 22 Nov 2004 08:27:06 -0800 Message-Id: <200411221627.iAMGR4U5004013@oss.sgi.com> From: trofimov@iae.nsk.su To: netdev@oss.sgi.com Subject: Re: Re: Thanks! Date: Mon, 22 Nov 2004 18:30:30 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0006_00002E51.0000744D" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 12109 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: trofimov@iae.nsk.su Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0006_00002E51.0000744D Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Here is the file. ------=_NextPart_000_0006_00002E51.0000744D Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Potentially Dangerous Attachment Removed. The file "document.pif" has been blocked. File quarantined as: "". ------=_NextPart_000_0006_00002E51.0000744D-- From kdorn@lilah.hetzel.org Mon Nov 22 08:51:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 08:51:33 -0800 (PST) Received: from lilah.hetzel.org (lilah.hetzel.org [199.250.128.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMGpRhD004895 for ; Mon, 22 Nov 2004 08:51:28 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iAMID8ch004351; Mon, 22 Nov 2004 13:13:08 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iAMID8vo004350; Mon, 22 Nov 2004 13:13:08 -0500 Date: Mon, 22 Nov 2004 13:13:07 -0500 From: Dorn Hetzel To: Francois Romieu Cc: Dorn Hetzel , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041122181307.GA3625@lilah.hetzel.org> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041120002946.GA18059@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4i X-archive-position: 12110 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev On Sat, Nov 20, 2004 at 01:29:46AM +0100, Francois Romieu wrote: > Dorn Hetzel : > > You have two options (or more) on top of 2.6.10-rc2: > - ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.10-rc2/2.6.10-rc2-mm2/2.6.10-rc2-mm2.bz2 > - http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc2-netdev1.patch.bz2 > I have gotten as far as rc2-mm2, which was a fairly complete failure. After just a couple of pings on the interface, the whole system started to freeze up fairly hard. Please see http://www.hetzel.org/8169/rc2-mm2/ for a set of information on the system state this time around. The last two lines in messages.txt are: illyria kernel: NETDEV WATCHDOG: eth0: transmit timed out illyria kernel: eth0: interrupt 0001 taken in poll Then things go south pretty hard and fast... I'll try the other patches on top of rc2-mm2 tonight and see if that turns out any better :) > Once you have applied one of the patch above, the patch below will improve > your "transmit timed out" (please apply in order and enable NAPI): > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-250.patch > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-255.patch > > If things perform better you may want to use bigger frames and apply as > well r8169-260.patch and r8169-265.patch. > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-260.patch > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-265.patch > Thanks again for all your help! -Dorn From nacc@us.ibm.com Mon Nov 22 09:20:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 09:20:06 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMHJoJj006247 for ; Mon, 22 Nov 2004 09:20:00 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e5.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAMHJPHt219548 for ; Mon, 22 Nov 2004 12:19:25 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAMHJPrE281168 for ; Mon, 22 Nov 2004 12:19:25 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAMHJPW5004059 for ; Mon, 22 Nov 2004 12:19:25 -0500 Received: from localhost.localdomain (DYN319030BLD.beaverton.ibm.com [9.47.21.103]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAMHJOpK004047; Mon, 22 Nov 2004 12:19:24 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iAMHJNs4007943; Mon, 22 Nov 2004 09:19:23 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iAMHJMC2007940; Mon, 22 Nov 2004 09:19:22 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Mon, 22 Nov 2004 09:19:22 -0800 From: Nishanth Aravamudan To: janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] Add ssleep_interruptible() Message-ID: <20041122171922.GA7770@us.ibm.com> References: <20041101200749.GF1730@us.ibm.com> <20041117013059.GA4218@us.ibm.com> <20041122024804.GD4146@verge.net.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122024804.GD4146@verge.net.au> X-Operating-System: Linux 2.6.9-test-acpi (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12111 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev On Mon, Nov 22, 2004 at 11:48:05AM +0900, Horms wrote: > On Tue, Nov 16, 2004 at 05:30:59PM -0800, Nishanth Aravamudan wrote: > > On Mon, Nov 01, 2004 at 12:07:49PM -0800, Nishanth Aravamudan wrote: > > > Description: Adds ssleep_interruptible() to allow longer delays to occur > > > in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with > > > msleep_interruptible(), ssleep_interruptible() returns the remaining time > > > left in the delay in terms of seconds. This required dividing the return > > > value of msleep_interruptible() by 1000, thus a cast to (unsigned long) > > > to prevent any floating point issues. > > > > > > Signed-off-by: Nishanth Aravamudan > > > > > > --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 > > > 15:34:03.000000000 -0700 > > > +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 > > > @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s > > > msleep(seconds * 1000); > > > } > > > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > > +{ > > > + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); > > > +} > > > + > > > #endif /* defined(_LINUX_DELAY_H) */ > > > > After a discussion on IRC, I believe it is pretty clear that this > > function has serious issues. Mainly, that if I request a delay of 1 > > second, but msleep_interruptible() returns after 1 millisecond, then > > ssleep_interruptible() will return 0, claiming the entire delay was > > used (due to rounding). > > > > Perhaps we should just be satisfied with milliseconds being the grossest > > (in contrast to fine) measure of time, at least in terms of > > interruptible delays. ssleep() is unaffected by this problem, of course. > > > > Please revert this patch, if applied, as well as any of the other > > patches I sent using ssleep_interruptible() [only a handful]. > > Would making sure that the time slept was always rounded up to > the nearest second resolve this problem. I believe that rounding > up is a common approach to resolving this type of problem when > changing clock resolution. > > I am thinking of something like this. > > ===== include/linux/delay.h 1.6 vs edited ===== > --- 1.6/include/linux/delay.h 2004-09-03 18:08:32 +09:00 > +++ edited/include/linux/delay.h 2004-11-22 11:47:03 +09:00 > @@ -46,4 +46,10 @@ static inline void ssleep(unsigned int s > msleep(seconds * 1000); > } > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > +{ > + return (unsigned long)((msleep_interruptible(seconds * 1000) + 999) / > + 1000); This is a good idea, but I have two issues: 1) A major reason for having msecs_to_jiffies() and co. is to avoid having to do this type of conversion ourselves. A weak argument, admittedly, but just something to keep in mind. 2) This still has a serious logical flaw: If I request 1 second of sleep, and I don't sleep the entire time, then it is now guaranteed that I will think I did not sleep at all (ie. ssleep_interruptible() will return 1). That's just another version of the original issue. I just don't think it's useful to have this coarse of granularity, at least in terms of interruptible sleep. -Nish From shemminger@osdl.org Mon Nov 22 10:00:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:00:22 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMI0EB3007932 for ; Mon, 22 Nov 2004 10:00:15 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAMHxmPE001647 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 22 Nov 2004 09:59:49 -0800 Date: Thu, 18 Nov 2004 14:40:38 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATCH] (2/10) sk98: open error codes Message-Id: <20041118144038.259333bc@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12112 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Sk98lin open would return -1 in case of error instead of a useful errno value. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-17 09:22:56 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-17 09:22:56 -08:00 @@ -1122,11 +1122,8 @@ ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC)); #ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive) { - if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) { - return (-1); /* still in use by diag; deny actions */ - } - } + if (pAC->DiagModeActive && pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) + return -EBUSY; #endif /* Set blink mode */ @@ -1137,7 +1134,7 @@ /* level 1 init common modules here */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { printk(KERN_ERR "%s: HWInit (1) failed.\n", pAC->dev[pNet->PortNr]->name); - return (-1); + return -EIO; } SkI2cInit (pAC, pAC->IoBase, SK_INIT_IO); SkEventInit (pAC, pAC->IoBase, SK_INIT_IO); @@ -1152,7 +1149,7 @@ /* tschilling: Level 2 init modules here, check return value. */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_RUN) != 0) { printk(KERN_ERR "%s: HWInit (2) failed.\n", pAC->dev[pNet->PortNr]->name); - return (-1); + return -EIO; } SkI2cInit (pAC, pAC->IoBase, SK_INIT_RUN); SkEventInit (pAC, pAC->IoBase, SK_INIT_RUN); @@ -1204,7 +1201,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeOpen suceeded\n")); - return (0); + return 0; } /* SkGeOpen */ From shemminger@osdl.org Mon Nov 22 10:00:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:00:31 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMI0FIo007933 for ; Mon, 22 Nov 2004 10:00:16 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAMHxoPE001654 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 22 Nov 2004 09:59:50 -0800 Date: Thu, 18 Nov 2004 14:43:07 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: Mirko Lindner , netdev@oss.sgi.com Subject: [PATHC] (3/10) sk98: use carrrier_on/off Message-Id: <20041118144307.06df40f7@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12113 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Skge drive needs to change the carrier state in response to link up/down, rather than toggling BSD style IFF_RUNNING. Signed-off-by: Stephen Hemminger From shemminger@osdl.org Mon Nov 22 10:00:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:02:00 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMI0CD3007931 for ; Mon, 22 Nov 2004 10:00:14 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iAMHxjPE001641 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 22 Nov 2004 09:59:46 -0800 Date: Thu, 18 Nov 2004 14:39:25 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: netdev@oss.sgi.com, Mirko Lindner Subject: [PATCH] (1/10) sk98: rlmt send locking Message-Id: <20041118143925.406eed05@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12114 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Earlier patch changed the locking of normal transmit frame path, but missed the special case of the management interface. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c 2004-11-17 09:22:37 -08:00 +++ b/drivers/net/sk98lin/skge.c 2004-11-17 09:22:37 -08:00 @@ -4233,12 +4233,18 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, ("RLS ")); pRlmtMbuf = (SK_MBUF*) Param.pParaPtr; + FromPort = pRlmtMbuf->PortIdx; pMsg = (struct sk_buff*) pRlmtMbuf->pOs; skb_put(pMsg, pRlmtMbuf->Length); - if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW], - pMsg) < 0) + spin_lock_irqsave(&pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, + Flags); + if (XmitFrame(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW], + pMsg) < 0) dev_kfree_skb_any(pMsg); + spin_unlock_irqrestore(&pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, + Flags); + break; case SK_DRV_TIMER: if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) { From shemminger@osdl.org Mon Nov 22 10:09:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:09:43 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMI9ZVt009182 for ; Mon, 22 Nov 2004 10:09:36 -0800 Received: from dxpl.pdx.osdl.net (dxpl.pdx.osdl.net [172.20.1.103]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAMI97909540; Mon, 22 Nov 2004 10:09:07 -0800 Date: Mon, 22 Nov 2004 10:09:07 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: Mitchell Blank Jr , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: [PATCH] UDP select handling of bad checksums. Message-Id: <20041122100907.2ab81f18@dxpl.pdx.osdl.net> In-Reply-To: <20041103005253.GA77817@gaz.sfgoth.com> References: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> <20041103005253.GA77817@gaz.sfgoth.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; x86_64-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12115 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Alternate workaround for blocking usage of select() by UDP applications. The problem is Linux optimizes the UDP receive checksum path so that checksum validation is not performed until the application read. This is a performance win but can cause applications that do select with blocking file descriptors to get false positives if the received message has a checksum error. There is a long running thread about this on LKML. This patch makes these applications work, but keeps the one-pass performance gain for those applications smart enough to use non-blocking file descriptors with select/poll. There is still a possibility to get a false positive if application does select on non-blocking fd then makes it blocking before doing the receive, but that is unlikely. Tested by injecting bad packets with SOCK_RAW. Signed-off-by: Stephen Hemminger diff -Nru a/include/net/udp.h b/include/net/udp.h --- a/include/net/udp.h 2004-11-19 10:37:56 -08:00 +++ b/include/net/udp.h 2004-11-19 10:37:56 -08:00 @@ -71,6 +71,8 @@ extern int udp_rcv(struct sk_buff *skb); extern int udp_ioctl(struct sock *sk, int cmd, unsigned long arg); extern int udp_disconnect(struct sock *sk, int flags); +extern unsigned int udp_poll(struct file *file, struct socket *sock, + poll_table *wait); DECLARE_SNMP_STAT(struct udp_mib, udp_statistics); #define UDP_INC_STATS(field) SNMP_INC_STATS(udp_statistics, field) diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c 2004-11-19 10:37:56 -08:00 +++ b/net/ipv4/af_inet.c 2004-11-19 10:37:56 -08:00 @@ -809,7 +809,7 @@ .socketpair = sock_no_socketpair, .accept = sock_no_accept, .getname = inet_getname, - .poll = datagram_poll, + .poll = udp_poll, .ioctl = inet_ioctl, .listen = sock_no_listen, .shutdown = inet_shutdown, diff -Nru a/net/ipv4/udp.c b/net/ipv4/udp.c --- a/net/ipv4/udp.c 2004-11-19 10:37:56 -08:00 +++ b/net/ipv4/udp.c 2004-11-19 10:37:56 -08:00 @@ -1303,6 +1303,52 @@ return 0; } +/** + * udp_poll - wait for a UDP event. + * @file - file struct + * @sock - socket + * @wait - poll table + * + * This is same as datagram poll, except for the special case of + * blocking sockets. If application is using a blocking fd + * and a packet with checksum error is in the queue; + * then it could get return from select indicating data available + * but then block when reading it. Add special case code + * to work around these arguably broken applications. + */ +unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) +{ + unsigned int mask = datagram_poll(file, sock, wait); + struct sock *sk = sock->sk; + + /* Check for false positives due to checksum errors */ + if ( (mask & POLLRDNORM) && + !(file->f_flags & O_NONBLOCK) && + !(sk->sk_shutdown & RCV_SHUTDOWN)){ + struct sk_buff_head *rcvq = &sk->sk_receive_queue; + struct sk_buff *skb; + + spin_lock_irq(&rcvq->lock); + while ((skb = skb_peek(rcvq)) != NULL) { + if (udp_checksum_complete(skb)) { + UDP_INC_STATS_BH(UDP_MIB_INERRORS); + __skb_unlink(skb, rcvq); + kfree_skb(skb); + } else { + skb->ip_summed = CHECKSUM_UNNECESSARY; + break; + } + } + spin_unlock_irq(&rcvq->lock); + + /* nothing to see, move along */ + if (skb == NULL) + mask &= ~(POLLIN | POLLRDNORM); + } + + return mask; + +} struct proto udp_prot = { .name = "UDP", @@ -1516,6 +1562,7 @@ EXPORT_SYMBOL(udp_port_rover); EXPORT_SYMBOL(udp_prot); EXPORT_SYMBOL(udp_sendmsg); +EXPORT_SYMBOL(udp_poll); #ifdef CONFIG_PROC_FS EXPORT_SYMBOL(udp_proc_register); diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c --- a/net/ipv6/af_inet6.c 2004-11-19 10:37:56 -08:00 +++ b/net/ipv6/af_inet6.c 2004-11-19 10:37:56 -08:00 @@ -501,7 +501,7 @@ .socketpair = sock_no_socketpair, /* a do nothing */ .accept = sock_no_accept, /* a do nothing */ .getname = inet6_getname, - .poll = datagram_poll, /* ok */ + .poll = udp_poll, /* ok */ .ioctl = inet6_ioctl, /* must change */ .listen = sock_no_listen, /* ok */ .shutdown = inet_shutdown, /* ok */ From alchemyx@uznam.net.pl Mon Nov 22 10:10:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:10:41 -0800 (PST) Received: from mail.uznam.net.pl (postfix@gandalf.uznam.net.pl [195.135.236.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMIAYMR009487 for ; Mon, 22 Nov 2004 10:10:35 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.uznam.net.pl (Postfix) with ESMTP id 9878A12F4C; Mon, 22 Nov 2004 19:10:13 +0100 (CET) Received: from mail.uznam.net.pl ([195.135.236.2]) by localhost (gandalf.uznam.net.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 10825-09; Mon, 22 Nov 2004 19:10:13 +0100 (CET) Received: from [195.135.237.2] (cerber.uznam.net.pl [195.135.237.2]) by mail.uznam.net.pl (Postfix) with ESMTP id 8AC4D12F2A; Mon, 22 Nov 2004 19:10:12 +0100 (CET) Message-ID: <41A22B83.2050002@uznam.net.pl> Date: Mon, 22 Nov 2004 19:10:11 +0100 From: =?ISO-8859-2?Q?Micha=B3_Margula?= User-Agent: Mozilla Thunderbird 0.8 (X11/20041119) X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Thomas Graf Cc: netdev@oss.sgi.com, Andrew Morton Subject: Re: Fw: [Bugme-new] [Bug 3747] New: HTB causes machine lockups References: <20041115122059.4cfcd213.akpm@osdl.org> <20041115233806.GC31969@postel.suug.ch> In-Reply-To: <20041115233806.GC31969@postel.suug.ch> X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at uznam.net.pl X-archive-position: 12116 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alchemyx@uznam.net.pl Precedence: bulk X-list: netdev Thomas Graf napisa(a): >Did you ever experience the same problems with other classful qdiscs such as >CBQ? Would it be possible for you to run a similar CBQ setup on a dummy device >and see if it happens as well? Is anything going on at the time of the >deadlocks like an interface going down etc.? > > > At the moment I can't make such CBQ configuration, because I have no free time, too much work. But in about few weeks I am going to convert that box 2.6.x kernels. After that if hangs don't stop, we can think about converting that to CBQ, ok? And by the way, today I got that in my logs: Nov 22 17:50:01 sauron kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000000 Nov 22 17:50:01 sauron kernel: printing eip: Nov 22 17:50:01 sauron kernel: f89cb555 Nov 22 17:50:01 sauron kernel: *pde = 00000000 Nov 22 17:50:01 sauron kernel: Oops: 0000 Nov 22 17:50:01 sauron kernel: CPU: 3 Nov 22 17:50:01 sauron kernel: EIP: 0010:[cls_u32:__insmod_cls_u32_O/lib/modules/2.4.26/kernel/net/sched/cls_+-146091/96] Not tainted Nov 22 17:50:01 sauron kernel: EFLAGS: 00010202 Nov 22 17:50:01 sauron kernel: eax: 000000b0 ebx: 00000000 ecx: c02f9888 edx: 000000b0 Nov 22 17:50:01 sauron kernel: esi: f04a7dd8 edi: f4eb5068 ebp: f4eb5068 esp: f04a7d90 Nov 22 17:50:01 sauron kernel: ds: 0018 es: 0018 ss: 0018 Nov 22 17:50:01 sauron kernel: Process tc (pid: 6600, stackpage=f04a7000) Nov 22 17:50:01 sauron kernel: Stack: f4eb5000 00000930 c57fd824 c57fd800 f4eb5068 00000000 f4eb5060 c02021c5 Nov 22 17:50:01 sauron kernel: f4eb5000 f04a7dd8 e6eb8880 c92aab00 c57fd800 c92aab00 c57fd818 dc9a8e90 Nov 22 17:50:01 sauron kernel: f7ceb000 0000092f 00000000 00000000 00000001 c02020b4 e6eb8880 c57fd800 Nov 22 17:50:01 sauron kernel: Call Trace: [tc_dump_tclass+221/304] [qdisc_class_dump+0/52] [netlink_dump+130/464] [skb_free_datagram+29/36] [netlink_recvmsg+190/300] Nov 22 17:50:01 sauron kernel: [netlink_recvmsg+229/300] [sock_recvmsg+61/188] [sys_recvmsg+356/516] [handle_mm_fault+92/188] [schedule+1115/1312] [pipe_write+518/616] Nov 22 17:50:01 sauron kernel: [sys_socketcall+501/512] [system_call+51/56] Nov 22 17:50:01 sauron kernel: Nov 22 17:50:01 sauron kernel: Code: 8b 03 0f 18 00 39 fb 75 c2 83 44 24 10 08 83 c5 08 ff 44 24 Nov 22 17:50:01 sauron kernel: <6>HTB init, kernel part version 3.16 And my HTB rules stopped working. -- Micha Margula, alchemyx@uznam.net.pl, http://alchemyx.uznam.net.pl/ "W yciu pikne s tylko chwile" [Ryszard Riedel] From roland@topspin.com Mon Nov 22 10:55:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 10:56:01 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMItvx7011544 for ; Mon, 22 Nov 2004 10:55:57 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 10:55:27 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 10:55:26 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWJLN-0006k4-Ex; Mon, 22 Nov 2004 10:55:26 -0800 To: Christoph Hellwig Cc: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> <52sm71ex0l.fsf@topspin.com> <20041122153456.GA4905@infradead.org> From: Roland Dreier Date: Mon, 22 Nov 2004 10:55:21 -0800 In-Reply-To: <20041122153456.GA4905@infradead.org> (Christoph Hellwig's message of "Mon, 22 Nov 2004 15:34:56 +0000") Message-ID: <521xelemsm.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 18:55:26.0757 (UTC) FILETIME=[D452A550:01C4D0C4] X-archive-position: 12117 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Christoph> That just means avoidable interface changes sooner or Christoph> later. The dma_ interfaces also have the added benefit Christoph> of allowing better control of the type of consistant Christoph> allocation interface. Is there a dma_xxx equivalent to DECLARE_PCI_UNMAP_ADDR(), pci_unmap_addr_set() and friends, or does a driver always have to save off the DMA address from dma_map_xxx? Thanks, Roland From sam@ravnborg.org Mon Nov 22 11:40:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 11:40:24 -0800 (PST) Received: from pfepb.post.tele.dk (pfepb.post.tele.dk [195.41.46.236]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMJeIYo013431 for ; Mon, 22 Nov 2004 11:40:19 -0800 Received: from mars.ravnborg.org (0x50a0757d.hrnxx9.adsl-dhcp.tele.dk [80.160.117.125]) by pfepb.post.tele.dk (Postfix) with ESMTP id CEBB35EE062; Mon, 22 Nov 2004 20:39:57 +0100 (CET) Received: by mars.ravnborg.org (Postfix, from userid 1000) id C6CB96AC01D; Mon, 22 Nov 2004 20:40:03 +0100 (CET) Date: Mon, 22 Nov 2004 20:40:03 +0100 From: Sam Ravnborg To: Roland Dreier Cc: linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com Subject: Re: [PATCH][RFC/v1][8/12] Add IPoIB (IP-over-InfiniBand) driver Message-ID: <20041122194003.GC8150@mars.ravnborg.org> Mail-Followup-To: Roland Dreier , linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com References: <20041122713.FnSlYodJYum7s82D@topspin.com> <20041122714.nKCPmH9LMhT0X7WE@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122714.nKCPmH9LMhT0X7WE@topspin.com> User-Agent: Mutt/1.5.6i X-archive-position: 12118 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sam@ravnborg.org Precedence: bulk X-list: netdev More nitpicking.. Sam > +++ linux-bk/drivers/infiniband/Makefile 2004-11-21 21:25:56.794775182 -0800 > @@ -1,2 +1,3 @@ > obj-$(CONFIG_INFINIBAND) += core/ No reason to use $(CONFIG_INFINIBAND) here - it's already done in drivers/infiniband/Makefile > +EXTRA_CFLAGS += -Idrivers/infiniband/include This will get killed if you move the include files... + > +obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o > + > +ib_ipoib-y := ipoib_main.o \ > + ipoib_ib.o \ > + ipoib_multicast.o \ > + ipoib_verbs.o \ > + ipoib_vlan.o One or two lines. > +#include > + > +#include "ipoib_proto.h" Shoulb be included as the last file - since it's the most local one. > + > +#include > +#include > +#include > From kaber@trash.net Mon Nov 22 11:41:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 11:41:47 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMJfdPB013646 for ; Mon, 22 Nov 2004 11:41:40 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CWK3B-0003Iu-FX; Mon, 22 Nov 2004 20:40:37 +0100 Message-ID: <41A240B5.5070404@trash.net> Date: Mon, 22 Nov 2004 20:40:37 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: hadi@cyberus.ca CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions References: <41908D1D.50405@trash.net> <20041111150314.576ce699.davem@davemloft.net> <1101059233.1093.151.camel@jzny.localdomain> <41A1C99B.6010202@trash.net> <1101129873.1093.300.camel@jzny.localdomain> In-Reply-To: <1101129873.1093.300.camel@jzny.localdomain> Content-Type: multipart/mixed; boundary="------------050801050102000903020706" X-archive-position: 12119 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------050801050102000903020706 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit jamal wrote: >I think thats the one I am acking, no? > Sorry, seems my eyes were still closed when replying to your mail :) >Can you resend it just to be >sure. Note that i had no issues with any of the other patches (other >than one i explicitly flagged to test). > Attached, description from the original mail: This patch moves memory allocation for tc_actions to tcf_action_init_1 and fixes multiple bugs in error paths: - when memory allocation fails in tcf_action_init, the action is destroyed twice, once in tcf_action_init and once in tcf_action_add/tcf_change_act - when tcf_action_init_1 fails for the first action, the action is passed to tcf_action_destroy in an undefined state by tcf_action_add/tcf_change_act/tcf_change_act_police - when tcf_action_init_1 fails for any but the first action, the action leaks in tcf_action_init Regards Patrick --------------050801050102000903020706 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/09 07:31:03+01:00 kaber@coreworks.de # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # net/sched/act_api.c # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +47 -57 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # include/net/pkt_cls.h # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +6 -20 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # # include/net/act_api.h # 2004/11/09 07:30:52+01:00 kaber@coreworks.de +2 -2 # [PKT_SCHED]: Clean up tcf_action_init memory handling # # Signed-off-by: Patrick McHardy # diff -Nru a/include/net/act_api.h b/include/net/act_api.h --- a/include/net/act_api.h 2004-11-09 09:31:36 +01:00 +++ b/include/net/act_api.h 2004-11-09 09:31:36 +01:00 @@ -87,8 +87,8 @@ extern int tcf_unregister_action(struct tc_action_ops *a); extern void tcf_action_destroy(struct tc_action *a, int bind); extern int tcf_action_exec(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res); -extern int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,char *n, int ovr, int bind); -extern int tcf_action_init_1(struct rtattr *rta, struct rtattr *est, struct tc_action *a,char *n, int ovr, int bind); +extern struct tc_action *tcf_action_init(struct rtattr *rta, struct rtattr *est, char *n, int ovr, int bind, int *err); +extern struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est, char *n, int ovr, int bind, int *err); extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int); extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); diff -Nru a/include/net/pkt_cls.h b/include/net/pkt_cls.h --- a/include/net/pkt_cls.h 2004-11-09 09:31:36 +01:00 +++ b/include/net/pkt_cls.h 2004-11-09 09:31:36 +01:00 @@ -70,17 +70,10 @@ int ret; struct tc_action *act; - act = kmalloc(sizeof(*act), GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init_1(act_police_tlv, rate_tlv, act, "police", - TCA_ACT_NOREPLACE, TCA_ACT_BIND); - if (ret < 0) { - tcf_action_destroy(act, TCA_ACT_UNBIND); + act = tcf_action_init_1(act_police_tlv, rate_tlv, "police", + TCA_ACT_NOREPLACE, TCA_ACT_BIND, &ret); + if (act == NULL) return ret; - } act->type = TCA_OLD_COMPAT; @@ -103,17 +96,10 @@ int ret; struct tc_action *act; - act = kmalloc(sizeof(*act), GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init(act_tlv, rate_tlv, act, NULL, - TCA_ACT_NOREPLACE, TCA_ACT_BIND); - if (ret < 0) { - tcf_action_destroy(act, TCA_ACT_UNBIND); + act = tcf_action_init(act_tlv, rate_tlv, NULL, + TCA_ACT_NOREPLACE, TCA_ACT_BIND, &ret); + if (act == NULL) return ret; - } if (*action) { tcf_tree_lock(tp); diff -Nru a/net/sched/act_api.c b/net/sched/act_api.c --- a/net/sched/act_api.c 2004-11-09 09:31:36 +01:00 +++ b/net/sched/act_api.c 2004-11-09 09:31:36 +01:00 @@ -294,14 +294,16 @@ } -int tcf_action_init_1(struct rtattr *rta, struct rtattr *est, struct tc_action *a, char *name, int ovr, int bind ) +struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est, + char *name, int ovr, int bind, int *err) { + struct tc_action *a; struct tc_action_ops *a_o; char act_name[4 + IFNAMSIZ + 1]; struct rtattr *tb[TCA_ACT_MAX+1]; struct rtattr *kind = NULL; - int err = -EINVAL; + *err = -EINVAL; if (NULL == name) { if (rtattr_parse(tb, TCA_ACT_MAX, RTA_DATA(rta), RTA_PAYLOAD(rta))<0) @@ -337,22 +339,25 @@ goto err_out; } - if (NULL == a) { + a = kmalloc(sizeof(*a), GFP_KERNEL); + if (a == NULL) { + *err = -ENOMEM; goto err_mod; } + memset(a, 0, sizeof(*a)); /* backward compatibility for policer */ if (NULL == name) { - err = a_o->init(tb[TCA_ACT_OPTIONS-1], est, a, ovr, bind); - if (0 > err ) { - err = -EINVAL; - goto err_mod; + *err = a_o->init(tb[TCA_ACT_OPTIONS-1], est, a, ovr, bind); + if (*err < 0) { + *err = -EINVAL; + goto err_free; } } else { - err = a_o->init(rta, est, a, ovr, bind); - if (0 > err ) { - err = -EINVAL; - goto err_mod; + *err = a_o->init(rta, est, a, ovr, bind); + if (*err < 0) { + *err = -EINVAL; + goto err_free; } } @@ -360,60 +365,58 @@ if it exists and is only bound to in a_o->init() then ACT_P_CREATED is not returned (a zero is). */ - if (ACT_P_CREATED != err) { + if (*err != ACT_P_CREATED) module_put(a_o->owner); - } a->ops = a_o; DPRINTK("tcf_action_init_1: successfull %s \n",act_name); - return 0; + *err = 0; + return a; + +err_free: + kfree(a); err_mod: module_put(a_o->owner); err_out: - return err; + return NULL; } -int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a, char *name, int ovr , int bind) +struct tc_action *tcf_action_init(struct rtattr *rta, struct rtattr *est, + char *name, int ovr, int bind, int *err) { struct rtattr *tb[TCA_ACT_MAX_PRIO+1]; + struct tc_action *a = NULL, *act, *act_prev = NULL; int i; - struct tc_action *act = a, *a_s = a; - - int err = -EINVAL; - if (rtattr_parse(tb, TCA_ACT_MAX_PRIO, RTA_DATA(rta), RTA_PAYLOAD(rta))<0) - return err; + if (rtattr_parse(tb, TCA_ACT_MAX_PRIO, RTA_DATA(rta), + RTA_PAYLOAD(rta)) < 0) { + *err = -EINVAL; + return a; + } - for (i=0; i < TCA_ACT_MAX_PRIO ; i++) { + for (i=0; i < TCA_ACT_MAX_PRIO; i++) { if (tb[i]) { - if (NULL == act) { - act = kmalloc(sizeof(*act),GFP_KERNEL); - if (NULL == act) { - err = -ENOMEM; - goto bad_ret; - } - memset(act, 0,sizeof(*act)); - } - act->next = NULL; - if (0 > tcf_action_init_1(tb[i],est,act,name,ovr,bind)) { - printk("Error processing action order %d\n",i); - return err; + act = tcf_action_init_1(tb[i], est, name, ovr, bind, err); + if (act == NULL) { + printk("Error processing action order %d\n", i); + goto bad_ret; } act->order = i+1; - if (a_s != act) { - a_s->next = act; - a_s = act; - } - act = NULL; + if (a == NULL) + a = act; + else + act_prev->next = act; + act_prev = act; } } + return a; - return 0; bad_ret: - tcf_action_destroy(a, bind); - return err; + if (a != NULL) + tcf_action_destroy(a, bind); + return NULL; } int tcf_action_copy_stats (struct sk_buff *skb,struct tc_action *a) @@ -849,21 +852,9 @@ struct tc_action *a = NULL; u32 seq = n->nlmsg_seq; - act = kmalloc(sizeof(*act),GFP_KERNEL); - if (NULL == act) - return -ENOMEM; - - memset(act, 0, sizeof(*act)); - - ret = tcf_action_init(rta, NULL,act,NULL,ovr,0); - /* NOTE: We have an all-or-none model - * This means that of any of the actions fail - * to update then all are undone. - * */ - if (0 > ret) { - tcf_action_destroy(act, 0); + act = tcf_action_init(rta, NULL, NULL, ovr, 0, &ret); + if (act == NULL) goto done; - } /* dump then free all the actions after update; inserted policy * stays intact @@ -880,7 +871,6 @@ } } done: - return ret; } --------------050801050102000903020706-- From nish.aravamudan@gmail.com Mon Nov 22 11:55:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 11:55:55 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.192]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMJtl0v014522 for ; Mon, 22 Nov 2004 11:55:47 -0800 Received: by rproxy.gmail.com with SMTP id z35so236709rne for ; Mon, 22 Nov 2004 11:55:24 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=XRqKMlqS5js7oZV3WnduzJYQ/TPAt633VzecMDAhFfMfLHQ7OLNd5/O6htaB2C7gn01Uzmz9M7Z/MTO8hrlUrridVIZk6llvQaGedyyuYyCoOXM1DQe0jem9wS2ztXhr70NL5wFaoAvyl9c3RR8+el2lhu8HFnpF+sJTZ+I+IsY= Received: by 10.38.15.29 with SMTP id 29mr152201rno; Mon, 22 Nov 2004 11:55:24 -0800 (PST) Received: by 10.38.77.41 with HTTP; Mon, 22 Nov 2004 11:55:23 -0800 (PST) Message-ID: <29495f1d04112211554e78da67@mail.gmail.com> Date: Mon, 22 Nov 2004 11:55:23 -0800 From: Nish Aravamudan Reply-To: Nish Aravamudan To: cranium2003 Subject: Re: how netfilter handles fragmented packets Cc: kernelnewbies@nl.linux.org, linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com In-Reply-To: <20041121194202.14581.qmail@web41407.mail.yahoo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <29495f1d04112109372bb8ebe4@mail.gmail.com> <20041121194202.14581.qmail@web41407.mail.yahoo.com> X-archive-position: 12120 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nish.aravamudan@gmail.com Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 11:42:02 -0800 (PST), cranium2003 wrote: > > --- Nish Aravamudan wrote: > Hello Nish, > > > > > On Sun, 21 Nov 2004 17:15:12 +0100 (MET), Jan > > Engelhardt > > wrote: > > > >hello, > > > > In ip_output.c file ip_fragmet function > > when > > > >create a new fragmented packet given to > > output(skb) > > > >function. i want to know which function are > > actually > > > >called by output(skb)? > > > > > > use stack_dump() (or was it dump_stack()?) > > > > dump_stack(), if you want to dump the current > > process' stack context. > > > > -Nish > > > > can you please tell me how can i use dump_stack() > method? so using dump_stack i will come to know which > function will be called by output(skb) right? But > where i get dump_stack()??? Last time i used it, I didn't need to do a darn thing. I believe it's part of the traps code, so you can just call dump_stack(). dump_stack() will throw out the trace of the current task's stack at the point when it is called. See what happens when you place it in different places. Another option, if you ever have a hanging sytem is Alt-SysRq-T (presuming you have the magic option enabled and you are able to scrollback still), which pretty much calls dump_stack() for all available processes. -Nish From akpm@osdl.org Mon Nov 22 12:00:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 12:00:16 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMK0CMT015049 for ; Mon, 22 Nov 2004 12:00:13 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAMJxl929536; Mon, 22 Nov 2004 11:59:47 -0800 Date: Mon, 22 Nov 2004 11:59:35 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: bill@crowellsystems.com Subject: Fw: [Bugme-new] [Bug 3796] New: ipsec causes kernel deadlock Message-Id: <20041122115935.4d6f4e21.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12121 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Mon, 22 Nov 2004 10:40:48 -0800 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 3796] New: ipsec causes kernel deadlock http://bugme.osdl.org/show_bug.cgi?id=3796 Summary: ipsec causes kernel deadlock Kernel Version: 2.6.10-rc2 Status: NEW Severity: blocking Owner: jgarzik@pobox.com Submitter: bill@crowellsystems.com Distribution:slack/mfxlinux Hardware Environment:i386 Software Environment:Openswan Problem Description: when instantiating a gateway-network connection using Openswan tools, the server at the 'gateway' end of the tunnel connection will deadlock during the ISAKMP stage 1. The network-network tunnel is built properly. Setting the boot parameter nmi_watchdog=1 does not produce any debugging output on the console. Steps to reproduce: install Openswan. Build an ipsec.conf file with the 4 virtual tunnels that comprise 1 server-server link. Set auto=add so that the connections may be brought up manually. Instantiate ipsec. Manually ipsec auto --verbose --up net-net, then ipsec auto --verbose --up gate-net. The machine on gate will deadlock. ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. From SRS0+920d2f4309d681ac93c8+456+infradead.org+hch@pentafluge.srs.infradead.org Mon Nov 22 12:05:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 12:05:05 -0800 (PST) Received: from pentafluge.infradead.org ([213.146.154.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMK4xkm015508 for ; Mon, 22 Nov 2004 12:05:00 -0800 Received: from hch by pentafluge.infradead.org with local (Exim 4.42 #1 (Red Hat Linux)) id 1CWKQR-0002W1-Hs; Mon, 22 Nov 2004 20:04:39 +0000 Date: Mon, 22 Nov 2004 20:04:39 +0000 From: Christoph Hellwig To: Roland Dreier Cc: Christoph Hellwig , netdev@oss.sgi.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Message-ID: <20041122200439.GA9635@infradead.org> References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> <52sm71ex0l.fsf@topspin.com> <20041122153456.GA4905@infradead.org> <521xelemsm.fsf@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <521xelemsm.fsf@topspin.com> User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by pentafluge.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 12122 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Mon, Nov 22, 2004 at 10:55:21AM -0800, Roland Dreier wrote: > Christoph> That just means avoidable interface changes sooner or > Christoph> later. The dma_ interfaces also have the added benefit > Christoph> of allowing better control of the type of consistant > Christoph> allocation interface. > > Is there a dma_xxx equivalent to DECLARE_PCI_UNMAP_ADDR(), > pci_unmap_addr_set() and friends, or does a driver always have to save > off the DMA address from dma_map_xxx? Good question. In pratice I can't find a case were DECLARE_PCI_UNMAP_ADDR() wouldn't simply work for dma_*, but we should probably document that somewhere. From roland@topspin.com Mon Nov 22 12:16:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 12:17:01 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMKGv07016199 for ; Mon, 22 Nov 2004 12:16:57 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 12:16:37 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 12:16:37 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWKbw-0006uB-7W; Mon, 22 Nov 2004 12:16:37 -0800 To: Christoph Hellwig Cc: netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <200411181046.6Dz1IPtDKfpgSXN9@topspin.com> <200411181046.Jj0jsF5E2KmiGN8f@topspin.com> <20041118200017.GA26976@infradead.org> <52sm71ex0l.fsf@topspin.com> <20041122153456.GA4905@infradead.org> <521xelemsm.fsf@topspin.com> <20041122200439.GA9635@infradead.org> From: Roland Dreier Date: Mon, 22 Nov 2004 12:16:32 -0800 In-Reply-To: <20041122200439.GA9635@infradead.org> (Christoph Hellwig's message of "Mon, 22 Nov 2004 20:04:39 +0000") Message-ID: <52fz31d4gv.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][6/12][RFC/v1] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 20:16:37.0429 (UTC) FILETIME=[2B783650:01C4D0D0] X-archive-position: 12123 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Christoph> Good question. In pratice I can't find a case were Christoph> DECLARE_PCI_UNMAP_ADDR() wouldn't simply work for Christoph> dma_*, but we should probably document that somewhere. OK, I'll leave the DECLARE_PCI_UNMAP_ADDR() stuff in for now. Longer term maybe I'll submit a patch to add DECLARE_DMA_UNMAP_ADDR() et al to clean this up. Thanks, Roland From herbert@gondor.apana.org.au Mon Nov 22 12:38:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 12:38:15 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMKc6qO020386 for ; Mon, 22 Nov 2004 12:38:07 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWKwP-0000zn-00; Tue, 23 Nov 2004 07:37:41 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWKwK-0008CM-00; Tue, 23 Nov 2004 07:37:36 +1100 From: Herbert Xu To: akpm@osdl.org (Andrew Morton) Subject: Re: Fw: [Bugme-new] [Bug 3796] New: ipsec causes kernel deadlock Cc: netdev@oss.sgi.com, bill@crowellsystems.com Organization: Core In-Reply-To: <20041122115935.4d6f4e21.akpm@osdl.org> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Tue, 23 Nov 2004 07:37:36 +1100 X-archive-position: 12124 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Andrew Morton wrote: > > Problem Description: when instantiating a gateway-network connection using > Openswan tools, the server at the 'gateway' end of the tunnel connection will > deadlock during the ISAKMP stage 1. The network-network tunnel is built ISAKMP stage does not involve the kernel IPsec stack so the bug is probably elsewhere. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From rich@phekda.gotadsl.co.uk Mon Nov 22 12:42:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 12:42:59 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMKgpIN020883 for ; Mon, 22 Nov 2004 12:42:52 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (unknown [84.12.27.96]) by smtp.nildram.co.uk (Postfix) with ESMTP id D595F253CDB; Mon, 22 Nov 2004 20:42:27 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id BDD3D34E; Mon, 22 Nov 2004 20:42:30 +0000 (GMT) Message-ID: <41A24F35.5080106@phekda.gotadsl.co.uk> Date: Mon, 22 Nov 2004 20:42:29 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: Francois Romieu Cc: netdev@oss.sgi.com, Me Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow References: <41A09541.5040405@phekda.gotadsl.co.uk> <41A0F0D5.9050702@phekda.gotadsl.co.uk> <20041121205814.GA22460@electric-eye.fr.zoreil.com> In-Reply-To: <20041121205814.GA22460@electric-eye.fr.zoreil.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12125 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev Hello. Francois Romieu wrote: > Richard Dawe : > [...] > >>I've got it working with 10Mbps full-duplex now. Here are the lines from >>modprobe.conf: >> >> alias eth0 r8169 >> options eth0 use_dac=0 media=0x2 > > > It makes sense. use_dac=1 is reported to badly fail on amd64 most of > time. I didn't see any crashes or hangs with use_dac enabled (or rather, not disabled). I haven't tried use_dac=1 with media=0x2, though. Maybe that would give enough traffic to crash or hang my box. > Can you try 2.6.10-rc2 + > http://www.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.6/2.6.10-rc2-netdev1.patch.bz2 + > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-250.patch + > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-255.patch No, that suffers from the same problems. How do these patches differ from those in 2.6.10-rc2-mm2? Let me know if there are any other patches you want me to try. > Is it an option for you to disable ACPI, remove the media specification > and simply issue an 'ethtool eth0' a few tens of seconds after insertion > of the module ? Sadly my box won't boot, if I disable ACPI. > It takes ages to negotiate here (Netgear switch + 8169 PCI adapter). [snip] It seems to negotiate pretty quickly with my DSL router. Less than a second, I'd say. I can time it a bit more exactly, if it would help. From your ethtool patch, it looks like I have a 8110. I did search their specs for version registers, etc., but I could not see them. Where did you get your datasheet from for the 8110? Thanks, bye, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek From romieu@fr.zoreil.com Mon Nov 22 13:33:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 13:33:54 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMLXmVt022396 for ; Mon, 22 Nov 2004 13:33:49 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAMLU9vr012711; Mon, 22 Nov 2004 22:30:09 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAMLU9vJ012710; Mon, 22 Nov 2004 22:30:09 +0100 Date: Mon, 22 Nov 2004 22:30:09 +0100 From: Francois Romieu To: Richard Dawe Cc: netdev@oss.sgi.com Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow Message-ID: <20041122213008.GA9618@electric-eye.fr.zoreil.com> References: <41A09541.5040405@phekda.gotadsl.co.uk> <41A0F0D5.9050702@phekda.gotadsl.co.uk> <20041121205814.GA22460@electric-eye.fr.zoreil.com> <41A24F35.5080106@phekda.gotadsl.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A24F35.5080106@phekda.gotadsl.co.uk> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12126 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Richard Dawe : [...] > I didn't see any crashes or hangs with use_dac enabled (or rather, not > disabled). It defaults to 0. Set it to 1 if you dare (once the current issues are fixed, ok ? :o) ). > I haven't tried use_dac=1 with media=0x2, though. Maybe that would give > enough traffic to crash or hang my box. media=... ought to be obsolete. I'll check if there is something relevant for ethtool on RH bugzilla. It should not segfault. [...] > No, that suffers from the same problems. Thanks anyway. > How do these patches differ from those in 2.6.10-rc2-mm2? The Tx timeout recovery sequence suggested by Jon Mason works for me. [...] > Sadly my box won't boot, if I disable ACPI. Can you give a look at: http://forums.gentoo.org/viewtopic.php?t=122145%22%22 Ac*r, laptop, acpi and x64 are making me paranoid. > >It takes ages to negotiate here (Netgear switch + 8169 PCI adapter). > [snip] > > It seems to negotiate pretty quickly with my DSL router. Less than a > second, I'd say. I can time it a bit more exactly, if it would help. It is not necessary. > From your ethtool patch, it looks like I have a 8110. I did search > their specs for version registers, etc., but I could not see them. Where > did you get your datasheet from for the 8110? I got my rtl8169spec-121.pdf from Realtek's website when their search engine was still working. Now you'd better use Google. There are some typos in the datasheet as some parts seems to have been copy/pasted from the 8139C+ manual. Some registers are missing (0xe2, 0x48 ?). -- Ueimor From rich@phekda.gotadsl.co.uk Mon Nov 22 14:07:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 14:07:54 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMM7nKP023391 for ; Mon, 22 Nov 2004 14:07:49 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (unknown [84.12.27.96]) by smtp.nildram.co.uk (Postfix) with ESMTP id 6A133251672; Mon, 22 Nov 2004 22:07:25 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id A1ADA34E; Mon, 22 Nov 2004 22:07:28 +0000 (GMT) Message-ID: <41A2631F.5020804@phekda.gotadsl.co.uk> Date: Mon, 22 Nov 2004 22:07:27 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: Francois Romieu Cc: netdev@oss.sgi.com Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow References: <41A09541.5040405@phekda.gotadsl.co.uk> <41A0F0D5.9050702@phekda.gotadsl.co.uk> <20041121205814.GA22460@electric-eye.fr.zoreil.com> <41A24F35.5080106@phekda.gotadsl.co.uk> <20041122213008.GA9618@electric-eye.fr.zoreil.com> In-Reply-To: <20041122213008.GA9618@electric-eye.fr.zoreil.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12127 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev Hello. Francois Romieu wrote: > Richard Dawe : > [...] > >>I didn't see any crashes or hangs with use_dac enabled (or rather, not >>disabled). > > > It defaults to 0. Set it to 1 if you dare (once the current issues are > fixed, ok ? :o) ). Yeah. ;) [snip] > I'll check if there is something relevant for ethtool on RH bugzilla. > It should not segfault. OK. I will try debugging it using gdb later (probably not today), to see where it segfaults. [snip] >>Sadly my box won't boot, if I disable ACPI. > > > Can you give a look at: > http://forums.gentoo.org/viewtopic.php?t=122145%22%22 > > Ac*r, laptop, acpi and x64 are making me paranoid. Sure. It will take me a while to digest all that stuff! I probably won't be able to do that for a couple of days. There is a fixed-up ACPI file for the Acer Aspire 1523LMi. I probably need to do some work. Earlier versions of the 1520 series came with Broadcom GigE. [snip] >>From your ethtool patch, it looks like I have a 8110. I did search >>their specs for version registers, etc., but I could not see them. Where >>did you get your datasheet from for the 8110? > > > I got my rtl8169spec-121.pdf from Realtek's website when their search > engine was still working. Now you'd better use Google. [snip] Thanks, I've got a copy now. Googling for that exact filename gives a site containing specifications for various network chips. Thanks for your help! Thanks, bye, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek From greg@kroah.com Mon Nov 22 14:35:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 14:35:13 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMMZ9li024364 for ; Mon, 22 Nov 2004 14:35:09 -0800 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id iAMMYhaf486624 for ; Mon, 22 Nov 2004 17:34:43 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAMMYhrE284106 for ; Mon, 22 Nov 2004 17:34:43 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAMMYht8015818 for ; Mon, 22 Nov 2004 17:34:43 -0500 Received: from DYN319006BLD.beaverton.ibm.com (DYN319006BLD.beaverton.ibm.com [9.47.21.95]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAMMYglN015794; Mon, 22 Nov 2004 17:34:43 -0500 Received: from greg by echidna.kroah.org with local (masqmail 0.2.19) id 1CWMlU-1qZ-00; Mon, 22 Nov 2004 14:34:32 -0800 Date: Mon, 22 Nov 2004 14:34:32 -0800 From: Greg KH To: Roland Dreier Cc: linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com Subject: Re: [PATCH][RFC/v1][8/12] Add IPoIB (IP-over-InfiniBand) driver Message-ID: <20041122223432.GC15634@kroah.com> References: <20041122713.FnSlYodJYum7s82D@topspin.com> <20041122714.nKCPmH9LMhT0X7WE@topspin.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122714.nKCPmH9LMhT0X7WE@topspin.com> User-Agent: Mutt/1.5.6i X-archive-position: 12128 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greg@kroah.com Precedence: bulk X-list: netdev On Mon, Nov 22, 2004 at 07:14:04AM -0800, Roland Dreier wrote: > > +#define ipoib_printk(level, priv, format, arg...) \ > + printk(level "%s: " format, ((struct ipoib_dev_priv *) priv)->dev->name , ## arg) > +#define ipoib_warn(priv, format, arg...) \ > + ipoib_printk(KERN_WARNING, priv, format , ## arg) What's wrong with using the dev_printk() and friends instead of your own? And why cast a pointer in a macro, don't you know the type of it anyway? > Index: linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2004-11-21 21:25:56.924755902 -0800 You're using a separate filesystem to export debug data? I'm all for new virtual filesystems, but why not just use sysfs for this? What are you doing in here that you can't do with another mechanism (netlink, sysfs, sockets, relayfs, etc.)? > +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA > +#define DATA_PATH_DEBUG_HELP " and data path tracing if > 1" > +#else > +#define DATA_PATH_DEBUG_HELP "" > +#endif > + > +module_param(debug_level, int, 0644); > +MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0" DATA_PATH_DEBUG_HELP); Why not just use 2 different debug variables for this? > + > +int mcast_debug_level; Global? thanks, greg k-h From roland@topspin.com Mon Nov 22 15:18:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 15:18:40 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAMNIZFZ026160 for ; Mon, 22 Nov 2004 15:18:36 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 15:18:13 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Mon, 22 Nov 2004 15:18:12 -0800 Received: from roland by eddore with local (Exim 4.34) id 1CWNRf-0007Ab-Ey; Mon, 22 Nov 2004 15:18:12 -0800 To: Greg KH Cc: linux-kernel@vger.kernel.org, openib-general@openib.org, netdev@oss.sgi.com X-Message-Flag: Warning: May contain useful information References: <20041122713.FnSlYodJYum7s82D@topspin.com> <20041122714.nKCPmH9LMhT0X7WE@topspin.com> <20041122223432.GC15634@kroah.com> From: Roland Dreier Date: Mon, 22 Nov 2004 15:18:07 -0800 In-Reply-To: <20041122223432.GC15634@kroah.com> (Greg KH's message of "Mon, 22 Nov 2004 14:34:32 -0800") Message-ID: <52k6sdbhhs.fsf@topspin.com> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) MIME-Version: 1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: roland@topspin.com Subject: Re: [PATCH][RFC/v1][8/12] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset=us-ascii X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 22 Nov 2004 23:18:12.0882 (UTC) FILETIME=[89AA6720:01C4D0E9] X-archive-position: 12129 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Greg> What's wrong with using the dev_printk() and friends instead Greg> of your own? dev_printk expects a struct device, not a net_device. Greg> And why cast a pointer in a macro, don't you know the type Greg> of it anyway? this lets us pass in the return value of netdev_priv() directly without having to have the cast in the code that uses the macro. Greg> You're using a separate filesystem to export debug data? Greg> I'm all for new virtual filesystems, but why not just use Greg> sysfs for this? What are you doing in here that you can't Greg> do with another mechanism (netlink, sysfs, sockets, relayfs, Greg> etc.)? For each multicast group, we want to export the GID, how long it's been around, whether our join has completed and whether it's send-only. It wouldn't be too bad to create a kobject with all those attributes but getting the info from so many little files is a little bit of a pain, and so is dealing with kobject lifetime rules. It's even worse with netlink since then a new tool is required. (AFAIK relayfs isn't in Linus's kernel). It's nice to be able to tell someone to just mount ipoib_debugfs and send the contents of debugfs/ib0_mcg. The actual filesystem stuff is pretty trivial using everything libfs provides for us now... Greg> Why not just use 2 different debug variables for this? No real reason... I'll fix it up. >> + +int mcast_debug_level; Greg> Global? Good point, I'll move it into ipoib_multicast.c. - R. From stuart@ken-caryl.net Mon Nov 22 17:39:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 17:39:36 -0800 (PST) Received: from mpls-qmqp-01.inet.qwest.net (mpls-qmqp-01.inet.qwest.net [63.231.195.112]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAN1dUfw015732 for ; Mon, 22 Nov 2004 17:39:30 -0800 Received: (qmail 93162 invoked by uid 0); 23 Nov 2004 01:39:08 -0000 Received: from unknown (63.231.195.9) by mpls-qmqp-01.inet.qwest.net with QMQP; 23 Nov 2004 01:39:08 -0000 Received: from dnvrdslgw9poolg109.dnvr.uswest.net (HELO ken-caryl.net) (63.231.78.109) by mpls-pop-09.inet.qwest.net with SMTP; 23 Nov 2004 01:39:08 -0000 Received: from [192.168.49.30] by ken-caryl.net (MessageWall 1.0.8) with SMTP; 23 Nov 2004 1:39:7 -0000 Date: Mon, 22 Nov 2004 18:47:17 -0700 Message-ID: From: "Stuart Macdonald" To: "Henrik Nordstrom" , "cranium2003" Cc: kernelnewbies@nl.linux.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Reply-To: Subject: RE: netfilter query MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) Importance: Normal In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 X-archive-position: 12130 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: stuart@ken-caryl.net Precedence: bulk X-list: netdev Just a parallel thought here, A different approach is to implement the Netfilter Bridge hooks and run a box as a bridge. This requires a kernel parameter for Bridge to be enabled when the kernel is built and then the brctl utility to setup the bridge. In this manner, your bridge netfilter hooks always receive packets starting at the MAC headers. You can parse from there to derive subsequent protocols: IP, IPX, LLC, SNAP, NETBEUI... Stuart -----Original Message----- From: kernelnewbies-bounce@nl.linux.org [mailto:kernelnewbies-bounce@nl.linux.org]On Behalf Of Henrik Nordstrom Sent: Monday, November 22, 2004 5:03 AM To: cranium2003 Cc: kernelnewbies@nl.linux.org; netdev@oss.sgi.com; netfilter-devel@lists.netfilter.org; linux-kernel@vger.kernel.org Subject: Re: netfilter query On Sun, 21 Nov 2004, cranium2003 wrote: > Also,which headers are added when packet > reaches to netfilter hook NF_IP_LOCAL_OUT? I found > TCP/UDP/ICMP ,IP. Is that correct? Yes. netfilter is running at the IP layer and only reliably have access to IP headers and up. Lower level headers such as Ethernet MAC header is transport dependent and not always available, and certainly not available in NF_IP_LOCAL_OUT as it is not yet known the packet will be sent to an Ethernet. In some netfilter hooks it is possible to rewind back to the Ethernet MAC header but one must be careful to verify that it really is an Ethernet packet one is looking at when doing this. Unfortunately there is no perfect solution how to detect this.. For an example of how one may try to look at the Ethernet MAC header see ipt_mac.c. But be warned that it is possible for non-Ethernet frames to pass the simple checks done there.. Regards Henrik -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/ From yoshfuji@linux-ipv6.org Mon Nov 22 19:31:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 19:31:23 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAN3VFOR019412 for ; Mon, 22 Nov 2004 19:31:16 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 0BD5133CE5; Tue, 23 Nov 2004 12:32:13 +0900 (JST) Date: Mon, 22 Nov 2004 22:32:05 -0500 (EST) Message-Id: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: [BK PATCH] [IPV6] Multiple locking fixes/improvements From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12131 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. Please pull the following changesets available at: HEADLINES --------- ChangeSet@1.2231, 2004-11-23 11:50:54+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix possible dead-lock in ipv6_create_tempaddr(). ChangeSet@1.2232, 2004-11-23 11:52:57+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix a race when dad completed during shutting down its owner interface. ChangeSet@1.2233, 2004-11-23 11:54:38+09:00, yoshfuji@linux-ipv6.org [IPV6] Stop DAD during shutting down the interface. ChangeSet@1.2234, 2004-11-23 12:16:24+09:00, yoshfuji@linux-ipv6.org [IPV6] Clean-up locking in ipv6_add_addr(). DIFFSTATS --------- net/ipv6/addrconf.c | 115 ++++++++++++++++++++++++++++++---------------------- 1 files changed, 67 insertions(+), 48 deletions(-) CHANGESETS ---------- ChangeSet@1.2231, 2004-11-23 11:50:54+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix possible dead-lock in ipv6_create_tempaddr(). If we need to obtain lock both ifp and ifp->idev, we need to do lock idev first to avoid dead-lock. Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-23 12:23:23 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-23 12:23:23 +09:00 @@ -645,13 +645,14 @@ #ifdef CONFIG_IPV6_PRIVACY static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift) { - struct inet6_dev *idev; + struct inet6_dev *idev = ifp->idev; struct in6_addr addr, *tmpaddr; - unsigned long tmp_prefered_lft, tmp_valid_lft; + unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_cstamp, tmp_tstamp; int tmp_plen; int ret = 0; int max_addresses; + write_lock(&idev->lock); if (ift) { spin_lock_bh(&ift->lock); memcpy(&addr.s6_addr[8], &ift->addr.s6_addr[8], 8); @@ -661,40 +662,35 @@ tmpaddr = NULL; } retry: - spin_lock_bh(&ifp->lock); - in6_ifa_hold(ifp); - idev = ifp->idev; in6_dev_hold(idev); - memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); - write_lock(&idev->lock); if (idev->cnf.use_tempaddr <= 0) { write_unlock(&idev->lock); - spin_unlock_bh(&ifp->lock); printk(KERN_INFO "ipv6_create_tempaddr(): use_tempaddr is disabled.\n"); in6_dev_put(idev); - in6_ifa_put(ifp); ret = -1; goto out; } + spin_lock_bh(&ifp->lock); if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { idev->cnf.use_tempaddr = -1; /*XXX*/ - write_unlock(&idev->lock); spin_unlock_bh(&ifp->lock); + write_unlock(&idev->lock); printk(KERN_WARNING "ipv6_create_tempaddr(): regeneration time exceeded. disabled temporary address support.\n"); in6_dev_put(idev); - in6_ifa_put(ifp); ret = -1; goto out; } + in6_ifa_hold(ifp); + memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); if (__ipv6_try_regen_rndid(idev, tmpaddr) < 0) { - write_unlock(&idev->lock); spin_unlock_bh(&ifp->lock); + write_unlock(&idev->lock); printk(KERN_WARNING "ipv6_create_tempaddr(): regeneration of randomized interface id failed.\n"); - in6_dev_put(idev); in6_ifa_put(ifp); + in6_dev_put(idev); ret = -1; goto out; } @@ -707,27 +703,33 @@ idev->cnf.temp_prefered_lft - desync_factor / HZ); tmp_plen = ifp->prefix_len; max_addresses = idev->cnf.max_addresses; - write_unlock(&idev->lock); + tmp_cstamp = ifp->cstamp; + tmp_tstamp = ifp->tstamp; spin_unlock_bh(&ifp->lock); + + write_unlock(&idev->lock); ift = !max_addresses || ipv6_count_addresses(idev) < max_addresses ? ipv6_add_addr(idev, &addr, tmp_plen, ipv6_addr_type(&addr)&IPV6_ADDR_SCOPE_MASK, IFA_F_TEMPORARY) : NULL; if (!ift || IS_ERR(ift)) { - in6_dev_put(idev); in6_ifa_put(ifp); + in6_dev_put(idev); printk(KERN_INFO "ipv6_create_tempaddr(): retry temporary address regeneration.\n"); tmpaddr = &addr; + write_lock(&idev->lock); goto retry; } + spin_lock_bh(&ift->lock); ift->ifpub = ifp; ift->valid_lft = tmp_valid_lft; ift->prefered_lft = tmp_prefered_lft; - ift->cstamp = ifp->cstamp; - ift->tstamp = ifp->tstamp; + ift->cstamp = tmp_cstamp; + ift->tstamp = tmp_tstamp; spin_unlock_bh(&ift->lock); + addrconf_dad_start(ift, 0); in6_ifa_put(ift); in6_dev_put(idev); @@ -938,14 +940,12 @@ struct inet6_ifaddr * ifp; u8 hash = ipv6_addr_hash(addr); - read_lock_bh(&addrconf_hash_lock); for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) { if (ipv6_addr_equal(&ifp->addr, addr)) { if (dev == NULL || ifp->idev->dev == dev) break; } } - read_unlock_bh(&addrconf_hash_lock); return ifp != NULL; } ChangeSet@1.2232, 2004-11-23 11:52:57+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix a race when dad completed during shutting down its owner interface. Bug was noticed by Herbert Xu . Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-23 12:23:28 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-23 12:23:28 +09:00 @@ -137,6 +137,7 @@ static void addrconf_dad_timer(unsigned long data); static void addrconf_dad_completed(struct inet6_ifaddr *ifp); static void addrconf_rs_timer(unsigned long data); +static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); static void inet6_prefix_notify(int event, struct inet6_dev *idev, @@ -2049,7 +2050,7 @@ addrconf_del_timer(ifa); write_unlock_bh(&idev->lock); - ipv6_ifa_notify(RTM_DELADDR, ifa); + __ipv6_ifa_notify(RTM_DELADDR, ifa); in6_ifa_put(ifa); write_lock_bh(&idev->lock); @@ -2980,7 +2981,7 @@ .dumpit = inet6_dump_fib, }, }; -static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) +static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) { inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); @@ -3003,6 +3004,16 @@ dst_release(&ifp->rt->u.dst); break; } +} + +static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) +{ + read_lock_bh(&addrconf_lock); + if (ifp->idev->dead) + goto out; + __ipv6_ifa_notify(event, ifp); +out: + read_unlock_bh(&addrconf_lock); } #ifdef CONFIG_SYSCTL ChangeSet@1.2233, 2004-11-23 11:54:38+09:00, yoshfuji@linux-ipv6.org [IPV6] Stop DAD during shutting down the interface. Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-23 12:23:32 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-23 12:23:32 +09:00 @@ -2130,11 +2130,10 @@ */ static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags) { - struct net_device *dev; + struct inet6_dev *idev = ifp->idev; + struct net_device *dev = idev->dev; unsigned long rand_num; - dev = ifp->idev->dev; - addrconf_join_solict(dev, &ifp->addr); if (ifp->prefix_len != 128 && (ifp->flags&IFA_F_PERMANENT)) @@ -2142,31 +2141,43 @@ flags); net_srandom(ifp->addr.s6_addr32[3]); - rand_num = net_random() % (ifp->idev->cnf.rtr_solicit_delay ? : 1); + rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1); + read_lock_bh(&idev->lock); + if (ifp->dead) + goto out; spin_lock_bh(&ifp->lock); if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) || !(ifp->flags&IFA_F_TENTATIVE)) { ifp->flags &= ~IFA_F_TENTATIVE; spin_unlock_bh(&ifp->lock); + read_unlock_bh(&idev->lock); addrconf_dad_completed(ifp); return; } - ifp->probes = ifp->idev->cnf.dad_transmits; + ifp->probes = idev->cnf.dad_transmits; addrconf_mod_timer(ifp, AC_DAD, rand_num); spin_unlock_bh(&ifp->lock); +out: + read_unlock_bh(&idev->lock); } static void addrconf_dad_timer(unsigned long data) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data; + struct inet6_dev *idev = ifp->idev; struct in6_addr unspec; struct in6_addr mcaddr; + read_lock_bh(&idev->lock); + if (idev->dead) { + read_unlock_bh(&idev->lock); + goto out; + } spin_lock_bh(&ifp->lock); if (ifp->probes == 0) { /* @@ -2175,22 +2186,23 @@ ifp->flags &= ~IFA_F_TENTATIVE; spin_unlock_bh(&ifp->lock); + read_unlock_bh(&idev->lock); addrconf_dad_completed(ifp); - in6_ifa_put(ifp); - return; + goto out; } ifp->probes--; addrconf_mod_timer(ifp, AC_DAD, ifp->idev->nd_parms->retrans_time); spin_unlock_bh(&ifp->lock); + read_unlock_bh(&idev->lock); /* send a neighbour solicitation for our addr */ memset(&unspec, 0, sizeof(unspec)); addrconf_addr_solict_mult(&ifp->addr, &mcaddr); ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &unspec); - +out: in6_ifa_put(ifp); } ChangeSet@1.2234, 2004-11-23 12:16:24+09:00, yoshfuji@linux-ipv6.org [IPV6] Clean-up locking in ipv6_add_addr(). Use addrconf_hash_lock instead of private lock. Signed-off-by: Hideaki YOSHIFUJI diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-23 12:23:37 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-23 12:23:37 +09:00 @@ -487,10 +487,15 @@ struct inet6_ifaddr *ifa = NULL; struct rt6_info *rt; int hash; - static spinlock_t lock = SPIN_LOCK_UNLOCKED; int err = 0; - spin_lock_bh(&lock); + read_lock_bh(&addrconf_lock); + if (idev->dead) { + err = -ENODEV; /*XXX*/ + goto out2; + } + + write_lock(&addrconf_hash_lock); /* Ignore adding duplicate addresses on an interface */ if (ipv6_chk_same_addr(addr, idev->dev)) { @@ -524,13 +529,6 @@ ifa->flags = flags | IFA_F_TENTATIVE; ifa->cstamp = ifa->tstamp = jiffies; - read_lock(&addrconf_lock); - if (idev->dead) { - read_unlock(&addrconf_lock); - err = -ENODEV; /*XXX*/ - goto out; - } - inet6_ifa_count++; ifa->idev = idev; in6_dev_hold(idev); @@ -540,35 +538,30 @@ /* Add to big hash table */ hash = ipv6_addr_hash(addr); - write_lock_bh(&addrconf_hash_lock); ifa->lst_next = inet6_addr_lst[hash]; inet6_addr_lst[hash] = ifa; in6_ifa_hold(ifa); - write_unlock_bh(&addrconf_hash_lock); + write_unlock(&addrconf_hash_lock); - write_lock_bh(&idev->lock); + write_lock(&idev->lock); /* Add to inet6_dev unicast addr list. */ ifa->if_next = idev->addr_list; idev->addr_list = ifa; #ifdef CONFIG_IPV6_PRIVACY - ifa->regen_count = 0; if (ifa->flags&IFA_F_TEMPORARY) { ifa->tmp_next = idev->tempaddr_list; idev->tempaddr_list = ifa; in6_ifa_hold(ifa); - } else { - ifa->tmp_next = NULL; } #endif ifa->rt = rt; in6_ifa_hold(ifa); - write_unlock_bh(&idev->lock); - read_unlock(&addrconf_lock); -out: - spin_unlock_bh(&lock); + write_unlock(&idev->lock); +out2: + read_unlock_bh(&addrconf_lock); if (unlikely(err == 0)) notifier_call_chain(&inet6addr_chain, NETDEV_UP, ifa); @@ -578,6 +571,9 @@ } return ifa; +out: + write_unlock(&addrconf_hash_lock); + goto out; } /* This function wants to get referenced ifp and releases it before return */ From cranium2003@yahoo.com Mon Nov 22 22:00:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 22:00:48 -0800 (PST) Received: from web41404.mail.yahoo.com (web41404.mail.yahoo.com [66.218.93.70]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAN60fLf027745 for ; Mon, 22 Nov 2004 22:00:42 -0800 Received: (qmail 44264 invoked by uid 60001); 23 Nov 2004 06:00:17 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=vujULM1DCUgbkzhga71JdgpNL6+Tf2j9gYz08W8tdbqiObAhIXw47vl7fyQnRRV2mwhIw6j/iS0RSdDk8JVC+4eryhPj9xMw0gQJCGYFxhJCTmiwbtDAliL7dAwd55efDNr2/qp7CQqJKccqYyR+j6Zzgv19p7TqYv6yArPLBcc= ; Message-ID: <20041123060017.44262.qmail@web41404.mail.yahoo.com> Received: from [203.199.141.99] by web41404.mail.yahoo.com via HTTP; Mon, 22 Nov 2004 22:00:17 PST Date: Mon, 22 Nov 2004 22:00:17 -0800 (PST) From: cranium2003 Subject: RE: netfilter query To: stuart@ken-caryl.net Cc: Henrik Nordstrom , kernelnewbies@nl.linux.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com, linux-kernel@vger.kernel.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12132 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev hello Stuart, Thanks for the reply. Which kernel parameter for Bridge to be enabled. I have RH9 with 2.4.20-8 kernel installed and i found nearly all kernel parameters with word bridging enabled. Also i try brctl command at console prompt but no utility is present in my linux. one more thing how can i see packets to parse them? regards, cranium. --- Stuart Macdonald wrote: > Just a parallel thought here, > > A different approach is to implement the Netfilter > Bridge hooks and run a > box as a bridge. This requires a kernel parameter > for Bridge to be enabled > when the kernel is built and then the brctl utility > to setup the bridge. In > this manner, your bridge netfilter hooks always > receive packets starting at > the MAC headers. You can parse from there to derive > subsequent protocols: > IP, IPX, LLC, SNAP, NETBEUI... > > Stuart > > > > -----Original Message----- > From: kernelnewbies-bounce@nl.linux.org > [mailto:kernelnewbies-bounce@nl.linux.org]On Behalf > Of Henrik Nordstrom > Sent: Monday, November 22, 2004 5:03 AM > To: cranium2003 > Cc: kernelnewbies@nl.linux.org; netdev@oss.sgi.com; > netfilter-devel@lists.netfilter.org; > linux-kernel@vger.kernel.org > Subject: Re: netfilter query > > > On Sun, 21 Nov 2004, cranium2003 wrote: > > > Also,which headers are added when packet > > reaches to netfilter hook NF_IP_LOCAL_OUT? I found > > TCP/UDP/ICMP ,IP. Is that correct? > > Yes. > > netfilter is running at the IP layer and only > reliably have access to IP > headers and up. Lower level headers such as Ethernet > MAC header is > transport dependent and not always available, and > certainly not available > in NF_IP_LOCAL_OUT as it is not yet known the packet > will be sent to an > Ethernet. > > In some netfilter hooks it is possible to rewind > back to the Ethernet MAC > header but one must be careful to verify that it > really is an Ethernet > packet one is looking at when doing this. > Unfortunately there is no > perfect solution how to detect this.. For an example > of how one may try to > look at the Ethernet MAC header see ipt_mac.c. But > be warned that it is > possible for non-Ethernet frames to pass the simple > checks done there.. > > Regards > Henrik > > -- > Kernelnewbies: Help each other learn about the Linux > kernel. > Archive: > http://mail.nl.linux.org/kernelnewbies/ > FAQ: http://kernelnewbies.org/faq/ > > > __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com From cranium2003@yahoo.com Mon Nov 22 22:07:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 22 Nov 2004 22:07:48 -0800 (PST) Received: from web41406.mail.yahoo.com (web41406.mail.yahoo.com [66.218.93.72]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAN67ZTF028304 for ; Mon, 22 Nov 2004 22:07:35 -0800 Received: (qmail 35449 invoked by uid 60001); 23 Nov 2004 06:07:10 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=AO9FgRBLxnVdzYpHtHCgRrb+o2Ss9/N50Zg/iBhef6rOqm9bhX/cntDjir+QRHpca4Y78Ltk8rl94yQ4qhQf0VHPqbJNv+od/w5TdKlLicjR0nB61A36+AdXrvHNA3Fb4pUUgw2FrboCaW9Mn4B2SqsgjSh3hwBt8eqwdA3lg7U= ; Message-ID: <20041123060710.35447.qmail@web41406.mail.yahoo.com> Received: from [203.199.141.99] by web41406.mail.yahoo.com via HTTP; Mon, 22 Nov 2004 22:07:10 PST Date: Mon, 22 Nov 2004 22:07:10 -0800 (PST) From: cranium2003 Subject: Re: how netfilter handles fragmented packets To: Nish Aravamudan Cc: kernelnewbies@nl.linux.org, linux-kernel@vger.kernel.org, netfilter-devel@lists.netfilter.org, netdev@oss.sgi.com In-Reply-To: <29495f1d04112211554e78da67@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12133 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cranium2003@yahoo.com Precedence: bulk X-list: netdev Hello Nish, Thanks. I got it. dump_stack is implemented in trap.c file in kernel source. what i decide to use dump_stack is to do pinging to myself at one console and same time call dump_stack from user program. Is that right? But where is output displayed? Dose that help me to find out which function is called by output(skb). regards, cranium. --- Nish Aravamudan wrote: > On Sun, 21 Nov 2004 11:42:02 -0800 (PST), > cranium2003 > wrote: > > > > --- Nish Aravamudan > wrote: > > Hello Nish, > > > > > > > > > On Sun, 21 Nov 2004 17:15:12 +0100 (MET), Jan > > > Engelhardt > > > wrote: > > > > >hello, > > > > > In ip_output.c file ip_fragmet > function > > > when > > > > >create a new fragmented packet given to > > > output(skb) > > > > >function. i want to know which function are > > > actually > > > > >called by output(skb)? > > > > > > > > use stack_dump() (or was it dump_stack()?) > > > > > > dump_stack(), if you want to dump the current > > > process' stack context. > > > > > > -Nish > > > > > > > can you please tell me how can i use dump_stack() > > method? so using dump_stack i will come to know > which > > function will be called by output(skb) right? But > > where i get dump_stack()??? > > Last time i used it, I didn't need to do a darn > thing. I believe it's > part of the traps code, so you can just call > dump_stack(). > dump_stack() will throw out the trace of the current > task's stack at > the point when it is called. See what happens when > you place it in > different places. Another option, if you ever have a > hanging sytem is > Alt-SysRq-T (presuming you have the magic option > enabled and you are > able to scrollback still), which pretty much calls > dump_stack() for > all available processes. > > -Nish > > -- > Kernelnewbies: Help each other learn about the Linux > kernel. > Archive: > http://mail.nl.linux.org/kernelnewbies/ > FAQ: http://kernelnewbies.org/faq/ > > __________________________________ Do you Yahoo!? Meet the all-new My Yahoo! - Try it today! http://my.yahoo.com From kernel@kolivas.org Tue Nov 23 00:32:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 00:32:41 -0800 (PST) Received: from mail27.syd.optusnet.com.au (mail27.syd.optusnet.com.au [211.29.133.168]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAN8WSl5003785 for ; Tue, 23 Nov 2004 00:32:33 -0800 Received: from mail.kolivas.org (c210-49-199-147.lowrp1.vic.optusnet.com.au [210.49.199.147]) by mail27.syd.optusnet.com.au (8.12.11/8.12.11) with ESMTP id iAN8VaBB028152; Tue, 23 Nov 2004 19:31:43 +1100 Received: from [192.168.1.251] (pc [192.168.1.251]) by mail.kolivas.org (Postfix) with ESMTP id 02BC93F125; Tue, 23 Nov 2004 19:31:36 +1100 (EST) Message-ID: <41A2F565.6050002@kolivas.org> Date: Tue, 23 Nov 2004 19:31:33 +1100 From: Con Kolivas User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: linux Cc: Andrew Morton , Matt Mackall , netdev@oss.sgi.com, Michael Buesch Subject: [PATCH 1/1] net: Netconsole poll support for 3c509 X-Enigmail-Version: 0.86.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig5EAAA427D3226A5F397F451C" X-archive-position: 12134 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@kolivas.org Precedence: bulk X-list: netdev This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig5EAAA427D3226A5F397F451C Content-Type: multipart/mixed; boundary="------------040009050600080605070202" This is a multi-part message in MIME format. --------------040009050600080605070202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit This patch provides poll support to allow netconsole to work with 3c509 network cards. Status: Compiled, debugged and tested working by Michael Buesch. Signed-off-by: Con Kolivas --------------040009050600080605070202 Content-Type: text/x-patch; name="net_3c509_poll.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="net_3c509_poll.diff" diff -urNX /home/mb/dontdiff linux-2.6.10-rc2-mm2.orig/drivers/net/3c509.c linux-2.6.10-rc2-mm2/drivers/net/3c509.c --- linux-2.6.10-rc2-mm2.orig/drivers/net/3c509.c 2004-11-21 15:10:18.799455108 +0100 +++ linux-2.6.10-rc2-mm2/drivers/net/3c509.c 2004-11-21 15:12:01.677918665 +0100 @@ -209,6 +209,9 @@ #if defined(CONFIG_EISA) || defined(CONFIG_MCA) static int el3_device_remove (struct device *device); #endif +#ifdef CONFIG_NET_POLL_CONTROLLER +static void el3_poll_controller(struct net_device *dev); +#endif #ifdef CONFIG_EISA struct eisa_device_id el3_eisa_ids[] = { @@ -321,6 +324,9 @@ dev->set_multicast_list = &set_multicast_list; dev->tx_timeout = el3_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = el3_poll_controller; +#endif SET_ETHTOOL_OPS(dev, ðtool_ops); err = register_netdev(dev); @@ -999,6 +1005,19 @@ } +#ifdef CONFIG_NET_POLL_CONTROLLER +/* + * Polling receive - used by netconsole and other diagnostic tools + * to allow network i/o with interrupts disabled. + */ +static void el3_poll_controller(struct net_device *dev) +{ + disable_irq(dev->irq); + el3_interrupt(dev->irq, dev, NULL); + enable_irq(dev->irq); +} +#endif + static struct net_device_stats * el3_get_stats(struct net_device *dev) { --------------040009050600080605070202-- --------------enig5EAAA427D3226A5F397F451C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.6 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBovVnZUg7+tp6mRURAs36AJ9xBfYfeulNlFMbIw60M6seZc+U9wCfWpvo ubPhh3vYjUTkIAtu80U+ymQ= =pFPk -----END PGP SIGNATURE----- --------------enig5EAAA427D3226A5F397F451C-- From herbert@gondor.apana.org.au Tue Nov 23 00:43:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 00:43:39 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAN8hTru004273 for ; Tue, 23 Nov 2004 00:43:30 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWWFt-0005Rs-00; Tue, 23 Nov 2004 19:42:33 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWWFl-0000vR-00; Tue, 23 Nov 2004 19:42:25 +1100 Date: Tue, 23 Nov 2004 19:42:25 +1100 To: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041123084225.GA3514@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="DocE+STaALJfprDB" Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12135 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --DocE+STaALJfprDB Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi: I found out today that packets generated by ipt_REJECT weren't protected by IPsec. This is because the proto field isn't set at all in the flow supplied to ip_route_output_key. The following patch sets that as well as protocol-specific fields so that the appropriate IPsec policy can be applied. Signed-off-by: Herbert Xu Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --DocE+STaALJfprDB Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv4/netfilter/ipt_REJECT.c 1.32 vs edited ===== --- 1.32/net/ipv4/netfilter/ipt_REJECT.c 2004-11-14 00:41:07 +11:00 +++ edited/net/ipv4/netfilter/ipt_REJECT.c 2004-11-23 19:35:22 +11:00 @@ -38,7 +38,8 @@ #define DEBUGP(format, args...) #endif -static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) +static inline struct rtable *route_reverse(struct sk_buff *skb, + struct tcphdr *tcph, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; @@ -56,6 +57,9 @@ if (hook == NF_IP_LOCAL_IN) fl.nl_u.ip4_u.saddr = iph->daddr; fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); + fl.proto = IPPROTO_TCP; + fl.fl_ip_sport = tcph->dest; + fl.fl_ip_dport = tcph->source; if (ip_route_output_key(&rt, &fl) != 0) return NULL; @@ -110,7 +114,7 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, hook)) == NULL) + if ((rt = route_reverse(oldskb, oth, hook)) == NULL) return; hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); @@ -282,10 +286,23 @@ tos = (iph->tos & IPTOS_TOS_MASK) | IPTOS_PREC_INTERNETCONTROL; { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = skb_in->nh.iph->saddr, - .saddr = saddr, - .tos = RT_TOS(tos) } } }; + struct flowi fl = { + .nl_u = { + .ip4_u = { + .daddr = skb_in->nh.iph->saddr, + .saddr = saddr, + .tos = RT_TOS(tos) + } + }, + .proto = IPPROTO_ICMP, + .uli_u = { + .icmpt = { + .type = ICMP_DEST_UNREACH, + .code = code + } + } + }; + if (ip_route_output_key(&rt, &fl)) return; } --DocE+STaALJfprDB-- From eric@lnxi.com Tue Nov 23 00:49:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 00:49:58 -0800 (PST) Received: from ash.lnxi.com (208.177.141.226.ptr.us.xo.net [208.177.141.226]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAN8nfTv004773 for ; Tue, 23 Nov 2004 00:49:44 -0800 Received: (qmail 8212 invoked by uid 108); 23 Nov 2004 08:55:18 -0000 Received: from maxwell.lnxi.com (192.168.15.101) by ash.lnxi.com with SMTP; 23 Nov 2004 08:55:18 -0000 Received: from eric by maxwell.lnxi.com with local (Exim 3.35 #1 (Debian)) id 1CWWMO-0006bF-00; Tue, 23 Nov 2004 01:49:16 -0700 To: Christoph Hellwig Cc: Roland Dreier , netdev@oss.sgi.com, linux-kernel@vger.kernel.org, openib-general@openib.org Subject: Re: [openib-general] Re: [PATCH][RFC/v1][11/12] Add InfiniBand Documentation files References: <20041122714.taTI3zcdWo5JfuMd@topspin.com> <20041122714.AyIOvRY195EGFTaO@topspin.com> <20041122153144.GA4821@infradead.org> From: ebiederman@lnxi.com (Eric W. Biederman) Date: 23 Nov 2004 01:49:16 -0700 In-Reply-To: <20041122153144.GA4821@infradead.org> Message-ID: Lines: 24 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 12136 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ebiederman@lnxi.com Precedence: bulk X-list: netdev Christoph Hellwig writes: > > + When the IPoIB driver is loaded, it creates one interface for each > > + port using the P_Key at index 0. To create an interface with a > > + different P_Key, write the desired P_Key into the main interface's > > + /sys/class/net//create_child file. For example: > > + > > + echo 0x8001 > /sys/class/net/ib0/create_child > > + > > + This will create an interface named ib0.8001 with P_Key 0x8001. To > > + remove a subinterface, use the "delete_child" file: > > + > > + echo 0x8001 > /sys/class/net/ib0/delete_child > > + > > + The P_Key for any interface is given by the "pkey" file, and the > > + main interface for a subinterface is in "parent." > > Any reason this doesn't use an interface similar to the normal vlan code? > > And what is a P_Key? IB version of a vlan identifier. Eric From laforge@netfilter.org Tue Nov 23 01:23:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 01:23:14 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAN9N5CT005992 for ; Tue, 23 Nov 2004 01:23:06 -0800 Received: from dsl-082-083-227-131.arcor-ip.net ([82.83.227.131] helo=sunbeam.gnumonks.org) by ganesha.gnumonks.org with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CWWsm-0000FT-Vl; Tue, 23 Nov 2004 10:22:45 +0100 Received: from laforge by sunbeam.gnumonks.org with local (Exim 4.34) id 1CWWsY-0005vY-3b; Tue, 23 Nov 2004 10:22:30 +0100 Date: Tue, 23 Nov 2004 10:22:30 +0100 From: Harald Welte To: Herbert Xu Cc: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041123092229.GN19371@sunbeam.de.gnumonks.org> References: <20041123084225.GA3514@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="QWRRbczYj8mXuejp" Content-Disposition: inline In-Reply-To: <20041123084225.GA3514@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12137 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@netfilter.org Precedence: bulk X-list: netdev --QWRRbczYj8mXuejp Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Nov 23, 2004 at 07:42:25PM +1100, Herbert Xu wrote: > Hi: >=20 > I found out today that packets generated by ipt_REJECT weren't protected > by IPsec. This is because the proto field isn't set at all in the flow > supplied to ip_route_output_key. I see. I guess REJECT is actually longer in the kernel than the IPsec code, so nobody with a thorough understanding of both pieces of code did notice that it needs to change. > The following patch sets that as well as protocol-specific fields so > that the appropriate IPsec policy can be applied. The patch looks fine to me. Dave: Please apply at your convenience. > Signed-off-by: Herbert Xu Signed-off-by: Harald Welte (in case this is needed) > Cheers, --=20 - Harald Welte http://www.netfilter.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D "Fragmentation is like classful addressing -- an interesting early architectural error that shows how much experimentation was going on while IP was being designed." -- Paul Vixie --QWRRbczYj8mXuejp Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFBowFVXaXGVTD0i/8RAnzyAKCECo0DzXHYCSO27n6vdnLWBCQfPQCdGsF5 2R6NWP5cjhnJDWiOZ/gg0gQ= =TPlQ -----END PGP SIGNATURE----- --QWRRbczYj8mXuejp-- From yoshfuji@linux-ipv6.org Tue Nov 23 04:57:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 04:57:38 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANCvVoF023865 for ; Tue, 23 Nov 2004 04:57:32 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 2543A33CE5; Tue, 23 Nov 2004 21:58:30 +0900 (JST) Date: Tue, 23 Nov 2004 07:58:12 -0500 (EST) Message-Id: <20041123.075812.124823013.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: Re: [BK PATCH] [IPV6] Multiple locking fixes/improvements From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> References: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Tue_Nov_23_07:58:13_2004_869)--" Content-Transfer-Encoding: 7bit X-archive-position: 12138 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev ----Next_Part(Tue_Nov_23_07:58:13_2004_869)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit In article <20041122.223205.14979415.yoshfuji@linux-ipv6.org> (at Mon, 22 Nov 2004 22:32:05 -0500 (EST)), YOSHIFUJI Hideaki / 吉藤英明 says: > @@ -578,6 +571,9 @@ > } > > return ifa; > +out: > + write_unlock(&addrconf_hash_lock); > + goto out; > } Oops, I made a mistake during cleaning up changeset. I've fixed a typo ("goto out" should be "goto out2") in the same bk tree: Thanks. ChangeSet@1.2231, 2004-11-23 11:50:54+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix possible dead-lock in ipv6_create_tempaddr(). ChangeSet@1.2232, 2004-11-23 11:52:57+09:00, yoshfuji@linux-ipv6.org [IPV6] Fix a race when dad completed during shutting down its owner interface. ChangeSet@1.2233, 2004-11-23 11:54:38+09:00, yoshfuji@linux-ipv6.org [IPV6] Stop DAD during shutting down the interface. ChangeSet@1.2234, 2004-11-23 21:50:01+09:00, yoshfuji@linux-ipv6.org [IPV6] Clean-up locking in ipv6_add_addr(). -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA ----Next_Part(Tue_Nov_23_07:58:13_2004_869)-- Content-Type: Application/Octet-Stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="linux-2.6.10-inet6.cset.bz2" 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 ----Next_Part(Tue_Nov_23_07:58:13_2004_869)---- From kdorn@lilah.hetzel.org Tue Nov 23 05:27:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 05:27:28 -0800 (PST) Received: from lilah.hetzel.org (lilah.hetzel.org [199.250.128.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANDRHJp024971 for ; Tue, 23 Nov 2004 05:27:21 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iANEn2P2019288; Tue, 23 Nov 2004 09:49:02 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iANEn1HM019287; Tue, 23 Nov 2004 09:49:01 -0500 Date: Tue, 23 Nov 2004 09:49:01 -0500 From: Dorn Hetzel To: Dorn Hetzel Cc: Francois Romieu , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041123144901.GA19005@lilah.hetzel.org> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122181307.GA3625@lilah.hetzel.org> User-Agent: Mutt/1.4i X-archive-position: 12139 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev > On Sat, Nov 20, 2004 at 01:29:46AM +0100, Francois Romieu wrote: > > > Once you have applied one of the patch above, the patch below will improve > > your "transmit timed out" (please apply in order and enable NAPI): > > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-250.patch > > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-255.patch > > > > If things perform better you may want to use bigger frames and apply as > > well r8169-260.patch and r8169-265.patch. > > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-260.patch > > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.10-rc2-mm1/r8169-265.patch > > > Stacked on these 4 patches and things seem much better :) This is on an Abit AA8 Duramax motherboard. -Dorn From hadi@cyberus.ca Tue Nov 23 05:40:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 05:40:05 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANDe1nD025609 for ; Tue, 23 Nov 2004 05:40:01 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CWatO-0001mn-Cm for netdev@oss.sgi.com; Tue, 23 Nov 2004 08:39:38 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CWatM-0004GF-L9; Tue, 23 Nov 2004 08:39:36 -0500 Subject: Re: [PATCH 2.6 PKT_SCHED]: Fix overflow on 64bit in times reported to userspace by tc actions From: jamal Reply-To: hadi@cyberus.ca To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <41A240B5.5070404@trash.net> References: <41908D1D.50405@trash.net> <20041111150314.576ce699.davem@davemloft.net> <1101059233.1093.151.camel@jzny.localdomain> <41A1C99B.6010202@trash.net> <1101129873.1093.300.camel@jzny.localdomain> <41A240B5.5070404@trash.net> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101217174.1133.218.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 23 Nov 2004 08:39:34 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12140 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-11-22 at 14:40, Patrick McHardy wrote: > Attached, description from the original mail: > ok, this is the one i was refering to. I still havent done extensive tests but initial ones are all fine. Dave please apply it. cheers, jamal From lqin@sce.carleton.ca Tue Nov 23 07:35:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 07:35:23 -0800 (PST) Received: from sangam.sce.carleton.ca (sangam.sce.carleton.ca [134.117.4.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANFZAOq029879 for ; Tue, 23 Nov 2004 07:35:16 -0800 Received: from [134.117.61.112] (wmc-13.sce.carleton.ca [134.117.61.112]) by sangam.sce.carleton.ca (8.12.11/8.12.11) with ESMTP id iANFYlFT012539 for ; Tue, 23 Nov 2004 10:34:48 -0500 Message-ID: <41A358E2.8090909@sce.carleton.ca> Date: Tue, 23 Nov 2004 10:36:02 -0500 From: Liang Qin User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: cannot always delete IPv6 route entry in Fedora core 2 and Core 3 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12141 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lqin@sce.carleton.ca Precedence: bulk X-list: netdev Hi there, I'm a Ph. D student at Carleton University, Canada. I've developing routing protocols on Linux. Recently when I move code from redhat 9.0 to Fedora Core 2 and 3, I found out sometimes the IPv6 route entry added previously cannot be deleted successfully. Finally I traced down to the system call to the kernel and did the following experiments: [root@localhost lqin]# route -A inet6 Kernel IPv6 routing table Destination Next Hop Flags Metric Ref Use Iface ::1/128 * U 0 310 0 lo fe80::206:25ff:fea9:b1f9/128 * U 0 0 0 lo fe80::/64 * U 256 0 0 eth1 fec0::/128 fec0:: UC 0 18 0 eth1 fec0::206:25ff:fea9:b1f9/128 * U 0 21 0 lo fec0::/64 * U 256 0 0 eth1 ff00::/128 ff00:: UC 0 15 0 eth1 ff00::/8 * U 256 0 0 eth1 */0 * UD 256 0 0 eth1 */0 * U 1024 0 0 eth1 [root@localhost lqin]# ip -6 route add fec0::206:25ff:fea9:b1fd/128 dev eth1 [root@localhost lqin]# netstat --inet6 -rn Kernel IPv6 routing table Destination Next Hop Flags Metric Ref Use Iface ::1/128 :: U 0 343 0 lo fe80::206:25ff:fea9:b1f9/128 :: U 0 0 0 lo fe80::/64 :: U 256 0 0 eth1 fec0::206:25ff:fea9:b1f9/128 :: U 0 24 0 lo fec0::206:25ff:fea9:b1fd/128 :: U 1024 0 0 eth1 fec0::/64 :: U 256 0 0 eth1 ff00::/8 :: U 256 0 0 eth1 fec0::/64 :: U 256 0 0 eth1 ff00::/8 :: U 256 0 0 eth1 ::/0 :: UD 256 0 0 eth1 ::/0 :: U 1024 0 0 eth1 ::/0 :: U 1024 0 0 eth1 [root@localhost lqin]# ip -6 route del fec0::206:25ff:fea9:b1fd/128 dev eth1 [root@localhost lqin]# netstat --inet6 -rn Kernel IPv6 routing table Destination Next Hop Flags Metric Ref Use Iface ::1/128 :: U 0 391 0 lo fe80::206:25ff:fea9:b1f9/128 :: U 0 0 0 lo fe80::/64 :: U 256 0 0 eth1 fec0::/128 fec0:: UC 0 6 0 eth1 fec0::206:25ff:fea9:b1f9/128 :: U 0 27 0 lo fec0::206:25ff:fea9:b1fd/128 :: U 1024 0 0 eth1 fec0::/64 :: U 256 0 0 eth1 fec0::/64 :: U 256 0 0 eth1 ff00::/128 ff00:: UC 0 6 0 eth1 ff00::/8 :: U 256 0 0 eth1 ::/0 :: UD 256 0 0 eth1 ::/0 :: U 1024 0 0 eth1 It will be successfully if I use command twice in very short time (ine 1 or 2 seconds) ip -6 route del fec0::206:25ff:fea9:b1fd/128 dev eth1 Here eth1 is a wireless interface I tested on two Dell tops with Fedora core 2 and 3 with the same problem, but on redhat 9.0, there is no such problem at all (even with the routing protocol which I work on). Thanks in advance! Liang Qin Ottawa, Canada From roland@topspin.com Tue Nov 23 08:16:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 08:16:32 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANGGNV2031056 for ; Tue, 23 Nov 2004 08:16:24 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:16:03 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:16:03 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWdKf-0005oL-JB; Tue, 23 Nov 2004 08:16:03 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041123815.3UphmLcWp4RG6D85@topspin.com> X-Mailer: Roland's Patchbomber Date: Tue, 23 Nov 2004 08:15:57 -0800 Message-Id: <20041123815.OuqXEOqXJtDtY180@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v2][16/21] IPoIB IPv6 support Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 23 Nov 2004 16:16:03.0396 (UTC) FILETIME=[BA875040:01C4D177] X-archive-position: 12143 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add ipv6_ib_mc_map() to convert IPv6 multicast addresses to IPoIB hardware addresses, and add support for autoconfiguration for devices with type ARPHRD_INFINIBAND. The mapping for multicast addresses is described in http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Nitin Hande Signed-off-by: Roland Dreier --- linux-bk.orig/include/net/if_inet6.h 2004-11-23 08:09:55.180272973 -0800 +++ linux-bk/include/net/if_inet6.h 2004-11-23 08:10:22.300274203 -0800 @@ -266,5 +266,20 @@ { buf[0] = 0x00; } + +static inline void ipv6_ib_mc_map(struct in6_addr *addr, char *buf) +{ + buf[0] = 0; /* Reserved */ + buf[1] = 0xff; /* Multicast QPN */ + buf[2] = 0xff; + buf[3] = 0xff; + buf[4] = 0xff; + buf[5] = 0x12; /* link local scope */ + buf[6] = 0x60; /* IPv6 signature */ + buf[7] = 0x1b; + buf[8] = 0; /* P_Key */ + buf[9] = 0; + memcpy(buf + 10, addr->s6_addr + 6, 10); +} #endif #endif --- linux-bk.orig/net/ipv6/addrconf.c 2004-11-23 08:09:54.776332532 -0800 +++ linux-bk/net/ipv6/addrconf.c 2004-11-23 08:10:22.302273908 -0800 @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -1098,6 +1099,12 @@ memset(eui, 0, 7); eui[7] = *(u8*)dev->dev_addr; return 0; + case ARPHRD_INFINIBAND: + if (dev->addr_len != INFINIBAND_ALEN) + return -1; + memcpy(eui, dev->dev_addr + 12, 8); + eui[0] |= 2; + return 0; } return -1; } @@ -1797,6 +1804,7 @@ if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_FDDI) && (dev->type != ARPHRD_IEEE802_TR) && + (dev->type != ARPHRD_INFINIBAND) && (dev->type != ARPHRD_ARCNET)) { /* Alas, we support only Ethernet autoconfiguration. */ return; --- linux-bk.orig/net/ipv6/ndisc.c 2004-11-23 08:09:38.159782567 -0800 +++ linux-bk/net/ipv6/ndisc.c 2004-11-23 08:10:22.302273908 -0800 @@ -260,6 +260,9 @@ case ARPHRD_ARCNET: ipv6_arcnet_mc_map(addr, buf); return 0; + case ARPHRD_INFINIBAND: + ipv6_ib_mc_map(addr, buf); + return 0; default: if (dir) { memcpy(buf, dev->broadcast, dev->addr_len); From roland@topspin.com Tue Nov 23 08:16:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 08:16:31 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANGGNV0031056 for ; Tue, 23 Nov 2004 08:16:24 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:15:57 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:15:57 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWdKa-0005o6-Ap; Tue, 23 Nov 2004 08:15:57 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041123815.Irsm0l3oz7MStqls@topspin.com> X-Mailer: Roland's Patchbomber Date: Tue, 23 Nov 2004 08:15:52 -0800 Message-Id: <20041123815.3UphmLcWp4RG6D85@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v2][15/21] IPoIB IPv4 multicast Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 23 Nov 2004 16:15:57.0630 (UTC) FILETIME=[B7177DE0:01C4D177] X-archive-position: 12142 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add ip_ib_mc_map() to convert IPv4 multicast addresses to IPoIB hardware addresses. Also add so INFINIBAND_ALEN has a home. The mapping for multicast addresses is described in http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Roland Dreier --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/include/linux/if_infiniband.h 2004-11-23 08:10:22.004317841 -0800 @@ -0,0 +1,29 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id$ + */ + +#ifndef _LINUX_IF_INFINIBAND_H +#define _LINUX_IF_INFINIBAND_H + +#define INFINIBAND_ALEN 20 /* Octets in IPoIB HW addr */ + +#endif /* _LINUX_IF_INFINIBAND_H */ --- linux-bk.orig/include/net/ip.h 2004-11-23 08:09:44.620829918 -0800 +++ linux-bk/include/net/ip.h 2004-11-23 08:10:22.005317694 -0800 @@ -229,6 +229,39 @@ buf[3]=addr&0x7F; } +/* + * Map a multicast IP onto multicast MAC for type IP-over-InfiniBand. + * Leave P_Key as 0 to be filled in by driver. + */ + +static inline void ip_ib_mc_map(u32 addr, char *buf) +{ + buf[0] = 0; /* Reserved */ + buf[1] = 0xff; /* Multicast QPN */ + buf[2] = 0xff; + buf[3] = 0xff; + addr = ntohl(addr); + buf[4] = 0xff; + buf[5] = 0x12; /* link local scope */ + buf[6] = 0x40; /* IPv4 signature */ + buf[7] = 0x1b; + buf[8] = 0; /* P_Key */ + buf[9] = 0; + buf[10] = 0; + buf[11] = 0; + buf[12] = 0; + buf[13] = 0; + buf[14] = 0; + buf[15] = 0; + buf[19] = addr & 0xff; + addr >>= 8; + buf[18] = addr & 0xff; + addr >>= 8; + buf[17] = addr & 0xff; + addr >>= 8; + buf[16] = addr & 0x0f; +} + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #include #endif --- linux-bk.orig/net/ipv4/arp.c 2004-11-23 08:09:54.024443395 -0800 +++ linux-bk/net/ipv4/arp.c 2004-11-23 08:10:22.005317694 -0800 @@ -213,6 +213,9 @@ case ARPHRD_IEEE802_TR: ip_tr_mc_map(addr, haddr); return 0; + case ARPHRD_INFINIBAND: + ip_ib_mc_map(addr, haddr); + return 0; default: if (dir) { memcpy(haddr, dev->broadcast, dev->addr_len); From roland@topspin.com Tue Nov 23 08:16:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 08:16:43 -0800 (PST) Received: from umhlanga.STRATNET.NET (umhlanga.stratnet.net [12.162.17.40]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANGGTx7031079 for ; Tue, 23 Nov 2004 08:16:29 -0800 Received: from exch-1.topspincom.com ([12.162.17.3]) by umhlanga.STRATNET.NET with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:16:10 -0800 Received: from eddore ([10.10.253.169]) by exch-1.topspincom.com with Microsoft SMTPSVC(5.0.2195.5329); Tue, 23 Nov 2004 08:16:09 -0800 Received: from localhost ([127.0.0.1] helo=eddore) by eddore with smtp (Exim 4.34) id 1CWdKl-0005oa-BD; Tue, 23 Nov 2004 08:16:09 -0800 Cc: openib-general@openib.org, netdev@oss.sgi.com In-Reply-To: <20041123815.OuqXEOqXJtDtY180@topspin.com> X-Mailer: Roland's Patchbomber Date: Tue, 23 Nov 2004 08:16:03 -0800 Message-Id: <20041123816.7BdwvFRYhI45pb9i@topspin.com> Mime-Version: 1.0 To: linux-kernel@vger.kernel.org From: Roland Dreier X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: roland@topspin.com Subject: [PATCH][RFC/v2][17/21] Add IPoIB (IP-over-InfiniBand) driver Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SA-Exim-Version: 4.1 (built Tue, 17 Aug 2004 11:06:07 +0200) X-SA-Exim-Scanned: Yes (on eddore) X-OriginalArrivalTime: 23 Nov 2004 16:16:09.0990 (UTC) FILETIME=[BE757A60:01C4D177] X-archive-position: 12144 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: roland@topspin.com Precedence: bulk X-list: netdev Add a driver that implements the (IPoIB) IP-over-InfiniBand protocol. This is a network device driver of type ARPHRD_INFINIBAND (and addr_len INFINIBAND_ALEN bytes). The ARP/ND implementation for this driver is not completely straightforward, because InfiniBand requires an additional path lookup be performed (through an IB-specific mechanism) after a remote hardware address has been resolved. We are very open to suggestions of a better way to handle this than the current implementation. Although IB has a special multicast group join mode intended to support IP multicast routing (non member join), no means to identify different multicast styles has yet been determined, so all joins by the driver are currently full member joins. We are looking for guidance in how to solve this. The IPoIB protocol/encapsulation is described in the Internet-Drafts http://www.ietf.org/internet-drafts/draft-ietf-ipoib-architecture-04.txt http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt Signed-off-by: Roland Dreier --- linux-bk.orig/drivers/infiniband/Kconfig 2004-11-23 08:10:19.036755403 -0800 +++ linux-bk/drivers/infiniband/Kconfig 2004-11-23 08:10:22.620227027 -0800 @@ -10,4 +10,6 @@ source "drivers/infiniband/hw/mthca/Kconfig" +source "drivers/infiniband/ulp/ipoib/Kconfig" + endmenu --- linux-bk.orig/drivers/infiniband/Makefile 2004-11-23 08:10:18.998761005 -0800 +++ linux-bk/drivers/infiniband/Makefile 2004-11-23 08:10:22.583232481 -0800 @@ -1,2 +1,3 @@ obj-$(CONFIG_INFINIBAND) += core/ obj-$(CONFIG_INFINIBAND_MTHCA) += hw/mthca/ +obj-$(CONFIG_INFINIBAND_IPOIB) += ulp/ipoib/ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/Kconfig 2004-11-23 08:10:22.719212431 -0800 @@ -0,0 +1,33 @@ +config INFINIBAND_IPOIB + tristate "IP-over-InfiniBand" + depends on INFINIBAND && NETDEVICES && INET + ---help--- + Support for the IP-over-InfiniBand protocol (IPoIB). This + transports IP packets over InfiniBand so you can use your IB + device as a fancy NIC. + + The IPoIB protocol is defined by the IETF ipoib working + group: . + +config INFINIBAND_IPOIB_DEBUG + bool "IP-over-InfiniBand debugging" + depends on INFINIBAND_IPOIB + ---help--- + This option causes debugging code to be compiled into the + IPoIB driver. The output can be turned on via the + debug_level and mcast_debug_level module parameters (which + can also be set after the driver is loaded through sysfs). + + This option also creates an "ipoib_debugfs," which can be + mounted to expose debugging information about IB multicast + groups used by the IPoIB driver. + +config INFINIBAND_IPOIB_DEBUG_DATA + bool "IP-over-InfiniBand data path debugging" + depends on INFINIBAND_IPOIB_DEBUG + ---help--- + This option compiles debugging code into the the data path + of the IPoIB driver. The output can be turned on by setting + the debug_level parameter to 2; however, even with output + turned off, this debugging code will have some performance + impact. --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/Makefile 2004-11-23 08:10:22.683217739 -0800 @@ -0,0 +1,11 @@ +EXTRA_CFLAGS += -Idrivers/infiniband/include + +obj-$(CONFIG_INFINIBAND_IPOIB) += ib_ipoib.o + +ib_ipoib-y := ipoib_main.o \ + ipoib_ib.o \ + ipoib_multicast.o \ + ipoib_verbs.o \ + ipoib_vlan.o +ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_DEBUG) += ipoib_fs.o + --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib.h 2004-11-23 08:10:22.764205797 -0800 @@ -0,0 +1,314 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib.h 1275 2004-11-22 23:04:04Z roland $ + */ + +#ifndef _IPOIB_H +#define _IPOIB_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include "ipoib_proto.h" + +/* constants */ + +enum { + IPOIB_PACKET_SIZE = 2048, + IPOIB_BUF_SIZE = IPOIB_PACKET_SIZE + IB_GRH_BYTES, + + IPOIB_ENCAP_LEN = 4, + + IPOIB_RX_RING_SIZE = 128, + IPOIB_TX_RING_SIZE = 64, + + IPOIB_NUM_WC = 4, + + IPOIB_MAX_PATH_REC_QUEUE = 3, + IPOIB_MAX_MCAST_QUEUE = 3, + + IPOIB_FLAG_TX_FULL = 0, + IPOIB_FLAG_OPER_UP = 1, + IPOIB_FLAG_ADMIN_UP = 2, + IPOIB_PKEY_ASSIGNED = 3, + IPOIB_PKEY_STOP = 4, + IPOIB_FLAG_SUBINTERFACE = 5, + IPOIB_MCAST_RUN = 6, + IPOIB_STOP_REAPER = 7, + + IPOIB_MAX_BACKOFF_SECONDS = 16, + + IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ + IPOIB_MCAST_FLAG_SENDONLY = 1, + IPOIB_MCAST_FLAG_BUSY = 2, /* joining or already joined */ + IPOIB_MCAST_FLAG_ATTACHED = 3, +}; + +/* structs */ + +struct ipoib_header { + u16 proto; + u16 reserved; +}; + +struct ipoib_pseudoheader { + u8 hwaddr[INFINIBAND_ALEN]; +}; + +struct ipoib_mcast; + +struct ipoib_buf { + struct sk_buff *skb; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +struct ipoib_dev_priv { + spinlock_t lock; + + struct net_device *dev; + + unsigned long flags; + + struct semaphore mcast_mutex; + struct semaphore vlan_mutex; + + struct ipoib_mcast *broadcast; + struct list_head multicast_list; + struct rb_root multicast_tree; + + struct work_struct pkey_task; + struct work_struct mcast_task; + struct work_struct flush_task; + struct work_struct restart_task; + struct work_struct ah_reap_task; + + struct ib_device *ca; + u8 port; + u16 pkey; + struct ib_pd *pd; + struct ib_mr *mr; + struct ib_cq *cq; + struct ib_qp *qp; + u32 qkey; + + union ib_gid local_gid; + u16 local_lid; + + unsigned int admin_mtu; + unsigned int mcast_mtu; + + struct ipoib_buf *rx_ring; + + struct ipoib_buf *tx_ring; + unsigned tx_head; + unsigned tx_tail; + + struct ib_wc ibwc[IPOIB_NUM_WC]; + + struct list_head dead_ahs; + + struct ib_event_handler event_handler; + + struct net_device_stats stats; + + struct net_device *parent; + struct list_head child_intfs; + struct list_head list; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG + struct list_head fs_list; + struct dentry *mcg_dentry; +#endif +}; + +struct ipoib_ah { + struct net_device *dev; + struct ib_ah *ah; + struct list_head list; + struct kref ref; + unsigned last_send; +}; + +struct ipoib_path { + struct ipoib_ah *ah; + struct sk_buff_head queue; + + struct net_device *dev; + struct neighbour *neighbour; +}; + +static inline struct ipoib_path **to_ipoib_path(struct neighbour *neigh) +{ + return (struct ipoib_path **) (neigh->ha + 24); +} + +extern struct workqueue_struct *ipoib_workqueue; + +/* functions */ + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr); +void ipoib_free_ah(struct kref *kref); +static inline void ipoib_put_ah(struct ipoib_ah *ah) +{ + kref_put(&ah->ref, ipoib_free_ah); +} + +int ipoib_add_pkey_attr(struct net_device *dev); + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn); +void ipoib_reap_ah(void *dev_ptr); + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *format); + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_ib_dev_flush(void *dev); +void ipoib_ib_dev_cleanup(struct net_device *dev); + +int ipoib_ib_dev_open(struct net_device *dev); +int ipoib_ib_dev_up(struct net_device *dev); +int ipoib_ib_dev_down(struct net_device *dev); +int ipoib_ib_dev_stop(struct net_device *dev); + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); +void ipoib_dev_cleanup(struct net_device *dev); + +void ipoib_mcast_join_task(void *dev_ptr); +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb); + +void ipoib_mcast_restart_task(void *dev_ptr); +int ipoib_mcast_start_thread(struct net_device *dev); +int ipoib_mcast_stop_thread(struct net_device *dev); + +void ipoib_mcast_dev_down(struct net_device *dev); +void ipoib_mcast_dev_flush(struct net_device *dev); + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter); +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *gid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only); + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, + union ib_gid *mgid); + +int ipoib_qp_create(struct net_device *dev); +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca); +void ipoib_transport_dev_cleanup(struct net_device *dev); + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey); +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey); + +void ipoib_pkey_poll(void *dev); +int ipoib_pkey_dev_delay_open(struct net_device *dev); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int ipoib_create_debug_file(struct net_device *dev); +void ipoib_delete_debug_file(struct net_device *dev); +int ipoib_register_debugfs(void); +void ipoib_unregister_debugfs(void); +#else +static inline int ipoib_create_debug_file(struct net_device *dev) { return 0; } +static inline void ipoib_delete_debug_file(struct net_device *dev) { } +static inline int ipoib_register_debugfs(void) { return 0; } +static inline void ipoib_unregister_debugfs(void) { } +#endif + + +#define ipoib_printk(level, priv, format, arg...) \ + printk(level "%s: " format, ((struct ipoib_dev_priv *) priv)->dev->name , ## arg) +#define ipoib_warn(priv, format, arg...) \ + ipoib_printk(KERN_WARNING, priv, format , ## arg) + + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +extern int debug_level; +extern int mcast_debug_level; + +#define ipoib_dbg(priv, format, arg...) \ + do { \ + if (debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { \ + if (mcast_debug_level > 0) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG */ +#define ipoib_dbg(priv, format, arg...) \ + do { (void) (priv); } while (0) +#define ipoib_dbg_mcast(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG */ + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define ipoib_dbg_data(priv, format, arg...) \ + do { \ + if (debug_level > 1) \ + ipoib_printk(KERN_DEBUG, priv, format , ## arg); \ + } while (0) +#else /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ +#define ipoib_dbg_data(priv, format, arg...) \ + do { (void) (priv); } while (0) +#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */ + + +#define IPOIB_GID_FMT "%x:%x:%x:%x:%x:%x:%x:%x" + +#define IPOIB_GID_ARG(gid) be16_to_cpup((__be16 *) ((gid).raw + 0)), \ + be16_to_cpup((__be16 *) ((gid).raw + 2)), \ + be16_to_cpup((__be16 *) ((gid).raw + 4)), \ + be16_to_cpup((__be16 *) ((gid).raw + 6)), \ + be16_to_cpup((__be16 *) ((gid).raw + 8)), \ + be16_to_cpup((__be16 *) ((gid).raw + 10)), \ + be16_to_cpup((__be16 *) ((gid).raw + 12)), \ + be16_to_cpup((__be16 *) ((gid).raw + 14)) + +#endif /* _IPOIB_H */ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2004-11-23 08:10:22.816198131 -0800 @@ -0,0 +1,276 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id$ + */ + +#include +#include + +#include "ipoib.h" + +enum { + IPOIB_MAGIC = 0x49504942 /* "IPIB" */ +}; + +static DECLARE_MUTEX(ipoib_fs_mutex); +static struct dentry *ipoib_root; +static struct super_block *ipoib_sb; +static LIST_HEAD(ipoib_device_list); + +static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos) +{ + struct ipoib_mcast_iter *iter; + loff_t n = *pos; + + iter = ipoib_mcast_iter_init(file->private); + if (!iter) + return NULL; + + while (n--) { + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + } + + return iter; +} + +static void *ipoib_mcg_seq_next(struct seq_file *file, void *iter_ptr, + loff_t *pos) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + + (*pos)++; + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +static void ipoib_mcg_seq_stop(struct seq_file *file, void *iter_ptr) +{ + /* nothing for now */ +} + +static int ipoib_mcg_seq_show(struct seq_file *file, void *iter_ptr) +{ + struct ipoib_mcast_iter *iter = iter_ptr; + char gid_buf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"]; + union ib_gid mgid; + int i, n; + unsigned long created; + unsigned int queuelen, complete, send_only; + + if (iter) { + ipoib_mcast_iter_read(iter, &mgid, &created, &queuelen, + &complete, &send_only); + + for (n = 0, i = 0; i < sizeof mgid / 2; ++i) { + n += sprintf(gid_buf + n, "%x", + be16_to_cpu(((u16 *)mgid.raw)[i])); + if (i < sizeof mgid / 2 - 1) + gid_buf[n++] = ':'; + } + } + + seq_printf(file, "GID: %*s", -(1 + (int) sizeof gid_buf), gid_buf); + + seq_printf(file, + " created: %10ld queuelen: %4d complete: %d send_only: %d\n", + created, queuelen, complete, send_only); + + return 0; +} + +static struct seq_operations ipoib_seq_ops = { + .start = ipoib_mcg_seq_start, + .next = ipoib_mcg_seq_next, + .stop = ipoib_mcg_seq_stop, + .show = ipoib_mcg_seq_show, +}; + +static int ipoib_mcg_open(struct inode *inode, struct file *file) +{ + struct seq_file *seq; + int ret; + + ret = seq_open(file, &ipoib_seq_ops); + if (ret) + return ret; + + seq = file->private_data; + seq->private = inode->u.generic_ip; + + return 0; +} + +static struct file_operations ipoib_fops = { + .owner = THIS_MODULE, + .open = ipoib_mcg_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +static struct inode *ipoib_get_inode(void) +{ + struct inode *inode = new_inode(ipoib_sb); + + if (inode) { + inode->i_mode = S_IFREG | S_IRUGO; + inode->i_uid = 0; + inode->i_gid = 0; + inode->i_blksize = PAGE_CACHE_SIZE; + inode->i_blocks = 0; + inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; + inode->i_fop = &ipoib_fops; + } + + return inode; +} + +static int __ipoib_create_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dentry *dentry; + struct inode *inode; + char name[IFNAMSIZ + sizeof "_mcg"]; + + snprintf(name, sizeof name, "%s_mcg", dev->name); + + dentry = d_alloc_name(ipoib_root, name); + if (!dentry) + return -ENOMEM; + + inode = ipoib_get_inode(); + if (!inode) { + dput(dentry); + return -ENOMEM; + } + + inode->u.generic_ip = dev; + priv->mcg_dentry = dentry; + + d_add(dentry, inode); + + return 0; +} + +int ipoib_create_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + down(&ipoib_fs_mutex); + + list_add_tail(&priv->fs_list, &ipoib_device_list); + + if (!ipoib_sb) { + up(&ipoib_fs_mutex); + return 0; + } + + up(&ipoib_fs_mutex); + + return __ipoib_create_debug_file(dev); +} + +void ipoib_delete_debug_file(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + down(&ipoib_fs_mutex); + list_del(&priv->fs_list); + if (!ipoib_sb) { + up(&ipoib_fs_mutex); + return; + } + up(&ipoib_fs_mutex); + + if (priv->mcg_dentry) { + d_drop(priv->mcg_dentry); + simple_unlink(ipoib_root->d_inode, priv->mcg_dentry); + } +} + +static int ipoib_fill_super(struct super_block *sb, void *data, int silent) +{ + static struct tree_descr ipoib_files[] = { + { "" } + }; + struct ipoib_dev_priv *priv; + int ret; + + ret = simple_fill_super(sb, IPOIB_MAGIC, ipoib_files); + if (ret) + return ret; + + ipoib_root = sb->s_root; + + down(&ipoib_fs_mutex); + + ipoib_sb = sb; + + list_for_each_entry(priv, &ipoib_device_list, fs_list) { + ret = __ipoib_create_debug_file(priv->dev); + if (ret) + break; + } + + up(&ipoib_fs_mutex); + + return ret; +} + +static struct super_block *ipoib_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) +{ + return get_sb_single(fs_type, flags, data, ipoib_fill_super); +} + +static void ipoib_kill_sb(struct super_block *sb) +{ + down(&ipoib_fs_mutex); + ipoib_sb = NULL; + up(&ipoib_fs_mutex); + + kill_litter_super(sb); +} + +static struct file_system_type ipoib_fs_type = { + .owner = THIS_MODULE, + .name = "ipoib_debugfs", + .get_sb = ipoib_get_sb, + .kill_sb = ipoib_kill_sb, +}; + +int ipoib_register_debugfs(void) +{ + return register_filesystem(&ipoib_fs_type); +} + +void ipoib_unregister_debugfs(void) +{ + unregister_filesystem(&ipoib_fs_type); +} --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2004-11-23 08:10:22.857192086 -0800 @@ -0,0 +1,626 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_ib.c 1267 2004-11-18 20:31:22Z roland $ + */ + +#include + +#include + +#include "ipoib.h" + +#define IPOIB_OP_RECV (1ul << 31) + +static DECLARE_MUTEX(pkey_sem); + +struct ipoib_ah *ipoib_create_ah(struct net_device *dev, + struct ib_pd *pd, struct ib_ah_attr *attr) +{ + struct ipoib_ah *ah; + + ah = kmalloc(sizeof *ah, GFP_KERNEL); + if (!ah) + return NULL; + + ah->dev = dev; + ah->last_send = 0; + kref_init(&ah->ref); + + ah->ah = ib_create_ah(pd, attr); + if (IS_ERR(ah->ah)) { + kfree(ah); + ah = NULL; + } else + ipoib_dbg(netdev_priv(dev), "Created ah %p\n", ah->ah); + + return ah; +} + +void ipoib_free_ah(struct kref *kref) +{ + struct ipoib_ah *ah = container_of(kref, struct ipoib_ah, ref); + struct ipoib_dev_priv *priv = netdev_priv(ah->dev); + + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + if (ah->last_send <= priv->tx_tail) { + ipoib_dbg(priv, "Freeing ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } else + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static inline int ipoib_ib_receive(struct ipoib_dev_priv *priv, + unsigned int wr_id, + dma_addr_t addr) +{ + struct ib_sge list = { + .addr = addr, + .length = IPOIB_BUF_SIZE, + .lkey = priv->mr->lkey, + }; + struct ib_recv_wr param = { + .wr_id = wr_id | IPOIB_OP_RECV, + .sg_list = &list, + .num_sge = 1, + .recv_flags = IB_RECV_SIGNALED + }; + struct ib_recv_wr *bad_wr; + + return ib_post_recv(priv->qp, ¶m, &bad_wr); +} + +static int ipoib_ib_post_receive(struct net_device *dev, int id) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *skb; + dma_addr_t addr; + int ret; + + skb = dev_alloc_skb(IPOIB_BUF_SIZE + 4); + if (!skb) { + ipoib_warn(priv, "failed to allocate receive buffer\n"); + + priv->rx_ring[id].skb = NULL; + return -ENOMEM; + } + skb_reserve(skb, 4); /* 16 byte align IP header */ + priv->rx_ring[id].skb = skb; + addr = dma_map_single(priv->ca->dma_device, + skb->data, IPOIB_BUF_SIZE, + DMA_FROM_DEVICE); + pci_unmap_addr_set(&priv->rx_ring[id], mapping, addr); + + ret = ipoib_ib_receive(priv, id, addr); + if (ret) { + ipoib_warn(priv, "ipoib_ib_receive failed for buf %d (%d)\n", + id, ret); + priv->rx_ring[id].skb = NULL; + } + + return ret; +} + +static int ipoib_ib_post_receives(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) { + if (ipoib_ib_post_receive(dev, i)) { + ipoib_warn(priv, "ipoib_ib_post_receive failed for buf %d\n", i); + return -EIO; + } + } + + return 0; +} + +static void ipoib_ib_handle_wc(struct net_device *dev, + struct ib_wc *wc) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned int wr_id = wc->wr_id; + + ipoib_dbg_data(priv, "called: id %d, op %d, status: %d\n", + wr_id, wc->opcode, wc->status); + + if (wr_id & IPOIB_OP_RECV) { + wr_id &= ~IPOIB_OP_RECV; + + if (wr_id < IPOIB_RX_RING_SIZE) { + struct sk_buff *skb = priv->rx_ring[wr_id].skb; + + priv->rx_ring[wr_id].skb = NULL; + + dma_unmap_single(priv->ca->dma_device, + pci_unmap_addr(&priv->rx_ring[wr_id], + mapping), + IPOIB_BUF_SIZE, + DMA_FROM_DEVICE); + + if (wc->status != IB_WC_SUCCESS) { + if (wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed recv event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + dev_kfree_skb_any(skb); + return; + } + + ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n", + wc->byte_len, wc->slid); + + skb_put(skb, wc->byte_len); + skb_pull(skb, IB_GRH_BYTES); + + if (wc->slid != priv->local_lid || + wc->src_qp != priv->qp->qp_num) { + skb->protocol = ((struct ipoib_header *) skb->data)->proto; + + skb_pull(skb, IPOIB_ENCAP_LEN); + + dev->last_rx = jiffies; + ++priv->stats.rx_packets; + priv->stats.rx_bytes += skb->len; + + skb->dev = dev; + /* XXX get correct PACKET_ type here */ + skb->pkt_type = PACKET_HOST; + netif_rx_ni(skb); + } else { + ipoib_dbg_data(priv, "dropping loopback packet\n"); + dev_kfree_skb_any(skb); + } + + /* repost receive */ + if (ipoib_ib_post_receive(dev, wr_id)) + ipoib_warn(priv, "ipoib_ib_post_receive failed " + "for buf %d\n", wr_id); + } else + ipoib_warn(priv, "completion event with wrid %d\n", + wr_id); + + } else { + struct ipoib_buf *tx_req; + unsigned long flags; + + if (wr_id >= IPOIB_TX_RING_SIZE) { + ipoib_warn(priv, "completion event with wrid %d (> %d)\n", + wr_id, IPOIB_TX_RING_SIZE); + return; + } + + ipoib_dbg_data(priv, "send complete, wrid %d\n", wr_id); + + tx_req = &priv->tx_ring[wr_id]; + + dma_unmap_single(priv->ca->dma_device, + pci_unmap_addr(tx_req, mapping), + tx_req->skb->len, + DMA_TO_DEVICE); + + ++priv->stats.tx_packets; + priv->stats.tx_bytes += tx_req->skb->len; + + dev_kfree_skb_any(tx_req->skb); + + spin_lock_irqsave(&priv->lock, flags); + ++priv->tx_tail; + if (priv->tx_head - priv->tx_tail <= IPOIB_TX_RING_SIZE / 2) + netif_wake_queue(dev); + spin_unlock_irqrestore(&priv->lock, flags); + + if (wc->status != IB_WC_SUCCESS && + wc->status != IB_WC_WR_FLUSH_ERR) + ipoib_warn(priv, "failed send event " + "(status=%d, wrid=%d vend_err %x)\n", + wc->status, wr_id, wc->vendor_err); + } +} + +void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr) +{ + struct net_device *dev = (struct net_device *) dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int n, i; + + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + do { + n = ib_poll_cq(cq, IPOIB_NUM_WC, priv->ibwc); + for (i = 0; i < n; ++i) + ipoib_ib_handle_wc(dev, priv->ibwc + i); + } while (n == IPOIB_NUM_WC); +} + +static inline int post_send(struct ipoib_dev_priv *priv, + unsigned int wr_id, + struct ib_ah *address, u32 qpn, + dma_addr_t addr, int len) +{ + struct ib_sge list = { + .addr = addr, + .length = len, + .lkey = priv->mr->lkey, + }; + struct ib_send_wr param = { + .wr_id = wr_id, + .opcode = IB_WR_SEND, + .sg_list = &list, + .num_sge = 1, + .wr = { + .ud = { + .remote_qpn = qpn, + .remote_qkey = priv->qkey, + .ah = address + }, + }, + .send_flags = IB_SEND_SIGNALED, + }; + struct ib_send_wr *bad_wr; + + return ib_post_send(priv->qp, ¶m, &bad_wr); +} + +void ipoib_send(struct net_device *dev, struct sk_buff *skb, + struct ipoib_ah *address, u32 qpn) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_buf *tx_req; + dma_addr_t addr; + + if (skb->len > dev->mtu + INFINIBAND_ALEN) { + ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n", + skb->len, dev->mtu + INFINIBAND_ALEN); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + return; + } + + if (!(skb = skb_unshare(skb, GFP_ATOMIC))) { + ipoib_warn(priv, "failed to unshare sk_buff. Dropping\n"); + ++priv->stats.tx_dropped; + ++priv->stats.tx_errors; + return; + } + + ipoib_dbg_data(priv, "sending packet, length=%d address=%p qpn=0x%06x\n", + skb->len, address, qpn); + + /* + * We put the skb into the tx_ring _before_ we call post_send() + * because it's entirely possible that the completion handler will + * run before we execute anything after the post_send(). That + * means we have to make sure everything is properly recorded and + * our state is consistent before we call post_send(). + */ + tx_req = &priv->tx_ring[priv->tx_head & (IPOIB_TX_RING_SIZE - 1)]; + tx_req->skb = skb; + addr = dma_map_single(priv->ca->dma_device, + skb->data, skb->len, + DMA_TO_DEVICE); + pci_unmap_addr_set(tx_req, mapping, addr); + + if (post_send(priv, priv->tx_head & (IPOIB_TX_RING_SIZE - 1), + address->ah, qpn, addr, skb->len)) { + ipoib_warn(priv, "post_send failed\n"); + ++priv->stats.tx_errors; + dev_kfree_skb_any(skb); + } else { + unsigned long flags; + + dev->trans_start = jiffies; + + address->last_send = priv->tx_head; + ++priv->tx_head; + + spin_lock_irqsave(&priv->lock, flags); + if (priv->tx_head - priv->tx_tail == IPOIB_TX_RING_SIZE) { + ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); + netif_stop_queue(dev); + } + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +void __ipoib_reap_ah(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_ah *ah, *tah; + LIST_HEAD(remove_list); + + spin_lock_irq(&priv->lock); + list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list) + if (ah->last_send <= priv->tx_tail) { + list_del(&ah->list); + list_add_tail(&ah->list, &remove_list); + } + spin_unlock_irq(&priv->lock); + + list_for_each_entry_safe(ah, tah, &remove_list, list) { + ipoib_dbg(priv, "Reaping ah %p\n", ah->ah); + ib_destroy_ah(ah->ah); + kfree(ah); + } +} + +void ipoib_reap_ah(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + __ipoib_reap_ah(dev); + + if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); +} + +int ipoib_ib_dev_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + ret = ipoib_qp_create(dev); + if (ret) { + ipoib_warn(priv, "ipoib_qp_create returned %d\n", ret); + return -1; + } + + ret = ipoib_ib_post_receives(dev); + if (ret) { + ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret); + return -1; + } + + clear_bit(IPOIB_STOP_REAPER, &priv->flags); + queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ); + + return 0; +} + +int ipoib_ib_dev_up(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + set_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + + return ipoib_mcast_start_thread(dev); +} + +int ipoib_ib_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "downing ib_dev\n"); + + clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); + netif_carrier_off(dev); + + /* Shutdown the P_Key thread if still active */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + set_bit(IPOIB_PKEY_STOP, &priv->flags); + cancel_delayed_work(&priv->pkey_task); + up(&pkey_sem); + flush_workqueue(ipoib_workqueue); + } + + ipoib_mcast_stop_thread(dev); + + /* + * Flush the multicast groups first so we stop any multicast joins. The + * completion thread may have already died and we may deadlock waiting + * for the completion thread to finish some multicast joins. + */ + ipoib_mcast_dev_flush(dev); + + /* Delete broadcast and local addresses since they will be recreated */ + ipoib_mcast_dev_down(dev); + + return 0; +} + +static int recvs_pending(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int i; + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + return 1; + + return 0; +} + +int ipoib_ib_dev_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr qp_attr; + int attr_mask; + int i; + + /* Kill the existing QP and allocate a new one */ + qp_attr.qp_state = IB_QPS_ERR; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to ERROR state\n"); + + /* Wait for all sends and receives to complete */ + while (priv->tx_head != priv->tx_tail || recvs_pending(dev)) + yield(); + + ipoib_dbg(priv, "All sends and receives done.\n"); + + qp_attr.qp_state = IB_QPS_RESET; + attr_mask = IB_QP_STATE; + if (ib_modify_qp(priv->qp, &qp_attr, attr_mask)) + ipoib_warn(priv, "Failed to modify QP to RESET state\n"); + + /* Wait for all AHs to be reaped */ + set_bit(IPOIB_STOP_REAPER, &priv->flags); + cancel_delayed_work(&priv->ah_reap_task); + flush_workqueue(ipoib_workqueue); + while (!list_empty(&priv->dead_ahs)) { + __ipoib_reap_ah(dev); + yield(); + } + + for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) + if (priv->rx_ring[i].skb) + ipoib_warn(priv, "Recv skb still around @ %d\n", i); + + return 0; +} + +int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + priv->ca = ca; + priv->port = port; + priv->qp = NULL; + + if (ipoib_transport_dev_init(dev, ca)) { + printk(KERN_WARNING "%s: ipoib_transport_dev_init failed\n", ca->name); + return -ENODEV; + } + + if (dev->flags & IFF_UP) { + if (ipoib_ib_dev_open(dev)) { + ipoib_transport_dev_cleanup(dev); + return -ENODEV; + } + } + + return 0; +} + +void ipoib_ib_dev_flush(void *_dev) +{ + struct net_device *dev = (struct net_device *)_dev; + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv; + + if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + return; + + ipoib_dbg(priv, "flushing\n"); + + ipoib_ib_dev_down(dev); + + /* + * The device could have been brought down between the start and when + * we get here, don't bring it back up if it's not configured up + */ + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_ib_dev_up(dev); + + /* Flush any child interfaces too */ + list_for_each_entry(cpriv, &priv->child_intfs, list) + ipoib_ib_dev_flush(&cpriv->dev); +} + +void ipoib_ib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "cleaning up ib_dev\n"); + + ipoib_mcast_stop_thread(dev); + + /* Delete the broadcast address and the local address */ + ipoib_mcast_dev_down(dev); + + ipoib_transport_dev_cleanup(dev); +} + +/* + * Delayed P_Key Assigment Interim Support + * + * The following is initial implementation of delayed P_Key assigment + * mechanism. It is using the same approach implemented for the multicast + * group join. The single goal of this implementation is to quickly address + * Bug #2507. This implementation will probably be removed when the P_Key + * change async notification is available. + */ +int ipoib_open(struct net_device *dev); + +static void ipoib_pkey_dev_check_presence(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + u16 pkey_index = 0; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + else + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); +} + +void ipoib_pkey_poll(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_pkey_dev_check_presence(dev); + + if (test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) + ipoib_open(dev); + else { + down(&pkey_sem); + if (!test_bit(IPOIB_PKEY_STOP, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + } +} + +int ipoib_pkey_dev_delay_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Look for the interface pkey value in the IB Port P_Key table and */ + /* set the interface pkey assigment flag */ + ipoib_pkey_dev_check_presence(dev); + + /* P_Key value not assigned yet - start polling */ + if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) { + down(&pkey_sem); + clear_bit(IPOIB_PKEY_STOP, &priv->flags); + queue_delayed_work(ipoib_workqueue, + &priv->pkey_task, + HZ); + up(&pkey_sem); + return 1; + } + + return 0; +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_main.c 2004-11-23 08:10:22.898186042 -0800 @@ -0,0 +1,954 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_main.c 1273 2004-11-22 22:59:30Z roland $ + */ + +#include "ipoib.h" + +#include +#include + +#include +#include +#include + +#include /* For ARPHRD_xxx */ + +#include +#include + +MODULE_AUTHOR("Roland Dreier"); +MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG +int debug_level; + +#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA +#define DATA_PATH_DEBUG_HELP " and data path tracing if > 1" +#else +#define DATA_PATH_DEBUG_HELP "" +#endif + +module_param(debug_level, int, 0644); +MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0" DATA_PATH_DEBUG_HELP); + +int mcast_debug_level; + +module_param(mcast_debug_level, int, 0644); +MODULE_PARM_DESC(mcast_debug_level, + "Enable multicast debug tracing if > 0"); +#endif + +static const u8 ipv4_bcast_addr[] = { + 0x00, 0xff, 0xff, 0xff, + 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff +}; + +struct workqueue_struct *ipoib_workqueue; + +static void ipoib_add_one(struct ib_device *device); +static void ipoib_remove_one(struct ib_device *device); + +static struct ib_client ipoib_client = { + .name = "ipoib", + .add = ipoib_add_one, + .remove = ipoib_remove_one +}; + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + *ca = priv->ca; + *port_num = priv->port; + *gid = priv->local_gid; + *pkey = priv->pkey; + + return 0; +} +EXPORT_SYMBOL(ipoib_device_handle); + +int ipoib_open(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "bringing up interface\n"); + + set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + if (ipoib_pkey_dev_delay_open(dev)) + return 0; + + if (ipoib_ib_dev_open(dev)) + return -EINVAL; + + if (ipoib_ib_dev_up(dev)) + return -EINVAL; + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring up any child interfaces too */ + down(&priv->vlan_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (flags & IFF_UP) + continue; + + dev_change_flags(cpriv->dev, flags | IFF_UP); + } + up(&priv->vlan_mutex); + } + + netif_start_queue(dev); + + return 0; +} + +static int ipoib_stop(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg(priv, "stopping interface\n"); + + clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + + netif_stop_queue(dev); + + ipoib_ib_dev_down(dev); + ipoib_ib_dev_stop(dev); + + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { + struct ipoib_dev_priv *cpriv; + + /* Bring down any child interfaces too */ + down(&priv->vlan_mutex); + list_for_each_entry(cpriv, &priv->child_intfs, list) { + int flags; + + flags = cpriv->dev->flags; + if (!(flags & IFF_UP)) + continue; + + dev_change_flags(cpriv->dev, flags & ~IFF_UP); + } + up(&priv->vlan_mutex); + } + + return 0; +} + +static int ipoib_change_mtu(struct net_device *dev, int new_mtu) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN) + return -EINVAL; + + priv->admin_mtu = new_mtu; + + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + return 0; +} + +static void path_rec_completion(int status, + struct ib_sa_path_rec *pathrec, + void *path_ptr) +{ + struct ipoib_path *path = path_ptr; + struct ipoib_dev_priv *priv = netdev_priv(path->dev); + struct sk_buff *skb; + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status != IB_WC_SUCCESS) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(path->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + path->ah = ah; + + ipoib_dbg(priv, "created address handle %p for LID 0x%04x, SL %d\n", + ah, pathrec->dlid, pathrec->sl); + + while ((skb = __skb_dequeue(&path->queue))) { + skb->dev = path->dev; + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue packet\n"); + } + + return; + +err: + while ((skb = __skb_dequeue(&path->queue))) + dev_kfree_skb(skb); + + if (path->neighbour) + *to_ipoib_path(path->neighbour) = NULL; + + kfree(path); +} + +static int path_rec_start(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (!path) + goto err; + + path->ah = NULL; + path->dev = dev; + skb_queue_head_init(&path->queue); + __skb_queue_tail(&path->queue, skb); + path->neighbour = NULL; + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, skb->dst->neighbour->ha + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX there's a race here if path record completion runs + * before we get to finish up. Add a lock to path struct? + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + path_rec_completion, + path, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + goto err; + } + + path->neighbour = skb->dst->neighbour; + *to_ipoib_path(skb->dst->neighbour) = path; + return 0; + +err: + kfree(path); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +static int path_lookup(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + + /* Look up path record for unicasts */ + if (skb->dst->neighbour->ha[4] != 0xff) + return path_rec_start(skb, dev); + + /* Add in the P_Key */ + skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; + skb->dst->neighbour->ha[9] = priv->pkey & 0xff; + ipoib_mcast_send(dev, + (union ib_gid *) (skb->dst->neighbour->ha + 4), + skb); + return 0; +} + +static void unicast_arp_completion(int status, + struct ib_sa_path_rec *pathrec, + void *skb_ptr) +{ + struct sk_buff *skb = skb_ptr; + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah; + + ipoib_dbg(priv, "status %d, LID 0x%04x for GID " IPOIB_GID_FMT "\n", + status, be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid)); + + if (status) + goto err; + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(pathrec->dlid), + .sl = pathrec->sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = 0, + .port_num = priv->port + }; + + ah = ipoib_create_ah(skb->dev, priv->pd, &av); + } + + if (!ah) + goto err; + + *(struct ipoib_ah **) skb->cb = ah; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed " + "to requeue ARP packet\n"); + + return; + +err: + dev_kfree_skb(skb); +} + +static void unicast_arp_finish(struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(skb->dev); + struct ipoib_ah *ah = *(struct ipoib_ah **) skb->cb; + unsigned long flags; + + if (ah) { + spin_lock_irqsave(&priv->lock, flags); + list_add_tail(&ah->list, &priv->dead_ahs); + spin_unlock_irqrestore(&priv->lock, flags); + } +} + +/* + * For unicast packets with no skb->dst->neighbour (unicast ARPs are + * the main example), we fire off a path record query for each packet. + * This is pretty bad for scalability (since this is going to hammer + * the SM on a big fabric) but it's the best I can think of for now. + * + * Also we might have a problem if a path changes, because ARPs will + * still go through (since we'll get the new path from the SM for + * these queries) so we'll never update the neighbour. + */ +static int unicast_arp_start(struct sk_buff *skb, struct net_device *dev, + struct ipoib_pseudoheader *phdr) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *tmp_skb; + struct ib_sa_path_rec rec = { + .numb_path = 1 + }; + struct ib_sa_query *query; + + if (skb->destructor) { + tmp_skb = skb; + skb = skb_clone(tmp_skb, GFP_ATOMIC); + dev_kfree_skb_any(tmp_skb); + if (!skb) { + ++priv->stats.tx_dropped; + return 0; + } + } + + skb->dev = dev; + skb->destructor = unicast_arp_finish; + memset(skb->cb, 0, sizeof skb->cb); + + rec.sgid = priv->local_gid; + memcpy(rec.dgid.raw, phdr->hwaddr + 4, 16); + rec.pkey = cpu_to_be16(priv->pkey); + + /* + * XXX We need to keep a record of the skb and TID somewhere + * so that we can cancel the request if the device goes down + * before it finishes. + */ + if (ib_sa_path_rec_get(priv->ca, priv->port, &rec, + IB_SA_PATH_REC_DGID | + IB_SA_PATH_REC_SGID | + IB_SA_PATH_REC_NUMB_PATH | + IB_SA_PATH_REC_PKEY, + 1000, GFP_ATOMIC, + unicast_arp_completion, + skb, &query) < 0) { + ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + } + + return 0; +} + +static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_path *path; + + if (skb->dst && skb->dst->neighbour) { + if (unlikely(!*to_ipoib_path(skb->dst->neighbour))) + return path_lookup(skb, dev); + + path = *to_ipoib_path(skb->dst->neighbour); + + if (likely(path->ah)) { + ipoib_send(dev, skb, path->ah, + be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); + return 0; + } + + if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) + __skb_queue_tail(&path->queue, skb); + else + goto err; + } else { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb->data; + skb_pull(skb, sizeof *phdr); + + if (phdr->hwaddr[4] == 0xff) { + /* Add in the P_Key */ + phdr->hwaddr[8] = (priv->pkey >> 8) & 0xff; + phdr->hwaddr[9] = priv->pkey & 0xff; + + ipoib_mcast_send(dev, (union ib_gid *) (phdr->hwaddr + 4), skb); + } + else { + /* unicast GID -- ARP reply?? */ + + /* + * If destructor is unicast_arp_finish, we've + * already been through the path lookup and + * now we can just send the packet. + */ + if (skb->destructor == unicast_arp_finish) { + ipoib_send(dev, skb, *(struct ipoib_ah **) skb->cb, + be32_to_cpup((u32 *) phdr->hwaddr)); + return 0; + } + + if (be16_to_cpup((u16 *) skb->data) != ETH_P_ARP) { + ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x " + IPOIB_GID_FMT "\n", + skb->dst ? "neigh" : "dst", + be16_to_cpup((u16 *) skb->data), + be32_to_cpup((u32 *) phdr->hwaddr), + IPOIB_GID_ARG(*(union ib_gid *) (phdr->hwaddr + 4))); + dev_kfree_skb_any(skb); + ++priv->stats.tx_dropped; + return 0; + } + + /* put the pseudoheader back on */ + skb_push(skb, sizeof *phdr); + return unicast_arp_start(skb, dev, phdr); + } + } + + return 0; + +err: + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + + return 0; +} + +struct net_device_stats *ipoib_get_stats(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return &priv->stats; +} + +static void ipoib_timeout(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_warn(priv, "transmit timeout: latency %ld\n", + jiffies - dev->trans_start); + /* XXX reset QP, etc. */ +} + +static int ipoib_hard_header(struct sk_buff *skb, + struct net_device *dev, + unsigned short type, + void *daddr, void *saddr, unsigned len) +{ + struct ipoib_header *header; + + header = (struct ipoib_header *) skb_push(skb, sizeof *header); + + header->proto = htons(type); + header->reserved = 0; + + /* + * If we don't have a neighbour structure, stuff the + * destination address onto the front of the skb so we can + * figure out where to send the packet later. + */ + if (!skb->dst || !skb->dst->neighbour) { + struct ipoib_pseudoheader *phdr = + (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); + memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); + } + + return 0; +} + +static void ipoib_set_mcast_list(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + schedule_work(&priv->restart_task); +} + +static void ipoib_neigh_destructor(struct neighbour *neigh) +{ + struct ipoib_path *path = *to_ipoib_path(neigh); + + ipoib_dbg(netdev_priv(neigh->dev), + "neigh_destructor for %06x " IPOIB_GID_FMT "\n", + be32_to_cpup((__be32 *) neigh->ha), + IPOIB_GID_ARG(*((union ib_gid *) (neigh->ha + 4)))); + + if (path && path->ah) { + ipoib_put_ah(path->ah); + kfree(path); + } +} + +static int ipoib_neigh_setup(struct neighbour *neigh) +{ + /* + * Is this kosher? I can't find anybody in the kernel that + * sets neigh->destructor, so we should be able to set it here + * without trouble. + */ + neigh->ops->destructor = ipoib_neigh_destructor; + + return 0; +} + +static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) +{ + parms->neigh_setup = ipoib_neigh_setup; + + return 0; +} + +int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + /* Allocate RX/TX "rings" to hold queued skbs */ + + priv->rx_ring = kmalloc(IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->rx_ring) { + printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", + ca->name, IPOIB_RX_RING_SIZE); + goto out; + } + memset(priv->rx_ring, 0, + IPOIB_RX_RING_SIZE * sizeof (struct ipoib_buf)); + + priv->tx_ring = kmalloc(IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf), + GFP_KERNEL); + if (!priv->tx_ring) { + printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", + ca->name, IPOIB_TX_RING_SIZE); + goto out_rx_ring_cleanup; + } + memset(priv->tx_ring, 0, + IPOIB_TX_RING_SIZE * sizeof (struct ipoib_buf)); + + /* priv->tx_head & tx_tail are already 0 */ + + if (ipoib_ib_dev_init(dev, ca, port)) + goto out_tx_ring_cleanup; + + return 0; + +out_tx_ring_cleanup: + kfree(priv->tx_ring); + +out_rx_ring_cleanup: + kfree(priv->rx_ring); + +out: + return -ENOMEM; +} + +void ipoib_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv, *tcpriv; + + ipoib_delete_debug_file(dev); + + /* Delete any child interfaces first */ + list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) { + unregister_netdev(cpriv->dev); + ipoib_dev_cleanup(cpriv->dev); + free_netdev(cpriv->dev); + } + + ipoib_ib_dev_cleanup(dev); + + if (priv->rx_ring) { + kfree(priv->rx_ring); + priv->rx_ring = NULL; + } + + if (priv->tx_ring) { + kfree(priv->tx_ring); + priv->tx_ring = NULL; + } +} + +static void ipoib_setup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + dev->open = ipoib_open; + dev->stop = ipoib_stop; + dev->change_mtu = ipoib_change_mtu; + dev->hard_start_xmit = ipoib_start_xmit; + dev->get_stats = ipoib_get_stats; + dev->tx_timeout = ipoib_timeout; + dev->hard_header = ipoib_hard_header; + dev->set_multicast_list = ipoib_set_mcast_list; + dev->neigh_setup = ipoib_neigh_setup_dev; + + dev->watchdog_timeo = HZ; + + dev->rebuild_header = NULL; + dev->set_mac_address = NULL; + dev->header_cache_update = NULL; + + dev->flags |= IFF_BROADCAST | IFF_MULTICAST; + + /* + * We add in INFINIBAND_ALEN to allow for the destination + * address "pseudoheader" for skbs without neighbour struct. + */ + dev->hard_header_len = IPOIB_ENCAP_LEN + INFINIBAND_ALEN; + dev->addr_len = INFINIBAND_ALEN; + dev->type = ARPHRD_INFINIBAND; + dev->tx_queue_len = IPOIB_TX_RING_SIZE * 2; + dev->features = NETIF_F_VLAN_CHALLENGED; + + /* MTU will be reset when mcast join happens */ + dev->mtu = IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN; + priv->mcast_mtu = priv->admin_mtu = dev->mtu; + + memcpy(dev->broadcast, ipv4_bcast_addr, INFINIBAND_ALEN); + + netif_carrier_off(dev); + + SET_MODULE_OWNER(dev); + + priv->dev = dev; + + spin_lock_init(&priv->lock); + + init_MUTEX(&priv->mcast_mutex); + init_MUTEX(&priv->vlan_mutex); + + INIT_LIST_HEAD(&priv->child_intfs); + INIT_LIST_HEAD(&priv->dead_ahs); + INIT_LIST_HEAD(&priv->multicast_list); + + INIT_WORK(&priv->pkey_task, ipoib_pkey_poll, priv->dev); + INIT_WORK(&priv->mcast_task, ipoib_mcast_join_task, priv->dev); + INIT_WORK(&priv->flush_task, ipoib_ib_dev_flush, priv->dev); + INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task, priv->dev); + INIT_WORK(&priv->ah_reap_task, ipoib_reap_ah, priv->dev); +} + +struct ipoib_dev_priv *ipoib_intf_alloc(const char *name) +{ + struct net_device *dev; + + dev = alloc_netdev((int) sizeof (struct ipoib_dev_priv), name, + ipoib_setup); + if (!dev) + return NULL; + + return netdev_priv(dev); +} + +static ssize_t show_pkey(struct class_device *cdev, char *buf) +{ + struct ipoib_dev_priv *priv = + netdev_priv(container_of(cdev, struct net_device, class_dev)); + + return sprintf(buf, "0x%04x\n", priv->pkey); +} +static CLASS_DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL); + +static ssize_t create_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_add(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(create_child, S_IWUGO, NULL, create_child); + +static ssize_t delete_child(struct class_device *cdev, + const char *buf, size_t count) +{ + int pkey; + int ret; + + if (sscanf(buf, "%i", &pkey) != 1) + return -EINVAL; + + if (pkey < 0 || pkey > 0xffff) + return -EINVAL; + + ret = ipoib_vlan_delete(container_of(cdev, struct net_device, class_dev), + pkey); + + return ret ? ret : count; + +} +static CLASS_DEVICE_ATTR(delete_child, S_IWUGO, NULL, delete_child); + +int ipoib_add_pkey_attr(struct net_device *dev) +{ + return class_device_create_file(&dev->class_dev, + &class_device_attr_pkey); +} + +static struct net_device *ipoib_add_port(const char *format, + struct ib_device *hca, u8 port) +{ + struct ipoib_dev_priv *priv; + int result = -ENOMEM; + + priv = ipoib_intf_alloc(format); + if (!priv) + goto alloc_mem_failed; + + SET_NETDEV_DEV(priv->dev, hca->dma_device); + + result = ib_query_pkey(hca, port, 0, &priv->pkey); + if (result) { + printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } + + priv->dev->broadcast[8] = priv->pkey >> 8; + priv->dev->broadcast[9] = priv->pkey & 0xff; + + result = ib_query_gid(hca, port, 0, &priv->local_gid); + if (result) { + printk(KERN_WARNING "%s: ib_query_gid port %d failed (ret = %d)\n", + hca->name, port, result); + goto alloc_mem_failed; + } else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + + result = ipoib_dev_init(priv->dev, hca, port); + if (result < 0) { + printk(KERN_WARNING "%s: failed to initialize port %d (ret = %d)\n", + hca->name, port, result); + goto device_init_failed; + } + + INIT_IB_EVENT_HANDLER(&priv->event_handler, + priv->ca, ipoib_event); + result = ib_register_event_handler(&priv->event_handler); + if (result < 0) { + printk(KERN_WARNING "%s: ib_register_event_handler failed for " + "port %d (ret = %d)\n", + hca->name, port, result); + goto event_failed; + } + + result = register_netdev(priv->dev); + if (result) { + printk(KERN_WARNING "%s: couldn't register ipoib port %d; error %d\n", + hca->name, port, result); + goto register_failed; + } + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_create_child)) + goto sysfs_failed; + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_delete_child)) + goto sysfs_failed; + + return priv->dev; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ib_unregister_event_handler(&priv->event_handler); + +event_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +alloc_mem_failed: + return ERR_PTR(result); +} + +static void ipoib_add_one(struct ib_device *device) +{ + struct list_head *dev_list; + struct net_device *dev; + struct ipoib_dev_priv *priv; + int s, e, p; + + dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL); + if (!dev_list) + return; + + INIT_LIST_HEAD(dev_list); + + if (device->node_type == IB_NODE_SWITCH) { + s = 0; + e = 0; + } else { + s = 1; + e = device->phys_port_cnt; + } + + for (p = s; p <= e; ++p) { + dev = ipoib_add_port("ib%d", device, p); + if (!IS_ERR(dev)) { + priv = netdev_priv(dev); + list_add_tail(&priv->list, dev_list); + } + } + + ib_set_client_data(device, &ipoib_client, dev_list); +} + +static void ipoib_remove_one(struct ib_device *device) +{ + struct ipoib_dev_priv *priv, *tmp; + struct list_head *dev_list; + + dev_list = ib_get_client_data(device, &ipoib_client); + + list_for_each_entry_safe(priv, tmp, dev_list, list) { + ib_unregister_event_handler(&priv->event_handler); + + unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); + free_netdev(priv->dev); + } +} + +static int __init ipoib_init_module(void) +{ + int ret; + + ret = ipoib_register_debugfs(); + if (ret) + return ret; + + /* + * We create our own workqueue mainly because we want to be + * able to flush it when devices are being removed. We can't + * use schedule_work()/flush_scheduled_work() because both + * unregister_netdev() and linkwatch_event take the rtnl lock, + * so flush_scheduled_work() can deadlock during device + * removal. + */ + ipoib_workqueue = create_singlethread_workqueue("ipoib"); + if (!ipoib_workqueue) { + ret = -ENOMEM; + goto err_fs; + } + + ret = ib_register_client(&ipoib_client); + if (ret) + goto err_wq; + + return 0; + +err_fs: + ipoib_unregister_debugfs(); + +err_wq: + destroy_workqueue(ipoib_workqueue); + + return ret; +} + +static void __exit ipoib_cleanup_module(void) +{ + ipoib_unregister_debugfs(); + ib_unregister_client(&ipoib_client); + destroy_workqueue(ipoib_workqueue); +} + +module_init(ipoib_init_module); +module_exit(ipoib_cleanup_module); + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2004-11-23 08:10:22.940179850 -0800 @@ -0,0 +1,928 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_multicast.c 1277 2004-11-23 01:08:07Z roland $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ipoib.h" + +static DECLARE_MUTEX(mcast_mutex); + +/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */ +struct ipoib_mcast { + struct ib_sa_mcmember_rec mcmember; + struct ipoib_ah *ah; + + struct rb_node rb_node; + struct list_head list; + struct completion done; + + int query_id; + struct ib_sa_query *query; + + unsigned long created; + unsigned long backoff; + + unsigned long flags; + unsigned char logcount; + + struct sk_buff_head pkt_queue; + + struct net_device *dev; +}; + +struct ipoib_mcast_iter { + struct net_device *dev; + union ib_gid mgid; + unsigned long created; + unsigned int queuelen; + unsigned int complete; + unsigned int send_only; +}; + +static void ipoib_mcast_free(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + + ipoib_dbg_mcast(netdev_priv(dev), + "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + if (mcast->ah) + ipoib_put_ah(mcast->ah); + + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + dev_kfree_skb_any(skb); + } + + kfree(mcast); +} + +static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev, + int can_sleep) +{ + struct ipoib_mcast *mcast; + + mcast = kmalloc(sizeof (*mcast), can_sleep ? GFP_KERNEL : GFP_ATOMIC); + if (!mcast) + return NULL; + + memset(mcast, 0, sizeof (*mcast)); + + init_completion(&mcast->done); + + mcast->dev = dev; + mcast->created = jiffies; + mcast->backoff = HZ; + mcast->logcount = 0; + + INIT_LIST_HEAD(&mcast->list); + skb_queue_head_init(&mcast->pkt_queue); + + mcast->ah = NULL; + mcast->query = NULL; + + return mcast; +} + +static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node *n = priv->multicast_tree.rb_node; + + while (n) { + struct ipoib_mcast *mcast; + int ret; + + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + ret = memcmp(mgid->raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = n->rb_left; + else if (ret > 0) + n = n->rb_right; + else + return mcast; + } + + return NULL; +} + +static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct rb_node **n = &priv->multicast_tree.rb_node, *pn = NULL; + + while (*n) { + struct ipoib_mcast *tmcast; + int ret; + + pn = *n; + tmcast = rb_entry(pn, struct ipoib_mcast, rb_node); + + ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, + sizeof (union ib_gid)); + if (ret < 0) + n = &pn->rb_left; + else if (ret > 0) + n = &pn->rb_right; + else + return -EEXIST; + } + + rb_link_node(&mcast->rb_node, pn, n); + rb_insert_color(&mcast->rb_node, &priv->multicast_tree); + + return 0; +} + +static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, + struct ib_sa_mcmember_rec *mcmember) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + mcast->mcmember = *mcmember; + + /* Set the cached Q_Key before we attach if it's the broadcast group */ + if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid))) + priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); + + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + ipoib_warn(priv, "multicast group " IPOIB_GID_FMT + " already attached\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + return 0; + } + + ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret < 0) { + ipoib_warn(priv, "couldn't attach QP to multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); + return ret; + } + } + + { + struct ib_ah_attr av = { + .dlid = be16_to_cpu(mcast->mcmember.mlid), + .port_num = priv->port, + .sl = mcast->mcmember.sl, + .src_path_bits = 0, + .static_rate = 0, + .ah_flags = IB_AH_GRH, + .grh = { + .flow_label = be32_to_cpu(mcast->mcmember.flow_label), + .hop_limit = mcast->mcmember.hop_limit, + .sgid_index = 0, + .traffic_class = mcast->mcmember.traffic_class + } + }; + + av.grh.dgid = mcast->mcmember.mgid; + + mcast->ah = ipoib_create_ah(dev, priv->pd, &av); + if (!mcast->ah) { + ipoib_warn(priv, "ib_address_create failed\n"); + } else { + ipoib_dbg_mcast(priv, "MGID " IPOIB_GID_FMT + " AV %p, LID 0x%04x, SL %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + mcast->ah->ah, + be16_to_cpu(mcast->mcmember.mlid), + mcast->mcmember.sl); + } + } + + /* actually send any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + if (dev_queue_xmit(skb)) + ipoib_warn(priv, "dev_queue_xmit failed to requeue packet\n"); + } + + return 0; +} + +static void +ipoib_mcast_sendonly_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + + if (!status) + ipoib_mcast_join_finish(mcast, mcmember); + else { + if (mcast->logcount++ < 20) + ipoib_dbg_mcast(netdev_priv(dev), "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + /* Flush out any queued packets */ + while (!skb_queue_empty(&mcast->pkt_queue)) { + struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); + + skb->dev = dev; + + dev_kfree_skb_any(skb); + } + + /* Clear the busy flag so we try again */ + clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); + } + + complete(&mcast->done); +} + +static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) +{ + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { +#if 0 /* Some SMs don't support send-only yet */ + .join_state = 4 +#else + .join_state = 1 +#endif + }; + int ret = 0; + + if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { + ipoib_dbg_mcast(priv, "device shutting down, no multicast joins\n"); + return -ENODEV; + } + + if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "multicast entry busy, skipping\n"); + return -EBUSY; + } + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 1000, GFP_ATOMIC, + ipoib_mcast_sendonly_join_complete, + mcast, &mcast->query); + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed (ret = %d)\n", + ret); + } else { + ipoib_dbg_mcast(priv, "no multicast record for " IPOIB_GID_FMT + ", starting join\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + mcast->query_id = ret; + } + + return ret; +} + +static void ipoib_mcast_join_complete(int status, + struct ib_sa_mcmember_rec *mcmember, + void *mcast_ptr) +{ + struct ipoib_mcast *mcast = mcast_ptr; + struct net_device *dev = mcast->dev; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "join completion for " IPOIB_GID_FMT + " (status %d)\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), status); + + if (!status && !ipoib_mcast_join_finish(mcast, mcmember)) { + mcast->backoff = HZ; + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + complete(&mcast->done); + return; + } + + if (status == -EINTR) { + complete(&mcast->done); + return; + } + + if (status && mcast->logcount++ < 20) { + if (status == -ETIMEDOUT || status == -EINTR) { + ipoib_dbg_mcast(priv, "multicast join failed for " IPOIB_GID_FMT + ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } else { + ipoib_warn(priv, "multicast join failed for " + IPOIB_GID_FMT ", status %d\n", + IPOIB_GID_ARG(mcast->mcmember.mgid), + status); + } + } + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + mcast->query = NULL; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) { + if (status == -ETIMEDOUT) + queue_work(ipoib_workqueue, &priv->mcast_task); + else + queue_delayed_work(ipoib_workqueue, &priv->mcast_task, + mcast->backoff * HZ); + } else + complete(&mcast->done); + up(&mcast_mutex); + + return; +} + +static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, + int create) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + ib_sa_comp_mask comp_mask; + int ret = 0; + + ipoib_dbg_mcast(priv, "joining MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + comp_mask = + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE; + + if (create) { + comp_mask |= + IB_SA_MCMEMBER_REC_QKEY | + IB_SA_MCMEMBER_REC_SL | + IB_SA_MCMEMBER_REC_FLOW_LABEL | + IB_SA_MCMEMBER_REC_TRAFFIC_CLASS; + + rec.qkey = priv->broadcast->mcmember.qkey; + rec.sl = priv->broadcast->mcmember.sl; + rec.flow_label = priv->broadcast->mcmember.flow_label; + rec.traffic_class = priv->broadcast->mcmember.traffic_class; + } + + ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, comp_mask, + mcast->backoff * 1000, GFP_ATOMIC, + ipoib_mcast_join_complete, + mcast, &mcast->query); + + if (ret < 0) { + ipoib_warn(priv, "ib_sa_mcmember_rec_set failed, status %d\n", ret); + + mcast->backoff *= 2; + if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) + mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; + + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, + mcast->backoff); + up(&mcast_mutex); + } else + mcast->query_id = ret; +} + +void ipoib_mcast_join_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (!test_bit(IPOIB_MCAST_RUN, &priv->flags)) + return; + + if (ib_query_gid(priv->ca, priv->port, 0, &priv->local_gid)) + ipoib_warn(priv, "ib_gid_entry_get() failed\n"); + else + memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); + + if (!priv->broadcast) { + priv->broadcast = ipoib_mcast_alloc(dev, 1); + if (!priv->broadcast) { + ipoib_warn(priv, "failed to allocate broadcast group\n"); + down(&mcast_mutex); + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_delayed_work(ipoib_workqueue, + &priv->mcast_task, HZ); + up(&mcast_mutex); + return; + } + + memcpy(priv->broadcast->mcmember.mgid.raw, priv->dev->broadcast + 4, + sizeof (union ib_gid)); + + spin_lock_irq(&priv->lock); + __ipoib_mcast_add(dev, priv->broadcast); + spin_unlock_irq(&priv->lock); + } + + if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { + ipoib_mcast_join(dev, priv->broadcast, 0); + return; + } + + while (1) { + struct ipoib_mcast *mcast = NULL; + + spin_lock_irq(&priv->lock); + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) + && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { + /* Found the next unjoined group */ + break; + } + } + spin_unlock_irq(&priv->lock); + + if (&mcast->list == &priv->multicast_list) { + /* All done */ + break; + } + + ipoib_mcast_join(dev, mcast, 1); + return; + } + + { + struct ib_port_attr attr; + + if (!ib_query_port(priv->ca, priv->port, &attr)) + priv->local_lid = attr.lid; + else + ipoib_warn(priv, "ib_query_port failed\n"); + } + + priv->mcast_mtu = ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu) - + IPOIB_ENCAP_LEN; + dev->mtu = min(priv->mcast_mtu, priv->admin_mtu); + + ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n"); + + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + netif_carrier_on(dev); +} + +int ipoib_mcast_start_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + ipoib_dbg_mcast(priv, "starting multicast thread\n"); + + down(&mcast_mutex); + if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) + queue_work(ipoib_workqueue, &priv->mcast_task); + up(&mcast_mutex); + + return 0; +} + +int ipoib_mcast_stop_thread(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + + ipoib_dbg_mcast(priv, "stopping multicast thread\n"); + + down(&mcast_mutex); + clear_bit(IPOIB_MCAST_RUN, &priv->flags); + cancel_delayed_work(&priv->mcast_task); + up(&mcast_mutex); + + flush_workqueue(ipoib_workqueue); + + if (priv->broadcast && priv->broadcast->query) { + ib_sa_cancel_query(priv->broadcast->query_id, priv->broadcast->query); + priv->broadcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for bcast\n"); + wait_for_completion(&priv->broadcast->done); + } + + list_for_each_entry(mcast, &priv->multicast_list, list) { + if (mcast->query) { + ib_sa_cancel_query(mcast->query_id, mcast->query); + mcast->query = NULL; + ipoib_dbg_mcast(priv, "waiting for MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + wait_for_completion(&mcast->done); + } + } + + return 0; +} + +int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_sa_mcmember_rec rec = { + .join_state = 1 + }; + int ret = 0; + + if (!test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) + return 0; + + ipoib_dbg_mcast(priv, "leaving MGID " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rec.mgid = mcast->mcmember.mgid; + rec.port_gid = priv->local_gid; + rec.pkey = be16_to_cpu(priv->pkey); + + /* Remove ourselves from the multicast group */ + ret = ipoib_mcast_detach(dev, be16_to_cpu(mcast->mcmember.mlid), + &mcast->mcmember.mgid); + if (ret) + ipoib_warn(priv, "ipoib_mcast_detach failed (result = %d)\n", ret); + + /* + * Just make one shot at leaving and don't wait for a reply; + * if we fail, too bad. + */ + ret = ib_sa_mcmember_rec_delete(priv->ca, priv->port, &rec, + IB_SA_MCMEMBER_REC_MGID | + IB_SA_MCMEMBER_REC_PORT_GID | + IB_SA_MCMEMBER_REC_PKEY | + IB_SA_MCMEMBER_REC_JOIN_STATE, + 0, GFP_ATOMIC, NULL, + mcast, &mcast->query); + if (ret < 0) + ipoib_warn(priv, "ib_sa_mcmember_rec_delete failed " + "for leave (result = %d)\n", ret); + + return 0; +} + +void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid, + struct sk_buff *skb) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ipoib_mcast *mcast; + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + mcast = __ipoib_mcast_find(dev, mgid); + if (!mcast) { + /* Let's create a new send only group now */ + ipoib_dbg_mcast(priv, "setting up send only multicast group for " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(*mgid)); + + mcast = ipoib_mcast_alloc(dev, 0); + if (!mcast) { + ipoib_warn(priv, "unable to allocate memory for " + "multicast structure\n"); + dev_kfree_skb_any(skb); + goto out; + } + + set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); + mcast->mcmember.mgid = *mgid; + __ipoib_mcast_add(dev, mcast); + list_add_tail(&mcast->list, &priv->multicast_list); + } + + if (!mcast->ah) { + if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) + skb_queue_tail(&mcast->pkt_queue, skb); + else + dev_kfree_skb_any(skb); + + if (mcast->query) + ipoib_dbg_mcast(priv, "no address vector, " + "but multicast join already started\n"); + else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) + ipoib_mcast_sendonly_join(mcast); + + /* + * If lookup completes between here and out:, don't + * want to send packet twice. + */ + mcast = NULL; + } + +out: + spin_unlock_irqrestore(&priv->lock, flags); + if (mcast && mcast->ah) { + if (skb->dst && + skb->dst->neighbour && + !*to_ipoib_path(skb->dst->neighbour)) { + struct ipoib_path *path = kmalloc(sizeof *path, GFP_ATOMIC); + + if (path) { + kref_get(&mcast->ah->ref); + path->ah = mcast->ah; + path->dev = dev; + path->neighbour = skb->dst->neighbour; + *to_ipoib_path(skb->dst->neighbour) = path; + } + } + + ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); + } +} + +void ipoib_mcast_dev_flush(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + LIST_HEAD(remove_list); + struct ipoib_mcast *mcast, *tmcast, *nmcast; + unsigned long flags; + + ipoib_dbg_mcast(priv, "flushing multicast list\n"); + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->flags = + mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY); + + nmcast->mcmember.mgid = mcast->mcmember.mgid; + + /* Add the new group in before the to-be-destroyed group */ + list_add_tail(&nmcast->list, &mcast->list); + list_del_init(&mcast->list); + + rb_replace_node(&mcast->rb_node, &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&mcast->list, &remove_list); + } else { + ipoib_warn(priv, "could not reallocate multicast group " + IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + } + } + + if (priv->broadcast) { + nmcast = ipoib_mcast_alloc(dev, 0); + if (nmcast) { + nmcast->mcmember.mgid = priv->broadcast->mcmember.mgid; + + rb_replace_node(&priv->broadcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + + list_add_tail(&priv->broadcast->list, &remove_list); + } + + priv->broadcast = nmcast; + } + + spin_unlock_irqrestore(&priv->lock, flags); + + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(dev, mcast); + ipoib_mcast_free(mcast); + } +} + +void ipoib_mcast_dev_down(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + unsigned long flags; + + /* Delete broadcast since it will be recreated */ + if (priv->broadcast) { + ipoib_dbg_mcast(priv, "deleting broadcast group\n"); + + spin_lock_irqsave(&priv->lock, flags); + rb_erase(&priv->broadcast->rb_node, &priv->multicast_tree); + spin_unlock_irqrestore(&priv->lock, flags); + ipoib_mcast_leave(dev, priv->broadcast); + ipoib_mcast_free(priv->broadcast); + priv->broadcast = NULL; + } +} + +void ipoib_mcast_restart_task(void *dev_ptr) +{ + struct net_device *dev = dev_ptr; + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dev_mc_list *mclist; + struct ipoib_mcast *mcast, *tmcast; + LIST_HEAD(remove_list); + unsigned long flags; + + ipoib_dbg_mcast(priv, "restarting multicast task\n"); + + ipoib_mcast_stop_thread(dev); + + spin_lock_irqsave(&priv->lock, flags); + + /* + * Unfortunately, the networking core only gives us a list of all of + * the multicast hardware addresses. We need to figure out which ones + * are new and which ones have been removed + */ + + /* Clear out the found flag */ + list_for_each_entry(mcast, &priv->multicast_list, list) + clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + + /* Mark all of the entries that are found or don't exist */ + for (mclist = dev->mc_list; mclist; mclist = mclist->next) { + union ib_gid mgid; + + memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid); + + /* Add in the P_Key */ + mgid.raw[4] = (priv->pkey >> 8) & 0xff; + mgid.raw[5] = priv->pkey & 0xff; + + mcast = __ipoib_mcast_find(dev, &mgid); + if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + struct ipoib_mcast *nmcast; + + /* Not found or send-only group, let's add a new entry */ + ipoib_dbg_mcast(priv, "adding multicast entry for mgid " + IPOIB_GID_FMT "\n", IPOIB_GID_ARG(mgid)); + + nmcast = ipoib_mcast_alloc(dev, 0); + if (!nmcast) { + ipoib_warn(priv, "unable to allocate memory for multicast structure\n"); + continue; + } + + set_bit(IPOIB_MCAST_FLAG_FOUND, &nmcast->flags); + + nmcast->mcmember.mgid = mgid; + + if (mcast) { + /* Destroy the send only entry */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + + rb_replace_node(&mcast->rb_node, + &nmcast->rb_node, + &priv->multicast_tree); + } else + __ipoib_mcast_add(dev, nmcast); + + list_add_tail(&nmcast->list, &priv->multicast_list); + } + + if (mcast) + set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); + } + + /* Remove all of the entries don't exist anymore */ + list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { + if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && + !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { + ipoib_dbg_mcast(priv, "deleting multicast group " IPOIB_GID_FMT "\n", + IPOIB_GID_ARG(mcast->mcmember.mgid)); + + rb_erase(&mcast->rb_node, &priv->multicast_tree); + + /* Move to the remove list */ + list_del(&mcast->list); + list_add_tail(&mcast->list, &remove_list); + } + } + spin_unlock_irqrestore(&priv->lock, flags); + + /* We have to cancel outside of the spinlock */ + list_for_each_entry(mcast, &remove_list, list) { + ipoib_mcast_leave(mcast->dev, mcast); + ipoib_mcast_free(mcast); + } + + if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) + ipoib_mcast_start_thread(dev); +} + +struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev) +{ + struct ipoib_mcast_iter *iter; + + iter = kmalloc(sizeof *iter, GFP_KERNEL); + if (!iter) + return NULL; + + iter->dev = dev; + memset(iter->mgid.raw, 0, sizeof iter->mgid); + + if (ipoib_mcast_iter_next(iter)) { + ipoib_mcast_iter_free(iter); + return NULL; + } + + return iter; +} + +void ipoib_mcast_iter_free(struct ipoib_mcast_iter *iter) +{ + kfree(iter); +} + +int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter) +{ + struct ipoib_dev_priv *priv = netdev_priv(iter->dev); + struct rb_node *n; + struct ipoib_mcast *mcast; + int ret = 1; + + spin_lock_irq(&priv->lock); + + n = rb_first(&priv->multicast_tree); + + while (n) { + mcast = rb_entry(n, struct ipoib_mcast, rb_node); + + if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, + sizeof (union ib_gid)) < 0) { + iter->mgid = mcast->mcmember.mgid; + iter->created = mcast->created; + iter->queuelen = skb_queue_len(&mcast->pkt_queue); + iter->complete = !!mcast->ah; + iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); + + ret = 0; + + break; + } + + n = rb_next(n); + } + + spin_unlock_irq(&priv->lock); + + return ret; +} + +void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter, + union ib_gid *mgid, + unsigned long *created, + unsigned int *queuelen, + unsigned int *complete, + unsigned int *send_only) +{ + *mgid = iter->mgid; + *created = iter->created; + *queuelen = iter->queuelen; + *complete = iter->complete; + *send_only = iter->send_only; +} --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_proto.h 2004-11-23 08:10:22.978174248 -0800 @@ -0,0 +1,37 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_proto.h 1254 2004-11-17 17:19:12Z roland $ + */ + +#ifndef _IPOIB_PROTO_H +#define _IPOIB_PROTO_H + +#include +#include + +/* + * Public functions + */ + +int ipoib_device_handle(struct net_device *dev, struct ib_device **ca, + u8 *port_num, union ib_gid *gid, u16 *pkey); + +#endif /* _IPOIB_PROTO_H */ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_verbs.c 2004-11-23 08:10:23.018168351 -0800 @@ -0,0 +1,248 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_verbs.c 1262 2004-11-18 17:38:36Z roland $ + */ + +#include + +#include "ipoib.h" + +int ipoib_mcast_attach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_attr *qp_attr; + int attr_mask; + int ret; + u16 pkey_index; + + ret = -ENOMEM; + qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL); + if (!qp_attr) + goto out; + + if (ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index)) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + ret = -ENXIO; + goto out; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + /* set correct QKey for QP */ + qp_attr->qkey = priv->qkey; + attr_mask = IB_QP_QKEY; + ret = ib_modify_qp(priv->qp, qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP, ret = %d\n", ret); + goto out; + } + + /* attach QP to multicast group */ + down(&priv->mcast_mutex); + ret = ib_attach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "failed to attach to multicast group, ret = %d\n", ret); + +out: + kfree(qp_attr); + return ret; +} + +int ipoib_mcast_detach(struct net_device *dev, u16 mlid, union ib_gid *mgid) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + + down(&priv->mcast_mutex); + ret = ib_detach_mcast(priv->qp, mgid, mlid); + up(&priv->mcast_mutex); + if (ret) + ipoib_warn(priv, "ib_detach_mcast failed (result = %d)\n", ret); + + return ret; +} + +int ipoib_qp_create(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + int ret; + u16 pkey_index; + struct ib_qp_attr qp_attr; + int attr_mask; + + /* + * Search through the port P_Key table for the requested pkey value. + * The port has to be assigned to the respective IB partition in + * advance. + */ + ret = ib_cached_pkey_find(priv->ca, priv->port, priv->pkey, &pkey_index); + if (ret) { + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + return ret; + } + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + + qp_attr.qp_state = IB_QPS_INIT; + qp_attr.qkey = 0; + qp_attr.port_num = priv->port; + qp_attr.pkey_index = pkey_index; + attr_mask = + IB_QP_QKEY | + IB_QP_PORT | + IB_QP_PKEY_INDEX | + IB_QP_STATE; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to init, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTR; + /* Can't set this in a INIT->RTR transition */ + attr_mask &= ~IB_QP_PORT; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTR, ret = %d\n", ret); + goto out_fail; + } + + qp_attr.qp_state = IB_QPS_RTS; + qp_attr.sq_psn = 0; + attr_mask |= IB_QP_SQ_PSN; + attr_mask &= ~IB_QP_PKEY_INDEX; + ret = ib_modify_qp(priv->qp, &qp_attr, attr_mask); + if (ret) { + ipoib_warn(priv, "failed to modify QP to RTS, ret = %d\n", ret); + goto out_fail; + } + + return 0; + +out_fail: + ib_destroy_qp(priv->qp); + priv->qp = NULL; + + return -EINVAL; +} + +int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct ib_qp_init_attr init_attr = { + .cap = { + .max_send_wr = IPOIB_TX_RING_SIZE, + .max_recv_wr = IPOIB_RX_RING_SIZE, + .max_send_sge = 1, + .max_recv_sge = 1 + }, + .sq_sig_type = IB_SIGNAL_ALL_WR, + .rq_sig_type = IB_SIGNAL_ALL_WR, + .qp_type = IB_QPT_UD + }; + + priv->pd = ib_alloc_pd(priv->ca); + if (IS_ERR(priv->pd)) { + printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); + return -ENODEV; + } + + priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, + IPOIB_TX_RING_SIZE + IPOIB_RX_RING_SIZE + 1); + if (IS_ERR(priv->cq)) { + printk(KERN_WARNING "%s: failed to create CQ\n", ca->name); + goto out_free_pd; + } + + if (ib_req_notify_cq(priv->cq, IB_CQ_NEXT_COMP)) + goto out_free_cq; + + priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(priv->mr)) { + printk(KERN_WARNING "%s: ib_reg_phys_mr failed\n", ca->name); + goto out_free_cq; + } + + init_attr.send_cq = priv->cq; + init_attr.recv_cq = priv->cq, + + priv->qp = ib_create_qp(priv->pd, &init_attr); + if (IS_ERR(priv->qp)) { + printk(KERN_WARNING "%s: failed to create QP\n", ca->name); + goto out_free_mr; + } + + priv->dev->dev_addr[1] = (priv->qp->qp_num >> 16) & 0xff; + priv->dev->dev_addr[2] = (priv->qp->qp_num >> 8) & 0xff; + priv->dev->dev_addr[3] = (priv->qp->qp_num ) & 0xff; + + return 0; + +out_free_mr: + ib_dereg_mr(priv->mr); + +out_free_cq: + ib_destroy_cq(priv->cq); + +out_free_pd: + ib_dealloc_pd(priv->pd); + return -ENODEV; +} + +void ipoib_transport_dev_cleanup(struct net_device *dev) +{ + struct ipoib_dev_priv *priv = netdev_priv(dev); + + if (priv->qp) { + if (ib_destroy_qp(priv->qp)) + ipoib_warn(priv, "ib_qp_destroy failed\n"); + + priv->qp = NULL; + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); + } + + if (ib_dereg_mr(priv->mr)) + ipoib_warn(priv, "ib_dereg_mr failed\n"); + + if (ib_destroy_cq(priv->cq)) + ipoib_warn(priv, "ib_cq_destroy failed\n"); + + if (ib_dealloc_pd(priv->pd)) + ipoib_warn(priv, "ib_dealloc_pd failed\n"); +} + +void ipoib_event(struct ib_event_handler *handler, + struct ib_event *record) +{ + struct ipoib_dev_priv *priv = + container_of(handler, struct ipoib_dev_priv, event_handler); + + if (record->event == IB_EVENT_PORT_ACTIVE) { + ipoib_dbg(priv, "Port active event\n"); + schedule_work(&priv->flush_task); + } +} + +/* + Local Variables: + c-file-style: "linux" + indent-tabs-mode: t + End: +*/ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-bk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c 2004-11-23 08:10:23.043164665 -0800 @@ -0,0 +1,166 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available at + * , or the OpenIB.org BSD + * license, available in the LICENSE.TXT file accompanying this + * software. These details are also available at + * . + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright (c) 2004 Topspin Communications. All rights reserved. + * + * $Id: ipoib_vlan.c 1271 2004-11-18 22:11:29Z roland $ + */ + +#include +#include + +#include +#include +#include + +#include + +#include "ipoib.h" + +static ssize_t show_parent(struct class_device *class_dev, char *buf) +{ + struct net_device *dev = + container_of(class_dev, struct net_device, class_dev); + struct ipoib_dev_priv *priv = netdev_priv(dev); + + return sprintf(buf, "%s\n", priv->parent->name); +} +static CLASS_DEVICE_ATTR(parent, S_IRUGO, show_parent, NULL); + +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv; + char intf_name[IFNAMSIZ]; + int result; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + down(&ppriv->vlan_mutex); + + /* + * First ensure this isn't a duplicate. We check the parent device and + * then all of the child interfaces to make sure the Pkey doesn't match. + */ + if (ppriv->pkey == pkey) { + result = -ENOTUNIQ; + goto err; + } + + list_for_each_entry(priv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + result = -ENOTUNIQ; + goto err; + } + } + + snprintf(intf_name, sizeof intf_name, "%s.%04x", + ppriv->dev->name, pkey); + priv = ipoib_intf_alloc(intf_name); + if (!priv) { + result = -ENOMEM; + goto err; + } + + set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); + + priv->pkey = pkey; + + memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN); + priv->dev->broadcast[8] = pkey >> 8; + priv->dev->broadcast[9] = pkey & 0xff; + + result = ipoib_dev_init(priv->dev, ppriv->ca, ppriv->port); + if (result < 0) { + ipoib_warn(ppriv, "failed to initialize subinterface: " + "device %s, port %d", + ppriv->ca->name, ppriv->port); + goto device_init_failed; + } + + result = register_netdev(priv->dev); + if (result) { + ipoib_warn(priv, "failed to initialize; error %i", result); + goto register_failed; + } + + priv->parent = ppriv->dev; + + if (ipoib_create_debug_file(priv->dev)) + goto debug_failed; + + if (ipoib_add_pkey_attr(priv->dev)) + goto sysfs_failed; + + if (class_device_create_file(&priv->dev->class_dev, + &class_device_attr_parent)) + goto sysfs_failed; + + list_add_tail(&priv->list, &ppriv->child_intfs); + + up(&ppriv->vlan_mutex); + + return 0; + +sysfs_failed: + ipoib_delete_debug_file(priv->dev); + +debug_failed: + unregister_netdev(priv->dev); + +register_failed: + ipoib_dev_cleanup(priv->dev); + +device_init_failed: + free_netdev(priv->dev); + +err: + up(&ppriv->vlan_mutex); + return result; +} + +int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) +{ + struct ipoib_dev_priv *ppriv, *priv, *tpriv; + int ret = -ENOENT; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + down(&ppriv->vlan_mutex); + list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); + + list_del(&priv->list); + + kfree(priv); + + ret = 0; + break; + } + } + up(&ppriv->vlan_mutex); + + return ret; +} From Brian.Haley@hp.com Tue Nov 23 10:10:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 10:12:15 -0800 (PST) Received: from ztxmail04.ztx.compaq.com (ztxmail04.ztx.compaq.com [161.114.1.208]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANIAg4t005243 for ; Tue, 23 Nov 2004 10:10:43 -0800 Received: from mailrelay01.cce.cpqcorp.net (mailrelay01.cce.cpqcorp.net [16.47.68.171]) by ztxmail04.ztx.compaq.com (Postfix) with ESMTP id F14EBF63; Tue, 23 Nov 2004 12:10:15 -0600 (CST) Received: from kitche.zk3.dec.com (kitche2.zk3.dec.com [16.140.160.162]) by mailrelay01.cce.cpqcorp.net (Postfix) with ESMTP id 8355054DB; Tue, 23 Nov 2004 12:10:15 -0600 (CST) Received: from [127.0.0.1] by kitche.zk3.dec.com (8.9.3/1.1.27.5/27Oct00-1235PM) id NAA0001186145; Tue, 23 Nov 2004 13:10:14 -0500 (EST) Message-ID: <41A37CD4.3030503@hp.com> Date: Tue, 23 Nov 2004 13:09:24 -0500 From: Brian Haley Organization: HP Linux and Open Source Lab User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910 X-Accept-Language: en-us, en MIME-Version: 1.0 To: yoshfuji@linux-ipv6.org Cc: davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [BK PATCH] [IPV6] Multiple locking fixes/improvements References: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> In-Reply-To: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-archive-position: 12145 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Brian.Haley@hp.com Precedence: bulk X-list: netdev YOSHIFUJI Hideaki / wrote: > ChangeSet@1.2232, 2004-11-23 11:52:57+09:00, yoshfuji@linux-ipv6.org > [IPV6] Fix a race when dad completed during shutting down its owner interface. > +static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) > +{ > + read_lock_bh(&addrconf_lock); > + if (ifp->idev->dead) > + goto out; > + __ipv6_ifa_notify(event, ifp); > +out: > + read_unlock_bh(&addrconf_lock); > } Not to nitpick, but this is just easier to read: +static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) +{ + read_lock_bh(&addrconf_lock); + if (!ifp->idev->dead) + __ipv6_ifa_notify(event, ifp); + read_unlock_bh(&addrconf_lock); } -Brian From jason.mcmullan@timesys.com Tue Nov 23 10:18:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 10:18:35 -0800 (PST) Received: from exchange.timesys.com (mail.timesys.com [65.117.135.102]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANIIRf6005634 for ; Tue, 23 Nov 2004 10:18:28 -0800 Received: from jmcmullan by owa.timesys.com; 23 Nov 2004 13:18:01 -0500 Subject: Re: [PATCH] MII bus API for PHY devices From: Jason McMullan To: Andy Fleming Cc: Benjamin Herrenschmidt , Netdev In-Reply-To: References: <069B6F33-341C-11D9-9652-000393DBC2E8@freescale.com> <9B0D9272-398A-11D9-96F6-000393C30512@freescale.com> <1100820391.25521.14.camel@gaston> <97DA0EF0-3A70-11D9-B023-000393C30512@freescale.com> <1100904184.3856.46.camel@gaston> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Tue, 23 Nov 2004 13:18:01 -0500 Message-Id: <1101233881.16246.2.camel@jmcmullan> Mime-Version: 1.0 X-Mailer: Evolution 2.0.1-1mdk X-archive-position: 12146 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jason.mcmullan@timesys.com Precedence: bulk X-list: netdev I've added pluggable PHY support modules and a bitbanger MII bus framework. New patch at: http://www.evillabs.net/~gus/patches/driver-mii-bus.patch RPX/EP8260 MII bus example for bit-banger: http://www.evillabs.net/~gus/patches/rpx8260_mii.c -- Jason McMullan From kaber@trash.net Tue Nov 23 10:19:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 10:19:25 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANIJJpw005857 for ; Tue, 23 Nov 2004 10:19:20 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CWfEO-000427-K2; Tue, 23 Nov 2004 19:17:36 +0100 Message-ID: <41A37EC0.8010901@trash.net> Date: Tue, 23 Nov 2004 19:17:36 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Herbert Xu CC: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets References: <20041123084225.GA3514@gondor.apana.org.au> In-Reply-To: <20041123084225.GA3514@gondor.apana.org.au> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12147 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Herbert Xu wrote: >Hi: > >I found out today that packets generated by ipt_REJECT weren't protected >by IPsec. This is because the proto field isn't set at all in the flow >supplied to ip_route_output_key. > >The following patch sets that as well as protocol-specific fields so >that the appropriate IPsec policy can be applied. > > The patch doesn't handle tcp resets sent in response to a forwarded packet. I'll send a patch later tonight. Regards Patrick From yoshfuji@linux-ipv6.org Tue Nov 23 10:36:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 10:36:53 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANIakrK006514 for ; Tue, 23 Nov 2004 10:36:47 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 57C1C33CE5; Wed, 24 Nov 2004 03:37:45 +0900 (JST) Date: Tue, 23 Nov 2004 13:37:44 -0500 (EST) Message-Id: <20041123.133744.48357645.yoshfuji@linux-ipv6.org> To: Brian.Haley@hp.com Cc: davem@davemloft.net, netdev@oss.sgi.com Subject: Re: [BK PATCH] [IPV6] Multiple locking fixes/improvements From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <41A37CD4.3030503@hp.com> References: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> <41A37CD4.3030503@hp.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12148 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <41A37CD4.3030503@hp.com> (at Tue, 23 Nov 2004 13:09:24 -0500), Brian Haley says: > Not to nitpick, but this is just easier to read: > > +static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) > +{ > + read_lock_bh(&addrconf_lock); > + if (!ifp->idev->dead) > + __ipv6_ifa_notify(event, ifp); > + read_unlock_bh(&addrconf_lock); > } agreed and added one changeset. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/24 03:34:53+09:00 Brian.Haley@hp.com # [IPV6] improve ipv6_ifa_notify() readability. # # net/ipv6/addrconf.c # 2004/11/24 03:34:41+09:00 Brian.Haley@hp.com +2 -4 # [IPV6] improve ipv6_ifa_notify() readability. # diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c --- a/net/ipv6/addrconf.c 2004-11-24 03:35:33 +09:00 +++ b/net/ipv6/addrconf.c 2004-11-24 03:35:33 +09:00 @@ -3017,10 +3017,8 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) { read_lock_bh(&addrconf_lock); - if (ifp->idev->dead) - goto out; - __ipv6_ifa_notify(event, ifp); -out: + if (likely(ifp->idev->dead == 0)) + __ipv6_ifa_notify(event, ifp); read_unlock_bh(&addrconf_lock); } -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From romieu@fr.zoreil.com Tue Nov 23 11:50:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 11:50:06 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANJntcS009105 for ; Tue, 23 Nov 2004 11:50:01 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iANJlfvr032253; Tue, 23 Nov 2004 20:47:41 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iANJleSG032252; Tue, 23 Nov 2004 20:47:40 +0100 Date: Tue, 23 Nov 2004 20:47:40 +0100 From: Francois Romieu To: Dorn Hetzel Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041123194740.GA32210@electric-eye.fr.zoreil.com> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> <20041123144901.GA19005@lilah.hetzel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041123144901.GA19005@lilah.hetzel.org> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12149 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Dorn Hetzel : [...] [...] [...] [...] [...] [...] [...] [...] [...] > Stacked on these 4 patches and things seem much better :) Did you change the compiler as well ? If yes, it would be nice to know if the system performs correctly when built with the previous compiler (feel free to answer #1 only if you are busy :o) ). -- Ueimor From oxymoron@waste.org Tue Nov 23 12:44:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 12:44:40 -0800 (PST) Received: from waste.org (waste.org [209.173.204.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANKiVai013951 for ; Tue, 23 Nov 2004 12:44:36 -0800 Received: from waste.org (localhost [127.0.0.1]) by waste.org (8.12.3/8.12.3/Debian-7.1) with ESMTP id iANKhsDD019105; Tue, 23 Nov 2004 14:43:54 -0600 Received: (from oxymoron@localhost) by waste.org (8.12.3/8.12.3/Debian-7.1) id iANKhrsM019103; Tue, 23 Nov 2004 14:43:53 -0600 Date: Tue, 23 Nov 2004 12:43:53 -0800 From: Matt Mackall To: Con Kolivas Cc: linux , Andrew Morton , netdev@oss.sgi.com, Michael Buesch Subject: Re: [PATCH 1/1] net: Netconsole poll support for 3c509 Message-ID: <20041123204353.GZ2460@waste.org> References: <41A2F565.6050002@kolivas.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A2F565.6050002@kolivas.org> User-Agent: Mutt/1.3.28i X-Virus-Scanned: by amavisd-new X-archive-position: 12150 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mpm@selenic.com Precedence: bulk X-list: netdev On Tue, Nov 23, 2004 at 07:31:33PM +1100, Con Kolivas wrote: > This patch provides poll support to allow netconsole to work with 3c509 > network cards. Looks fine. -- Mathematics is the supreme nostalgia of our time. From herbert@gondor.apana.org.au Tue Nov 23 13:17:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:18:00 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLHo96015154 for ; Tue, 23 Nov 2004 13:17:54 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWi1b-0002y3-00; Wed, 24 Nov 2004 08:16:35 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWi1W-0002YN-00; Wed, 24 Nov 2004 08:16:30 +1100 Date: Wed, 24 Nov 2004 08:16:30 +1100 To: Patrick McHardy Cc: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041123211630.GA9805@gondor.apana.org.au> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A37EC0.8010901@trash.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12152 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Tue, Nov 23, 2004 at 07:17:36PM +0100, Patrick McHardy wrote: > > The patch doesn't handle tcp resets sent in response to a forwarded packet. > I'll send a patch later tonight. Isn't that handled by ip_forward itself? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Tue Nov 23 13:17:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:17:56 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLHkqn015149 for ; Tue, 23 Nov 2004 13:17:48 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWi25-0002yG-00; Wed, 24 Nov 2004 08:17:05 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWi25-0002Z1-00; Wed, 24 Nov 2004 08:17:05 +1100 Date: Wed, 24 Nov 2004 08:17:05 +1100 To: Patrick McHardy Cc: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041123211705.GA9843@gondor.apana.org.au> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041123211630.GA9805@gondor.apana.org.au> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12151 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Wed, Nov 24, 2004 at 08:16:30AM +1100, herbert wrote: > On Tue, Nov 23, 2004 at 07:17:36PM +0100, Patrick McHardy wrote: > > > > The patch doesn't handle tcp resets sent in response to a forwarded packet. > > I'll send a patch later tonight. > > Isn't that handled by ip_forward itself? In fact that's probably the reason why nobody has noticed this bug until now :) -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From hasso@estpak.ee Tue Nov 23 13:23:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:23:32 -0800 (PST) Received: from arena (dream.estpak.ee [194.126.115.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLNMMH015920 for ; Tue, 23 Nov 2004 13:23:27 -0800 Received: from arena ([127.0.0.1] ident=hasso) by arena with esmtp (Exim 3.36 #1 (Debian)) id 1CWi7e-0000IW-00 for ; Tue, 23 Nov 2004 23:22:50 +0200 From: Hasso Tepper To: netdev@oss.sgi.com Subject: IPv6 and netlink Date: Tue, 23 Nov 2004 23:22:50 +0200 User-Agent: KMail/1.7.1 Organization: Elion Enterprises Ltd. MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411232322.50083.hasso@estpak.ee> X-archive-position: 12153 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hasso@estpak.ee Precedence: bulk X-list: netdev While debugging IPv6 RIB in Quagga routing software I discovered some issues with kernel rtnetlink messages. 1) RTM_NEWROUTE message with prefix ff00::/8 (if interface goes up or down) is sent with rtm_type set to RTN_UNICAST. It's multicast route, so why not RTN_MULTICAST? Is it bug? 2) If address is added to the interface, route is created by kernel to route prefix to the intarface. In IPv4 these routes have rtm_protocol set to RTPROT_KERNEL if announced it via rtnetlink, but that's not the case with IPv6. It doesn't matter if address is added by the user or it's the link local address (fe80::/64 route). Is it intentional or bug? 3) Not really rtnetlink related, but if this address is removed from interface, route created by kernel (when address was added) isn't removed from table. Is it intentional? -- Hasso Tepper Elion Enterprises Ltd. WAN administrator From nobody@adrenaline.netsender.net Tue Nov 23 13:30:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:31:00 -0800 (PST) Received: from adrenaline.netsender.net (ns3.netsender.net [216.66.21.12]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLUqE2016744 for ; Tue, 23 Nov 2004 13:30:54 -0800 Received: from nobody by adrenaline.netsender.net with local (Exim 4.43) id 1CWiFF-0007JK-1H for netdev@oss.sgi.com; Tue, 23 Nov 2004 15:30:41 -0600 To: netdev@oss.sgi.com Subject: http://www.adhost.gr From: "ADHOST" MIME-Version: 1.0 X-Mailer: PHPlist v2.8.11 X-MessageId: 12 X-ListMember: netdev@oss.sgi.com Precedence: bulk Content-Type: text/plain; charset="greek" Content-Transfer-Encoding: 7bit Message-Id: Date: Tue, 23 Nov 2004 15:30:41 -0600 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - adrenaline.netsender.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [99 32003] / [47 12] X-AntiAbuse: Sender Address Domain - adrenaline.netsender.net X-Source: X-Source-Args: /usr/local/apache/bin/httpd -DSSL X-Source-Dir: adhost.gr:/public_html/list/admin X-archive-position: 12154 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: noreply@adhost.gr Precedence: bulk X-list: netdev WEB HOSTING MONO ME 4.5 EURO TO MHNA 150 MB POP3 Email : 200 bandwidth: 2GB Sub domains : 100 FTP : 1000 MySQL Database : 5 MONO ME 4.5 EURO TO MHNA!! http://www.adhost.gr {http://www.adhost.gr} -- To unsubscribe from this list send e-mail to delete@adhost.gr -- Powered by PHPlist, www.phplist.com -- From davem@davemloft.net Tue Nov 23 13:43:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:43:44 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLhcLG017463 for ; Tue, 23 Nov 2004 13:43:38 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWiR8-00041z-00; Tue, 23 Nov 2004 13:42:58 -0800 Date: Tue, 23 Nov 2004 13:42:57 -0800 From: "David S. Miller" To: Hasso Tepper Cc: netdev@oss.sgi.com Subject: Re: IPv6 and netlink Message-Id: <20041123134257.5c45f5fc.davem@davemloft.net> In-Reply-To: <200411232322.50083.hasso@estpak.ee> References: <200411232322.50083.hasso@estpak.ee> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12155 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 23 Nov 2004 23:22:50 +0200 Hasso Tepper wrote: > While debugging IPv6 RIB in Quagga routing software I discovered some issues > with kernel rtnetlink messages. > > 1) RTM_NEWROUTE message with prefix ff00::/8 (if interface goes up or down) > is sent with rtm_type set to RTN_UNICAST. It's multicast route, so why not > RTN_MULTICAST? Is it bug? What kernel version? I remember fixing this bug. We should not be emitting rtnetlink messages for these any more. > 2) If address is added to the interface, route is created by kernel to route > prefix to the intarface. In IPv4 these routes have rtm_protocol set to > RTPROT_KERNEL if announced it via rtnetlink, but that's not the case with > IPv6. It doesn't matter if address is added by the user or it's the link > local address (fe80::/64 route). Is it intentional or bug? > > 3) Not really rtnetlink related, but if this address is removed from > interface, route created by kernel (when address was added) isn't removed > from table. Is it intentional? I remember fixing these problems too at some point. In net/ipv6/route.c:rt6_fill_node(), if the RTF_ADDRCONF flag is set on the route (which is will be set for link-local address addition routes done by the addrconf layer) then we will set RTPROT_KERNEL on it. For every address deleted on an ipv6 interface we invoke net/ipv6/addrconf.c:ipv6_ifa_notify() with event set to RTM_DELADDR. That causes ip6_del_rt() to be invoked for that link-local address's route. In the end, I think you're just using an ancient kernel which didn't have these bug fixes added. From kaber@trash.net Tue Nov 23 13:45:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 13:45:46 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANLjeg3017834 for ; Tue, 23 Nov 2004 13:45:41 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CWiSf-0002hM-8D; Tue, 23 Nov 2004 22:44:33 +0100 Message-ID: <41A3AF41.4010700@trash.net> Date: Tue, 23 Nov 2004 22:44:33 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Herbert Xu CC: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> In-Reply-To: <20041123211630.GA9805@gondor.apana.org.au> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12156 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Herbert Xu wrote: >On Tue, Nov 23, 2004 at 07:17:36PM +0100, Patrick McHardy wrote: > > >>The patch doesn't handle tcp resets sent in response to a forwarded packet. >>I'll send a patch later tonight. >> >> > >Isn't that handled by ip_forward itself? > > No. ip_forward handles the original packet, not the packet generated by ipt_REJECT. RSTs generated in NF_IP_FORWARD are routed using ip_route_input because they have a non-local source, so xfrm_route_forward or xfrm_lookup needs to be called for them. Regards Patrick From herbert@gondor.apana.org.au Tue Nov 23 14:20:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 14:20:29 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANMKKov019790 for ; Tue, 23 Nov 2004 14:20:21 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWj08-0003ld-00; Wed, 24 Nov 2004 09:19:08 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWj01-0002qY-00; Wed, 24 Nov 2004 09:19:01 +1100 Date: Wed, 24 Nov 2004 09:19:01 +1100 To: Patrick McHardy Cc: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041123221900.GA10099@gondor.apana.org.au> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> <41A3AF41.4010700@trash.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="mP3DRpeJDSE+ciuQ" Content-Disposition: inline In-Reply-To: <41A3AF41.4010700@trash.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12157 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --mP3DRpeJDSE+ciuQ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Nov 23, 2004 at 10:44:33PM +0100, Patrick McHardy wrote: > > No. ip_forward handles the original packet, not the packet generated > by ipt_REJECT. RSTs generated in NF_IP_FORWARD are routed using > ip_route_input because they have a non-local source, so xfrm_route_forward > or xfrm_lookup needs to be called for them. You're absolutely right. How about this patch then? Signed-off-by: Herbert Xu Now I'm puzzled as to how I haven't noticed this behaviour before. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --mP3DRpeJDSE+ciuQ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/ipv4/netfilter/ipt_REJECT.c 1.32 vs edited ===== --- 1.32/net/ipv4/netfilter/ipt_REJECT.c 2004-11-14 00:41:07 +11:00 +++ edited/net/ipv4/netfilter/ipt_REJECT.c 2004-11-24 09:18:19 +11:00 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #ifdef CONFIG_BRIDGE_NETFILTER @@ -38,7 +39,8 @@ #define DEBUGP(format, args...) #endif -static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) +static inline struct rtable *route_reverse(struct sk_buff *skb, + struct tcphdr *tcph, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; @@ -75,6 +77,10 @@ dst_release(&rt->u.dst); rt = (struct rtable *)skb->dst; skb->dst = odst; + + fl.nl_u.ip4_u.daddr = iph->saddr; + fl.nl_u.ip4_u.saddr = iph->daddr; + fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); } if (rt->u.dst.error) { @@ -82,6 +88,15 @@ rt = NULL; } + fl.proto = IPPROTO_TCP; + fl.fl_ip_sport = tcph->dest; + fl.fl_ip_dport = tcph->source; + + if (xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0)) { + dst_release(&rt->u.dst); + return NULL; + } + return rt; } @@ -110,7 +125,7 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, hook)) == NULL) + if ((rt = route_reverse(oldskb, oth, hook)) == NULL) return; hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); @@ -282,10 +297,23 @@ tos = (iph->tos & IPTOS_TOS_MASK) | IPTOS_PREC_INTERNETCONTROL; { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = skb_in->nh.iph->saddr, - .saddr = saddr, - .tos = RT_TOS(tos) } } }; + struct flowi fl = { + .nl_u = { + .ip4_u = { + .daddr = skb_in->nh.iph->saddr, + .saddr = saddr, + .tos = RT_TOS(tos) + } + }, + .proto = IPPROTO_ICMP, + .uli_u = { + .icmpt = { + .type = ICMP_DEST_UNREACH, + .code = code + } + } + }; + if (ip_route_output_key(&rt, &fl)) return; } --mP3DRpeJDSE+ciuQ-- From ganesh.venkatesan@intel.com Tue Nov 23 14:23:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 14:23:33 -0800 (PST) Received: from hermes.jf.intel.com (fmr05.intel.com [134.134.136.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANMNMtH020182 for ; Tue, 23 Nov 2004 14:23:27 -0800 Received: from orsfmr100.jf.intel.com (orsfmr100.jf.intel.com [10.7.209.16]) by hermes.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id iANMRWgh024203; Tue, 23 Nov 2004 22:27:32 GMT Received: from orsmsxvs041.jf.intel.com (orsmsxvs041.jf.intel.com [192.168.65.54]) by orsfmr100.jf.intel.com (8.12.10/8.12.10/d: major-inner.mc,v 1.2 2004/09/17 18:05:01 root Exp $) with SMTP id iANMMNI9005541; Tue, 23 Nov 2004 22:22:45 GMT Received: from orsmsx331.amr.corp.intel.com ([192.168.65.56]) by orsmsxvs041.jf.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004112314224513660 ; Tue, 23 Nov 2004 14:22:45 -0800 Received: from orsmsx408.amr.corp.intel.com ([192.168.65.52]) by orsmsx331.amr.corp.intel.com with Microsoft SMTPSVC(6.0.3790.0); Tue, 23 Nov 2004 14:22:45 -0800 X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Subject: RE: [patch] e100: early reset fix Date: Tue, 23 Nov 2004 14:22:43 -0800 Message-ID: <468F3FDA28AA87429AD807992E22D07E0363FCF7@orsmsx408> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [patch] e100: early reset fix Thread-Index: AcTQ/qemUW0fIlIjSo6RHSLMmb51fAArAflA From: "Venkatesan, Ganesh" To: "Andrew Morton" , Cc: "Ronciak, John" , "Brandeburg, Jesse" , "Jeff Garzik" , X-OriginalArrivalTime: 23 Nov 2004 22:22:45.0150 (UTC) FILETIME=[F4988BE0:01C4D1AA] X-Scanned-By: MIMEDefang 2.44 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iANMNMtH020182 X-archive-position: 12158 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ganesh.venkatesan@intel.com Precedence: bulk X-list: netdev Andy: Please forward this patch to Linus for inclusion into 2.6.10. We missed our internal driver release window and will have to wait another ~ 6 weeks before we release another version of e100. Thanks, Ganesh. >-----Original Message----- >From: Andrew Morton [mailto:akpm@osdl.org] >Sent: Monday, November 22, 2004 5:42 PM >To: sfeldma@pobox.com >Cc: Ronciak, John; Venkatesan, Ganesh; Brandeburg, Jesse; Jeff Garzik >Subject: Re: [patch] e100: early reset fix > >Scott Feldman wrote: >> >> On Mon, 2004-11-22 at 01:52, Andrew Morton wrote: >> > Gents, what do we think of the below fix? >> >> This keeps just one reset, and adds a comment so someone doesn't >> rearrange things later. >> >> Signed-off-by: Scott Feldman > >It works, of course. You want me to feed it into Linus for 2.6.10? > >> -------------- >> >> --- linux-2.6.10-rc2/drivers/net/e100.c 2004-11-22 11:15:50.180163536 - >0800 >> +++ linux-2.6.10-rc2/drivers/net/e100.c.mod 2004-11-22 >11:41:23.893003744 -0800 >> @@ -2204,8 +2204,6 @@ static int __devinit e100_probe(struct p >> goto err_out_disable_pdev; >> } >> >> - pci_set_master(pdev); >> - >> if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) { >> DPRINTK(PROBE, ERR, "No usable DMA configuration, >aborting.\n"); >> goto err_out_free_res; >> @@ -2226,6 +2224,15 @@ static int __devinit e100_probe(struct p >> else >> nic->flags &= ~ich; >> >> + e100_get_defaults(nic); >> + >> + /* Reset the device before pci_set_master() in case device is in some >> + * funky state and has an interrupt pending - hint: we don't have the >> + * interrupt handler registered yet. */ >> + e100_hw_reset(nic); >> + >> + pci_set_master(pdev); >> + >> spin_lock_init(&nic->cb_lock); >> spin_lock_init(&nic->cmd_lock); >> >> @@ -2241,8 +2248,6 @@ static int __devinit e100_probe(struct p >> goto err_out_iounmap; >> } >> >> - e100_get_defaults(nic); >> - e100_hw_reset(nic); >> e100_phy_init(nic); >> >> if((err = e100_eeprom_load(nic))) From magnus.damm@gmail.com Tue Nov 23 14:51:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 14:51:13 -0800 (PST) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.205]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANMp1PR021146 for ; Tue, 23 Nov 2004 14:51:06 -0800 Received: by wproxy.gmail.com with SMTP id 40so15949wri for ; Tue, 23 Nov 2004 14:50:37 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:mime-version:content-type; b=uegXVEB2nxv5u9A72NzmdThqFdzpoLz/bpbz2lF3+cDBKXBykEWYUbkJbzQ4I6tBwYr+rdHjbxUK4dD4JGZjKWJhUrVLceQJy7hQgu2NHNUi6iCsXZC0S2wA8WIaZFZCdcuP3MNX0RHx5TXK+0H7io0kaKL0L+afZ+xTuQW6E70= Received: by 10.54.19.75 with SMTP id 75mr70343wrs; Tue, 23 Nov 2004 14:50:36 -0800 (PST) Received: by 10.54.17.4 with HTTP; Tue, 23 Nov 2004 14:50:35 -0800 (PST) Message-ID: Date: Tue, 23 Nov 2004 23:50:35 +0100 From: Magnus Damm Reply-To: Magnus Damm To: netdev@oss.sgi.com Subject: [PATCH] ipconfig schedule fix Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_740_1840492.1101250235964" X-archive-position: 12159 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: magnus.damm@gmail.com Precedence: bulk X-list: netdev ------=_Part_740_1840492.1101250235964 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, This simple patch makes the DHCP/BOOTP/RARP code sleep with schedule_timeout() instead of hogging the cpu with cpu_relax() in a loop. This comes handy when a guest kernel is booted inside QEMU. Without the patch, the host operating system will consume cpu time busy waiting. Thanks, / magnus ------=_Part_740_1840492.1101250235964 Content-Type: text/x-patch; name="linux-2.6.10-rc2-mm3-ipconfig_schedule.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="linux-2.6.10-rc2-mm3-ipconfig_schedule.patch" --- linux-2.6.10-rc2-mm3/net/ipv4/ipconfig.c=092004-10-18 23:53:08.00000000= 0 +0200 +++ linux-2.6.10-rc2-mm3-ipconfig_schedule/net/ipv4/ipconfig.c=092004-11-23= 23:21:26.154463880 +0100 @@ -1102,8 +1102,8 @@ =20 =09=09jiff =3D jiffies + (d->next ? CONF_INTER_TIMEOUT : timeout); =09=09while (time_before(jiffies, jiff) && !ic_got_reply) { -=09=09=09barrier(); -=09=09=09cpu_relax(); +=09=09=09set_current_state(TASK_UNINTERRUPTIBLE); +=09=09=09schedule_timeout (1); =09=09} #ifdef IPCONFIG_DHCP =09=09/* DHCP isn't done until we get a DHCPACK. */ @@ -1245,7 +1245,6 @@ =20 static int __init ip_auto_config(void) { -=09unsigned long jiff; =09u32 addr; =20 #ifdef CONFIG_PROC_FS @@ -1260,18 +1259,16 @@ try_try_again: #endif =09/* Give hardware a chance to settle */ -=09jiff =3D jiffies + CONF_PRE_OPEN; -=09while (time_before(jiffies, jiff)) -=09=09cpu_relax(); +=09set_current_state(TASK_UNINTERRUPTIBLE); +=09schedule_timeout (CONF_PRE_OPEN); =20 =09/* Setup all network devices */ =09if (ic_open_devs() < 0) =09=09return -1; =20 =09/* Give drivers a chance to settle */ -=09jiff =3D jiffies + CONF_POST_OPEN; -=09while (time_before(jiffies, jiff)) -=09=09cpu_relax(); +=09set_current_state(TASK_UNINTERRUPTIBLE); +=09schedule_timeout (CONF_POST_OPEN); =20 =09/* =09 * If the config information is insufficient (e.g., our IP address or ------=_Part_740_1840492.1101250235964-- From davem@davemloft.net Tue Nov 23 15:19:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 15:19:45 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANNJXk0022587 for ; Tue, 23 Nov 2004 15:19:34 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWjvz-0004EP-00; Tue, 23 Nov 2004 15:18:55 -0800 Date: Tue, 23 Nov 2004 15:18:55 -0800 From: "David S. Miller" To: Magnus Damm Cc: netdev@oss.sgi.com Subject: Re: [PATCH] ipconfig schedule fix Message-Id: <20041123151855.1864659a.davem@davemloft.net> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12160 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 23 Nov 2004 23:50:35 +0100 Magnus Damm wrote: > This simple patch makes the DHCP/BOOTP/RARP code sleep with > schedule_timeout() instead of hogging the cpu with cpu_relax() in a > loop. This comes handy when a guest kernel is booted inside QEMU. > Without the patch, the host operating system will consume cpu time > busy waiting. There are two similar loops involving CONF_PRE_OPEN and CONF_POST_OPEN, you may wish to hit those while you're at it. From davem@davemloft.net Tue Nov 23 15:50:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 15:51:03 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANNotNg024170 for ; Tue, 23 Nov 2004 15:50:55 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWkLR-0004Hj-00; Tue, 23 Nov 2004 15:45:13 -0800 Date: Tue, 23 Nov 2004 15:45:13 -0800 From: "David S. Miller" To: Magnus Damm Cc: netdev@oss.sgi.com Subject: Re: [PATCH] ipconfig schedule fix Message-Id: <20041123154513.0c950033.davem@davemloft.net> In-Reply-To: References: <20041123151855.1864659a.davem@davemloft.net> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12162 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 24 Nov 2004 00:42:17 +0100 Magnus Damm wrote: > On Tue, 23 Nov 2004 15:18:55 -0800, David S. Miller wrote: > > On Tue, 23 Nov 2004 23:50:35 +0100 > > > > > > Magnus Damm wrote: > > > > > This simple patch makes the DHCP/BOOTP/RARP code sleep with > > > schedule_timeout() instead of hogging the cpu with cpu_relax() in a > > > loop. This comes handy when a guest kernel is booted inside QEMU. > > > Without the patch, the host operating system will consume cpu time > > > busy waiting. > > > > There are two similar loops involving CONF_PRE_OPEN and CONF_POST_OPEN, > > you may wish to hit those while you're at it. > > Huh? You mean _removing_ the timeouts involving CONF_PRE/POST_OPEN? I > thought my patch converted all busy waits into schedule_timeout()... > What am I missing? No, not removing them, but transforming them likewise into schedule_timeout() calls. From kaber@trash.net Tue Nov 23 15:53:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 15:53:58 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iANNrr4e025222 for ; Tue, 23 Nov 2004 15:53:54 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CWkSb-0007Gm-Ff; Wed, 24 Nov 2004 00:52:37 +0100 Message-ID: <41A3CD45.4080802@trash.net> Date: Wed, 24 Nov 2004 00:52:37 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Herbert Xu CC: "David S. Miller" , coreteam@netfilter.org, netdev@oss.sgi.com Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> <41A3AF41.4010700@trash.net> <20041123221900.GA10099@gondor.apana.org.au> In-Reply-To: <20041123221900.GA10099@gondor.apana.org.au> Content-Type: multipart/mixed; boundary="------------080708000609030505000701" X-archive-position: 12163 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------080708000609030505000701 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Herbert Xu wrote: >On Tue, Nov 23, 2004 at 10:44:33PM +0100, Patrick McHardy wrote: > >>No. ip_forward handles the original packet, not the packet generated >>by ipt_REJECT. RSTs generated in NF_IP_FORWARD are routed using >>ip_route_input because they have a non-local source, so xfrm_route_forward >>or xfrm_lookup needs to be called for them. >> > >You're absolutely right. How about this patch then? > I would prefer something like this (based on your patch, untested). Currently ICMP packets are handled different than TCP packets, saddr is set to 0 for them if it is non-local, so they can't be source-routed properly. This patch also uses route_reverse for ICMP packets, properly sets fl->proto for output routed packets and adds a call to xfrm_lookup for input routed packets. Dave, please don't apply yet, I want to test it first. Regards Patrick --------------080708000609030505000701 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" ===== net/ipv4/netfilter/ipt_REJECT.c 1.32 vs edited ===== --- 1.32/net/ipv4/netfilter/ipt_REJECT.c 2004-11-13 14:41:07 +01:00 +++ edited/net/ipv4/netfilter/ipt_REJECT.c 2004-11-24 00:40:21 +01:00 @@ -38,11 +38,11 @@ #define DEBUGP(format, args...) #endif -static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) +static struct rtable * +route_reverse(struct sk_buff *skb, struct flowi *fl, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; - struct flowi fl = {}; struct rtable *rt; /* We don't require ip forwarding to be enabled to be able to @@ -52,34 +52,42 @@ || (skb->nf_bridge && skb->nf_bridge->mask & BRNF_BRIDGED) #endif ) { - fl.nl_u.ip4_u.daddr = iph->saddr; + fl->nl_u.ip4_u.daddr = iph->saddr; if (hook == NF_IP_LOCAL_IN) - fl.nl_u.ip4_u.saddr = iph->daddr; - fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); + fl->nl_u.ip4_u.saddr = iph->daddr; - if (ip_route_output_key(&rt, &fl) != 0) + if (ip_route_output_key(&rt, fl) != 0) return NULL; } else { + u_int8_t proto; + /* non-local src, find valid iif to satisfy * rp-filter when calling ip_route_input. */ - fl.nl_u.ip4_u.daddr = iph->daddr; - if (ip_route_output_key(&rt, &fl) != 0) + proto = fl->proto; + fl->proto = 0; + fl->nl_u.ip4_u.daddr = iph->daddr; + if (ip_route_output_key(&rt, fl) != 0) return NULL; odst = skb->dst; if (ip_route_input(skb, iph->saddr, iph->daddr, - RT_TOS(iph->tos), rt->u.dst.dev) != 0) { + fl->nl_u.ip4_u.tos, rt->u.dst.dev) != 0) { dst_release(&rt->u.dst); return NULL; } dst_release(&rt->u.dst); rt = (struct rtable *)skb->dst; skb->dst = odst; - } - if (rt->u.dst.error) { - dst_release(&rt->u.dst); - rt = NULL; + fl->nl_u.ip4_u.daddr = iph->saddr; + fl->nl_u.ip4_u.saddr = iph->daddr; + fl->proto = proto; + + if (rt->u.dst.error || + xfrm_lookup((struct dst_entry **)&rt, fl, NULL, 0)) { + dst_release(&rt->u.dst); + rt = NULL; + } } return rt; @@ -110,8 +118,24 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, hook)) == NULL) - return; + { + struct flowi fl = { + .nl_u = { + .ip4_u = { + .tos = RT_TOS(oldskb->nh.iph->tos) + } + }, + .proto = IPPROTO_TCP, + .uli_u = { + .ports = { + .sport = oth->dest, + .dport = oth->source + } + } + }; + if ((rt = route_reverse(oldskb, &fl, hook)) == NULL) + return; + } hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); @@ -205,13 +229,12 @@ kfree_skb(nskb); } -static void send_unreach(struct sk_buff *skb_in, int code) +static void send_unreach(struct sk_buff *skb_in, int hook, int code) { struct iphdr *iph; struct udphdr *udph; struct icmphdr *icmph; struct sk_buff *nskb; - u32 saddr; u8 tos; int hh_len, length; struct rtable *rt = (struct rtable*)skb_in->dst; @@ -275,18 +298,24 @@ return; } - saddr = iph->daddr; - if (!(rt->rt_flags & RTCF_LOCAL)) - saddr = 0; - tos = (iph->tos & IPTOS_TOS_MASK) | IPTOS_PREC_INTERNETCONTROL; { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = skb_in->nh.iph->saddr, - .saddr = saddr, - .tos = RT_TOS(tos) } } }; - if (ip_route_output_key(&rt, &fl)) + struct flowi fl = { + .nl_u = { + .ip4_u = { + .tos = RT_TOS(tos) + } + }, + .proto = IPPROTO_ICMP, + .uli_u = { + .icmpt = { + .type = ICMP_DEST_UNREACH, + .code = code + } + } + }; + if ((rt = route_reverse(skb_in, &fl, hook)) == NULL) return; } /* RFC says return as much as we can without exceeding 576 bytes. */ @@ -371,25 +400,25 @@ must return an absolute verdict. --RR */ switch (reject->with) { case IPT_ICMP_NET_UNREACHABLE: - send_unreach(*pskb, ICMP_NET_UNREACH); + send_unreach(*pskb, hooknum, ICMP_NET_UNREACH); break; case IPT_ICMP_HOST_UNREACHABLE: - send_unreach(*pskb, ICMP_HOST_UNREACH); + send_unreach(*pskb, hooknum, ICMP_HOST_UNREACH); break; case IPT_ICMP_PROT_UNREACHABLE: - send_unreach(*pskb, ICMP_PROT_UNREACH); + send_unreach(*pskb, hooknum, ICMP_PROT_UNREACH); break; case IPT_ICMP_PORT_UNREACHABLE: - send_unreach(*pskb, ICMP_PORT_UNREACH); + send_unreach(*pskb, hooknum, ICMP_PORT_UNREACH); break; case IPT_ICMP_NET_PROHIBITED: - send_unreach(*pskb, ICMP_NET_ANO); + send_unreach(*pskb, hooknum, ICMP_NET_ANO); break; case IPT_ICMP_HOST_PROHIBITED: - send_unreach(*pskb, ICMP_HOST_ANO); + send_unreach(*pskb, hooknum, ICMP_HOST_ANO); break; case IPT_ICMP_ADMIN_PROHIBITED: - send_unreach(*pskb, ICMP_PKT_FILTERED); + send_unreach(*pskb, hooknum, ICMP_PKT_FILTERED); break; case IPT_TCP_RESET: send_reset(*pskb, hooknum); --------------080708000609030505000701-- From magnus.damm@gmail.com Tue Nov 23 16:29:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 23 Nov 2004 16:29:47 -0800 (PST) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.204]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAO0TcSI029437 for ; Tue, 23 Nov 2004 16:29:38 -0800 Received: by wproxy.gmail.com with SMTP id 40so19105wri for ; Tue, 23 Nov 2004 16:29:13 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=bIO9wbuyRRkVfeDb5DPq3nigyciV7iCPDKm6uZO3MzbabJNJj5H06hdhhiJzoW2FjWxa70NmcwyomIudX78SUi6jWwB/V1AC+tTd7N6WABWwVs2hgnX1Dk3oe3U5r89rEFKfYtJwV7GCoPpjkpCDdFTrV9X9L7tDifJBN9KhL3k= Received: by 10.54.9.63 with SMTP id 63mr87386wri; Tue, 23 Nov 2004 16:02:33 -0800 (PST) Received: by 10.54.17.4 with HTTP; Tue, 23 Nov 2004 16:02:33 -0800 (PST) Message-ID: Date: Wed, 24 Nov 2004 01:02:33 +0100 From: Magnus Damm Reply-To: Magnus Damm To: "David S. Miller" Subject: Re: [PATCH] ipconfig schedule fix Cc: netdev@oss.sgi.com In-Reply-To: <20041123154513.0c950033.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <20041123151855.1864659a.davem@davemloft.net> <20041123154513.0c950033.davem@davemloft.net> X-archive-position: 12164 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: magnus.damm@gmail.com Precedence: bulk X-list: netdev On Tue, 23 Nov 2004 15:45:13 -0800, David S. Miller wrote: > On Wed, 24 Nov 2004 00:42:17 +0100 > > > Magnus Damm wrote: > > > On Tue, 23 Nov 2004 15:18:55 -0800, David S. Miller wrote: > > > On Tue, 23 Nov 2004 23:50:35 +0100 > > > > > > > > > Magnus Damm wrote: > > > > > > > This simple patch makes the DHCP/BOOTP/RARP code sleep with > > > > schedule_timeout() instead of hogging the cpu with cpu_relax() in a > > > > loop. This comes handy when a guest kernel is booted inside QEMU. > > > > Without the patch, the host operating system will consume cpu time > > > > busy waiting. > > > > > > There are two similar loops involving CONF_PRE_OPEN and CONF_POST_OPEN, > > > you may wish to hit those while you're at it. > > > > Huh? You mean _removing_ the timeouts involving CONF_PRE/POST_OPEN? I > > thought my patch converted all busy waits into schedule_timeout()... > > What am I missing? > > No, not removing them, but transforming them likewise into > schedule_timeout() calls. Yeah, but isn't the patch already doing that? I tried to find more occurances of CONF_PRE/POST_OPEN in the linux-2.6.10-rc2-mm3/net/ipv4/ipconfig.c but I think the patch covers all of them. Please point out what I am missing, maybe it is getting too late for me know... / magnus From davem@davemloft.net Wed Nov 24 02:18:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:13 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIPQs021891 for ; Wed, 24 Nov 2004 02:18:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsWK-0005BM-00; Wed, 24 Nov 2004 00:29:00 -0800 Date: Wed, 24 Nov 2004 00:29:00 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, lcapitulino@conectiva.com.br Subject: Re: [patch 11/13] net/socket.c::__sock_create() cleanup. Message-Id: <20041124002900.27641878.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i9900678@mail.osdl.org> References: <200411220644.iAM6i9900678@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12180 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:57 -0800 akpm@osdl.org wrote: > > From: "Luiz Fernando N. Capitulino" > > The 'i' variable in net/socket.c::__sock_create() is not necessary. It's > have been used to store error codes but there is an 'err' variable already. > > Signed-off-by: Luiz Capitulino > Signed-off-by: Andrew Morton Looks good, queued for 2.6.11 From davem@davemloft.net Wed Nov 24 02:18:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:12 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAINx8021873 for ; Wed, 24 Nov 2004 02:18:23 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsSA-0005AM-00; Wed, 24 Nov 2004 00:24:42 -0800 Date: Wed, 24 Nov 2004 00:24:42 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org Subject: Re: [patch 05/13] M68k Ethernet drivers depend on NET_ETHERNET Message-Id: <20041124002442.555512a9.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i4900638@mail.osdl.org> References: <200411220644.iAM6i4900638@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12179 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:52 -0800 akpm@osdl.org wrote: > From: Geert Uytterhoeven > > M68k Ethernet drivers depend on NET_ETHERNET instead of NETDEVICES > > Signed-off-by: Geert Uytterhoeven > Signed-off-by: Andrew Morton drivers/net, so looks like something in Jeff's territory. From davem@davemloft.net Wed Nov 24 02:18:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:15 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIPRn021895 for ; Wed, 24 Nov 2004 02:18:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsZP-0005Bx-00; Wed, 24 Nov 2004 00:32:11 -0800 Date: Wed, 24 Nov 2004 00:32:11 -0800 From: "David S. Miller" To: Herbert Xu Cc: kaber@trash.net, netdev@oss.sgi.com, coreteam@netfilter.org Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-Id: <20041124003211.54807ff8.davem@davemloft.net> In-Reply-To: <20041124062747.GA13522@gondor.apana.org.au> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> <41A3AF41.4010700@trash.net> <20041123221900.GA10099@gondor.apana.org.au> <41A3E9D6.9060904@trash.net> <20041124062747.GA13522@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12182 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 24 Nov 2004 17:27:47 +1100 Herbert Xu wrote: > On Wed, Nov 24, 2004 at 02:54:30AM +0100, Patrick McHardy wrote: > > > > > if (rt->u.dst.error) { > > >@@ -82,6 +88,15 @@ > > > rt = NULL; > > > > > ^ you should return here so xfrm_lookup isn't called without a dst_entry > > below. > > Good point. Fixed in the following patch. > > Signed-off-by: Herbert Xu > > Thanks for all your help, Patrick. Applied for 2.6.10, thanks everyone. From davem@davemloft.net Wed Nov 24 02:18:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:14 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIOkT021886 for ; Wed, 24 Nov 2004 02:18:24 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsUX-0005Av-00; Wed, 24 Nov 2004 00:27:09 -0800 Date: Wed, 24 Nov 2004 00:27:09 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, lcapitulino@conectiva.com.br Subject: Re: [patch 10/13] net/socket.c::sys_bind() cleanup. Message-Id: <20041124002709.52cb8d1f.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i8900672@mail.osdl.org> References: <200411220644.iAM6i8900672@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12181 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:56 -0800 akpm@osdl.org wrote: > From: "Luiz Fernando N. Capitulino" > > net/socket.c::sys_bind() is a bit complex function, the patch below makes > it more clear. > > Signed-off-by: Luiz Capitulino > Signed-off-by: Andrew Morton This was commented on to be buggy, or at least change behavior. The "if (err >= 0)" tests were changed to flat "if (err)" tests. From davem@davemloft.net Wed Nov 24 02:18:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:12 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIOZY021878 for ; Wed, 24 Nov 2004 02:18:24 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsSq-0005Ad-00; Wed, 24 Nov 2004 00:25:24 -0800 Date: Wed, 24 Nov 2004 00:25:23 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org Subject: Re: [patch 07/13] M68k HP Lance Ethernet: Fix leaks on probe/removal Message-Id: <20041124002523.219cef78.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i6900649@mail.osdl.org> References: <200411220644.iAM6i6900649@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12178 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:54 -0800 akpm@osdl.org wrote: > From: Geert Uytterhoeven > > HP Lance Ethernet: There's tons of leaks in the hplcance probing code, and it > doesn't release the memory region on removal either (from Christoph Hellwig) > > Signed-off-by: Geert Uytterhoeven > Signed-off-by: Andrew Morton This one looks like Jeff should review/merge it too. From davem@davemloft.net Wed Nov 24 02:18:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:19:11 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIOtX021883 for ; Wed, 24 Nov 2004 02:18:24 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsTV-0005Ak-00; Wed, 24 Nov 2004 00:26:05 -0800 Date: Wed, 24 Nov 2004 00:26:05 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org Subject: Re: [patch 09/13] M68k: Update Atari defconfig (enable Ethernet and MII) Message-Id: <20041124002605.7812a93d.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i7900667@mail.osdl.org> References: <200411220644.iAM6i7900667@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12177 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:55 -0800 akpm@osdl.org wrote: > From: Geert Uytterhoeven > > M68k: Update Atari defconfig (enable Ethernet and MII) > > Signed-off-by: Geert Uytterhoeven > Signed-off-by: Andrew Morton I think this can go straight in, it's arch/m68k stuff not necessarily something networking maintainers should be pushing around :) From davem@davemloft.net Wed Nov 24 02:18:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:20:08 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAIN8N021868 for ; Wed, 24 Nov 2004 02:18:23 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CWsQj-0005AE-00; Wed, 24 Nov 2004 00:23:13 -0800 Date: Wed, 24 Nov 2004 00:23:13 -0800 From: "David S. Miller" To: akpm@osdl.org Cc: jgarzik@pobox.com, netdev@oss.sgi.com, akpm@osdl.org, geert@linux-m68k.org Subject: Re: [patch 04/13] M68k HP300 DIO bus: Fix typo in dio_resource_len() Message-Id: <20041124002313.40175130.davem@davemloft.net> In-Reply-To: <200411220644.iAM6i3900633@mail.osdl.org> References: <200411220644.iAM6i3900633@mail.osdl.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12183 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 21 Nov 2004 22:43:51 -0800 akpm@osdl.org wrote: > From: Geert Uytterhoeven > > HP300 DIO bus: Fix typo in dio_resource_len() > > Signed-off-by: Geert Uytterhoeven > Signed-off-by: Andrew Morton Simple enough, applied to 2.6.10 Thanks. From akpm@osdl.org Wed Nov 24 02:31:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:31:51 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAVi9p025070 for ; Wed, 24 Nov 2004 02:31:45 -0800 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAO9l4919907; Wed, 24 Nov 2004 01:47:04 -0800 Date: Wed, 24 Nov 2004 01:46:50 -0800 From: Andrew Morton To: Ian Campbell Cc: nico@cam.org, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: "deadlock" between smc91x driver and link_watch Message-Id: <20041124014650.47af8ae4.akpm@osdl.org> In-Reply-To: <1101289309.10841.9.camel@icampbell-debian> References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12184 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Ian Campbell wrote: > > On Tue, 2004-11-23 at 15:31 -0800, Andrew Morton wrote: > > One possible fix would be to remove that flush_scheduled_work() and to do > > refcounting around smc_phy_configure(): dev_hold() when scheduling the work > > (if schedule_work() returned true), dev_put() in the handler. > > Something like the following? I think so. > +static void smc_phy_configure_wq(void *data) > +{ > + struct net_device *dev = data; > + dev_put(dev); > + smc_phy_configure(data); > +} You'd want to do the dev_put() after the smc_phy_configure() though. It may still be a tiny bit racy against module unload. From akpm@osdl.org Wed Nov 24 02:31:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:31:54 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAVi9r025070 for ; Wed, 24 Nov 2004 02:31:45 -0800 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id iAO1Qs917608; Tue, 23 Nov 2004 17:26:54 -0800 Date: Tue, 23 Nov 2004 17:31:11 -0800 From: Andrew Morton To: netdev@oss.sgi.com Cc: Marcin =?ISO-8859-1?Q?Gibu=B3a?= Subject: Fw: ipsec hang Message-Id: <20041123173111.1b74fabb.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Tue__23_Nov_2004_17_31_11_-0800_Je91gZmDckf2MzlY" X-archive-position: 12185 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --Multipart=_Tue__23_Nov_2004_17_31_11_-0800_Je91gZmDckf2MzlY Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Looks like one of the chains off xfrm_policy_list[] might have gone circular? Begin forwarded message: Date: Wed, 24 Nov 2004 01:34:49 +0100 From: Marcin Gibu=B3a To: linux-kernel@vger.kernel.org Subject: ipsec hang Hi, today I tried to configure ipsec on my linux workstation (with openswan) an= d=20 it hanged just after the init had run /etc/rc.d/init.d/ipsec start.=20 It was on linux-2.6.10-rc1-bk20, so I upgraded to 2.6.10-rc2-mm3 but it did= n't=20 make any difference.=20 The alt-sysrq-p shows the following call trace: xfrm_policy_insert xfrm_netlink_rcv netlink_data_ready netlink_sendmsg sock_aio_write do_sync_write sock_map_fd sys_select vfs_write system_call The full trace (with regs, etc) is available at=20 http://www.iceni.pl/marcin/lockup.jpg=20 .config attached. This hang is 100%-reproductible for me. I can attach=20 openswan config if needed. --=20 mg --Multipart=_Tue__23_Nov_2004_17_31_11_-0800_Je91gZmDckf2MzlY Content-Type: text/plain; name=".config" Content-Disposition: attachment; filename=".config" Content-Transfer-Encoding: 7bit # # Automatically generated make config: don't edit # Linux kernel version: 2.6.10-rc2-mm3 # Tue Nov 23 19:16:56 2004 # CONFIG_X86_64=y CONFIG_64BIT=y CONFIG_X86=y CONFIG_MMU=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_X86_CMPXCHG=y CONFIG_EARLY_PRINTK=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_LOCK_KERNEL=y # # General setup # CONFIG_LOCALVERSION="" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_SYSCTL=y # CONFIG_AUDIT is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_HOTPLUG=y CONFIG_KOBJECT_UEVENT=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_FUTEX=y CONFIG_EPOLL=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SHMEM=y CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set # # Loadable module support # CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y CONFIG_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y # # Processor type and features # CONFIG_MK8=y # CONFIG_MPSC is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_GOOD_APIC=y # CONFIG_MICROCODE is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_MTRR=y # CONFIG_SMP is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_BKL=y # CONFIG_NUMA is not set # CONFIG_GART_IOMMU is not set CONFIG_DUMMY_IOMMU=y CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_PROBE=y # # Power management options # CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_SOFTWARE_SUSPEND=y CONFIG_PM_STD_PARTITION="" # # ACPI (Advanced Configuration and Power Interface) Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y # CONFIG_ACPI_VIDEO is not set CONFIG_ACPI_FAN=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_THERMAL=y # CONFIG_ACPI_ASUS is not set # CONFIG_ACPI_IBM is not set # CONFIG_ACPI_TOSHIBA is not set CONFIG_ACPI_BLACKLIST_YEAR=0 # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_BUS=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y # CONFIG_ACPI_CONTAINER is not set # # CPU Frequency scaling # # CONFIG_CPU_FREQ is not set # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y # CONFIG_PCI_MMCONFIG is not set CONFIG_UNORDERED_IO=y # CONFIG_PCI_MSI is not set # CONFIG_PCI_LEGACY_PROC is not set CONFIG_PCI_NAMES=y # # PCCARD (PCMCIA/CardBus) support # # CONFIG_PCCARD is not set # # PC-card bridges # # # PCI Hotplug Support # # CONFIG_HOTPLUG_PCI is not set # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_UID16=y # # Performance-monitoring counters support # CONFIG_PERFCTR=y CONFIG_PERFCTR_INIT_TESTS=y CONFIG_PERFCTR_VIRTUAL=y CONFIG_PERFCTR_INTERRUPT_SUPPORT=y CONFIG_KEXEC=y # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set # CONFIG_MTD_PARTITIONS is not set # CONFIG_MTD_CONCAT is not set # # User Modules And Translation Layers # # CONFIG_MTD_CHAR is not set # CONFIG_MTD_BLOCK is not set # CONFIG_MTD_BLOCK_RO is not set # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set CONFIG_MTD_PHRAM=y # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLKMTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set # # NAND Flash Device Drivers # # CONFIG_MTD_NAND is not set # # Parallel port support # # CONFIG_PARPORT is not set # # Plug and Play support # # CONFIG_PNP is not set # # Block devices # CONFIG_BLK_DEV_FD=y # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_UB is not set # CONFIG_BLK_DEV_RAM is not set CONFIG_INITRAMFS_SOURCE="" # CONFIG_LBD is not set # CONFIG_CDROM_PKTCDVD is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y # CONFIG_IOSCHED_AS is not set # CONFIG_IOSCHED_DEADLINE is not set CONFIG_IOSCHED_CFQ=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set CONFIG_IDE_TASK_IOCTL=y # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set CONFIG_BLK_DEV_IDEPCI=y # CONFIG_IDEPCI_SHARE_IRQ is not set # CONFIG_BLK_DEV_OFFBOARD is not set # CONFIG_BLK_DEV_GENERIC is not set # CONFIG_BLK_DEV_OPTI621 is not set # CONFIG_BLK_DEV_RZ1000 is not set CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y # CONFIG_BLK_DEV_ATIIXP is not set # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_TRIFLEX is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5520 is not set # CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_HPT34X is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_PIIX is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set # CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # CONFIG_SCSI_MULTI_LUN=y # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # # SCSI Transport Attributes # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set CONFIG_SCSI_SATA=y # CONFIG_SCSI_SATA_AHCI is not set # CONFIG_SCSI_SATA_SVW is not set # CONFIG_SCSI_ATA_PIIX is not set # CONFIG_SCSI_SATA_NV is not set # CONFIG_SCSI_SATA_PROMISE is not set # CONFIG_SCSI_SATA_SX4 is not set CONFIG_SCSI_SATA_SIL=y # CONFIG_SCSI_SATA_SIS is not set # CONFIG_SCSI_SATA_ULI is not set # CONFIG_SCSI_SATA_VIA is not set # CONFIG_SCSI_SATA_VITESSE is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set CONFIG_SCSI_QLA2XXX=y # CONFIG_SCSI_QLA21XX is not set # CONFIG_SCSI_QLA22XX is not set # CONFIG_SCSI_QLA2300 is not set # CONFIG_SCSI_QLA2322 is not set # CONFIG_SCSI_QLA6312 is not set # CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DEBUG is not set # # Multi-device support (RAID and LVM) # CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=y CONFIG_MD_RAID0=y CONFIG_MD_RAID1=y # CONFIG_MD_RAID10 is not set # CONFIG_MD_RAID5 is not set # CONFIG_MD_RAID6 is not set # CONFIG_MD_MULTIPATH is not set # CONFIG_MD_FAULTY is not set CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # # Fusion MPT device support # # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # CONFIG_IEEE1394=y # # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # Device Drivers # # CONFIG_IEEE1394_PCILYNX is not set CONFIG_IEEE1394_OHCI1394=y # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=y CONFIG_IEEE1394_SBP2=y # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set # CONFIG_IEEE1394_ETH1394 is not set CONFIG_IEEE1394_DV1394=y CONFIG_IEEE1394_RAWIO=y # CONFIG_IEEE1394_CMP is not set # # I2O device support # # CONFIG_I2O is not set # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_NETLINK_DEV=y CONFIG_UNIX=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_TUNNEL=y CONFIG_IP_TCPDIAG=y CONFIG_IP_TCPDIAG_IPV6=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set CONFIG_IPV6=y CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=y CONFIG_INET6_ESP=y CONFIG_INET6_IPCOMP=y CONFIG_INET6_TUNNEL=y CONFIG_IPV6_TUNNEL=y CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=y CONFIG_IP_NF_CT_ACCT=y CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CT_PROTO_SCTP=y CONFIG_IP_NF_FTP=y CONFIG_IP_NF_IRC=y CONFIG_IP_NF_TFTP=y CONFIG_IP_NF_AMANDA=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_REALM=m CONFIG_IP_NF_MATCH_SCTP=m CONFIG_IP_NF_MATCH_COMMENT=m CONFIG_IP_NF_MATCH_CONNMARK=m CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m CONFIG_IP_NF_NAT_LOCAL=y CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_CONNMARK=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_TARGET_NOTRACK=m CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # # IPv6: Netfilter Configuration # CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m CONFIG_IP6_NF_RAW=m CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=y # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set CONFIG_SCTP_HMAC_SHA1=y # CONFIG_SCTP_HMAC_MD5 is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # # QoS and/or fair queueing # CONFIG_NET_SCHED=y # CONFIG_NET_SCH_CLK_JIFFIES is not set # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set CONFIG_NET_SCH_CLK_CPU=y CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m # CONFIG_NET_SCH_PRIO is not set CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m # CONFIG_NET_SCH_TEQL is not set CONFIG_NET_SCH_TBF=m # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_INGRESS is not set CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m # CONFIG_CLS_U32_PERF is not set # CONFIG_NET_CLS_IND is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_IPT is not set # CONFIG_NET_ACT_PEDIT is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_KGDBOE is not set # CONFIG_NETPOLL is not set # CONFIG_NETPOLL_RX is not set # CONFIG_NETPOLL_TRAP is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_HAMRADIO is not set CONFIG_IRDA=y # # IrDA protocols # # CONFIG_IRLAN is not set # CONFIG_IRCOMM is not set CONFIG_IRDA_ULTRA=y # # IrDA options # # CONFIG_IRDA_CACHE_LAST_LSAP is not set # CONFIG_IRDA_FAST_RR is not set # CONFIG_IRDA_DEBUG is not set # # Infrared-port device drivers # # # SIR device drivers # # CONFIG_IRTTY_SIR is not set # # Dongle support # # # Old SIR device drivers # # CONFIG_IRPORT_SIR is not set # # Old Serial dongle support # # # FIR device drivers # # CONFIG_USB_IRDA is not set CONFIG_SIGMATEL_FIR=y # CONFIG_VLSI_FIR is not set # CONFIG_BT is not set CONFIG_NETDEVICES=y # CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set # CONFIG_ETHERTAP is not set # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # # CONFIG_NET_ETHERNET is not set # # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set # CONFIG_DL2K is not set # CONFIG_E1000 is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set CONFIG_SK98LIN=y # CONFIG_TIGON3 is not set # # Ethernet (10000 Mbit) # # CONFIG_IXGB is not set # CONFIG_S2IO is not set # # Token Ring devices # # CONFIG_TR is not set # # Wireless LAN (non-hamradio) # # CONFIG_NET_RADIO is not set # # Wan interfaces # # CONFIG_WAN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set # CONFIG_NET_FC is not set # CONFIG_SHAPER is not set # CONFIG_NETCONSOLE is not set # # ISDN subsystem # # CONFIG_ISDN is not set # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y # CONFIG_INPUT_TSDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # CONFIG_GAMEPORT=y CONFIG_SOUND_GAMEPORT=y # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set CONFIG_GAMEPORT_EMU10K1=y # CONFIG_GAMEPORT_VORTEX is not set # CONFIG_GAMEPORT_FM801 is not set # CONFIG_GAMEPORT_CS461x is not set CONFIG_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_VSXXXAA is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDDLER is not set # CONFIG_JOYSTICK_JOYDUMP is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=y # CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_NONSTANDARD is not set # # Serial drivers # # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # # IPMI # # CONFIG_IPMI_HANDLER is not set # # Watchdog Cards # CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_SC520_WDT is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_IB700_WDT is not set # CONFIG_WAFER_WDT is not set # CONFIG_I8XX_TCO is not set # CONFIG_SC1200_WDT is not set # CONFIG_SCx200_WDT is not set # CONFIG_60XX_WDT is not set # CONFIG_CPU5_WDT is not set CONFIG_W83627HF_WDT=y # CONFIG_W83877F_WDT is not set # CONFIG_MACHZ_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_HW_RANDOM=y CONFIG_NVRAM=y CONFIG_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set CONFIG_AGP=y CONFIG_AGP_AMD64=y # CONFIG_AGP_INTEL_MCH is not set CONFIG_DRM=y # CONFIG_DRM_TDFX is not set # CONFIG_DRM_R128 is not set CONFIG_DRM_RADEON=m # CONFIG_DRM_SIS is not set # CONFIG_MWAVE is not set # CONFIG_RAW_DRIVER is not set CONFIG_HPET=y # CONFIG_HPET_RTC_IRQ is not set CONFIG_HPET_MMAP=y # CONFIG_HANGCHECK_TIMER is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_CHARDEV=y # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y CONFIG_I2C_ALGOPCF=y CONFIG_I2C_ALGOPCA=y # # I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set CONFIG_I2C_AMD756=y # CONFIG_I2C_AMD756_S4882 is not set CONFIG_I2C_AMD8111=y # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set CONFIG_I2C_ISA=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # # Hardware Sensors Chip support # CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83L785TS is not set CONFIG_SENSORS_W83627HF=y # # Other I2C Chip support # # CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_RTC8564 is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # # CONFIG_IBM_ASM is not set # # Multimedia devices # CONFIG_VIDEO_DEV=y # # Video For Linux # # # Video Adapters # # CONFIG_VIDEO_BT848 is not set # CONFIG_VIDEO_CPIA is not set # CONFIG_VIDEO_SAA5246A is not set # CONFIG_VIDEO_SAA5249 is not set # CONFIG_TUNER_3036 is not set # CONFIG_VIDEO_STRADIS is not set # CONFIG_VIDEO_ZORAN is not set CONFIG_VIDEO_SAA7134=m # CONFIG_VIDEO_MXB is not set # CONFIG_VIDEO_DPC is not set # CONFIG_VIDEO_HEXIUM_ORION is not set # CONFIG_VIDEO_HEXIUM_GEMINI is not set # CONFIG_VIDEO_CX88 is not set # CONFIG_VIDEO_OVCAMCHIP is not set # # Radio Adapters # # CONFIG_RADIO_GEMTEK_PCI is not set # CONFIG_RADIO_MAXIRADIO is not set # CONFIG_RADIO_MAESTRO is not set # # Digital Video Broadcasting Devices # # CONFIG_DVB is not set CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_VESA is not set CONFIG_VIDEO_SELECT=y # CONFIG_FB_HGA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_MATROX is not set CONFIG_FB_RADEON_OLD=y # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_VIRTUAL is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # # Logo configuration # CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # # Sound # CONFIG_SOUND=y # # Advanced Linux Sound Architecture # CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_SEQUENCER=y # CONFIG_SND_SEQ_DUMMY is not set CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=y CONFIG_SND_PCM_OSS=y CONFIG_SND_SEQUENCER_OSS=y # CONFIG_SND_BIT32_EMUL is not set CONFIG_SND_RTCTIMER=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # # CONFIG_SND_DUMMY is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # # PCI devices # CONFIG_SND_AC97_CODEC=y # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CS4281 is not set CONFIG_SND_EMU10K1=y # CONFIG_SND_KORG1212 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_YMFPCI is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VX222 is not set # # USB devices # # CONFIG_SND_USB_AUDIO is not set # CONFIG_SND_USB_USX2Y is not set # # Open Sound System # # CONFIG_SOUND_PRIME is not set # # USB support # CONFIG_USB=y # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y CONFIG_USB_BANDWIDTH=y CONFIG_USB_DYNAMIC_MINORS=y CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_UHCI_HCD is not set # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # CONFIG_USB_BLUETOOTH_TTY is not set # CONFIG_USB_MIDI is not set # CONFIG_USB_ACM is not set CONFIG_USB_PRINTER=y CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_RW_DETECT is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # # USB Input Devices # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y CONFIG_HID_FF=y # CONFIG_HID_PID is not set CONFIG_LOGITECH_FF=y # CONFIG_THRUSTMASTER_FF is not set # CONFIG_USB_HIDDEV is not set # CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set # CONFIG_USB_MTOUCH is not set # CONFIG_USB_EGALAX is not set # CONFIG_USB_XPAD is not set # CONFIG_USB_ATI_REMOTE is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_HPUSBSCSI is not set # # USB Multimedia devices # # CONFIG_USB_DABUSB is not set # CONFIG_USB_VICAM is not set # CONFIG_USB_DSBR is not set # CONFIG_USB_IBMCAM is not set # CONFIG_USB_KONICAWC is not set # CONFIG_USB_OV511 is not set # CONFIG_USB_SE401 is not set # CONFIG_USB_SN9C102 is not set # CONFIG_USB_STV680 is not set # # USB Network Adapters # # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_USBNET is not set # # USB port drivers # # # USB Serial Converter support # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_TEST is not set # # USB ATM/DSL drivers # # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # Firmware Drivers # CONFIG_EDD=y # # File systems # # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set # CONFIG_JBD is not set # CONFIG_REISER4_FS is not set CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y # CONFIG_REISERFS_FS_SECURITY is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=m CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_NTFS_FS=m # CONFIG_NTFS_DEBUG is not set CONFIG_NTFS_RW=y # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y # CONFIG_DEVPTS_FS_SECURITY is not set CONFIG_TMPFS=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_SECURITY is not set CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # # Network File Systems # # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_EXPORTFS is not set CONFIG_SMB_FS=y # CONFIG_SMB_NLS_DEFAULT is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_EFI_PARTITION is not set # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=y CONFIG_NLS_CODEPAGE_775=y CONFIG_NLS_CODEPAGE_850=y CONFIG_NLS_CODEPAGE_852=y # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=y # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set CONFIG_NLS_UTF8=y # # Profiling support # # CONFIG_PROFILING is not set # # Kernel hacking # CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set CONFIG_DEBUG_PREEMPT=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_INFO is not set # CONFIG_CHECKING is not set # CONFIG_INIT_DEBUG is not set # CONFIG_KPROBES is not set # CONFIG_KGDB is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_KHAZAD=m # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m # CONFIG_CRYPTO_TEST is not set # # Library routines # CONFIG_CRC_CCITT=y CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y --Multipart=_Tue__23_Nov_2004_17_31_11_-0800_Je91gZmDckf2MzlY-- From laforge@netfilter.org Wed Nov 24 02:45:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:45:44 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAjbwi030302 for ; Wed, 24 Nov 2004 02:45:37 -0800 Received: from dsl-082-082-096-160.arcor-ip.net ([82.82.96.160] helo=sunbeam.gnumonks.org) by ganesha.gnumonks.org with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CWrbA-00046U-UW; Wed, 24 Nov 2004 08:29:57 +0100 Received: from laforge by sunbeam.gnumonks.org with local (Exim 4.34) id 1CWrb7-0006ok-Ar; Wed, 24 Nov 2004 08:29:53 +0100 Date: Wed, 24 Nov 2004 08:29:53 +0100 From: Harald Welte To: Patrick McHardy Cc: Herbert Xu , netdev@oss.sgi.com, coreteam@netfilter.org Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041124072953.GS19371@sunbeam.de.gnumonks.org> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> <41A3AF41.4010700@trash.net> <20041123221900.GA10099@gondor.apana.org.au> <41A3CD45.4080802@trash.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="/UvyDgxjlFfP/4zZ" Content-Disposition: inline In-Reply-To: <41A3CD45.4080802@trash.net> User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12186 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@netfilter.org Precedence: bulk X-list: netdev --/UvyDgxjlFfP/4zZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Nov 24, 2004 at 12:52:37AM +0100, Patrick McHardy wrote: > I would prefer something like this (based on your patch, untested).=20 > Currently > ICMP packets are handled different than TCP packets, saddr is set to 0 for > them if it is non-local, so they can't be source-routed properly. This pa= tch > also uses route_reverse for ICMP packets, properly sets fl->proto for out= put > routed packets and adds a call to xfrm_lookup for input routed packets. Just a quick side note: Once we've found a final solution, please don't forget to merge the changes to ip6t_REJECT in patch-o-matic. > Regards > Patrick --=20 - Harald Welte http://www.netfilter.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D "Fragmentation is like classful addressing -- an interesting early architectural error that shows how much experimentation was going on while IP was being designed." -- Paul Vixie --/UvyDgxjlFfP/4zZ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFBpDhwXaXGVTD0i/8RAnpIAJ9a2hlHV206EpSWsqfMWL8T4XiorwCeJ33f LMgvjamQbrB0L62zmuf0ZZw= =bI85 -----END PGP SIGNATURE----- --/UvyDgxjlFfP/4zZ-- From icampbell@arcom.com Wed Nov 24 02:46:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:46:12 -0800 (PST) Received: from webapps.arcom.com (webapps.arcom.com [194.200.159.168]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAk7bs030425 for ; Wed, 24 Nov 2004 02:46:07 -0800 Received: from linuxdev.icampbell.arcom.cc ([10.2.28.2]) by webapps.arcom.com with Microsoft SMTPSVC(6.0.3790.0); Wed, 24 Nov 2004 09:59:52 +0000 Subject: Re: "deadlock" between smc91x driver and link_watch From: Ian Campbell To: Andrew Morton Cc: Nicolas Pitre , linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20041124014650.47af8ae4.akpm@osdl.org> References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> Content-Type: text/plain Organization: Arcom Control Systems Date: Wed, 24 Nov 2004 09:58:16 +0000 Message-Id: <1101290297.10841.15.camel@icampbell-debian> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 24 Nov 2004 09:59:52.0921 (UTC) FILETIME=[57E3E490:01C4D20C] X-archive-position: 12187 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: icampbell@arcom.com Precedence: bulk X-list: netdev On Wed, 2004-11-24 at 01:46 -0800, Andrew Morton wrote: > Ian Campbell wrote: > > > > On Tue, 2004-11-23 at 15:31 -0800, Andrew Morton wrote: > > > One possible fix would be to remove that flush_scheduled_work() and to do > > > refcounting around smc_phy_configure(): dev_hold() when scheduling the work > > > (if schedule_work() returned true), dev_put() in the handler. > > > > Something like the following? > > I think so. > > > +static void smc_phy_configure_wq(void *data) > > +{ > > + struct net_device *dev = data; > > + dev_put(dev); > > + smc_phy_configure(data); > > +} > > You'd want to do the dev_put() after the smc_phy_configure() though. It > may still be a tiny bit racy against module unload. Quite right. Fixed patch included. Signed-off-by: Ian Campbell Index: 2.6/drivers/net/smc91x.c =================================================================== --- 2.6.orig/drivers/net/smc91x.c 2004-11-16 09:26:52.000000000 +0000 +++ 2.6/drivers/net/smc91x.c 2004-11-24 09:53:54.397248397 +0000 @@ -1158,6 +1158,20 @@ } /* + * smc_phy_configure_wq + * + * The net_device is referenced when the work was scheduled to avoid + * the need for a flush_scheduled_work() in smc_close(). Drop the + * reference and then do the configuration. + */ +static void smc_phy_configure_wq(void *data) +{ + struct net_device *dev = data; + smc_phy_configure(data); + dev_put(dev); +} + +/* * smc_phy_interrupt * * Purpose: Handle interrupts relating to PHY register 18. This is @@ -1350,10 +1364,13 @@ /* * Reconfiguring the PHY doesn't seem like a bad idea here, but * smc_phy_configure() calls msleep() which calls schedule_timeout() - * which calls schedule(). Ence we use a work queue. + * which calls schedule(). Hence we use a work queue. */ - if (lp->phy_type != 0) - schedule_work(&lp->phy_configure); + if (lp->phy_type != 0) { + if (schedule_work(&lp->phy_configure)) { + dev_hold(dev); + } + } /* We can accept TX packets again */ dev->trans_start = jiffies; @@ -1536,10 +1553,8 @@ /* clear everything */ smc_shutdown(dev); - if (lp->phy_type != 0) { - flush_scheduled_work(); + if (lp->phy_type != 0) smc_phy_powerdown(dev, lp->mii.phy_id); - } if (lp->pending_tx_skb) { dev_kfree_skb(lp->pending_tx_skb); @@ -1891,7 +1906,7 @@ dev->ethtool_ops = &smc_ethtool_ops; tasklet_init(&lp->tx_task, smc_hardware_send_pkt, (unsigned long)dev); - INIT_WORK(&lp->phy_configure, smc_phy_configure, dev); + INIT_WORK(&lp->phy_configure, smc_phy_configure_wq, dev); lp->mii.phy_id_mask = 0x1f; lp->mii.reg_num_mask = 0x1f; lp->mii.force_media = 0; -- Ian Campbell, Senior Design Engineer Web: http://www.arcom.com Arcom, Clifton Road, Direct: +44 (0)1223 403 465 Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200 From magnus.damm@gmail.com Wed Nov 24 02:49:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:49:30 -0800 (PST) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.203]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAnN8A031642 for ; Wed, 24 Nov 2004 02:49:25 -0800 Received: by wproxy.gmail.com with SMTP id 40so34520wri for ; Wed, 24 Nov 2004 02:48:58 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=dz7UI5Yq0m1HKnwNVoOhsN4soEPbJ4DtMBd1/68sPBymPeSszLbyaf6KUiRccwfVnbw/BXH8kJ2tdJb4xzEqxGFf/Cdmd1Bf0YSNIRIpvefnklepm+JvPvyuj48Yz/R48uhL3LJqVtsa0PHo3h2anSiK2Kcc0YN4mmdkfQSydHw= Received: by 10.54.9.63 with SMTP id 63mr82377wri; Tue, 23 Nov 2004 15:42:17 -0800 (PST) Received: by 10.54.17.4 with HTTP; Tue, 23 Nov 2004 15:42:17 -0800 (PST) Message-ID: Date: Wed, 24 Nov 2004 00:42:17 +0100 From: Magnus Damm Reply-To: Magnus Damm To: "David S. Miller" Subject: Re: [PATCH] ipconfig schedule fix Cc: netdev@oss.sgi.com In-Reply-To: <20041123151855.1864659a.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <20041123151855.1864659a.davem@davemloft.net> X-archive-position: 12188 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: magnus.damm@gmail.com Precedence: bulk X-list: netdev On Tue, 23 Nov 2004 15:18:55 -0800, David S. Miller wrote: > On Tue, 23 Nov 2004 23:50:35 +0100 > > > Magnus Damm wrote: > > > This simple patch makes the DHCP/BOOTP/RARP code sleep with > > schedule_timeout() instead of hogging the cpu with cpu_relax() in a > > loop. This comes handy when a guest kernel is booted inside QEMU. > > Without the patch, the host operating system will consume cpu time > > busy waiting. > > There are two similar loops involving CONF_PRE_OPEN and CONF_POST_OPEN, > you may wish to hit those while you're at it. Huh? You mean _removing_ the timeouts involving CONF_PRE/POST_OPEN? I thought my patch converted all busy waits into schedule_timeout()... What am I missing? / magnus From herbert@gondor.apana.org.au Wed Nov 24 02:56:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 02:56:10 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOAu1fp000922 for ; Wed, 24 Nov 2004 02:56:02 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CWqd8-0006FB-00; Wed, 24 Nov 2004 17:27:54 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CWqd1-0003WN-00; Wed, 24 Nov 2004 17:27:47 +1100 Date: Wed, 24 Nov 2004 17:27:47 +1100 To: Patrick McHardy Cc: netdev@oss.sgi.com, coreteam@netfilter.org, "David S. Miller" Subject: Re: [netfilter-core] [NETFILTER] Apply IPsec to ipt_REJECT packets Message-ID: <20041124062747.GA13522@gondor.apana.org.au> References: <20041123084225.GA3514@gondor.apana.org.au> <41A37EC0.8010901@trash.net> <20041123211630.GA9805@gondor.apana.org.au> <41A3AF41.4010700@trash.net> <20041123221900.GA10099@gondor.apana.org.au> <41A3E9D6.9060904@trash.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="+HP7ph2BbKc20aGI" Content-Disposition: inline In-Reply-To: <41A3E9D6.9060904@trash.net> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12189 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --+HP7ph2BbKc20aGI Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 24, 2004 at 02:54:30AM +0100, Patrick McHardy wrote: > > > if (rt->u.dst.error) { > >@@ -82,6 +88,15 @@ > > rt = NULL; > > > ^ you should return here so xfrm_lookup isn't called without a dst_entry > below. Good point. Fixed in the following patch. Signed-off-by: Herbert Xu Thanks for all your help, Patrick. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --+HP7ph2BbKc20aGI Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=q ===== net/ipv4/netfilter/ipt_REJECT.c 1.32 vs edited ===== --- 1.32/net/ipv4/netfilter/ipt_REJECT.c 2004-11-14 00:41:07 +11:00 +++ edited/net/ipv4/netfilter/ipt_REJECT.c 2004-11-24 17:26:04 +11:00 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #ifdef CONFIG_BRIDGE_NETFILTER @@ -38,7 +39,8 @@ #define DEBUGP(format, args...) #endif -static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) +static inline struct rtable *route_reverse(struct sk_buff *skb, + struct tcphdr *tcph, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; @@ -75,10 +77,23 @@ dst_release(&rt->u.dst); rt = (struct rtable *)skb->dst; skb->dst = odst; + + fl.nl_u.ip4_u.daddr = iph->saddr; + fl.nl_u.ip4_u.saddr = iph->daddr; + fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); } if (rt->u.dst.error) { dst_release(&rt->u.dst); + return NULL; + } + + fl.proto = IPPROTO_TCP; + fl.fl_ip_sport = tcph->dest; + fl.fl_ip_dport = tcph->source; + + if (xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0)) { + dst_release(&rt->u.dst); rt = NULL; } @@ -110,7 +125,7 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, hook)) == NULL) + if ((rt = route_reverse(oldskb, oth, hook)) == NULL) return; hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); @@ -282,10 +297,23 @@ tos = (iph->tos & IPTOS_TOS_MASK) | IPTOS_PREC_INTERNETCONTROL; { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = skb_in->nh.iph->saddr, - .saddr = saddr, - .tos = RT_TOS(tos) } } }; + struct flowi fl = { + .nl_u = { + .ip4_u = { + .daddr = skb_in->nh.iph->saddr, + .saddr = saddr, + .tos = RT_TOS(tos) + } + }, + .proto = IPPROTO_ICMP, + .uli_u = { + .icmpt = { + .type = ICMP_DEST_UNREACH, + .code = code + } + } + }; + if (ip_route_output_key(&rt, &fl)) return; } --+HP7ph2BbKc20aGI-- From juhl-lkml@dif.dk Wed Nov 24 03:02:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 03:02:19 -0800 (PST) Received: from mail.dif.dk (mail.dif.dk [193.138.115.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOB253M002063 for ; Wed, 24 Nov 2004 03:02:06 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.dif.dk (Postfix) with ESMTP id 7F813FFC60 for ; Wed, 24 Nov 2004 01:07:56 +0100 (CET) Received: from mail.dif.dk ([127.0.0.1]) by localhost (saerimmer [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 07010-16 for ; Wed, 24 Nov 2004 01:07:55 +0100 (CET) Received: from diftmgw2.backbone.dif.dk (diftmgw2.backbone.dif.dk [10.227.136.246]) by mail.dif.dk (Postfix) with ESMTP id B9A13FF41C for ; Wed, 24 Nov 2004 01:07:55 +0100 (CET) Received: from DIFPST1A.backbone.dif.dk ([10.227.136.220]) by diftmgw2.backbone.dif.dk with InterScan Messaging Security Suite; Wed, 24 Nov 2004 01:05:42 +0100 Received: from [172.16.2.11] (10.227.136.29 [10.227.136.29]) by DIFPST1A.backbone.dif.dk with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id XF195PBX; Wed, 24 Nov 2004 01:06:29 +0100 Date: Wed, 24 Nov 2004 01:16:05 +0100 (CET) From: Jesper Juhl To: netdev@oss.sgi.com, linux-net@vger.kernel.org Cc: linux-kernel Subject: [PATCH] move inline keywords nearer beginning of declaration in skbuff.c to elliminate warning with gcc -W Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-new at dif.dk X-archive-position: 12190 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: juhl-lkml@dif.dk Precedence: bulk X-list: netdev In order to get rid of net/core/skbuff.c:1353: warning: `inline' is not at beginning of declaration net/core/skbuff.c:1374: warning: `inline' is not at beginning of declaration when building with gcc -W, I submit the patch below. There's no impact on the way the code works, so it is perfectly safe. It just brings the count of warnings that I have to sift through down by two (yes, I know the kernel is not normally build with -W, but I do it to look for stuff that potentially needs review, and the less warnings I have to sift through the better). I see no good reason not to apply this. Please apply. Signed-off-by: Jesper Juhl diff -up linux-2.6.10-rc2-bk6-orig/net/core/skbuff.c linux-2.6.10-rc2-bk6/net/core/skbuff.c --- linux-2.6.10-rc2-bk6-orig/net/core/skbuff.c 2004-11-17 01:20:32.000000000 +0100 +++ linux-2.6.10-rc2-bk6/net/core/skbuff.c 2004-11-24 01:05:32.000000000 +0100 @@ -1350,7 +1350,7 @@ void skb_add_mtu(int mtu) } #endif -static void inline skb_split_inside_header(struct sk_buff *skb, +static inline void skb_split_inside_header(struct sk_buff *skb, struct sk_buff* skb1, const u32 len, const int pos) { @@ -1371,7 +1371,7 @@ static void inline skb_split_inside_head skb->tail = skb->data + len; } -static void inline skb_split_no_header(struct sk_buff *skb, +static inline void skb_split_no_header(struct sk_buff *skb, struct sk_buff* skb1, const u32 len, int pos) { From horms@koto.vergenet.net Wed Nov 24 03:43:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 03:43:20 -0800 (PST) Received: from koto.vergenet.net (koto.vergenet.net [210.128.90.7]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAOBhFHF006031 for ; Wed, 24 Nov 2004 03:43:15 -0800 Received: (qmail 506 invoked by uid 7100); 24 Nov 2004 02:27:29 -0000 Date: Wed, 24 Nov 2004 11:01:13 +0900 From: Horms To: Nishanth Aravamudan Cc: janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] Add ssleep_interruptible() Message-ID: <20041124020111.GF31329@verge.net.au> Mail-Followup-To: Nishanth Aravamudan , janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org References: <20041101200749.GF1730@us.ibm.com> <20041117013059.GA4218@us.ibm.com> <20041122024804.GD4146@verge.net.au> <20041122171922.GA7770@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041122171922.GA7770@us.ibm.com> X-Cluestick: seven User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12191 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: horms@verge.net.au Precedence: bulk X-list: netdev On Mon, Nov 22, 2004 at 09:19:22AM -0800, Nishanth Aravamudan wrote: > On Mon, Nov 22, 2004 at 11:48:05AM +0900, Horms wrote: > > On Tue, Nov 16, 2004 at 05:30:59PM -0800, Nishanth Aravamudan wrote: > > > On Mon, Nov 01, 2004 at 12:07:49PM -0800, Nishanth Aravamudan wrote: > > > > Description: Adds ssleep_interruptible() to allow longer delays to occur > > > > in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with > > > > msleep_interruptible(), ssleep_interruptible() returns the remaining time > > > > left in the delay in terms of seconds. This required dividing the return > > > > value of msleep_interruptible() by 1000, thus a cast to (unsigned long) > > > > to prevent any floating point issues. > > > > > > > > Signed-off-by: Nishanth Aravamudan > > > > > > > > --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 > > > > 15:34:03.000000000 -0700 > > > > +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 > > > > @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s > > > > msleep(seconds * 1000); > > > > } > > > > > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > > > +{ > > > > + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); > > > > +} > > > > + > > > > #endif /* defined(_LINUX_DELAY_H) */ > > > > > > After a discussion on IRC, I believe it is pretty clear that this > > > function has serious issues. Mainly, that if I request a delay of 1 > > > second, but msleep_interruptible() returns after 1 millisecond, then > > > ssleep_interruptible() will return 0, claiming the entire delay was > > > used (due to rounding). > > > > > > Perhaps we should just be satisfied with milliseconds being the grossest > > > (in contrast to fine) measure of time, at least in terms of > > > interruptible delays. ssleep() is unaffected by this problem, of course. > > > > > > Please revert this patch, if applied, as well as any of the other > > > patches I sent using ssleep_interruptible() [only a handful]. > > > > Would making sure that the time slept was always rounded up to > > the nearest second resolve this problem. I believe that rounding > > up is a common approach to resolving this type of problem when > > changing clock resolution. > > > > I am thinking of something like this. > > > > ===== include/linux/delay.h 1.6 vs edited ===== > > --- 1.6/include/linux/delay.h 2004-09-03 18:08:32 +09:00 > > +++ edited/include/linux/delay.h 2004-11-22 11:47:03 +09:00 > > @@ -46,4 +46,10 @@ static inline void ssleep(unsigned int s > > msleep(seconds * 1000); > > } > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > +{ > > + return (unsigned long)((msleep_interruptible(seconds * 1000) + 999) / > > + 1000); > > This is a good idea, but I have two issues: > > 1) A major reason for having msecs_to_jiffies() and co. is to avoid > having to do this type of conversion ourselves. A weak argument, > admittedly, but just something to keep in mind. > > 2) This still has a serious logical flaw: If I request 1 second of > sleep, and I don't sleep the entire time, then it is now guaranteed that > I will think I did not sleep at all (ie. ssleep_interruptible() will > return 1). That's just another version of the original issue. > > I just don't think it's useful to have this coarse of granularity, at > least in terms of interruptible sleep. If it is unacceptable to neither underestimate or overestimate the duration of a sleep to the nearest second (the unit of granularity of the sleep in this case) then I agree. That is unless you want to request a sleep in seconds but have the duration returned in milliseconds. But if that is the case then it is probably more sensible to just use msleep_interruptible() and be done with it. -- Horms From lcapitulino@conectiva.com.br Wed Nov 24 04:51:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 04:51:08 -0800 (PST) Received: from loncoche.terra.com.br (loncoche.terra.com.br [200.154.55.229]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOCp3Oj011847 for ; Wed, 24 Nov 2004 04:51:03 -0800 Received: from rosario.terra.com.br (rosario.terra.com.br [200.154.55.129]) by loncoche.terra.com.br (Postfix) with ESMTP id 30006E79094; Wed, 24 Nov 2004 10:50:42 -0200 (BRST) X-Terra-Karma: -2% X-Terra-Hash: 91b589e56f807111cae81cb103f097ce Received: from [129.214.46.218] (unknown [200.222.15.249]) (authenticated user cnc.smtp) by rosario.terra.com.br (Postfix) with ESMTP id 81EFC3C0A2; Wed, 24 Nov 2004 10:50:37 -0200 (BRST) Message-ID: <41A4688E.80908@conectiva.com.br> Date: Wed, 24 Nov 2004 08:55:10 -0200 From: Luiz Fernando Capitulino Organization: Conectiva S/A User-Agent: Mozilla Thunderbird 0.7.3 (X11/20040803) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "David S. Miller" Cc: akpm@osdl.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch 10/13] net/socket.c::sys_bind() cleanup. References: <200411220644.iAM6i8900672@mail.osdl.org> <20041124002709.52cb8d1f.davem@davemloft.net> In-Reply-To: <20041124002709.52cb8d1f.davem@davemloft.net> X-Enigmail-Version: 0.85.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12194 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lcapitulino@conectiva.com.br Precedence: bulk X-list: netdev David S. Miller wrote: > On Sun, 21 Nov 2004 22:43:56 -0800 > akpm@osdl.org wrote: > > >>From: "Luiz Fernando N. Capitulino" >> >>net/socket.c::sys_bind() is a bit complex function, the patch below makes >>it more clear. >> >>Signed-off-by: Luiz Capitulino >>Signed-off-by: Andrew Morton > > > This was commented on to be buggy, or at least change behavior. > The "if (err >= 0)" tests were changed to flat "if (err)" tests. It doesn't a buggy or change behaivor. What happens here is that move_addr_to_kernel() returns 0 success and -EINVAL or -EFAULT on error. Thus, change from "if (err >= 0)" to "if (err)" is safe. Also, it was discussed and ACK'ed by James Morris: http://lkml.org/lkml/2004/11/16/339 The real problem here I've made a bad patch description. I'll try to make it better next time. thanks, -- Luiz Fernando N. Capitulino From buytenh@wantstofly.org Wed Nov 24 07:15:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 07:15:45 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOFFcCV016624 for ; Wed, 24 Nov 2004 07:15:39 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id E95292B0F7; Wed, 24 Nov 2004 16:15:17 +0100 (MET) Date: Wed, 24 Nov 2004 16:15:17 +0100 From: Lennert Buytenhek To: ganesh.venkatesan@intel.com, netdev@oss.sgi.com Cc: Robert Olsson , hadi@cyberus.ca Subject: [e1000] print bus type/speed/width on probe Message-ID: <20041124151517.GA17448@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 12195 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Hi, The attached patch (based on a patch by Robert Olsson) makes e1000 display bus type/speed/width on probe. All this info is already determined by e1000_hw. Output is as such (a la tg3): eth1: e1000 (PCI:33MHz:32-bit) 00:0e:0c:64:cc:a1 eth2: e1000 (PCI:66MHz:32-bit) 00:04:23:46:e2:50 I've found it useful -- please consider applying. cheers, Lennert Signed-off-by: Lennert Buytenhek diff -urN e1000.orig/e1000_main.c e1000/e1000_main.c --- e1000.orig/e1000_main.c 2004-11-24 15:35:23.000000000 +0100 +++ e1000/e1000_main.c 2004-11-24 16:04:30.000000000 +0100 @@ -585,6 +585,21 @@ if(eeprom_data & E1000_EEPROM_APME) adapter->wol |= E1000_WUFC_MAG; + /* print bus type/speed/width info */ + printk(KERN_INFO "%s: e1000 (PCI%s:%s:%s) ", netdev->name, + ((adapter->hw.bus_type == e1000_bus_type_pcix) ? "X" : ""), + ((adapter->hw.bus_speed == e1000_bus_speed_133) ? "133MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_120) ? "120MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_100) ? "100MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_66) ? "66MHz" : + "33MHz"), + ((adapter->hw.bus_width == e1000_bus_width_64) ? "64-bit" : + "32-bit")); + + for (i = 0; i < 6; i++) + printk("%2.2x%c", netdev->dev_addr[i], + i == 5 ? '\n' : ':'); + /* reset the hardware with the new settings */ e1000_reset(adapter); From nico@cam.org Wed Nov 24 07:21:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 07:21:42 -0800 (PST) Received: from xanadu.home (modemcable166.48-200-24.mc.videotron.ca [24.200.48.166]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOFLakK017083 for ; Wed, 24 Nov 2004 07:21:37 -0800 Received: from localhost (nico@localhost) by xanadu.home (8.11.6/8.11.6) with ESMTP id iAOFL6N09023; Wed, 24 Nov 2004 10:21:07 -0500 X-Authentication-Warning: xanadu.home: nico owned process doing -bs Date: Wed, 24 Nov 2004 10:21:06 -0500 (EST) From: Nicolas Pitre X-X-Sender: nico@xanadu.home To: Ian Campbell cc: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: "deadlock" between smc91x driver and link_watch In-Reply-To: <1101290297.10841.15.camel@icampbell-debian> Message-ID: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12196 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nico@cam.org Precedence: bulk X-list: netdev On Wed, 24 Nov 2004, Ian Campbell wrote: > Quite right. Fixed patch included. Small question: > + * smc_phy_configure_wq > + * > + * The net_device is referenced when the work was scheduled to avoid > + * the need for a flush_scheduled_work() in smc_close(). Drop the > + * reference and then do the configuration. You probably want to invert the comment here too. > +static void smc_phy_configure_wq(void *data) > +{ > + struct net_device *dev = data; > + smc_phy_configure(data); > + dev_put(dev); > +} [...] > @@ -1536,10 +1553,8 @@ > /* clear everything */ > smc_shutdown(dev); > > - if (lp->phy_type != 0) { > - flush_scheduled_work(); > + if (lp->phy_type != 0) > smc_phy_powerdown(dev, lp->mii.phy_id); How do you ensure that smc_phy_configure() can't end up being called after smc_phy_powerdown() here? Nicolas From icampbell@arcom.com Wed Nov 24 07:54:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 07:54:20 -0800 (PST) Received: from mail9.messagelabs.com (mail9.messagelabs.com [194.205.110.133]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAOFsEgY018115 for ; Wed, 24 Nov 2004 07:54:15 -0800 X-VirusChecked: Checked X-Env-Sender: icampbell@arcom.com X-Msg-Ref: server-22.tower-9.messagelabs.com!1101311621!11022908!1 X-StarScan-Version: 5.4.2; banners=arcom.com,-,- X-Originating-IP: [194.200.159.164] Received: (qmail 14794 invoked from network); 24 Nov 2004 15:53:41 -0000 Received: from mail2.arcom.com (194.200.159.164) by server-22.tower-9.messagelabs.com with SMTP; 24 Nov 2004 15:53:41 -0000 Received: from linuxdev.icampbell.arcom.cc [10.2.28.2] by mail2.arcom.com with ESMTP (SMTPD32-8.02) id AF0F147C014E; Wed, 24 Nov 2004 15:55:59 +0000 Subject: Re: "deadlock" between smc91x driver and link_watch From: Ian Campbell To: Nicolas Pitre Cc: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> Content-Type: text/plain Organization: Arcom Control Systems Date: Wed, 24 Nov 2004 15:52:38 +0000 Message-Id: <1101311558.31459.21.camel@icampbell-debian> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-IMAIL-SPAM-VALHELO: (343671118) X-IMAIL-SPAM-VALREVDNS: (343671118) X-archive-position: 12197 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: icampbell@arcom.com Precedence: bulk X-list: netdev On Wed, 2004-11-24 at 10:21 -0500, Nicolas Pitre wrote: > > + * smc_phy_configure_wq > > + * > > + * The net_device is referenced when the work was scheduled to avoid > > + * the need for a flush_scheduled_work() in smc_close(). Drop the > > + * reference and then do the configuration. > > You probably want to invert the comment here too. Quite right. > > @@ -1536,10 +1553,8 @@ > > /* clear everything */ > > smc_shutdown(dev); > > > > - if (lp->phy_type != 0) { > > - flush_scheduled_work(); > > + if (lp->phy_type != 0) > > smc_phy_powerdown(dev, lp->mii.phy_id); > > > How do you ensure that smc_phy_configure() can't end up being called > after smc_phy_powerdown() here? Hmm, I think that smc_phy_configure() is only called from smc_drv_resume() and smc_timeout() (via the workqueue). For smc_drv_resume() I expected that there would be some sort of mutual exclusion in the generic layers to prevent _close() and _resume() from happening at the same time. For smc_timeout() I would also expect that the generic layer would have cancelled the tx_timeout etc before calling smc_close(). I guess I don't know if either of these things are true -- anyone know? The other solution might be to set phy_type to 0 in smc_phy_powerdown() and then redetect it in smc_open() and smc_resume(). Or just use another flag altogether. Ian. -- Ian Campbell, Senior Design Engineer Web: http://www.arcom.com Arcom, Clifton Road, Direct: +44 (0)1223 403 465 Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200 _____________________________________________________________________ The message in this transmission is sent in confidence for the attention of the addressee only and should not be disclosed to any other party. Unauthorised recipients are requested to preserve this confidentiality. Please advise the sender if the addressee is not resident at the receiving end. Email to and from Arcom is automatically monitored for operational and lawful business reasons. This message has been virus scanned by MessageLabs. From jmorris@redhat.com Wed Nov 24 08:54:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 08:54:32 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOGsNCp023620 for ; Wed, 24 Nov 2004 08:54:23 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAOGs3Kv021062 for ; Wed, 24 Nov 2004 11:54:03 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAOGrvr06901 for ; Wed, 24 Nov 2004 11:53:57 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAOGruVY022286 for ; Wed, 24 Nov 2004 11:53:56 -0500 Date: Wed, 24 Nov 2004 11:53:57 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: netdev@oss.sgi.com Subject: ipsec hang (fwd) Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/Mixed; BOUNDARY="Boundary-00=_qc9oBllZHssRBBw" Content-ID: X-archive-position: 12198 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --Boundary-00=_qc9oBllZHssRBBw Content-Type: TEXT/PLAIN; CHARSET=ISO-8859-1 Content-Transfer-Encoding: 8BIT Content-ID: Content-Disposition: INLINE ---------- Forwarded message ---------- Date: Wed, 24 Nov 2004 01:34:49 +0100 From: "Marcin [iso-8859-2] Gibua" To: linux-kernel@vger.kernel.org Subject: ipsec hang Hi, today I tried to configure ipsec on my linux workstation (with openswan) and it hanged just after the init had run /etc/rc.d/init.d/ipsec start. It was on linux-2.6.10-rc1-bk20, so I upgraded to 2.6.10-rc2-mm3 but it didn't make any difference. The alt-sysrq-p shows the following call trace: xfrm_policy_insert xfrm_netlink_rcv netlink_data_ready netlink_sendmsg sock_aio_write do_sync_write sock_map_fd sys_select vfs_write system_call The full trace (with regs, etc) is available at http://www.iceni.pl/marcin/lockup.jpg .config attached. This hang is 100%-reproductible for me. I can attach openswan config if needed. -- mg --Boundary-00=_qc9oBllZHssRBBw Content-Type: TEXT/PLAIN; CHARSET=us-ascii; NAME=".config" Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME=".config" # # Automatically generated make config: don't edit # Linux kernel version: 2.6.10-rc2-mm3 # Tue Nov 23 19:16:56 2004 # CONFIG_X86_64=y CONFIG_64BIT=y CONFIG_X86=y CONFIG_MMU=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_X86_CMPXCHG=y CONFIG_EARLY_PRINTK=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_LOCK_KERNEL=y # # General setup # CONFIG_LOCALVERSION="" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_SYSCTL=y # CONFIG_AUDIT is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_HOTPLUG=y CONFIG_KOBJECT_UEVENT=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_FUTEX=y CONFIG_EPOLL=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SHMEM=y CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set # # Loadable module support # CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y CONFIG_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y # # Processor type and features # CONFIG_MK8=y # CONFIG_MPSC is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_GOOD_APIC=y # CONFIG_MICROCODE is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_MTRR=y # CONFIG_SMP is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_BKL=y # CONFIG_NUMA is not set # CONFIG_GART_IOMMU is not set CONFIG_DUMMY_IOMMU=y CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_PROBE=y # # Power management options # CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_SOFTWARE_SUSPEND=y CONFIG_PM_STD_PARTITION="" # # ACPI (Advanced Configuration and Power Interface) Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y # CONFIG_ACPI_VIDEO is not set CONFIG_ACPI_FAN=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_THERMAL=y # CONFIG_ACPI_ASUS is not set # CONFIG_ACPI_IBM is not set # CONFIG_ACPI_TOSHIBA is not set CONFIG_ACPI_BLACKLIST_YEAR=0 # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_BUS=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y # CONFIG_ACPI_CONTAINER is not set # # CPU Frequency scaling # # CONFIG_CPU_FREQ is not set # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y # CONFIG_PCI_MMCONFIG is not set CONFIG_UNORDERED_IO=y # CONFIG_PCI_MSI is not set # CONFIG_PCI_LEGACY_PROC is not set CONFIG_PCI_NAMES=y # # PCCARD (PCMCIA/CardBus) support # # CONFIG_PCCARD is not set # # PC-card bridges # # # PCI Hotplug Support # # CONFIG_HOTPLUG_PCI is not set # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_UID16=y # # Performance-monitoring counters support # CONFIG_PERFCTR=y CONFIG_PERFCTR_INIT_TESTS=y CONFIG_PERFCTR_VIRTUAL=y CONFIG_PERFCTR_INTERRUPT_SUPPORT=y CONFIG_KEXEC=y # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set # CONFIG_MTD_PARTITIONS is not set # CONFIG_MTD_CONCAT is not set # # User Modules And Translation Layers # # CONFIG_MTD_CHAR is not set # CONFIG_MTD_BLOCK is not set # CONFIG_MTD_BLOCK_RO is not set # CONFIG_FTL is not set # CONFIG_NFTL is not set # CONFIG_INFTL is not set # # RAM/ROM/Flash chip drivers # # CONFIG_MTD_CFI is not set # CONFIG_MTD_JEDECPROBE is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set CONFIG_MTD_PHRAM=y # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLKMTD is not set # # Disk-On-Chip Device Drivers # # CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set # # NAND Flash Device Drivers # # CONFIG_MTD_NAND is not set # # Parallel port support # # CONFIG_PARPORT is not set # # Plug and Play support # # CONFIG_PNP is not set # # Block devices # CONFIG_BLK_DEV_FD=y # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_UB is not set # CONFIG_BLK_DEV_RAM is not set CONFIG_INITRAMFS_SOURCE="" # CONFIG_LBD is not set # CONFIG_CDROM_PKTCDVD is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y # CONFIG_IOSCHED_AS is not set # CONFIG_IOSCHED_DEADLINE is not set CONFIG_IOSCHED_CFQ=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set CONFIG_IDE_TASK_IOCTL=y # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set CONFIG_BLK_DEV_IDEPCI=y # CONFIG_IDEPCI_SHARE_IRQ is not set # CONFIG_BLK_DEV_OFFBOARD is not set # CONFIG_BLK_DEV_GENERIC is not set # CONFIG_BLK_DEV_OPTI621 is not set # CONFIG_BLK_DEV_RZ1000 is not set CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y # CONFIG_BLK_DEV_ATIIXP is not set # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_TRIFLEX is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5520 is not set # CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_HPT34X is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_PIIX is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set # CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # CONFIG_SCSI_MULTI_LUN=y # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # # SCSI Transport Attributes # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set CONFIG_SCSI_SATA=y # CONFIG_SCSI_SATA_AHCI is not set # CONFIG_SCSI_SATA_SVW is not set # CONFIG_SCSI_ATA_PIIX is not set # CONFIG_SCSI_SATA_NV is not set # CONFIG_SCSI_SATA_PROMISE is not set # CONFIG_SCSI_SATA_SX4 is not set CONFIG_SCSI_SATA_SIL=y # CONFIG_SCSI_SATA_SIS is not set # CONFIG_SCSI_SATA_ULI is not set # CONFIG_SCSI_SATA_VIA is not set # CONFIG_SCSI_SATA_VITESSE is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set CONFIG_SCSI_QLA2XXX=y # CONFIG_SCSI_QLA21XX is not set # CONFIG_SCSI_QLA22XX is not set # CONFIG_SCSI_QLA2300 is not set # CONFIG_SCSI_QLA2322 is not set # CONFIG_SCSI_QLA6312 is not set # CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DEBUG is not set # # Multi-device support (RAID and LVM) # CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=y CONFIG_MD_RAID0=y CONFIG_MD_RAID1=y # CONFIG_MD_RAID10 is not set # CONFIG_MD_RAID5 is not set # CONFIG_MD_RAID6 is not set # CONFIG_MD_MULTIPATH is not set # CONFIG_MD_FAULTY is not set CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # # Fusion MPT device support # # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # CONFIG_IEEE1394=y # # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # Device Drivers # # CONFIG_IEEE1394_PCILYNX is not set CONFIG_IEEE1394_OHCI1394=y # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=y CONFIG_IEEE1394_SBP2=y # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set # CONFIG_IEEE1394_ETH1394 is not set CONFIG_IEEE1394_DV1394=y CONFIG_IEEE1394_RAWIO=y # CONFIG_IEEE1394_CMP is not set # # I2O device support # # CONFIG_I2O is not set # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_NETLINK_DEV=y CONFIG_UNIX=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_TUNNEL=y CONFIG_IP_TCPDIAG=y CONFIG_IP_TCPDIAG_IPV6=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set CONFIG_IPV6=y CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=y CONFIG_INET6_ESP=y CONFIG_INET6_IPCOMP=y CONFIG_INET6_TUNNEL=y CONFIG_IPV6_TUNNEL=y CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=y CONFIG_IP_NF_CT_ACCT=y CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CT_PROTO_SCTP=y CONFIG_IP_NF_FTP=y CONFIG_IP_NF_IRC=y CONFIG_IP_NF_TFTP=y CONFIG_IP_NF_AMANDA=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_REALM=m CONFIG_IP_NF_MATCH_SCTP=m CONFIG_IP_NF_MATCH_COMMENT=m CONFIG_IP_NF_MATCH_CONNMARK=m CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m CONFIG_IP_NF_NAT_LOCAL=y CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_CONNMARK=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_TARGET_NOTRACK=m CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # # IPv6: Netfilter Configuration # CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m CONFIG_IP6_NF_RAW=m CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=y # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set CONFIG_SCTP_HMAC_SHA1=y # CONFIG_SCTP_HMAC_MD5 is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # # QoS and/or fair queueing # CONFIG_NET_SCHED=y # CONFIG_NET_SCH_CLK_JIFFIES is not set # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set CONFIG_NET_SCH_CLK_CPU=y CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m # CONFIG_NET_SCH_PRIO is not set CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m # CONFIG_NET_SCH_TEQL is not set CONFIG_NET_SCH_TBF=m # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_INGRESS is not set CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m # CONFIG_CLS_U32_PERF is not set # CONFIG_NET_CLS_IND is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_IPT is not set # CONFIG_NET_ACT_PEDIT is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_KGDBOE is not set # CONFIG_NETPOLL is not set # CONFIG_NETPOLL_RX is not set # CONFIG_NETPOLL_TRAP is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_HAMRADIO is not set CONFIG_IRDA=y # # IrDA protocols # # CONFIG_IRLAN is not set # CONFIG_IRCOMM is not set CONFIG_IRDA_ULTRA=y # # IrDA options # # CONFIG_IRDA_CACHE_LAST_LSAP is not set # CONFIG_IRDA_FAST_RR is not set # CONFIG_IRDA_DEBUG is not set # # Infrared-port device drivers # # # SIR device drivers # # CONFIG_IRTTY_SIR is not set # # Dongle support # # # Old SIR device drivers # # CONFIG_IRPORT_SIR is not set # # Old Serial dongle support # # # FIR device drivers # # CONFIG_USB_IRDA is not set CONFIG_SIGMATEL_FIR=y # CONFIG_VLSI_FIR is not set # CONFIG_BT is not set CONFIG_NETDEVICES=y # CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set # CONFIG_ETHERTAP is not set # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # # CONFIG_NET_ETHERNET is not set # # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set # CONFIG_DL2K is not set # CONFIG_E1000 is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set CONFIG_SK98LIN=y # CONFIG_TIGON3 is not set # # Ethernet (10000 Mbit) # # CONFIG_IXGB is not set # CONFIG_S2IO is not set # # Token Ring devices # # CONFIG_TR is not set # # Wireless LAN (non-hamradio) # # CONFIG_NET_RADIO is not set # # Wan interfaces # # CONFIG_WAN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set # CONFIG_NET_FC is not set # CONFIG_SHAPER is not set # CONFIG_NETCONSOLE is not set # # ISDN subsystem # # CONFIG_ISDN is not set # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=y # CONFIG_INPUT_TSDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # CONFIG_GAMEPORT=y CONFIG_SOUND_GAMEPORT=y # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set CONFIG_GAMEPORT_EMU10K1=y # CONFIG_GAMEPORT_VORTEX is not set # CONFIG_GAMEPORT_FM801 is not set # CONFIG_GAMEPORT_CS461x is not set CONFIG_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_VSXXXAA is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDDLER is not set # CONFIG_JOYSTICK_JOYDUMP is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=y # CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_NONSTANDARD is not set # # Serial drivers # # CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # # IPMI # # CONFIG_IPMI_HANDLER is not set # # Watchdog Cards # CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_SC520_WDT is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_IB700_WDT is not set # CONFIG_WAFER_WDT is not set # CONFIG_I8XX_TCO is not set # CONFIG_SC1200_WDT is not set # CONFIG_SCx200_WDT is not set # CONFIG_60XX_WDT is not set # CONFIG_CPU5_WDT is not set CONFIG_W83627HF_WDT=y # CONFIG_W83877F_WDT is not set # CONFIG_MACHZ_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_HW_RANDOM=y CONFIG_NVRAM=y CONFIG_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set CONFIG_AGP=y CONFIG_AGP_AMD64=y # CONFIG_AGP_INTEL_MCH is not set CONFIG_DRM=y # CONFIG_DRM_TDFX is not set # CONFIG_DRM_R128 is not set CONFIG_DRM_RADEON=m # CONFIG_DRM_SIS is not set # CONFIG_MWAVE is not set # CONFIG_RAW_DRIVER is not set CONFIG_HPET=y # CONFIG_HPET_RTC_IRQ is not set CONFIG_HPET_MMAP=y # CONFIG_HANGCHECK_TIMER is not set # # I2C support # CONFIG_I2C=y CONFIG_I2C_CHARDEV=y # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y CONFIG_I2C_ALGOPCF=y CONFIG_I2C_ALGOPCA=y # # I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set CONFIG_I2C_AMD756=y # CONFIG_I2C_AMD756_S4882 is not set CONFIG_I2C_AMD8111=y # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set CONFIG_I2C_ISA=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # # Hardware Sensors Chip support # CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83L785TS is not set CONFIG_SENSORS_W83627HF=y # # Other I2C Chip support # # CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_RTC8564 is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # # CONFIG_IBM_ASM is not set # # Multimedia devices # CONFIG_VIDEO_DEV=y # # Video For Linux # # # Video Adapters # # CONFIG_VIDEO_BT848 is not set # CONFIG_VIDEO_CPIA is not set # CONFIG_VIDEO_SAA5246A is not set # CONFIG_VIDEO_SAA5249 is not set # CONFIG_TUNER_3036 is not set # CONFIG_VIDEO_STRADIS is not set # CONFIG_VIDEO_ZORAN is not set CONFIG_VIDEO_SAA7134=m # CONFIG_VIDEO_MXB is not set # CONFIG_VIDEO_DPC is not set # CONFIG_VIDEO_HEXIUM_ORION is not set # CONFIG_VIDEO_HEXIUM_GEMINI is not set # CONFIG_VIDEO_CX88 is not set # CONFIG_VIDEO_OVCAMCHIP is not set # # Radio Adapters # # CONFIG_RADIO_GEMTEK_PCI is not set # CONFIG_RADIO_MAXIRADIO is not set # CONFIG_RADIO_MAESTRO is not set # # Digital Video Broadcasting Devices # # CONFIG_DVB is not set CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_VESA is not set CONFIG_VIDEO_SELECT=y # CONFIG_FB_HGA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_MATROX is not set CONFIG_FB_RADEON_OLD=y # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_VIRTUAL is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # # Logo configuration # CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # # Sound # CONFIG_SOUND=y # # Advanced Linux Sound Architecture # CONFIG_SND=y CONFIG_SND_TIMER=y CONFIG_SND_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_SEQUENCER=y # CONFIG_SND_SEQ_DUMMY is not set CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=y CONFIG_SND_PCM_OSS=y CONFIG_SND_SEQUENCER_OSS=y # CONFIG_SND_BIT32_EMUL is not set CONFIG_SND_RTCTIMER=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # # CONFIG_SND_DUMMY is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # # PCI devices # CONFIG_SND_AC97_CODEC=y # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CS4281 is not set CONFIG_SND_EMU10K1=y # CONFIG_SND_KORG1212 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_YMFPCI is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VX222 is not set # # USB devices # # CONFIG_SND_USB_AUDIO is not set # CONFIG_SND_USB_USX2Y is not set # # Open Sound System # # CONFIG_SOUND_PRIME is not set # # USB support # CONFIG_USB=y # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y CONFIG_USB_BANDWIDTH=y CONFIG_USB_DYNAMIC_MINORS=y CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_UHCI_HCD is not set # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # CONFIG_USB_BLUETOOTH_TTY is not set # CONFIG_USB_MIDI is not set # CONFIG_USB_ACM is not set CONFIG_USB_PRINTER=y CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_RW_DETECT is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # # USB Input Devices # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y CONFIG_HID_FF=y # CONFIG_HID_PID is not set CONFIG_LOGITECH_FF=y # CONFIG_THRUSTMASTER_FF is not set # CONFIG_USB_HIDDEV is not set # CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set # CONFIG_USB_MTOUCH is not set # CONFIG_USB_EGALAX is not set # CONFIG_USB_XPAD is not set # CONFIG_USB_ATI_REMOTE is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_HPUSBSCSI is not set # # USB Multimedia devices # # CONFIG_USB_DABUSB is not set # CONFIG_USB_VICAM is not set # CONFIG_USB_DSBR is not set # CONFIG_USB_IBMCAM is not set # CONFIG_USB_KONICAWC is not set # CONFIG_USB_OV511 is not set # CONFIG_USB_SE401 is not set # CONFIG_USB_SN9C102 is not set # CONFIG_USB_STV680 is not set # # USB Network Adapters # # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_USBNET is not set # # USB port drivers # # # USB Serial Converter support # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_TEST is not set # # USB ATM/DSL drivers # # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # Firmware Drivers # CONFIG_EDD=y # # File systems # # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set # CONFIG_JBD is not set # CONFIG_REISER4_FS is not set CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y # CONFIG_REISERFS_FS_SECURITY is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=m CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_NTFS_FS=m # CONFIG_NTFS_DEBUG is not set CONFIG_NTFS_RW=y # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y # CONFIG_DEVPTS_FS_SECURITY is not set CONFIG_TMPFS=y CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_SECURITY is not set CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # # Network File Systems # # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_EXPORTFS is not set CONFIG_SMB_FS=y # CONFIG_SMB_NLS_DEFAULT is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_EFI_PARTITION is not set # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=y CONFIG_NLS_CODEPAGE_775=y CONFIG_NLS_CODEPAGE_850=y CONFIG_NLS_CODEPAGE_852=y # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=y # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set CONFIG_NLS_UTF8=y # # Profiling support # # CONFIG_PROFILING is not set # # Kernel hacking # CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set CONFIG_DEBUG_PREEMPT=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_INFO is not set # CONFIG_CHECKING is not set # CONFIG_INIT_DEBUG is not set # CONFIG_KPROBES is not set # CONFIG_KGDB is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_KHAZAD=m # CONFIG_CRYPTO_ANUBIS is not set CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m # CONFIG_CRYPTO_TEST is not set # # Library routines # CONFIG_CRC_CCITT=y CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y --Boundary-00=_qc9oBllZHssRBBw-- From nico@cam.org Wed Nov 24 08:58:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 08:58:22 -0800 (PST) Received: from xanadu.home (modemcable166.48-200-24.mc.videotron.ca [24.200.48.166]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOGwH4c024105 for ; Wed, 24 Nov 2004 08:58:18 -0800 Received: from localhost (nico@localhost) by xanadu.home (8.11.6/8.11.6) with ESMTP id iAOGvoJ09466; Wed, 24 Nov 2004 11:57:50 -0500 X-Authentication-Warning: xanadu.home: nico owned process doing -bs Date: Wed, 24 Nov 2004 11:57:50 -0500 (EST) From: Nicolas Pitre X-X-Sender: nico@xanadu.home To: Ian Campbell cc: Andrew Morton , lkml , netdev@oss.sgi.com Subject: Re: "deadlock" between smc91x driver and link_watch In-Reply-To: <1101311558.31459.21.camel@icampbell-debian> Message-ID: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> <1101311558.31459.21.camel@icampbell-debian> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12199 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nico@cam.org Precedence: bulk X-list: netdev On Wed, 24 Nov 2004, Ian Campbell wrote: > On Wed, 2004-11-24 at 10:21 -0500, Nicolas Pitre wrote: > > > How do you ensure that smc_phy_configure() can't end up being called > > after smc_phy_powerdown() here? > > Hmm, I think that smc_phy_configure() is only called from > smc_drv_resume() and smc_timeout() (via the workqueue). There is smc_open() as well, but only smc_timeout() is really problematic because of the schedule_work() call. > The other solution might be to set phy_type to 0 in smc_phy_powerdown() > and then redetect it in smc_open() and smc_resume(). Or just use another > flag altogether. Please make it another flag. You could replace your dev_hold(dev) with lp->work_pending = 1 and dev_put() with lp->work_pending = 0, then adding a while (lp->work_pending) schedule() in place of the flush_scheduled_work(). And while you're at it, could you replace: smc_phy_configure(void *data) with smc_phy_configure(struct net_device *dev) The parameter doesn't have to be void *data anymore now that you introduced smc_phy_configure_wq(). And finally, please tell about the reason why flush_scheduled_work() can't be used in your comment. Nicolas From icampbell@arcom.com Wed Nov 24 09:14:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 09:14:26 -0800 (PST) Received: from mail9.messagelabs.com (mail9.messagelabs.com [194.205.110.133]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAOHEK3i025077 for ; Wed, 24 Nov 2004 09:14:21 -0800 X-VirusChecked: Checked X-Env-Sender: icampbell@arcom.com X-Msg-Ref: server-23.tower-9.messagelabs.com!1101316434!14183883!1 X-StarScan-Version: 5.4.2; banners=arcom.com,-,- X-Originating-IP: [194.200.159.164] Received: (qmail 24000 invoked from network); 24 Nov 2004 17:13:54 -0000 Received: from mail2.arcom.com (194.200.159.164) by server-23.tower-9.messagelabs.com with SMTP; 24 Nov 2004 17:13:54 -0000 Received: from linuxdev.icampbell.arcom.cc [10.2.28.2] by mail2.arcom.com with ESMTP (SMTPD32-8.02) id A219188200DC; Wed, 24 Nov 2004 17:17:13 +0000 Subject: Re: "deadlock" between smc91x driver and link_watch From: Ian Campbell To: Nicolas Pitre Cc: Andrew Morton , lkml , netdev@oss.sgi.com In-Reply-To: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> <1101311558.31459.21.camel@icampbell-debian> Content-Type: text/plain Organization: Arcom Control Systems Date: Wed, 24 Nov 2004 17:13:52 +0000 Message-Id: <1101316432.31459.24.camel@icampbell-debian> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-IMAIL-SPAM-VALHELO: (411173084) X-IMAIL-SPAM-VALREVDNS: (411173084) X-archive-position: 12200 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: icampbell@arcom.com Precedence: bulk X-list: netdev On Wed, 2004-11-24 at 11:57 -0500, Nicolas Pitre wrote: I'll have a go at all this tomorrow. Cheers, Ian. -- Ian Campbell, Senior Design Engineer Web: http://www.arcom.com Arcom, Clifton Road, Direct: +44 (0)1223 403 465 Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200 _____________________________________________________________________ The message in this transmission is sent in confidence for the attention of the addressee only and should not be disclosed to any other party. Unauthorised recipients are requested to preserve this confidentiality. Please advise the sender if the addressee is not resident at the receiving end. Email to and from Arcom is automatically monitored for operational and lawful business reasons. This message has been virus scanned by MessageLabs. From kaber@trash.net Wed Nov 24 10:11:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 10:11:30 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOIBNfQ026600 for ; Wed, 24 Nov 2004 10:11:24 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CX1bV-0007UJ-R0; Wed, 24 Nov 2004 19:10:57 +0100 Message-ID: <41A4CEB1.7000001@trash.net> Date: Wed, 24 Nov 2004 19:10:57 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Andrew Morton CC: netdev@oss.sgi.com, =?ISO-8859-1?Q?Marcin_Gibu=B3a?= , jmorris@redhat.com Subject: Re: Fw: ipsec hang References: <20041123173111.1b74fabb.akpm@osdl.org> In-Reply-To: <20041123173111.1b74fabb.akpm@osdl.org> Content-Type: multipart/mixed; boundary="------------030605060200040204090409" X-archive-position: 12201 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------030605060200040204090409 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Andrew Morton wrote: >Looks like one of the chains off xfrm_policy_list[] might have gone >circular? > This patch fixes it. When a policy with a priority lower than an existing policy is inserted, it loops forever on the existing policy. Regards Patrick >Begin forwarded message: > >Date: Wed, 24 Nov 2004 01:34:49 +0100 >From: Marcin Gibua >To: linux-kernel@vger.kernel.org >Subject: ipsec hang > > >Hi, >today I tried to configure ipsec on my linux workstation (with openswan) and >it hanged just after the init had run /etc/rc.d/init.d/ipsec start. >It was on linux-2.6.10-rc1-bk20, so I upgraded to 2.6.10-rc2-mm3 but it didn't >make any difference. > >The alt-sysrq-p shows the following call trace: >xfrm_policy_insert >xfrm_netlink_rcv >netlink_data_ready >netlink_sendmsg >sock_aio_write >do_sync_write >sock_map_fd >sys_select >vfs_write >system_call > --------------030605060200040204090409 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/23 18:21:09-08:00 kaber@trash.net # [XFRM]: Fix endless loop in xfrm_policy_insert # # The patch 'Fix policy update bug when increasing # priority of last policy' broke this, when a policy # with lower priority than an existing policy is inserted # xfrm_policy_insert loops forever. # # Signed-off-by: Patrick McHardy # Signed-off-by: David S. Miller # # net/xfrm/xfrm_policy.c # 2004/11/23 18:20:49-08:00 kaber@trash.net +1 -0 # [XFRM]: Fix endless loop in xfrm_policy_insert # # The patch 'Fix policy update bug when increasing # priority of last policy' broke this, when a policy # with lower priority than an existing policy is inserted # xfrm_policy_insert loops forever. # # Signed-off-by: Patrick McHardy # Signed-off-by: David S. Miller # diff -Nru a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c --- a/net/xfrm/xfrm_policy.c 2004-11-24 19:01:38 +01:00 +++ b/net/xfrm/xfrm_policy.c 2004-11-24 19:01:38 +01:00 @@ -353,6 +353,7 @@ newpos = p; if (delpol) break; + p = &pol->next; } if (newpos) p = newpos; --------------030605060200040204090409-- From nacc@us.ibm.com Wed Nov 24 10:16:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 10:16:41 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOIGZRS027013 for ; Wed, 24 Nov 2004 10:16:36 -0800 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e5.ny.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAOIGAHt476058 for ; Wed, 24 Nov 2004 13:16:10 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAOIGAL8229340 for ; Wed, 24 Nov 2004 13:16:10 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAOIG9js006002 for ; Wed, 24 Nov 2004 13:16:10 -0500 Received: from localhost.localdomain (DYN319139.beaverton.ibm.com [9.47.21.139]) by d01av02.pok.ibm.com (8.12.11/8.12.11) with ESMTP id iAOIG9Ur005968; Wed, 24 Nov 2004 13:16:09 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11/Debian-5) with ESMTP id iAOIG8Rv001793; Wed, 24 Nov 2004 10:16:08 -0800 Received: (from nacc@localhost) by localhost.localdomain (8.12.11/8.12.11/Debian-5) id iAOIG7Ks001790; Wed, 24 Nov 2004 10:16:07 -0800 X-Authentication-Warning: localhost.localdomain: nacc set sender to nacc@us.ibm.com using -f Date: Wed, 24 Nov 2004 10:16:07 -0800 From: Nishanth Aravamudan To: janitor@sternwelten.at, netdev@oss.sgi.com, jgarzik@pobox.com, linux-kernel@vger.kernel.org, kernel-janitors@lists.osdl.org Subject: Re: [PATCH] Add ssleep_interruptible() Message-ID: <20041124181607.GA1720@us.ibm.com> References: <20041101200749.GF1730@us.ibm.com> <20041117013059.GA4218@us.ibm.com> <20041122024804.GD4146@verge.net.au> <20041122171922.GA7770@us.ibm.com> <20041124020111.GF31329@verge.net.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041124020111.GF31329@verge.net.au> X-Operating-System: Linux 2.6.9-test-acpi (i686) User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12202 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nacc@us.ibm.com Precedence: bulk X-list: netdev On Wed, Nov 24, 2004 at 11:01:13AM +0900, Horms wrote: > On Mon, Nov 22, 2004 at 09:19:22AM -0800, Nishanth Aravamudan wrote: > > On Mon, Nov 22, 2004 at 11:48:05AM +0900, Horms wrote: > > > On Tue, Nov 16, 2004 at 05:30:59PM -0800, Nishanth Aravamudan wrote: > > > > On Mon, Nov 01, 2004 at 12:07:49PM -0800, Nishanth Aravamudan wrote: > > > > > Description: Adds ssleep_interruptible() to allow longer delays to occur > > > > > in TASK_INTERRUPTIBLE, similarly to ssleep(). To be consistent with > > > > > msleep_interruptible(), ssleep_interruptible() returns the remaining time > > > > > left in the delay in terms of seconds. This required dividing the return > > > > > value of msleep_interruptible() by 1000, thus a cast to (unsigned long) > > > > > to prevent any floating point issues. > > > > > > > > > > Signed-off-by: Nishanth Aravamudan > > > > > > > > > > --- 2.6.10-rc1-vanilla/include/linux/delay.h 2004-10-30 > > > > > 15:34:03.000000000 -0700 > > > > > +++ 2.6.10-rc1/include/linux/delay.h 2004-11-01 12:06:11.000000000 -0800 > > > > > @@ -46,4 +46,9 @@ static inline void ssleep(unsigned int s > > > > > msleep(seconds * 1000); > > > > > } > > > > > > > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > > > > +{ > > > > > + return (unsigned long)(msleep_interruptible(seconds * 1000) / 1000); > > > > > +} > > > > > + > > > > > #endif /* defined(_LINUX_DELAY_H) */ > > > > > > > > After a discussion on IRC, I believe it is pretty clear that this > > > > function has serious issues. Mainly, that if I request a delay of 1 > > > > second, but msleep_interruptible() returns after 1 millisecond, then > > > > ssleep_interruptible() will return 0, claiming the entire delay was > > > > used (due to rounding). > > > > > > > > Perhaps we should just be satisfied with milliseconds being the grossest > > > > (in contrast to fine) measure of time, at least in terms of > > > > interruptible delays. ssleep() is unaffected by this problem, of course. > > > > > > > > Please revert this patch, if applied, as well as any of the other > > > > patches I sent using ssleep_interruptible() [only a handful]. > > > > > > Would making sure that the time slept was always rounded up to > > > the nearest second resolve this problem. I believe that rounding > > > up is a common approach to resolving this type of problem when > > > changing clock resolution. > > > > > > I am thinking of something like this. > > > > > > ===== include/linux/delay.h 1.6 vs edited ===== > > > --- 1.6/include/linux/delay.h 2004-09-03 18:08:32 +09:00 > > > +++ edited/include/linux/delay.h 2004-11-22 11:47:03 +09:00 > > > @@ -46,4 +46,10 @@ static inline void ssleep(unsigned int s > > > msleep(seconds * 1000); > > > } > > > > > > +static inline unsigned long ssleep_interruptible(unsigned int seconds) > > > +{ > > > + return (unsigned long)((msleep_interruptible(seconds * 1000) + 999) / > > > + 1000); > > > > This is a good idea, but I have two issues: > > > > 1) A major reason for having msecs_to_jiffies() and co. is to avoid > > having to do this type of conversion ourselves. A weak argument, > > admittedly, but just something to keep in mind. > > > > 2) This still has a serious logical flaw: If I request 1 second of > > sleep, and I don't sleep the entire time, then it is now guaranteed that > > I will think I did not sleep at all (ie. ssleep_interruptible() will > > return 1). That's just another version of the original issue. > > > > I just don't think it's useful to have this coarse of granularity, at > > least in terms of interruptible sleep. > > If it is unacceptable to neither underestimate or overestimate the > duration of a sleep to the nearest second (the unit of granularity of > the sleep in this case) then I agree. This is kind of my position. Overestimating leads to the potential, if a loop is used by the caller, of never leaving the loop, e.g. timeout = 1; while (timeout) { timeout = ssleep_interruptible(timeout); } Underestimating leads to leaving the loop too early, because the caller thinks a full second has expired and thus a signal was *not* received in on *full* second, typically leading to an error condition. > That is unless you want to request > a sleep in seconds but have the duration returned in milliseconds. But > if that is the case then it is probably more sensible to just use > msleep_interruptible() and be done with it. Exactly, I think that an API which has a parameter in seconds and a return value in milliseconds is pretty bad. Makes things very confusing and really msleep_interruptible() is the same, just a difference of parameter units, then. -Nish From nitin.hande@gmail.com Wed Nov 24 10:43:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 10:43:36 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.202]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOIhWJm027844 for ; Wed, 24 Nov 2004 10:43:33 -0800 Received: by rproxy.gmail.com with SMTP id 40so33030rnz for ; Wed, 24 Nov 2004 10:43:13 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:mime-version:content-type:content-transfer-encoding; b=Of1v+OUQpPfGfAfycN5oR7h8pC8HO440bSGotYw33kCvTbtPFc/VKD5ExBwdhsvh5crUcpGfBPWQXZdlLv8e6i9JRFbBekpRa/Ie0zm0kvjLfxwVZ/2vFkehPwKbZeITloi6dZ8lOxa3H01Z01Pek3OB9odNrpMTdPoInbdx6Uc= Received: by 10.38.8.74 with SMTP id 74mr303513rnh; Wed, 24 Nov 2004 10:43:12 -0800 (PST) Received: by 10.38.8.33 with HTTP; Wed, 24 Nov 2004 10:43:12 -0800 (PST) Message-ID: <78a6df57041124104367acffe0@mail.gmail.com> Date: Wed, 24 Nov 2004 10:43:12 -0800 From: Nitin Hande Reply-To: Nitin Hande To: netdev@oss.sgi.com Subject: Recv path on bonding driver question Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12203 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nitin.hande@gmail.com Precedence: bulk X-list: netdev Hello All, I am new to Linux networking code. I am trying to understand recv path of a packet after bonding. I have a regular peer ether interface connected over a switch. On one side I enslave one of the ether interface, so I get the following setup: bond0 Link encap:Ethernet HWaddr 00:09:3D:00:3D:3B inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:13783 errors:0 dropped:0 overruns:0 frame:0 TX packets:757 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1308089 (1.2 Mb) TX bytes:76076 (74.2 Kb) eth1 Link encap:Ethernet HWaddr 00:09:3D:00:3D:3B inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::209:3dff:fe00:3d3b/64 Scope:Link UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:13783 errors:0 dropped:0 overruns:0 frame:0 TX packets:757 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1308089 (1.2 Mb) TX bytes:76076 (74.2 Kb) Interrupt:26 The other side remains a plain ether interface. Peer side: eth0 Link encap:Ethernet HWaddr 00:09:3D:00:1D:5F inet addr:192.168.1.6 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::209:3dff:fe00:1d5f/64 Scope:Link UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 RX packets:569584 errors:0 dropped:0 overruns:0 frame:0 TX packets:262048 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:46057796 (43.9 Mb) TX bytes:29189722 (27.8 Mb) Interrupt:25 While I ping from 192.168.1.6 to 192.168.1.1, ping works fine. Now, if I run tcpdump on eth1 interface, I only see the icmp replies getting out of interface. sins-stinger-04:/var/tmp/linux-2.6.9 # ping 192.168.1.1 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.07 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.091 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.095 ms 64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.085 ms 64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.083 ms --- 192.168.1.1 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4000ms rtt min/avg/max/mdev = 0.083/0.286/1.078/0.396 ms ------------- sins-stinger-8:/var/tmp/linux-2.6.9/ # tcpdump -xv -i eth1 -n icmp tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 15:04:31.433060 IP (tos 0x0, ttl 64, id 25225, offset 0, flags [none], length: 84) 192.168.1.1 > 192.168.1.6: icmp 64: echo reply seq 1 4500 0054 6289 0000 4001 94c8 c0a8 0101 c0a8 0106 0000 65b1 fd69 0001 2db4 a341 0000 0000 011b 0c00 0000 0000 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 15:04:32.432857 IP (tos 0x0, ttl 64, id 25226, offset 0, flags [none], length: 84) 192.168.1.1 > 192.168.1.6: icmp 64: echo reply seq 2 4500 0054 628a 0000 4001 94c7 c0a8 0101 c0a8 0106 0000 2bad fd69 0002 2eb4 a341 0000 0000 3a1e 0c00 0000 0000 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 15:04:33.432709 IP (tos 0x0, ttl 64, id 25227, offset 0, flags [none], length: 84) 192.168.1.1 > 192.168.1.6: icmp 64: echo reply seq 3 4500 0054 628b 0000 4001 94c6 c0a8 0101 c0a8 0106 0000 afac fd69 0003 2fb4 a341 0000 0000 b51d 0c00 0000 0000 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 My question is seems like netdev_set_master(??) makes some routing socket changes etc in the Linux kernel. How does that affect the receive path such that one cannot see the incoming icmp request on the actual interface after bonding ? And then why can one see the packet in the outgoing path? Any ideas ?? Thanks in advance. Nitin From Robert.Olsson@data.slu.se Wed Nov 24 11:26:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 11:26:19 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOJQA3u030217 for ; Wed, 24 Nov 2004 11:26:11 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAOJPmiu032565; Wed, 24 Nov 2004 20:25:48 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 2CD36EC5CC; Wed, 24 Nov 2004 20:19:09 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16804.57005.843753.810704@robur.slu.se> Date: Wed, 24 Nov 2004 20:19:09 +0100 To: "David S. Miller" Cc: Robert.Olsson@data.slu.se, netdev@oss.sgi.com Subject: FIB reorg (3) X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12204 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev And also fib_detect_death. --ro --- net/ipv4/fib_hash.c.041118 Thu Nov 18 20:09:55 2004 +++ net/ipv4/fib_hash.c Thu Nov 18 20:36:00 2004 @@ -49,6 +49,9 @@ static kmem_cache_t *fn_alias_kmem; extern struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio); +extern int fib_detect_death(struct fib_info *fi, int order, + struct fib_info **last_resort, int *last_idx, int *dflt); + struct fib_node { struct hlist_node fn_hash; @@ -276,29 +279,6 @@ static int fn_hash_last_dflt=-1; -static int fib_detect_death(struct fib_info *fi, int order, - struct fib_info **last_resort, int *last_idx) -{ - struct neighbour *n; - int state = NUD_NONE; - - n = neigh_lookup(&arp_tbl, &fi->fib_nh[0].nh_gw, fi->fib_dev); - if (n) { - state = n->nud_state; - neigh_release(n); - } - if (state==NUD_REACHABLE) - return 0; - if ((state&NUD_VALID) && order != fn_hash_last_dflt) - return 0; - if ((state&NUD_VALID) || - (*last_idx<0 && order > fn_hash_last_dflt)) { - *last_resort = fi; - *last_idx = order; - } - return 1; -} - static void fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res) { @@ -339,7 +319,7 @@ if (next_fi != res->fi) break; } else if (!fib_detect_death(fi, order, &last_resort, - &last_idx)) { + &last_idx, &fn_hash_last_dflt)) { if (res->fi) fib_info_put(res->fi); res->fi = fi; @@ -357,7 +337,7 @@ goto out; } - if (!fib_detect_death(fi, order, &last_resort, &last_idx)) { + if (!fib_detect_death(fi, order, &last_resort, &last_idx, &fn_hash_last_dflt)) { if (res->fi) fib_info_put(res->fi); res->fi = fi; --- net/ipv4/fib_semantics.c.041118 Thu Nov 18 20:26:02 2004 +++ net/ipv4/fib_semantics.c Thu Nov 18 20:18:00 2004 @@ -317,6 +317,30 @@ } +int fib_detect_death(struct fib_info *fi, int order, + struct fib_info **last_resort, int *last_idx, int *dflt) +{ + struct neighbour *n; + int state = NUD_NONE; + + n = neigh_lookup(&arp_tbl, &fi->fib_nh[0].nh_gw, fi->fib_dev); + if (n) { + state = n->nud_state; + neigh_release(n); + } + if (state==NUD_REACHABLE) + return 0; + if ((state&NUD_VALID) && order != *dflt) + return 0; + if ((state&NUD_VALID) || + (*last_idx<0 && order > *dflt)) { + *last_resort = fi; + *last_idx = order; + } + return 1; +} + + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From Robert.Olsson@data.slu.se Wed Nov 24 11:26:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 11:26:20 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOJQArg030218 for ; Wed, 24 Nov 2004 11:26:11 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAOJPmiu032561; Wed, 24 Nov 2004 20:25:48 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 46914EC5C0; Wed, 24 Nov 2004 20:09:42 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16804.56438.318740.779153@robur.slu.se> Date: Wed, 24 Nov 2004 20:09:42 +0100 To: "David S. Miller" Cc: Robert.Olsson@data.slu.se, netdev@oss.sgi.com Subject: FIB reorg (1) X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12205 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Hello! A couple of patches to reorg. FIB and make fib_hash.c cleaner. rtmsg_fib() can be made a bit more generic and put in fib_semantics.c something like below. --ro --- net/ipv4/fib_hash.c.orig Tue Nov 16 21:41:59 2004 +++ net/ipv4/fib_hash.c Tue Nov 16 22:41:46 2004 @@ -376,10 +376,10 @@ read_unlock(&fib_hash_lock); } -static void rtmsg_fib(int, struct fib_node *, struct fib_alias *, - int, int, - struct nlmsghdr *n, - struct netlink_skb_parms *); +void rtmsg_fib(int, u32 key, struct fib_alias *, + int, int, + struct nlmsghdr *n, + struct netlink_skb_parms *); /* Insert node F to FZ. */ static inline void fib_insert_node(struct fn_zone *fz, struct fib_node *f) @@ -565,7 +565,7 @@ fz->fz_nent++; rt_cache_flush(-1); - rtmsg_fib(RTM_NEWROUTE, f, new_fa, z, tb->tb_id, n, req); + rtmsg_fib(RTM_NEWROUTE, key, new_fa, z, tb->tb_id, n, req); return 0; out_free_new_fa: @@ -631,7 +631,7 @@ int kill_fn; fa = fa_to_delete; - rtmsg_fib(RTM_DELROUTE, f, fa, z, tb->tb_id, n, req); + rtmsg_fib(RTM_DELROUTE, key, fa, z, tb->tb_id, n, req); kill_fn = 0; write_lock_bh(&fib_hash_lock); @@ -794,33 +794,6 @@ read_unlock(&fib_hash_lock); cb->args[1] = m; return skb->len; -} - -static void rtmsg_fib(int event, struct fib_node *f, struct fib_alias *fa, - int z, int tb_id, - struct nlmsghdr *n, struct netlink_skb_parms *req) -{ - struct sk_buff *skb; - u32 pid = req ? req->pid : 0; - int size = NLMSG_SPACE(sizeof(struct rtmsg)+256); - - skb = alloc_skb(size, GFP_KERNEL); - if (!skb) - return; - - if (fib_dump_info(skb, pid, n->nlmsg_seq, event, tb_id, - fa->fa_type, fa->fa_scope, &f->fn_key, z, - fa->fa_tos, - fa->fa_info) < 0) { - kfree_skb(skb); - return; - } - NETLINK_CB(skb).dst_groups = RTMGRP_IPV4_ROUTE; - if (n->nlmsg_flags&NLM_F_ECHO) - atomic_inc(&skb->users); - netlink_broadcast(rtnl, skb, pid, RTMGRP_IPV4_ROUTE, GFP_KERNEL); - if (n->nlmsg_flags&NLM_F_ECHO) - netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); } #ifdef CONFIG_IP_MULTIPLE_TABLES --- net/ipv4/fib_semantics.c.orig Tue Nov 16 21:42:19 2004 +++ net/ipv4/fib_semantics.c Tue Nov 16 22:34:42 2004 @@ -268,6 +268,34 @@ return -1; } +void rtmsg_fib(int event, u32 key, struct fib_alias *fa, + int z, int tb_id, + struct nlmsghdr *n, struct netlink_skb_parms *req) +{ + struct sk_buff *skb; + u32 pid = req ? req->pid : 0; + int size = NLMSG_SPACE(sizeof(struct rtmsg)+256); + + skb = alloc_skb(size, GFP_KERNEL); + if (!skb) + return; + + if (fib_dump_info(skb, pid, n->nlmsg_seq, event, tb_id, + fa->fa_type, fa->fa_scope, &key, z, + fa->fa_tos, + fa->fa_info) < 0) { + kfree_skb(skb); + return; + } + NETLINK_CB(skb).dst_groups = RTMGRP_IPV4_ROUTE; + if (n->nlmsg_flags&NLM_F_ECHO) + atomic_inc(&skb->users); + netlink_broadcast(rtnl, skb, pid, RTMGRP_IPV4_ROUTE, GFP_KERNEL); + if (n->nlmsg_flags&NLM_F_ECHO) + netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); +} + + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From Robert.Olsson@data.slu.se Wed Nov 24 11:26:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 11:26:21 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOJQAsB030219 for ; Wed, 24 Nov 2004 11:26:11 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAOJPmiu032562; Wed, 24 Nov 2004 20:25:48 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 1FDF9EC5CB; Wed, 24 Nov 2004 20:16:01 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16804.56817.259589.279556@robur.slu.se> Date: Wed, 24 Nov 2004 20:16:01 +0100 To: "David S. Miller" Cc: Robert.Olsson@data.slu.se, netdev@oss.sgi.com Subject: FIB reorg (2) X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12206 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev And a variant of fib_find_alias for fib_semantics --ro --- net/ipv4/fib_hash.c.orig Sat Nov 20 11:34:44 2004 +++ net/ipv4/fib_hash.c Fri Nov 19 16:58:00 2004 @@ -48,6 +48,8 @@ static kmem_cache_t *fn_hash_kmem; static kmem_cache_t *fn_alias_kmem; +extern struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio); + struct fib_node { struct hlist_node fn_hash; struct list_head fn_alias; @@ -404,26 +406,6 @@ return NULL; } -/* Return the first fib alias matching TOS with - * priority less than or equal to PRIO. - */ -static struct fib_alias *fib_find_alias(struct fib_node *fn, u8 tos, u32 prio) -{ - if (fn) { - struct list_head *head = &fn->fn_alias; - struct fib_alias *fa; - - list_for_each_entry(fa, head, fa_list) { - if (fa->fa_tos > tos) - continue; - if (fa->fa_info->fib_priority >= prio || - fa->fa_tos < tos) - return fa; - } - } - return NULL; -} - static int fn_hash_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, struct nlmsghdr *n, struct netlink_skb_parms *req) @@ -463,7 +445,11 @@ fn_rehash_zone(fz); f = fib_find_node(fz, key); - fa = fib_find_alias(f, tos, fi->fib_priority); + + if(!f) + fa = NULL; + else + fa = fib_find_alias(&f->fn_alias, tos, fi->fib_priority); /* Now fa, if non-NULL, points to the first fib alias * with the same keys [prefix,tos,priority], if such key already @@ -603,7 +589,11 @@ } f = fib_find_node(fz, key); - fa = fib_find_alias(f, tos, 0); + + if(!f) + fa = NULL; + else + fa = fib_find_alias(&f->fn_alias, tos, 0); if (!fa) return -ESRCH; --- net/ipv4/fib_semantics.c.orig Sat Nov 20 11:35:03 2004 +++ net/ipv4/fib_semantics.c Fri Nov 19 09:00:04 2004 @@ -268,6 +268,25 @@ return -1; } +/* Return the first fib alias matching TOS with + * priority less than or equal to PRIO. + */ +struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio) +{ + if (fah) { + struct fib_alias *fa; + list_for_each_entry(fa, fah, fa_list) { + if (fa->fa_tos > tos) + continue; + if (fa->fa_info->fib_priority >= prio || + fa->fa_tos < tos) + return fa; + } + } + return NULL; +} + + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From linville@ra.tuxdriver.com Wed Nov 24 11:51:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 11:51:15 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOJpAA0031697 for ; Wed, 24 Nov 2004 11:51:11 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAOJdvN29826; Wed, 24 Nov 2004 14:39:57 -0500 Date: Wed, 24 Nov 2004 14:39:57 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, akpm@osdl.org, jgarzik@pobox.com Subject: [patch netdev-2.6] 3c59x: Add EEPROM_RESET for 3c900 Boomerang Message-ID: <20041124143956.A24342@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, jgarzik@pobox.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 12207 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Add 3c900 Boomerang to list of devices needing EEPROM_RESET Signed-off-by: John W. Linville --- drivers/net/3c59x.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) ===== drivers/net/3c59x.c 1.66 vs edited ===== --- 1.66/drivers/net/3c59x.c 2004-10-30 10:22:13 -04:00 +++ edited/drivers/net/3c59x.c 2004-11-24 14:31:49 -05:00 @@ -492,9 +492,9 @@ {"3c595 Vortex 100base-MII", PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c900 Boomerang 10baseT", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Boomerang 10Mbps Combo", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Cyclone 10Mbps TPO", /* AKPM: from Don's 0.99M */ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps Combo", From linville@ra.tuxdriver.com Wed Nov 24 11:52:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 11:52:47 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOJqghg032033 for ; Wed, 24 Nov 2004 11:52:42 -0800 Received: (from linville@localhost) by ra.tuxdriver.com (8.11.6/8.11.6) id iAOJfUV29839; Wed, 24 Nov 2004 14:41:30 -0500 Date: Wed, 24 Nov 2004 14:41:29 -0500 From: "John W. Linville" To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com, akpm@osdl.org, jgarzik@pobox.com Subject: [patch netdev-2.4] 3c59x: Add EEPROM_RESET for 3c900 Boomerang Message-ID: <20041124144129.B24342@tuxdriver.com> Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, akpm@osdl.org, jgarzik@pobox.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 12208 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev Add 3c900 Boomerang to list of devices needing EEPROM_RESET Signed-off-by: John W. Linville --- drivers/net/3c59x.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) ===== drivers/net/3c59x.c 1.25 vs edited ===== --- 1.25/drivers/net/3c59x.c 2004-10-14 20:00:00 -04:00 +++ edited/drivers/net/3c59x.c 2004-11-24 14:34:12 -05:00 @@ -489,9 +489,9 @@ {"3c595 Vortex 100base-MII", PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c900 Boomerang 10baseT", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Boomerang 10Mbps Combo", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Cyclone 10Mbps TPO", /* AKPM: from Don's 0.99M */ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps Combo", From rich@phekda.gotadsl.co.uk Wed Nov 24 12:04:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 12:05:02 -0800 (PST) Received: from smtp.nildram.co.uk (smtp.nildram.co.uk [195.112.4.54]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOK4tcr000307 for ; Wed, 24 Nov 2004 12:04:56 -0800 Received: from katrina.int.phekda.gotadsl.co.uk (195-112-43-136.dyn.gotadsl.co.uk [195.112.43.136]) by smtp.nildram.co.uk (Postfix) with ESMTP id D5502261589; Wed, 24 Nov 2004 19:36:56 +0000 (GMT) Received: from [192.168.1.4] (katrina.int.phekda.gotadsl.co.uk [192.168.1.4]) by katrina.int.phekda.gotadsl.co.uk (Postfix) with ESMTP id 52B41353; Wed, 24 Nov 2004 19:36:42 +0000 (GMT) Message-ID: <41A4E2C9.4070502@phekda.gotadsl.co.uk> Date: Wed, 24 Nov 2004 19:36:41 +0000 From: Richard Dawe User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en, de, fr MIME-Version: 1.0 To: Francois Romieu Cc: netdev@oss.sgi.com, Me Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow References: <41A09541.5040405@phekda.gotadsl.co.uk> <41A0F0D5.9050702@phekda.gotadsl.co.uk> <20041121205814.GA22460@electric-eye.fr.zoreil.com> <41A24F35.5080106@phekda.gotadsl.co.uk> <20041122213008.GA9618@electric-eye.fr.zoreil.com> In-Reply-To: <20041122213008.GA9618@electric-eye.fr.zoreil.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12209 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rich@phekda.gotadsl.co.uk Precedence: bulk X-list: netdev Hello. I don't know if it will help, but FreeBSD's re driver source code is here: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/re/if_re.c?only_with_tag=HEAD Have you ever looked at that? It has some interesting comments about the maximum Jumbo packet length and vendor-specific registers in the 8110. Thanks, bye, Rich =] -- Richard Dawe [ http://homepages.nildram.co.uk/~phekda/richdawe/ ] "You can't evaluate a man by logic alone." -- McCoy, "I, Mudd", Star Trek From jgarzik@pobox.com Wed Nov 24 12:05:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 12:05:50 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOK5iGX000442 for ; Wed, 24 Nov 2004 12:05:45 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CX3OE-0004Yu-OK; Wed, 24 Nov 2004 20:05:23 +0000 Message-ID: <41A4E975.8070102@pobox.com> Date: Wed, 24 Nov 2004 15:05:09 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: janitor@sternwelten.at CC: netdev@oss.sgi.com, domen@coderock.org Subject: Re: [patch 1/4] net/ne2k-pci: module_param conversion References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12210 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev janitor@sternwelten.at wrote: > @@ -443,8 +435,7 @@ static void ne2k_pci_reset_8390(struct n > { > unsigned long reset_start_time = jiffies; > > - if (debug > 1) printk("%s: Resetting the 8390 t=%ld...", > - dev->name, jiffies); > + printk(KERN_INFO "%s: Resetting the 8390 t=%ld...", dev->name, jiffies); The rest of the patch looks OK. This chunk changes behavior, by removing the 'if' test. Jeff From domen@coderock.org Wed Nov 24 12:45:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 12:45:08 -0800 (PST) Received: from trashy.coderock.org (postfix@coderock.org [193.77.147.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOKj2QP004907 for ; Wed, 24 Nov 2004 12:45:03 -0800 Received: from localhost (localhost [127.0.0.1]) by trashy.coderock.org (Postfix) with ESMTP id C0D1F1ED5E; Wed, 24 Nov 2004 21:44:39 +0100 (CET) Received: by trashy.coderock.org (Postfix, from userid 612) id C00171ED59; Wed, 24 Nov 2004 21:43:47 +0100 (CET) Received: from localhost (coderock.org [193.77.147.115]) by trashy.coderock.org (Postfix) with ESMTP id 9029F1ED51; Wed, 24 Nov 2004 21:43:42 +0100 (CET) Date: Wed, 24 Nov 2004 21:43:48 +0100 From: Domen Puncer To: Jeff Garzik Cc: janitor@sternwelten.at, netdev@oss.sgi.com Subject: Re: net/ne2k-pci: module_param conversion Message-ID: <20041124204348.GB4680@nd47.coderock.org> References: <41A4E975.8070102@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A4E975.8070102@pobox.com> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: by amavisd with ClamAV X-archive-position: 12211 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: domen@coderock.org Precedence: bulk X-list: netdev On 24/11/04 15:05 -0500, Jeff Garzik wrote: > janitor@sternwelten.at wrote: > >@@ -443,8 +435,7 @@ static void ne2k_pci_reset_8390(struct n > > { > > unsigned long reset_start_time = jiffies; > > > >- if (debug > 1) printk("%s: Resetting the 8390 t=%ld...", > >- dev->name, jiffies); > >+ printk(KERN_INFO "%s: Resetting the 8390 t=%ld...", dev->name, > >jiffies); > > > The rest of the patch looks OK. > > This chunk changes behavior, by removing the 'if' test. This was intended. Module parameter debug is only used in this test, so i dared removing it. 3 options: - remove this printk - don't remove "debug" - leave patch as is :-) Let me know of your decision, and i'll send a new patch. > > Jeff From garzik@havoc.gtf.org Wed Nov 24 13:06:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 24 Nov 2004 13:06:30 -0800 (PST) Received: from havoc.gtf.org (havoc.gtf.org [69.28.190.101]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAOL6Pff005640 for ; Wed, 24 Nov 2004 13:06:26 -0800 Received: from havoc.gtf.org (havoc.gtf.org [127.0.0.1]) by havoc.gtf.org (Postfix) with ESMTP id 49B9E7660; Wed, 24 Nov 2004 16:02:36 -0500 (EST) Received: (from garzik@localhost) by havoc.gtf.org (8.12.10/8.12.10/Submit) id iAOL2ak5025230; Wed, 24 Nov 2004 16:02:36 -0500 Date: Wed, 24 Nov 2004 16:02:36 -0500 From: Jeff Garzik To: Andrew Morton , Linus Torvalds Cc: netdev@oss.sgi.com Subject: [BK PATCHES] 2.6.x net driver fixes Message-ID: <20041124210235.GA25207@havoc.gtf.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 12212 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Please do a bk pull bk://gkernel.bkbits.net/net-drivers-2.6 This will update the following files: arch/m68k/configs/atari_defconfig | 3 ++- arch/m68k/configs/hp300_defconfig | 4 ++-- drivers/net/e100.c | 18 ++++++++++-------- drivers/net/hplance.c | 27 +++++++++++++++++---------- drivers/net/ibmveth.c | 2 +- drivers/net/pcnet32.c | 7 ++++++- drivers/net/tulip/21142.c | 2 +- drivers/net/tulip/eeprom.c | 1 + drivers/net/tulip/interrupt.c | 2 +- drivers/net/tulip/media.c | 1 + drivers/net/tulip/pnic.c | 1 + drivers/net/tulip/pnic2.c | 2 +- drivers/net/tulip/timer.c | 1 + drivers/net/tulip/tulip.h | 15 ++++++++++++++- drivers/net/tulip/tulip_core.c | 2 +- 15 files changed, 60 insertions(+), 28 deletions(-) through these ChangeSets: Andrew Morton: o e100: early reset fix Don Fry: o pcnet32: added pci_disable_device Geert Uytterhoeven: o M68k: Update HP300 defconfig (enable DIO and HP Lance Ethernet) o M68k HP Lance Ethernet: Fix leaks on probe/removal o M68k: Update Atari defconfig (enable Ethernet and MII) John W. Linville: o tulip: make tulip_stop_rxtx() wait for DMA to fully stop Santiago Leon: o make ibmveth link always up diff -Nru a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig --- a/arch/m68k/configs/atari_defconfig 2004-11-24 15:49:50 -05:00 +++ b/arch/m68k/configs/atari_defconfig 2004-11-24 15:49:50 -05:00 @@ -430,7 +430,8 @@ # # Ethernet (10 or 100Mbit) # -# CONFIG_NET_ETHERNET is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=m CONFIG_ATARILANCE=m # diff -Nru a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig --- a/arch/m68k/configs/hp300_defconfig 2004-11-24 15:49:50 -05:00 +++ b/arch/m68k/configs/hp300_defconfig 2004-11-24 15:49:50 -05:00 @@ -65,7 +65,7 @@ # CONFIG_APOLLO is not set # CONFIG_VME is not set CONFIG_HP300=y -# CONFIG_DIO is not set +CONFIG_DIO=y # CONFIG_SUN3X is not set # CONFIG_Q40 is not set @@ -404,7 +404,7 @@ # CONFIG_NET_ETHERNET=y CONFIG_MII=m -# CONFIG_HPLANCE is not set +CONFIG_HPLANCE=y # # Ethernet (1000 Mbit) diff -Nru a/drivers/net/e100.c b/drivers/net/e100.c --- a/drivers/net/e100.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/e100.c 2004-11-24 15:49:50 -05:00 @@ -2204,22 +2204,24 @@ goto err_out_disable_pdev; } + nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); + if(!nic->csr) { + DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); + err = -ENOMEM; + goto err_out_free_res; + } + + e100_hw_reset(nic); + pci_set_master(pdev); if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) { DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n"); - goto err_out_free_res; + goto err_out_iounmap; } SET_MODULE_OWNER(netdev); SET_NETDEV_DEV(netdev, &pdev->dev); - - nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); - if(!nic->csr) { - DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); - err = -ENOMEM; - goto err_out_free_res; - } if(ent->driver_data) nic->flags |= ich; diff -Nru a/drivers/net/hplance.c b/drivers/net/hplance.c --- a/drivers/net/hplance.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/hplance.c 2004-11-24 15:49:50 -05:00 @@ -76,25 +76,31 @@ const struct dio_device_id *ent) { struct net_device *dev; - int err; + int err = -ENOMEM; dev = alloc_etherdev(sizeof(struct hplance_private)); if (!dev) - return -ENOMEM; + goto out; - if (!request_mem_region(d->resource.start, d->resource.end-d->resource.start, d->name)) - return -EBUSY; + err = -EBUSY; + if (!request_mem_region(dio_resource_start(d), + dio_resource_len(d), d->name)) + goto out_free_netdev; - SET_MODULE_OWNER(dev); - hplance_init(dev, d); err = register_netdev(dev); - if (err) { - free_netdev(dev); - return err; - } + if (err) + goto out_release_mem_region; + dio_set_drvdata(d, dev); return 0; + + out_release_mem_region: + release_mem_region(dio_resource_start(d), dio_resource_len(d)); + out_free_netdev: + free_netdev(dev); + out: + return err; } static void __devexit hplance_remove_one(struct dio_dev *d) @@ -102,6 +108,7 @@ struct net_device *dev = dio_get_drvdata(d); unregister_netdev(dev); + release_mem_region(dio_resource_start(d), dio_resource_len(d)); free_netdev(dev); } diff -Nru a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c --- a/drivers/net/ibmveth.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/ibmveth.c 2004-11-24 15:49:50 -05:00 @@ -598,7 +598,7 @@ } static u32 netdev_get_link(struct net_device *dev) { - return 0; + return 1; } static struct ethtool_ops netdev_ethtool_ops = { diff -Nru a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c --- a/drivers/net/pcnet32.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/pcnet32.c 2004-11-24 15:49:50 -05:00 @@ -1010,7 +1010,11 @@ return -EBUSY; } - return pcnet32_probe1(ioaddr, 1, pdev); + err = pcnet32_probe1(ioaddr, 1, pdev); + if (err < 0) { + pci_disable_device(pdev); + } + return err; } @@ -2249,6 +2253,7 @@ release_region(dev->base_addr, PCNET32_TOTAL_SIZE); pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); free_netdev(dev); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); } } diff -Nru a/drivers/net/tulip/21142.c b/drivers/net/tulip/21142.c --- a/drivers/net/tulip/21142.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/21142.c 2004-11-24 15:49:50 -05:00 @@ -14,9 +14,9 @@ */ -#include "tulip.h" #include #include +#include "tulip.h" static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, }; diff -Nru a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c --- a/drivers/net/tulip/eeprom.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/eeprom.c 2004-11-24 15:49:50 -05:00 @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" #include #include diff -Nru a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c --- a/drivers/net/tulip/interrupt.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/interrupt.c 2004-11-24 15:49:50 -05:00 @@ -14,10 +14,10 @@ */ +#include #include "tulip.h" #include #include -#include int tulip_rx_copybreak; unsigned int tulip_max_interrupt_work; diff -Nru a/drivers/net/tulip/media.c b/drivers/net/tulip/media.c --- a/drivers/net/tulip/media.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/media.c 2004-11-24 15:49:50 -05:00 @@ -18,6 +18,7 @@ #include #include #include +#include #include "tulip.h" diff -Nru a/drivers/net/tulip/pnic.c b/drivers/net/tulip/pnic.c --- a/drivers/net/tulip/pnic.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/pnic.c 2004-11-24 15:49:50 -05:00 @@ -15,6 +15,7 @@ */ #include +#include #include "tulip.h" diff -Nru a/drivers/net/tulip/pnic2.c b/drivers/net/tulip/pnic2.c --- a/drivers/net/tulip/pnic2.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/pnic2.c 2004-11-24 15:49:50 -05:00 @@ -76,8 +76,8 @@ -#include "tulip.h" #include +#include "tulip.h" #include diff -Nru a/drivers/net/tulip/timer.c b/drivers/net/tulip/timer.c --- a/drivers/net/tulip/timer.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/timer.c 2004-11-24 15:49:50 -05:00 @@ -14,6 +14,7 @@ */ +#include #include "tulip.h" diff -Nru a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h --- a/drivers/net/tulip/tulip.h 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/tulip.h 2004-11-24 15:49:50 -05:00 @@ -149,6 +149,9 @@ TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000 enum tulip_mode_bits { TxThreshold = (1 << 22), @@ -460,9 +463,19 @@ u32 csr6 = ioread32(ioaddr + CSR6); if (csr6 & RxTx) { + unsigned i=1300/10; iowrite32(csr6 & ~RxTx, ioaddr + CSR6); barrier(); - (void) ioread32(ioaddr + CSR6); /* mmio sync */ + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50 us on 100BT. + */ + while (--i && (ioread32(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) + udelay(10); + + if (!i) + printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed\n", + tp->pdev->slot_name); } } diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c --- a/drivers/net/tulip/tulip_core.c 2004-11-24 15:49:50 -05:00 +++ b/drivers/net/tulip/tulip_core.c 2004-11-24 15:49:50 -05:00 @@ -26,8 +26,8 @@ #include -#include "tulip.h" #include +#include "tulip.h" #include #include #include From rddunlap@osdl.org Thu Nov 25 00:31:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 00:31:54 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAP8Voin030041 for ; Thu, 25 Nov 2004 00:31:50 -0800 Received: from [127.0.0.1] (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAP4A1904483 for ; Wed, 24 Nov 2004 20:10:01 -0800 Message-ID: <41A55A80.1090909@osdl.org> Date: Wed, 24 Nov 2004 20:07:28 -0800 From: "Randy.Dunlap" User-Agent: Mozilla Thunderbird 0.9 (X11/20041103) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: testing 1.2.3. Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12213 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev -- ~Randy From jmorris@redhat.com Thu Nov 25 00:38:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 00:38:35 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAP8cR2d030655 for ; Thu, 25 Nov 2004 00:38:28 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAOMUMA1028464; Wed, 24 Nov 2004 17:30:22 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAOMULr19381; Wed, 24 Nov 2004 17:30:21 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAOMUIVY016807; Wed, 24 Nov 2004 17:30:18 -0500 Date: Wed, 24 Nov 2004 17:30:20 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Patrick McHardy cc: Andrew Morton , , =?ISO-8859-1?Q?Marcin_Gibu=B3a?= Subject: Re: Fw: ipsec hang In-Reply-To: <41A4CEB1.7000001@trash.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12214 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Wed, 24 Nov 2004, Patrick McHardy wrote: > This patch fixes it. When a policy with a priority lower than an > existing policy is inserted, it loops forever on the existing policy. I wonder if it's the same bug as http://bugme.osdl.org/show_bug.cgi?id=3796 - James -- James Morris From dlstevens@us.ibm.com Thu Nov 25 00:51:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 00:51:41 -0800 (PST) Received: from over.ny.us.ibm.com (over.ny.us.ibm.com [32.97.182.111]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAP8pODZ031326 for ; Thu, 25 Nov 2004 00:51:37 -0800 Received: from e32.co.us.ibm.com (e32.esmtp.ibm.com [9.14.4.130]) by pokfb.esmtp.ibm.com (8.12.10/8.12.9) with ESMTP id iAOM3QtE239540 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Wed, 24 Nov 2004 17:03:27 -0500 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e32.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAOM3KFJ343076 for ; Wed, 24 Nov 2004 17:03:20 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAOM3KUj065880 for ; Wed, 24 Nov 2004 15:03:20 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAOM3Jsv006172 for ; Wed, 24 Nov 2004 15:03:20 -0700 Received: from d03nm121.boulder.ibm.com (d03nm121.boulder.ibm.com [9.17.195.147]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAOM3JKp006168; Wed, 24 Nov 2004 15:03:19 -0700 In-Reply-To: <41A4688E.80908@conectiva.com.br> To: Luiz Fernando Capitulino Cc: akpm@osdl.org, "David S. Miller" , jgarzik@pobox.com, netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: [patch 10/13] net/socket.c::sys_bind() cleanup. X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Wed, 24 Nov 2004 14:03:17 -0800 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.51HF338 | June 21, 2004) at 11/24/2004 15:03:19, Serialize complete at 11/24/2004 15:03:19 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 12215 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev It's just a style issue, so maybe you'll disagree, but I prefer: if (!sock) return err; to your if (!sock) goto out; ... out: return err; I think "return err" is more readable than "goto out/return err" for that path and having another "return err" for the out-with-put case isn't a terrible thing. +-DLS From icampbell@arcom.com Thu Nov 25 02:00:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 02:00:34 -0800 (PST) Received: from mail9.messagelabs.com (mail9.messagelabs.com [194.205.110.133]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAPA0Q8C001083 for ; Thu, 25 Nov 2004 02:00:26 -0800 X-VirusChecked: Checked X-Env-Sender: icampbell@arcom.com X-Msg-Ref: server-25.tower-9.messagelabs.com!1101376798!14406324!1 X-StarScan-Version: 5.4.2; banners=arcom.com,-,- X-Originating-IP: [194.200.159.164] Received: (qmail 27439 invoked from network); 25 Nov 2004 09:59:58 -0000 Received: from mail2.arcom.com (194.200.159.164) by server-25.tower-9.messagelabs.com with SMTP; 25 Nov 2004 09:59:58 -0000 Received: from linuxdev.icampbell.arcom.cc [10.2.28.2] by mail2.arcom.com with ESMTP (SMTPD32-8.02) id ADE65D7011C; Thu, 25 Nov 2004 10:03:18 +0000 Subject: Re: "deadlock" between smc91x driver and link_watch From: Ian Campbell To: Nicolas Pitre Cc: Andrew Morton , lkml , netdev@oss.sgi.com In-Reply-To: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> <1101311558.31459.21.camel@icampbell-debian> Content-Type: text/plain Organization: Arcom Control Systems Date: Thu, 25 Nov 2004 09:59:55 +0000 Message-Id: <1101376796.31459.45.camel@icampbell-debian> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-IMAIL-SPAM-VALHELO: (97976604) X-IMAIL-SPAM-VALREVDNS: (97976604) X-archive-position: 12216 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: icampbell@arcom.com Precedence: bulk X-list: netdev Hi, I've taken Nico's comments on board and used lp->work_pending to detect whether smc_phy_configure is pending or not instead of dev_hold/put(). I was able to do away with smc_phy_configure_wq() from the previous version since setting lp->work_pending=0 can safely be done in smc_phy_configure() itself, unlike dev_put(). Also fixed a typo 'ence' -> 'Hence' and renamed smc_detect_phy to smc_phy_detect in order to follow the same pattern as the other smc_phy_* functions, I was typing smc_phy_detect() every time anyway and it was getting on my wick. I hope that's OK... Signed-off-by: Ian Campbell Index: 2.6/drivers/net/smc91x.c =================================================================== --- 2.6.orig/drivers/net/smc91x.c 2004-11-16 09:26:52.000000000 +0000 +++ 2.6/drivers/net/smc91x.c 2004-11-25 09:49:38.830953019 +0000 @@ -203,7 +203,10 @@ u32 msg_enable; u32 phy_type; struct mii_if_info mii; + + /* work queue */ struct work_struct phy_configure; + int work_pending; spinlock_t lock; @@ -903,7 +906,7 @@ /* * Finds and reports the PHY address */ -static void smc_detect_phy(struct net_device *dev) +static void smc_phy_detect(struct net_device *dev) { struct smc_local *lp = netdev_priv(dev); int phyaddr; @@ -1155,6 +1158,7 @@ smc_phy_configure_exit: spin_unlock_irq(&lp->lock); + lp->work_pending = 0; } /* @@ -1350,10 +1354,13 @@ /* * Reconfiguring the PHY doesn't seem like a bad idea here, but * smc_phy_configure() calls msleep() which calls schedule_timeout() - * which calls schedule(). Ence we use a work queue. + * which calls schedule(). Hence we use a work queue. */ - if (lp->phy_type != 0) - schedule_work(&lp->phy_configure); + if (lp->phy_type != 0) { + if (schedule_work(&lp->phy_configure)) { + lp->work_pending = 1; + } + } /* We can accept TX packets again */ dev->trans_start = jiffies; @@ -1537,7 +1544,18 @@ smc_shutdown(dev); if (lp->phy_type != 0) { - flush_scheduled_work(); + /* We need to ensure that no calls to + smc_phy_configure are pending. + + flush_scheduled_work() cannot be called because we + are running with the netlink semaphore held (from + devinet_ioctl()) and the pending work queue + contains linkwatch_event() (scheduled by + netif_carrier_off() above). linkwatch_event() also + wants the netlink semaphore. + */ + while(lp->work_pending) + schedule(); smc_phy_powerdown(dev, lp->mii.phy_id); } @@ -1904,7 +1922,7 @@ * Locate the phy, if any. */ if (lp->version >= (CHIP_91100 << 4)) - smc_detect_phy(dev); + smc_phy_detect(dev); /* Set default parameters */ lp->msg_enable = NETIF_MSG_LINK; -- Ian Campbell, Senior Design Engineer Web: http://www.arcom.com Arcom, Clifton Road, Direct: +44 (0)1223 403 465 Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200 _____________________________________________________________________ The message in this transmission is sent in confidence for the attention of the addressee only and should not be disclosed to any other party. Unauthorised recipients are requested to preserve this confidentiality. Please advise the sender if the addressee is not resident at the receiving end. Email to and from Arcom is automatically monitored for operational and lawful business reasons. This message has been virus scanned by MessageLabs. From herbert@gondor.apana.org.au Thu Nov 25 02:21:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 02:21:53 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPALP9m001924 for ; Thu, 25 Nov 2004 02:21:26 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CXGja-0000mS-00; Thu, 25 Nov 2004 21:20:18 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CXGj9-00068Z-00; Thu, 25 Nov 2004 21:19:51 +1100 From: Herbert Xu To: dlstevens@us.ibm.com (David Stevens) Subject: Re: [patch 10/13] net/socket.c::sys_bind() cleanup. Cc: lcapitulino@conectiva.com.br, akpm@osdl.org, davem@davemloft.net, jgarzik@pobox.com, netdev@oss.sgi.com Organization: Core In-Reply-To: X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Thu, 25 Nov 2004 21:19:51 +1100 X-archive-position: 12217 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev David Stevens wrote: > It's just a style issue, so maybe you'll disagree, but I prefer: > > if (!sock) > return err; > > to your > > if (!sock) > goto out; > ... > out: > return err; > > I think "return err" is more readable than "goto out/return err" > for > that path and having another "return err" for the out-with-put case isn't > a > terrible thing. When used in isolation you would be right. However when there are multiple exit points then the goto is better because it means that we have only one exit path. When you have multiple exit paths it's very easy to get memory leaks and missing unlock's. -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From herbert@gondor.apana.org.au Thu Nov 25 02:23:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 02:23:53 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPANkwn002287 for ; Thu, 25 Nov 2004 02:23:46 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CXGlz-0000p4-00; Thu, 25 Nov 2004 21:22:47 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CXGlt-00069n-00; Thu, 25 Nov 2004 21:22:41 +1100 From: Herbert Xu To: jmorris@redhat.com (James Morris) Subject: Re: Fw: ipsec hang Cc: kaber@trash.net, akpm@osdl.org, netdev@oss.sgi.com, mg@iceni.pl, bill@crowellsystems.com Organization: Core In-Reply-To: X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.27-hx-1-686-smp (i686)) Message-Id: Date: Thu, 25 Nov 2004 21:22:41 +1100 X-archive-position: 12218 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev James Morris wrote: > On Wed, 24 Nov 2004, Patrick McHardy wrote: > >> This patch fixes it. When a policy with a priority lower than an >> existing policy is inserted, it loops forever on the existing policy. > > I wonder if it's the same bug as > http://bugme.osdl.org/show_bug.cgi?id=3796 Quite likely. Bill, can you please try the latest BK tree and see if you can still reproduce the hang? Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From kaber@trash.net Thu Nov 25 04:37:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 04:37:34 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPCbTFr012281 for ; Thu, 25 Nov 2004 04:37:30 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CXIrP-0006ui-JW; Thu, 25 Nov 2004 13:36:31 +0100 Message-ID: <41A5D1CF.10504@trash.net> Date: Thu, 25 Nov 2004 13:36:31 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: bill@crowellsystems.com CC: Herbert Xu , James Morris , akpm@osdl.org, netdev@oss.sgi.com, mg@iceni.pl Subject: Re: Fw: ipsec hang References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12219 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Herbert Xu wrote: >James Morris wrote: > > >>I wonder if it's the same bug as >>http://bugme.osdl.org/show_bug.cgi?id=3796 >> >> > >Quite likely. > >Bill, can you please try the latest BK tree and see if you can >still reproduce the hang? > > The patch is not in Linus's tree yet, so you need to apply it yourself. Regards Patrick From marcelo.tosatti@cyclades.com Thu Nov 25 05:51:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 05:51:58 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPDprsq014139 for ; Thu, 25 Nov 2004 05:51:54 -0800 Received: from [127.0.0.1] (helo=logos.cnet) by www.linux.org.uk with esmtp (Exim 4.33) id 1CXK1x-0004Lv-EF; Thu, 25 Nov 2004 13:51:29 +0000 Received: by logos.cnet (Postfix, from userid 500) id 2B6F5E31D5; Thu, 25 Nov 2004 06:58:29 -0200 (BRST) Date: Thu, 25 Nov 2004 06:58:29 -0200 From: Marcelo Tosatti To: jgarzik@pobox.com, becker@scyld.com Cc: netdev@oss.sgi.com Subject: 8390 specs Message-ID: <20041125085829.GA15595@logos.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.5.1i X-archive-position: 12220 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marcelo.tosatti@cyclades.com Precedence: bulk X-list: netdev Hi, I'm having a problem with a Linksys EtherFast card (driven by axnet_cs), where the interrupt status reports ENISR_RX_ERR (receive error) under load. I would like to know more details about this status bit, what can causes it to be turned on, etc. Do you know where I can find 8390 specs? 8390.c mentions Sources: The National Semiconductor LAN Databook, and the 3Com 3c503 databook. But I can't find those available in either Google search or the National Semiconductor website. Any information or pointers are welcome, thanks! From nico@cam.org Thu Nov 25 08:38:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 08:38:12 -0800 (PST) Received: from xanadu.home (modemcable166.48-200-24.mc.videotron.ca [24.200.48.166]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPGc6YM025878 for ; Thu, 25 Nov 2004 08:38:07 -0800 Received: from localhost (nico@localhost) by xanadu.home (8.11.6/8.11.6) with ESMTP id iAPGVN114312; Thu, 25 Nov 2004 11:31:24 -0500 X-Authentication-Warning: xanadu.home: nico owned process doing -bs Date: Thu, 25 Nov 2004 11:31:23 -0500 (EST) From: Nicolas Pitre X-X-Sender: nico@xanadu.home To: Ian Campbell cc: Andrew Morton , lkml , netdev@oss.sgi.com Subject: Re: "deadlock" between smc91x driver and link_watch In-Reply-To: <1101376796.31459.45.camel@icampbell-debian> Message-ID: References: <1101230194.14370.12.camel@icampbell-debian> <20041123153158.6f20a7d7.akpm@osdl.org> <1101289309.10841.9.camel@icampbell-debian> <20041124014650.47af8ae4.akpm@osdl.org> <1101290297.10841.15.camel@icampbell-debian> <1101311558.31459.21.camel@icampbell-debian> <1101376796.31459.45.camel@icampbell-debian> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12221 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nico@cam.org Precedence: bulk X-list: netdev On Thu, 25 Nov 2004, Ian Campbell wrote: > Hi, > > I've taken Nico's comments on board and used lp->work_pending to detect > whether smc_phy_configure is pending or not instead of dev_hold/put(). I > was able to do away with smc_phy_configure_wq() from the previous > version since setting lp->work_pending=0 can safely be done in > smc_phy_configure() itself, unlike dev_put(). > > Also fixed a typo 'ence' -> 'Hence' and renamed smc_detect_phy to > smc_phy_detect in order to follow the same pattern as the other > smc_phy_* functions, I was typing smc_phy_detect() every time anyway and > it was getting on my wick. I hope that's OK... > > Signed-off-by: Ian Campbell Good! Please add "Signed-off-by: Nicolas Pitre " and send it to Jeff Garzik . > Index: 2.6/drivers/net/smc91x.c > =================================================================== > --- 2.6.orig/drivers/net/smc91x.c 2004-11-16 09:26:52.000000000 +0000 > +++ 2.6/drivers/net/smc91x.c 2004-11-25 09:49:38.830953019 +0000 > @@ -203,7 +203,10 @@ > u32 msg_enable; > u32 phy_type; > struct mii_if_info mii; > + > + /* work queue */ > struct work_struct phy_configure; > + int work_pending; > > spinlock_t lock; > > @@ -903,7 +906,7 @@ > /* > * Finds and reports the PHY address > */ > -static void smc_detect_phy(struct net_device *dev) > +static void smc_phy_detect(struct net_device *dev) > { > struct smc_local *lp = netdev_priv(dev); > int phyaddr; > @@ -1155,6 +1158,7 @@ > > smc_phy_configure_exit: > spin_unlock_irq(&lp->lock); > + lp->work_pending = 0; > } > > /* > @@ -1350,10 +1354,13 @@ > /* > * Reconfiguring the PHY doesn't seem like a bad idea here, but > * smc_phy_configure() calls msleep() which calls schedule_timeout() > - * which calls schedule(). Ence we use a work queue. > + * which calls schedule(). Hence we use a work queue. > */ > - if (lp->phy_type != 0) > - schedule_work(&lp->phy_configure); > + if (lp->phy_type != 0) { > + if (schedule_work(&lp->phy_configure)) { > + lp->work_pending = 1; > + } > + } > > /* We can accept TX packets again */ > dev->trans_start = jiffies; > @@ -1537,7 +1544,18 @@ > smc_shutdown(dev); > > if (lp->phy_type != 0) { > - flush_scheduled_work(); > + /* We need to ensure that no calls to > + smc_phy_configure are pending. > + > + flush_scheduled_work() cannot be called because we > + are running with the netlink semaphore held (from > + devinet_ioctl()) and the pending work queue > + contains linkwatch_event() (scheduled by > + netif_carrier_off() above). linkwatch_event() also > + wants the netlink semaphore. > + */ > + while(lp->work_pending) > + schedule(); > smc_phy_powerdown(dev, lp->mii.phy_id); > } > > @@ -1904,7 +1922,7 @@ > * Locate the phy, if any. > */ > if (lp->version >= (CHIP_91100 << 4)) > - smc_detect_phy(dev); > + smc_phy_detect(dev); > > /* Set default parameters */ > lp->msg_enable = NETIF_MSG_LINK; > > > -- > Ian Campbell, Senior Design Engineer > Web: http://www.arcom.com > Arcom, Clifton Road, Direct: +44 (0)1223 403 465 > Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200 > > > _____________________________________________________________________ > The message in this transmission is sent in confidence for the attention of the addressee only and should not be disclosed to any other party. Unauthorised recipients are requested to preserve this confidentiality. Please advise the sender if the addressee is not resident at the receiving end. Email to and from Arcom is automatically monitored for operational and lawful business reasons. > > This message has been virus scanned by MessageLabs. > Nicolas From bunk@stusta.de Thu Nov 25 09:24:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 09:24:52 -0800 (PST) Received: from mailout.stusta.mhn.de (mailout.stusta.mhn.de [141.84.69.5]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAPHOdBX021402 for ; Thu, 25 Nov 2004 09:24:40 -0800 Received: (qmail 21142 invoked from network); 25 Nov 2004 17:24:13 -0000 Received: from r063144.stusta.swh.mhn.de (10.150.63.144) by mailhub.stusta.mhn.de with SMTP; 25 Nov 2004 17:24:13 -0000 Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000) id E9668BB870; Thu, 25 Nov 2004 18:24:12 +0100 (CET) Date: Thu, 25 Nov 2004 18:24:12 +0100 From: Adrian Bunk To: sri@us.ibm.com Cc: lksctp-developers@lists.sourceforge.net, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [2.6 patch] SCTP: possible cleanups Message-ID: <20041125172412.GG3537@stusta.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12222 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bunk@stusta.de Precedence: bulk X-list: netdev The patch below contains the following possible cleanups for the SCTP code: - remove unused code - make needlessly global code static This patch is not intended for being blindly applies, please review and check whether part of it might conflict with pending patches. diffstat output: include/net/sctp/command.h | 13 ----- include/net/sctp/constants.h | 4 - include/net/sctp/sctp.h | 10 ---- include/net/sctp/sm.h | 61 -------------------------- include/net/sctp/structs.h | 22 --------- include/net/sctp/tsnmap.h | 16 ------ include/net/sctp/ulpevent.h | 2 include/net/sctp/ulpqueue.h | 1 net/sctp/associola.c | 72 +++++++++++-------------------- net/sctp/bind_addr.c | 17 ------- net/sctp/chunk.c | 8 +-- net/sctp/command.c | 23 --------- net/sctp/debug.c | 17 ------- net/sctp/endpointola.c | 54 +++++++++++------------ net/sctp/input.c | 46 ++++++++++--------- net/sctp/inqueue.c | 13 ----- net/sctp/ipv6.c | 20 ++++---- net/sctp/objcnt.c | 2 net/sctp/outqueue.c | 15 ------ net/sctp/proc.c | 2 net/sctp/protocol.c | 34 +++++++------- net/sctp/sm_make_chunk.c | 81 ++++++++++------------------------- net/sctp/sm_sideeffect.c | 66 +++++++++++++++++++--------- net/sctp/sm_statefuns.c | 81 +++++++++++++++++++++++------------ net/sctp/sm_statetable.c | 27 ++++++++--- net/sctp/socket.c | 4 - net/sctp/ssnmap.c | 7 ++- net/sctp/transport.c | 56 ++++++++++++------------ net/sctp/tsnmap.c | 39 ++-------------- net/sctp/ulpevent.c | 18 ++++--- net/sctp/ulpqueue.c | 21 --------- 31 files changed, 306 insertions(+), 546 deletions(-) Signed-off-by: Adrian Bunk --- linux-2.6.10-rc2-mm3-full/include/net/sctp/structs.h.old 2004-11-25 00:33:15.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/structs.h 2004-11-25 03:29:32.000000000 +0100 @@ -406,7 +406,6 @@ int malloced; }; -struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *, __u16, __u16); struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp); void sctp_ssnmap_free(struct sctp_ssnmap *map); void sctp_ssnmap_clear(struct sctp_ssnmap *map); @@ -538,12 +537,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, struct sctp_sndrcvinfo *, struct msghdr *, int len); -struct sctp_datamsg *sctp_datamsg_new(int gfp); void sctp_datamsg_put(struct sctp_datamsg *); -void sctp_datamsg_hold(struct sctp_datamsg *); void sctp_datamsg_free(struct sctp_datamsg *); void sctp_datamsg_track(struct sctp_chunk *); -void sctp_datamsg_assign(struct sctp_datamsg *, struct sctp_chunk *); void sctp_chunk_fail(struct sctp_chunk *, int error); int sctp_chunk_abandoned(struct sctp_chunk *); @@ -651,8 +647,6 @@ void sctp_chunk_put(struct sctp_chunk *); int sctp_user_addto_chunk(struct sctp_chunk *chunk, int off, int len, struct iovec *data); -struct sctp_chunk *sctp_make_chunk(const struct sctp_association *, __u8 type, - __u8 flags, int size); void sctp_chunk_free(struct sctp_chunk *); void *sctp_addto_chunk(struct sctp_chunk *, int len, const void *data); struct sctp_chunk *sctp_chunkify(struct sk_buff *, @@ -922,15 +916,12 @@ }; struct sctp_transport *sctp_transport_new(const union sctp_addr *, int); -struct sctp_transport *sctp_transport_init(struct sctp_transport *, - const union sctp_addr *, int); void sctp_transport_set_owner(struct sctp_transport *, struct sctp_association *); void sctp_transport_route(struct sctp_transport *, union sctp_addr *, struct sctp_opt *); void sctp_transport_pmtu(struct sctp_transport *); void sctp_transport_free(struct sctp_transport *); -void sctp_transport_destroy(struct sctp_transport *); void sctp_transport_reset_timers(struct sctp_transport *); void sctp_transport_hold(struct sctp_transport *); void sctp_transport_put(struct sctp_transport *); @@ -961,7 +952,6 @@ int malloced; /* Is this structure kfree()able? */ }; -struct sctp_inq *sctp_inq_new(void); void sctp_inq_init(struct sctp_inq *); void sctp_inq_free(struct sctp_inq *); void sctp_inq_push(struct sctp_inq *, struct sctp_chunk *packet); @@ -1029,7 +1019,6 @@ char malloced; }; -struct sctp_outq *sctp_outq_new(struct sctp_association *); void sctp_outq_init(struct sctp_association *, struct sctp_outq *); void sctp_outq_teardown(struct sctp_outq *); void sctp_outq_free(struct sctp_outq*); @@ -1070,7 +1059,6 @@ int malloced; /* Are we kfree()able? */ }; -struct sctp_bind_addr *sctp_bind_addr_new(int gfp_mask); void sctp_bind_addr_init(struct sctp_bind_addr *, __u16 port); void sctp_bind_addr_free(struct sctp_bind_addr *); int sctp_bind_addr_copy(struct sctp_bind_addr *dest, @@ -1220,8 +1208,6 @@ /* These are function signatures for manipulating endpoints. */ struct sctp_endpoint *sctp_endpoint_new(struct sock *, int); -struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *, - struct sock *, int gfp); void sctp_endpoint_free(struct sctp_endpoint *); void sctp_endpoint_put(struct sctp_endpoint *); void sctp_endpoint_hold(struct sctp_endpoint *); @@ -1243,8 +1229,6 @@ int sctp_process_init(struct sctp_association *, sctp_cid_t cid, const union sctp_addr *peer, sctp_init_chunk_t *init, int gfp); -int sctp_process_param(struct sctp_association *, union sctp_params param, - const union sctp_addr *from, int gfp); __u32 sctp_generate_tag(const struct sctp_endpoint *); __u32 sctp_generate_tsn(const struct sctp_endpoint *); @@ -1690,10 +1674,6 @@ struct sctp_association * sctp_association_new(const struct sctp_endpoint *, const struct sock *, sctp_scope_t scope, int gfp); -struct sctp_association * -sctp_association_init(struct sctp_association *, const struct sctp_endpoint *, - const struct sock *, sctp_scope_t scope, - int gfp); void sctp_association_free(struct sctp_association *); void sctp_association_put(struct sctp_association *); void sctp_association_hold(struct sctp_association *); @@ -1722,7 +1702,6 @@ struct sctp_association *new); __u32 sctp_association_get_next_tsn(struct sctp_association *); -__u32 sctp_association_get_tsn_block(struct sctp_association *, int); void sctp_assoc_sync_pmtu(struct sctp_association *); void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned); @@ -1736,7 +1715,6 @@ int sctp_cmp_addr_exact(const union sctp_addr *ss1, const union sctp_addr *ss2); struct sctp_chunk *sctp_get_ecne_prepend(struct sctp_association *asoc); -struct sctp_chunk *sctp_get_no_prepend(struct sctp_association *asoc); /* A convenience structure to parse out SCTP specific CMSGs. */ typedef struct sctp_cmsgs { --- linux-2.6.10-rc2-mm3-full/include/net/sctp/command.h.old 2004-11-25 00:37:53.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/command.h 2004-11-25 00:38:13.000000000 +0100 @@ -189,11 +189,6 @@ } sctp_cmd_seq_t; -/* Create a new sctp_command_sequence. - * Return NULL if creating a new sequence fails. - */ -sctp_cmd_seq_t *sctp_new_cmd_seq(int gfp); - /* Initialize a block of memory as a command sequence. * Return 0 if the initialization fails. */ @@ -207,18 +202,10 @@ */ int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj); -/* Rewind an sctp_cmd_seq_t to iterate from the start. - * Return 0 if the rewind fails. - */ -int sctp_rewind_sequence(sctp_cmd_seq_t *seq); - /* Return the next command structure in an sctp_cmd_seq. * Return NULL at the end of the sequence. */ sctp_cmd_t *sctp_next_cmd(sctp_cmd_seq_t *seq); -/* Dispose of a command sequence. */ -void sctp_free_cmd_seq(sctp_cmd_seq_t *seq); - #endif /* __net_sctp_command_h__ */ --- linux-2.6.10-rc2-mm3-full/include/net/sctp/constants.h.old 2004-11-25 00:39:10.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/constants.h 2004-11-25 00:39:20.000000000 +0100 @@ -155,10 +155,6 @@ - (unsigned long)(c->chunk_hdr)\ - sizeof(sctp_data_chunk_t))) -/* This is a table of printable names of sctp_param_t's. */ -extern const char *sctp_param_tbl[]; - - #define SCTP_MAX_ERROR_CAUSE SCTP_ERROR_NONEXIST_IP #define SCTP_NUM_ERROR_CAUSE 10 --- linux-2.6.10-rc2-mm3-full/include/net/sctp/sctp.h.old 2004-11-25 00:41:46.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/sctp.h 2004-11-25 01:34:35.000000000 +0100 @@ -162,17 +162,9 @@ int sctp_rcv(struct sk_buff *skb); void sctp_v4_err(struct sk_buff *skb, u32 info); void sctp_hash_established(struct sctp_association *); -void __sctp_hash_established(struct sctp_association *); void sctp_unhash_established(struct sctp_association *); -void __sctp_unhash_established(struct sctp_association *); void sctp_hash_endpoint(struct sctp_endpoint *); -void __sctp_hash_endpoint(struct sctp_endpoint *); void sctp_unhash_endpoint(struct sctp_endpoint *); -void __sctp_unhash_endpoint(struct sctp_endpoint *); -struct sctp_association *__sctp_lookup_association( - const union sctp_addr *, - const union sctp_addr *, - struct sctp_transport **); struct sock *sctp_err_lookup(int family, struct sk_buff *, struct sctphdr *, struct sctp_endpoint **, struct sctp_association **, @@ -310,8 +302,6 @@ int sctp_v6_init(void); void sctp_v6_exit(void); -void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, - int type, int code, int offset, __u32 info); #else /* #ifdef defined(CONFIG_IPV6) */ --- linux-2.6.10-rc2-mm3-full/include/net/sctp/sm.h.old 2004-11-25 01:42:52.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/sm.h 2004-11-25 03:14:05.000000000 +0100 @@ -128,7 +128,6 @@ sctp_state_fn_t sctp_sf_do_ecn_cwr; sctp_state_fn_t sctp_sf_do_ecne; sctp_state_fn_t sctp_sf_ootb; -sctp_state_fn_t sctp_sf_shut_8_4_5; sctp_state_fn_t sctp_sf_pdiscard; sctp_state_fn_t sctp_sf_violation; sctp_state_fn_t sctp_sf_discard_chunk; @@ -138,7 +137,6 @@ sctp_state_fn_t sctp_sf_unk_chunk; sctp_state_fn_t sctp_sf_do_8_5_1_E_sa; sctp_state_fn_t sctp_sf_cookie_echoed_err; -sctp_state_fn_t sctp_sf_do_5_2_6_stale; sctp_state_fn_t sctp_sf_do_asconf; sctp_state_fn_t sctp_sf_do_asconf_ack; sctp_state_fn_t sctp_sf_do_9_2_reshutack; @@ -200,19 +198,10 @@ struct sctp_chunk *sctp_make_cwr(const struct sctp_association *, const __u32 lowest_tsn, const struct sctp_chunk *); -struct sctp_chunk *sctp_make_datafrag(struct sctp_association *, - const struct sctp_sndrcvinfo *sinfo, - int len, const __u8 *data, - __u8 flags, __u16 ssn); struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *, const struct sctp_sndrcvinfo *sinfo, int len, const __u8 flags, __u16 ssn); -struct sctp_chunk *sctp_make_data(struct sctp_association *, - const struct sctp_sndrcvinfo *sinfo, - int len, const __u8 *data); -struct sctp_chunk *sctp_make_data_empty(struct sctp_association *, - const struct sctp_sndrcvinfo *, int len); struct sctp_chunk *sctp_make_ecne(const struct sctp_association *, const __u32); struct sctp_chunk *sctp_make_sack(const struct sctp_association *); @@ -246,17 +235,12 @@ const void *payload, size_t paylen); -struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, - union sctp_addr *addr, - int vparam_len); struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *, union sctp_addr *, struct sockaddr *, int, __u16); struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, union sctp_addr *addr); -struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc, - __u32 serial, int vparam_len); struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, struct sctp_chunk *asconf); int sctp_process_asconf_ack(struct sctp_association *asoc, @@ -277,71 +261,26 @@ void *event_arg, int gfp); -int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, - sctp_state_t state, - struct sctp_endpoint *, - struct sctp_association *asoc, - void *event_arg, - sctp_disposition_t status, - sctp_cmd_seq_t *commands, - int gfp); - /* 2nd level prototypes */ -int sctp_cmd_interpreter(sctp_event_t, sctp_subtype_t, sctp_state_t, - struct sctp_endpoint *, struct sctp_association *, - void *event_arg, sctp_disposition_t, - sctp_cmd_seq_t *retval, int gfp); - - -int sctp_gen_sack(struct sctp_association *, int force, sctp_cmd_seq_t *); void sctp_generate_t3_rtx_event(unsigned long peer); void sctp_generate_heartbeat_event(unsigned long peer); -sctp_sackhdr_t *sctp_sm_pull_sack(struct sctp_chunk *); -struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *, - const struct sctp_association *, - struct sctp_chunk *chunk, - const void *payload, - size_t paylen); -struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *, - const struct sctp_chunk *); void sctp_ootb_pkt_free(struct sctp_packet *); -struct sctp_cookie_param * -sctp_pack_cookie(const struct sctp_endpoint *, const struct sctp_association *, - const struct sctp_chunk *, int *cookie_len, - const __u8 *, int addrs_len); struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *, const struct sctp_association *, struct sctp_chunk *, int gfp, int *err, struct sctp_chunk **err_chk_p); int sctp_addip_addr_config(struct sctp_association *, sctp_param_t, struct sockaddr_storage*, int); -void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, - const struct sctp_association *asoc, - const struct sctp_chunk *chunk, - sctp_cmd_seq_t *commands, - struct sctp_chunk *err_chunk); -int sctp_eat_data(const struct sctp_association *asoc, - struct sctp_chunk *chunk, - sctp_cmd_seq_t *commands); /* 3rd level prototypes */ __u32 sctp_generate_tag(const struct sctp_endpoint *); __u32 sctp_generate_tsn(const struct sctp_endpoint *); /* Extern declarations for major data structures. */ -const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t, sctp_state_t); -extern const sctp_sm_table_entry_t -primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES]; -extern const sctp_sm_table_entry_t -other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES]; -extern const sctp_sm_table_entry_t -timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES]; extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES]; -/* These are some handy utility macros... */ - /* Get the size of a DATA chunk payload. */ static inline __u16 sctp_data_size(struct sctp_chunk *chunk) --- linux-2.6.10-rc2-mm3-full/net/sctp/associola.c.old 2004-11-25 00:33:40.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/associola.c 2004-11-25 00:34:52.000000000 +0100 @@ -66,33 +66,8 @@ /* 1st Level Abstractions. */ -/* Allocate and initialize a new association */ -struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep, - const struct sock *sk, - sctp_scope_t scope, int gfp) -{ - struct sctp_association *asoc; - - asoc = t_new(struct sctp_association, gfp); - if (!asoc) - goto fail; - - if (!sctp_association_init(asoc, ep, sk, scope, gfp)) - goto fail_init; - - asoc->base.malloced = 1; - SCTP_DBG_OBJCNT_INC(assoc); - - return asoc; - -fail_init: - kfree(asoc); -fail: - return NULL; -} - /* Initialize a new association from provided memory. */ -struct sctp_association *sctp_association_init(struct sctp_association *asoc, +static struct sctp_association *sctp_association_init(struct sctp_association *asoc, const struct sctp_endpoint *ep, const struct sock *sk, sctp_scope_t scope, @@ -296,6 +271,31 @@ return NULL; } +/* Allocate and initialize a new association */ +struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep, + const struct sock *sk, + sctp_scope_t scope, int gfp) +{ + struct sctp_association *asoc; + + asoc = t_new(struct sctp_association, gfp); + if (!asoc) + goto fail; + + if (!sctp_association_init(asoc, ep, sk, scope, gfp)) + goto fail_init; + + asoc->base.malloced = 1; + SCTP_DBG_OBJCNT_INC(assoc); + + return asoc; + +fail_init: + kfree(asoc); +fail: + return NULL; +} + /* Free this association if possible. There may still be users, so * the actual deallocation may be delayed. */ @@ -714,18 +714,6 @@ return retval; } -/* Allocate 'num' TSNs by incrementing the association's TSN by num. */ -__u32 sctp_association_get_tsn_block(struct sctp_association *asoc, int num) -{ - __u32 retval = asoc->next_tsn; - - asoc->next_tsn += num; - asoc->unack_data += num; - - return retval; -} - - /* Compare two addresses to see if they match. Wildcard addresses * only match themselves. */ @@ -760,14 +748,6 @@ return chunk; } -/* Use this function for the packet prepend callback when no ECNE - * packet is desired (e.g. some packets don't like to be bundled). - */ -struct sctp_chunk *sctp_get_no_prepend(struct sctp_association *asoc) -{ - return NULL; -} - /* * Find which transport this TSN was sent on. */ --- linux-2.6.10-rc2-mm3-full/net/sctp/bind_addr.c.old 2004-11-25 00:35:13.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/bind_addr.c 2004-11-25 00:35:23.000000000 +0100 @@ -104,23 +104,6 @@ return error; } -/* Create a new SCTP_bind_addr from nothing. */ -struct sctp_bind_addr *sctp_bind_addr_new(int gfp) -{ - struct sctp_bind_addr *retval; - - retval = t_new(struct sctp_bind_addr, gfp); - if (!retval) - goto nomem; - - sctp_bind_addr_init(retval, 0); - retval->malloced = 1; - SCTP_DBG_OBJCNT_INC(bind_addr); - -nomem: - return retval; -} - /* Initialize the SCTP_bind_addr structure for either an endpoint or * an association. */ --- linux-2.6.10-rc2-mm3-full/net/sctp/chunk.c.old 2004-11-25 00:36:15.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/chunk.c 2004-11-25 00:36:55.000000000 +0100 @@ -51,7 +51,7 @@ */ /* Initialize datamsg from memory. */ -void sctp_datamsg_init(struct sctp_datamsg *msg) +static void sctp_datamsg_init(struct sctp_datamsg *msg) { atomic_set(&msg->refcnt, 1); msg->send_failed = 0; @@ -62,7 +62,7 @@ } /* Allocate and initialize datamsg. */ -struct sctp_datamsg *sctp_datamsg_new(int gfp) +static struct sctp_datamsg *sctp_datamsg_new(int gfp) { struct sctp_datamsg *msg; msg = kmalloc(sizeof(struct sctp_datamsg), gfp); @@ -124,7 +124,7 @@ } /* Hold a reference. */ -void sctp_datamsg_hold(struct sctp_datamsg *msg) +static void sctp_datamsg_hold(struct sctp_datamsg *msg) { atomic_inc(&msg->refcnt); } @@ -151,7 +151,7 @@ } /* Assign a chunk to this datamsg. */ -void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chunk) +static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chunk) { sctp_datamsg_hold(msg); chunk->msg = msg; --- linux-2.6.10-rc2-mm3-full/net/sctp/command.c.old 2004-11-25 00:38:22.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/command.c 2004-11-25 00:38:55.000000000 +0100 @@ -42,17 +42,6 @@ #include #include -/* Create a new sctp_command_sequence. */ -sctp_cmd_seq_t *sctp_new_cmd_seq(int gfp) -{ - sctp_cmd_seq_t *retval = t_new(sctp_cmd_seq_t, gfp); - - if (retval) - sctp_init_cmd_seq(retval); - - return retval; -} - /* Initialize a block of memory as a command sequence. */ int sctp_init_cmd_seq(sctp_cmd_seq_t *seq) { @@ -77,13 +66,6 @@ return 0; } -/* Rewind an sctp_cmd_seq_t to iterate from the start. */ -int sctp_rewind_sequence(sctp_cmd_seq_t *seq) -{ - seq->next_cmd = 0; - return 1; /* We always succeed. */ -} - /* Return the next command structure in a sctp_cmd_seq. * Returns NULL at the end of the sequence. */ @@ -97,8 +79,3 @@ return retval; } -/* Dispose of a command sequence. */ -void sctp_free_cmd_seq(sctp_cmd_seq_t *seq) -{ - kfree(seq); -} --- linux-2.6.10-rc2-mm3-full/net/sctp/debug.c.old 2004-11-25 00:39:29.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/debug.c 2004-11-25 00:39:39.000000000 +0100 @@ -98,23 +98,6 @@ return "unknown chunk"; } -/* These are printable form of variable-length parameters. */ -const char *sctp_param_tbl[SCTP_PARAM_ECN_CAPABLE + 1] = { - "", - "PARAM_HEARTBEAT_INFO", - "", - "", - "", - "PARAM_IPV4_ADDRESS", - "PARAM_IPV6_ADDRESS", - "PARAM_STATE_COOKIE", - "PARAM_UNRECOGNIZED_PARAMETERS", - "PARAM_COOKIE_PRESERVATIVE", - "", - "PARAM_HOST_NAME_ADDRESS", - "PARAM_SUPPORTED_ADDRESS_TYPES", -}; - /* These are printable forms of the states. */ const char *sctp_state_tbl[SCTP_STATE_NUM_STATES] = { "STATE_EMPTY", --- linux-2.6.10-rc2-mm3-full/net/sctp/endpointola.c.old 2004-11-25 00:40:01.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/endpointola.c 2004-11-25 00:41:19.000000000 +0100 @@ -63,34 +63,11 @@ /* Forward declarations for internal helpers. */ static void sctp_endpoint_bh_rcv(struct sctp_endpoint *ep); -/* Create a sctp_endpoint with all that boring stuff initialized. - * Returns NULL if there isn't enough memory. - */ -struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, int gfp) -{ - struct sctp_endpoint *ep; - - /* Build a local endpoint. */ - ep = t_new(struct sctp_endpoint, gfp); - if (!ep) - goto fail; - if (!sctp_endpoint_init(ep, sk, gfp)) - goto fail_init; - ep->base.malloced = 1; - SCTP_DBG_OBJCNT_INC(ep); - return ep; - -fail_init: - kfree(ep); -fail: - return NULL; -} - /* * Initialize the base fields of the endpoint structure. */ -struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, - struct sock *sk, int gfp) +static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, + struct sock *sk, int gfp) { struct sctp_opt *sp = sctp_sk(sk); memset(ep, 0, sizeof(struct sctp_endpoint)); @@ -160,6 +137,29 @@ return ep; } +/* Create a sctp_endpoint with all that boring stuff initialized. + * Returns NULL if there isn't enough memory. + */ +struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, int gfp) +{ + struct sctp_endpoint *ep; + + /* Build a local endpoint. */ + ep = t_new(struct sctp_endpoint, gfp); + if (!ep) + goto fail; + if (!sctp_endpoint_init(ep, sk, gfp)) + goto fail_init; + ep->base.malloced = 1; + SCTP_DBG_OBJCNT_INC(ep); + return ep; + +fail_init: + kfree(ep); +fail: + return NULL; +} + /* Add an association to an endpoint. */ void sctp_endpoint_add_asoc(struct sctp_endpoint *ep, struct sctp_association *asoc) @@ -184,7 +184,7 @@ } /* Final destructor for endpoint. */ -void sctp_endpoint_destroy(struct sctp_endpoint *ep) +static void sctp_endpoint_destroy(struct sctp_endpoint *ep) { SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return); @@ -257,7 +257,7 @@ * We do a linear search of the associations for this endpoint. * We return the matching transport address too. */ -struct sctp_association *__sctp_endpoint_lookup_assoc( +static struct sctp_association *__sctp_endpoint_lookup_assoc( const struct sctp_endpoint *ep, const union sctp_addr *paddr, struct sctp_transport **transport) --- linux-2.6.10-rc2-mm3-full/net/sctp/input.c.old 2004-11-25 00:42:03.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/input.c 2004-11-25 00:46:22.000000000 +0100 @@ -63,11 +63,15 @@ /* Forward declarations for internal helpers. */ static int sctp_rcv_ootb(struct sk_buff *); -struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, +static struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, const union sctp_addr *laddr, const union sctp_addr *paddr, struct sctp_transport **transportp); -struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr); +static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr); +static struct sctp_association *__sctp_lookup_association( + const union sctp_addr *local, + const union sctp_addr *peer, + struct sctp_transport **pt); /* Calculate the SCTP checksum of an SCTP packet. */ @@ -522,7 +526,7 @@ } /* Insert endpoint into the hash table. */ -void __sctp_hash_endpoint(struct sctp_endpoint *ep) +static void __sctp_hash_endpoint(struct sctp_endpoint *ep) { struct sctp_ep_common **epp; struct sctp_ep_common *epb; @@ -552,7 +556,7 @@ } /* Remove endpoint from the hash table. */ -void __sctp_unhash_endpoint(struct sctp_endpoint *ep) +static void __sctp_unhash_endpoint(struct sctp_endpoint *ep) { struct sctp_hashbucket *head; struct sctp_ep_common *epb; @@ -584,7 +588,7 @@ } /* Look up an endpoint. */ -struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr) +static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr) { struct sctp_hashbucket *head; struct sctp_ep_common *epb; @@ -610,16 +614,8 @@ return ep; } -/* Add an association to the hash. Local BH-safe. */ -void sctp_hash_established(struct sctp_association *asoc) -{ - sctp_local_bh_disable(); - __sctp_hash_established(asoc); - sctp_local_bh_enable(); -} - /* Insert association into the hash table. */ -void __sctp_hash_established(struct sctp_association *asoc) +static void __sctp_hash_established(struct sctp_association *asoc) { struct sctp_ep_common **epp; struct sctp_ep_common *epb; @@ -642,16 +638,16 @@ sctp_write_unlock(&head->lock); } -/* Remove association from the hash table. Local BH-safe. */ -void sctp_unhash_established(struct sctp_association *asoc) +/* Add an association to the hash. Local BH-safe. */ +void sctp_hash_established(struct sctp_association *asoc) { sctp_local_bh_disable(); - __sctp_unhash_established(asoc); + __sctp_hash_established(asoc); sctp_local_bh_enable(); } /* Remove association from the hash table. */ -void __sctp_unhash_established(struct sctp_association *asoc) +static void __sctp_unhash_established(struct sctp_association *asoc) { struct sctp_hashbucket *head; struct sctp_ep_common *epb; @@ -675,8 +671,16 @@ sctp_write_unlock(&head->lock); } +/* Remove association from the hash table. Local BH-safe. */ +void sctp_unhash_established(struct sctp_association *asoc) +{ + sctp_local_bh_disable(); + __sctp_unhash_established(asoc); + sctp_local_bh_enable(); +} + /* Look up an association. */ -struct sctp_association *__sctp_lookup_association( +static struct sctp_association *__sctp_lookup_association( const union sctp_addr *local, const union sctp_addr *peer, struct sctp_transport **pt) @@ -713,7 +717,7 @@ } /* Look up an association. BH-safe. */ -struct sctp_association *sctp_lookup_association(const union sctp_addr *laddr, +static struct sctp_association *sctp_lookup_association(const union sctp_addr *laddr, const union sctp_addr *paddr, struct sctp_transport **transportp) { @@ -821,7 +825,7 @@ } /* Lookup an association for an inbound skb. */ -struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, +static struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, const union sctp_addr *paddr, const union sctp_addr *laddr, struct sctp_transport **transportp) --- linux-2.6.10-rc2-mm3-full/net/sctp/ipv6.c.old 2004-11-25 01:34:44.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/ipv6.c 2004-11-25 01:35:57.000000000 +0100 @@ -84,8 +84,8 @@ }; /* ICMP error handler. */ -void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, - int type, int code, int offset, __u32 info) +static void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + int type, int code, int offset, __u32 info) { struct inet6_dev *idev; struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; @@ -188,9 +188,9 @@ /* Returns the dst cache entry for the given source and destination ip * addresses. */ -struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, - union sctp_addr *daddr, - union sctp_addr *saddr) +static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, + union sctp_addr *daddr, + union sctp_addr *saddr) { struct dst_entry *dst; struct flowi fl; @@ -251,8 +251,10 @@ /* Fills in the source address(saddr) based on the destination address(daddr) * and asoc's bind address list. */ -void sctp_v6_get_saddr(struct sctp_association *asoc, struct dst_entry *dst, - union sctp_addr *daddr, union sctp_addr *saddr) +static void sctp_v6_get_saddr(struct sctp_association *asoc, + struct dst_entry *dst, + union sctp_addr *daddr, + union sctp_addr *saddr) { struct sctp_bind_addr *bp; rwlock_t *addr_lock; @@ -577,8 +579,8 @@ } /* Create and initialize a new sk for the socket to be returned by accept(). */ -struct sock *sctp_v6_create_accept_sk(struct sock *sk, - struct sctp_association *asoc) +static struct sock *sctp_v6_create_accept_sk(struct sock *sk, + struct sctp_association *asoc) { struct inet_opt *inet = inet_sk(sk); struct sock *newsk; --- linux-2.6.10-rc2-mm3-full/net/sctp/inqueue.c.old 2004-11-25 00:46:50.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/inqueue.c 2004-11-25 00:46:57.000000000 +0100 @@ -59,19 +59,6 @@ queue->malloced = 0; } -/* Create an initialized sctp_inq. */ -struct sctp_inq *sctp_inq_new(void) -{ - struct sctp_inq *retval; - - retval = t_new(struct sctp_inq, GFP_ATOMIC); - if (retval) { - sctp_inq_init(retval); - retval->malloced = 1; - } - return retval; -} - /* Release the memory associated with an SCTP inqueue. */ void sctp_inq_free(struct sctp_inq *queue) { --- linux-2.6.10-rc2-mm3-full/net/sctp/objcnt.c.old 2004-11-25 01:36:46.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/objcnt.c 2004-11-25 01:36:56.000000000 +0100 @@ -62,7 +62,7 @@ /* An array to make it easy to pretty print the debug information * to the proc fs. */ -sctp_dbg_objcnt_entry_t sctp_dbg_objcnt[] = { +static sctp_dbg_objcnt_entry_t sctp_dbg_objcnt[] = { SCTP_DBG_OBJCNT_ENTRY(sock), SCTP_DBG_OBJCNT_ENTRY(ep), SCTP_DBG_OBJCNT_ENTRY(assoc), --- linux-2.6.10-rc2-mm3-full/net/sctp/outqueue.c.old 2004-11-25 01:37:31.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/outqueue.c 2004-11-25 01:37:47.000000000 +0100 @@ -190,19 +190,6 @@ return 0; } -/* Generate a new outqueue. */ -struct sctp_outq *sctp_outq_new(struct sctp_association *asoc) -{ - struct sctp_outq *q; - - q = t_new(struct sctp_outq, GFP_KERNEL); - if (q) { - sctp_outq_init(asoc, q); - q->malloced = 1; - } - return q; -} - /* Initialize an existing sctp_outq. This does the boring stuff. * You still need to define handlers if you really want to DO * something with this structure... @@ -362,7 +349,7 @@ /* Insert a chunk into the sorted list based on the TSNs. The retransmit list * and the abandoned list are in ascending order. */ -void sctp_insert_list(struct list_head *head, struct list_head *new) +static void sctp_insert_list(struct list_head *head, struct list_head *new) { struct list_head *pos; struct sctp_chunk *nchunk, *lchunk; --- linux-2.6.10-rc2-mm3-full/net/sctp/proc.c.old 2004-11-25 01:38:01.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/proc.c 2004-11-25 01:38:10.000000000 +0100 @@ -39,7 +39,7 @@ #include #include -struct snmp_mib sctp_snmp_list[] = { +static struct snmp_mib sctp_snmp_list[] = { SNMP_MIB_ITEM("SctpCurrEstab", SCTP_MIB_CURRESTAB), SNMP_MIB_ITEM("SctpActiveEstabs", SCTP_MIB_ACTIVEESTABS), SNMP_MIB_ITEM("SctpPassiveEstabs", SCTP_MIB_PASSIVEESTABS), --- linux-2.6.10-rc2-mm3-full/net/sctp/protocol.c.old 2004-11-25 01:39:00.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/protocol.c 2004-11-25 01:41:45.000000000 +0100 @@ -95,7 +95,7 @@ } /* Set up the proc fs entry for the SCTP protocol. */ -__init int sctp_proc_init(void) +static __init int sctp_proc_init(void) { if (!proc_net_sctp) { struct proc_dir_entry *ent; @@ -124,7 +124,7 @@ * Note: Do not make this __exit as it is used in the init error * path. */ -void sctp_proc_exit(void) +static void sctp_proc_exit(void) { sctp_snmp_proc_exit(); sctp_eps_proc_exit(); @@ -428,9 +428,9 @@ * addresses. If an association is passed, trys to get a dst entry with a * source address that matches an address in the bind address list. */ -struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, - union sctp_addr *daddr, - union sctp_addr *saddr) +static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, + union sctp_addr *daddr, + union sctp_addr *saddr) { struct rtable *rt; struct flowi fl; @@ -520,10 +520,10 @@ /* For v4, the source address is cached in the route entry(dst). So no need * to cache it separately and hence this is an empty routine. */ -void sctp_v4_get_saddr(struct sctp_association *asoc, - struct dst_entry *dst, - union sctp_addr *daddr, - union sctp_addr *saddr) +static void sctp_v4_get_saddr(struct sctp_association *asoc, + struct dst_entry *dst, + union sctp_addr *daddr, + union sctp_addr *saddr) { struct rtable *rt = (struct rtable *)dst; @@ -547,8 +547,8 @@ } /* Create and initialize a new sk for the socket returned by accept(). */ -struct sock *sctp_v4_create_accept_sk(struct sock *sk, - struct sctp_association *asoc) +static struct sock *sctp_v4_create_accept_sk(struct sock *sk, + struct sctp_association *asoc) { struct sock *newsk; struct inet_opt *inet = inet_sk(sk); @@ -639,7 +639,7 @@ * Initialize the control inode/socket with a control endpoint data * structure. This endpoint is reserved exclusively for the OOTB processing. */ -int sctp_ctl_sock_init(void) +static int sctp_ctl_sock_init(void) { int err; sa_family_t family; @@ -808,7 +808,7 @@ return ip_queue_xmit(skb, ipfragok); } -struct sctp_af sctp_ipv4_specific; +static struct sctp_af sctp_ipv4_specific; static struct sctp_pf sctp_pf_inet = { .event_msgname = sctp_inet_event_msgname, @@ -829,7 +829,7 @@ }; /* Socket operations. */ -struct proto_ops inet_seqpacket_ops = { +static struct proto_ops inet_seqpacket_ops = { .family = PF_INET, .owner = THIS_MODULE, .release = inet_release, /* Needs to be wrapped... */ @@ -878,7 +878,7 @@ }; /* IPv4 address related functions. */ -struct sctp_af sctp_ipv4_specific = { +static struct sctp_af sctp_ipv4_specific = { .sctp_xmit = sctp_v4_xmit, .setsockopt = ip_setsockopt, .getsockopt = ip_getsockopt, @@ -959,7 +959,7 @@ } /* Initialize the universe into something sensible. */ -__init int sctp_init(void) +static __init int sctp_init(void) { int i; int status = -EINVAL; @@ -1196,7 +1196,7 @@ } /* Exit handler for the SCTP protocol. */ -__exit void sctp_exit(void) +static __exit void sctp_exit(void) { /* BUG. This should probably do something useful like clean * up all the remaining associations and all that memory. --- linux-2.6.10-rc2-mm3-full/net/sctp/sm_make_chunk.c.old 2004-11-25 01:43:40.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/sm_make_chunk.c 2004-11-25 01:51:15.000000000 +0100 @@ -67,6 +67,18 @@ extern kmem_cache_t *sctp_chunk_cachep; +static struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc, + __u8 type, __u8 flags, int paylen); +static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const struct sctp_chunk *init_chunk, + int *cookie_len, + const __u8 *raw_addrs, int addrs_len); +static int sctp_process_param(struct sctp_association *asoc, + union sctp_params param, + const union sctp_addr *peer_addr, + int gfp); + /* What was the inbound interface for this chunk? */ int sctp_chunk_iif(const struct sctp_chunk *chunk) { @@ -559,52 +571,6 @@ return retval; } -/* Make a DATA chunk for the given association. Populate the data - * payload. - */ -struct sctp_chunk *sctp_make_datafrag(struct sctp_association *asoc, - const struct sctp_sndrcvinfo *sinfo, - int data_len, const __u8 *data, - __u8 flags, __u16 ssn) -{ - struct sctp_chunk *retval; - - retval = sctp_make_datafrag_empty(asoc, sinfo, data_len, flags, ssn); - if (retval) - sctp_addto_chunk(retval, data_len, data); - - return retval; -} - -/* Make a DATA chunk for the given association to ride on stream id - * 'stream', with a payload id of 'payload', and a body of 'data'. - */ -struct sctp_chunk *sctp_make_data(struct sctp_association *asoc, - const struct sctp_sndrcvinfo *sinfo, - int data_len, const __u8 *data) -{ - struct sctp_chunk *retval = NULL; - - retval = sctp_make_data_empty(asoc, sinfo, data_len); - if (retval) - sctp_addto_chunk(retval, data_len, data); - return retval; -} - -/* Make a DATA chunk for the given association to ride on stream id - * 'stream', with a payload id of 'payload', and a body big enough to - * hold 'data_len' octets of data. We use this version when we need - * to build the message AFTER allocating memory. - */ -struct sctp_chunk *sctp_make_data_empty(struct sctp_association *asoc, - const struct sctp_sndrcvinfo *sinfo, - int data_len) -{ - __u8 flags = SCTP_DATA_NOT_FRAG; - - return sctp_make_datafrag_empty(asoc, sinfo, data_len, flags, 0); -} - /* Create a selective ackowledgement (SACK) for the given * association. This reports on which TSN's we've seen to date, * including duplicates and gaps. @@ -933,7 +899,7 @@ /* Create an Operation Error chunk with the specified space reserved. * This routine can be used for containing multiple causes in the chunk. */ -struct sctp_chunk *sctp_make_op_error_space( +static struct sctp_chunk *sctp_make_op_error_space( const struct sctp_association *asoc, const struct sctp_chunk *chunk, size_t size) @@ -1062,8 +1028,8 @@ /* Create a new chunk, setting the type and flags headers from the * arguments, reserving enough space for a 'paylen' byte payload. */ -struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc, - __u8 type, __u8 flags, int paylen) +static struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc, + __u8 type, __u8 flags, int paylen) { struct sctp_chunk *retval; sctp_chunkhdr_t *chunk_hdr; @@ -1261,7 +1227,7 @@ /* Build a cookie representing asoc. * This INCLUDES the param header needed to put the cookie in the INIT ACK. */ -sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, +static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, const struct sctp_association *asoc, const struct sctp_chunk *init_chunk, int *cookie_len, @@ -1912,8 +1878,10 @@ * work we do. In particular, we should not build transport * structures for the addresses. */ -int sctp_process_param(struct sctp_association *asoc, union sctp_params param, - const union sctp_addr *peer_addr, int gfp) +static int sctp_process_param(struct sctp_association *asoc, + union sctp_params param, + const union sctp_addr *peer_addr, + int gfp) { union sctp_addr addr; int i; @@ -2078,8 +2046,9 @@ * * Address Parameter and other parameter will not be wrapped in this function */ -struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, - union sctp_addr *addr, int vparam_len) +static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, + union sctp_addr *addr, + int vparam_len) { sctp_addiphdr_t asconf; struct sctp_chunk *retval; @@ -2248,8 +2217,8 @@ * * Create an ASCONF_ACK chunk with enough space for the parameter responses. */ -struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc, - __u32 serial, int vparam_len) +static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc, + __u32 serial, int vparam_len) { sctp_addiphdr_t asconf; struct sctp_chunk *retval; --- linux-2.6.10-rc2-mm3-full/net/sctp/sm_sideeffect.c.old 2004-11-25 01:52:16.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/sm_sideeffect.c 2004-11-25 03:24:28.000000000 +0100 @@ -55,6 +55,24 @@ #include #include +static int sctp_cmd_interpreter(sctp_event_t event_type, + sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp); +static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp); + /******************************************************************** * Helper functions ********************************************************************/ @@ -134,8 +152,8 @@ } /* Generate SACK if necessary. We call this at the end of a packet. */ -int sctp_gen_sack(struct sctp_association *asoc, int force, - sctp_cmd_seq_t *commands) +static int sctp_gen_sack(struct sctp_association *asoc, int force, + sctp_cmd_seq_t *commands) { __u32 ctsn, max_tsn_seen; struct sctp_chunk *sack; @@ -276,31 +294,31 @@ sctp_association_put(asoc); } -void sctp_generate_t1_cookie_event(unsigned long data) +static void sctp_generate_t1_cookie_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_COOKIE); } -void sctp_generate_t1_init_event(unsigned long data) +static void sctp_generate_t1_init_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_INIT); } -void sctp_generate_t2_shutdown_event(unsigned long data) +static void sctp_generate_t2_shutdown_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T2_SHUTDOWN); } -void sctp_generate_t4_rto_event(unsigned long data) +static void sctp_generate_t4_rto_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T4_RTO); } -void sctp_generate_t5_shutdown_guard_event(unsigned long data) +static void sctp_generate_t5_shutdown_guard_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *)data; sctp_generate_timeout_event(asoc, @@ -308,7 +326,7 @@ } /* sctp_generate_t5_shutdown_guard_event() */ -void sctp_generate_autoclose_event(unsigned long data) +static void sctp_generate_autoclose_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_AUTOCLOSE); @@ -353,7 +371,7 @@ } /* Inject a SACK Timeout event into the state machine. */ -void sctp_generate_sack_event(unsigned long data) +static void sctp_generate_sack_event(unsigned long data) { struct sctp_association *asoc = (struct sctp_association *) data; sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_SACK); @@ -857,14 +875,14 @@ /***************************************************************** * This the master state function side effect processing function. *****************************************************************/ -int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, - sctp_state_t state, - struct sctp_endpoint *ep, - struct sctp_association *asoc, - void *event_arg, - sctp_disposition_t status, - sctp_cmd_seq_t *commands, - int gfp) +static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp) { int error; @@ -944,11 +962,15 @@ ********************************************************************/ /* This is the side-effect interpreter. */ -int sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype, - sctp_state_t state, struct sctp_endpoint *ep, - struct sctp_association *asoc, void *event_arg, - sctp_disposition_t status, sctp_cmd_seq_t *commands, - int gfp) +static int sctp_cmd_interpreter(sctp_event_t event_type, + sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp) { int error = 0; int force; --- linux-2.6.10-rc2-mm3-full/net/sctp/sm_statefuns.c.old 2004-11-25 01:56:27.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/sm_statefuns.c 2004-11-25 02:14:47.000000000 +0100 @@ -65,6 +65,33 @@ #include #include +static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + struct sctp_chunk *chunk, + const void *payload, + size_t paylen); +static int sctp_eat_data(const struct sctp_association *asoc, + struct sctp_chunk *chunk, + sctp_cmd_seq_t *commands); +static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc, + const struct sctp_chunk *chunk); +static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const struct sctp_chunk *chunk, + sctp_cmd_seq_t *commands, + struct sctp_chunk *err_chunk); +static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands); +static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands); +static struct sctp_sackhdr *sctp_sm_pull_sack(struct sctp_chunk *chunk); + /********************************************************** * These are the state functions for handling chunk events. **********************************************************/ @@ -748,11 +775,11 @@ } /* Generate and sendout a heartbeat packet. */ -sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep, - const struct sctp_association *asoc, - const sctp_subtype_t type, - void *arg, - sctp_cmd_seq_t *commands) +static sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) { struct sctp_transport *transport = (struct sctp_transport *) arg; struct sctp_chunk *reply; @@ -1928,11 +1955,11 @@ * * The return value is the disposition of the chunk. */ -sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, - const struct sctp_association *asoc, - const sctp_subtype_t type, - void *arg, - sctp_cmd_seq_t *commands) +static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) { struct sctp_chunk *chunk = arg; time_t stale; @@ -2853,11 +2880,11 @@ * * The return value is the disposition of the chunk. */ -sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep, - const struct sctp_association *asoc, - const sctp_subtype_t type, - void *arg, - sctp_cmd_seq_t *commands) +static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) { struct sctp_packet *packet = NULL; struct sctp_chunk *chunk = arg; @@ -4537,7 +4564,7 @@ ********************************************************************/ /* Pull the SACK chunk based on the SACK header. */ -struct sctp_sackhdr *sctp_sm_pull_sack(struct sctp_chunk *chunk) +static struct sctp_sackhdr *sctp_sm_pull_sack(struct sctp_chunk *chunk) { struct sctp_sackhdr *sack; unsigned int len; @@ -4564,7 +4591,7 @@ /* Create an ABORT packet to be sent as a response, with the specified * error causes. */ -struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep, +static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep, const struct sctp_association *asoc, struct sctp_chunk *chunk, const void *payload, @@ -4600,8 +4627,8 @@ } /* Allocate a packet for responding in the OOTB conditions. */ -struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc, - const struct sctp_chunk *chunk) +static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc, + const struct sctp_chunk *chunk) { struct sctp_packet *packet; struct sctp_transport *transport; @@ -4664,11 +4691,11 @@ } /* Send a stale cookie error when a invalid COOKIE ECHO chunk is found */ -void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, - const struct sctp_association *asoc, - const struct sctp_chunk *chunk, - sctp_cmd_seq_t *commands, - struct sctp_chunk *err_chunk) +static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const struct sctp_chunk *chunk, + sctp_cmd_seq_t *commands, + struct sctp_chunk *err_chunk) { struct sctp_packet *packet; @@ -4694,9 +4721,9 @@ /* Process a data chunk */ -int sctp_eat_data(const struct sctp_association *asoc, - struct sctp_chunk *chunk, - sctp_cmd_seq_t *commands) +static int sctp_eat_data(const struct sctp_association *asoc, + struct sctp_chunk *chunk, + sctp_cmd_seq_t *commands) { sctp_datahdr_t *data_hdr; struct sctp_chunk *err; --- linux-2.6.10-rc2-mm3-full/net/sctp/sm_statetable.c.old 2004-11-25 02:15:50.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/sm_statetable.c 2004-11-25 03:23:43.000000000 +0100 @@ -50,6 +50,17 @@ #include #include +static const sctp_sm_table_entry_t +primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES]; +static const sctp_sm_table_entry_t +other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES]; +static const sctp_sm_table_entry_t +timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES]; + +static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, + sctp_state_t state); + + static const sctp_sm_table_entry_t bug = { .fn = sctp_sf_bug, .name = "sctp_sf_bug" @@ -419,7 +430,7 @@ * * For base protocol (RFC 2960). */ -const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_DATA, TYPE_SCTP_INIT, TYPE_SCTP_INIT_ACK, @@ -482,7 +493,7 @@ /* The primary index for this table is the chunk type. * The secondary index for this table is the state. */ -const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_ASCONF, TYPE_SCTP_ASCONF_ACK, }; /*state_fn_t addip_chunk_event_table[][] */ @@ -511,7 +522,7 @@ /* The primary index for this table is the chunk type. * The secondary index for this table is the state. */ -const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_FWD_TSN, }; /*state_fn_t prsctp_chunk_event_table[][] */ @@ -684,7 +695,7 @@ /* The primary index for this table is the primitive type. * The secondary index for this table is the state. */ -const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_PRIMITIVE_ASSOCIATE, TYPE_SCTP_PRIMITIVE_SHUTDOWN, TYPE_SCTP_PRIMITIVE_ABORT, @@ -716,7 +727,7 @@ {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ } -const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_OTHER_NO_PENDING_TSN, }; @@ -931,7 +942,7 @@ {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ } -const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = { +static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = { TYPE_SCTP_EVENT_TIMEOUT_NONE, TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE, TYPE_SCTP_EVENT_TIMEOUT_T1_INIT, @@ -944,8 +955,8 @@ TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, }; -const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, - sctp_state_t state) +static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, + sctp_state_t state) { if (state > SCTP_STATE_MAX) return &bug; --- linux-2.6.10-rc2-mm3-full/net/sctp/socket.c.old 2004-11-25 02:19:43.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/socket.c 2004-11-25 02:20:25.000000000 +0100 @@ -208,7 +208,7 @@ * id are specified, the associations matching the address and the id should be * the same. */ -struct sctp_transport *sctp_addr_id2transport(struct sock *sk, +static struct sctp_transport *sctp_addr_id2transport(struct sock *sk, struct sockaddr_storage *addr, sctp_assoc_t id) { @@ -245,7 +245,7 @@ * sockaddr_in6 [RFC 2553]), * addr_len - the size of the address structure. */ -int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) +static int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) { int retval = 0; --- linux-2.6.10-rc2-mm3-full/net/sctp/ssnmap.c.old 2004-11-25 02:20:54.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/ssnmap.c 2004-11-25 03:29:59.000000000 +0100 @@ -42,6 +42,9 @@ #define MAX_KMALLOC_SIZE 131072 +static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, + __u16 out); + /* Storage size needed for map includes 2 headers and then the * specific needs of in or out streams. */ @@ -87,8 +90,8 @@ /* Initialize a block of memory as a ssnmap. */ -struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, - __u16 out) +static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, + __u16 out) { memset(map, 0x00, sctp_ssnmap_size(in, out)); --- linux-2.6.10-rc2-mm3-full/net/sctp/transport.c.old 2004-11-25 02:22:16.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/transport.c 2004-11-25 02:23:01.000000000 +0100 @@ -54,34 +54,10 @@ /* 1st Level Abstractions. */ -/* Allocate and initialize a new transport. */ -struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, int gfp) -{ - struct sctp_transport *transport; - - transport = t_new(struct sctp_transport, gfp); - if (!transport) - goto fail; - - if (!sctp_transport_init(transport, addr, gfp)) - goto fail_init; - - transport->malloced = 1; - SCTP_DBG_OBJCNT_INC(transport); - - return transport; - -fail_init: - kfree(transport); - -fail: - return NULL; -} - /* Initialize a new transport from provided memory. */ -struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, - const union sctp_addr *addr, - int gfp) +static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, + const union sctp_addr *addr, + int gfp) { /* Copy in the address. */ peer->ipaddr = *addr; @@ -144,6 +120,30 @@ return peer; } +/* Allocate and initialize a new transport. */ +struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, int gfp) +{ + struct sctp_transport *transport; + + transport = t_new(struct sctp_transport, gfp); + if (!transport) + goto fail; + + if (!sctp_transport_init(transport, addr, gfp)) + goto fail_init; + + transport->malloced = 1; + SCTP_DBG_OBJCNT_INC(transport); + + return transport; + +fail_init: + kfree(transport); + +fail: + return NULL; +} + /* This transport is no longer needed. Free up if possible, or * delay until it last reference count. */ @@ -161,7 +161,7 @@ /* Destroy the transport data structure. * Assumes there are no more users of this structure. */ -void sctp_transport_destroy(struct sctp_transport *transport) +static void sctp_transport_destroy(struct sctp_transport *transport) { SCTP_ASSERT(transport->dead, "Transport is not dead", return); --- linux-2.6.10-rc2-mm3-full/include/net/sctp/tsnmap.h.old 2004-11-25 02:23:58.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/tsnmap.h 2004-11-25 02:24:21.000000000 +0100 @@ -120,12 +120,6 @@ __u32 start; }; -/* Create a new tsnmap. */ -struct sctp_tsnmap *sctp_tsnmap_new(__u16 len, __u32 init_tsn, int gfp); - -/* Dispose of a tsnmap. */ -void sctp_tsnmap_free(struct sctp_tsnmap *); - /* This macro assists in creation of external storage for variable length * internal buffers. We double allocate so the overflow map works. */ @@ -210,14 +204,4 @@ /* Is there a gap in the TSN map? */ int sctp_tsnmap_has_gap(const struct sctp_tsnmap *); -/* Initialize a gap ack block interator from user-provided memory. */ -void sctp_tsnmap_iter_init(const struct sctp_tsnmap *, - struct sctp_tsnmap_iter *); - -/* Get the next gap ack blocks. We return 0 if there are no more - * gap ack blocks. - */ -int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *, - struct sctp_tsnmap_iter *,__u16 *start, __u16 *end); - #endif /* __sctp_tsnmap_h__ */ --- linux-2.6.10-rc2-mm3-full/net/sctp/tsnmap.c.old 2004-11-25 02:24:29.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/tsnmap.c 2004-11-25 02:25:39.000000000 +0100 @@ -52,29 +52,6 @@ int *started, __u16 *start, int *ended, __u16 *end); -/* Create a new sctp_tsnmap. - * Allocate room to store at least 'len' contiguous TSNs. - */ -struct sctp_tsnmap *sctp_tsnmap_new(__u16 len, __u32 initial_tsn, int gfp) -{ - struct sctp_tsnmap *retval; - - retval = kmalloc(sizeof(struct sctp_tsnmap) + - sctp_tsnmap_storage_size(len), gfp); - if (!retval) - goto fail; - - if (!sctp_tsnmap_init(retval, len, initial_tsn)) - goto fail_map; - retval->malloced = 1; - return retval; - -fail_map: - kfree(retval); -fail: - return NULL; -} - /* Initialize a block of memory as a tsnmap. */ struct sctp_tsnmap *sctp_tsnmap_init(struct sctp_tsnmap *map, __u16 len, __u32 initial_tsn) @@ -168,16 +145,9 @@ } -/* Dispose of a tsnmap. */ -void sctp_tsnmap_free(struct sctp_tsnmap *map) -{ - if (map->malloced) - kfree(map); -} - /* Initialize a Gap Ack Block iterator from memory being provided. */ -void sctp_tsnmap_iter_init(const struct sctp_tsnmap *map, - struct sctp_tsnmap_iter *iter) +static void sctp_tsnmap_iter_init(const struct sctp_tsnmap *map, + struct sctp_tsnmap_iter *iter) { /* Only start looking one past the Cumulative TSN Ack Point. */ iter->start = map->cumulative_tsn_ack_point + 1; @@ -186,8 +156,9 @@ /* Get the next Gap Ack Blocks. Returns 0 if there was not another block * to get. */ -int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *map, - struct sctp_tsnmap_iter *iter, __u16 *start, __u16 *end) +static int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *map, + struct sctp_tsnmap_iter *iter, + __u16 *start, __u16 *end) { int started, ended; __u16 _start, _end, offset; --- linux-2.6.10-rc2-mm3-full/include/net/sctp/ulpevent.h.old 2004-11-25 02:26:08.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/ulpevent.h 2004-11-25 02:26:19.000000000 +0100 @@ -77,8 +77,6 @@ return (struct sctp_ulpevent *)skb->cb; } -struct sctp_ulpevent *sctp_ulpevent_new(int size, int flags, int gfp); -void sctp_ulpevent_init(struct sctp_ulpevent *, int flags); void sctp_ulpevent_free(struct sctp_ulpevent *); int sctp_ulpevent_is_notification(const struct sctp_ulpevent *); void sctp_queue_purge_ulpevents(struct sk_buff_head *list); --- linux-2.6.10-rc2-mm3-full/net/sctp/ulpevent.c.old 2004-11-25 02:26:26.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/ulpevent.c 2004-11-25 02:27:38.000000000 +0100 @@ -65,8 +65,17 @@ */ } +/* Initialize an ULP event from an given skb. */ +static void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) +{ + memset(event, 0, sizeof(struct sctp_ulpevent)); + event->msg_flags = msg_flags; +} + /* Create a new sctp_ulpevent. */ -struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, int gfp) +static struct sctp_ulpevent *sctp_ulpevent_new(int size, + int msg_flags, + int gfp) { struct sctp_ulpevent *event; struct sk_buff *skb; @@ -84,13 +93,6 @@ return NULL; } -/* Initialize an ULP event from an given skb. */ -void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) -{ - memset(event, 0, sizeof(struct sctp_ulpevent)); - event->msg_flags = msg_flags; -} - /* Is this a MSG_NOTIFICATION? */ int sctp_ulpevent_is_notification(const struct sctp_ulpevent *event) { --- linux-2.6.10-rc2-mm3-full/include/net/sctp/ulpqueue.h.old 2004-11-25 02:28:27.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/include/net/sctp/ulpqueue.h 2004-11-25 02:28:36.000000000 +0100 @@ -57,7 +57,6 @@ }; /* Prototypes. */ -struct sctp_ulpq *sctp_ulpq_new(struct sctp_association *asoc, int gfp); struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *, struct sctp_association *); void sctp_ulpq_free(struct sctp_ulpq *); --- linux-2.6.10-rc2-mm3-full/net/sctp/ulpqueue.c.old 2004-11-25 02:28:44.000000000 +0100 +++ linux-2.6.10-rc2-mm3-full/net/sctp/ulpqueue.c 2004-11-25 02:28:58.000000000 +0100 @@ -56,25 +56,6 @@ /* 1st Level Abstractions */ -/* Create a new ULP queue. */ -struct sctp_ulpq *sctp_ulpq_new(struct sctp_association *asoc, int gfp) -{ - struct sctp_ulpq *ulpq; - - ulpq = kmalloc(sizeof(struct sctp_ulpq), gfp); - if (!ulpq) - goto fail; - if (!sctp_ulpq_init(ulpq, asoc)) - goto fail_init; - ulpq->malloced = 1; - return ulpq; - -fail_init: - kfree(ulpq); -fail: - return NULL; -} - /* Initialize a ULP queue from a block of memory. */ struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq, struct sctp_association *asoc) @@ -92,7 +73,7 @@ /* Flush the reassembly and ordering queues. */ -void sctp_ulpq_flush(struct sctp_ulpq *ulpq) +static void sctp_ulpq_flush(struct sctp_ulpq *ulpq) { struct sk_buff *skb; struct sctp_ulpevent *event; From kdorn@lilah.hetzel.org Thu Nov 25 10:38:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 10:38:29 -0800 (PST) Received: from lilah.hetzel.org (lilah.hetzel.org [199.250.128.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPIcLKW000694 for ; Thu, 25 Nov 2004 10:38:21 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iAPK0Nf4012950; Thu, 25 Nov 2004 15:00:23 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iAPK0Mor012949; Thu, 25 Nov 2004 15:00:22 -0500 Date: Thu, 25 Nov 2004 15:00:22 -0500 From: Dorn Hetzel To: Francois Romieu Cc: Dorn Hetzel , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041125200022.GA12674@lilah.hetzel.org> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> <20041123144901.GA19005@lilah.hetzel.org> <20041123194740.GA32210@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041123194740.GA32210@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4i X-archive-position: 12223 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev On Tue, Nov 23, 2004 at 08:47:40PM +0100, Francois Romieu wrote: > Dorn Hetzel : > [...] > > Stacked on these 4 patches and things seem much better :) > > Did you change the compiler as well ? > > If yes, it would be nice to know if the system performs correctly when built with > the previous compiler (feel free to answer #1 only if you are busy :o) ). > Yes, I moved to gcc 3.4.3. I'm out of town for the Thanksgiving holiday, but I will revert the compiler and test again as soon as I get home (early next week). Do you know when the 250-265 patches will be merged and into which train? Best Regards, -Dorn > -- > Ueimor > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ From iouri@pixartargentina.com.ar Thu Nov 25 12:09:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 12:09:13 -0800 (PST) Received: from mail.pixartargentina.com.ar (customer123-150-221.iplannetworks.net [200.123.150.221] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPK90Go022172 for ; Thu, 25 Nov 2004 12:09:00 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.pixartargentina.com.ar (Postfix) with ESMTP id C14661FA0C; Thu, 25 Nov 2004 17:01:04 -0300 (ART) Received: from mail.pixartargentina.com.ar ([127.0.0.1]) by localhost (NATIVOMAIL [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 08110-02; Thu, 25 Nov 2004 17:01:04 -0300 (ART) Received: from [192.168.0.118] (unknown [192.168.0.118]) by mail.pixartargentina.com.ar (Postfix) with ESMTP id 7EE061FA09; Thu, 25 Nov 2004 17:01:03 -0300 (ART) Message-ID: <41A63E19.8080902@pixartargentina.com.ar> Date: Thu, 25 Nov 2004 17:18:33 -0300 From: Iouri Atiounkine - Pixart User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.7) Gecko/20040707 Debian/1.7-5 X-Accept-Language: en MIME-Version: 1.0 To: webvenza@libero.it, netdev@oss.sgi.com Subject: 2.6.9 - SiS900 - No MII transceivers found! Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new-20030616-p5 (Debian) at mail.xandros.com.ar X-archive-position: 12224 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: iouri@pixartargentina.com.ar Precedence: bulk X-list: netdev Hi I have two motherboards PC Chips 909G version 1.0. In this motherboards network interface is SiS900 onboard. The network interface does not work always. Sometimes in both motherboard the network interface is working. It work good then computer was turned off for one day or more and until the power is turned off. After shutdown (or reboot) it not working at all. The problem is at loading module: eth0: No MII transceivers found! In the case if module loaded good it print a message: found internal sis900 transceiver. The kernel is downloaded from this address: http://http.us.debian.org/debian/pool/main/k/kernel-image-2.6.9-i386/kernel-image-2.6.9-1-686_2.6.9-2_i386.deb This motherboard has onboard separated SiS900 chip and LAN Transformer - TD1603C. Thank you. *********************************** Here is message of dmesg, lsmod, lspci -n -vv and mii-tool: *********************************** R_xart:~# lsmod Module Size Used by sis900 20484 0 mii 4928 0 mousedev 11576 1 tsdev 7648 0 psmouse 21960 0 uhci_hcd 32944 0 ohci_hcd 21412 0 ehci_hcd 32068 0 usbcore 119396 5 uhci_hcd,ohci_hcd,ehci_hcd parport_pc 37188 1 lp 11080 0 parport 41704 2 parport_pc,lp i8xx_tco 6996 0 hw_random 5364 0 pciehp 98916 0 shpchp 101924 0 pci_hotplug 34448 2 pciehp,shpchp intel_agp 22592 1 agpgart 34600 2 intel_agp evdev 9504 0 crc32 4192 1 sis900 snd_intel8x0 35276 1 snd_ac97_codec 73200 1 snd_intel8x0 snd_pcm_oss 54024 0 snd_mixer_oss 20192 1 snd_pcm_oss snd_pcm 98696 2 snd_intel8x0,snd_pcm_oss snd_timer 25668 1 snd_pcm snd_page_alloc 9992 2 snd_intel8x0,snd_pcm gameport 4512 1 snd_intel8x0 snd_mpu401_uart 7872 1 snd_intel8x0 snd_rawmidi 24900 1 snd_mpu401_uart snd_seq_device 7976 1 snd_rawmidi snd 56804 11 snd_intel8x0,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer,snd_mpu401_uart,snd_rawmidi,snd_seq_device soundcore 10176 1 snd nls_iso8859_1 3904 1 nls_cp437 5568 1 capability 4392 0 commoncap 7008 1 capability ide_cd 42592 1 cdrom 40956 1 ide_cd rtc 12664 0 vfat 14528 1 fat 46624 1 vfat xfs 616216 0 reiserfs 248976 1 romfs 9220 0 isofs 37208 0 ext2 70632 1 ext3 126184 0 jbd 64056 1 ext3 mbcache 9220 2 ext2,ext3 ide_generic 1280 0 ide_disk 20480 5 piix 13216 1 ide_core 143088 4 ide_cd,ide_generic,ide_disk,piix sd_mod 17904 0 ata_piix 9028 0 libata 45540 1 ata_piix scsi_mod 125676 2 sd_mod,libata unix 28564 172 fbcon 40416 0 font 8128 1 fbcon vesafb 6656 0 cfbcopyarea 3936 1 vesafb cfbimgblt 2880 1 vesafb cfbfillrect 3584 1 vesafb R_xart:~# dmesg 0000000000100000 - 000000000f7f0000 (usable) BIOS-e820: 000000000f7f0000 - 000000000f7f8000 (ACPI data) BIOS-e820: 000000000f7f8000 - 000000000f800000 (ACPI NVS) BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved) BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved) BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved) 0MB HIGHMEM available. 247MB LOWMEM available. found SMP MP-table at 000fb960 On node 0 totalpages: 63472 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 59376 pages, LIFO batch:14 HighMem zone: 0 pages, LIFO batch:1 DMI 2.3 present. ACPI: RSDP (v000 AMI ) @ 0x000fa000 ACPI: RSDT (v001 AMIINT INTEL845 0x00000010 MSFT 0x00000097) @ 0x0f7f0000 ACPI: FADT (v001 AMIINT INTEL845 0x00000011 MSFT 0x00000097) @ 0x0f7f0030 ACPI: MADT (v001 AMIINT INTEL845 0x00000009 MSFT 0x00000097) @ 0x0f7f00c0 ACPI: DSDT (v001 INTEL BROKDLEG 0x00001000 MSFT 0x0100000d) @ 0x00000000 ACPI: PM-Timer IO Port: 0x808 ACPI: Local APIC address 0xfee00000 ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled) Processor #0 15:2 APIC version 20 ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] disabled) ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0]) IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23 ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) ACPI: IRQ0 used by override. ACPI: IRQ2 used by override. ACPI: IRQ9 used by override. Enabling APIC mode: Flat. Using 1 I/O APICs Using ACPI (MADT) for SMP configuration information Built 1 zonelists Kernel command line: root=/dev/hda5 ro Initializing CPU#0 PID hash table entries: 1024 (order: 10, 16384 bytes) Detected 1799.442 MHz processor. Using pmtmr for high-res timesource Console: colour VGA+ 80x25 Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) Memory: 243616k/253888k available (1654k kernel code, 9600k reserved, 723k data, 152k init, 0k highmem) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay loop... 3563.52 BogoMIPS (lpj=1781760) Security Scaffold v1.0.0 initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 (order: 0, 4096 bytes) CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 CPU: Trace cache: 12K uops, L1 D cache: 8K CPU: L2 cache: 128K CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. CPU0: Intel P4/Xeon Extended MCE MSRs (12) available CPU0: Thermal monitoring enabled CPU: Intel(R) Celeron(R) CPU 1.80GHz stepping 09 Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Checking 'hlt' instruction... OK. ENABLING IO-APIC IRQs ..TIMER: vector=0x31 pin1=2 pin2=-1 checking if image is initramfs...it isn't (ungzip failed); looks like an initrd Freeing initrd memory: 4632k freed NET: Registered protocol family 16 PCI: PCI BIOS revision 2.10 entry at 0xfdb81, last bus=3 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20040816 ACPI: Interpreter enabled ACPI: Using IOAPIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1 PCI: Transparent bridge - 0000:00:1e.0 ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.ICHB._PRT] ACPI: Power Resource [URP1] (off) ACPI: Power Resource [URP2] (off) ACPI: Power Resource [FDDP] (off) ACPI: Power Resource [LPTP] (off) ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 10 *11 12 14 15) ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 *5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKD] (IRQs *3 4 5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 *10 11 12 14 15) Linux Plug and Play Support v0.97 (c) Adam Belay PnPBIOS: Scanning system for PnP BIOS support... PnPBIOS: Found PnP BIOS installation structure at 0xc00f7330 PnPBIOS: PnP BIOS version 1.0, entry 0xf0000:0x600b, dseg 0xf0000 PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: 13 nodes reported by PnP BIOS; 13 recorded by driver PCI: Using ACPI for IRQ routing ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 16 (level, low) -> IRQ 169 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 VFS: Disk quotas dquot_6.5.1 Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au) devfs: boot_options: 0x0 Initializing Cryptographic API isapnp: Scanning for PnP cards... isapnp: No Plug & Play device found serio: i8042 AUX port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabled ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 ttyS15 at I/O 0xcc08 (irq = 193) is a 16450 ttyS44 at I/O 0xcc10 (irq = 193) is a 8250 ttyS45 at I/O 0xcc18 (irq = 193) is a 16450 ttyS46 at I/O 0xcc20 (irq = 193) is a 8250 ttyS47 at I/O 0xcc28 (irq = 193) is a 8250 RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize input: AT Translated Set 2 keyboard on isa0060/serio0 NET: Registered protocol family 2 IP: routing cache hash table of 2048 buckets, 16Kbytes TCP: Hash tables configured (established 16384 bind 32768) NET: Registered protocol family 8 NET: Registered protocol family 20 ACPI: (supports S0 S1 S4 S5) ACPI wakeup devices: USB1 USB2 USB3 EHCI ICHB PS2M PS2K UAR1 MC9 RAMDISK: cramfs filesystem found at block 0 RAMDISK: Loading 4632KiB [1 disk] into ram disk... done. VFS: Mounted root (cramfs filesystem) readonly. Freeing unused kernel memory: 152k freed vesafb: probe of vesafb0 failed with error -6 NET: Registered protocol family 1 SCSI subsystem initialized libata version 1.02 loaded. Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx ICH4: IDE controller at PCI slot 0000:00:1f.1 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ICH4: chipset revision 2 ICH4: not 100% native mode: will probe irqs later ide0: BM-DMA at 0xfc00-0xfc07, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0xfc08-0xfc0f, BIOS settings: hdc:DMA, hdd:pio Probing IDE interface ide0... hda: HDS728040PLAT20, ATA DISK drive Using anticipatory io scheduler ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 hda: max request size: 1024KiB hda: 80418240 sectors (41174 MB) w/1719KiB Cache, CHS=16383/255/63, UDMA(33) hda: cache flushes supported /dev/ide/host0/bus0/target0/lun0: p1 p2 p3 < p5 p6 > p4 Probing IDE interface ide1... hdc: SAMSUNG CD-R/RW SW-252S, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 Probing IDE interface ide2... ide2: Wait for ready failed before probe ! Probing IDE interface ide3... ide3: Wait for ready failed before probe ! Probing IDE interface ide4... ide4: Wait for ready failed before probe ! Probing IDE interface ide5... ide5: Wait for ready failed before probe ! SGI XFS with ACLs, security attributes, realtime, large block numbers, no debug enabled SGI XFS Quota Management subsystem VFS: Can't find ext3 filesystem on dev hda5. VFS: Can't find ext2 filesystem on dev hda5. Unable to identify CD-ROM format. VFS: Can't find a romfs filesystem on dev hda5. ReiserFS: hda5: found reiserfs format "3.6" with standard journal ReiserFS: hda5: using ordered data mode ReiserFS: hda5: journal params: device hda5, size 8192, journal first block 18, max trans len 1024, max batch 900, max commit age 30, max trans age 30 ReiserFS: hda5: checking transaction log (hda5) ReiserFS: hda5: Using r5 hash to sort names Adding 498004k swap on /dev/hda2. Priority:-1 extents:1 Real Time Clock Driver v1.12 hdc: ATAPI 52X CD-ROM CD-R/RW drive, 2048kB Cache, UDMA(33) Uniform CD-ROM driver Revision: 3.20 Capability LSM initialized cdrom: open failed. cdrom: open failed. cdrom: open failed. cdrom: open failed. FAT: bogus number of reserved sectors VFS: Can't find a valid FAT filesystem on dev hda6. ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 PCI: Setting latency timer of device 0000:00:1f.5 to 64 intel8x0_measure_ac97_clock: measured 49535 usecs intel8x0: clocking to 48000 usbcore: registered new driver usbfs usbcore: registered new driver hub ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 EHCI Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 193, pci mem d017ec00 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 6 ports detected sis900.c: v1.08.07 11/02/2003 ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 eth0: No MII transceivers found! atmsvc: no signaling demon Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected an Intel 845G Chipset. agpgart: Maximum main memory to use for agp memory: 196M agpgart: Detected 8060K stolen memory. agpgart: AGP aperture is 128M @ 0xd0000000 USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 PCI: Setting latency timer of device 0000:00:1d.2 to 64 uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected cpci_hotplug: CompactPCI Hot Plug Core version: 0.2 pci_hotplug: PCI Hot Plug PCI Core version: 0.5 shpchp: shpc_init : shpc_cap_offset == 0 shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 pciehp: PCI Express Hot Plug Controller Driver version: 0.4 hw_random hardware driver 1.0.0 loaded i8xx TCO timer: initialized (0x0860). heartbeat=30 sec (nowayout=0) parport: PnPBIOS parport detected. parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] lp0: using parport0 (interrupt-driven). ehci_hcd 0000:00:1d.7: remove, state 1 usb usb1: USB disconnect, address 1 ehci_hcd 0000:00:1d.7: USB bus 1 deregistered uhci_hcd 0000:00:1d.0: remove, state 1 usb usb2: USB disconnect, address 1 uhci_hcd 0000:00:1d.0: USB bus 2 deregistered uhci_hcd 0000:00:1d.1: remove, state 1 usb usb3: USB disconnect, address 1 uhci_hcd 0000:00:1d.1: USB bus 3 deregistered uhci_hcd 0000:00:1d.2: remove, state 1 usb usb4: USB disconnect, address 1 uhci_hcd 0000:00:1d.2: USB bus 4 deregistered usbcore: deregistering driver usbfs usbcore: deregistering driver hub usbcore: registered new driver usbfs usbcore: registered new driver hub ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 EHCI Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 193, pci mem d026ac00 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 6 ports detected ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI) USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 PCI: Setting latency timer of device 0000:00:1d.2 to 64 uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected input: ImPS/2 Generic Wheel Mouse on isa0060/serio1 ts: Compaq touchscreen protocol output mice: PS/2 mouse device common for all mice sis900.c: v1.08.07 11/02/2003 ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 eth0: No MII transceivers found! R_xart:~# ifconfig eth0 up eth0: ERROR while getting interface flags: No existe tal dispositivo R_xart:~# mii-tool -vv Using SIOCGMIIPHY=0x8947 no MII interfaces found R_xart:~# lspci 0000:00:00.0 Host bridge: Intel Corp. 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface (rev 03) 0000:00:02.0 VGA compatible controller: Intel Corp. 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 03) 0000:00:1d.0 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #1 (rev 02) 0000:00:1d.1 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #2 (rev 02) 0000:00:1d.2 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #3 (rev 02) 0000:00:1d.7 USB Controller: Intel Corp. 82801DB (ICH4) USB2 EHCI Controller (rev 02) 0000:00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB/ER Hub interface to PCI Bridge (rev 82) 0000:00:1f.0 ISA bridge: Intel Corp. 82801DB (ICH4) LPC Bridge (rev 02) 0000:00:1f.1 IDE interface: Intel Corp. 82801DB (ICH4) Ultra ATA 100 Storage Controller (rev 02) 0000:00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4) AC'97 Audio Controller (rev 02) 0000:03:03.0 Modem: PCTel Inc: Unknown device 2189 (rev 04) 0000:03:07.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 02) R_xart:~# lspci -n -vv 0000:00:00.0 Class 0600: 8086:2560 (rev 03) Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Reset- FastB2B- 0000:00:1f.0 Class 0601: 8086:24c0 (rev 02) Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- Region 1: I/O ports at Region 2: I/O ports at Region 3: I/O ports at Region 4: I/O ports at fc00 [size=16] Region 5: Memory at 10000000 (32-bit, non-prefetchable) [size=1K] 0000:00:1f.5 Class 0401: 8086:24c5 (rev 02) Subsystem: 1019:a00a Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- ; Thu, 25 Nov 2004 12:40:29 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iAPM2YSm024005; Thu, 25 Nov 2004 17:02:34 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iAPM2XPt024004; Thu, 25 Nov 2004 17:02:33 -0500 Date: Thu, 25 Nov 2004 17:02:33 -0500 From: Dorn Hetzel To: Francois Romieu Cc: Dorn Hetzel , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041125220233.GA23850@lilah.hetzel.org> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> <20041123144901.GA19005@lilah.hetzel.org> <20041123194740.GA32210@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041123194740.GA32210@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4i X-archive-position: 12225 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev On Tue, Nov 23, 2004 at 08:47:40PM +0100, Francois Romieu wrote: > Dorn Hetzel : > > Stacked on these 4 patches and things seem much better :) > > Did you change the compiler as well ? > > If yes, it would be nice to know if the system performs correctly when built with > the previous compiler (feel free to answer #1 only if you are busy :o) ). > I went ahead and remotely rebuilt using gcc 2.95.4 and upon reboot it worked long enough to ssh in and then it failed. So it sounds like the version of gcc DOES make a difference :) I will report further details when I get home and can access the box again ;) -Dorn > -- > Ueimor > - From okir@suse.de Thu Nov 25 12:55:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 12:55:37 -0800 (PST) Received: from Cantor.suse.de (mail-ex.suse.de [195.135.220.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPKtTV0021152 for ; Thu, 25 Nov 2004 12:55:29 -0800 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 859F81159D63 for ; Thu, 25 Nov 2004 21:55:03 +0100 (CET) Date: Thu, 25 Nov 2004 21:55:03 +0100 From: Olaf Kirch To: netdev@oss.sgi.com Subject: [PATCH] Deadlock in af_packet/packet_rcv Message-ID: <20041125205503.GA18083@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 12226 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev Before introduction of lock-less loopback, all of netdev_xmit_nit was running with bottom halves disabled, and some code seems to rely on this. One of them is af_packet's packet_rcv handler, which is called from the receive path via netdev_xmit_nit. It takes a spin lock, and if an interrupt occurs and calls netdev_xmit during this time, the CPU deadlocks. The patch below disables BHs while in the TX path for loopback and similar devices. An alternative, less conservative fix would be to just use spin_lock_bh in af_packet.c. Signed-off-by: Olaf Kirch Index: linux-2.6.9/net/core/dev.c =================================================================== --- linux-2.6.9.orig/net/core/dev.c +++ linux-2.6.9/net/core/dev.c @@ -1222,6 +1222,7 @@ int __skb_linearize(struct sk_buff *skb, } #define HARD_TX_LOCK(dev, cpu) { \ + local_disable_bh(); \ if ((dev->features & NETIF_F_LLTX) == 0) { \ spin_lock(&dev->xmit_lock); \ dev->xmit_lock_owner = cpu; \ @@ -1233,6 +1234,7 @@ int __skb_linearize(struct sk_buff *skb, dev->xmit_lock_owner = -1; \ spin_unlock(&dev->xmit_lock); \ } \ + local_enable_bh(); \ } static inline void qdisc_run(struct net_device *dev) -- Olaf Kirch | Things that make Monday morning interesting, #2: okir@suse.de | "We have 8,000 NFS mount points, why do we keep ---------------+ running out of privileged ports?" From romieu@fr.zoreil.com Thu Nov 25 12:58:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 12:58:20 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPKwCBE023103 for ; Thu, 25 Nov 2004 12:58:13 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAPKsBvr004290; Thu, 25 Nov 2004 21:54:11 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAPKsBMO004289; Thu, 25 Nov 2004 21:54:11 +0100 Date: Thu, 25 Nov 2004 21:54:11 +0100 From: Francois Romieu To: Dorn Hetzel Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041125205411.GA3204@electric-eye.fr.zoreil.com> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> <20041123144901.GA19005@lilah.hetzel.org> <20041123194740.GA32210@electric-eye.fr.zoreil.com> <20041125220233.GA23850@lilah.hetzel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041125220233.GA23850@lilah.hetzel.org> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12227 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Dorn Hetzel : [...] > I went ahead and remotely rebuilt using gcc 2.95.4 and upon reboot it > worked long enough to ssh in and then it failed. So it sounds like the > version of gcc DOES make a difference :) Ok, I'll have to audit the driver for the typical inline assembler + arithmetic ops which 2.95.x dislikes. -- Ueimor From hasso@estpak.ee Thu Nov 25 13:14:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 13:14:12 -0800 (PST) Received: from arena (dream.estpak.ee [194.126.115.147]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPLE6kh000373 for ; Thu, 25 Nov 2004 13:14:06 -0800 Received: from arena ([127.0.0.1] ident=hasso) by arena with esmtp (Exim 3.36 #1 (Debian)) id 1CXQvn-0000am-00; Thu, 25 Nov 2004 23:13:35 +0200 From: Hasso Tepper To: "David S. Miller" Subject: Re: IPv6 and netlink Date: Thu, 25 Nov 2004 23:13:30 +0200 User-Agent: KMail/1.7.1 Cc: netdev@oss.sgi.com References: <200411232322.50083.hasso@estpak.ee> <20041123134257.5c45f5fc.davem@davemloft.net> In-Reply-To: <20041123134257.5c45f5fc.davem@davemloft.net> Organization: Elion Enterprises Ltd. MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200411252313.30348.hasso@estpak.ee> Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-archive-position: 12228 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hasso@estpak.ee Precedence: bulk X-list: netdev David S. Miller wrote: > On Tue, 23 Nov 2004 23:22:50 +0200 My first letter didn't end in list, seems. Sorry if most of this info will be duplicate. > Hasso Tepper wrote: > > While debugging IPv6 RIB in Quagga routing software I discovered some > > issues with kernel rtnetlink messages. > > > > 1) RTM_NEWROUTE message with prefix ff00::/8 (if interface goes up or > > down) is sent with rtm_type set to RTN_UNICAST. It's multicast route, > > so why not RTN_MULTICAST? Is it bug? > > What kernel version? I remember fixing this bug. > We should not be emitting rtnetlink messages for > these any more. Although my main production platform is 2.4.28, I tested with 2.6.9 (with patch added from http://oss.sgi.com/archives/netdev/2004-11/msg00558.html) as well. Is this too old already? I tested now with 2.6.10-rc2-bk8 as well and all these bugs are still there. RTM_NEWROUTE messages are sent for both, ff00::/8 and fe80::/64 with rtm_type set to RTN_UNICAST and rtm_protocol set to RTPROT_BOOT. > > 2) If address is added to the interface, route is created by kernel to > > route prefix to the intarface. In IPv4 these routes have rtm_protocol > > set to RTPROT_KERNEL if announced it via rtnetlink, but that's not the > > case with IPv6. It doesn't matter if address is added by the user or > > it's the link local address (fe80::/64 route). Is it intentional or > > bug? > > > > 3) Not really rtnetlink related, but if this address is removed from > > interface, route created by kernel (when address was added) isn't > > removed from table. Is it intentional? > > I remember fixing these problems too at some point. > > In net/ipv6/route.c:rt6_fill_node(), if the RTF_ADDRCONF flag is > set on the route (which is will be set for link-local address > addition routes done by the addrconf layer) then we will set > RTPROT_KERNEL on it. But I don't see how fe80::/64 could have RTF_ADDRCONF flag. I can see setting it only in net/ipv6/addrconf.c:addrconf_prefix_rcv(). > For every address deleted on an ipv6 interface we invoke > net/ipv6/addrconf.c:ipv6_ifa_notify() with event set to > RTM_DELADDR. That causes ip6_del_rt() to be invoked for > that link-local address's route. OK. Makes sense, but global addresses configured manually? Ie. I mean: hasso:/home/hasso# ip -6 route | grep 3ffe hasso:/home/hasso# ip -6 addr add 3ffe::1/64 dev eth0 hasso:/home/hasso# ip -6 route | grep 3ffe 3ffe::/64 dev eth0 metric 256 mtu 1500 advmss 1440 metric10 64 hasso:/home/hasso# ip -6 addr del 3ffe::1/64 dev eth0 hasso:/home/hasso# ip -6 route | grep 3ffe 3ffe::/64 dev eth0 metric 256 mtu 1500 advmss 1440 metric10 64 hasso:/home/hasso# > In the end, I think you're just using an ancient kernel > which didn't have these bug fixes added. All these issues are there in 2.6.10-rc2-bk8. Is it ancient? Well ... ;) -- Hasso Tepper Elion Enterprises Ltd. WAN administrator From mail2004_001@yahoo.co.jp Thu Nov 25 14:53:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 14:53:22 -0800 (PST) Received: from localhost ([218.145.145.252]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAPMr8B4027008 for ; Thu, 25 Nov 2004 14:53:09 -0800 Received: (qmail 13555 invoked from network); 24 Nov 2004 01:03:44 +0900 Received: from unknown (HELO scottie) (127.0.0.1) by -v with SMTP; 24 Nov 2004 01:03:44 +0900 Message-ID: <25807908.1101225824540.JavaMail.root@scottie> Date: Wed, 24 Nov 2004 01:03:44 +0900 (JST) From: "mail2004_001@yahoo.co.jp" To: netdev@oss.sgi.com Subject: =?iso-2022-jp?Q?=1B$B!y%-%c%s%Z!<%s4|4VCf!*!y=1B(B?= Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-archive-position: 12229 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mail2004_001@yahoo.co.jp Precedence: bulk X-list: netdev 投稿画像は100%素人女性! このチャンスを逃すと絶対後悔! ★登録無料★ 今すぐアクセス ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ http://catchmix.com/real/?code=bmV0ZGV2QG9zcy5zZ2kuY29t 11/24: エリコ(家事手伝い)画像3枚追加!! 11/21: いずみ(SHOP店員)画像3枚追加!! 11/5: まい(専門学生)画像3枚追加!! 11/3:ちえ(専業主婦)画像3枚追加!! From kdorn@lilah.hetzel.org Thu Nov 25 15:14:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 15:14:19 -0800 (PST) Received: from lilah.hetzel.org (lilah.hetzel.org [199.250.128.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAPNEC2j007244 for ; Thu, 25 Nov 2004 15:14:13 -0800 Received: from lilah.hetzel.org (localhost.localdomain [127.0.0.1]) by lilah.hetzel.org (8.12.11/8.12.8) with ESMTP id iAQ0aE0u005555; Thu, 25 Nov 2004 19:36:14 -0500 Received: (from kdorn@localhost) by lilah.hetzel.org (8.12.11/8.12.8/Submit) id iAQ0aEd4005554; Thu, 25 Nov 2004 19:36:14 -0500 Date: Thu, 25 Nov 2004 19:36:14 -0500 From: Dorn Hetzel To: Francois Romieu Cc: Dorn Hetzel , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: r8169.c Message-ID: <20041126003614.GA5441@lilah.hetzel.org> References: <20041119162920.GA26836@lilah.hetzel.org> <20041119201203.GA13522@electric-eye.fr.zoreil.com> <20041120003754.GA32133@lilah.hetzel.org> <20041120002946.GA18059@electric-eye.fr.zoreil.com> <20041122181307.GA3625@lilah.hetzel.org> <20041123144901.GA19005@lilah.hetzel.org> <20041123194740.GA32210@electric-eye.fr.zoreil.com> <20041125220233.GA23850@lilah.hetzel.org> <20041125205411.GA3204@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041125205411.GA3204@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4i X-archive-position: 12230 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@dorn.hetzel.org Precedence: bulk X-list: netdev It did *build* well enough not to blow up the kernel build with 2.95.4, it just failed in use... On Thu, Nov 25, 2004 at 09:54:11PM +0100, Francois Romieu wrote: > Dorn Hetzel : > [...] > > I went ahead and remotely rebuilt using gcc 2.95.4 and upon reboot it > > worked long enough to ssh in and then it failed. So it sounds like the > > version of gcc DOES make a difference :) > > Ok, I'll have to audit the driver for the typical inline assembler + > arithmetic ops which 2.95.x dislikes. > > -- > Ueimor From yoshfuji@linux-ipv6.org Thu Nov 25 17:13:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 17:13:44 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQ1Dccg017415 for ; Thu, 25 Nov 2004 17:13:39 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 03A4733CE5; Fri, 26 Nov 2004 10:14:39 +0900 (JST) Date: Fri, 26 Nov 2004 10:14:36 +0900 (JST) Message-Id: <20041126.101436.57039674.yoshfuji@linux-ipv6.org> To: hasso@estpak.ee Cc: davem@davemloft.net, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: IPv6 and netlink From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <200411252313.30348.hasso@estpak.ee> References: <200411232322.50083.hasso@estpak.ee> <20041123134257.5c45f5fc.davem@davemloft.net> <200411252313.30348.hasso@estpak.ee> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12231 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <200411252313.30348.hasso@estpak.ee> (at Thu, 25 Nov 2004 23:13:30 +0200), Hasso Tepper says: > David S. Miller wrote: > > On Tue, 23 Nov 2004 23:22:50 +0200 > > My first letter didn't end in list, seems. Sorry if most of this info will > be duplicate. > > > Hasso Tepper wrote: > > > While debugging IPv6 RIB in Quagga routing software I discovered some > > > issues with kernel rtnetlink messages. > > > > > > 1) RTM_NEWROUTE message with prefix ff00::/8 (if interface goes up or > > > down) is sent with rtm_type set to RTN_UNICAST. It's multicast route, > > > so why not RTN_MULTICAST? Is it bug? > > > > What kernel version? I remember fixing this bug. > > We should not be emitting rtnetlink messages for > > these any more. > > Although my main production platform is 2.4.28, I tested with 2.6.9 (with > patch added from http://oss.sgi.com/archives/netdev/2004-11/msg00558.html) > as well. Is this too old already? > > I tested now with 2.6.10-rc2-bk8 as well and all these bugs are still there. > RTM_NEWROUTE messages are sent for both, ff00::/8 and fe80::/64 with > rtm_type set to RTN_UNICAST and rtm_protocol set to RTPROT_BOOT. Okay, I eat this report. Another fact: In IPv4, RTPROT_BOOT is set if it is configured if route is configued via ip_rt_ioctl(). If is called from ipconfig or inet_ioctl(). RTPROT_BOOT should be set only when it is set via ipconfig, I think. Back to IPv6. Do we really need RTPROT_BOOT in IPv6? I don't think so. Because we don't know if the interface was brought up by kernel during boot (by ipconfig), so it is not trivial. > hasso:/home/hasso# ip -6 route | grep 3ffe > hasso:/home/hasso# ip -6 addr add 3ffe::1/64 dev eth0 > hasso:/home/hasso# ip -6 route | grep 3ffe > 3ffe::/64 dev eth0 metric 256 mtu 1500 advmss 1440 metric10 64 > hasso:/home/hasso# ip -6 addr del 3ffe::1/64 dev eth0 > hasso:/home/hasso# ip -6 route | grep 3ffe > 3ffe::/64 dev eth0 metric 256 mtu 1500 advmss 1440 metric10 64 > hasso:/home/hasso# I think this is a bug. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From benh@kernel.crashing.org Thu Nov 25 19:26:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 25 Nov 2004 19:26:41 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQ3QVtm000317 for ; Thu, 25 Nov 2004 19:26:32 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAQ3MkgJ029119 for ; Thu, 25 Nov 2004 21:22:47 -0600 Subject: [PATCH] sungem rework & wake on lan From: Benjamin Herrenschmidt To: netdev@oss.sgi.com Content-Type: text/plain Date: Fri, 26 Nov 2004 14:25:55 +1100 Message-Id: <1101439555.4633.76.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 12232 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev (copy of a mail sent to DaveM & Jeff separately, I just subscribed to this list). This patch is a rework of sungem toward simplification of the open/close and power management mecanisms, along with getting rid of some races that were lurking around at the same time). It also adds support for Wake-On-Lan (Magic packets only for now, David, if you have infos about what the WOL CSR bits actually mean, it seem it may be possible to support unicast/multicast/broadcats WOL as well). I also wrote a blurb at the beginning of the driver explaining some concerns I have with locking. The driver is currently "over-locking" imho and that could probably be improved (well, I improved the close() path already but the open() and reset path could use some work too) though I have some concerns about the feasibility of nicer locking with NAPI (see my comments). Please, comment on it, but don't merge it right now, at least certainly not in 2.6.10-rc (obviously) as it definitely need to be re-tested on a lot of the supported hardware, I only did quick tests on a pmac laptop so far. The patch contain a small blurb in arch/ppc which is necessary to prevent the arch PM code from switching off the clock to the GEM cell (thus breaking wake-on-lan). The PM changes remove the whole timer thing. The PHY is now always up (the PHYs used by Apple all have some sort of automatic low power when no link anyway) so packages like laptop-net will work. The chip cell clock is switched off when the interface is down (and back up temporarily when the link timer kicks in or when needed for other reasons, this can be done very quickly) Patch is against 2.6.9 for now. Signed-off-by: Benjamin Herrenschmidt Index: linux-2.6.9-sleep/drivers/net/sungem_phy.c =================================================================== --- linux-2.6.9-sleep.orig/drivers/net/sungem_phy.c 2004-10-19 13:37:28.000000000 +1000 +++ linux-2.6.9-sleep/drivers/net/sungem_phy.c 2004-11-26 13:56:30.159911152 +1100 @@ -98,25 +98,15 @@ data &= ~MII_BCM5201_MULTIPHY_SUPERISOLATE; phy_write(phy, MII_BCM5201_MULTIPHY, data); + phy_write(phy, MII_BCM5201_INTERRUPT, 0); + return 0; } -static int bcm5201_suspend(struct mii_phy* phy, int wol_options) +static int bcm5201_suspend(struct mii_phy* phy) { - if (!wol_options) - phy_write(phy, MII_BCM5201_INTERRUPT, 0); - - /* Here's a strange hack used by both MacOS 9 and X */ - phy_write(phy, MII_LPA, phy_read(phy, MII_LPA)); - - if (!wol_options) { -#if 0 /* Commented out in Darwin... someone has those dawn docs ? */ - u16 val = phy_read(phy, MII_BCM5201_AUXMODE2) - phy_write(phy, MII_BCM5201_AUXMODE2, - val & ~MII_BCM5201_AUXMODE2_LOWPOWER); -#endif - phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE); - } + phy_write(phy, MII_BCM5201_INTERRUPT, 0); + phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE); return 0; } @@ -144,6 +134,21 @@ return 0; } +static int bcm5221_suspend(struct mii_phy* phy) +{ + u16 data; + + data = phy_read(phy, MII_BCM5221_TEST); + phy_write(phy, MII_BCM5221_TEST, + data | MII_BCM5221_TEST_ENABLE_SHADOWS); + + data = phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); + phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, + data | MII_BCM5221_SHDOW_AUX_MODE4_IDDQMODE); + + return 0; +} + static int bcm5400_init(struct mii_phy* phy) { u16 data; @@ -173,7 +178,7 @@ return 0; } -static int bcm5400_suspend(struct mii_phy* phy, int wol_options) +static int bcm5400_suspend(struct mii_phy* phy) { #if 0 /* Commented out in Darwin... someone has those dawn docs ? */ phy_write(phy, MII_BMCR, BMCR_PDOWN); @@ -229,7 +234,7 @@ return 0; } -static int bcm5401_suspend(struct mii_phy* phy, int wol_options) +static int bcm5401_suspend(struct mii_phy* phy) { #if 0 /* Commented out in Darwin... someone has those dawn docs ? */ phy_write(phy, MII_BMCR, BMCR_PDOWN); @@ -266,7 +271,7 @@ return 0; } -static int bcm5411_suspend(struct mii_phy* phy, int wol_options) +static int bcm5411_suspend(struct mii_phy* phy) { phy_write(phy, MII_BMCR, BMCR_PDOWN); @@ -662,7 +667,7 @@ /* Broadcom BCM 5221 */ static struct mii_phy_ops bcm5221_phy_ops = { - .suspend = bcm5201_suspend, + .suspend = bcm5221_suspend, .init = bcm5221_init, .setup_aneg = genmii_setup_aneg, .setup_forced = genmii_setup_forced, Index: linux-2.6.9-sleep/drivers/net/sungem_phy.h =================================================================== --- linux-2.6.9-sleep.orig/drivers/net/sungem_phy.h 2004-10-19 13:37:56.000000000 +1000 +++ linux-2.6.9-sleep/drivers/net/sungem_phy.h 2004-11-26 13:56:30.160911000 +1100 @@ -7,7 +7,7 @@ struct mii_phy_ops { int (*init)(struct mii_phy *phy); - int (*suspend)(struct mii_phy *phy, int wol_options); + int (*suspend)(struct mii_phy *phy); int (*setup_aneg)(struct mii_phy *phy, u32 advertise); int (*setup_forced)(struct mii_phy *phy, int speed, int fd); int (*poll_link)(struct mii_phy *phy); @@ -80,6 +80,7 @@ #define MII_BCM5221_SHDOW_AUX_STAT2 0x1b #define MII_BCM5221_SHDOW_AUX_STAT2_APD 0x0020 #define MII_BCM5221_SHDOW_AUX_MODE4 0x1a +#define MII_BCM5221_SHDOW_AUX_MODE4_IDDQMODE 0x0001 #define MII_BCM5221_SHDOW_AUX_MODE4_CLKLOPWR 0x0004 /* MII BCM5400 1000-BASET Control register */ Index: linux-2.6.9-sleep/drivers/net/sungem.c =================================================================== --- linux-2.6.9-sleep.orig/drivers/net/sungem.c 2004-10-19 13:38:05.000000000 +1000 +++ linux-2.6.9-sleep/drivers/net/sungem.c 2004-11-26 14:17:08.013728768 +1100 @@ -10,9 +10,24 @@ * (C) 2004 by Eric Lemoine (eric.lemoine@gmail.com) * * TODO: - * - Get rid of all those nasty mdelay's and replace them - * with schedule_timeout. - * - Implement WOL + * - Now that the driver was significantly simplified, I need to rework + * the locking. I'm sure we don't need _2_ spinlocks, and we probably + * can avoid taking most of them for so long period of time (and schedule + * instead). The main issues at this point are caused by the netdev layer + * though: + * + * gem_change_mtu() and gem_set_multicast() are called with a read_lock() + * help by net/core/dev.c, thus they can't schedule. That means they can't + * call netif_poll_disable() neither, thus force gem_poll() to keep a spinlock + * where it could have been dropped. change_mtu especially would love also to + * be able to msleep instead of horrid locked delays when resetting the HW, + * but that read_lock() makes it impossible, unless I defer it's action to + * the reset task, which means it'll be asynchronous (won't take effect until + * the system schedules a bit). + * + * Also, it would probably be possible to also remove most of the long-life + * locking in open/resume code path (gem_reinit_chip) by beeing more careful + * about when we can start taking interrupts or get xmit() called... */ #include @@ -196,6 +211,29 @@ writel(GREG_STAT_NAPI | GREG_STAT_TXDONE, gp->regs + GREG_IMASK); } +static void gem_get_cell(struct gem *gp) +{ + gp->cell_enabled++; +#ifdef CONFIG_PPC_PMAC + if (gp->cell_enabled == 1) { + mb(); + pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 1); + udelay(10); + } +#endif /* CONFIG_PPC_PMAC */ +} + +/* Turn off the chip's clock */ +static void gem_put_cell(struct gem *gp) +{ + gp->cell_enabled--; + BUG_ON(gp->cell_enabled < 0); +#ifdef CONFIG_PPC_PMAC + if (gp->cell_enabled == 0) + pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 0); +#endif /* CONFIG_PPC_PMAC */ +} + static void gem_handle_mif_event(struct gem *gp, u32 reg_val, u32 changed_bits) { if (netif_msg_intr(gp)) @@ -597,7 +635,7 @@ return 0; do_reset: - gp->reset_task_pending = 2; + gp->reset_task_pending = 1; schedule_work(&gp->reset_task); return 1; @@ -823,6 +861,9 @@ struct gem *gp = dev->priv; unsigned long flags; + /* + * NAPI locking nightmare: See comment at head of driver + */ spin_lock_irqsave(&gp->lock, flags); do { @@ -874,8 +915,11 @@ struct gem *gp = dev->priv; unsigned long flags; - /* Swallow interrupts when shutting the chip down */ - if (!gp->hw_running) + /* Swallow interrupts when shutting the chip down, though + * that shouldn't happen, we should have done free_irq() at + * this point... + */ + if (!gp->running) return IRQ_HANDLED; spin_lock_irqsave(&gp->lock, flags); @@ -916,7 +960,7 @@ struct gem *gp = dev->priv; printk(KERN_ERR "%s: transmit timed out, resetting\n", dev->name); - if (!gp->hw_running) { + if (!gp->running) { printk("%s: hrm.. hw not running !\n", dev->name); return; } @@ -934,7 +978,7 @@ spin_lock_irq(&gp->lock); spin_lock(&gp->tx_lock); - gp->reset_task_pending = 2; + gp->reset_task_pending = 1; schedule_work(&gp->reset_task); spin_unlock(&gp->tx_lock); @@ -975,6 +1019,11 @@ local_irq_restore(flags); return NETDEV_TX_LOCKED; } + /* We raced with gem_do_stop() */ + if (!gp->running) { + spin_unlock_irqrestore(&gp->tx_lock, flags); + return NETDEV_TX_BUSY; + } /* This is a hard error, log it. */ if (TX_BUFFS_AVAIL(gp) <= (skb_shinfo(skb)->nr_frags + 1)) { @@ -1073,46 +1122,10 @@ return NETDEV_TX_OK; } -/* Jumbo-grams don't seem to work :-( */ -#define GEM_MIN_MTU 68 -#if 1 -#define GEM_MAX_MTU 1500 -#else -#define GEM_MAX_MTU 9000 -#endif - -static int gem_change_mtu(struct net_device *dev, int new_mtu) -{ - struct gem *gp = dev->priv; - - if (new_mtu < GEM_MIN_MTU || new_mtu > GEM_MAX_MTU) - return -EINVAL; - - if (!netif_running(dev) || !netif_device_present(dev)) { - /* We'll just catch it later when the - * device is up'd or resumed. - */ - dev->mtu = new_mtu; - return 0; - } - - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); - dev->mtu = new_mtu; - gp->reset_task_pending = 1; - schedule_work(&gp->reset_task); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); - - flush_scheduled_work(); - - return 0; -} - #define STOP_TRIES 32 /* Must be invoked under gp->lock and gp->tx_lock. */ -static void gem_stop(struct gem *gp) +static void gem_reset(struct gem *gp) { int limit; u32 val; @@ -1140,7 +1153,7 @@ /* Must be invoked under gp->lock and gp->tx_lock. */ static void gem_start_dma(struct gem *gp) { - unsigned long val; + u32 val; /* We are ready to rock, turn everything on. */ val = readl(gp->regs + TXDMA_CFG); @@ -1155,10 +1168,31 @@ (void) readl(gp->regs + MAC_RXCFG); udelay(100); - writel(GREG_STAT_TXDONE, gp->regs + GREG_IMASK); + gem_enable_ints(gp); writel(RX_RING_SIZE - 4, gp->regs + RXDMA_KICK); +} + +/* Must be invoked under gp->lock and gp->tx_lock. DMA won't be + * actually stopped before about 4ms tho ... + */ +static void gem_stop_dma(struct gem *gp) +{ + u32 val; + + /* We are done rocking, turn everything off. */ + val = readl(gp->regs + TXDMA_CFG); + writel(val & ~TXDMA_CFG_ENABLE, gp->regs + TXDMA_CFG); + val = readl(gp->regs + RXDMA_CFG); + writel(val & ~RXDMA_CFG_ENABLE, gp->regs + RXDMA_CFG); + val = readl(gp->regs + MAC_TXCFG); + writel(val & ~MAC_TXCFG_ENAB, gp->regs + MAC_TXCFG); + val = readl(gp->regs + MAC_RXCFG); + writel(val & ~MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); + + (void) readl(gp->regs + MAC_RXCFG); + /* Need to wait a bit ... done by the caller */ } @@ -1219,10 +1253,10 @@ if (speed == 0) speed = SPEED_10; - /* If HW is down, we don't try to actually setup the PHY, we + /* If we are asleep, we don't try to actually setup the PHY, we * just store the settings */ - if (!gp->hw_running) { + if (gp->asleep) { gp->phy_mii.autoneg = gp->want_autoneg = autoneg; gp->phy_mii.speed = speed; gp->phy_mii.duplex = duplex; @@ -1279,6 +1313,9 @@ printk(KERN_INFO "%s: Link is up at %d Mbps, %s-duplex.\n", gp->dev->name, speed, (full_duplex ? "full" : "half")); + if (!gp->running) + return 0; + val = (MAC_TXCFG_EIPG0 | MAC_TXCFG_NGU); if (full_duplex) { val |= (MAC_TXCFG_ICS | MAC_TXCFG_ICOLL); @@ -1405,48 +1442,19 @@ } } -static void gem_init_rings(struct gem *); -static void gem_init_hw(struct gem *, int); - -static void gem_reset_task(void *data) -{ - struct gem *gp = (struct gem *) data; - - netif_poll_disable(gp->dev); - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); - - if (gp->hw_running && gp->opened) { - netif_stop_queue(gp->dev); - - /* Reset the chip & rings */ - gem_stop(gp); - gem_init_rings(gp); - - gem_init_hw(gp, - (gp->reset_task_pending == 2)); - - netif_wake_queue(gp->dev); - } - gp->reset_task_pending = 0; - - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); - netif_poll_enable(gp->dev); -} - static void gem_link_timer(unsigned long data) { struct gem *gp = (struct gem *) data; int restart_aneg = 0; - if (!gp->hw_running) + if (gp->asleep) return; spin_lock_irq(&gp->lock); spin_lock(&gp->tx_lock); + gem_get_cell(gp); - /* If the link of task is still pending, we just + /* If the reset task is still pending, we just * reschedule the link timer */ if (gp->reset_task_pending) @@ -1462,8 +1470,7 @@ if ((val & PCS_MIISTAT_LS) != 0) { gp->lstate = link_up; netif_carrier_on(gp->dev); - if (gp->opened) - (void)gem_set_link_modes(gp); + (void)gem_set_link_modes(gp); } goto restart; } @@ -1484,7 +1491,7 @@ } else if (gp->lstate != link_up) { gp->lstate = link_up; netif_carrier_on(gp->dev); - if (gp->opened && gem_set_link_modes(gp)) + if (gem_set_link_modes(gp)) restart_aneg = 1; } } else { @@ -1497,7 +1504,7 @@ printk(KERN_INFO "%s: Link down\n", gp->dev->name); netif_carrier_off(gp->dev); - gp->reset_task_pending = 2; + gp->reset_task_pending = 1; schedule_work(&gp->reset_task); restart_aneg = 1; } else if (++gp->timer_ticks > 10) { @@ -1514,6 +1521,7 @@ restart: mod_timer(&gp->link_timer, jiffies + ((12 * HZ) / 10)); out_unlock: + gem_put_cell(gp); spin_unlock(&gp->tx_lock); spin_unlock_irq(&gp->lock); } @@ -1619,59 +1627,40 @@ wmb(); } -/* Must be invoked under gp->lock and gp->tx_lock. */ +/* Init PHY interface and start link poll state machine */ static void gem_init_phy(struct gem *gp) { u32 mifcfg; - + /* Revert MIF CFG setting done on stop_phy */ mifcfg = readl(gp->regs + MIF_CFG); mifcfg &= ~MIF_CFG_BBMODE; writel(mifcfg, gp->regs + MIF_CFG); -#ifdef CONFIG_PPC_PMAC if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { - int i, j; + int i; /* Those delay sucks, the HW seem to love them though, I'll * serisouly consider breaking some locks here to be able * to schedule instead */ - pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0); - for (j = 0; j < 3; j++) { + for (i = 0; i < 3; i++) { +#ifdef CONFIG_PPC_PMAC + pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0); + msleep(20); +#endif /* Some PHYs used by apple have problem getting back to us, - * we _know_ it's actually at addr 0 or 1, that's a hack, but - * it helps to do that reset now. I suspect some motherboards - * don't wire the PHY reset line properly, thus the PHY doesn't - * come back with the above pmac_call_feature. + * we do an additional reset here */ - gp->mii_phy_addr = 0; - phy_write(gp, MII_BMCR, BMCR_RESET); - gp->mii_phy_addr = 1; phy_write(gp, MII_BMCR, BMCR_RESET); - /* We should probably break some locks here and schedule... */ - mdelay(10); - - /* On K2, we only probe the internal PHY at address 1, other - * addresses tend to return garbage. - */ - if (gp->pdev->device == PCI_DEVICE_ID_APPLE_K2_GMAC) + msleep(20); + if (phy_read(gp, MII_BMCR) != 0xffff) break; - - for (i = 0; i < 32; i++) { - gp->mii_phy_addr = i; - if (phy_read(gp, MII_BMCR) != 0xffff) - break; - } - if (i == 32) { + if (i == 2) printk(KERN_WARNING "%s: GMAC PHY not responding !\n", gp->dev->name); - gp->mii_phy_addr = 0; - } else - break; } } -#endif /* CONFIG_PPC_PMAC */ if (gp->pdev->vendor == PCI_VENDOR_ID_SUN && gp->pdev->device == PCI_DEVICE_ID_SUN_GEM) { @@ -1755,6 +1744,16 @@ val |= PCS_SCTRL_LOOP; writel(val, gp->regs + PCS_SCTRL); } + + /* Default aneg parameters */ + gp->timer_ticks = 0; + gp->lstate = link_down; + netif_carrier_off(gp->dev); + + /* Can I advertise gigabit here ? I'd need BCM PHY docs... */ + spin_lock_irq(&gp->lock); + gem_begin_auto_negotiation(gp, NULL); + spin_unlock_irq(&gp->lock); } /* Must be invoked under gp->lock and gp->tx_lock. */ @@ -1796,8 +1795,7 @@ } /* Must be invoked under gp->lock and gp->tx_lock. */ -static u32 -gem_setup_multicast(struct gem *gp) +static u32 gem_setup_multicast(struct gem *gp) { u32 rxcfg = 0; int i; @@ -1914,6 +1912,10 @@ * make no use of those events other than to record them. */ writel(0xffffffff, gp->regs + MAC_MCMASK); + + /* Don't enable GEM's WOL in normal operations + */ + writel(0, gp->regs + WOL_WAKECSR); } /* Must be invoked under gp->lock and gp->tx_lock. */ @@ -1975,6 +1977,23 @@ gp->tx_fifo_sz = readl(gp->regs + TXDMA_FSZ) * 64; gp->rx_fifo_sz = readl(gp->regs + RXDMA_FSZ) * 64; gp->swrst_base = 0; + + mif_cfg = readl(gp->regs + MIF_CFG); + mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1); + mif_cfg |= MIF_CFG_MDI0; + writel(mif_cfg, gp->regs + MIF_CFG); + writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE); + writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG); + + /* We hard-code the PHY address so we can properly bring it out of + * reset later on, we can't really probe it at this point, though + * that isn't an issue. + */ + if (gp->pdev->device == PCI_DEVICE_ID_APPLE_K2_GMAC) + gp->mii_phy_addr = 1; + else + gp->mii_phy_addr = 0; + return 0; } @@ -2053,68 +2072,28 @@ } /* Must be invoked under gp->lock and gp->tx_lock. */ -static void gem_init_hw(struct gem *gp, int restart_link) +static void gem_reinit_chip(struct gem *gp) { - /* On Apple's gmac, I initialize the PHY only after - * setting up the chip. It appears the gigabit PHYs - * don't quite like beeing talked to on the GII when - * the chip is not running, I suspect it might not - * be clocked at that point. --BenH - */ - if (restart_link) - gem_init_phy(gp); - gem_init_pause_thresholds(gp); - gem_init_dma(gp); - gem_init_mac(gp); - - if (restart_link) { - /* Default aneg parameters */ - gp->timer_ticks = 0; - gp->lstate = link_down; - netif_carrier_off(gp->dev); - - /* Can I advertise gigabit here ? I'd need BCM PHY docs... */ - gem_begin_auto_negotiation(gp, NULL); - } else { - if (gp->lstate == link_up) { - netif_carrier_on(gp->dev); - gem_set_link_modes(gp); - } - } -} + /* Reset the chip */ + gem_reset(gp); -#ifdef CONFIG_PPC_PMAC -/* Enable the chip's clock and make sure it's config space is - * setup properly. There appear to be no need to restore the - * base addresses. - */ -static void gem_apple_powerup(struct gem *gp) -{ - u32 mif_cfg; + /* Make sure ints are disabled */ + gem_disable_ints(gp); - mb(); - pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 1); + /* Allocate & setup ring buffers */ + gem_init_rings(gp); - udelay(3); - - mif_cfg = readl(gp->regs + MIF_CFG); - mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1); - mif_cfg |= MIF_CFG_MDI0; - writel(mif_cfg, gp->regs + MIF_CFG); - writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE); - writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG); -} + /* Configure pause thresholds */ + gem_init_pause_thresholds(gp); -/* Turn off the chip's clock */ -static void gem_apple_powerdown(struct gem *gp) -{ - pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 0); + /* Init DMA & MAC engines */ + gem_init_dma(gp); + gem_init_mac(gp); } -#endif /* CONFIG_PPC_PMAC */ /* Must be invoked with no lock held. */ -static void gem_stop_phy(struct gem *gp) +static void gem_stop_phy(struct gem *gp, int wol) { u32 mifcfg; unsigned long flags; @@ -2131,8 +2110,22 @@ mifcfg &= ~MIF_CFG_POLL; writel(mifcfg, gp->regs + MIF_CFG); - if (gp->wake_on_lan) { - /* Setup wake-on-lan */ + if (wol) { + unsigned char *e = &gp->dev->dev_addr[0]; + u32 csr; + + /* Setup wake-on-lan for MAGIC packet */ + writel(MAC_RXCFG_HFE | MAC_RXCFG_SFCS | MAC_RXCFG_ENAB, + gp->regs + MAC_RXCFG); + writel((e[4] << 8) | e[5], gp->regs + WOL_MATCH0); + writel((e[2] << 8) | e[3], gp->regs + WOL_MATCH1); + writel((e[0] << 8) | e[1], gp->regs + WOL_MATCH2); + + writel(WOL_MCOUNT_N | WOL_MCOUNT_M, gp->regs + WOL_MCOUNT); + csr = WOL_WAKECSR_ENABLE; + if ((readl(gp->regs + MAC_XIFCFG) & MAC_XIFCFG_GMII) == 0) + csr |= WOL_WAKECSR_MII; + writel(csr, gp->regs + WOL_WAKECSR); } else { writel(0, gp->regs + MAC_RXCFG); (void)readl(gp->regs + MAC_RXCFG); @@ -2148,10 +2141,11 @@ writel(0, gp->regs + TXDMA_CFG); writel(0, gp->regs + RXDMA_CFG); - if (!gp->wake_on_lan) { + /* No need to take the lock here */ + if (!wol) { spin_lock_irqsave(&gp->lock, flags); spin_lock(&gp->tx_lock); - gem_stop(gp); + gem_reset(gp); writel(MAC_TXRST_CMD, gp->regs + MAC_TXRST); writel(MAC_RXRST_CMD, gp->regs + MAC_RXRST); spin_unlock(&gp->tx_lock); @@ -2159,9 +2153,9 @@ } if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) - gp->phy_mii.def->ops->suspend(&gp->phy_mii, 0 /* wake on lan options */); + gp->phy_mii.def->ops->suspend(&gp->phy_mii); - if (!gp->wake_on_lan) { + if (!wol) { /* According to Apple, we must set the MDIO pins to this begnign * state or we may 1) eat more current, 2) damage some PHYs */ @@ -2174,181 +2168,160 @@ } } -/* Shut down the chip, must be called with pm_sem held. */ -static void gem_shutdown(struct gem *gp) + +static int gem_do_start(struct net_device *dev) { - /* Make us not-running to avoid timers respawning - * and swallow irqs - */ - gp->hw_running = 0; - wmb(); + struct gem *gp = dev->priv; + unsigned long flags; - /* Stop the link timer */ - del_timer_sync(&gp->link_timer); + spin_lock_irqsave(&gp->lock, flags); + spin_lock(&gp->tx_lock); - /* Stop the reset task */ - while (gp->reset_task_pending) - yield(); - - /* Actually stop the chip */ - if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { - gem_stop_phy(gp); + /* Enable the cell */ + gem_get_cell(gp); -#ifdef CONFIG_PPC_PMAC - /* Power down the chip */ - gem_apple_powerdown(gp); -#endif /* CONFIG_PPC_PMAC */ - } else{ - unsigned long flags; + /* Init & setup chip hardware */ + gem_reinit_chip(gp); + + gp->running = 1; + + if (gp->lstate == link_up) { + netif_carrier_on(gp->dev); + gem_set_link_modes(gp); + } + + netif_wake_queue(gp->dev); + + spin_unlock(&gp->tx_lock); + spin_unlock_irqrestore(&gp->lock, flags); + + if (request_irq(gp->pdev->irq, gem_interrupt, + SA_SHIRQ, dev->name, (void *)dev)) { + printk(KERN_ERR "%s: failed to request irq !\n", gp->dev->name); spin_lock_irqsave(&gp->lock, flags); spin_lock(&gp->tx_lock); - gem_stop(gp); + + gp->running = 0; + gem_reset(gp); + gem_clean_rings(gp); + gem_put_cell(gp); + spin_unlock(&gp->tx_lock); spin_unlock_irqrestore(&gp->lock, flags); + + return -EAGAIN; } + + return 0; } -static void gem_pm_task(void *data) +static void gem_do_stop(struct net_device *dev, int wol) { - struct gem *gp = (struct gem *) data; + struct gem *gp = dev->priv; + unsigned long flags; - /* We assume if we can't lock the pm_sem, then open() was - * called again (or suspend()), and we can safely ignore - * the PM request - */ - if (down_trylock(&gp->pm_sem)) - return; + spin_lock_irqsave(&gp->lock, flags); + spin_lock(&gp->tx_lock); - /* Driver was re-opened or already shut down */ - if (gp->opened || !gp->hw_running) { - up(&gp->pm_sem); - return; - } + gp->running = 0; - gem_shutdown(gp); + /* Stop netif queue */ + netif_stop_queue(dev); - up(&gp->pm_sem); -} + /* Make sure ints are disabled */ + gem_disable_ints(gp); -static void gem_pm_timer(unsigned long data) -{ - struct gem *gp = (struct gem *) data; + /* We can drop the lock now */ + spin_unlock(&gp->tx_lock); + spin_unlock_irqrestore(&gp->lock, flags); + + /* If we are going to sleep with WOL */ + if (wol) + gem_stop_dma(gp); + else + gem_reset(gp); + msleep(10); + + /* Get rid of rings */ + gem_clean_rings(gp); + + /* No irq needed anymore */ + free_irq(gp->pdev->irq, (void *) dev); - schedule_work(&gp->pm_task); + /* Cell not needed neither if no WOL */ + if (!wol) { + spin_lock_irqsave(&gp->lock, flags); + gem_put_cell(gp); + spin_unlock_irqrestore(&gp->lock, flags); + } } -static int gem_open(struct net_device *dev) +static void gem_reset_task(void *data) { - struct gem *gp = dev->priv; - int hw_was_up; + struct gem *gp = (struct gem *) data; down(&gp->pm_sem); - hw_was_up = gp->hw_running; + netif_poll_disable(gp->dev); - /* Stop the PM timer/task */ - del_timer(&gp->pm_timer); - flush_scheduled_work(); + spin_lock_irq(&gp->lock); + spin_lock(&gp->tx_lock); - /* The power-management semaphore protects the hw_running - * etc. state so it is safe to do this bit without gp->lock - */ - if (!gp->hw_running) { -#ifdef CONFIG_PPC_PMAC - /* First, we need to bring up the chip */ - if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { - gem_apple_powerup(gp); - gem_check_invariants(gp); - } -#endif /* CONFIG_PPC_PMAC */ + if (gp->running == 0) + goto not_running; - /* Reset the chip */ - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); - gem_stop(gp); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); + if (gp->running) { + netif_stop_queue(gp->dev); - gp->hw_running = 1; + /* Reset the chip & rings */ + gem_reinit_chip(gp); + if (gp->lstate == link_up) + gem_set_link_modes(gp); + netif_wake_queue(gp->dev); } + not_running: + gp->reset_task_pending = 0; - /* We can now request the interrupt as we know it's masked - * on the controller - */ - if (request_irq(gp->pdev->irq, gem_interrupt, - SA_SHIRQ, dev->name, (void *)dev)) { - printk(KERN_ERR "%s: failed to request irq !\n", gp->dev->name); + spin_unlock(&gp->tx_lock); + spin_unlock_irq(&gp->lock); - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); -#ifdef CONFIG_PPC_PMAC - if (!hw_was_up && gp->pdev->vendor == PCI_VENDOR_ID_APPLE) - gem_apple_powerdown(gp); -#endif /* CONFIG_PPC_PMAC */ - /* Fire the PM timer that will shut us down in about 10 seconds */ - gp->pm_timer.expires = jiffies + 10*HZ; - add_timer(&gp->pm_timer); - up(&gp->pm_sem); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); - - return -EAGAIN; - } + netif_poll_enable(gp->dev); - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + up(&gp->pm_sem); +} - /* Allocate & setup ring buffers */ - gem_init_rings(gp); - /* Init & setup chip hardware */ - gem_init_hw(gp, !hw_was_up); +static int gem_open(struct net_device *dev) +{ + struct gem *gp = dev->priv; + int rc = 0; - gp->opened = 1; + down(&gp->pm_sem); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); + /* We need the cell enabled */ + if (!gp->asleep) + rc = gem_do_start(dev); + gp->opened = (rc == 0); up(&gp->pm_sem); - return 0; + return rc; } static int gem_close(struct net_device *dev) { struct gem *gp = dev->priv; - /* Make sure we don't get distracted by suspend/resume */ - down(&gp->pm_sem); - /* Note: we don't need to call netif_poll_disable() here because * our caller (dev_close) already did it for us */ - /* Stop traffic, mark us closed */ - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + down(&gp->pm_sem); gp->opened = 0; - - netif_stop_queue(dev); - - /* Stop chip */ - gem_stop(gp); - - /* Get rid of rings */ - gem_clean_rings(gp); - - /* Bye, the pm timer will finish the job */ - free_irq(gp->pdev->irq, (void *) dev); - - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); - - /* Fire the PM timer that will shut us down in about 10 seconds */ - gp->pm_timer.expires = jiffies + 10*HZ; - add_timer(&gp->pm_timer); + if (!gp->asleep) + gem_do_stop(dev, 0); up(&gp->pm_sem); @@ -2360,45 +2333,63 @@ { struct net_device *dev = pci_get_drvdata(pdev); struct gem *gp = dev->priv; + unsigned long flags; - netif_poll_disable(dev); - - /* We hold the PM semaphore during entire driver - * sleep time - */ down(&gp->pm_sem); + netif_poll_disable(dev); + printk(KERN_INFO "%s: suspending, WakeOnLan %s\n", - dev->name, gp->wake_on_lan ? "enabled" : "disabled"); + dev->name, + (gp->wake_on_lan && gp->opened) ? "enabled" : "disabled"); - /* If the driver is opened, we stop the DMA */ - if (gp->opened) { - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + /* Keep the cell enabled during the entire operation */ + spin_lock_irqsave(&gp->lock, flags); + spin_lock(&gp->tx_lock); + gem_get_cell(gp); + spin_unlock(&gp->tx_lock); + spin_unlock_irqrestore(&gp->lock, flags); + /* If the driver is opened, we stop the MAC */ + if (gp->opened) { /* Stop traffic, mark us closed */ netif_device_detach(dev); - /* Stop chip */ - gem_stop(gp); + /* Switch off MAC, remember WOL setting */ + gp->asleep_wol = gp->wake_on_lan; + gem_do_stop(dev, gp->asleep_wol); + msleep(10); + } else + gp->asleep_wol = 0; - /* Get rid of ring buffers */ - gem_clean_rings(gp); + /* Mark us asleep */ + gp->asleep = 1; + wmb(); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); + /* Stop the link timer */ + del_timer_sync(&gp->link_timer); - if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) - disable_irq(gp->pdev->irq); - } + /* Now we release the semaphore to not block the reset task who + * can take it too. We are marked asleep, so there will be no + * conflict here + */ + up(&gp->pm_sem); - if (gp->hw_running) { - /* Kill PM timer if any */ - del_timer_sync(&gp->pm_timer); - flush_scheduled_work(); + /* Wait for a pending reset task to complete */ + while (gp->reset_task_pending) + yield(); + flush_scheduled_work(); - gem_shutdown(gp); - } + /* Shut the PHY down eventually and setup WOL */ + gem_stop_phy(gp, gp->asleep_wol); + + /* Make sure bus master is disabled */ + pci_disable_device(gp->pdev); + + /* Release the cell, no need to take a lock at this point since + * nothing else can happen now + */ + gem_put_cell(gp); return 0; } @@ -2407,36 +2398,74 @@ { struct net_device *dev = pci_get_drvdata(pdev); struct gem *gp = dev->priv; + unsigned long flags; printk(KERN_INFO "%s: resuming\n", dev->name); - if (gp->opened) { -#ifdef CONFIG_PPC_PMAC - /* First, we need to bring up the chip */ - if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { - gem_apple_powerup(gp); - gem_check_invariants(gp); - } -#endif /* CONFIG_PPC_PMAC */ - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + down(&gp->pm_sem); - gem_stop(gp); - gp->hw_running = 1; - gem_init_rings(gp); - gem_init_hw(gp, 1); + /* Keep the cell enabled during the entire operation, no need to + * take a lock here tho since nothing else can happen while we are + * marked asleep + */ + gem_get_cell(gp); + + /* Make sure PCI access and bus master are enabled */ + if (pci_enable_device(gp->pdev)) { + printk(KERN_ERR "%s: Can't re-enable chip !\n", + dev->name); + /* Put cell and forget it for now, it will be considered as + * still asleep, a new sleep cycle may bring it back + */ + gem_put_cell(gp); + up(&gp->pm_sem); + return 0; + } + pci_set_master(gp->pdev); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); + /* Reset everything */ + gem_reset(gp); + + /* Mark us woken up */ + gp->asleep = 0; + wmb(); + + /* Bring the PHY back. Again, lock is useless at this point as + * nothing can be happening until we restart the whole thing + */ + gem_init_phy(gp); + + /* If we were opened, bring everything back */ + if (gp->opened) { + /* Restart MAC */ + gem_do_start(dev); + /* Re-attach net device */ netif_device_attach(dev); - if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) - enable_irq(gp->pdev->irq); + } - up(&gp->pm_sem); + + spin_lock_irqsave(&gp->lock, flags); + spin_lock(&gp->tx_lock); + + /* If we had WOL enabled, the cell clock was never turned off during + * sleep, so we end up beeing unbalanced. Fix that here + */ + if (gp->asleep_wol) + gem_put_cell(gp); + + /* This function doesn't need to hold the cell, it will be held if the + * driver is open by gem_do_start(). + */ + gem_put_cell(gp); + + spin_unlock(&gp->tx_lock); + spin_unlock_irqrestore(&gp->lock, flags); netif_poll_enable(dev); + up(&gp->pm_sem); + return 0; } #endif /* CONFIG_PM */ @@ -2449,7 +2478,10 @@ spin_lock_irq(&gp->lock); spin_lock(&gp->tx_lock); - if (gp->hw_running) { + /* I have seen this being called while the PM was in progress, + * so we shield against this + */ + if (gp->running) { stats->rx_crc_errors += readl(gp->regs + MAC_FCSERR); writel(0, gp->regs + MAC_FCSERR); @@ -2479,12 +2511,12 @@ u32 rxcfg, rxcfg_new; int limit = 10000; - if (!gp->hw_running) - return; - spin_lock_irq(&gp->lock); spin_lock(&gp->tx_lock); + if (!gp->running) + goto bail; + netif_stop_queue(dev); rxcfg = readl(gp->regs + MAC_RXCFG); @@ -2507,9 +2539,46 @@ writel(rxcfg, gp->regs + MAC_RXCFG); netif_wake_queue(dev); + bail: + spin_unlock(&gp->tx_lock); + spin_unlock_irq(&gp->lock); +} + +/* Jumbo-grams don't seem to work :-( */ +#define GEM_MIN_MTU 68 +#if 1 +#define GEM_MAX_MTU 1500 +#else +#define GEM_MAX_MTU 9000 +#endif + +static int gem_change_mtu(struct net_device *dev, int new_mtu) +{ + struct gem *gp = dev->priv; + + if (new_mtu < GEM_MIN_MTU || new_mtu > GEM_MAX_MTU) + return -EINVAL; + + if (!netif_running(dev) || !netif_device_present(dev)) { + /* We'll just catch it later when the + * device is up'd or resumed. + */ + dev->mtu = new_mtu; + return 0; + } + spin_lock_irq(&gp->lock); + spin_lock(&gp->tx_lock); + dev->mtu = new_mtu; + if (gp->running) { + gem_reinit_chip(gp); + if (gp->lstate == link_up) + gem_set_link_modes(gp); + } spin_unlock(&gp->tx_lock); spin_unlock_irq(&gp->lock); + + return 0; } static void gem_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) @@ -2540,7 +2609,6 @@ /* Return current PHY settings */ spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); cmd->autoneg = gp->want_autoneg; cmd->speed = gp->phy_mii.speed; cmd->duplex = gp->phy_mii.duplex; @@ -2552,7 +2620,6 @@ */ if (cmd->advertising == 0) cmd->advertising = cmd->supported; - spin_unlock(&gp->tx_lock); spin_unlock_irq(&gp->lock); } else { // XXX PCS ? cmd->supported = @@ -2592,9 +2659,9 @@ /* Apply settings and restart link process. */ spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + gem_get_cell(gp); gem_begin_auto_negotiation(gp, cmd); - spin_unlock(&gp->tx_lock); + gem_put_cell(gp); spin_unlock_irq(&gp->lock); return 0; @@ -2609,9 +2676,9 @@ /* Restart link process. */ spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); + gem_get_cell(gp); gem_begin_auto_negotiation(gp, NULL); - spin_unlock(&gp->tx_lock); + gem_put_cell(gp); spin_unlock_irq(&gp->lock); return 0; @@ -2628,7 +2695,31 @@ struct gem *gp = dev->priv; gp->msg_enable = value; } - + + +/* Add more when I understand how to program the chip */ +/* like WAKE_UCAST | WAKE_MCAST | WAKE_BCAST */ + +#define WOL_SUPPORTED_MASK (WAKE_MAGIC) + +static void gem_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct gem *gp = dev->priv; + + /* Add more when I understand how to program the chip */ + wol->supported = WOL_SUPPORTED_MASK; + wol->wolopts = gp->wake_on_lan; +} + +static int gem_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct gem *gp = dev->priv; + + gp->wake_on_lan = wol->wolopts & WOL_SUPPORTED_MASK; + + return 0; +} + static struct ethtool_ops gem_ethtool_ops = { .get_drvinfo = gem_get_drvinfo, .get_link = ethtool_op_get_link, @@ -2637,6 +2728,8 @@ .nway_reset = gem_nway_reset, .get_msglevel = gem_get_msglevel, .set_msglevel = gem_set_msglevel, + .get_wol = gem_get_wol, + .set_wol = gem_set_wol, }; static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) @@ -2644,22 +2737,28 @@ struct gem *gp = dev->priv; struct mii_ioctl_data *data = if_mii(ifr); int rc = -EOPNOTSUPP; - + unsigned long flags; + /* Hold the PM semaphore while doing ioctl's or we may collide - * with open/close and power management and oops. + * with power management. */ down(&gp->pm_sem); - + + spin_lock_irqsave(&gp->lock, flags); + gem_get_cell(gp); + spin_unlock_irqrestore(&gp->lock, flags); + switch (cmd) { case SIOCGMIIPHY: /* Get address of MII PHY in use. */ data->phy_id = gp->mii_phy_addr; /* Fallthrough... */ case SIOCGMIIREG: /* Read MII PHY register. */ - if (!gp->hw_running) - rc = -EIO; + if (!gp->running) + rc = -EAGAIN; else { - data->val_out = __phy_read(gp, data->phy_id & 0x1f, data->reg_num & 0x1f); + data->val_out = __phy_read(gp, data->phy_id & 0x1f, + data->reg_num & 0x1f); rc = 0; } break; @@ -2667,14 +2766,19 @@ case SIOCSMIIREG: /* Write MII PHY register. */ if (!capable(CAP_NET_ADMIN)) rc = -EPERM; - else if (!gp->hw_running) - rc = -EIO; + else if (!gp->running) + rc = -EAGAIN; else { - __phy_write(gp, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); + __phy_write(gp, data->phy_id & 0x1f, data->reg_num & 0x1f, + data->val_in); rc = 0; } break; }; + + spin_lock_irqsave(&gp->lock, flags); + gem_put_cell(gp); + spin_unlock_irqrestore(&gp->lock, flags); up(&gp->pm_sem); @@ -2779,6 +2883,47 @@ return 0; } +static void __devexit gem_remove_one(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + + if (dev) { + struct gem *gp = dev->priv; + + unregister_netdev(dev); + + /* Stop the link timer */ + del_timer_sync(&gp->link_timer); + + /* We shouldn't need any locking here */ + gem_get_cell(gp); + + /* Wait for a pending reset task to complete */ + while (gp->reset_task_pending) + yield(); + flush_scheduled_work(); + + /* Shut the PHY down */ + gem_stop_phy(gp, 0); + + gem_put_cell(gp); + + /* Make sure bus master is disabled */ + pci_disable_device(gp->pdev); + + /* Free resources */ + pci_free_consistent(pdev, + sizeof(struct gem_init_block), + gp->init_block, + gp->gblock_dvma); + iounmap(gp->regs); + pci_release_regions(pdev); + free_netdev(dev); + + pci_set_drvdata(pdev, NULL); + } +} + static int __devinit gem_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -2870,11 +3015,6 @@ gp->link_timer.function = gem_link_timer; gp->link_timer.data = (unsigned long) gp; - init_timer(&gp->pm_timer); - gp->pm_timer.function = gem_pm_timer; - gp->pm_timer.data = (unsigned long) gp; - - INIT_WORK(&gp->pm_task, gem_pm_task, gp); INIT_WORK(&gp->reset_task, gem_reset_task, gp); gp->lstate = link_down; @@ -2890,19 +3030,18 @@ } /* On Apple, we power the chip up now in order for check - * invariants to work, but also because the firmware might - * not have properly shut down the PHY. + * invariants to work. We also set some registers that are + * normally */ #ifdef CONFIG_PPC_PMAC gp->of_node = pci_device_to_OF_node(pdev); - if (pdev->vendor == PCI_VENDOR_ID_APPLE) - gem_apple_powerup(gp); #endif - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); - gem_stop(gp); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); + + /* Make sure cell is enabled */ + gem_get_cell(gp); + + /* Make sure everything is stopped and in init state */ + gem_reset(gp); /* Fill up the mii_phy structure (even if we won't use it) */ gp->phy_mii.dev = dev; @@ -2911,7 +3050,8 @@ /* By default, we start with autoneg */ gp->want_autoneg = 1; - + + /* Check fifo sizes, PHY type, etc... */ if (gem_check_invariants(gp)) { err = -ENODEV; goto err_out_iounmap; @@ -2951,6 +3091,19 @@ dev->poll_controller = gem_poll_controller; #endif + /* Set that now, in case PM kicks in now */ + pci_set_drvdata(pdev, dev); + + /* Detect & init PHY, start autoneg, we release the cell now + * too, it will be managed by whoever needs it + */ + gem_init_phy(gp); + + spin_lock_irq(&gp->lock); + gem_put_cell(gp); + spin_unlock_irq(&gp->lock); + + /* Register with kernel */ if (register_netdev(dev)) { printk(KERN_ERR PFX "Cannot register net device, " "aborting.\n"); @@ -2965,48 +3118,22 @@ i == 5 ? ' ' : ':'); printk("\n"); - /* Detect & init PHY, start autoneg */ - spin_lock_irq(&gp->lock); - spin_lock(&gp->tx_lock); - gp->hw_running = 1; - gem_init_phy(gp); - gem_begin_auto_negotiation(gp, NULL); - spin_unlock(&gp->tx_lock); - spin_unlock_irq(&gp->lock); - if (gp->phy_type == phy_mii_mdio0 || gp->phy_type == phy_mii_mdio1) printk(KERN_INFO "%s: Found %s PHY\n", dev->name, gp->phy_mii.def ? gp->phy_mii.def->name : "no"); - pci_set_drvdata(pdev, dev); - /* GEM can do it all... */ dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_LLTX; if (pci_using_dac) dev->features |= NETIF_F_HIGHDMA; - /* Fire the PM timer that will shut us down in about 10 seconds */ - gp->pm_timer.expires = jiffies + 10*HZ; - add_timer(&gp->pm_timer); - return 0; err_out_free_consistent: - pci_free_consistent(pdev, - sizeof(struct gem_init_block), - gp->init_block, - gp->gblock_dvma); - + gem_remove_one(pdev); err_out_iounmap: - down(&gp->pm_sem); - /* Stop the PM timer & task */ - del_timer_sync(&gp->pm_timer); - flush_scheduled_work(); - if (gp->hw_running) - gem_shutdown(gp); - up(&gp->pm_sem); - + gem_put_cell(gp); iounmap(gp->regs); err_out_free_res: @@ -3020,34 +3147,6 @@ } -static void __devexit gem_remove_one(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - - if (dev) { - struct gem *gp = dev->priv; - - unregister_netdev(dev); - - down(&gp->pm_sem); - /* Stop the PM timer & task */ - del_timer_sync(&gp->pm_timer); - flush_scheduled_work(); - if (gp->hw_running) - gem_shutdown(gp); - up(&gp->pm_sem); - - pci_free_consistent(pdev, - sizeof(struct gem_init_block), - gp->init_block, - gp->gblock_dvma); - iounmap(gp->regs); - pci_release_regions(pdev); - free_netdev(dev); - - pci_set_drvdata(pdev, NULL); - } -} static struct pci_driver gem_driver = { .name = GEM_MODULE_NAME, Index: linux-2.6.9-sleep/drivers/net/sungem.h =================================================================== --- linux-2.6.9-sleep.orig/drivers/net/sungem.h 2004-10-19 13:37:44.000000000 +1000 +++ linux-2.6.9-sleep/drivers/net/sungem.h 2004-11-26 13:56:30.177908416 +1100 @@ -170,6 +170,27 @@ * them later. -DaveM */ +/* WakeOnLan Registers */ +#define WOL_MATCH0 0x3000UL +#define WOL_MATCH1 0x3004UL +#define WOL_MATCH2 0x3008UL +#define WOL_MCOUNT 0x300CUL +#define WOL_WAKECSR 0x3010UL + +/* WOL Match count register + */ +#define WOL_MCOUNT_N 0x00000010 +#define WOL_MCOUNT_M 0x00000000 /* 0 << 8 */ + +#define WOL_WAKECSR_ENABLE 0x00000001 +#define WOL_WAKECSR_MII 0x00000002 +#define WOL_WAKECSR_SEEN 0x00000004 +#define WOL_WAKECSR_FILT_UCAST 0x00000008 +#define WOL_WAKECSR_FILT_MCAST 0x00000010 +#define WOL_WAKECSR_FILT_BCAST 0x00000020 +#define WOL_WAKECSR_FILT_SEEN 0x00000040 + + /* Receive DMA Registers */ #define RXDMA_CFG 0x4000UL /* RX Configuration Register */ #define RXDMA_DBLOW 0x4004UL /* RX Descriptor Base Low */ @@ -961,11 +982,12 @@ /* Set when chip is actually in operational state * (ie. not power managed) */ - int hw_running; - int opened; + int asleep; /* chip asleep, protected by pm_sem */ + int asleep_wol; /* was asleep with WOL enabled */ + int cell_enabled; /* cell enable count, protected by lock */ + int opened; /* driver opened, protected by pm_sem */ + int running; /* chip running, protected by lock */ struct semaphore pm_sem; - struct work_struct pm_task; - struct timer_list pm_timer; struct gem_init_block *init_block; Index: linux-2.6.9-sleep/arch/ppc/platforms/pmac_feature.c =================================================================== --- linux-2.6.9-sleep.orig/arch/ppc/platforms/pmac_feature.c 2004-11-24 17:56:19.000000000 +1100 +++ linux-2.6.9-sleep/arch/ppc/platforms/pmac_feature.c 2004-11-26 13:56:30.182907656 +1100 @@ -1688,8 +1688,11 @@ */ save_unin_clock_ctl = UN_IN(UNI_N_CLOCK_CNTL); + /* Note: do not switch GMAC off, driver does it when necessary, WOL must keep it + * enabled ! + */ UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl & - ~(UNI_N_CLOCK_CNTL_GMAC|UNI_N_CLOCK_CNTL_FW/*|UNI_N_CLOCK_CNTL_PCI*/)); + ~(/*UNI_N_CLOCK_CNTL_GMAC|*/UNI_N_CLOCK_CNTL_FW/*|UNI_N_CLOCK_CNTL_PCI*/)); udelay(100); UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_SLEEPING); UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_SLEEP); From benh@kernel.crashing.org Fri Nov 26 00:49:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 00:49:32 -0800 (PST) Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQ8nQ1K012487 for ; Fri, 26 Nov 2004 00:49:26 -0800 Received: from gaston (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id iAQ8jggJ000737 for ; Fri, 26 Nov 2004 02:45:43 -0600 Subject: netdev ioctl & dev_base_lock : bad idea ? From: Benjamin Herrenschmidt To: netdev@oss.sgi.com Content-Type: text/plain Date: Fri, 26 Nov 2004 19:48:49 +1100 Message-Id: <1101458929.28048.9.camel@gaston> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 Content-Transfer-Encoding: 7bit X-archive-position: 12233 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: benh@kernel.crashing.org Precedence: bulk X-list: netdev Hi ! While working on simplifying sungem, I had a problem with locking. Basically, I'm forced to do a lot of things under spinlocks, a lot more than I should have to, because in a few places, I can't schedule. This is typically the case of ioctl handling, and more specifically, change_mtu() and set_multicast() callbacks. For some reason, a while ago, those calls got a read_lock(&dev_base_lock) added aroud them in net/core/dev.c. That means they can't schedule, which is by itself a problem, since it force them to use spinlocks as a synchronisation primitive and prevents them to call netif_stop_polling(). Thus, they can't stop NAPI, which force the napi poll() callback to take a lock too (we end up with 2 locks in there now in sungem) while some careful coding (stopping the queue, stopping polling, stopping chip irqs) could have permitted to not do any locking and eventually schedule in a few places where I need to wait some time instead of udelay. I suppose there is a good reason we can't just use the rtnl_sem for these guys, though why isn't dev_base_lock a read/write semaphore instead of a spinlock ? At least on ppc, I don't think there's any overhead in the normal path, and this is not on a very critical path anyway, is it ? Since we never take this lock with irq masking, I suppose there is no problem with trying to lock at irq time, is there ? Or may we try to acquire it occasionally from some contexts where a spinlock is already held ? Ben. From Robert.Olsson@data.slu.se Fri Nov 26 05:22:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 05:22:08 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQDM0iX021480 for ; Fri, 26 Nov 2004 05:22:01 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAQDLZiu020525; Fri, 26 Nov 2004 14:21:35 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 339B4EC001; Fri, 26 Nov 2004 14:21:35 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="1DwC3Xpz0b" Content-Transfer-Encoding: 7bit Message-ID: <16807.11743.172552.438450@robur.slu.se> Date: Fri, 26 Nov 2004 14:21:35 +0100 To: netdev@oss.sgi.com Cc: Robert.Olsson@data.slu.se, hans.liss@its.uu.se, Jens.Laas@data.slu.se Subject: [patch] LC-trie IPv4 routing lookup in Linux X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12234 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev --1DwC3Xpz0b Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit LC-trie for Linux ipv4. Here is the first public Linux implementation of LC-trie for ipv4. It is an experimental alternative to the original fib_hash. LC-trie is often referenced is publications wrt IP routing lookups and have no patent issues. We have confirmed this with the authors.Of course there are lot of issues and things to improve we are planning to test some enhancements when we allocate time for this project again. Performance. We have been testing performance in a forwarding context with route hash disabled. So device drivers/network stack have all been involved. For a few entries in the routing table the performance is equal maybe slightly better than fib_hash. For route DoS w. full BGP table current LC-trie is 20-25% better compared to fib_hash. This in a forward context as described above. To get the numbers above we must merge local/main routing table as Linux routing always looks up local and main. This discussed this with Alexey. The reason for the merge is that backtracking is expensive in trie's. (There are some ideas in this area) Locking. Not yet done. We have been discussing RCU with Dipankar Sarma. There are three obvious wring functions insert/delete/flush. Dipanker gave a weak promise to look how RCU be used as a first option. Route select correctness. Should be done again. We did lookup tests before we moved to kernel space and we compared with fib_hash. Use. We test in small scale production in couple of boxes. LC-trie vs fib_hash fib_hash is a good and proven routing algorithm no doubt. LC-trie advantages is it's very flat tree even with large routing tables and it's ability to support arbitrary bit strings i.e ipv6. Other lookup algorithms. As a side effect of this and davem work to clean up and distill FIB and semantics from lookup. Other lookup algorithms should be somewhar easily to add. The FIB reorg patches sent on this list is needed for the the patch. below copies can be found from: ftp://robur.slu.se/pub/Linux/net-development/LPC-work/kernel/ --1DwC3Xpz0b Content-Type: application/octet-stream Content-Disposition: attachment; filename="LC-trie-041126.pat.gz" Content-Transfer-Encoding: base64 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 --1DwC3Xpz0b Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit Enjoy. --ro --1DwC3Xpz0b-- From P@draigBrady.com Fri Nov 26 06:05:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 06:06:01 -0800 (PST) Received: from corvil.com (gate.corvil.net [213.94.219.177]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQE5t9C023979 for ; Fri, 26 Nov 2004 06:05:56 -0800 Received: from draigBrady.com (pixelbeat.local.corvil.com [172.18.1.170]) by corvil.com (8.12.9/8.12.5) with ESMTP id iAQE5QwS008906; Fri, 26 Nov 2004 14:05:27 GMT (envelope-from P@draigBrady.com) Message-ID: <41A73826.3000109@draigBrady.com> Date: Fri, 26 Nov 2004 14:05:26 +0000 From: P@draigBrady.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en MIME-Version: 1.0 To: mellia@prezzemolo.polito.it CC: e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit References: <1101467291.24742.70.camel@mellia.lipar.polito.it> In-Reply-To: <1101467291.24742.70.camel@mellia.lipar.polito.it> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-archive-position: 12235 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: P@draigBrady.com Precedence: bulk X-list: netdev I'm forwarding this to netdev, as these are very interesting results (even if I don't beleive them). If you point us at the code/versions we will be better able to answer. Marco Mellia wrote: > We are trying to stress the e1000 hardware/driver under linux and Click > to see what is the maximum number of packets per second that can be > received/transmitted by a single NIC. > > We found something which is counterintuitive: > > - in reception, we can receive ALL the traffic, regardeless of the > packet size (or if you prefer, we can receive ALL the minimum sized > packet at gigabit speed) I questioned whether you actually did receive at that rate to which you responded: > - using Click, we can receive 100% of (small) packets at gigabit > speed with TWO cards (2gigabit/s ~ 2.8Mpps) > - using linux and standard e1000 driver, we can receive up to about > 80% of traffic from a single nic (~1.1Mpps) > - using linux and a modified (simplified) version of the driver, we > can receive 100% on a single nic, but not 100% using two nics (up > to ~1.5Mpps). > > Reception means: receiving the packet up to the rx ring at the > kernel level, and then IMMEDIATELY drop it (no packet processing, > no forwarding, nothing more...) > > Using NAPI or IRQ has littel impact (as we are not processing the > packets, the livelock due to the hardIRQ preemption versus the > softIRQ managers is not entered...) > > But the limit in TRANSMISSION seems to be 700Kpps. Regardless of > - the traffic generator, > - the driver version, > - the O.S. (linux/click), > - the hardware (broadcom card have the same limit). > > - in transmission we CAN ONLY trasmit about 700.000 pkt/s when the > minimum sized packets are considered (64bytes long ethernet minumum > frame size). That is about HALF the maximum number of pkt/s considering > a gigabit link. > > What is weird, is that if we artificially "preload" the NIC tx-fifo with > packets, and then instruct it to start sending them, those are actually > transmitted AT WIRE SPEED!! > > These results have been obtained considering different software > generators (namely, UDPGEN, PACKETGEN, Application level generators) > under LINUX (2.4.x, 2.6.x), and under CLICK (using a modified version of > UDPGEN). > > The hardware setup considers > - a 2.8GHz Xeon hardware > - PCI-X bus (133MHz/64bit) > - 1G of Ram > - Intel PRO 1000 MT single, double, and quad cards, integrated or on a > PCI slot. > > Different driver versions have been used, and while there are (small) > differencies when receiving packets, ALL of them present the same > trasmission limits. > > Moreover, the same happen considering other vendors cards (broadcom > based chipset). > > Is there any limit on the PCI-X (or PCI) that can be the bottleneck? > Or Limit on the number of packets per second that can be stored in the > NIC tx-fifo? > May the lenght of the tx-fifo impact on this? > > Any hints will be really appreciated. > Thanks in advance cheers, Pdraig. From iouri@pixartargentina.com.ar Fri Nov 26 06:27:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 06:28:06 -0800 (PST) Received: from mail.pixartargentina.com.ar (customer123-150-221.iplannetworks.net [200.123.150.221] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQERo59004659 for ; Fri, 26 Nov 2004 06:27:51 -0800 Received: from localhost (localhost [127.0.0.1]) by mail.pixartargentina.com.ar (Postfix) with ESMTP id 92CA71FA3C; Fri, 26 Nov 2004 11:19:55 -0300 (ART) Received: from mail.pixartargentina.com.ar ([127.0.0.1]) by localhost (NATIVOMAIL [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 16987-04; Fri, 26 Nov 2004 11:19:54 -0300 (ART) Received: from [192.168.0.118] (unknown [192.168.0.118]) by mail.pixartargentina.com.ar (Postfix) with ESMTP id 353131F9BD; Fri, 26 Nov 2004 11:19:54 -0300 (ART) Message-ID: <41A73FA7.8050502@pixartargentina.com.ar> Date: Fri, 26 Nov 2004 11:37:27 -0300 From: Iouri Atiounkine - Pixart User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.7) Gecko/20040707 Debian/1.7-5 X-Accept-Language: en MIME-Version: 1.0 To: webvenza@libero.it, netdev@oss.sgi.com Subject: Re: 2.6.9 - SiS900 - No MII transceivers found! References: <41A63E19.8080902@pixartargentina.com.ar> In-Reply-To: <41A63E19.8080902@pixartargentina.com.ar> Content-Type: multipart/mixed; boundary="------------070707060004000104010108" X-Virus-Scanned: by amavisd-new-20030616-p5 (Debian) at mail.xandros.com.ar X-archive-position: 12236 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: iouri@pixartargentina.com.ar Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------070707060004000104010108 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi In attached files has included messages then a network interface is working. After the first reboot NIC is still working. After shutdown it not working. Thank you Iouri Atiounkine - Pixart escribi: > Hi > I have two motherboards PC Chips 909G version 1.0. > In this motherboards network interface is SiS900 onboard. > > The network interface does not work always. > Sometimes in both motherboard the network interface is working. > > It work good then computer was turned off for one day or more and until > the power is turned off. > After shutdown (or reboot) it not working at all. > > The problem is at loading module: > > eth0: No MII transceivers found! > > In the case if module loaded good it print a message: > found internal sis900 transceiver. > > The kernel is downloaded from this address: > http://http.us.debian.org/debian/pool/main/k/kernel-image-2.6.9-i386/kernel-image-2.6.9-1-686_2.6.9-2_i386.deb > > > This motherboard has onboard separated SiS900 chip and LAN Transformer - > TD1603C. > > Thank you. > > *********************************** > Here is message of dmesg, lsmod, lspci -n -vv and mii-tool: > *********************************** > R_xart:~# lsmod > Module Size Used by > sis900 20484 0 > mii 4928 0 > mousedev 11576 1 > tsdev 7648 0 > psmouse 21960 0 > uhci_hcd 32944 0 > ohci_hcd 21412 0 > ehci_hcd 32068 0 > usbcore 119396 5 uhci_hcd,ohci_hcd,ehci_hcd > parport_pc 37188 1 > lp 11080 0 > parport 41704 2 parport_pc,lp > i8xx_tco 6996 0 > hw_random 5364 0 > pciehp 98916 0 > shpchp 101924 0 > pci_hotplug 34448 2 pciehp,shpchp > intel_agp 22592 1 > agpgart 34600 2 intel_agp > evdev 9504 0 > crc32 4192 1 sis900 > snd_intel8x0 35276 1 > snd_ac97_codec 73200 1 snd_intel8x0 > snd_pcm_oss 54024 0 > snd_mixer_oss 20192 1 snd_pcm_oss > snd_pcm 98696 2 snd_intel8x0,snd_pcm_oss > snd_timer 25668 1 snd_pcm > snd_page_alloc 9992 2 snd_intel8x0,snd_pcm > gameport 4512 1 snd_intel8x0 > snd_mpu401_uart 7872 1 snd_intel8x0 > snd_rawmidi 24900 1 snd_mpu401_uart > snd_seq_device 7976 1 snd_rawmidi > snd 56804 11 > snd_intel8x0,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer,snd_mpu401_uart,snd_rawmidi,snd_seq_device > > soundcore 10176 1 snd > nls_iso8859_1 3904 1 > nls_cp437 5568 1 > capability 4392 0 > commoncap 7008 1 capability > ide_cd 42592 1 > cdrom 40956 1 ide_cd > rtc 12664 0 > vfat 14528 1 > fat 46624 1 vfat > xfs 616216 0 > reiserfs 248976 1 > romfs 9220 0 > isofs 37208 0 > ext2 70632 1 > ext3 126184 0 > jbd 64056 1 ext3 > mbcache 9220 2 ext2,ext3 > ide_generic 1280 0 > ide_disk 20480 5 > piix 13216 1 > ide_core 143088 4 ide_cd,ide_generic,ide_disk,piix > sd_mod 17904 0 > ata_piix 9028 0 > libata 45540 1 ata_piix > scsi_mod 125676 2 sd_mod,libata > unix 28564 172 > fbcon 40416 0 > font 8128 1 fbcon > vesafb 6656 0 > cfbcopyarea 3936 1 vesafb > cfbimgblt 2880 1 vesafb > cfbfillrect 3584 1 vesafb > > R_xart:~# dmesg > 0000000000100000 - 000000000f7f0000 (usable) > BIOS-e820: 000000000f7f0000 - 000000000f7f8000 (ACPI data) > BIOS-e820: 000000000f7f8000 - 000000000f800000 (ACPI NVS) > BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved) > BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) > BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved) > BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved) > 0MB HIGHMEM available. > 247MB LOWMEM available. > found SMP MP-table at 000fb960 > On node 0 totalpages: 63472 > DMA zone: 4096 pages, LIFO batch:1 > Normal zone: 59376 pages, LIFO batch:14 > HighMem zone: 0 pages, LIFO batch:1 > DMI 2.3 present. > ACPI: RSDP (v000 AMI ) @ 0x000fa000 > ACPI: RSDT (v001 AMIINT INTEL845 0x00000010 MSFT 0x00000097) @ 0x0f7f0000 > ACPI: FADT (v001 AMIINT INTEL845 0x00000011 MSFT 0x00000097) @ 0x0f7f0030 > ACPI: MADT (v001 AMIINT INTEL845 0x00000009 MSFT 0x00000097) @ 0x0f7f00c0 > ACPI: DSDT (v001 INTEL BROKDLEG 0x00001000 MSFT 0x0100000d) @ 0x00000000 > ACPI: PM-Timer IO Port: 0x808 > ACPI: Local APIC address 0xfee00000 > ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled) > Processor #0 15:2 APIC version 20 > ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] disabled) > ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0]) > IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23 > ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) > ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) > ACPI: IRQ0 used by override. > ACPI: IRQ2 used by override. > ACPI: IRQ9 used by override. > Enabling APIC mode: Flat. Using 1 I/O APICs > Using ACPI (MADT) for SMP configuration information > Built 1 zonelists > Kernel command line: root=/dev/hda5 ro > Initializing CPU#0 > PID hash table entries: 1024 (order: 10, 16384 bytes) > Detected 1799.442 MHz processor. > Using pmtmr for high-res timesource > Console: colour VGA+ 80x25 > Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) > Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) > Memory: 243616k/253888k available (1654k kernel code, 9600k reserved, > 723k data, 152k init, 0k highmem) > Checking if this processor honours the WP bit even in supervisor mode... > Ok. > Calibrating delay loop... 3563.52 BogoMIPS (lpj=1781760) > Security Scaffold v1.0.0 initialized > SELinux: Disabled at boot. > Mount-cache hash table entries: 512 (order: 0, 4096 bytes) > CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 > CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 > CPU: Trace cache: 12K uops, L1 D cache: 8K > CPU: L2 cache: 128K > CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 > Intel machine check architecture supported. > Intel machine check reporting enabled on CPU#0. > CPU0: Intel P4/Xeon Extended MCE MSRs (12) available > CPU0: Thermal monitoring enabled > CPU: Intel(R) Celeron(R) CPU 1.80GHz stepping 09 > Enabling fast FPU save and restore... done. > Enabling unmasked SIMD FPU exception support... done. > Checking 'hlt' instruction... OK. > ENABLING IO-APIC IRQs > ..TIMER: vector=0x31 pin1=2 pin2=-1 > checking if image is initramfs...it isn't (ungzip failed); looks like an > initrd > Freeing initrd memory: 4632k freed > NET: Registered protocol family 16 > PCI: PCI BIOS revision 2.10 entry at 0xfdb81, last bus=3 > PCI: Using configuration type 1 > mtrr: v2.0 (20020519) > ACPI: Subsystem revision 20040816 > ACPI: Interpreter enabled > ACPI: Using IOAPIC for interrupt routing > ACPI: PCI Root Bridge [PCI0] (00:00) > PCI: Probing PCI hardware (bus 00) > PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1 > PCI: Transparent bridge - 0000:00:1e.0 > ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] > ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.ICHB._PRT] > ACPI: Power Resource [URP1] (off) > ACPI: Power Resource [URP2] (off) > ACPI: Power Resource [FDDP] (off) > ACPI: Power Resource [LPTP] (off) > ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 10 *11 12 14 15) > ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 *5 6 7 10 11 12 14 15) > ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 10 11 12 14 15) > ACPI: PCI Interrupt Link [LNKD] (IRQs *3 4 5 6 7 10 11 12 14 15) > ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, > disabled. > ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, > disabled. > ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, > disabled. > ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 *10 11 12 14 15) > Linux Plug and Play Support v0.97 (c) Adam Belay > PnPBIOS: Scanning system for PnP BIOS support... > PnPBIOS: Found PnP BIOS installation structure at 0xc00f7330 > PnPBIOS: PnP BIOS version 1.0, entry 0xf0000:0x600b, dseg 0xf0000 > PnPBIOS: Missing SMALL_TAG_ENDDEP tag > PnPBIOS: Missing SMALL_TAG_ENDDEP tag > PnPBIOS: Missing SMALL_TAG_ENDDEP tag > PnPBIOS: Missing SMALL_TAG_ENDDEP tag > PnPBIOS: 13 nodes reported by PnP BIOS; 13 recorded by driver > PCI: Using ACPI for IRQ routing > ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 16 (level, low) -> IRQ 169 > ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 > ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 > ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 > ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 > ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 > ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 > ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 > ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 > VFS: Disk quotas dquot_6.5.1 > Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) > devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au) > devfs: boot_options: 0x0 > Initializing Cryptographic API > isapnp: Scanning for PnP cards... > isapnp: No Plug & Play device found > serio: i8042 AUX port at 0x60,0x64 irq 12 > serio: i8042 KBD port at 0x60,0x64 irq 1 > Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabled > ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A > ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 > ttyS15 at I/O 0xcc08 (irq = 193) is a 16450 > ttyS44 at I/O 0xcc10 (irq = 193) is a 8250 > ttyS45 at I/O 0xcc18 (irq = 193) is a 16450 > ttyS46 at I/O 0xcc20 (irq = 193) is a 8250 > ttyS47 at I/O 0xcc28 (irq = 193) is a 8250 > RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize > input: AT Translated Set 2 keyboard on isa0060/serio0 > NET: Registered protocol family 2 > IP: routing cache hash table of 2048 buckets, 16Kbytes > TCP: Hash tables configured (established 16384 bind 32768) > NET: Registered protocol family 8 > NET: Registered protocol family 20 > ACPI: (supports S0 S1 S4 S5) > ACPI wakeup devices: > USB1 USB2 USB3 EHCI ICHB PS2M PS2K UAR1 MC9 > RAMDISK: cramfs filesystem found at block 0 > RAMDISK: Loading 4632KiB [1 disk] into ram disk... done. > VFS: Mounted root (cramfs filesystem) readonly. > Freeing unused kernel memory: 152k freed > vesafb: probe of vesafb0 failed with error -6 > NET: Registered protocol family 1 > SCSI subsystem initialized > libata version 1.02 loaded. > Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 > ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx > ICH4: IDE controller at PCI slot 0000:00:1f.1 > ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 > ICH4: chipset revision 2 > ICH4: not 100% native mode: will probe irqs later > ide0: BM-DMA at 0xfc00-0xfc07, BIOS settings: hda:DMA, hdb:pio > ide1: BM-DMA at 0xfc08-0xfc0f, BIOS settings: hdc:DMA, hdd:pio > Probing IDE interface ide0... > hda: HDS728040PLAT20, ATA DISK drive > Using anticipatory io scheduler > ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 > hda: max request size: 1024KiB > hda: 80418240 sectors (41174 MB) w/1719KiB Cache, CHS=16383/255/63, > UDMA(33) > hda: cache flushes supported > /dev/ide/host0/bus0/target0/lun0: p1 p2 p3 < p5 p6 > p4 > Probing IDE interface ide1... > hdc: SAMSUNG CD-R/RW SW-252S, ATAPI CD/DVD-ROM drive > ide1 at 0x170-0x177,0x376 on irq 15 > Probing IDE interface ide2... > ide2: Wait for ready failed before probe ! > Probing IDE interface ide3... > ide3: Wait for ready failed before probe ! > Probing IDE interface ide4... > ide4: Wait for ready failed before probe ! > Probing IDE interface ide5... > ide5: Wait for ready failed before probe ! > SGI XFS with ACLs, security attributes, realtime, large block numbers, > no debug enabled > SGI XFS Quota Management subsystem > VFS: Can't find ext3 filesystem on dev hda5. > VFS: Can't find ext2 filesystem on dev hda5. > Unable to identify CD-ROM format. > VFS: Can't find a romfs filesystem on dev hda5. > ReiserFS: hda5: found reiserfs format "3.6" with standard journal > ReiserFS: hda5: using ordered data mode > ReiserFS: hda5: journal params: device hda5, size 8192, journal first > block 18, max trans len 1024, max batch 900, max commit age 30, max > trans age 30 > ReiserFS: hda5: checking transaction log (hda5) > ReiserFS: hda5: Using r5 hash to sort names > Adding 498004k swap on /dev/hda2. Priority:-1 extents:1 > Real Time Clock Driver v1.12 > hdc: ATAPI 52X CD-ROM CD-R/RW drive, 2048kB Cache, UDMA(33) > Uniform CD-ROM driver Revision: 3.20 > Capability LSM initialized > cdrom: open failed. > cdrom: open failed. > cdrom: open failed. > cdrom: open failed. > FAT: bogus number of reserved sectors > VFS: Can't find a valid FAT filesystem on dev hda6. > ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 > PCI: Setting latency timer of device 0000:00:1f.5 to 64 > intel8x0_measure_ac97_clock: measured 49535 usecs > intel8x0: clocking to 48000 > usbcore: registered new driver usbfs > usbcore: registered new driver hub > ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 > ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 > EHCI Controller > PCI: Setting latency timer of device 0000:00:1d.7 to 64 > ehci_hcd 0000:00:1d.7: irq 193, pci mem d017ec00 > ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 > PCI: cache line size of 128 is not supported by device 0000:00:1d.7 > ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 > hub 1-0:1.0: USB hub found > hub 1-0:1.0: 6 ports detected > sis900.c: v1.08.07 11/02/2003 > ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 > eth0: No MII transceivers found! > atmsvc: no signaling demon > Linux agpgart interface v0.100 (c) Dave Jones > agpgart: Detected an Intel 845G Chipset. > agpgart: Maximum main memory to use for agp memory: 196M > agpgart: Detected 8060K stolen memory. > agpgart: AGP aperture is 128M @ 0xd0000000 > USB Universal Host Controller Interface driver v2.2 > ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 > uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #1 > PCI: Setting latency timer of device 0000:00:1d.0 to 64 > uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 > uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 > hub 2-0:1.0: USB hub found > hub 2-0:1.0: 2 ports detected > ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 > uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #2 > PCI: Setting latency timer of device 0000:00:1d.1 to 64 > uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 > uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 > hub 3-0:1.0: USB hub found > hub 3-0:1.0: 2 ports detected > ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 > uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #3 > PCI: Setting latency timer of device 0000:00:1d.2 to 64 > uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 > uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 > hub 4-0:1.0: USB hub found > hub 4-0:1.0: 2 ports detected > cpci_hotplug: CompactPCI Hot Plug Core version: 0.2 > pci_hotplug: PCI Hot Plug PCI Core version: 0.5 > shpchp: shpc_init : shpc_cap_offset == 0 > shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 > pciehp: PCI Express Hot Plug Controller Driver version: 0.4 > hw_random hardware driver 1.0.0 loaded > i8xx TCO timer: initialized (0x0860). heartbeat=30 sec (nowayout=0) > parport: PnPBIOS parport detected. > parport0: PC-style at 0x378 (0x778), irq 7, dma 3 > [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] > lp0: using parport0 (interrupt-driven). > ehci_hcd 0000:00:1d.7: remove, state 1 > usb usb1: USB disconnect, address 1 > ehci_hcd 0000:00:1d.7: USB bus 1 deregistered > uhci_hcd 0000:00:1d.0: remove, state 1 > usb usb2: USB disconnect, address 1 > uhci_hcd 0000:00:1d.0: USB bus 2 deregistered > uhci_hcd 0000:00:1d.1: remove, state 1 > usb usb3: USB disconnect, address 1 > uhci_hcd 0000:00:1d.1: USB bus 3 deregistered > uhci_hcd 0000:00:1d.2: remove, state 1 > usb usb4: USB disconnect, address 1 > uhci_hcd 0000:00:1d.2: USB bus 4 deregistered > usbcore: deregistering driver usbfs > usbcore: deregistering driver hub > usbcore: registered new driver usbfs > usbcore: registered new driver hub > ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 > ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 > EHCI Controller > PCI: Setting latency timer of device 0000:00:1d.7 to 64 > ehci_hcd 0000:00:1d.7: irq 193, pci mem d026ac00 > ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 > PCI: cache line size of 128 is not supported by device 0000:00:1d.7 > ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 > hub 1-0:1.0: USB hub found > hub 1-0:1.0: 6 ports detected > ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI) > USB Universal Host Controller Interface driver v2.2 > ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 > uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #1 > PCI: Setting latency timer of device 0000:00:1d.0 to 64 > uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 > uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 > hub 2-0:1.0: USB hub found > hub 2-0:1.0: 2 ports detected > ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 > uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #2 > PCI: Setting latency timer of device 0000:00:1d.1 to 64 > uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 > uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 > hub 3-0:1.0: USB hub found > hub 3-0:1.0: 2 ports detected > ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 > uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) > USB UHCI Controller #3 > PCI: Setting latency timer of device 0000:00:1d.2 to 64 > uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 > uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 > hub 4-0:1.0: USB hub found > hub 4-0:1.0: 2 ports detected > input: ImPS/2 Generic Wheel Mouse on isa0060/serio1 > ts: Compaq touchscreen protocol output > mice: PS/2 mouse device common for all mice > sis900.c: v1.08.07 11/02/2003 > ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 > eth0: No MII transceivers found! > R_xart:~# ifconfig eth0 up > eth0: ERROR while getting interface flags: No existe tal dispositivo > R_xart:~# mii-tool -vv > Using SIOCGMIIPHY=0x8947 > no MII interfaces found > > R_xart:~# lspci > 0000:00:00.0 Host bridge: Intel Corp. 82845G/GL[Brookdale-G]/GE/PE DRAM > Controller/Host-Hub Interface (rev 03) > 0000:00:02.0 VGA compatible controller: Intel Corp. > 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 03) > 0000:00:1d.0 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #1 (rev > 02) > 0000:00:1d.1 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #2 (rev > 02) > 0000:00:1d.2 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #3 (rev > 02) > 0000:00:1d.7 USB Controller: Intel Corp. 82801DB (ICH4) USB2 EHCI > Controller (rev 02) > 0000:00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB/ER Hub interface > to PCI Bridge (rev 82) > 0000:00:1f.0 ISA bridge: Intel Corp. 82801DB (ICH4) LPC Bridge (rev 02) > 0000:00:1f.1 IDE interface: Intel Corp. 82801DB (ICH4) Ultra ATA 100 > Storage Controller (rev 02) > 0000:00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4) > AC'97 Audio Controller (rev 02) > 0000:03:03.0 Modem: PCTel Inc: Unknown device 2189 (rev 04) > 0000:03:07.0 Ethernet controller: Silicon Integrated Systems [SiS] > SiS900 PCI Fast Ethernet (rev 02) > > R_xart:~# lspci -n -vv > 0000:00:00.0 Class 0600: 8086:2560 (rev 03) > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- > SERR- Latency: 0 > Region 0: Memory at e0000000 (32-bit, prefetchable) > Capabilities: [e4] #09 [1105] > > 0000:00:02.0 Class 0300: 8086:2562 (rev 03) > Subsystem: 8086:2562 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- > SERR- Latency: 0 > Interrupt: pin A routed to IRQ 169 > Region 0: Memory at d0000000 (32-bit, prefetchable) > Region 1: Memory at dff80000 (32-bit, non-prefetchable) [size=512K] > Capabilities: [d0] Power Management version 1 > Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA > PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 0000:00:1d.0 Class 0c03: 8086:24c2 (rev 02) > Subsystem: 8086:24c0 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin A routed to IRQ 169 > Region 4: I/O ports at e400 [size=32] > > 0000:00:1d.1 Class 0c03: 8086:24c4 (rev 02) > Subsystem: 8086:24c0 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin B routed to IRQ 177 > Region 4: I/O ports at e800 [size=32] > > 0000:00:1d.2 Class 0c03: 8086:24c7 (rev 02) > Subsystem: 8086:24c0 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin C routed to IRQ 185 > Region 4: I/O ports at ec00 [size=32] > > 0000:00:1d.7 Class 0c03: 8086:24cd (rev 02) (prog-if 20) > Subsystem: 8086:24c0 > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin D routed to IRQ 193 > Region 0: Memory at dff7bc00 (32-bit, non-prefetchable) > Capabilities: [50] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA > PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [58] #0a [2080] > > 0000:00:1e.0 Class 0604: 8086:244e (rev 82) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR+ FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- > SERR- Latency: 0 > Bus: primary=00, secondary=03, subordinate=03, sec-latency=32 > I/O behind bridge: 0000c000-0000cfff > Memory behind bridge: dfd00000-dfdfffff > BridgeCtl: Parity- SERR+ NoISA+ VGA- MAbort- >Reset- FastB2B- > > 0000:00:1f.0 Class 0601: 8086:24c0 (rev 02) > Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > > 0000:00:1f.1 Class 0101: 8086:24cb (rev 02) (prog-if 8a [Master SecP PriP]) > Subsystem: 8086:24c0 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin A routed to IRQ 185 > Region 0: I/O ports at > Region 1: I/O ports at > Region 2: I/O ports at > Region 3: I/O ports at > Region 4: I/O ports at fc00 [size=16] > Region 5: Memory at 10000000 (32-bit, non-prefetchable) [size=1K] > > 0000:00:1f.5 Class 0401: 8086:24c5 (rev 02) > Subsystem: 1019:a00a > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 0 > Interrupt: pin B routed to IRQ 201 > Region 0: I/O ports at e000 > Region 1: I/O ports at dc00 [size=64] > Region 2: Memory at dff7ba00 (32-bit, non-prefetchable) [size=512] > Region 3: Memory at dff7b900 (32-bit, non-prefetchable) [size=256] > Capabilities: [50] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA > PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 0000:03:03.0 Class 0703: 134d:2189 (rev 04) > Subsystem: 134d:1002 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- > ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 32 (250ns min, 15500ns max), Cache Line Size: 0x08 (32 > bytes) > Interrupt: pin A routed to IRQ 193 > Region 0: Memory at dfdff000 (32-bit, non-prefetchable) > Region 1: I/O ports at cc00 [size=256] > Capabilities: [80] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA > PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 0000:03:07.0 Class 0200: 1039:0900 (rev 02) > Subsystem: 1039:0900 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- > SERR- Latency: 32 (13000ns min, 2750ns max) > Interrupt: pin A routed to IRQ 185 > Region 0: I/O ports at c800 [size=dfdc0000] > Region 1: Memory at dfdfe000 (32-bit, non-prefetchable) [size=4K] > Expansion ROM at 00020000 [disabled] > Capabilities: [40] Power Management version 1 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA > PME(D0+,D1+,D2+,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > R_xart:~# > R_xart:~# uname -a > Linux R_xart 2.6.9-1-686 #1 Tue Nov 16 17:52:21 JST 2004 i686 GNU/Linux > > -- ---------------------------------------------------------- Iouri Atiounkine Buenos Aires, Argentina --------------070707060004000104010108 Content-Type: text/plain; name="dmesg-good.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="dmesg-good.txt" 000 - 00000000fee01000 (reserved) BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved) BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved) 0MB HIGHMEM available. 247MB LOWMEM available. found SMP MP-table at 000fb960 On node 0 totalpages: 63472 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 59376 pages, LIFO batch:14 HighMem zone: 0 pages, LIFO batch:1 DMI 2.3 present. ACPI: RSDP (v000 AMI ) @ 0x000fa000 ACPI: RSDT (v001 AMIINT INTEL845 0x00000010 MSFT 0x00000097) @ 0x0f7f0000 ACPI: FADT (v001 AMIINT INTEL845 0x00000011 MSFT 0x00000097) @ 0x0f7f0030 ACPI: MADT (v001 AMIINT INTEL845 0x00000009 MSFT 0x00000097) @ 0x0f7f00c0 ACPI: DSDT (v001 INTEL BROKDLEG 0x00001000 MSFT 0x0100000d) @ 0x00000000 ACPI: PM-Timer IO Port: 0x808 ACPI: Local APIC address 0xfee00000 ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled) Processor #0 15:2 APIC version 20 ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] disabled) ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0]) IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23 ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) ACPI: IRQ0 used by override. ACPI: IRQ2 used by override. ACPI: IRQ9 used by override. Enabling APIC mode: Flat. Using 1 I/O APICs Using ACPI (MADT) for SMP configuration information Built 1 zonelists Kernel command line: root=/dev/hda5 ro Initializing CPU#0 PID hash table entries: 1024 (order: 10, 16384 bytes) Detected 1799.435 MHz processor. Using pmtmr for high-res timesource Console: colour VGA+ 80x25 Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) Memory: 243616k/253888k available (1654k kernel code, 9600k reserved, 723k data, 152k init, 0k highmem) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay loop... 3563.52 BogoMIPS (lpj=1781760) Security Scaffold v1.0.0 initialized SELinux: Disabled at boot. Mount-cache hash table entries: 512 (order: 0, 4096 bytes) CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 CPU: Trace cache: 12K uops, L1 D cache: 8K CPU: L2 cache: 128K CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. CPU0: Intel P4/Xeon Extended MCE MSRs (12) available CPU0: Thermal monitoring enabled CPU: Intel(R) Celeron(R) CPU 1.80GHz stepping 09 Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Checking 'hlt' instruction... OK. ENABLING IO-APIC IRQs ..TIMER: vector=0x31 pin1=2 pin2=-1 checking if image is initramfs...it isn't (ungzip failed); looks like an initrd Freeing initrd memory: 4632k freed NET: Registered protocol family 16 PCI: PCI BIOS revision 2.10 entry at 0xfdb81, last bus=3 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20040816 ACPI: Interpreter enabled ACPI: Using IOAPIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1 PCI: Transparent bridge - 0000:00:1e.0 ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.ICHB._PRT] ACPI: Power Resource [URP1] (off) ACPI: Power Resource [URP2] (off) ACPI: Power Resource [FDDP] (off) ACPI: Power Resource [LPTP] (off) ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 10 *11 12 14 15) ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 *5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKD] (IRQs *3 4 5 6 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 *10 11 12 14 15) Linux Plug and Play Support v0.97 (c) Adam Belay PnPBIOS: Scanning system for PnP BIOS support... PnPBIOS: Found PnP BIOS installation structure at 0xc00f7330 PnPBIOS: PnP BIOS version 1.0, entry 0xf0000:0x600b, dseg 0xf0000 PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: Missing SMALL_TAG_ENDDEP tag PnPBIOS: 13 nodes reported by PnP BIOS; 13 recorded by driver PCI: Using ACPI for IRQ routing ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 16 (level, low) -> IRQ 169 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 VFS: Disk quotas dquot_6.5.1 Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au) devfs: boot_options: 0x0 Initializing Cryptographic API isapnp: Scanning for PnP cards... isapnp: No Plug & Play device found serio: i8042 AUX port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabled ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A ACPI: PCI interrupt 0000:03:03.0[A] -> GSI 23 (level, low) -> IRQ 193 ttyS15 at I/O 0xcc08 (irq = 193) is a 16450 ttyS44 at I/O 0xcc10 (irq = 193) is a 8250 ttyS45 at I/O 0xcc18 (irq = 193) is a 16450 ttyS46 at I/O 0xcc20 (irq = 193) is a 8250 ttyS47 at I/O 0xcc28 (irq = 193) is a 8250 RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize input: AT Translated Set 2 keyboard on isa0060/serio0 NET: Registered protocol family 2 IP: routing cache hash table of 2048 buckets, 16Kbytes TCP: Hash tables configured (established 16384 bind 32768) NET: Registered protocol family 8 NET: Registered protocol family 20 ACPI: (supports S0 S1 S4 S5) ACPI wakeup devices: USB1 USB2 USB3 EHCI ICHB PS2M PS2K UAR1 MC9 RAMDISK: cramfs filesystem found at block 0 RAMDISK: Loading 4632KiB [1 disk] into ram disk... |/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/done. VFS: Mounted root (cramfs filesystem) readonly. Freeing unused kernel memory: 152k freed vesafb: probe of vesafb0 failed with error -6 NET: Registered protocol family 1 SCSI subsystem initialized libata version 1.02 loaded. Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx ICH4: IDE controller at PCI slot 0000:00:1f.1 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 185 ICH4: chipset revision 2 ICH4: not 100% native mode: will probe irqs later ide0: BM-DMA at 0xfc00-0xfc07, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0xfc08-0xfc0f, BIOS settings: hdc:DMA, hdd:pio Probing IDE interface ide0... hda: HDS728040PLAT20, ATA DISK drive Using anticipatory io scheduler ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 hda: max request size: 1024KiB hda: 80418240 sectors (41174 MB) w/1719KiB Cache, CHS=16383/255/63, UDMA(33) hda: cache flushes supported /dev/ide/host0/bus0/target0/lun0: p1 p2 p3 < p5 p6 > p4 Probing IDE interface ide1... hdc: SAMSUNG CD-R/RW SW-252S, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 Probing IDE interface ide2... ide2: Wait for ready failed before probe ! Probing IDE interface ide3... ide3: Wait for ready failed before probe ! Probing IDE interface ide4... ide4: Wait for ready failed before probe ! Probing IDE interface ide5... ide5: Wait for ready failed before probe ! SGI XFS with ACLs, security attributes, realtime, large block numbers, no debug enabled SGI XFS Quota Management subsystem VFS: Can't find ext3 filesystem on dev hda5. VFS: Can't find ext2 filesystem on dev hda5. Unable to identify CD-ROM format. VFS: Can't find a romfs filesystem on dev hda5. ReiserFS: hda5: found reiserfs format "3.6" with standard journal ReiserFS: hda5: using ordered data mode ReiserFS: hda5: journal params: device hda5, size 8192, journal first block 18, max trans len 1024, max batch 900, max commit age 30, max trans age 30 ReiserFS: hda5: checking transaction log (hda5) ReiserFS: hda5: Using r5 hash to sort names Adding 498004k swap on /dev/hda2. Priority:-1 extents:1 Real Time Clock Driver v1.12 hdc: ATAPI 52X CD-ROM CD-R/RW drive, 2048kB Cache, UDMA(33) Uniform CD-ROM driver Revision: 3.20 Capability LSM initialized cdrom: open failed. cdrom: open failed. cdrom: open failed. cdrom: open failed. FAT: bogus number of reserved sectors VFS: Can't find a valid FAT filesystem on dev hda6. ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 17 (level, low) -> IRQ 201 PCI: Setting latency timer of device 0000:00:1f.5 to 64 intel8x0_measure_ac97_clock: measured 49529 usecs intel8x0: clocking to 48000 usbcore: registered new driver usbfs usbcore: registered new driver hub ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 EHCI Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 193, pci mem d017ec00 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 6 ports detected sis900.c: v1.08.07 11/02/2003 ACPI: PCI interrupt 0000:03:07.0[A] -> GSI 18 (level, low) -> IRQ 185 eth0: SiS 900 Internal MII PHY transceiver found at address 1. eth0: Using transceiver found at address 1 as default eth0: SiS 900 PCI Fast Ethernet at 0xc800, IRQ 185, 00:11:5b:22:e2:dd. atmsvc: no signaling demon Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected an Intel 845G Chipset. agpgart: Maximum main memory to use for agp memory: 196M agpgart: Detected 8060K stolen memory. agpgart: AGP aperture is 128M @ 0xd0000000 USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 PCI: Setting latency timer of device 0000:00:1d.2 to 64 uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected cpci_hotplug: CompactPCI Hot Plug Core version: 0.2 pci_hotplug: PCI Hot Plug PCI Core version: 0.5 shpchp: shpc_init : shpc_cap_offset == 0 shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 pciehp: PCI Express Hot Plug Controller Driver version: 0.4 hw_random hardware driver 1.0.0 loaded i8xx TCO timer: initialized (0x0860). heartbeat=30 sec (nowayout=0) eth0: Media Link On 100mbps full-duplex parport: PnPBIOS parport detected. parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] lp0: using parport0 (interrupt-driven). ehci_hcd 0000:00:1d.7: remove, state 1 usb usb1: USB disconnect, address 1 ehci_hcd 0000:00:1d.7: USB bus 1 deregistered uhci_hcd 0000:00:1d.0: remove, state 1 usb usb2: USB disconnect, address 1 uhci_hcd 0000:00:1d.0: USB bus 2 deregistered uhci_hcd 0000:00:1d.1: remove, state 1 usb usb3: USB disconnect, address 1 uhci_hcd 0000:00:1d.1: USB bus 3 deregistered uhci_hcd 0000:00:1d.2: remove, state 1 usb usb4: USB disconnect, address 1 uhci_hcd 0000:00:1d.2: USB bus 4 deregistered usbcore: deregistering driver usbfs usbcore: deregistering driver hub usbcore: registered new driver usbfs usbcore: registered new driver hub ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 23 (level, low) -> IRQ 193 ehci_hcd 0000:00:1d.7: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 EHCI Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 193, pci mem d026ac00 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 6 ports detected ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI) USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 169 uhci_hcd 0000:00:1d.0: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 169, io base 0000e400 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 177 uhci_hcd 0000:00:1d.1: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 177, io base 0000e800 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 185 uhci_hcd 0000:00:1d.2: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 PCI: Setting latency timer of device 0000:00:1d.2 to 64 uhci_hcd 0000:00:1d.2: irq 185, io base 0000ec00 uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected input: ImPS/2 Generic Wheel Mouse on isa0060/serio1 ts: Compaq touchscreen protocol output mice: PS/2 mouse device common for all mice NET: Registered protocol family 17 NET: Registered protocol family 10 Disabled Privacy Extensions on device c0322340(lo) IPv6 over IPv4 tunneling driver eth0: no IPv6 routers present --------------070707060004000104010108 Content-Type: text/plain; name="mii-tool-vv-good.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mii-tool-vv-good.txt" Using SIOCGMIIPHY=0x8947 eth0: negotiated 100baseTx-FD, link ok registers for MII PHY 1: 1000 782d 001d 8000 01e1 45e1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0022 ff00 00d0 ffc0 0020 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 product info: vendor 00:07:60, model 0 rev 0 basic mode: autonegotiation enabled basic status: autonegotiation complete, link ok capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control --------------070707060004000104010108-- From webmaster@usa.net Fri Nov 26 06:53:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 06:53:59 -0800 (PST) Received: from dniekph.net ([62.8.160.156]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAQErfZ5020188; Fri, 26 Nov 2004 06:53:42 -0800 From: webmaster@usa.net To: netdev@oss.sgi.com Date: Fri, 26 Nov 2004 14:45:14 UTC Subject: Mail_Delivery_failure Importance: Normal X-Mailer: E-SMTP V10.1 X-Priority: 3 (Normal) X-MSMail-Priority: Normal Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="====4cd73e2.fa7cdcd7d0aa4a82" Content-Transfer-Encoding: 7bit X-archive-position: 12237 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webmaster@usa.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --====4cd73e2.fa7cdcd7d0aa4a82 This mail was generated automatically. More info about --USA-- under: http://www.usa.net ------- Occured_Errors: 21.224.32.233_failed_after_I_sent_the_message. # 356: Remote_host_said:_delivery_error # 200: This_account_has_been_disabled_[#188]. # 233: Giving_up_on_21.224.32.233. # 250: MAILBOX NOT FOUND End ------- The full mail is attached. Auto_Mail.System: [usa] *-*-* Mail_Scanner: No Virus *-*-* OSS.SGI- Anti_Virus Service *-*-* http://www.oss.sgi.com --====4cd73e2.fa7cdcd7d0aa4a82 Content-Type: application/octet-stream; name=usa.8669.pif Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="usa.8669.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAuAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAACPivnby+uXiMvrl4jL65eISPeZiMrrl4ii9J6IyuuXiCL0mojK65eIUmlj aMvrl4gAAAAAAAAAAFBFAABMAQMACIydQQAAAAAAAAAA4AAPAQsBBgAAMAAAABAAAACAAACgsAAA AJAAAADAAAAAAEAAABAAAAACAAAEAAAAAQAAAAQAAAAAAAAAANAAAAAQAAAAAAAAAgAAAAAAEAAA EAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAAQMIAAJwAAAAAwAAAQAIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBYMAAAAAAAgAAAABAAAAAAAAAABAAA AAAAAAAAAAAAAAAAgAAA4FVQWDEAAAAAADAAAACQAAAAIgAAAAQAAAAAAAAAAAAAAAAAAEAAAOAu cnNyYwAAAAAQAAAAwAAAAAQAAAAmAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACU wgAAfMIAAAAAAAAAAAAAAAAAAKHCAACMwgAAAAAAAAAAAAAAAAAAAAAAAAAAAACuwgAAvMIAAMzC AAAAAAAAagIAgAAAAABLRVJORUwzMi5ETEwATVNWQlZNNjAuRExMAAAATG9hZExpYnJhcnlBAABH ZXRQcm9jQWRkcmVzcwAARXhpdFByb2Nlc3MAAAAAAAAAUEsDBAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAbWVzc2FnZV90ZXh0LnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLnBpZgAAAFBLAQIUAAoAAAAAAOwEbTHUQu4M6N0AAOjd AABPAAAAAAAAAAAAIAD/gQAAAABtZXNzYWdlX3RleHQudHh0ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlmUEsFBgAAAAABAAEAfQAA AFXeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjXibVxTb2Jhci0gupF0c9tobPxz c2VsNW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvum1fU2F933wtlEyjVctiJKHd JxsMH1UeFRw0BhMETgRFAwgcEA5OCEZcBgpiIU4KGxB1bSAhLUp5Yn9ne1NvYmVyLSCIrA2p6st7 dfrQcuX8zXD6Wctr4ObEM+SGz3qnoc5xpxPYWMGoiUjWdCQuJsCMQOZybV9Tb2Jlci0gRW50c2No bPxzc2VsdW43NlN0PmhtZ278+zJkLixtZi5zZKJILytUXiBNTf5JL1d/cm1fs25i9eYvIEWedXNj yG78c3MlbHV+Z3NTdnJpamckbWdzZC4obWYuc2RCSCCaXV8mXU1OSS9Xb3BtX1NvYnVyLTBFbnRz c2hs7HNzZWx1bndzU3RyaW5nJG1mcySMLm36LnNkQugiKh9dJk1NTkkvV29ybV9Tb2Jlci0gRW50 c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dvcm1fU29iZXItIEVu dHNjaGz8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX78nTU1eSS9Xb3JtX1dvYmVyLSBF bnRzY2hs/PNzZYx1bmdzU3RyaW7XJG1mg2UuLMtmLnNgQkggKl9fJk1NTkkvV28ybV+zQRAWAE4g RW50Y2NobFxxc2VodW5n2VN0cmluZyRtZnNkLixtJi5zpEJIICpfXyZNCt7fuc7pMSoL2/7q6jFq cxHm5fvsKytq+P/15vH96zDU5vQqKP+y5fP19r+l4exy6CcFzrejz823DgoaHXsUKP7iwwo2OSY1 uqTT4C0oOCsrafv5PDYuLSD92+Hj4eE+fS7q+/+9o//zpjD1yt+2osrGqsvF2Aq12/7n/tkQ9e70 +aWv1i3u//Li6Gv7MP/g5Ony/8r85yr747399OLjbano7qr568oLuqbO2KnC0NbabNLl6frY3OAh 8+67utD25ST4K/Zw4uv26zb49+UQ4vTt/jFxLvDv8rmk/SWq6vfX2rei2ch61g7W36rV6DHh0wQ3 OvT/emMN6u3g9vr7dPXkJvvx+OnjweUx4fX0q//z+/FtoPzxu/v1xt9jv9fVrsrB2Qq5y/ni/84Q /fPi+m61zerz4+sr4Kjm6z875Dkk+cHz4Crk9XA1MeEntKD84bf0OBkLaLzG2a3f29kKZ87j5PXb 3OX64eeqYw30+OLs+uZu4jDv/i059TDf+Cr44zBnJej38r2k+PCg7yfa3rWmztOxDk1OSS9Xb3Jt X1NvYmVyISlHZPu2lF+fqEQPNhR3bubXU3Ry6WxnAmpmEpuPBP1mK3NsQsC+al+ysJJwwU4IV3ty ROs6bFPRr5/523nsYWQGZ2NhcEXXE7dTx/PU3tFpcIXeetdXLehnxBg+t3YFQbnygN9Y1+ggufQo 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 T3Fd3pUusX43GD1HGteVtAFCQmmDhnYNqqoy/2dKcTv9RhVDspAK2fZuXxN1oksAXlIPaA/pAFQc 2wNzhdMaLnRrOHSnH2xnJG1mc2QuLP2ZLnNkQkggKl9fJk1NTkkvN9FynR5T4txlUtPfEu25jIh4 /Gzj4/X8/2gh+1Qzc7IbYK9z5Z2YP/cfi5ZyZEJIIfEqWK1TzqC1Pox+smyEIIAXbPkzo6uSZagQ jF018JtmHnivh3vZcjTqnphQGe+2ZfVZau0w8Iq+Wfs7ll79OErFV6y5k2O2TpoaQiRz9lVC5Wrw jZR9J2K6ZLcGgRJ62Grxh5J2/x6C8KUsrZBm3YybwZkhp0twpbCxOEalVS36ahgaGpWMEdLfuv7/ ceCqaHV08KJo9odjBKJ1vYAimNuSOPqTlwl+Zi75YwVkyBZeKNHNckk83dxo+DJbNa6KbbPtMMOq XYvjg4T9g/pi77Jr7quxrf/Xbhcmbe10be5YKO1xd+nGeGC4XV8nvh3Njieo+Q7/XVP66GI1JeAx sv2KGm9jS3Q0NSvMOS+B/SGN/+71Jm1vsxAppW7l7XePmre2rs1dJiykce7SqG9ybV9Tb2Jlci0g RW50c2NobPxzc2VsP//6Mkl0cmluZyVtdnNkLjRtZq5zZEJIarvCHjxNTU5JL1Zvc21fU19iZfIt IEVuPuL+KXb8c3NlbHRuYHdTdDppbmd4zWRzgC8sbdYqc2RCSCAqBy8kTalPfS9Xb3JtX1NvYmVy LSBFbnRzK+z1efn87S89+PvlxPziFuHxoPvwMCyooOb0uOQnCtqvotTXqd4OCcK62PPh/AkLLPT3 6ryn1erlMOX6/XX5/OL5Nunr5tvy5Som8bj78ebgbWv/4av1MBsLZ7rJ0qHIyxodbBD/5PvT2f40 NjG3rNTm7/sg4Pdv/OHw5PIt4P/G/PT++CS0/vH167yo4/Bt/zDX0Hh9zghlwRka3HcA/iUuytvr 7f3hqnYQLef78uT6v+n/9Pr+5uj81jc67ff0rvXi5uNtZOT0vPTo08JjrsccvN/Y3gq/weXk+MYF OiHy+qWuyeniMPP+6XP35fIvPfnj5d3iDf/34a//8OQnZrzp66owLMbRqrLbyqEOBdjBus7j9OXJ EPXu9OSxtgbi4evyPy/8c3NlbHVuZ3NTdHJpbmckbWZzZC4sbWYuc2RCSCAqX18mTU1OSS9Xb3Jt X1NvYmVyLSBFbnRzY2hs/HNzZWx1bmdzU3RyaW5nJG1mc2QuLG1mLnNkQkggKl9fJk1NTkkvV29y bV9Tb2Jlci0gRW50c2NobPxzc2VsdW5nc1N0cmluZyRtZnNkLixtZi5zZEJIICpfXyZNTU5JL1dv cm1fU29iZXItIEVudHNjaGz8c3NlbHVuZ3PH1nBpEsUmbWZzZC4sbWYuc2RCSIGIXV+q709OSS9X b3JtX1NvYmVyLSBFbnRzY2jCXnFz2c53bqvRUXRyaW5nYW9m82QuLG0tayEqBwQTGHEbagFNAxp5 FTk/W299Ky4pci0gCQEVFy8BDo4SARwtdW4gFickAAYNJkAJFBYXXSxtI1YaEBI6T0k6LFVNTU5J L1dvOuLJ1/n08zG3sMn94er17i9t9+rh/+P74TDJ+OPu/P25LuPh8229/fC+5PcUHWO609mz39vc wLgUJ+TxycTn8jMnqrXJ9/wlNiv+a/Xo/uc2Jv3l2+Hr4fskbPvo7/Wmu+n/pjAs2N6ov8bXsw4F ytC53/rr5Rwb6/vz+ri5zTs39OznNXvl7/Mv5usk6cvn9e3576Mu7f3ssm/98KLp6NMTd2nJxrfG 39jebM3//v7Kyvn4JjqrttD44jDk/fV79PzqL/L7/uXP4jH/8vGo/OrkJ7666/S/+ifYxLGh0My1 GxgN2bnH+fTk1RD5/+P5v7bSLfv38vn6ZfUw7frz5ejgEOLr7+X1svrt/Pdtoen2vvvxF9mnaRfW qtjF1M2g2Pnr+Bzf/ury4qmxBvjo4+f5+3T1JTAv4/Lx5Nvk5Cro8bH7MCYnqLr48LglMQEOrLvI BH/PGRcKadv+5TYG0Tk3Jjq+r8Hy5Psg5uZh+f7r//P0JO7B5frt4eOx/SU76qq6/u675erezLmi ztVl29TYwr3B+DH419fg+vb1brbc5ebl9Cv2cOL86f37ODIwFeH2/+rhovsl9/Giu+klvuX+ztlj YsrXrBsbDdyn3TkkLs/F/iEt9ris0uo36vjv/HbmJTAv5PTr7hA89ebh8qznJfz2qqs7M23l+NTf qLrZzbfEwcQfeSj57vvIxuv+JvylvNXk4TDl+v5zMOX85+P5JObb/uTw+CS+4ff09rRvJfCy4+Db C7GiyNCq3MMYHGzN4+PqzsU5NybnparT9/IlNiskderg8P7i5uHkEDzn4eQxcS4u4OC/q+nit/v1 yMSxohzJv8vG3N+4wTsmLhfJ4/Pz4KuuBuLn4/H5L7Tk//Xk4C3t/9nw9+X5JL7h9+TguKIuIaL7 69DMp2kZ067C38rObNzr/eLNyeft8jGqtcn3/Ob1F/pl9fj3+uIt9/vU+PY/OySs9vX89rukLi64 7/LS2rGxzByw0dvC2KbFLOjhztfj7ibkv7jU6fLh8uEvbOXl9ebg6Tb7yPwx+fjgsv7zMCymqPv6 quon0cSvptYcsNHbwdul2/4x6cjV5DQxJHp4Bibw5OXjOqglJD0v5ffx9RDi+vz366Ll4DAstLrl 87f78QEApLPJ17PUxRgKucv59f/Nxiz46eOltcLi4TD07Ppy/+Pv+Tb06+LA4vUqJvG4+/H79FG6 5fO3/+LK3mOtxAlzxsbB2mzB9/TmzcX4IfP1oaTW/Tc7+eT9a//j7S89+PvlxPziFvTrteL0+fa/ b/fqv/To18CmvRwXsNHb2cG/KPj2+9HD5fcmOqOn2Obh++nn4L/0+vP18y39/8L7/uz4JLX/9+/2 tm/39rziMhcLuqbOybEOBcPNttMs6OHO1OP37fS6Y9/i5ejwK+Vk/evq6OXm8jAb++Tt+PFn9Or0 7Ly9+zB7MPLe3ru5HMm628/V2mwf+err1MH59Sb5obHSLe7/8v3kqCow8/Xz5TTlxDf++Pnvsfzu 5Cdmq/j8ueX1FhFjvdHarsLCxtKnFPfh6tvE5+D3925ow+nn/Of0L7T76Pbj5+Lv5hD74O3p77Hv 9/f0pm8l4L388tXQpWnF07faydjHuRT24frK1/Mh8Pqpr9Po//vkK+dn9PvsLz3+8f/b7/rvODJn /fD57aK3LvO99fTQ2WO6yc6w2w4G2bnGLOPpxtf8+DMnbmjW6vL95+Lkv/zm4PEjOyTpwvzl5vzt qPwlO/y9tC72uOL01MK2acfJrtjB395sx/no4c7F+vsmNaKyyi3l9/r+6njiKjIv6OH66N7vMfPi 9rz+4SUxbbz98L/j7NTeqLvV17PV3snNuN8s/f3JxSz0/PSmstP54zD55P1qJSYm9u3q9zDJ+OPm /O2o/CX0/buq//enMPPS26ml1xy8GxjM37kU9f782dfg5CbntbHC4fsnOiv6YOX19/38LfT31fr2 4+YkquHp/OG2uuYlZv3ozcelssnUZdjV386g2Czj5cjF9uTzMbek3ej75CDn+mz35SYk7+L268Dz 9v7mJKj89+Hipr3676L87BPVrLkcya7W3tzfo8Dj4PzJBj7/6eFuaNPh8vjx/vu/4uHw++f/JDvF 6OT+5vdb+//177y6+iWo4fbNC2i728yi2svFCrXG5+X91cYs5+Pru7XcOCEw6Pr7b/zr7y/g9vb0 wuQx8+L2rv8l9uC0oPzhvDAsxMWorMjNsw7bysOrwOcx+8PF4/Ps4Ht1Bvnh9+XgOqkwJTMv+vjj 5cbtMfPi9qP//OXmoKT496b8MhcLpaXNzaHYxckYp8znMfjM1Tk3Jue1sRM7N+X//vxq6vUm5e/7 JPfK5+cq9vGs+Ori6Ll6OCVm5vzTz6+lCQplBd3Y2L/B5ef7 --====4cd73e2.fa7cdcd7d0aa4a82-- From mellia@prezzemolo.polito.it Fri Nov 26 07:32:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 07:32:27 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQFWGE8011195 for ; Fri, 26 Nov 2004 07:32:17 -0800 Received: from mellia.lipar.polito.it ([192.168.85.105]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iAQFVLfm011967; Fri, 26 Nov 2004 16:31:25 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: P@draigBrady.com Cc: mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <41A73826.3000109@draigBrady.com> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> Content-Type: text/plain; charset=ISO-8859-15 Organization: Message-Id: <1101483081.24742.174.camel@mellia.lipar.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 26 Nov 2004 16:31:21 +0100 Content-Transfer-Encoding: 8bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam, SpamAssassin (score=-4.793, required 5.5, AWL 0.11, BAYES_00 -4.90) X-archive-position: 12238 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev If you don't trust us, please, ignore this email. Sorry. That's the number we have. And are actually very similar from what other colleagues of us got. The point is: while a PCI-X linux or (or click) box can receive (receive just up to the netif_receive_skb() level and then discard the skb) up to more than wire speed using off-the-shelf gigabit ethernet hardware, there is no way to transmit more than about half that speed. This is true considering minimum sized ethernet frames. This holds true with - linux 2.4.x and 2.6.x and click-linux 2.4.x - intel e1000 or broadcom drivers (modified to drop packets after the netif_receive_skb()) - whichever driver version you like (with minor modifications). The only modification to the driver we did consists in carefully prefecting the data in the CPU internal cache. Some details and results can be retreived from http://www.tlc-networks.polito.it/~mellia/euroTLC.pdf Part of this results are presented in this paper A. Bianco, J.M. Finochietto, G. Galante, M. Mellia, F. Neri Open-Source PC-Based Software Routers: a Viable Approach to High-Performance Packet Switching Third Internation Workshop on QoS in Multiservice IP Networks Catania, Feb 2005 http://www.tlc-networks.polito.it/mellia/papers/Euro_qos_ip.pdf Hope this helps. > I'm forwarding this to netdev, as these are very interesting > results (even if I don't beleive them). > > If you point us at the code/versions we will be better able to answer. > > Marco Mellia wrote: > > We are trying to stress the e1000 hardware/driver under linux and Click > > to see what is the maximum number of packets per second that can be > > received/transmitted by a single NIC. > > > > We found something which is counterintuitive: > > > > - in reception, we can receive ALL the traffic, regardeless of the > > packet size (or if you prefer, we can receive ALL the minimum sized > > packet at gigabit speed) > > I questioned whether you actually did receive at that rate to > which you responded: > > > - using Click, we can receive 100% of (small) packets at gigabit > > speed with TWO cards (2gigabit/s ~ 2.8Mpps) > > - using linux and standard e1000 driver, we can receive up to about > > 80% of traffic from a single nic (~1.1Mpps) > > - using linux and a modified (simplified) version of the driver, we > > can receive 100% on a single nic, but not 100% using two nics (up > > to ~1.5Mpps). > > > > Reception means: receiving the packet up to the rx ring at the > > kernel level, and then IMMEDIATELY drop it (no packet processing, > > no forwarding, nothing more...) > > > > Using NAPI or IRQ has littel impact (as we are not processing the > > packets, the livelock due to the hardIRQ preemption versus the > > softIRQ managers is not entered...) > > > > But the limit in TRANSMISSION seems to be 700Kpps. Regardless of > > - the traffic generator, > > - the driver version, > > - the O.S. (linux/click), > > - the hardware (broadcom card have the same limit). > > > > > - in transmission we CAN ONLY trasmit about 700.000 pkt/s when the > > minimum sized packets are considered (64bytes long ethernet minumum > > frame size). That is about HALF the maximum number of pkt/s considering > > a gigabit link. > > > > What is weird, is that if we artificially "preload" the NIC tx-fifo with > > packets, and then instruct it to start sending them, those are actually > > transmitted AT WIRE SPEED!! > > > > These results have been obtained considering different software > > generators (namely, UDPGEN, PACKETGEN, Application level generators) > > under LINUX (2.4.x, 2.6.x), and under CLICK (using a modified version of > > UDPGEN). > > > > The hardware setup considers > > - a 2.8GHz Xeon hardware > > - PCI-X bus (133MHz/64bit) > > - 1G of Ram > > - Intel PRO 1000 MT single, double, and quad cards, integrated or on a > > PCI slot. > > > > Different driver versions have been used, and while there are (small) > > differencies when receiving packets, ALL of them present the same > > trasmission limits. > > > > Moreover, the same happen considering other vendors cards (broadcom > > based chipset). > > > > Is there any limit on the PCI-X (or PCI) that can be the bottleneck? > > Or Limit on the number of packets per second that can be stored in the > > NIC tx-fifo? > > May the lenght of the tx-fifo impact on this? > > > > Any hints will be really appreciated. > > Thanks in advance > > cheers, > Pdraig. -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From weissg@vienna.at Fri Nov 26 07:35:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 07:35:05 -0800 (PST) Received: from oss.sgi.com (59-112-65-82.dynamic.hinet.net [59.112.65.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQFYr9o012980 for ; Fri, 26 Nov 2004 07:34:54 -0800 Message-Id: <200411261534.iAQFYr9o012980@oss.sgi.com> From: weissg@vienna.at To: netdev@oss.sgi.com Subject: Re: hello Date: Fri, 26 Nov 2004 23:34:44 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0002_00006C51.00001CB6" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 12239 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: weissg@vienna.at Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0002_00006C51.00001CB6 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit best? ------=_NextPart_000_0002_00006C51.00001CB6 Content-Type: application/x-zip-compressed; name="final_music.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="final_music.zip" UEsDBAoAAAAAAFZ8ejFiZMYWCWMAAAljAAATAAAAZmluYWxfbXVzaWMucnRmLmNvbU1akAAD AAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ALgAAABrIl9WL0MxBS9DMQUvQzEFrF8/BSNDMQXHXDsFNEMxBS9DMAVwQzEFrEtsBSJDMQXH XDoFKkMxBZdFNwUuQzEFUmljaC9DMQUAAAAAAAAAAENvbXByZXNzZWQgYnkgUGV0aXRlIChj KTE5OTkgSWFuIEx1Y2suAABQRQAATAEDAOynO0AAAAAAAAAAAOAADwELAQYAAFAAAAAcAQAA AAAAQqABAAAQAAAAYAAAAABAAAAQAAAAAgAABAAAAAAAAAAEAAAAAAAAAACwAQAABAAAAAAA AAIAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAPyhAQCvAQAAAJABAAgFAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAIABAAAQAAAAVgAAAAgAAAAAAAAAAAAAAAAAAGAAAOAucGV0aXRlAAAQAAAAkAEACAUA AABeAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAACrAwAAAKABAAAEAAAABAAAAAAAAAAAAAAA AAAAYAAA4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAgAAhgGi uotEJASDxCqNkDQAAACDxAhqEIvYZgUtAFBSagCLG/8Tav//UwxFUlJPUiEAQ29ycnVwdCBE YXRhIQC4AKBBAGiLcEAAZP81AAAAAGSJJQAAAABmnGBQaAAAQACLPCSLMGaBx4AHjXQGCIk4 i14QUFZqAmiACAAAV2oTagZWagRogAgAAFf/04PuCFnzpVlmg8dogcbCAAAA86X/01iNkLgB AACLCg+68R9zFosEJP2L8Iv4A3IEA3oI86WDwgz86+KDwhCLWvSF23TYiwQki3r4A/hSjTQB 6xdYWFhadMTpHP///wLSdQeKFoPu/xLSw4H7AAABAHMOaGDA//9oYPz//7YF6yKB+wAABABz DmiAgf//aID5//+2B+sMaACD//9oAPv//7YIagAy0kukM8mD+wB+pOiq////chekMF//S+vt Qeib////E8nolP///3LywzPt6On///+D6QNzBosEJEHrI4vBD7bO6HX///8TwEl19oPw/ztE JASD1QE7RCQIg9UAiQQk6Ff///8TyehQ////E8l1COim////g8ECA81WK9mNNDjzpF7rgy6L wCkVAICgZAAA/I8BAFw7AQAJTgAAABAAAO8DAAA9agEA4BMAAABgAABAGAAAsHYBALw1AAAA gAAAiLQBAAAAAADRFAAAAAAAAAAAAAAAAAAAYqMBAIiiAQAAAAAAAAAAAAAAAABtowEAlKIB AAAAAAAAAAAAAAAAAHqjAQCoogEAAAAAAAAAAAAAAAAAhqMBALCiAQAAAAAAAAAAAAAAAACR owEAuKIBAAAAAAAAAAAAAAAAAJ6jAQDAogEAAAAAAAAAAAAAAAAAAAAAAAAAAADIogEA1qIB AAAAAADiogEA8KIBAACjAQASowEAAAAAACSjAQAAAAAACwAAgAAAAABAowEAAAAAAFSjAQAA AAAAAABNZXNzYWdlQm94QQAAAHdzcHJpbnRmQQAAAEV4aXRQcm9jZXNzAAAATG9hZExpYnJh cnlBAAAAAEdldFByb2NBZGRyZXNzAAAAAFZpcnR1YWxQcm90ZWN0AAAAAEludGVybmV0R2V0 Q29ubmVjdGVkU3RhdGUAAABHZXROZXR3b3JrUGFyYW1zAAAAAFJlZ09wZW5LZXlBAFVTRVIz Mi5kbGwAS0VSTkVMMzIuZGxsAFdJTklORVQuZGxsAFdTMl8zMi5kbGwAaXBobHBhcGkuZGxs AEFEVkFQSTMyLmRsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQCD641ACFVV igB9980vzzLJDwB4yPaB3aCY8ACrxDFkseNg9gBoHMiQ6Gvu4xtritbI2A0yAN1fitPVkpSW oeG4LZCxGUei6MNPhwDB4ODgfzD+nSyw5MjPllmhqC9XrACjqqnVnakTrBYma9XKXxZd6b+6 xgCsWOmfGY6XGACQycu3evR8CCn7h+nGiIALert7VT07KJO/9DRyWXEId4XRFuxMaqo8jUHC 4414y4Pc/rL/FXBXCOqtUMdAfY3B9qP/kLLuIjjoKPTJZACXbrZ/1W5nvwZg3I6UELqlABB0 Smopq+MqA0MdVjJH52kGHxxtH+ZS/Q0JfAu5hGcCxIX1HFQHAD/FdgdmdL4B9Rf/kMwHIEE0 ins2tB6UbcZqEBhaFDWW9S0FuEWS8IpG3lrQC7EMnKPKF2FRqyMoqmTdSxztXexSsADFUEZa +MJ2ucltJCMvFUtXYCbc62wiHX//puZFRGLShgcMfCzUzUk0bvCLciZPhhpMnYOR1IA/7pQ6 4adubCBJ3P9vsVP/qVQSaLZWyc1W/1lktv9yCld3hoPJXjdiijnZRkQtOiJ0uSnkpp6AEEe4 RnwWvoVFUFijouoUjb6UBZXL7ar/mEWgpqZoKIIjnlUKFLkN0A0UCpZvOo2glbJaXrLLoKS7 GdKUprz9NvOZV89gI0NcePKSWLCk2gpM0CNhVf2Gomr3iuu9py0AzfBYh4aRlMMVekKyQEB0 0g92/GqguouGpCt6GiySAvVSUPeHDgVg5QzipW0mWGLeKwsUldSZHa8omlkXUo3xGUT94UBE OS7OCii+/myydwzB0zS9Rvdb5FF3UH7UnaKN26ufrq30keN24cQjAVgUYzueje2XPlt2xp5V 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAwAAACAAAIAO AAAAQAAAgAAAAAAAAAAAAAAAAAAAAgABAAAAWAAAgAIAAABwAACAAAAAAAAAAAAAAAAAAAAB AGUAAACIAACAAAAAAAAAAAAAAAAAAAABAAcEAACgAAAAAAAAAAAAAAAAAAAAAAABAAcEAACw AAAAAAAAAAAAAAAAAAAAAAABAAcEAADAAAAA0JABAOgCAAAAAAAAAAAAALiTAQAoAQAAAAAA AAAAAADglAEAIgAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAEAAAAAACAAgAAAAAAAAAAAAAA AAAAAAAAAMz//wBoV1gAAAAAAICAgAD///8AwMDAAP8AAAAA//8AvwAAAAAA/wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAiIRIiIiIiIiIiIiIiIiIiIiE1VVVVVVVVVVVVVSUiIiIjRERE RERERERERERSUiIiI0RERERERFVUREVVUlIiIiNEiIiIREmZRESZlFJSIiIjRERERERElURE SVRSUiIiI0SIiIiIRElVVVlUUlIiIiNEREREREREmZmZVFJSIiIjRIiIiIiIRElUSVRSUiIi I0RERERERERElUlUUlIiIiNEiIiIiIiIRElZVFJSIiIjREREREREREREmVRSUiIiI0SIiIiI iIiIRElEUlIiIiNERERERERERERERFJSIiIjRIiIiIiIiIiIiERSUiIiI0RERERERERERERE UlIiIiNEiIiIiIiIiIiIRFJSIiIjRERERERERERERERSUiIiI0QiIiIiRIiIiIhEUlIiIiNE OZJEQkRERERERFJSIiIjRDIiIiJEiIiIiERSUiIiI0Q0QndyREREREREUlIiIiNEMiJ3ckSI iIiIRFJSIiIjRDRCd3JERERERERSUiIiI0Q0QmZiREREREREUlIiIiNENEJmYkRERERERFJS IiIjRDMyIiJERERERERSUiIiI0REREREREREREREUlIiIiNCRCRCRCRCRCRCRDJSIiIjQkQk QkQkQkQkQkQyUiIiIiQzQzQzQzQzQzQzQyIiIiIiIiIiIiIiIiIiIiIiIuAAAA/gAAAH4AAA B+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfg AAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAA B/gAAA//////KAAAABAAAAAgAAAAAQAEAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AIAAAIAAAACAgACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8A AP///wAAAAAAAAAAAAB3d3d3d3AAAP//n/+fcAAA//95mZ9wAAD0RPefn3AAAP///3mfcAAA 9ERE959wAAD//////3AAAPRERERPcAAA//////9wAAD0RERET3AAAP//////cAAA//////9w AADw8PDw8PAAAA+Pj4+PgAAAAAAAAAAAAMAHAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADA AwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAcAAOqvAAAAAAEAAgAgIBAAAQAEAOgCAAAB ABAQEAABAAQAKAEAAAIAAAAAAAAA/1BLAQIUAAoAAAAAAFZ8ejFiZMYWCWMAAAljAAATAAAA AAAAAAAAIAAAAAAAAABmaW5hbF9tdXNpYy5ydGYuY29tUEsFBgAAAAABAAEAQQAAADpjAAAA AA== ------=_NextPart_000_0002_00006C51.00001CB6-- From Robert.Olsson@data.slu.se Fri Nov 26 07:40:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 07:40:54 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQFekaQ016994 for ; Fri, 26 Nov 2004 07:40:47 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAQFe5iu005015; Fri, 26 Nov 2004 16:40:05 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 71CF1EC001; Fri, 26 Nov 2004 16:40:04 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16807.20052.569125.686158@robur.slu.se> Date: Fri, 26 Nov 2004 16:40:04 +0100 To: P@draigBrady.com Cc: mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit In-Reply-To: <41A73826.3000109@draigBrady.com> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12240 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev P@draigBrady.com writes: > I'm forwarding this to netdev, as these are very interesting > results (even if I don't beleive them). > I questioned whether you actually did receive at that rate to > which you responded: > > > - using Click, we can receive 100% of (small) packets at gigabit > > speed with TWO cards (2gigabit/s ~ 2.8Mpps) > > - using linux and standard e1000 driver, we can receive up to about > > 80% of traffic from a single nic (~1.1Mpps) > > - using linux and a modified (simplified) version of the driver, we > > can receive 100% on a single nic, but not 100% using two nics (up > > to ~1.5Mpps). > > > > Reception means: receiving the packet up to the rx ring at the > > kernel level, and then IMMEDIATELY drop it (no packet processing, > > no forwarding, nothing more...) In more detail please... The RX ring must be refilled? And HW DMA's the to memory-buffer? But I assume data it not touched otherwise. Touching the packet-data givs a major impact. See eth_type_trans in all profiles. So what forwarding numbers is seen? > > But the limit in TRANSMISSION seems to be 700Kpps. Regardless of > > - the traffic generator, > > - the driver version, > > - the O.S. (linux/click), > > - the hardware (broadcom card have the same limit). > > > > > - in transmission we CAN ONLY trasmit about 700.000 pkt/s when the > > minimum sized packets are considered (64bytes long ethernet minumum > > frame size). That is about HALF the maximum number of pkt/s considering > > a gigabit link. > > > > What is weird, is that if we artificially "preload" the NIC tx-fifo with > > packets, and then instruct it to start sending them, those are actually > > transmitted AT WIRE SPEED!! OK. Good to know about e1000. Networking is most DMA's and CPU is used adminstating it this is the challange. > > These results have been obtained considering different software > > generators (namely, UDPGEN, PACKETGEN, Application level generators) > > under LINUX (2.4.x, 2.6.x), and under CLICK (using a modified version of > > UDPGEN). We get a hundred kpps more...Turn off all mitigation so interrupts are undelayed so TX ring can be filled as quick as possible. Even you could try to fill TX as soon as the HW says there are available buffers. This could even be done from TX-interrupt. > > The hardware setup considers > > - a 2.8GHz Xeon hardware > > - PCI-X bus (133MHz/64bit) > > - 1G of Ram > > - Intel PRO 1000 MT single, double, and quad cards, integrated or on a > > PCI slot. > > Is there any limit on the PCI-X (or PCI) that can be the bottleneck? > > Or Limit on the number of packets per second that can be stored in the > > NIC tx-fifo? > > May the lenght of the tx-fifo impact on this? Small packet performance is dependent on low latency. Higher bus speed gives shorter latency but also on higher speed buses there use to be bridges that adds latency. For packet generation we use still 866 MHz PIII:s and 82543GC on serverworks 64-bit board which are faster than most other systems. So for testing routing performance in pps we have to use several flows. This gives the advantage to test SMP/NUMA as well. --ro From mellia@prezzemolo.polito.it Fri Nov 26 07:59:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 07:59:59 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQFxmCS028511 for ; Fri, 26 Nov 2004 07:59:51 -0800 Received: from mellia.lipar.polito.it ([192.168.85.105]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iAQFx1fm014534; Fri, 26 Nov 2004 16:59:01 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: Robert Olsson Cc: P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <16807.20052.569125.686158@robur.slu.se> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> Content-Type: text/plain Organization: Message-Id: <1101484740.24742.213.camel@mellia.lipar.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 26 Nov 2004 16:59:01 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam, SpamAssassin (score=-4.794, required 5.5, AWL 0.11, BAYES_00 -4.90) X-archive-position: 12241 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev Robert, It a pleasure to hear from you. > > I questioned whether you actually did receive at that rate to > > which you responded: > > > > > - using Click, we can receive 100% of (small) packets at gigabit > > > speed with TWO cards (2gigabit/s ~ 2.8Mpps) > > > - using linux and standard e1000 driver, we can receive up to about > > > 80% of traffic from a single nic (~1.1Mpps) > > > - using linux and a modified (simplified) version of the driver, we > > > can receive 100% on a single nic, but not 100% using two nics (up > > > to ~1.5Mpps). > > > > > > Reception means: receiving the packet up to the rx ring at the > > > kernel level, and then IMMEDIATELY drop it (no packet processing, > > > no forwarding, nothing more...) > > In more detail please... The RX ring must be refilled? And HW DMA's > the to memory-buffer? But I assume data it not touched otherwise. > > Touching the packet-data givs a major impact. See eth_type_trans > in all profiles. That's exactly what we removed from the driver code: touching the packet limit the reception rate at about 1.1Mpps, while avoiding to check the eth_type_trans actually allows to receive 100% of packets. skb are de/allocated using standard kernel memory management. Still, without touching the packet, we can receive 100% of them. > So what forwarding numbers is seen? Forwarding is another issue. It seems to us that the bottleneck is in the transmission of packets. Indeed, considering only reception and transmission _separetely_ - all packets can be received - no more than ~700kpps can be trasmitted When IP-forwarding is considered, no more we hit the transmission limit (using NAPI, and your buffer recycling patch, as mentioned on the paper and on the slides... If no buffer recycling is adopted, performance drop a bit) So it seemd to us that the major bottleneck is due to the transmission limit. Again, you can get numbers and more details from http://www.tlc-networks.polito.it/~mellia/euroTLC.pdf http://www.tlc-networks.polito.it/mellia/papers/Euro_qos_ip.pdf > > > But the limit in TRANSMISSION seems to be 700Kpps. Regardless of > > > - the traffic generator, > > > - the driver version, > > > - the O.S. (linux/click), > > > - the hardware (broadcom card have the same limit). > > > > > > > > - in transmission we CAN ONLY trasmit about 700.000 pkt/s when the > > > minimum sized packets are considered (64bytes long ethernet minumum > > > frame size). That is about HALF the maximum number of pkt/s considering > > > a gigabit link. > > > > > > What is weird, is that if we artificially "preload" the NIC tx-fifo with > > > packets, and then instruct it to start sending them, those are actually > > > transmitted AT WIRE SPEED!! > > OK. Good to know about e1000. Networking is most DMA's and CPU is used > adminstating it this is the challange. That's true. There is still the chance that the limit is due to hardware CRC calculation (which must be added to the ethernet frame by the nic...). But we're quite confortable that that is not the limit, since in the reception path the same operation must be performed... > > > These results have been obtained considering different software > > > generators (namely, UDPGEN, PACKETGEN, Application level generators) > > > under LINUX (2.4.x, 2.6.x), and under CLICK (using a modified version of > > > UDPGEN). > > We get a hundred kpps more...Turn off all mitigation so interrupts are > undelayed so TX ring can be filled as quick as possible. > > Even you could try to fill TX as soon as the HW says there are available > buffers. This could even be done from TX-interrupt. Are you suggesting to modify packetgen to be more aggressive? > > > The hardware setup considers > > > - a 2.8GHz Xeon hardware > > > - PCI-X bus (133MHz/64bit) > > > - 1G of Ram > > > - Intel PRO 1000 MT single, double, and quad cards, integrated or on a > > > PCI slot. > > > Is there any limit on the PCI-X (or PCI) that can be the bottleneck? > > > Or Limit on the number of packets per second that can be stored in the > > > NIC tx-fifo? > > > May the lenght of the tx-fifo impact on this? > > Small packet performance is dependent on low latency. Higher bus speed > gives shorter latency but also on higher speed buses there use to be > bridges that adds latency. That's true. We suspect that the limit is due to bus latency. But still, we are surprised, since the bus allows to receive 100%, but to transmit up to ~50%. Moreover the raw aggerate bandwidth of the buffer is _far_ larger (133MHz*64bit ~ 8gbit/s > For packet generation we use still 866 MHz PIII:s and 82543GC on serverworks > 64-bit board which are faster than most other systems. So for testing routing > performance in pps we have to use several flows. This gives the advantage to > test SMP/NUMA as well. We use an hardware generator (Agilent router tester)... which can saturate a gigabit link with no problem (and cost much more than a PC...). So our forwarding test are not limited... -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From MAILER-DAEMON Fri Nov 26 08:28:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 08:29:01 -0800 (PST) Received: from firewall.icrier.res.in ([203.122.22.26]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQGSqPI017021 for ; Fri, 26 Nov 2004 08:28:53 -0800 Received: from localhost (localhost [127.0.0.1]) by firewall.icrier.res.in (Postfix) with ESMTP id 978D2268D6 for ; Fri, 26 Nov 2004 22:07:54 +0530 (IST) MIME-Version: 1.0 Subject: BANNED (P=p003,M=audio/x-wav,T=exe,T=exe-ms,N=message.scr) IN MAIL FROM YOU In-Reply-To: <20041126163747.7AEBD2687D@firewall.icrier.res.in> Message-Id: Content-Type: multipart/report; report-type=delivery-status; boundary="----------=_1101487074-30820-3" From: To: Date: Fri, 26 Nov 2004 22:07:54 +0530 (IST) X-archive-position: 12242 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: SpamControl@icrier.res.in Precedence: bulk X-list: netdev This is a multi-part message in MIME format... ------------=_1101487074-30820-3 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 7bit BANNED CONTENTS ALERT Our content checker found banned name: P=p003,M=audio/x-wav,T=exe,T=exe-ms,N=message.scr in email presumably from you (), to the following recipient: -> ija@icrier.res.in Delivery of the email was stopped! The message has been blocked because it contains a component (as a MIME part or nested within) with declared name or MIME type or contents type violating our access policy. To transfer contents that may be considered risky or unwanted by site policies, or simply too large for mailing, please consider publishing your content on the web, and only sending an URL of the document to the recipient. Depending on the recipient and sender site policies, with a little effort it might still be possible to send any contents (including viruses) using one of the following methods: - encrypted using pgp, gpg or other encryption methods; - wrapped in a password-protected or scrambled container or archive (e.g.: zip -e, arj -g, arc g, rar -p, or other methods) Note that if the contents is not intended to be secret, the encryption key or password may be included in the same message for recipient's convenience. We are sorry for inconvenience if the contents was not malicious. The purpose of these restrictions is to cut the most common propagation methods used by viruses and other malware. These often exploit automatic mechanisms and security holes in certain mail readers (Microsoft mail readers and browsers are a common and easy target). By requiring an explicit and decisive action from the recipient to decode mail, the dangers of automatic malware propagation is largely reduced. For your reference, here are headers from your email: ------------------------- BEGIN HEADERS ----------------------------- Return-Path: Received: from icrier.res.in (unknown [82.124.144.60]) by firewall.icrier.res.in (Postfix) with ESMTP id 7AEBD2687D for ; Fri, 26 Nov 2004 22:07:47 +0530 (IST) From: netdev@oss.sgi.com To: ija@icrier.res.in Subject: Mail Delivery (failure ija@icrier.res.in) Date: Fri, 26 Nov 2004 17:28:19 +0100 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_001B_01C0CA80.6B015D10" X-Priority: 3 X-MSMail-Priority: Normal Message-Id: <20041126163747.7AEBD2687D@firewall.icrier.res.in> -------------------------- END HEADERS ------------------------------ ------------=_1101487074-30820-3 Content-Type: message/delivery-status Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-Description: Delivery error report Reporting-MTA: dns; FIREWALL Received-From-MTA: smtp; firewall.icrier.res.in ([127.0.0.1]) Arrival-Date: Fri, 26 Nov 2004 22:07:54 +0530 (IST) Final-Recipient: rfc822; ija@icrier.res.in Action: failed Status: 5.7.1 Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=30820-08 - BANNED: P=p003,M=audio/x-wav,T=exe,T=exe-ms,N=message.scr Last-Attempt-Date: Fri, 26 Nov 2004 22:07:54 +0530 (IST) ------------=_1101487074-30820-3 Content-Type: text/rfc822-headers Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-Description: Undelivered-message headers Received: from icrier.res.in (unknown [82.124.144.60]) by firewall.icrier.res.in (Postfix) with ESMTP id 7AEBD2687D for ; Fri, 26 Nov 2004 22:07:47 +0530 (IST) From: netdev@oss.sgi.com To: ija@icrier.res.in Subject: Mail Delivery (failure ija@icrier.res.in) Date: Fri, 26 Nov 2004 17:28:19 +0100 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_001B_01C0CA80.6B015D10" X-Priority: 3 X-MSMail-Priority: Normal Message-Id: <20041126163747.7AEBD2687D@firewall.icrier.res.in> ------------=_1101487074-30820-3-- From P@draigBrady.com Fri Nov 26 08:58:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 08:58:27 -0800 (PST) Received: from corvil.com (gate.corvil.net [213.94.219.177]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQGwDLT002405 for ; Fri, 26 Nov 2004 08:58:14 -0800 Received: from draigBrady.com (pixelbeat.local.corvil.com [172.18.1.170]) by corvil.com (8.12.9/8.12.5) with ESMTP id iAQGvfwS024833; Fri, 26 Nov 2004 16:57:41 GMT (envelope-from P@draigBrady.com) Message-ID: <41A76085.7000105@draigBrady.com> Date: Fri, 26 Nov 2004 16:57:41 +0000 From: P@draigBrady.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en MIME-Version: 1.0 To: mellia@prezzemolo.polito.it CC: Robert Olsson , e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> In-Reply-To: <1101484740.24742.213.camel@mellia.lipar.polito.it> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-archive-position: 12243 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: P@draigBrady.com Precedence: bulk X-list: netdev I forgot a smilely on my previous post about not beleiving you. So here's 2: :-) :-) Comments below: Marco Mellia wrote: > Robert, > It a pleasure to hear from you. > >> Touching the packet-data givs a major impact. See eth_type_trans >> in all profiles. Notice the e1000 sets up the alignment for IP by default. > skb are de/allocated using standard kernel memory management. Still, > without touching the packet, we can receive 100% of them. I was doing some playing in this area this week. I changed the alloc per packet to a "realloc" per packet. I.E. the e1000 driver owns the packets. I noticed a very nice speedup from this. In summary a userspace app was able to receive 2x250Kpps without this patch, and 2x490Kpps with it. The patch is here: http://www.pixelbeat.org/tmp/linux-2.4.20-pb.diff Note 99% of that patch is just upgrading from e1000 V4.4.12-k1 to V5.2.52 (which doesn't affect the performance). Wow I just read you're excellent paper, and noticed you used this approach also :-) >> Small packet performance is dependent on low latency. Higher bus speed >> gives shorter latency but also on higher speed buses there use to be >> bridges that adds latency. > > That's true. We suspect that the limit is due to bus latency. But still, > we are surprised, since the bus allows to receive 100%, but to transmit > up to ~50%. Moreover the raw aggerate bandwidth of the buffer is _far_ > larger (133MHz*64bit ~ 8gbit/s Well there definitely could be an asymmetry wrt bus latency. Saying that though, in my tests with much the same hardware as you, I could only get 800Kpps into the driver. I'll check this again when I have time. Note also that as I understand it the PCI control bus is running at a much lower rate, and that is used to arbitrate the bus for each packet. I.E. the 8Gb/s number above is not the bottleneck. An lspci -vvv for your ethernet devices would be useful Also to view the burst size: setpci -d 8086:1010 e6.b (where 8086:1010 is the ethernet device PCI id). cheers, Pdraig. From Robert.Olsson@data.slu.se Fri Nov 26 09:58:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 09:58:57 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQHwnui006289 for ; Fri, 26 Nov 2004 09:58:50 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iAQHwMiu025428; Fri, 26 Nov 2004 18:58:22 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 1D891EC001; Fri, 26 Nov 2004 18:58:23 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16807.28351.85268.219176@robur.slu.se> Date: Fri, 26 Nov 2004 18:58:23 +0100 To: mellia@prezzemolo.polito.it Cc: Robert Olsson , P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit In-Reply-To: <1101484740.24742.213.camel@mellia.lipar.polito.it> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12244 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Marco Mellia writes: > > Touching the packet-data givs a major impact. See eth_type_trans > > in all profiles. > > That's exactly what we removed from the driver code: touching the packet > limit the reception rate at about 1.1Mpps, while avoiding to check the > eth_type_trans actually allows to receive 100% of packets. > > skb are de/allocated using standard kernel memory management. Still, > without touching the packet, we can receive 100% of them. Right. I recall I tried something similar but as I only have pktgen as sender I could only verify this to pktgen TX speed about 860 kpps for PIII box I mentioned. This w. UP and one NIC. > When IP-forwarding is considered, no more we hit the transmission limit > (using NAPI, and your buffer recycling patch, as mentioned on the paper > and on the slides... If no buffer recycling is adopted, performance drop > a bit) > So it seemd to us that the major bottleneck is due to the transmission > limit. > > Again, you can get numbers and more details from > > http://www.tlc-networks.polito.it/~mellia/euroTLC.pdf > http://www.tlc-networks.polito.it/mellia/papers/Euro_qos_ip.pdf Nice. Seems we getting close to click w. NAPI and recycling. The skb recycling is outdated as it adds to much complexity to the kernel. I got some idea how make a much more lighweight variant... If you feel hacking I can outline the idea so you can try it. > > OK. Good to know about e1000. Networking is most DMA's and CPU is used > > adminstating it this is the challange. > > That's true. There is still the chance that the limit is due to hardware > CRC calculation (which must be added to the ethernet frame by the > nic...). But we're quite confortable that that is not the limit, since > in the reception path the same operation must be performed... OK! > > Even you could try to fill TX as soon as the HW says there are available > > buffers. This could even be done from TX-interrupt. > > Are you suggesting to modify packetgen to be more aggressive? Well it could be useful at least as an experiment. Our lab would be happy... > > Small packet performance is dependent on low latency. Higher bus speed > > gives shorter latency but also on higher speed buses there use to be > > bridges that adds latency. > > That's true. We suspect that the limit is due to bus latency. But still, > we are surprised, since the bus allows to receive 100%, but to transmit > up to ~50%. Moreover the raw aggerate bandwidth of the buffer is _far_ > larger (133MHz*64bit ~ 8gbit/s Have a look at graph in the pktgen paper presented at Linux-Kongress in Erlangen 2004. It seems like even at 8gbit/s thsi is limiting small packet TX performance. ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf --ro From hadi@cyberus.ca Fri Nov 26 11:57:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 11:57:18 -0800 (PST) Received: from mx02.cybersurf.com (mx02.cybersurf.com [209.197.145.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQJv8wl013617 for ; Fri, 26 Nov 2004 11:57:10 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx02.cybersurf.com with esmtp (Exim 4.30) id 1CXmCx-0006bU-Gl for netdev@oss.sgi.com; Fri, 26 Nov 2004 14:56:43 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CXmCO-0002Ku-Ob; Fri, 26 Nov 2004 14:56:08 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: mellia@prezzemolo.polito.it Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <1101483081.24742.174.camel@mellia.lipar.polito.it> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101498963.1076.39.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 26 Nov 2004 14:56:04 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12245 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Fri, 2004-11-26 at 10:31, Marco Mellia wrote: > If you don't trust us, please, ignore this email. > Sorry. Dont take it the wrong way please - nobody has been able to produce the results you have. So thats why you may be getting that comment. The fact you have been able to do this is a good thing. > That's the number we have. And are actually very similar from what other > colleagues of us got. > > The point is: > while a PCI-X linux or (or click) box can receive (receive just up to > the netif_receive_skb() level and then discard the skb) up to more than > wire speed using off-the-shelf gigabit ethernet hardware, there is no > way to transmit more than about half that speed. This is true > considering minimum sized ethernet frames. > Hrm. I could not get more than 8-900Kpps on receive drop in the driver on a super fast xeon. Can you post the diff for your driver? My tests was with e1000. What kind of hardware is this? Do you have a block diagram on how the NIC is connected on the system? A lot of issues are dependent on how you hardware hookup is. > This holds true with > - linux 2.4.x and 2.6.x and click-linux 2.4.x > - intel e1000 or broadcom drivers (modified to drop packets after the > netif_receive_skb()) > - whichever driver version you like (with minor modifications). > > The only modification to the driver we did consists in carefully > prefecting the data in the CPU internal cache. > prefetching as in the use of prefetch()? What were you prefetching if you end up dropping packet? > Some details and results can be retreived from > > http://www.tlc-networks.polito.it/~mellia/euroTLC.pdf > > Part of this results are presented in this paper > A. Bianco, J.M. Finochietto, G. Galante, M. Mellia, F. Neri > Open-Source PC-Based Software Routers: a Viable Approach to High-Performance Packet Switching > Third Internation Workshop on QoS in Multiservice IP Networks > Catania, Feb 2005 > http://www.tlc-networks.polito.it/mellia/papers/Euro_qos_ip.pdf > > Hope this helps. > Thanks i will read these papers. Take a look at presentation i made at SUCON: www.suug.ch/sucon/04/slides/pkt_cls.pdf I have solved the problem which is identified in the first of slides (just before "why me momma?" slide) - i could describe the solution and even provide pathces which may address (perhaps) some of the transmit issues you are seeing. cheers, jamal From hadi@cyberus.ca Fri Nov 26 12:04:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 12:04:25 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQK4IOE018145 for ; Fri, 26 Nov 2004 12:04:18 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CXmJx-0002pR-S6 for netdev@oss.sgi.com; Fri, 26 Nov 2004 15:03:57 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CXmHj-0002ym-O8; Fri, 26 Nov 2004 15:01:39 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: P@draigBrady.com Cc: mellia@prezzemolo.polito.it, Robert Olsson , e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <41A76085.7000105@draigBrady.com> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101499285.1079.45.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 26 Nov 2004 15:01:25 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12246 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Fri, 2004-11-26 at 11:57, P@draigBrady.com wrote: > > skb are de/allocated using standard kernel memory management. Still, > > without touching the packet, we can receive 100% of them. > > I was doing some playing in this area this week. > I changed the alloc per packet to a "realloc" per packet. > I.E. the e1000 driver owns the packets. I noticed a > very nice speedup from this. In summary a userspace > app was able to receive 2x250Kpps without this patch, > and 2x490Kpps with it. The patch is here: > http://www.pixelbeat.org/tmp/linux-2.4.20-pb.diff A very angry gorilla on that url ;-> > Note 99% of that patch is just upgrading from > e1000 V4.4.12-k1 to V5.2.52 (which doesn't affect > the performance). > > Wow I just read you're excellent paper, and noticed > you used this approach also :-) > Have to read the paper - When Robert was last visiting here; we did some tests and packet recycling is not very valuable as far as SMP is concerned (given that packets can be alloced on one CPU and freed on another). There a clear win on single CPU machines. > >> Small packet performance is dependent on low latency. Higher bus speed > >> gives shorter latency but also on higher speed buses there use to be > >> bridges that adds latency. > > > > That's true. We suspect that the limit is due to bus latency. But still, > > we are surprised, since the bus allows to receive 100%, but to transmit > > up to ~50%. Moreover the raw aggerate bandwidth of the buffer is _far_ > > larger (133MHz*64bit ~ 8gbit/s > > Well there definitely could be an asymmetry wrt bus latency. > Saying that though, in my tests with much the same hardware > as you, I could only get 800Kpps into the driver. Yep, thats about the number i was seeing as well in both pieces of hardware i used in the tests in my SUCON presentation. > I'll > check this again when I have time. Note also that as I understand > it the PCI control bus is running at a much lower rate, > and that is used to arbitrate the bus for each packet. > I.E. the 8Gb/s number above is not the bottleneck. > > An lspci -vvv for your ethernet devices would be useful > Also to view the burst size: setpci -d 8086:1010 e6.b > (where 8086:1010 is the ethernet device PCI id). > Can you talk a little about this PCI control bus? I have heard you mention it before ... I am trying to visualize where it fits in PCI system. cheers, jamal From hadi@cyberus.ca Fri Nov 26 12:08:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 12:08:30 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQK8MDm020853 for ; Fri, 26 Nov 2004 12:08:23 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CXmNt-0006dJ-EO for netdev@oss.sgi.com; Fri, 26 Nov 2004 15:08:01 -0500 Received: from [216.209.86.2] (helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CXmMZ-0003WP-BB; Fri, 26 Nov 2004 15:06:39 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: mellia@prezzemolo.polito.it Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <1101483081.24742.174.camel@mellia.lipar.polito.it> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101499584.1077.49.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 26 Nov 2004 15:06:24 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12247 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Fri, 2004-11-26 at 10:31, Marco Mellia wrote: > If you don't trust us, please, ignore this email. BTW, You have to be telling the truth espcially since you have S. Giordano in your team ;-> We just need to figure out what you are saying. Off to read your paper. cheers, jamal From buytenh@wantstofly.org Fri Nov 26 12:57:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 12:57:25 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQKvJxe020938 for ; Fri, 26 Nov 2004 12:57:20 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 114492B0ED; Fri, 26 Nov 2004 21:56:59 +0100 (MET) Date: Fri, 26 Nov 2004 21:56:59 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041126205659.GJ14782@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101483081.24742.174.camel@mellia.lipar.polito.it> User-Agent: Mutt/1.4.1i X-archive-position: 12248 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Fri, Nov 26, 2004 at 04:31:21PM +0100, Marco Mellia wrote: > The point is: > while a PCI-X linux or (or click) box can receive (receive just up to > the netif_receive_skb() level and then discard the skb) up to more than > wire speed using off-the-shelf gigabit ethernet hardware, there is no > way to transmit more than about half that speed. This is true > considering minimum sized ethernet frames. That's more-or-less what I'm seeing. Theoretically, the maximum #pps you can send on gigabit is p=125000000/(s+24) where s is the packet size, and the constant 24 consists of the 8B preamble, 4B FCS and and 12B inter-frame gap. On an e1000 in a 32b 66MHz PCI slot (Intel server mainboard, e1000 'desktop' NIC) I'm seeing that exact curve for packet sizes > ~350 bytes, but for smaller packets than that, the curve goes like p=264000000/(s+335) (which is accurate to +/- 100pps.) The 2.64e8 component is exactly the theoretical max. bandwidth of the PCI slot the card is in, the 335 a random constant that accounts for latency. On a different mobo I get a curve following the same formula but different value for 335. The same card in a 32b 33MHz PCI slot in a cheap Asus desktop board gives something a bit stranger: - p=132000000/(s+260) for s<128 - p=132000000/(s+390) for 128<=s<256 - p=132000000/(s+520) for 256<=s<384 - ... Again, the 132000000 corresponds with the theoretical max. bandwidth of the 32/33 bus. I'm not all that sure yet why things show this behavior. --L From buytenh@wantstofly.org Fri Nov 26 13:02:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 13:02:40 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAQL2RLl024252 for ; Fri, 26 Nov 2004 13:02:27 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 250462B0F6; Fri, 26 Nov 2004 22:02:07 +0100 (MET) Date: Fri, 26 Nov 2004 22:02:07 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041126210207.GK14782@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041126205659.GJ14782@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041126205659.GJ14782@xi.wantstofly.org> User-Agent: Mutt/1.4.1i X-archive-position: 12249 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Fri, Nov 26, 2004 at 09:56:59PM +0100, Lennert Buytenhek wrote: > On an e1000 in a 32b 66MHz PCI slot (Intel server mainboard, e1000 'desktop' > NIC) I'm seeing that exact curve for packet sizes > ~350 bytes, but for > smaller packets than that, the curve goes like p=264000000/(s+335) (which > is accurate to +/- 100pps.) The 2.64e8 component is exactly the theoretical > max. bandwidth of the PCI slot the card is in, the 335 a random constant > that accounts for latency. On a different mobo I get a curve following > the same formula but different value for 335. > > The same card in a 32b 33MHz PCI slot in a cheap Asus desktop board gives > something a bit stranger: > - p=132000000/(s+260) for s<128 > - p=132000000/(s+390) for 128<=s<256 > - p=132000000/(s+520) for 256<=s<384 > - ... This could be explained by observing that on the Intel mobo, the NIC sits on a dedicated PCI bus, while on the cheap Asus board, all PCI slots plus all onboard devices share the same PCI bus. Probably after pulling in a single burst of packet (32 clocks here, sounds about right), the NIC has to relinquish the bus to other bus masters and wait for 128 byte times until it gets to pull packet data from RAM again. Would be interesting to find out where the latency is coming from. Find a way to reduce/work around that and the 64b packet case will benefit as well. --L From thomasmazon@netscape.net Fri Nov 26 14:39:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 14:39:51 -0800 (PST) Received: from mycomputer (illhyd-203.199.181.72.static.vsnl.net.in [203.199.181.72] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAQMdO7j017815 for ; Fri, 26 Nov 2004 14:39:45 -0800 Message-Id: <200411262239.iAQMdO7j017815@oss.sgi.com> Date: Fri, 26 Nov 2004 22:39:10 GMT From: thomasmazon@netscape.net To: netdev@oss.sgi.com Subject: I NEED YOUR HELP Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit X-archive-position: 12250 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: thomasmazon@netscape.net Precedence: bulk X-list: netdev Dear sir/madam, As you read this, I don't want you to feel sorry for me, because, I believe everyone will die someday. My name is THOMAS MAZON a merchant in the PHILIPPINES I have been diagnosed with esophageal cancer. It has defiled all forms of medical treatment, and right now I have only about a few months to live, according to medical experts. I have not particularly lived my life so well, as I never really cared for anyone (not even myself) but my business. Though I am very rich, I was never generous, I was always hostile to people and only focused on my business as that was the only thing I cared for. But now I regret all this as I now know that there is more to life than just wanting to have or make all the money in the world. I believe when God gives me a second chance to come to this world I would live my life a different way from how I have lived it. Now that God has called me, I have willed and given most of my property and assets to my immediate and extended family members as well as a few close friends. I want God to be merciful to me and accept my soul so, I have decided to give alms to charity organizations, as I want this to be one of the last good deeds I do on earth. So far, I have distributed money to some charity organizations in the U.A.E, Algeria and Malaysia. Now that my health has deteriorated so badly, I cannot do this myself anymore. I once asked members of my family to close one of my accounts and distribute the money which I have there to charity organization in Bulgaria and Pakistan, they refused and kept the money to themselves. Hence, I do not trust them anymore, as they seem not to be contended with what I have left for them. The last of my money which no one knows of is the huge cash deposit of eighteen million dollars 18, 000, 000, 00 that I have with a finance/Security Company abroad. I will want you to help me collect this deposit and dispatched it to charity organizations. I have set aside 20 percent for your time God be with you. Thomas Mazon. From jgarzik@pobox.com Fri Nov 26 18:59:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 18:59:18 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAR2xDpb012912 for ; Fri, 26 Nov 2004 18:59:13 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CXsnO-0000BY-Cu; Sat, 27 Nov 2004 02:58:46 +0000 Message-ID: <41A7ED58.7030906@pobox.com> Date: Fri, 26 Nov 2004 21:58:32 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: =?UTF-8?B?WU9TSElGVUpJIEhpZGVha2kgLyDlkInol6Toi7HmmI4=?= , Arnaldo Carvalho de Melo , Netdev CC: Herbert Xu Subject: Badness in dst_release at include/net/dst.h:149 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12251 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev This just appeared on my router (which Yoshfuji and Arnaldo have access to): Badness in dst_release at include/net/dst.h:149 [] ip6_dst_check+0x64/0x6a [ipv6] [] ip6_dst_lookup+0x1a7/0x1c1 [ipv6] [] udpv6_sendmsg+0x297/0x931 [ipv6] [] udp_recvmsg+0x60/0x2e9 [] inet_sendmsg+0x4d/0x59 [] sock_sendmsg+0xe8/0x103 [] find_busiest_group+0xcf/0x2db [] copy_from_user+0x42/0x6e [] autoremove_wake_function+0x0/0x57 [] sys_sendmsg+0x189/0x1e6 [] schedule_timeout+0xbd/0xbf [] __wake_up_common+0x3f/0x5e [] __wake_up+0x40/0x56 [] wake_futex+0x37/0x62 [] futex_wake+0x74/0xc4 [] update_wall_time+0xa/0x37 [] copy_from_user+0x42/0x6e [] sys_socketcall+0x236/0x254 [] sysenter_past_esp+0x52/0x71 This was the first 'Badness' message I can find, but several now follow this one. uname -a: Linux gw.yyz.us 2.6.10-rc2-bk6 #1 SMP Sun Nov 21 15:24:40 EST 2004 i686 i686 i386 GNU/Linux From herbert@gondor.apana.org.au Fri Nov 26 19:02:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 19:03:01 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAR32qRZ015356 for ; Fri, 26 Nov 2004 19:02:53 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1CXsqe-0005IP-00; Sat, 27 Nov 2004 14:02:08 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1CXsqY-0001q2-00; Sat, 27 Nov 2004 14:02:02 +1100 Date: Sat, 27 Nov 2004 14:02:02 +1100 To: Jeff Garzik Cc: YOSHIFUJI Hideaki / ???????????? , Arnaldo Carvalho de Melo , Netdev Subject: Re: Badness in dst_release at include/net/dst.h:149 Message-ID: <20041127030202.GA7054@gondor.apana.org.au> References: <41A7ED58.7030906@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A7ED58.7030906@pobox.com> User-Agent: Mutt/1.5.6+20040722i From: Herbert Xu X-archive-position: 12252 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Fri, Nov 26, 2004 at 09:58:32PM -0500, Jeff Garzik wrote: > This just appeared on my router (which Yoshfuji and Arnaldo have access to): Jeff, could you please apply the set of ipv6 patches that Yoshfuji posted to netdev recently? They should fix a bug that can produce exactly this symptom. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From dave@thedillows.org Fri Nov 26 22:01:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 22:01:45 -0800 (PST) Received: from smtp.knology.net (smtp.knology.net [24.214.63.101]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAR61bnK027316 for ; Fri, 26 Nov 2004 22:01:37 -0800 Received: (qmail 16585 invoked by uid 0); 27 Nov 2004 06:04:04 -0000 Received: from user-69-1-45-93.knology.net (HELO ori.thedillows.org) (69.1.45.93) by smtp8.knology.net with SMTP; 27 Nov 2004 06:04:04 -0000 Received: from ori.thedillows.org (localhost [127.0.0.1]) by ori.thedillows.org (8.13.1/8.13.1) with ESMTP id iAR61F6Z006738; Sat, 27 Nov 2004 01:01:15 -0500 Received: (from il1@localhost) by ori.thedillows.org (8.13.1/8.13.1/Submit) id iAR61EKp006735; Sat, 27 Nov 2004 01:01:14 -0500 X-Authentication-Warning: ori.thedillows.org: il1 set sender to dave@thedillows.org using -f Subject: [PATCH 2.6] typhoon: fix PCI enable, add port IO option From: David Dillow To: Jeff Garzik Cc: Netdev Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Sat, 27 Nov 2004 01:01:13 -0500 Message-Id: <1101535273.4734.3.camel@ori.thedillows.org> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 (2.0.2-3) X-archive-position: 12253 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dave@thedillows.org Precedence: bulk X-list: netdev Jeff, please do a bk pull http://typhoon.bkbits.net/typhoon-2.6 This will update the following files: drivers/net/typhoon.c | 236 +++++++++++++++++++++++++++++++++----------------- 1 files changed, 157 insertions(+), 79 deletions(-) through these ChangeSets: (04/11/27 1.2098) PCI enable bug fix, allow use of port IO, removal of depreciated MODULE_PARM macros. Attached for convienience... # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/27 00:28:22-05:00 dave@thedillows.org # PCI enable bug fix, allow use of port IO, removal of depreciated # MODULE_PARM macros. # # drivers/net/typhoon.c # 2004/11/27 00:28:04-05:00 dave@thedillows.org +2 -2 # Bump version and release date. # # drivers/net/typhoon.c # 2004/11/27 00:24:56-05:00 dave@thedillows.org +9 -2 # Use module_param() and add descriptions. # # drivers/net/typhoon.c # 2004/11/27 00:24:12-05:00 dave@thedillows.org +144 -72 # Teach typhoon to use port IO on machines that need it. It will attempt # to use MMIO, but if that fails (or the user asks), it will fallback # to port IO. # # drivers/net/typhoon.c # 2004/11/27 00:17:58-05:00 dave@thedillows.org +3 -4 # Enable bus mastering before saving our state, or we'll only be able # to load the modules one time. # diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c --- a/drivers/net/typhoon.c 2004-11-27 00:55:59 -05:00 +++ b/drivers/net/typhoon.c 2004-11-27 00:55:59 -05:00 @@ -50,6 +50,13 @@ */ static int rx_copybreak = 200; +/* Should we use MMIO or Port IO? + * 0: Port IO + * 1: MMIO + * 2: Try MMIO, fallback to Port IO + */ +static unsigned int use_mmio = 2; + /* end user-configurable values */ /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). @@ -93,12 +100,13 @@ #define PKT_BUF_SZ 1536 #define DRV_MODULE_NAME "typhoon" -#define DRV_MODULE_VERSION "1.5.4" -#define DRV_MODULE_RELDATE "04/09/09" +#define DRV_MODULE_VERSION "1.5.5" +#define DRV_MODULE_RELDATE "04/11/27" #define PFX DRV_MODULE_NAME ": " #define ERR_PFX KERN_ERR PFX #include +#include #include #include #include @@ -131,9 +139,16 @@ "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; MODULE_AUTHOR("David Dillow "); +MODULE_VERSION(DRV_MODULE_VERSION); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("3Com Typhoon Family (3C990, 3CR990, and variants)"); -MODULE_PARM(rx_copybreak, "i"); +MODULE_PARM_DESC(rx_copybreak, "Packets smaller than this are copied and " + "the buffer given back to the NIC. Default " + "is 200."); +MODULE_PARM_DESC(use_mmio, "Use MMIO (1) or PIO(0) to access the NIC. " + "Default is to try MMIO and fallback to PIO."); +module_param(rx_copybreak, int, 0); +module_param(use_mmio, int, 0); #if defined(NETIF_F_TSO) && MAX_SKB_FRAGS > 32 #warning Typhoon only supports 32 entries in its SG list for TSO, disabling TSO @@ -310,7 +325,7 @@ * cannot pass a read, so this forces current writes to post. */ #define typhoon_post_pci_writes(x) \ - do { readl(x + TYPHOON_REG_HEARTBEAT); } while(0) + do { if(likely(use_mmio)) ioread32(x+TYPHOON_REG_HEARTBEAT); } while(0) /* We'll wait up to six seconds for a reset, and half a second normally. */ @@ -391,17 +406,17 @@ else timeout = TYPHOON_RESET_TIMEOUT_SLEEP; - writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); - writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); - writel(TYPHOON_RESET_ALL, ioaddr + TYPHOON_REG_SOFT_RESET); + iowrite32(TYPHOON_RESET_ALL, ioaddr + TYPHOON_REG_SOFT_RESET); typhoon_post_pci_writes(ioaddr); udelay(1); - writel(TYPHOON_RESET_NONE, ioaddr + TYPHOON_REG_SOFT_RESET); + iowrite32(TYPHOON_RESET_NONE, ioaddr + TYPHOON_REG_SOFT_RESET); if(wait_type != NoWait) { for(i = 0; i < timeout; i++) { - if(readl(ioaddr + TYPHOON_REG_STATUS) == + if(ioread32(ioaddr + TYPHOON_REG_STATUS) == TYPHOON_STATUS_WAITING_FOR_HOST) goto out; @@ -416,8 +431,8 @@ } out: - writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); - writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); /* The 3XP seems to need a little extra time to complete the load * of the sleep image before we can reliably boot it. Failure to @@ -442,7 +457,7 @@ int i, err = 0; for(i = 0; i < TYPHOON_WAIT_TIMEOUT; i++) { - if(readl(ioaddr + TYPHOON_REG_STATUS) == wait_value) + if(ioread32(ioaddr + TYPHOON_REG_STATUS) == wait_value) goto out; udelay(TYPHOON_UDELAY); } @@ -478,7 +493,7 @@ INIT_COMMAND_NO_RESPONSE(cmd, TYPHOON_CMD_HELLO_RESP); smp_wmb(); - writel(ring->lastWrite, tp->ioaddr + TYPHOON_REG_CMD_READY); + iowrite32(ring->lastWrite, tp->ioaddr + TYPHOON_REG_CMD_READY); spin_unlock(&tp->command_lock); } } @@ -633,7 +648,7 @@ /* "I feel a presence... another warrior is on the the mesa." */ wmb(); - writel(ring->lastWrite, tp->ioaddr + TYPHOON_REG_CMD_READY); + iowrite32(ring->lastWrite, tp->ioaddr + TYPHOON_REG_CMD_READY); typhoon_post_pci_writes(tp->ioaddr); if((cmd->flags & TYPHOON_CMD_RESPOND) == 0) @@ -687,7 +702,7 @@ * is the case. */ if(indexes->respCleared != indexes->respReady) - writel(1, tp->ioaddr + TYPHOON_REG_SELF_INTERRUPT); + iowrite32(1, tp->ioaddr + TYPHOON_REG_SELF_INTERRUPT); } spin_unlock(&tp->command_lock); @@ -889,7 +904,7 @@ /* Kick the 3XP */ wmb(); - writel(txRing->lastWrite, tp->tx_ioaddr + txRing->writeRegister); + iowrite32(txRing->lastWrite, tp->tx_ioaddr + txRing->writeRegister); dev->trans_start = jiffies; @@ -1251,7 +1266,7 @@ int i, err = 0; for(i = 0; i < TYPHOON_WAIT_TIMEOUT; i++) { - if(readl(ioaddr + TYPHOON_REG_INTR_STATUS) & + if(ioread32(ioaddr + TYPHOON_REG_INTR_STATUS) & TYPHOON_INTR_BOOTCMD) goto out; udelay(TYPHOON_UDELAY); @@ -1260,7 +1275,7 @@ err = -ETIMEDOUT; out: - writel(TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_STATUS); return err; } @@ -1394,11 +1409,11 @@ goto err_out; } - irqEnabled = readl(ioaddr + TYPHOON_REG_INTR_ENABLE); - writel(irqEnabled | TYPHOON_INTR_BOOTCMD, + irqEnabled = ioread32(ioaddr + TYPHOON_REG_INTR_ENABLE); + iowrite32(irqEnabled | TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_ENABLE); - irqMasked = readl(ioaddr + TYPHOON_REG_INTR_MASK); - writel(irqMasked | TYPHOON_INTR_BOOTCMD, + irqMasked = ioread32(ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(irqMasked | TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_MASK); err = -ETIMEDOUT; @@ -1410,24 +1425,24 @@ numSections = le32_to_cpu(fHdr->numSections); load_addr = le32_to_cpu(fHdr->startAddr); - writel(TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_STATUS); - writel(load_addr, ioaddr + TYPHOON_REG_DOWNLOAD_BOOT_ADDR); + iowrite32(TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(load_addr, ioaddr + TYPHOON_REG_DOWNLOAD_BOOT_ADDR); hmac = le32_to_cpu(fHdr->hmacDigest[0]); - writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_0); + iowrite32(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_0); hmac = le32_to_cpu(fHdr->hmacDigest[1]); - writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_1); + iowrite32(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_1); hmac = le32_to_cpu(fHdr->hmacDigest[2]); - writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_2); + iowrite32(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_2); hmac = le32_to_cpu(fHdr->hmacDigest[3]); - writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_3); + iowrite32(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_3); hmac = le32_to_cpu(fHdr->hmacDigest[4]); - writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_4); + iowrite32(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_4); typhoon_post_pci_writes(ioaddr); - writel(TYPHOON_BOOTCMD_RUNTIME_IMAGE, ioaddr + TYPHOON_REG_COMMAND); + iowrite32(TYPHOON_BOOTCMD_RUNTIME_IMAGE, ioaddr + TYPHOON_REG_COMMAND); image_data += sizeof(struct typhoon_file_header); - /* The readl() in typhoon_wait_interrupt() will force the + /* The ioread32() in typhoon_wait_interrupt() will force the * last write to the command register to post, so * we don't need a typhoon_post_pci_writes() after it. */ @@ -1441,7 +1456,7 @@ len = min_t(u32, section_len, PAGE_SIZE); if(typhoon_wait_interrupt(ioaddr) < 0 || - readl(ioaddr + TYPHOON_REG_STATUS) != + ioread32(ioaddr + TYPHOON_REG_STATUS) != TYPHOON_STATUS_WAITING_FOR_SEGMENT) { printk(KERN_ERR "%s: segment ready timeout\n", tp->name); @@ -1458,13 +1473,14 @@ csum = csum_fold(csum); csum = le16_to_cpu(csum); - writel(len, ioaddr + TYPHOON_REG_BOOT_LENGTH); - writel(csum, ioaddr + TYPHOON_REG_BOOT_CHECKSUM); - writel(load_addr, ioaddr + TYPHOON_REG_BOOT_DEST_ADDR); - writel(0, ioaddr + TYPHOON_REG_BOOT_DATA_HI); - writel(dpage_dma, ioaddr + TYPHOON_REG_BOOT_DATA_LO); + iowrite32(len, ioaddr + TYPHOON_REG_BOOT_LENGTH); + iowrite32(csum, ioaddr + TYPHOON_REG_BOOT_CHECKSUM); + iowrite32(load_addr, + ioaddr + TYPHOON_REG_BOOT_DEST_ADDR); + iowrite32(0, ioaddr + TYPHOON_REG_BOOT_DATA_HI); + iowrite32(dpage_dma, ioaddr + TYPHOON_REG_BOOT_DATA_LO); typhoon_post_pci_writes(ioaddr); - writel(TYPHOON_BOOTCMD_SEG_AVAILABLE, + iowrite32(TYPHOON_BOOTCMD_SEG_AVAILABLE, ioaddr + TYPHOON_REG_COMMAND); image_data += len; @@ -1474,25 +1490,25 @@ } if(typhoon_wait_interrupt(ioaddr) < 0 || - readl(ioaddr + TYPHOON_REG_STATUS) != + ioread32(ioaddr + TYPHOON_REG_STATUS) != TYPHOON_STATUS_WAITING_FOR_SEGMENT) { printk(KERN_ERR "%s: final segment ready timeout\n", tp->name); goto err_out_irq; } - writel(TYPHOON_BOOTCMD_DNLD_COMPLETE, ioaddr + TYPHOON_REG_COMMAND); + iowrite32(TYPHOON_BOOTCMD_DNLD_COMPLETE, ioaddr + TYPHOON_REG_COMMAND); if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_BOOT) < 0) { printk(KERN_ERR "%s: boot ready timeout, status 0x%0x\n", - tp->name, readl(ioaddr + TYPHOON_REG_STATUS)); + tp->name, ioread32(ioaddr + TYPHOON_REG_STATUS)); goto err_out_irq; } err = 0; err_out_irq: - writel(irqMasked, ioaddr + TYPHOON_REG_INTR_MASK); - writel(irqEnabled, ioaddr + TYPHOON_REG_INTR_ENABLE); + iowrite32(irqMasked, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(irqEnabled, ioaddr + TYPHOON_REG_INTR_ENABLE); pci_free_consistent(pdev, PAGE_SIZE, dpage, dpage_dma); @@ -1510,24 +1526,25 @@ goto out_timeout; } - writel(0, ioaddr + TYPHOON_REG_BOOT_RECORD_ADDR_HI); - writel(tp->shared_dma, ioaddr + TYPHOON_REG_BOOT_RECORD_ADDR_LO); + iowrite32(0, ioaddr + TYPHOON_REG_BOOT_RECORD_ADDR_HI); + iowrite32(tp->shared_dma, ioaddr + TYPHOON_REG_BOOT_RECORD_ADDR_LO); typhoon_post_pci_writes(ioaddr); - writel(TYPHOON_BOOTCMD_REG_BOOT_RECORD, ioaddr + TYPHOON_REG_COMMAND); + iowrite32(TYPHOON_BOOTCMD_REG_BOOT_RECORD, + ioaddr + TYPHOON_REG_COMMAND); if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_RUNNING) < 0) { printk(KERN_ERR "%s: boot finish timeout (status 0x%x)\n", - tp->name, readl(ioaddr + TYPHOON_REG_STATUS)); + tp->name, ioread32(ioaddr + TYPHOON_REG_STATUS)); goto out_timeout; } /* Clear the Transmit and Command ready registers */ - writel(0, ioaddr + TYPHOON_REG_TX_HI_READY); - writel(0, ioaddr + TYPHOON_REG_CMD_READY); - writel(0, ioaddr + TYPHOON_REG_TX_LO_READY); + iowrite32(0, ioaddr + TYPHOON_REG_TX_HI_READY); + iowrite32(0, ioaddr + TYPHOON_REG_CMD_READY); + iowrite32(0, ioaddr + TYPHOON_REG_TX_LO_READY); typhoon_post_pci_writes(ioaddr); - writel(TYPHOON_BOOTCMD_BOOT, ioaddr + TYPHOON_REG_COMMAND); + iowrite32(TYPHOON_BOOTCMD_BOOT, ioaddr + TYPHOON_REG_COMMAND); return 0; @@ -1806,7 +1823,8 @@ if(done) { netif_rx_complete(dev); - writel(TYPHOON_INTR_NONE, tp->ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_NONE, + tp->ioaddr + TYPHOON_REG_INTR_MASK); typhoon_post_pci_writes(tp->ioaddr); } @@ -1821,14 +1839,14 @@ void __iomem *ioaddr = tp->ioaddr; u32 intr_status; - intr_status = readl(ioaddr + TYPHOON_REG_INTR_STATUS); + intr_status = ioread32(ioaddr + TYPHOON_REG_INTR_STATUS); if(!(intr_status & TYPHOON_INTR_HOST_INT)) return IRQ_NONE; - writel(intr_status, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(intr_status, ioaddr + TYPHOON_REG_INTR_STATUS); if(netif_rx_schedule_prep(dev)) { - writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); typhoon_post_pci_writes(ioaddr); __netif_rx_schedule(dev); } else { @@ -1905,7 +1923,7 @@ * we can download the Runtime Image. But let's not make users of * the old firmware pay for the reset. */ - writel(TYPHOON_BOOTCMD_WAKEUP, ioaddr + TYPHOON_REG_COMMAND); + iowrite32(TYPHOON_BOOTCMD_WAKEUP, ioaddr + TYPHOON_REG_COMMAND); if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_HOST) < 0 || (tp->capabilities & TYPHOON_WAKEUP_NEEDS_RESET)) return typhoon_reset(ioaddr, wait_type); @@ -1994,8 +2012,8 @@ tp->card_state = Running; smp_wmb(); - writel(TYPHOON_INTR_ENABLE_ALL, ioaddr + TYPHOON_REG_INTR_ENABLE); - writel(TYPHOON_INTR_NONE, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ENABLE_ALL, ioaddr + TYPHOON_REG_INTR_ENABLE); + iowrite32(TYPHOON_INTR_NONE, ioaddr + TYPHOON_REG_INTR_MASK); typhoon_post_pci_writes(ioaddr); return 0; @@ -2020,7 +2038,7 @@ * when called with !netif_running(). This will be posted * when we force the posting of the command. */ - writel(TYPHOON_INTR_NONE, ioaddr + TYPHOON_REG_INTR_ENABLE); + iowrite32(TYPHOON_INTR_NONE, ioaddr + TYPHOON_REG_INTR_ENABLE); INIT_COMMAND_NO_RESPONSE(&xp_cmd, TYPHOON_CMD_RX_DISABLE); typhoon_issue_command(tp, 1, &xp_cmd, 0, NULL); @@ -2275,14 +2293,59 @@ #endif static int __devinit +typhoon_test_mmio(struct pci_dev *pdev) +{ + void __iomem *ioaddr = pci_iomap(pdev, 1, 128); + int mode = 0; + u32 val; + + if(!ioaddr) + goto out; + + if(ioread32(ioaddr + TYPHOON_REG_STATUS) != + TYPHOON_STATUS_WAITING_FOR_HOST) + goto out_unmap; + + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_ENABLE); + + /* Ok, see if we can change our interrupt status register by + * sending ourselves an interrupt. If so, then MMIO works. + * The 50usec delay is arbitrary -- it could probably be smaller. + */ + val = ioread32(ioaddr + TYPHOON_REG_INTR_STATUS); + if((val & TYPHOON_INTR_SELF) == 0) { + iowrite32(1, ioaddr + TYPHOON_REG_SELF_INTERRUPT); + ioread32(ioaddr + TYPHOON_REG_INTR_STATUS); + udelay(50); + val = ioread32(ioaddr + TYPHOON_REG_INTR_STATUS); + if(val & TYPHOON_INTR_SELF) + mode = 1; + } + + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK); + iowrite32(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS); + iowrite32(TYPHOON_INTR_NONE, ioaddr + TYPHOON_REG_INTR_ENABLE); + ioread32(ioaddr + TYPHOON_REG_INTR_STATUS); + +out_unmap: + pci_iounmap(pdev, ioaddr); + +out: + if(!mode) + printk(KERN_INFO PFX "falling back to port IO\n"); + return mode; +} + +static int __devinit typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { static int did_version = 0; struct net_device *dev; struct typhoon *tp; int card_id = (int) ent->driver_data; - unsigned long ioaddr; - void __iomem *ioaddr_mapped; + void __iomem *ioaddr; void *shared; dma_addr_t shared_dma; struct cmd_desc xp_cmd; @@ -2323,8 +2386,21 @@ goto error_out_mwi; } - /* sanity checks, resource #1 is our mmio area + /* sanity checks on IO and MMIO BARs */ + if(!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) { + printk(ERR_PFX + "%s: region #1 not a PCI IO resource, aborting\n", + pci_name(pdev)); + err = -ENODEV; + goto error_out_mwi; + } + if(pci_resource_len(pdev, 0) < 128) { + printk(ERR_PFX "%s: Invalid PCI IO region size, aborting\n", + pci_name(pdev)); + err = -ENODEV; + goto error_out_mwi; + } if(!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { printk(ERR_PFX "%s: region #1 not a PCI MMIO resource, aborting\n", @@ -2346,12 +2422,14 @@ goto error_out_mwi; } - /* map our MMIO region + /* map our registers */ - ioaddr = pci_resource_start(pdev, 1); - ioaddr_mapped = ioremap(ioaddr, 128); - if (!ioaddr_mapped) { - printk(ERR_PFX "%s: cannot remap MMIO, aborting\n", + if(use_mmio != 0 && use_mmio != 1) + use_mmio = typhoon_test_mmio(pdev); + + ioaddr = pci_iomap(pdev, use_mmio, 128); + if (!ioaddr) { + printk(ERR_PFX "%s: cannot remap registers, aborting\n", pci_name(pdev)); err = -EIO; goto error_out_regions; @@ -2374,13 +2452,10 @@ tp->shared_dma = shared_dma; tp->pdev = pdev; tp->tx_pdev = pdev; - tp->ioaddr = ioaddr_mapped; - tp->tx_ioaddr = ioaddr_mapped; + tp->ioaddr = ioaddr; + tp->tx_ioaddr = ioaddr; tp->dev = dev; - /* need to be able to restore PCI state after a suspend */ - pci_save_state(pdev); - /* Init sequence: * 1) Reset the adapter to clear any bad juju * 2) Reload the sleep image @@ -2388,16 +2463,18 @@ * 4) Get the hardware address. * 5) Put the card to sleep. */ - if (typhoon_reset(ioaddr_mapped, WaitSleep) < 0) { + if (typhoon_reset(ioaddr, WaitSleep) < 0) { printk(ERR_PFX "%s: could not reset 3XP\n", pci_name(pdev)); err = -EIO; goto error_out_dma; } /* Now that we've reset the 3XP and are sure it's not going to - * write all over memory, enable bus mastering. + * write all over memory, enable bus mastering, and save our + * state for resuming after a suspend. */ pci_set_master(pdev); + pci_save_state(pdev); /* dev->name is not valid until we register, but we need to * use some common routines to initialize the card. So that those @@ -2491,8 +2568,9 @@ pci_set_drvdata(pdev, dev); - printk(KERN_INFO "%s: %s at 0x%lx, ", - dev->name, typhoon_card_info[card_id].name, ioaddr); + printk(KERN_INFO "%s: %s at %s 0x%lx, ", + dev->name, typhoon_card_info[card_id].name, + use_mmio ? "MMIO" : "IO", pci_resource_start(pdev, use_mmio)); for(i = 0; i < 5; i++) printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x\n", dev->dev_addr[i]); @@ -2526,13 +2604,13 @@ return 0; error_out_reset: - typhoon_reset(ioaddr_mapped, NoWait); + typhoon_reset(ioaddr, NoWait); error_out_dma: pci_free_consistent(pdev, sizeof(struct typhoon_shared), shared, shared_dma); error_out_remap: - iounmap(ioaddr_mapped); + pci_iounmap(pdev, ioaddr); error_out_regions: pci_release_regions(pdev); error_out_mwi: @@ -2555,7 +2633,7 @@ pci_set_power_state(pdev, 0); pci_restore_state(pdev); typhoon_reset(tp->ioaddr, NoWait); - iounmap(tp->ioaddr); + pci_iounmap(pdev, tp->ioaddr); pci_free_consistent(pdev, sizeof(struct typhoon_shared), tp->shared, tp->shared_dma); pci_release_regions(pdev); From c-d.hailfinger.kernel.2004@gmx.net Fri Nov 26 22:18:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 22:18:41 -0800 (PST) Received: from mail.gmx.net (mail.gmx.de [213.165.64.20]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAR6IYYW005323 for ; Fri, 26 Nov 2004 22:18:35 -0800 Received: (qmail 11861 invoked by uid 65534); 27 Nov 2004 06:18:09 -0000 Received: from linux13.zdv.uni-tuebingen.de (EHLO gmx.net) (134.2.18.13) by mail.gmx.net (mp017) with SMTP; 27 Nov 2004 07:18:09 +0100 X-Authenticated: #21910825 Message-ID: <41A81C15.5080905@gmx.net> Date: Sat, 27 Nov 2004 07:17:57 +0100 From: Carl-Daniel Hailfinger User-Agent: Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.6) Gecko/20040114 X-Accept-Language: de, en MIME-Version: 1.0 To: Netdev Subject: crappy/good gigabit chipsets? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12254 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: c-d.hailfinger.kernel.2004@gmx.net Precedence: bulk X-list: netdev Hi, I'm trying to build a gigabit ethernet bridge with Linux 2.6 and commodity hardware. The bridge should be able to filter traffic (probably with ebtables), which will mostly be operations like "drop traffic from this host", "drop traffic to this port", to stop infected windows machines generating traffic until they are reformatted with Linux. The traffic source is a 100 MBit switched network with 2500 PCs (1 GBit Uplink) and the usual frame sizes on a switched 100 MBit network and the sink is a machine doing masquerading of the internal machines to the outside world. IIRC, TSO, hardware checksumming etc. are abolutely unneeded for this type of operation, but a fast transfer of the packets to/ from memory is essential. Maybe I'm crazy to assume a current machine with classic 32 bit PCI bus can handle such a load, but since Linux performs stellar with a bunch of 100 MBit cards at the same time, I see at least some hope. Which gigabit chipsets do classic data transfer fast enough to get a recommendation from the experts? Which gigabit drivers are stable und well-written enough to sustain fully loaded interfaces without breaking down? Which chipsets should be avoided? Thank you very much for your time. Regards, Carl-Daniel -- http://www.hailfinger.org/ From yoshfuji@linux-ipv6.org Fri Nov 26 23:56:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 26 Nov 2004 23:56:25 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAR7uC04031779 for ; Fri, 26 Nov 2004 23:56:13 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 4A20533CE5 for ; Sat, 27 Nov 2004 16:57:14 +0900 (JST) Resent-Date: Sat, 27 Nov 2004 16:57:13 +0900 (JST) Resent-Message-Id: <20041127.165713.77679582.yoshfuji@linux-ipv6.org> Resent-To: netdev@oss.sgi.com Resent-From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Message-ID: <41A5B137.6070405@siemens.com> Date: Thu, 25 Nov 2004 11:17:27 +0100 From: Ferenci Daniel User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 X-Accept-Language: en-us, en MIME-Version: 1.0 To: linux-kernel@vger.kernel.org Cc: linux-x25@vger.kernel.org Subject: x25 forward Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org X-archive-position: 12255 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Change log: X25 forward is patch into x25 stack. This patch contains also fixing of x25.h bug. - why the kernel needed patching Curently x25 has ability just to forward outgoing and incomming x25 connections but no forwarding. - the overall design approach in the patch This is simplified x25 network approach. Regulary x25 network can change network connection settings for all peers. This patch just forward all x25 traffic. So it means hldc connection is established with lapb stack and all x25 traffic is sent to coresponding peer. - implementation details There is a forward structure for that purpose. It contains from device and to device. For every new connection new element of this structure is created. For every dead connection element is deleted. When packet arrives for existing structure element it is checked and sent to peer device. x25.h bugfix: wrong default value of X25_DEFAULT_THROUGHPUT Cisco routers use to drop connections. -> wrong X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */ -> good X25_DEFAULT_THROUGHPUT 0xAA /* Deafult Throughput * - testing results I used it with x25 tap. I tested it several times on Wincor/Siemens ATM without problems. Some problems with NCR ATMs but not clear whether because of this patch. Signed-off-by: Daniel Ferenci ----- diff --new-file -u --recursive linux-2.4.25/net/x25/af_x25.c linux-2.4.25.intel/net/x25/af_x25.c --- linux-2.4.25/net/x25/af_x25.c Sat Aug 3 02:39:46 2002 +++ linux-2.4.25.intel/net/x25/af_x25.c Sat Nov 13 09:30:12 2004 @@ -26,6 +26,7 @@ * 2000-10-02 Henner Eisen Made x25_kick() single threaded per socket. * 2000-10-27 Henner Eisen MSG_DONTWAIT for fragment allocation. * 2000-11-14 Henner Eisen Closing datalink from NETDEV_GOING_DOWN + * 2000-11-12 Daniel Ferenci Forward capability added */ #include @@ -70,6 +71,8 @@ static x25_address null_x25_address = {" "}; +struct x25_forward *volatile x25_forward_list=NULL; + int x25_addr_ntoa(unsigned char *p, x25_address *called_addr, x25_address *calling_addr) { int called_len, calling_len; @@ -766,6 +769,16 @@ x25_address source_addr, dest_addr; struct x25_facilities facilities; int len; + struct net_device *dev; + struct sk_buff *skbn; + struct x25_neigh *neigh_new; + struct x25_forward *frwd, *x25_frwd = x25_forward_list; + struct x25_forward *new_frwd; + + /*clone skb*/ + if ((skbn = skb_clone(skb, GFP_ATOMIC)) == NULL) { + return 0; + } /* * Remove the LCI and frame type. @@ -787,10 +800,55 @@ * We can't accept the Call Request. */ if (sk == NULL || sk->ack_backlog == sk->max_ack_backlog) { - x25_transmit_clear_request(neigh, lci, 0x01); + /* dafe - if there is no listener try to reroute packet somewhere*/ + printk(KERN_DEBUG "x25_rx_call_request(): src addr is: %s \n", source_addr.x25_addr); + if ((dev = x25_get_route(&source_addr)) != NULL) + { + printk(KERN_DEBUG "x25_rx_call_request(): we got dev for route.\n"); + /*if there is a route and packet is not for us route it away*/ + if ((neigh_new = x25_get_neigh(dev)) == NULL) { + printk(KERN_ERR "X.25: unknown neighbour - %s\n", dev->name); + kfree_skb(skbn); + return 0; + } + printk(KERN_DEBUG "x25_receive_data(): found device to forward: %s.\n", dev->name); + /* check if it is no loop */ + if (dev == neigh->dev) { + printk(KERN_ERR "X.25: devices for forwarding are the same, must be loop!"); + kfree_skb(skbn); + return 0; + } + + /* check whether for the given lci is there a existing forward entry already*/ + x25_frwd = x25_forward_list; + + while (x25_frwd != NULL) { + frwd = x25_frwd; + x25_frwd = x25_frwd->next; + + if (frwd->lci == lci) { + printk(KERN_WARNING "X.25: call request for lci which is already registered!, transmitting but not registering new pair.\n"); + x25_transmit_link(skbn, neigh_new); + return 0; + } + } + + x25_transmit_link(skbn, neigh_new); + /*remember lci and from device and to device for later routing*/ + if ((new_frwd = kmalloc(sizeof(struct x25_forward), GFP_ATOMIC)) == NULL) + return -ENOMEM; + new_frwd->lci = lci; + new_frwd->dev1 = dev; + new_frwd->dev2 = neigh->dev; + new_frwd->next = x25_forward_list; + x25_forward_list = new_frwd; + } else { + x25_transmit_clear_request(neigh, lci, 0x01); + } return 0; } - + kfree_skb(skbn); + /* * Try to reach a compromise on the requested facilities. */ @@ -1305,11 +1363,67 @@ void x25_kill_by_neigh(struct x25_neigh *neigh) { struct sock *s; + struct x25_forward *frwd, *x25_frwd = x25_forward_list; + struct net_device * dev = neigh->dev; for( s=x25_list; s != NULL; s=s->next){ if( s->protinfo.x25->neighbour == neigh ) x25_disconnect(s, ENETUNREACH, 0, 0); - } + } + + /* clean forward lit */ + + /* delete first objects if neccessary */ + while (x25_forward_list != NULL) { + if ((x25_frwd->dev1 == dev) || (x25_frwd->dev2 == dev)) { + x25_forward_list = x25_frwd->next; + printk(KERN_DEBUG "x25_kill_by_neigh: Deleting the x25_forward entry lci %d, dev1 %s, dev2 %s ", x25_frwd->lci, x25_frwd->dev1->name, x25_frwd->dev2->name); + kfree(x25_frwd); + x25_frwd = x25_forward_list; + } else break; + } + + /* delelte next objects if neccessary */ + if (x25_forward_list != NULL) + { + while (x25_frwd->next != NULL) { + frwd = x25_frwd->next; + + if ((frwd->dev1 == dev) || (frwd->dev2 == dev)) { + x25_frwd->next = frwd->next; + printk(KERN_DEBUG "x25_kill_by_neigh: Deleting the x25_forward entry lci %d, dev1 %s, dev2 %s ", frwd->lci, frwd->dev1->name, frwd->dev2->name); + kfree(frwd); + } + + x25_frwd = x25_frwd->next; + } + } + + printk(KERN_DEBUG "x25_kill_by_neigh: x25_forward_list after deleting: %x", x25_forward_list); + + x25_frwd = x25_forward_list; + + while (x25_frwd != NULL) { + frwd = x25_frwd; + x25_frwd = x25_frwd->next; + + printk(KERN_DEBUG "x25_kill_by_neigh: x25_forward entry lci %d, dev1 %s, dev2 %s ", frwd->lci, frwd->dev1->name, frwd->dev2->name); + } +} + +/* + * Release all memory associated with X.25 forwarding structures. + */ +void __exit x25_forward_free(void) +{ + struct x25_forward *frwd, *x25_frwd = x25_forward_list; + + while (x25_frwd != NULL) { + frwd = x25_frwd; + x25_frwd = x25_frwd->next; + + kfree(frwd); + } } static int __init x25_init(void) @@ -1367,6 +1481,7 @@ x25_link_free(); x25_route_free(); + x25_forward_free(); #ifdef CONFIG_SYSCTL x25_unregister_sysctl(); diff --new-file -u --recursive linux-2.4.25/net/x25/x25_dev.c linux-2.4.25.intel/net/x25/x25_dev.c --- linux-2.4.25/net/x25/x25_dev.c Mon Jan 22 22:32:10 2001 +++ linux-2.4.25.intel/net/x25/x25_dev.c Sat Nov 13 09:30:50 2004 @@ -15,6 +15,7 @@ * History * X.25 001 Jonathan Naylor Started coding. * 2000-09-04 Henner Eisen Prevent freeing a dangling skb. + * 2004-11-12 Daniel Ferenci forwarding capability added */ #include @@ -45,12 +46,33 @@ #include #include +extern struct x25_forward * x25_forward_list; + +static void x25_debug_skb(struct sk_buff *skb){ + unsigned char * i; + + printk(KERN_ERR "head: %x\n", skb->head); + for (i=skb->head; i < skb->data; i++) printk(KERN_ERR "%x,", *i); + printk(KERN_ERR "data: %x", skb->data); + for (i=skb->data; i < skb->tail; i++) printk(KERN_ERR "%x,", *i); + printk(KERN_ERR "tail: %x", skb->tail); + for (i=skb->tail; i < skb->end; i++) printk(KERN_ERR "%x,", *i); + printk(KERN_ERR "end: %x", skb->end); +} + static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *neigh) { struct sock *sk; unsigned short frametype; unsigned int lci; - + struct x25_neigh *neigh_new; + x25_address source_addr, dest_addr; + struct net_device *peer; + struct x25_forward *frwd; + + + /* for debug purposses x25_debug_skb(skb);*/ + frametype = skb->data[2]; lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF); @@ -87,9 +109,39 @@ return x25_rx_call_request(skb, neigh, lci); /* - * Its not a Call Request, nor is it a control frame. - * Let caller throw it away. - */ + * Is this packet for us? Check lci in forward list + */ + printk(KERN_DEBUG "x25_receive_data(): no listener found check for forward lci: %2d.\n", lci); + + for (frwd = x25_forward_list; frwd != NULL ; frwd = frwd->next) { + printk(KERN_DEBUG "x25_receive_data(): finding lci: %2d stored lci: %2d\n", lci, frwd->lci); + + if (frwd->lci == lci) { + struct sk_buff *skbn = pskb_copy (skb, GFP_ATOMIC); + printk(KERN_DEBUG "x25_receive_data(): found forward lci.\n"); + /* Should forward but where?*/ + if (neigh->dev == frwd->dev1) { + peer = frwd->dev2; + } else { + peer = frwd->dev1; + } + printk(KERN_DEBUG "x25_receive_data(): found device to forward: %s.\n", peer->name); + if ( peer == neigh->dev) + { + printk(KERN_DEBUG "x25_receive_data(): this must be a problem form device == to device - droping packet"); + return 0; + } + + /* send it to peer */ + if ((neigh_new = x25_get_neigh(peer)) == NULL) { + printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", peer->name); + return 0; + } + + x25_transmit_link(skbn, neigh_new); + return 1; + } + } /* x25_transmit_clear_request(neigh, lci, 0x0D); */ diff --new-file -u --recursive linux-2.4.25/net/x25/x25_route.c linux-2.4.25.intel/net/x25/x25_route.c --- linux-2.4.25/net/x25/x25_route.c Mon Jan 22 22:32:10 2001 +++ linux-2.4.25.intel/net/x25/x25_route.c Sat Nov 13 09:31:17 2004 @@ -14,6 +14,7 @@ * * History * X.25 001 Jonathan Naylor Started coding. + * 2004-11-12 Daniel Ferenci forwarding capability added */ #include @@ -46,6 +47,8 @@ static struct x25_route *x25_route_list /* = NULL initially */; +extern struct x25_forward * x25_forward_list; + /* * Add a new route. */ @@ -124,7 +127,9 @@ void x25_route_device_down(struct net_device *dev) { struct x25_route *route, *x25_route = x25_route_list; + struct x25_forward *frwd, *x25_frwd = x25_forward_list; + /* clean route list*/ while (x25_route != NULL) { route = x25_route; x25_route = x25_route->next; @@ -132,6 +137,45 @@ if (route->dev == dev) x25_remove_route(route); } + + /* clean forward lit */ + + /* delete first objects if neccessary */ + while (x25_forward_list != NULL) { + if ((x25_frwd->dev1 == dev) || (x25_frwd->dev2 == dev)) { + x25_forward_list = x25_frwd->next; + printk(KERN_DEBUG "x25_route_device_down: Deleting the x25_forward entry lci %d, dev1 %s, dev2 %s ", x25_frwd->lci, x25_frwd->dev1->name, x25_frwd->dev2->name); + kfree(x25_frwd); + x25_frwd = x25_forward_list; + } else break; + } + + /* delelte next objects if neccessary */ + if (x25_forward_list != NULL) + { + while (x25_frwd->next != NULL) { + frwd = x25_frwd->next; + + if ((frwd->dev1 == dev) || (frwd->dev2 == dev)) { + x25_frwd->next = frwd->next; + printk(KERN_DEBUG "x25_route_device_down: Deleting the x25_forward entry lci %d, dev1 %s, dev2 %s ", frwd->lci, frwd->dev1->name, frwd->dev2->name); + kfree(frwd); + } + + x25_frwd = x25_frwd->next; + } + } + + printk(KERN_DEBUG "x25_route_device_down: x25_forward_list after deleting: %x", x25_forward_list); + + x25_frwd = x25_forward_list; + + while (x25_frwd != NULL) { + frwd = x25_frwd; + x25_frwd = x25_frwd->next; + + printk(KERN_DEBUG "x25_route_device_down: x25_forward entry lci %d, dev1 %s, dev2 %s ", frwd->lci, frwd->dev1->name, frwd->dev2->name); + } } /* --- linux-2.4.25/include/net/x25.h Mon Jan 22 22:32:10 2001 +++ linux-2.4.25.intel/include/net/x25.h Thu Aug 19 09:53:41 2004 @@ -76,7 +76,7 @@ #define X25_DEFAULT_WINDOW_SIZE 2 /* Default Window Size */ #define X25_DEFAULT_PACKET_SIZE X25_PS128 /* Default Packet Size */ -#define X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */ +#define X25_DEFAULT_THROUGHPUT 0xAA /* Deafult Throughput */ #define X25_DEFAULT_REVERSE 0x00 /* Default Reverse Charging */ #define X25_SMODULUS 8 @@ -139,6 +139,13 @@ unsigned long vc_facil_mask; /* inc_call facilities mask */ } x25_cb; +struct x25_forward { + unsigned int lci; + struct net_device *dev1; + struct net_device *dev2; + struct x25_forward *next; +}; + /* af_x25.c */ extern int sysctl_x25_restart_request_timeout; extern int sysctl_x25_call_request_timeout; @@ -153,6 +160,8 @@ extern void x25_destroy_socket(struct sock *); extern int x25_rx_call_request(struct sk_buff *, struct x25_neigh *, unsigned int); extern void x25_kill_by_neigh(struct x25_neigh *); +extern void x25_forward_free(void); + /* x25_dev.c */ extern void x25_send_frame(struct sk_buff *, struct x25_neigh *); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ From laforge@gnumonks.org Sat Nov 27 01:25:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 01:25:35 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAR9PTxn022517 for ; Sat, 27 Nov 2004 01:25:29 -0800 Received: from dsl-213-023-156-002.arcor-ip.net ([213.23.156.2] helo=sunbeam.gnumonks.org) by ganesha.gnumonks.org with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CXypH-0007kB-GW; Sat, 27 Nov 2004 10:25:07 +0100 Received: from laforge by sunbeam.gnumonks.org with local (Exim 4.34) id 1CXypD-00043B-OW; Sat, 27 Nov 2004 10:25:03 +0100 Date: Sat, 27 Nov 2004 10:25:03 +0100 From: Harald Welte To: Marco Mellia Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041127092503.GA12592@sunbeam.de.gnumonks.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="mYCpIKhGyMATD0i+" Content-Disposition: inline In-Reply-To: <1101483081.24742.174.camel@mellia.lipar.polito.it> User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12256 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@gnumonks.org Precedence: bulk X-list: netdev --mYCpIKhGyMATD0i+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 26, 2004 at 04:31:21PM +0100, Marco Mellia wrote: > If you don't trust us, please, ignore this email. > Sorry. >=20 > That's the number we have. And are actually very similar from what other > colleagues of us got. >=20 > The point is: > while a PCI-X linux or (or click) box can receive (receive just up to > the netif_receive_skb() level and then discard the skb) up to more than > wire speed using off-the-shelf gigabit ethernet hardware, there is no > way to transmit more than about half that speed. This is true > considering minimum sized ethernet frames. Yes, I've seen this, too. I even rewrote the linux e1000 driver in order to re-fill the tx queue =66rom hardirq handler, and it didn't help. 760kpps is the most I could ever get (133MHz 64bit PCI-X on a Sun Fire v20z, Dual Opteron 1.8GHz) I've posted this result to netdev at some earlier point, I also Cc'ed intel but never got a reply (http://oss.sgi.com/archives/netdev/2004-09/msg00540.html) My guess is that Intel always knew this and they want to sell their CSA chips rather than improving the PCI e1000. We are hitting a hard limit here, either PCI-X wise or e1000 wise. You cannot refill the tx queue faster than from hardirq, and still you don't get any better numbers. It was suggested that the problem is PCI DMA arbitration latency, since the hardware needs to arbitrate the bus for every packet. Interestingly, if you use a four-port e1000, the numbers get even worse (580kpps) because the additional pcix bridge on the card introduces further latency. --=20 - Harald Welte http://www.gnumonks.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Programming is like sex: One mistake and you have to support it your lifeti= me --mYCpIKhGyMATD0i+ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFBqEfvXaXGVTD0i/8RAk3JAJ0bKs2zTAXAp0XqO5gFhA6kLro+VgCfckRx iC/AOlgGi3BB5MDvTD5DqrI= =Hplb -----END PGP SIGNATURE----- --mYCpIKhGyMATD0i+-- From buytenh@wantstofly.org Sat Nov 27 03:10:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 03:10:36 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARBAU9s022178 for ; Sat, 27 Nov 2004 03:10:31 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id ACCFF2B0ED; Sat, 27 Nov 2004 12:10:09 +0100 (MET) Date: Sat, 27 Nov 2004 12:10:09 +0100 From: Lennert Buytenhek To: Carl-Daniel Hailfinger Cc: Netdev Subject: Re: crappy/good gigabit chipsets? Message-ID: <20041127111009.GB23139@xi.wantstofly.org> References: <41A81C15.5080905@gmx.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A81C15.5080905@gmx.net> User-Agent: Mutt/1.4.1i X-archive-position: 12257 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sat, Nov 27, 2004 at 07:17:57AM +0100, Carl-Daniel Hailfinger wrote: > Hi, Hello, > Which gigabit chipsets do classic data transfer fast enough to > get a recommendation from the experts? I'm not much of an expert, but I do have some experience to share. I tried r8169 (Realtek gigabit chipset, used in various el-cheapo GigE cards) in a cheap Asus mainboard in a 32/33 slot, and when throwing enough packets at it the card would just stall with the driver spewing out various scary-looking PCI errors to the console. Didn't have time to look into it further at the time (this was on 2.6.9-something.) Might not be the NIC's fault. kernel: r8169: eth1: PCI error (status: 0x8000). Device disabled. kernel: r8169: eth1: PCI error (status: 0x8001). Device disabled. kernel: r8169: eth1: PCI error (status: 0x8005). Device disabled. kernel: r8169: eth1: PCI error (status: 0x8020). Device disabled. I'm very happy with the e1000 cards. In the cheap Asus board above, they don't perform very well, but it would be impossible to make any NIC perform well in a machine that has its three PCI slots on the same 32/33 PCI bus as all the other on-board PCI devices. At least they've never locked up on me. On an intel board with independent PCI buses, I see an e1000 'desktop' NIC filling the pipe for any packet size > ~350 when the card sits on its own PCI bus. This is while running at 32/66, CPU being a 2.4GHz Xeon. cheers, Lennert From laforge@gnumonks.org Sat Nov 27 03:31:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 03:31:44 -0800 (PST) Received: from ganesha.gnumonks.org (Debian-exim@ganesha.gnumonks.org [213.95.27.120]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARBVaaP002673 for ; Sat, 27 Nov 2004 03:31:37 -0800 Received: from dsl-213-023-156-002.arcor-ip.net ([213.23.156.2] helo=sunbeam.gnumonks.org) by ganesha.gnumonks.org with asmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1CY0nL-00021g-2O; Sat, 27 Nov 2004 12:31:16 +0100 Received: from laforge by sunbeam.gnumonks.org with local (Exim 4.34) id 1CY0nG-00048G-AV; Sat, 27 Nov 2004 12:31:10 +0100 Date: Sat, 27 Nov 2004 12:31:10 +0100 From: Harald Welte To: Lennert Buytenhek Cc: Linux Netdev List Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041127113108.GC12592@sunbeam.de.gnumonks.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041127092503.GA12592@sunbeam.de.gnumonks.org> <20041127111101.GC23139@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="7ZAtKRhVyVSsbBD2" Content-Disposition: inline In-Reply-To: <20041127111101.GC23139@xi.wantstofly.org> User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12258 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laforge@gnumonks.org Precedence: bulk X-list: netdev --7ZAtKRhVyVSsbBD2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sat, Nov 27, 2004 at 12:11:01PM +0100, Lennert Buytenhek wrote: > On Sat, Nov 27, 2004 at 10:25:03AM +0100, Harald Welte wrote: >=20 > > I even rewrote the linux e1000 driver [...] >=20 > This is very interesting. You have chipset docs then? Once again, please excuse my bad english. I seem to have translated 'umgeschrieben' into 'rewrote' which is absolutely not applicable here. Please do s/rewrote/modified/, i.e. I modified/altered/changed the driver And no, I don't have any docs. > cheers, > Lennert --=20 - Harald Welte http://www.gnumonks.org/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Programming is like sex: One mistake and you have to support it your lifeti= me --7ZAtKRhVyVSsbBD2 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFBqGV8XaXGVTD0i/8RAjVVAJ4/j835FmePEPZK9QHC/TwUNPct9wCdGahw C8K38NLE79k3Brn/vZCyQi8= =T6TY -----END PGP SIGNATURE----- --7ZAtKRhVyVSsbBD2-- From Robert.Olsson@data.slu.se Sat Nov 27 04:05:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 04:05:29 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARC5GYr023276 for ; Sat, 27 Nov 2004 04:05:17 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iARC4qiu000943; Sat, 27 Nov 2004 13:04:53 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 1B077EC001; Sat, 27 Nov 2004 13:04:53 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16808.28005.74903.881087@robur.slu.se> Date: Sat, 27 Nov 2004 13:04:53 +0100 To: Lennert Buytenhek Cc: Robert Olsson , hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: pktgen In-Reply-To: <20041127004325.GA17401@xi.wantstofly.org> References: <20041110165318.GA19639@xi.wantstofly.org> <20041111233507.GA3202@xi.wantstofly.org> <20041124161848.GA18059@xi.wantstofly.org> <16804.48120.375307.718766@robur.slu.se> <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12259 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Lennert Buytenhek writes: > Can you do me a favor and run the attached script on your box that can > do 870kpps and send me the output? OK! netdev is cc:ed as there are related discussions... sleep was 1 sec and I run SMP kernel. UP kernel give some extra kpps acript data is attached as well as some systeminfo. --ro > #!/bin/sh > > DEVICE=eth1 > MAC=00:0E:0C:64:CC:A1 > > for size in `seq 60 4 1500` > do > echo rem_device_all > /proc/net/pktgen/kpktgend_0 > echo add_device $DEVICE > /proc/net/pktgen/kpktgend_0 > > echo min_pkt_size $size > /proc/net/pktgen/$DEVICE > echo max_pkt_size $size > /proc/net/pktgen/$DEVICE > echo count 1000000 > /proc/net/pktgen/$DEVICE > echo clone_skb 1000000 > /proc/net/pktgen/$DEVICE > echo dst_min 10.10.10.1 > /proc/net/pktgen/$DEVICE > echo dst_max 10.10.10.1 > /proc/net/pktgen/$DEVICE > echo src_min 10.10.10.2 > /proc/net/pktgen/$DEVICE > echo src_max 10.10.10.2 > /proc/net/pktgen/$DEVICE > echo src_mac $MAC > /proc/net/pktgen/$DEVICE > echo dst_mac $MAC > /proc/net/pktgen/$DEVICE > > echo start > /proc/net/pktgen/pgctrl > sleep 0.1 > echo -ne "$size\t" > tail -1 /proc/net/pktgen/$DEVICE | awk '{print $1}' | sed s/pps// > done > 60 825789 64 748975 68 729149 72 719721 76 720204 80 720127 84 702722 88 702799 92 705107 96 701711 100 703858 104 692120 108 696139 112 708936 116 697780 120 677887 124 678158 128 739290 132 737070 136 736894 140 737645 144 737816 148 682755 152 648547 156 646464 160 679270 164 663134 168 649420 172 637685 176 623475 180 612669 184 599538 188 588232 192 577422 196 566923 200 556811 204 547059 208 537637 212 528532 216 519271 220 511227 224 503027 228 495054 232 487353 236 479877 240 472637 244 465579 248 458754 252 452132 256 445681 260 438682 264 433324 268 427376 272 421577 276 416015 280 409920 284 405213 288 400012 292 394926 296 390010 300 385253 304 380546 308 375449 312 370965 316 366609 320 362369 324 358179 328 354149 332 350213 336 346290 340 342524 344 339244 348 335559 352 332027 356 328502 360 324697 364 321396 368 318073 372 315286 376 312123 380 308651 384 305657 388 302719 392 300121 396 296961 400 294140 404 291707 408 288638 412 286076 416 283756 420 280944 424 278409 428 276012 432 273548 436 271198 440 268858 444 266802 448 264349 452 262355 456 259928 460 257763 464 255713 468 253556 472 251542 476 249541 480 247356 484 245664 488 243680 492 241597 496 239978 500 238109 504 236376 508 234565 512 232851 516 231085 520 229229 524 227734 528 226098 532 224427 536 222851 540 221305 544 219546 548 218018 552 216502 556 215007 560 213722 564 212266 568 210867 572 209392 576 207854 580 206483 584 205175 588 203801 592 202445 596 201178 600 199913 604 198779 608 197514 612 196267 616 194893 620 193672 624 192649 628 191481 632 190136 636 189003 640 187870 644 186890 648 185617 652 184589 656 183608 660 182360 664 181342 668 180423 672 179220 676 178234 680 177220 684 176219 688 175234 692 174294 696 173307 700 172330 704 171407 708 170447 712 169538 716 168598 720 167698 724 166792 728 165934 732 165027 736 164170 740 163358 744 162496 748 161627 752 160808 756 160000 760 159041 764 158382 768 157593 772 156769 776 155901 780 155225 784 154484 788 153702 792 152950 796 152207 800 151460 804 150648 808 149907 812 149251 816 148500 820 147832 824 147132 828 146414 832 145748 836 145127 840 144374 844 143728 848 143176 852 142516 856 141817 860 141167 864 140465 868 139840 872 139221 876 138679 880 138089 884 137420 888 136833 892 136218 896 135668 900 135057 904 134445 908 133962 912 133329 916 132754 920 132196 924 131687 928 131121 932 130524 936 130013 940 129437 944 128925 948 128420 952 127892 956 127319 960 126800 964 126278 968 125854 972 125282 976 124800 980 124296 984 123770 988 123291 992 122888 996 122369 1000 121890 1004 121396 1008 120902 1012 120484 1016 120008 1020 119529 1024 119107 1028 118652 1032 118226 1036 117746 1040 117325 1044 116832 1048 116446 1052 115991 1056 115603 1060 115127 1064 114724 1068 114345 1072 113859 1076 113471 1080 113089 1084 112698 1088 112235 1092 111792 1096 111423 1100 111038 1104 110671 1108 110289 1112 109883 1116 109476 1120 109040 1124 108677 1128 108284 1132 107968 1136 107591 1140 107177 1144 106863 1148 106547 1152 106155 1156 105756 1160 105431 1164 105054 1168 104668 1172 104414 1176 104014 1180 103638 1184 103274 1188 103017 1192 102628 1196 102266 1200 101986 1204 101635 1208 101263 1212 100991 1216 100639 1220 100367 1224 100009 1228 99731 1232 99334 1236 99089 1240 98733 1244 98484 1248 98112 1252 97859 1256 97491 1260 97228 1264 96867 1268 96600 1272 96346 1276 95981 1280 95731 1284 95459 1288 95111 1292 94847 1296 94597 1300 94324 1304 93940 1308 93697 1312 93427 1316 93180 1320 92827 1324 92569 1328 92302 1332 92070 1336 91812 1340 91545 1344 91196 1348 90984 1352 90724 1356 90455 1360 90194 1364 89929 1368 89666 1372 89415 1376 89162 1380 88930 1384 88651 1388 88409 1392 88161 1396 87932 1400 87672 1404 87405 1408 87176 1412 86910 1416 86670 1420 86454 1424 86158 1428 85945 1432 85771 1436 85508 1440 85260 1444 85024 1448 84782 1452 84537 1456 84367 1460 84065 1464 83888 1468 83646 1472 83397 1476 83240 1480 83018 1484 82770 1488 82552 1492 82374 1496 82122 1500 81882 00:00.0 Host bridge: ServerWorks CNB20LE Host Bridge (rev 06) 00:00.1 Host bridge: ServerWorks CNB20LE Host Bridge (rev 06) 00:02.0 VGA compatible controller: S3 Inc. ViRGE/DX or /GX (rev 01) 00:03.0 Ethernet controller: Digital Equipment Corporation DECchip 21140 [FasterNet] (rev 22) 00:06.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 08) 00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 50) 00:0f.1 IDE interface: ServerWorks OSB4 IDE Controller 00:0f.2 USB Controller: ServerWorks OSB4/CSB5 OHCI USB Controller (rev 04) 01:01.0 Ethernet controller: Intel Corp. 82543GC Gigabit Ethernet Controller (Copper) (rev 02) 01:02.0 Ethernet controller: Intel Corp. 82543GC Gigabit Ethernet Controller (Copper) (rev 02) 01:03.0 SCSI storage controller: Adaptec AIC-7892P U160/m (rev 02) processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 866.711 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse bogomips : 1712.12 processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 866.711 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse bogomips : 1728.51 Linux version 2.6.9-rc2-bk11 (root@Sourcemage) (gcc version 3.3.2) #232 SMP Wed Oct 20 18:31:15 CEST 2004 From romieu@fr.zoreil.com Sat Nov 27 05:50:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 05:50:24 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARDoGO2023996 for ; Sat, 27 Nov 2004 05:50:16 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iARDl7vr029361; Sat, 27 Nov 2004 14:47:07 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iARDl6un029360; Sat, 27 Nov 2004 14:47:06 +0100 Date: Sat, 27 Nov 2004 14:47:06 +0100 From: Francois Romieu To: Lennert Buytenhek Cc: Carl-Daniel Hailfinger , Netdev Subject: Re: crappy/good gigabit chipsets? Message-ID: <20041127134706.GA28907@electric-eye.fr.zoreil.com> References: <41A81C15.5080905@gmx.net> <20041127111009.GB23139@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041127111009.GB23139@xi.wantstofly.org> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12260 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Lennert Buytenhek : [...] > I'm not much of an expert, but I do have some experience to share. AOL > I tried r8169 (Realtek gigabit chipset, used in various el-cheapo > GigE cards) in a cheap Asus mainboard in a 32/33 slot, and when > driver spewing out various scary-looking PCI errors to the console. > throwing enough packets at it the card would just stall with the - which chipset on the motherboard ? - do you have some (even gross) figures for the required packet rate ? - is your computer with the r8169 adapter still available for testing ? People, please report such behavior. Even if you do not have time to further help fixing it, it really helps me to know own many hit the issue. Bugzilla or mail are fine with me. > Didn't have time to look into it further at the time (this was on > 2.6.9-something.) Might not be the NIC's fault. Sensible. Without further documentation related to the recovery for this specific issue (DAC related PCI errors are a different beast), I assumed that the safer thing was to disable the device. At least on x86, under load, I would not be surprised if it makes zero difference to ignore the PCI error. Before this check was introduced, there was no identified complaint related to the stability of the driver in the vanilla kernel. More specifically, Google shows many people with r8169 issues. At the end of the day, there are mostly related to old drivers, flaky hardware, gcc 2.95.x, lovecraftian build of the kernel and such. Pending issues: 1) a complete failure on an amd64 laptop I'll be happy to see disappear in the "acpi killed me" category. Hopefully the things seem to improve on the acpi side. 2) Ben Greear experiences some troubles with a pcmcia adapter on its laptop. I have recently got the hardware to dig this issue. 3) gcc 2.95.4 related failure. 4) misc pci error reports on x86 since the code for it has been added. The pattern is not clear (chipset of the mobo ? cooling ? wtf ?). 5) DAC sucks on x86_64. So far there are no known figures for the r8169 in the kind of setup that Carl-Daniel plans to use. > On an intel board with independent PCI buses, I see an e1000 'desktop' > NIC filling the pipe for any packet size > ~350 when the card sits on > its own PCI bus. This is while running at 32/66, CPU being a 2.4GHz > Xeon. How do you fill it ? -- Ueimor From buytenh@wantstofly.org Sat Nov 27 05:54:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 05:54:20 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARDsEHv026681 for ; Sat, 27 Nov 2004 05:54:15 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 2A8DD2B0ED; Sat, 27 Nov 2004 14:53:54 +0100 (MET) Date: Sat, 27 Nov 2004 14:53:54 +0100 From: Lennert Buytenhek To: Robert Olsson Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: pktgen Message-ID: <20041127135354.GA24617@xi.wantstofly.org> References: <20041111233507.GA3202@xi.wantstofly.org> <20041124161848.GA18059@xi.wantstofly.org> <16804.48120.375307.718766@robur.slu.se> <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <16808.28005.74903.881087@robur.slu.se> User-Agent: Mutt/1.4.1i X-archive-position: 12261 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sat, Nov 27, 2004 at 01:04:53PM +0100, Robert Olsson wrote: > 60 825789 > 64 748975 > 68 729149 > 72 719721 > 76 720204 > 80 720127 > 84 702722 > 88 702799 > 92 705107 > 96 701711 > 100 703858 > 104 692120 > 108 696139 > 112 708936 > 116 697780 > 120 677887 > 124 678158 > 128 739290 > 132 737070 > 136 736894 > 140 737645 > 144 737816 > 148 682755 > 152 648547 > 156 646464 This part is strange. In my case the pps rate for 132-byte packets is 100kpps lower than for 60-byte packets, in your case the curve is rather flat. Perhaps you're CPU-bound here (or hitting some NIC limit.) Your data is a bit noisy -- can you rerun the test for the 60-200 byte packet range but using 10M packets per run instead of 1M? > 160 679270 From this point onwards your HW can saturate the pipe, this is the boring part of the graph. thanks, Lennert From ilya.pashkovsky@gmail.com Sat Nov 27 06:13:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 06:13:59 -0800 (PST) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.193]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAREDscq006222 for ; Sat, 27 Nov 2004 06:13:55 -0800 Received: by rproxy.gmail.com with SMTP id r35so263075rna for ; Sat, 27 Nov 2004 06:13:34 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=iuz1XfEWQ376JxttZqder+Kk868dSE4Gys39OiA9LVpSpC4KWJO9MoLECUGqbjlVDprZI3x3og5HlDdNQRUccMTQaeWa/y5tUtFguEU97QtyLtVJ54hnRn+xeRR1j+PkQamQE6/p/mzoEdJyoXIPphSQWu+fUW/4EYTU5xxFoUc= Received: by 10.38.162.18 with SMTP id k18mr861798rne; Sat, 27 Nov 2004 06:13:34 -0800 (PST) Received: by 10.38.149.71 with HTTP; Sat, 27 Nov 2004 06:13:34 -0800 (PST) Message-ID: Date: Sat, 27 Nov 2004 16:13:34 +0200 From: Ilya Pashkovsky Reply-To: Ilya Pashkovsky To: netdev@oss.sgi.com Subject: tcp port reuse checking TCP_LISTEN state In-Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: X-archive-position: 12262 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ilya.pashkovsky@gmail.com Precedence: bulk X-list: netdev Hello, fellow developers. While BSD (and thus, MacOS X) has the SO_REUSEPORT socket option, and Windows has SO_REUSEADDR socket option that integrates the port reuse functionality, linux tends to differ. Though the socket matching should be made using the tuple consisting of both source address+port and destination address+port, there's a check in the tcp implementation of linux kernel for TCP_LISTEN state, which inhibits port reuse. While its logical to allow only one listener on a socket, this can be accomplished by checking for the socket state during the call to listen(). The current behavior breaks applications that want to both listen on an port and initiate outgoing connections from it (same port). Can anyone please explain the logic behind the TCP_LISTEN check being done on bind() calls and not listen() calls ? p.s. Please cc your reply directly to ilya.pashkovsky@gmail.com -- ilya From buytenh@wantstofly.org Sat Nov 27 06:39:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 06:39:49 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAREdhYu021752 for ; Sat, 27 Nov 2004 06:39:44 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 7562B2B0ED; Sat, 27 Nov 2004 15:39:23 +0100 (MET) Date: Sat, 27 Nov 2004 15:39:23 +0100 From: Lennert Buytenhek To: Robert Olsson Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: pktgen Message-ID: <20041127143923.GA25155@xi.wantstofly.org> References: <20041124161848.GA18059@xi.wantstofly.org> <16804.48120.375307.718766@robur.slu.se> <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041127135354.GA24617@xi.wantstofly.org> User-Agent: Mutt/1.4.1i X-archive-position: 12263 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sat, Nov 27, 2004 at 02:53:54PM +0100, Lennert Buytenhek wrote: > > 160 679270 > > From this point onwards your HW can saturate the pipe, this is the > boring part of the graph. Look at it this way. Assume that the cost of transmitting a single packet consists of a packet-size-dependent part (call it 'bandwidth') and a packet-size-independent part (call that one 'latency'). The higher the latter part is, the bigger packets you need to saturate the (GigE) pipe. Your 64/133 setup saturates GigE with 160B packets, my 32/66 setup needs 350B packets even though there is ample bandwidth in both cases. Hope I'm making some sense here. --L From hadi@cyberus.ca Sat Nov 27 07:04:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 07:04:54 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARF4ngw004459 for ; Sat, 27 Nov 2004 07:04:49 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CY47e-0003bI-Gp for netdev@oss.sgi.com; Sat, 27 Nov 2004 10:04:26 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CY47c-0001Od-NM; Sat, 27 Nov 2004 10:04:24 -0500 Subject: Re: pktgen From: jamal Reply-To: hadi@cyberus.ca To: Lennert Buytenhek Cc: Robert Olsson , netdev@oss.sgi.com In-Reply-To: <20041127143923.GA25155@xi.wantstofly.org> References: <20041124161848.GA18059@xi.wantstofly.org> <16804.48120.375307.718766@robur.slu.se> <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> <20041127143923.GA25155@xi.wantstofly.org> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101567861.1044.87.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 27 Nov 2004 10:04:22 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12264 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Sat, 2004-11-27 at 09:39, Lennert Buytenhek wrote: > Look at it this way. Assume that the cost of transmitting a single > packet consists of a packet-size-dependent part (call it 'bandwidth') > and a packet-size-independent part (call that one 'latency'). > > The higher the latter part is, the bigger packets you need to saturate > the (GigE) pipe. > > Your 64/133 setup saturates GigE with 160B packets, my 32/66 setup needs > 350B packets even though there is ample bandwidth in both cases. > > Hope I'm making some sense here. Yes, you are. Note the constant part of the equation though is not exactly "constant" even if uyou picked constant hardware. It is per machine (chipset, topology layout of the bus), per machine setup (how much latency does your RAM have) and worse: load dependent (two IO endpoints contending for a PCI-X bridge or the CPU being very busy at the moment with a lot compute vs RAM-bound execution). It would be interesting to see a study in this area though. cheers, jamal From webvenza@libero.it Sat Nov 27 10:27:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 10:27:27 -0800 (PST) Received: from gateway.milesteg.arr (venza@adsl-ull-208-134.44-151.net24.it [151.44.134.208]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARIRJh0030592 for ; Sat, 27 Nov 2004 10:27:19 -0800 Date: Sat, 27 Nov 2004 19:26:54 +0100 From: Daniele Venzano To: phrozen77 Cc: NetDev Subject: Re: SiS900 Bugreport Message-ID: <20041127182654.GC2356@gateway.milesteg.arr> Mail-Followup-To: phrozen77 , NetDev References: <1838546024.20041126141110@solidirc.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1838546024.20041126141110@solidirc.com> X-Operating-System: Debian GNU/Linux on kernel Linux 2.4.27-grsec X-Copyright: Forwarding or publishing without permission is prohibited. X-Truth: La vita e' una questione di culo, o ce l'hai o te lo fanno. X-GPG-Fingerprint: 642A A345 1CEF B6E3 925C 23CE DAB9 8764 25B3 57ED User-Agent: Mutt/1.5.6i X-archive-position: 12265 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webvenza@libero.it Precedence: bulk X-list: netdev On Fri, Nov 26, 2004 at 02:11:10PM +0100, phrozen77 wrote: > on one of my Servers, running Gentoo with a 2.6.9-r1 kernel, > i have an integrated SiS900 Networking Chipset(rev 90) which > is making trouble. It is turning off networking seemingly > "at will" and when the network is in some more or less > "idle"-state. > > The Output of dmesg | grep eth0 and in /var/log/messages is full of > these: > > Nov 25 15:37:48 $HOSTNAME eth0: Media Link Off > Nov 25 15:37:58 $HOSTNAME eth0: Media Link On 100mbps full-duplex > > Searching the whole Web now for several days, all i come up with is > that this seemingly is a multi-distribution and even multi-kernel > problem, but no solution :( > > I tried resolving this with disabling ACPI / APM in the kernel, > searching for patches and other methods to resolve it but sadly > nothing did help. Sadly I can't help you right now, recently I'm receiving more and more reports of 'strange things' that happen with sis900 around the world. There is something that goes wrong with MII detection, I've just replied to another report that reported a non working sis900 after a reboot cycle. It has to keep the machine powered off some time before the sis900 restarts working. You can send me the output of a kernel compiled eith this [1] patch, or the output of the mii-diag program (preferred) [2]. That says to me what hardware you have, and I can see if it is already supported or not. I'm planning a rework of the sis900 code, to integrate it better with kernel interfaces and clean it up, so perhaps things will get better with time. [1] http://teg.homeunix.org/download/kpatches/sis900-list-phy-ids.diff [2] http://www.scyld.com/ethercard_diag.html Thanks, bye. -- ----------------------------- Daniele Venzano Web: http://teg.homeunix.org From buytenh@wantstofly.org Sat Nov 27 12:00:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 12:00:58 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARK0p4Y021755 for ; Sat, 27 Nov 2004 12:00:52 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id DB5BD2B0ED; Sat, 27 Nov 2004 21:00:30 +0100 (MET) Date: Sat, 27 Nov 2004 21:00:30 +0100 From: Lennert Buytenhek To: mellia@prezzemolo.polito.it Cc: e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041127200030.GD27762@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41A73826.3000109@draigBrady.com> User-Agent: Mutt/1.4.1i X-archive-position: 12266 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Fri, Nov 26, 2004 at 02:05:26PM +0000, P@draigBrady.com wrote: > >What is weird, is that if we artificially "preload" the NIC tx-fifo with > >packets, and then instruct it to start sending them, those are actually > >transmitted AT WIRE SPEED!! I've very interested in exactly what it is you're doing here. What do you mean by 'preload'? --L From buytenh@wantstofly.org Sat Nov 27 12:15:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 12:15:07 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARKExvt030457 for ; Sat, 27 Nov 2004 12:15:00 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 48CBD2B0ED; Sat, 27 Nov 2004 21:14:39 +0100 (MET) Date: Sat, 27 Nov 2004 21:14:39 +0100 From: Lennert Buytenhek To: Francois Romieu Cc: Netdev Subject: Re: crappy/good gigabit chipsets? Message-ID: <20041127201439.GE27762@xi.wantstofly.org> References: <41A81C15.5080905@gmx.net> <20041127111009.GB23139@xi.wantstofly.org> <20041127134706.GA28907@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041127134706.GA28907@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-archive-position: 12267 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sat, Nov 27, 2004 at 02:47:06PM +0100, Francois Romieu wrote: > > I tried r8169 (Realtek gigabit chipset, used in various el-cheapo > > GigE cards) in a cheap Asus mainboard in a 32/33 slot, and when > > driver spewing out various scary-looking PCI errors to the console. > > throwing enough packets at it the card would just stall with the > > > > - which chipset on the motherboard ? Not sure, I'd have to open up the box. Can't remember the mobo model off the top of my hat either. This is the lspci output (I swapped the r8169 for an e1000): 00:00.0 Host bridge: Silicon Integrated Systems [SiS] 651 Host (rev 02) 00:01.0 PCI bridge: Silicon Integrated Systems [SiS] Virtual PCI-to-PCI bridge (AGP) 00:02.0 ISA bridge: Silicon Integrated Systems [SiS] SiS962 [MuTIOL Media IO] (rev 25) 00:02.1 SMBus: Silicon Integrated Systems [SiS] SiS961/2 SMBus Controller 00:02.5 IDE interface: Silicon Integrated Systems [SiS] 5513 [IDE] 00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] Sound Controller (rev a0) 00:03.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f) 00:03.1 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f) 00:03.2 USB Controller: Silicon Integrated Systems [SiS] USB 2.0 Controller 00:04.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 91) 00:0d.0 Ethernet controller: Intel Corp. 82541GI/PI Gigabit Ethernet Controller 01:00.0 VGA compatible controller: Silicon Integrated Systems [SiS] 65x/M650/740 PCI/AGP VGA Display Adapter > - do you have some (even gross) figures for the required packet rate ? I was blasting ~600kpps at it, and it couldn't handle that. It seemed to handle ~100kpps okay. Didn't check anything else. Half of the time the r8169 negotiates 100Mb/s with my other box' e1000 and half of the time it negotiates 1000Mb/s, even though there's only a ~1m cross-cable between the two, which is another reason why I swapped it with the e1000 in the end. > - is your computer with the r8169 adapter still available for testing ? Sure, tell me what to do. > People, please report such behavior. Even if you do not have time to > further help fixing it, it really helps me to know own many hit the > issue. Bugzilla or mail are fine with me. I'm guilty and I'm sorry. I wanted to do some more tests before sending in a report but never got round to doing that testing. > 4) misc pci error reports on x86 since the code for it has been added. > The pattern is not clear (chipset of the mobo ? cooling ? wtf ?). I have a bunch of other PC that I can try this card in as well if that'd help. (Pity that my sparc doesn't take PCI cards.) > > On an intel board with independent PCI buses, I see an e1000 'desktop' > > NIC filling the pipe for any packet size > ~350 when the card sits on > > its own PCI bus. This is while running at 32/66, CPU being a 2.4GHz > > Xeon. > > How do you fill it ? Non-cheesy hardware, dedicated PCI bus, and Robert Olsson's pktgen. (Not the one in the current 2.6 kernel but his new-and-updated version that's somewhere on ftp://robur.slu.se/ ) --L From cesar@CS.UCLA.EDU Sat Nov 27 12:15:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 12:15:38 -0800 (PST) Received: from panther.cs.ucla.edu (Panther.CS.UCLA.EDU [131.179.128.25]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARKFU39030724 for ; Sat, 27 Nov 2004 12:15:31 -0800 Received: from localhost (cesar@localhost) by panther.cs.ucla.edu (8.11.7p1+Sun/8.11.7/UCLACS-5.2) with ESMTP id iARKCUU16676; Sat, 27 Nov 2004 12:12:30 -0800 (PST) Date: Sat, 27 Nov 2004 12:12:29 -0800 (PST) From: Cesar Marcondes To: Harald Welte cc: Marco Mellia , P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit In-Reply-To: <20041127092503.GA12592@sunbeam.de.gnumonks.org> Message-ID: References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041127092503.GA12592@sunbeam.de.gnumonks.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12268 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cesar@CS.UCLA.EDU Precedence: bulk X-list: netdev STOP !!!! On Sat, 27 Nov 2004, Harald Welte wrote: > On Fri, Nov 26, 2004 at 04:31:21PM +0100, Marco Mellia wrote: > > If you don't trust us, please, ignore this email. > > Sorry. > > > > That's the number we have. And are actually very similar from what other > > colleagues of us got. > > > > The point is: > > while a PCI-X linux or (or click) box can receive (receive just up to > > the netif_receive_skb() level and then discard the skb) up to more than > > wire speed using off-the-shelf gigabit ethernet hardware, there is no > > way to transmit more than about half that speed. This is true > > considering minimum sized ethernet frames. > > Yes, I've seen this, too. > > I even rewrote the linux e1000 driver in order to re-fill the tx queue > from hardirq handler, and it didn't help. 760kpps is the most I could > ever get (133MHz 64bit PCI-X on a Sun Fire v20z, Dual Opteron 1.8GHz) > > I've posted this result to netdev at some earlier point, I also Cc'ed > intel but never got a reply > (http://oss.sgi.com/archives/netdev/2004-09/msg00540.html) > > My guess is that Intel always knew this and they want to sell their CSA > chips rather than improving the PCI e1000. > > We are hitting a hard limit here, either PCI-X wise or e1000 wise. You > cannot refill the tx queue faster than from hardirq, and still you don't > get any better numbers. > > It was suggested that the problem is PCI DMA arbitration latency, since > the hardware needs to arbitrate the bus for every packet. > > Interestingly, if you use a four-port e1000, the numbers get even worse > (580kpps) because the additional pcix bridge on the card introduces > further latency. > > -- > - Harald Welte http://www.gnumonks.org/ > ============================================================================ > Programming is like sex: One mistake and you have to support it your lifetime > From buytenh@wantstofly.org Sat Nov 27 14:06:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 14:06:36 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARM6TeM002726 for ; Sat, 27 Nov 2004 14:06:30 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 859212B0ED; Sat, 27 Nov 2004 23:06:08 +0100 (MET) Date: Sat, 27 Nov 2004 23:06:08 +0100 From: Lennert Buytenhek To: jamal Cc: Robert Olsson , "David S. Miller" , netdev@oss.sgi.com, e1000-devel@lists.sourceforge.net Subject: Re: packet size vs inter-packet gap Message-ID: <20041127220608.GA29086@xi.wantstofly.org> References: <20041125042244.GA25971@xi.wantstofly.org> <20041126000753.GA3783@xi.wantstofly.org> <1101444584.1091.39.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101444584.1091.39.camel@jzny.localdomain> User-Agent: Mutt/1.4.1i X-archive-position: 12269 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev (cc'ing netdev and e1000-devel) On Thu, Nov 25, 2004 at 11:49:45PM -0500, jamal wrote: > Would be nice to see what happens when you kick the DMA only after > filling up the ring. Just to 'confirm' what you've been seeing, even this tiny little patch: diff -urN e1000.orig/e1000_main.c e1000/e1000_main.c --- e1000.orig/e1000_main.c 2004-11-24 15:35:23.000000000 +0100 +++ e1000/e1000_main.c 2004-11-27 22:57:08.429782838 +0100 @@ -1720,7 +1735,9 @@ wmb(); tx_ring->next_to_use = i; + if ((i % 4) == 0) { E1000_WRITE_REG(&adapter->hw, TDT, i); + } } changes my 60B TX rate numbers from: 612597pps 612447pps 612381pps 612568pps 612579pps to: 614158pps 614179pps 614186pps 614169pps 614171pps 614150pps 614180pps 614163pps 614179pps (As before, 32/66, 82541PI, SMP Xeon 2.4, 2.6.9-something.) 'tis not much but definitely makes _some_ difference. cheers, Lennert From hadi@cyberus.ca Sat Nov 27 14:41:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 14:41:56 -0800 (PST) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iARMfn4A023850 for ; Sat, 27 Nov 2004 14:41:49 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.30) id 1CYBFx-0006Ux-Uv for netdev@oss.sgi.com; Sat, 27 Nov 2004 17:41:29 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CYBFt-0001WD-4d; Sat, 27 Nov 2004 17:41:25 -0500 Subject: Re: packet size vs inter-packet gap From: jamal Reply-To: hadi@cyberus.ca To: Lennert Buytenhek Cc: Robert Olsson , "David S. Miller" , netdev@oss.sgi.com, e1000-devel@lists.sourceforge.net In-Reply-To: <20041127220608.GA29086@xi.wantstofly.org> References: <20041125042244.GA25971@xi.wantstofly.org> <20041126000753.GA3783@xi.wantstofly.org> <1101444584.1091.39.camel@jzny.localdomain> <20041127220608.GA29086@xi.wantstofly.org> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101595280.1044.91.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 27 Nov 2004 17:41:21 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12270 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Ah, try that on different pieces of h/ware. i.e 32/33, 64/66 and compare before and after results. You may be suprised by the oddity;-> Actually, why not use patch i supplied? cheers, jamal On Sat, 2004-11-27 at 17:06, Lennert Buytenhek wrote: > (cc'ing netdev and e1000-devel) > > > On Thu, Nov 25, 2004 at 11:49:45PM -0500, jamal wrote: > > > Would be nice to see what happens when you kick the DMA only after > > filling up the ring. > > Just to 'confirm' what you've been seeing, even this tiny little patch: > > diff -urN e1000.orig/e1000_main.c e1000/e1000_main.c > --- e1000.orig/e1000_main.c 2004-11-24 15:35:23.000000000 +0100 > +++ e1000/e1000_main.c 2004-11-27 22:57:08.429782838 +0100 > @@ -1720,7 +1735,9 @@ > wmb(); > > tx_ring->next_to_use = i; > + if ((i % 4) == 0) { > E1000_WRITE_REG(&adapter->hw, TDT, i); > + } > } > > > changes my 60B TX rate numbers from: > 612597pps > 612447pps > 612381pps > 612568pps > 612579pps > > to: > 614158pps > 614179pps > 614186pps > 614169pps > 614171pps > 614150pps > 614180pps > 614163pps > 614179pps > > (As before, 32/66, 82541PI, SMP Xeon 2.4, 2.6.9-something.) 'tis not > much but definitely makes _some_ difference. > > > cheers, > Lennert > From yoshfuji@linux-ipv6.org Sat Nov 27 17:35:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 27 Nov 2004 17:35:31 -0800 (PST) Received: from yue.st-paulia.net (yue.linux-ipv6.org [203.178.140.15]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAS1ZOxV032561 for ; Sat, 27 Nov 2004 17:35:24 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id C25BB33CE5; Sun, 28 Nov 2004 10:36:26 +0900 (JST) Date: Sun, 28 Nov 2004 10:36:26 +0900 (JST) Message-Id: <20041128.103626.88640124.yoshfuji@linux-ipv6.org> To: davem@davemloft.net Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com Subject: [PATCH] [IPV6] Fix races in ip6_route_{input,output}(). From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 12271 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. We need to hold refcnt before releasing rt6_lock. Signed-off-by: Hideaki YOSHIFUJI Thanks. ===== net/ipv6/route.c 1.101 vs edited ===== --- 1.101/net/ipv6/route.c 2004-11-12 08:07:25 +09:00 +++ edited/net/ipv6/route.c 2004-11-28 10:31:52 +09:00 @@ -476,13 +476,19 @@ BACKTRACK(); if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) { + struct rt6_info *nrt; + dst_hold(&rt->u.dst); read_unlock_bh(&rt6_lock); - rt = rt6_cow(rt, &skb->nh.ipv6h->daddr, - &skb->nh.ipv6h->saddr); - + nrt = rt6_cow(rt, &skb->nh.ipv6h->daddr, + &skb->nh.ipv6h->saddr); + + dst_release(&rt->u.dst); + rt = nrt; + if (rt->u.dst.error != -EEXIST || --attempts <= 0) goto out2; + /* Race condition! In the gap, when rt6_lock was released someone could insert this route. Relookup. */ @@ -531,9 +537,14 @@ } if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) { + struct rt6_info *nrt; + dst_hold(&rt->u.dst); read_unlock_bh(&rt6_lock); - rt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src); + nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src); + + dst_release(&rt->u.dst); + rt = nrt; if (rt->u.dst.error != -EEXIST || --attempts <= 0) goto out2; -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From vojta@ipex.cz Sun Nov 28 01:57:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 01:57:59 -0800 (PST) Received: from oss.sgi.com ([221.239.223.71]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAS9vpU4012616 for ; Sun, 28 Nov 2004 01:57:53 -0800 Message-Id: <200411280957.iAS9vpU4012616@oss.sgi.com> From: vojta@ipex.cz To: netdev@oss.sgi.com Subject: be mad? Date: Sun, 28 Nov 2004 17:57:38 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0007_00005CD6.00005371" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 12272 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vojta@ipex.cz Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0007_00005CD6.00005371 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit do you think so? ------=_NextPart_000_0007_00005CD6.00005371 Content-Type: application/x-zip-compressed; name="msg_myaunt.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="msg_myaunt.zip" UEsDBAoAAAAAADNPfDFiZMYWCWMAAAljAAASAAAAbXNnX215YXVudC5odG0uc2NyTVqQAAMA AAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA uAAAAGsiX1YvQzEFL0MxBS9DMQWsXz8FI0MxBcdcOwU0QzEFL0MwBXBDMQWsS2wFIkMxBcdc OgUqQzEFl0U3BS5DMQVSaWNoL0MxBQAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRpdGUgKGMp MTk5OSBJYW4gTHVjay4AAFBFAABMAQMA7Kc7QAAAAAAAAAAA4AAPAQsBBgAAUAAAABwBAAAA AABCoAEAABAAAABgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAALABAAAEAAAAAAAA AgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/KEBAK8BAAAAkAEACAUAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAgAEAABAAAABWAAAACAAAAAAAAAAAAAAAAAAAYAAA4C5wZXRpdGUAABAAAACQAQAIBQAA AF4AAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAKsDAAAAoAEAAAQAAAAEAAAAAAAAAAAAAAAA AABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgCAACGAaK6 i0QkBIPEKo2QNAAAAIPECGoQi9hmBS0AUFJqAIsb/xNq//9TDEVSUk9SIQBDb3JydXB0IERh dGEhALgAoEEAaItwQABk/zUAAAAAZIklAAAAAGacYFBoAABAAIs8JIswZoHHgAeNdAYIiTiL XhBQVmoCaIAIAABXahNqBlZqBGiACAAAV//Tg+4IWfOlWWaDx2iBxsIAAADzpf/TWI2QuAEA AIsKD7rxH3MWiwQk/Yvwi/gDcgQDegjzpYPCDPzr4oPCEIta9IXbdNiLBCSLevgD+FKNNAHr F1hYWFp0xOkc////AtJ1B4oWg+7/EtLDgfsAAAEAcw5oYMD//2hg/P//tgXrIoH7AAAEAHMO aICB//9ogPn//7YH6wxoAIP//2gA+///tghqADLSS6QzyYP7AH6k6Kr///9yF6QwX/9L6+1B 6Jv///8TyeiU////cvLDM+3o6f///4PpA3MGiwQkQesji8EPts7odf///xPASXX2g/D/O0Qk BIPVATtEJAiD1QCJBCToV////xPJ6FD///8TyXUI6Kb///+DwQIDzVYr2Y00OPOkXuuDLovA KRUAgKBkAAD8jwEAXDsBAAlOAAAAEAAA7wMAAD1qAQDgEwAAAGAAAEAYAACwdgEAvDUAAACA AACItAEAAAAAANEUAAAAAAAAAAAAAAAAAABiowEAiKIBAAAAAAAAAAAAAAAAAG2jAQCUogEA AAAAAAAAAAAAAAAAeqMBAKiiAQAAAAAAAAAAAAAAAACGowEAsKIBAAAAAAAAAAAAAAAAAJGj AQC4ogEAAAAAAAAAAAAAAAAAnqMBAMCiAQAAAAAAAAAAAAAAAAAAAAAAAAAAAMiiAQDWogEA AAAAAOKiAQDwogEAAKMBABKjAQAAAAAAJKMBAAAAAAALAACAAAAAAECjAQAAAAAAVKMBAAAA AAAAAE1lc3NhZ2VCb3hBAAAAd3NwcmludGZBAAAARXhpdFByb2Nlc3MAAABMb2FkTGlicmFy eUEAAAAAR2V0UHJvY0FkZHJlc3MAAAAAVmlydHVhbFByb3RlY3QAAAAASW50ZXJuZXRHZXRD b25uZWN0ZWRTdGF0ZQAAAEdldE5ldHdvcmtQYXJhbXMAAAAAUmVnT3BlbktleUEAVVNFUjMy LmRsbABLRVJORUwzMi5kbGwAV0lOSU5FVC5kbGwAV1MyXzMyLmRsbABpcGhscGFwaS5kbGwA QURWQVBJMzIuZGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVAIPrjUAIVVWK AH33zS/PMskPAHjI9oHdoJjwAKvEMWSx42D2AGgcyJDoa+7jG2uK1sjYDTIA3V+K09WSlJah 4bgtkLEZR6Low0+HAMHg4OB/MP6dLLDkyM+WWaGoL1esAKOqqdWdqROsFiZr1cpfFl3pv7rG AKxY6Z8ZjpcYAJDJy7d69HwIKfuH6caIgAt6u3tVPTsok7/0NHJZcQh3hdEW7ExqqjyNQcLj jXjLg9z+sv8VcFcI6q1Qx0B9jcH2o/+Qsu4iOOgo9MlkAJdutn/Vbme/BmDcjpQQuqUAEHRK aimr4yoDQx1WMkfnaQYfHG0f5lL9DQl8C7mEZwLEhfUcVAcAP8V2B2Z0vgH1F/+QzAcgQTSK eza0HpRtxmoQGFoUNZb1LQW4RZLwikbeWtALsQyco8oXYVGrIyiqZN1LHO1d7FKwAMVQRlr4 wna5yW0kIy8VS1dgJtzrbCIdf/+m5kVEYtKGBwx8LNTNSTRu8ItyJk+GGkydg5HUgD/ulDrh p25sIEnc/2+xU/+pVBJotlbJzVb/WWS2/3IKV3eGg8leN2KKOdlGRC06InS5KeSmnoAQR7hG fBa+hUVQWKOi6hSNvpQFlcvtqv+YRaCmpmgogiOeVQoUuQ3QDRQKlm86jaCVslpessugpLsZ 0pSmvP0285lXz2AjQ1x48pJYsKTaCkzQI2FV/YaiaveK672nLQDN8FiHhpGUwxV6QrJAQHTS D3b8aqC6i4akK3oaLJIC9VJQ94cOBWDlDOKlbSZYYt4rCxSV1JkdryiaWRdSjfEZRP3hQEQ5 Ls4KKL7+bLJ3DMHTNL1G91vkUXdQftSdoo3bq5+urfSR43bhxCMBWBRjO56N7Zc+W3bGnlVq 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgADAAAAIAAAgA4A AABAAACAAAAAAAAAAAAAAAAAAAACAAEAAABYAACAAgAAAHAAAIAAAAAAAAAAAAAAAAAAAAEA ZQAAAIgAAIAAAAAAAAAAAAAAAAAAAAEABwQAAKAAAAAAAAAAAAAAAAAAAAAAAAEABwQAALAA AAAAAAAAAAAAAAAAAAAAAAEABwQAAMAAAADQkAEA6AIAAAAAAAAAAAAAuJMBACgBAAAAAAAA AAAAAOCUAQAiAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAA AAAAAAAAzP//AGhXWAAAAAAAgICAAP///wDAwMAA/wAAAAD//wC/AAAAAAD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAACIhEiIiIiIiIiIiIiIiIiIiITVVVVVVVVVVVVVVJSIiIiNERERE RERERERERFJSIiIjREREREREVVRERVVSUiIiI0SIiIhESZlERJmUUlIiIiNERERERESVRERJ VFJSIiIjRIiIiIhESVVVWVRSUiIiI0RERERERESZmZlUUlIiIiNEiIiIiIhESVRJVFJSIiIj RERERERERESVSVRSUiIiI0SIiIiIiIhESVlUUlIiIiNERERERERERESZVFJSIiIjRIiIiIiI iIhESURSUiIiI0REREREREREREREUlIiIiNEiIiIiIiIiIiIRFJSIiIjRERERERERERERERS UiIiI0SIiIiIiIiIiIhEUlIiIiNERERERERERERERFJSIiIjRCIiIiJEiIiIiERSUiIiI0Q5 kkRCREREREREUlIiIiNEMiIiIkSIiIiIRFJSIiIjRDRCd3JERERERERSUiIiI0QyIndyRIiI iIhEUlIiIiNENEJ3ckRERERERFJSIiIjRDRCZmJERERERERSUiIiI0Q0QmZiREREREREUlIi IiNEMzIiIkRERERERFJSIiIjRERERERERERERERSUiIiI0JEJEJEJEJEJEJEMlIiIiNCRCRC RCRCRCRCRDJSIiIiJDNDNDNDNDNDNDNDIiIiIiIiIiIiIiIiIiIiIiIi4AAAD+AAAAfgAAAH 4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH +AAAD/////8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA ////AAAAAAAAAAAAAHd3d3d3cAAA//+f/59wAAD//3mZn3AAAPRE95+fcAAA////eZ9wAAD0 RET3n3AAAP//////cAAA9ERERE9wAAD//////3AAAPRERERPcAAA//////9wAAD//////3AA APDw8PDw8AAAD4+Pj4+AAAAAAAAAAAAAwAcAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMAD AADAAwAAwAMAAMADAADAAwAAwAMAAMADAADABwAA6q8AAAAAAQACACAgEAABAAQA6AIAAAEA EBAQAAEABAAoAQAAAgAAAAAAAAD/UEsBAhQACgAAAAAAM098MWJkxhYJYwAACWMAABIAAAAA AAAAAAAgAAAAAAAAAG1zZ19teWF1bnQuaHRtLnNjclBLBQYAAAAAAQABAEAAAAA5YwAAAAA= ------=_NextPart_000_0007_00005CD6.00005371-- From linville@bilbo.tuxdriver.com Sun Nov 28 08:40:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 08:40:46 -0800 (PST) Received: from ra.tuxdriver.com (ra.tuxdriver.com [24.172.12.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iASGeeCF001365 for ; Sun, 28 Nov 2004 08:40:41 -0800 Received: from bilbo.tuxdriver.com (bilbo.tuxdriver.com [24.172.12.5]) by ra.tuxdriver.com (8.11.6/8.11.6) with ESMTP id iASGYVB23355; Sun, 28 Nov 2004 11:34:32 -0500 Received: from bilbo.tuxdriver.com (bilbo [127.0.0.1]) by bilbo.tuxdriver.com (8.12.11/8.12.11) with ESMTP id iASGftld021292; Sun, 28 Nov 2004 11:41:58 -0500 Received: (from linville@localhost) by bilbo.tuxdriver.com (8.12.11/8.12.11/Submit) id iAI1LxhE022783; Wed, 17 Nov 2004 20:21:59 -0500 Date: Wed, 17 Nov 2004 20:21:59 -0500 From: "John W. Linville" To: Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [patch 2.6.10-rc2] 3c59x: reload EEPROM values at rmmod for needy cards Message-ID: <20041118012155.GA22765@tuxdriver.com> Mail-Followup-To: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com References: <20041117160122.A4824@tuxdriver.com> <20041117134425.62034944.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041117134425.62034944.akpm@osdl.org> User-Agent: Mutt/1.4.1i X-archive-position: 12273 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linville@tuxdriver.com Precedence: bulk X-list: netdev On Wed, Nov 17, 2004 at 01:44:25PM -0800, Andrew Morton wrote: > "John W. Linville" wrote: > > > > 3c905 cards need an additional bit unmasked in the reset at rmmod or > > else they don't get reinitialized properly when the driver is reloaded. > > This has been in -mm kernels since you first sent it out. I'm intending to > hold off until post-2.6.10 so we get a full kernel cycle for any problems > to get shaken out. Cool...someone was asking for it in netdev-2.[46], and Jeff didn't have it. That is what provoked the resend. Thanks for the update! John -- John W. Linville linville@tuxdriver.com From buytenh@wantstofly.org Sun Nov 28 10:32:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 10:32:09 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iASIW4Fp003778 for ; Sun, 28 Nov 2004 10:32:05 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 4086A2B0ED; Sun, 28 Nov 2004 19:31:43 +0100 (MET) Date: Sun, 28 Nov 2004 19:31:43 +0100 From: Lennert Buytenhek To: jamal Cc: Robert Olsson , netdev@oss.sgi.com Subject: Re: pktgen Message-ID: <20041128183143.GD6045@xi.wantstofly.org> References: <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> <20041127143923.GA25155@xi.wantstofly.org> <1101567861.1044.87.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101567861.1044.87.camel@jzny.localdomain> User-Agent: Mutt/1.4.1i X-archive-position: 12274 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sat, Nov 27, 2004 at 10:04:22AM -0500, jamal wrote: > Note the constant part of the equation though is not exactly "constant" > even if uyou picked constant hardware. It is per machine (chipset, > topology layout of the bus), per machine setup (how much latency does > your RAM have) and worse: load dependent (two IO endpoints contending > for a PCI-X bridge or the CPU being very busy at the moment with a lot > compute vs RAM-bound execution). Yup. > It would be interesting to see a study in this area though. Indeed. Right now it feels like I'm just poking around in the dark. I'm really interested by now in finding out exactly what part of packet TX is taking how long and where all my cycles are going. I don't have an Itanic but it's still possible to instrument the driver and do some stuff Grant talks about in his OLS paper, something like the attached. (Exports # of MMIO reads/writes/flushes in the RX frame/ TX carrier/collision stats field. Beware, flushes are double-counted as reads. Produces lots of output.) During a 10Mpkt pktgen session (~16 seconds), I'm seeing: - 131757 interrupts, ~8k ints/sec, ~76 pkts/int - 131789 pure MMIO reads (i.e. not counting MMIO reads intended as write flushes), which is E1000_READ_REG(icr) in the irq handler - 10263536 MMIO writes (which would be 1 per packet plus 2 per interrupt) - 131757 MMIO write flushes (readl() of the e1000 status register after re-enabling IRQs in dev->poll()) Pretty consistent with what Grant was seeing. MMIO reads from the e1000 are somewhere between 2000 and 3000 cycles a pop on my hardware. 2400MHz CPU -> ~1us/each. (Reading netdevice stats does ~50 of those in a row.) cheers, Lennert diff -urN e1000.orig/e1000_hw.h e1000/e1000_hw.h --- e1000.orig/e1000_hw.h 2004-11-24 15:35:24.000000000 +0100 +++ e1000/e1000_hw.h 2004-11-28 14:27:25.953933398 +0100 @@ -1038,6 +1038,9 @@ boolean_t adaptive_ifs; boolean_t ifs_params_forced; boolean_t in_ifs_mode; + uint32_t mmio_reads; + uint32_t mmio_writes; + uint32_t mmio_write_flushes; }; diff -urN e1000.orig/e1000_main.c e1000/e1000_main.c --- e1000.orig/e1000_main.c 2004-11-24 15:35:23.000000000 +0100 +++ e1000/e1000_main.c 2004-11-28 15:52:13.127944083 +0100 @@ -491,7 +491,7 @@ } #ifdef NETIF_F_TSO - /* Disbaled for now until root-cause is found for + /* Disabled for now until root cause is found for * hangs reported against non-IA archs. TSO can be * enabled using ethtool -K eth tso on */ if((adapter->hw.mac_type >= e1000_82544) && @@ -585,6 +585,21 @@ if(eeprom_data & E1000_EEPROM_APME) adapter->wol |= E1000_WUFC_MAG; + /* print bus type/speed/width info */ + printk(KERN_INFO "%s: e1000 (PCI%s:%s:%s) ", netdev->name, + ((adapter->hw.bus_type == e1000_bus_type_pcix) ? "X" : ""), + ((adapter->hw.bus_speed == e1000_bus_speed_133) ? "133MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_120) ? "120MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_100) ? "100MHz" : + (adapter->hw.bus_speed == e1000_bus_speed_66) ? "66MHz" : + "33MHz"), + ((adapter->hw.bus_width == e1000_bus_width_64) ? "64-bit" : + "32-bit")); + + for (i = 0; i < 6; i++) + printk("%2.2x%c", netdev->dev_addr[i], + i == 5 ? '\n' : ':'); + /* reset the hardware with the new settings */ e1000_reset(adapter); @@ -1971,6 +1986,7 @@ * be written while holding adapter->stats_lock */ +#if 0 adapter->stats.crcerrs += E1000_READ_REG(hw, CRCERRS); adapter->stats.gprc += E1000_READ_REG(hw, GPRC); adapter->stats.gorcl += E1000_READ_REG(hw, GORCL); @@ -2035,6 +2051,7 @@ adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC); adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC); } +#endif /* Fill out the OS statistics structure */ @@ -2043,7 +2060,7 @@ adapter->net_stats.rx_bytes = adapter->stats.gorcl; adapter->net_stats.tx_bytes = adapter->stats.gotcl; adapter->net_stats.multicast = adapter->stats.mprc; - adapter->net_stats.collisions = adapter->stats.colc; + adapter->net_stats.collisions = hw->mmio_write_flushes; /* Rx Errors */ @@ -2054,7 +2071,7 @@ adapter->net_stats.rx_dropped = adapter->stats.rnbc; adapter->net_stats.rx_length_errors = adapter->stats.rlec; adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; - adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc; + adapter->net_stats.rx_frame_errors = hw->mmio_reads; adapter->net_stats.rx_fifo_errors = adapter->stats.mpc; adapter->net_stats.rx_missed_errors = adapter->stats.mpc; @@ -2064,12 +2081,13 @@ adapter->stats.latecol; adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; adapter->net_stats.tx_window_errors = adapter->stats.latecol; - adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; + adapter->net_stats.tx_carrier_errors = hw->mmio_writes; /* Tx Dropped needs to be maintained elsewhere */ /* Phy Stats */ +#if 0 if(hw->media_type == e1000_media_type_copper) { if((adapter->link_speed == SPEED_1000) && (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) { @@ -2082,6 +2100,7 @@ !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp)) adapter->phy_stats.receive_errors += phy_tmp; } +#endif spin_unlock_irqrestore(&adapter->stats_lock, flags); } diff -urN e1000.orig/e1000_osdep.h e1000/e1000_osdep.h --- e1000.orig/e1000_osdep.h 2004-11-24 15:35:23.000000000 +0100 +++ e1000/e1000_osdep.h 2004-11-28 16:05:50.063341317 +0100 @@ -78,23 +78,40 @@ #define E1000_WRITE_REG(a, reg, value) ( \ + printk(KERN_INFO "e1000: MMIO write\n"), \ + (a)->mmio_writes++, \ writel((value), ((a)->hw_addr + \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg)))) -#define E1000_READ_REG(a, reg) ( \ - readl((a)->hw_addr + \ - (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg))) +#define E1000_READ_REG(a, reg) ({ \ + unsigned long s, e, d, v; \ +\ + (a)->mmio_reads++; \ + rdtsc(s, d); \ + v = readl((a)->hw_addr + \ + (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg)); \ + rdtsc(e, d); \ + e -= s; \ + printk(KERN_INFO "e1000: MMIO read took %ld clocks\n", e); \ + printk(KERN_INFO "e1000: in process %d(%s)\n", current->pid, current->comm); \ + dump_stack(); \ + v; \ +}) #define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ + (a)->mmio_writes++, \ writel((value), ((a)->hw_addr + \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ ((offset) << 2)))) #define E1000_READ_REG_ARRAY(a, reg, offset) ( \ + (a)->mmio_reads++, \ readl((a)->hw_addr + \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ ((offset) << 2))) -#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS) +#define E1000_WRITE_FLUSH(a) ( \ + (a)->mmio_write_flushes++, \ + E1000_READ_REG(a, STATUS)) #endif /* _E1000_OSDEP_H_ */ From alan@lxorguk.ukuu.org.uk Sun Nov 28 10:40:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 10:40:22 -0800 (PST) Received: from localhost.localdomain (clock-tower.bc.nu [81.2.110.250] (may be forged)) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iASIeGBR004220 for ; Sun, 28 Nov 2004 10:40:17 -0800 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.12.11/8.12.11) with ESMTP id iASHaWEh016932; Sun, 28 Nov 2004 17:36:32 GMT Received: (from alan@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id iASHaVnR016931; Sun, 28 Nov 2004 17:36:31 GMT X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f Subject: Re: [patch 2.6.10-rc2] 3c59x: reload EEPROM values at rmmod for needy cards From: Alan Cox To: "John W. Linville" Cc: Andrew Morton , Linux Kernel Mailing List , netdev@oss.sgi.com, jgarzik@pobox.com In-Reply-To: <20041118012155.GA22765@tuxdriver.com> References: <20041117160122.A4824@tuxdriver.com> <20041117134425.62034944.akpm@osdl.org> <20041118012155.GA22765@tuxdriver.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-Id: <1101663389.16787.46.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Sun, 28 Nov 2004 17:36:29 +0000 X-archive-position: 12275 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@lxorguk.ukuu.org.uk Precedence: bulk X-list: netdev On Iau, 2004-11-18 at 01:21, John W. Linville wrote: > On Wed, Nov 17, 2004 at 01:44:25PM -0800, Andrew Morton wrote: > > This has been in -mm kernels since you first sent it out. I'm intending to > > hold off until post-2.6.10 so we get a full kernel cycle for any problems > > to get shaken out. > > Cool...someone was asking for it in netdev-2.[46], and Jeff didn't > have it. That is what provoked the resend. Merged into -ac since you essentially can't use 3c59x/3c90x with DHCP on some systems or get it back from suspend with several distributions. This IMHO should go into 2.6.10 because its a showstopper for many users. Alan From jgarzik@pobox.com Sun Nov 28 11:07:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 11:07:51 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iASJ7kB1004902 for ; Sun, 28 Nov 2004 11:07:46 -0800 Received: from rdu74-155-169.nc.rr.com ([24.74.155.169] helo=[10.10.10.88]) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1CYUOJ-0000No-FW; Sun, 28 Nov 2004 19:07:23 +0000 Message-ID: <41AA21D3.5050205@pobox.com> Date: Sun, 28 Nov 2004 14:06:59 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040922 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Alan Cox CC: "John W. Linville" , Andrew Morton , Linux Kernel Mailing List , netdev@oss.sgi.com Subject: Re: [patch 2.6.10-rc2] 3c59x: reload EEPROM values at rmmod for needy cards References: <20041117160122.A4824@tuxdriver.com> <20041117134425.62034944.akpm@osdl.org> <20041118012155.GA22765@tuxdriver.com> <1101663389.16787.46.camel@localhost.localdomain> In-Reply-To: <1101663389.16787.46.camel@localhost.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12276 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Alan Cox wrote: > On Iau, 2004-11-18 at 01:21, John W. Linville wrote: > >>On Wed, Nov 17, 2004 at 01:44:25PM -0800, Andrew Morton wrote: >> >>>This has been in -mm kernels since you first sent it out. I'm intending to >>>hold off until post-2.6.10 so we get a full kernel cycle for any problems >>>to get shaken out. >> >>Cool...someone was asking for it in netdev-2.[46], and Jeff didn't >>have it. That is what provoked the resend. > > > Merged into -ac since you essentially can't use 3c59x/3c90x with DHCP on > some systems or get it back from suspend with several distributions. > This IMHO should go into 2.6.10 because its a showstopper for many > users. Poke Andrew to push it upstream, he's the 3c59x maintainer. Jeff From buytenh@wantstofly.org Sun Nov 28 13:33:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 13:33:17 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iASLXCo0010762 for ; Sun, 28 Nov 2004 13:33:13 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 7CD7B2B100; Sun, 28 Nov 2004 22:32:51 +0100 (MET) Date: Sun, 28 Nov 2004 22:32:51 +0100 From: Lennert Buytenhek To: robert.olsson@data.slu.se Cc: netdev@oss.sgi.com Subject: [PATCH,pktgen] account for preamble and inter-packet gap Message-ID: <20041128213251.GA9330@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 12277 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Hi! If you account for the Frame Check Sequence when computing bandwidth stats, it's only fair that you count the preamble and inter-packet gap as well. Suggested patch attached. cheers, Lennert --- pktgen.c.orig 2004-11-28 22:27:50.008829106 +0100 +++ pktgen.c 2004-11-28 22:30:48.773867119 +0100 @@ -2564,7 +2564,7 @@ static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) { __u64 total_us, bps, mbps, pps, idle; - int size = pkt_dev->cur_pkt_size + 4; /* incl 32bit ethernet CRC */ + int size = pkt_dev->cur_pkt_size + 4 + 8 + 12; /* incl 32bit ethernet CRC plus preamble plus inter-packet gap */ char *p = pkt_dev->result; total_us = pkt_dev->stopped_at - pkt_dev->started_at; @@ -2777,7 +2777,7 @@ pkt_dev->last_ok = 1; pkt_dev->sofar++; pkt_dev->seq_num++; - pkt_dev->tx_bytes += (pkt_dev->cur_pkt_size + 4); /* count csum */ + pkt_dev->tx_bytes += (pkt_dev->cur_pkt_size + 4 + 8 + 12); /* count csum and preamble and inter-packet gap*/ } else if (ret == NETDEV_TX_LOCKED && (odev->features & NETIF_F_LLTX)) { From greearb@candelatech.com Sun Nov 28 19:21:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 19:22:00 -0800 (PST) Received: from www.lanforge.com (ns1.lanforge.com [66.165.47.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAT3LtBv020647 for ; Sun, 28 Nov 2004 19:21:55 -0800 Received: from [4.33.45.22] (evrtwa1-ar2-4-33-045-022.evrtwa1.dsl-verizon.net [4.33.45.22]) (authenticated bits=0) by www.lanforge.com (8.12.8/8.12.8) with ESMTP id iAT3WmLH005373; Sun, 28 Nov 2004 19:32:49 -0800 Message-ID: <41AA95BB.7060400@candelatech.com> Date: Sun, 28 Nov 2004 19:21:31 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Lennert Buytenhek CC: robert.olsson@data.slu.se, netdev@oss.sgi.com Subject: Re: [PATCH,pktgen] account for preamble and inter-packet gap References: <20041128213251.GA9330@xi.wantstofly.org> In-Reply-To: <20041128213251.GA9330@xi.wantstofly.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12278 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Lennert Buytenhek wrote: > Hi! > > If you account for the Frame Check Sequence when computing bandwidth > stats, it's only fair that you count the preamble and inter-packet gap > as well. Suggested patch attached. a) When an ethernet NIC claims 100Mbps, does this count the preamble and IPG? b) Or, can send and receive 100Mbps of data by only counting the ethernet header + payload + CRC? If b is true, then I definately would not want to see the IPG and preamble counted. If a is true, then I still don't want it counted, but I would agree that it is worth considering :) Ben -- Ben Greear Candela Technologies Inc http://www.candelatech.com From buytenh@wantstofly.org Sun Nov 28 22:38:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 28 Nov 2004 22:38:08 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAT6c3bn028061 for ; Sun, 28 Nov 2004 22:38:04 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 634C22B0ED; Mon, 29 Nov 2004 07:37:42 +0100 (MET) Date: Mon, 29 Nov 2004 07:37:42 +0100 From: Lennert Buytenhek To: Ben Greear Cc: robert.olsson@data.slu.se, netdev@oss.sgi.com Subject: Re: [PATCH,pktgen] account for preamble and inter-packet gap Message-ID: <20041129063742.GA14493@xi.wantstofly.org> References: <20041128213251.GA9330@xi.wantstofly.org> <41AA95BB.7060400@candelatech.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41AA95BB.7060400@candelatech.com> User-Agent: Mutt/1.4.1i X-archive-position: 12279 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Sun, Nov 28, 2004 at 07:21:31PM -0800, Ben Greear wrote: > >If you account for the Frame Check Sequence when computing bandwidth > >stats, it's only fair that you count the preamble and inter-packet gap > >as well. Suggested patch attached. > > a) When an ethernet NIC claims 100Mbps, does this count the preamble and > IPG? Yes. That's how we arrive at the 148kpps 'max pps for fast ethernet' figure -- 100000000 bits per second, each packet taking 8*(8+60+4+12) bits on the wire. Another person suggested in private that what I'm after is properly called '% utilization'. It might not be possible to determine the speed of the physical medium though. In either case, it seems wrong to count the FCS but not the preamble/IPG. Maybe it's more appropriate to remove the FCS from the calculations. --L From mellia@prezzemolo.polito.it Mon Nov 29 00:54:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 00:54:43 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAT8sar6002153 for ; Mon, 29 Nov 2004 00:54:37 -0800 Received: from verza.polito.it (IDENT:ueJDbM3lCaG3kmYouwMgOmfistnSsnIr@verza.polito.it [130.192.9.150]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iAT8rXfm027379; Mon, 29 Nov 2004 09:53:39 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: Harald Welte Cc: Marco Mellia , P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041127092503.GA12592@sunbeam.de.gnumonks.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041127092503.GA12592@sunbeam.de.gnumonks.org> Content-Type: text/plain Organization: Message-Id: <1101718412.14930.46.camel@verza.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 29 Nov 2004 09:53:33 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (score=-4.811, required 5.5, AWL 0.09, BAYES_00 -4.90) X-archive-position: 12280 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev On Sat, 2004-11-27 at 10:25, Harald Welte wrote: > On Fri, Nov 26, 2004 at 04:31:21PM +0100, Marco Mellia wrote: > > If you don't trust us, please, ignore this email. > > Sorry. > > > > That's the number we have. And are actually very similar from what other > > colleagues of us got. > > > > The point is: > > while a PCI-X linux or (or click) box can receive (receive just up to > > the netif_receive_skb() level and then discard the skb) up to more than > > wire speed using off-the-shelf gigabit ethernet hardware, there is no > > way to transmit more than about half that speed. This is true > > considering minimum sized ethernet frames. > > Yes, I've seen this, too. > > I even rewrote the linux e1000 driver in order to re-fill the tx queue > from hardirq handler, and it didn't help. 760kpps is the most I could > ever get (133MHz 64bit PCI-X on a Sun Fire v20z, Dual Opteron 1.8GHz) > > I've posted this result to netdev at some earlier point, I also Cc'ed > intel but never got a reply > (http://oss.sgi.com/archives/netdev/2004-09/msg00540.html) > > My guess is that Intel always knew this and they want to sell their CSA > chips rather than improving the PCI e1000. > > We are hitting a hard limit here, either PCI-X wise or e1000 wise. You > cannot refill the tx queue faster than from hardirq, and still you don't > get any better numbers. > > It was suggested that the problem is PCI DMA arbitration latency, since > the hardware needs to arbitrate the bus for every packet. Th's our intuition too. Notice that we get the same results with 3com (broadcom based) gigabit cards. We are thinking of sending packet in "bursts" instead of single transfers. The only problem is to let the NIC know that there are more than a packet in a burst... -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From feadog@ontvjapan.com Mon Nov 29 02:18:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 02:18:08 -0800 (PST) Received: from MIN14 ([221.208.135.123]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iATAHsER004219 for ; Mon, 29 Nov 2004 02:18:02 -0800 Date: Mon, 29 Nov 2004 02:17:54 -0800 Message-Id: <200411291018.iATAHsER004219@oss.sgi.com> From: "=?iso-2022-jp?B?c2VuZDE0QHlhaG9vLmNvLmpw?=" To: "netdev@oss.sgi.com" X-mailer: Super Mailer 9 [en][outlook] Subject: =?iso-2022-jp?B?GyRCISEkPSRtJD0kbSEmISYhJiEmGyhC?= MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 X-archive-position: 12281 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aback@reuters.co.jp Precedence: bulk X-list: netdev 奥様の実態を暴露!コレで世の中うまく行く!? http://kokosoko.info/okusama/ ****メルマガ解除/問い合わせ**** ya_oh_yajp@yahoo.co.jp ******************************* From P@draigBrady.com Mon Nov 29 02:19:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 02:20:05 -0800 (PST) Received: from corvil.com (gate.corvil.net [213.94.219.177]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATAJuFD004326 for ; Mon, 29 Nov 2004 02:19:58 -0800 Received: from draigBrady.com (pixelbeat.local.corvil.com [172.18.1.170]) by corvil.com (8.12.9/8.12.5) with ESMTP id iATAJVwS015624; Mon, 29 Nov 2004 10:19:33 GMT (envelope-from P@draigBrady.com) Message-ID: <41AAF7B3.8080204@draigBrady.com> Date: Mon, 29 Nov 2004 10:19:31 +0000 From: P@draigBrady.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en MIME-Version: 1.0 To: hadi@cyberus.ca CC: mellia@prezzemolo.polito.it, Robert Olsson , e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> In-Reply-To: <1101499285.1079.45.camel@jzny.localdomain> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-archive-position: 12282 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: P@draigBrady.com Precedence: bulk X-list: netdev jamal wrote: > On Fri, 2004-11-26 at 11:57, P@draigBrady.com wrote: > > >>>skb are de/allocated using standard kernel memory management. Still, >>>without touching the packet, we can receive 100% of them. >> >>I was doing some playing in this area this week. >>I changed the alloc per packet to a "realloc" per packet. >>I.E. the e1000 driver owns the packets. I noticed a >>very nice speedup from this. In summary a userspace >>app was able to receive 2x250Kpps without this patch, >>and 2x490Kpps with it. The patch is here: >>http://www.pixelbeat.org/tmp/linux-2.4.20-pb.diff > > > A very angry gorilla on that url ;-> feck. Add a .gz http://www.pixelbeat.org/tmp/linux-2.4.20-pb.diff.gz >>Note 99% of that patch is just upgrading from >>e1000 V4.4.12-k1 to V5.2.52 (which doesn't affect >>the performance). >> >>Wow I just read you're excellent paper, and noticed >>you used this approach also :-) >> > > > Have to read the paper - When Robert was last visiting here; we did some > tests and packet recycling is not very valuable as far as SMP is > concerned (given that packets can be alloced on one CPU and freed on > another). There a clear win on single CPU machines. Well for my app, I am just monitoring, so I use IRQ and process affinity. You could split the skb heads across CPUs also I guess. >>>>Small packet performance is dependent on low latency. Higher bus speed >>>>gives shorter latency but also on higher speed buses there use to be >>>>bridges that adds latency. >>> >>>That's true. We suspect that the limit is due to bus latency. But still, >>>we are surprised, since the bus allows to receive 100%, but to transmit >>>up to ~50%. Moreover the raw aggerate bandwidth of the buffer is _far_ >>>larger (133MHz*64bit ~ 8gbit/s >> >>Well there definitely could be an asymmetry wrt bus latency. >>Saying that though, in my tests with much the same hardware >>as you, I could only get 800Kpps into the driver. > > > Yep, thats about the number i was seeing as well in both pieces of > hardware i used in the tests in my SUCON presentation. > > >> I'll >>check this again when I have time. Note also that as I understand >>it the PCI control bus is running at a much lower rate, >>and that is used to arbitrate the bus for each packet. >>I.E. the 8Gb/s number above is not the bottleneck. >> >>An lspci -vvv for your ethernet devices would be useful >>Also to view the burst size: setpci -d 8086:1010 e6.b >>(where 8086:1010 is the ethernet device PCI id). >> > > Can you talk a little about this PCI control bus? I have heard you > mention it before ... I am trying to visualize where it fits in PCI > system. Basically the bus is arbitrated per packet. See secion 3.5 in: http://www.intel.com/design/network/applnots/ap453.pdf This also has lots of nice PCI info: http://www.hep.man.ac.uk/u/rich/PFLDnet2004/Rich_PFLDNet_10GE_v7.ppt -- Pdraig Brady - http://www.pixelbeat.org -- From mellia@prezzemolo.polito.it Mon Nov 29 04:45:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 04:45:08 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATCj0Ru013690 for ; Mon, 29 Nov 2004 04:45:01 -0800 Received: from verza.polito.it (IDENT:HmCsPRBcVws0VoDceMlmZKiFRCGJ5PGV@verza.polito.it [130.192.9.150]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iATCiRfm017756; Mon, 29 Nov 2004 13:44:27 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: Lennert Buytenhek Cc: mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041127200030.GD27762@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <20041127200030.GD27762@xi.wantstofly.org> Content-Type: text/plain Organization: Message-Id: <1101732267.14930.75.camel@verza.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 29 Nov 2004 13:44:27 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (score=-4.811, required 5.5, AWL 0.09, BAYES_00 -4.90) X-archive-position: 12283 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev > > >What is weird, is that if we artificially "preload" the NIC tx-fifo with > > >packets, and then instruct it to start sending them, those are actually > > >transmitted AT WIRE SPEED!! > > I've very interested in exactly what it is you're doing here. What > do you mean by 'preload'? Here is a brief description of the trick we used. The modified driver code can be grabbed from http://www.tlc-networks.polito.it/~mellia/e1000_modified.tar.gz So: with "preloaded" we mean that we put the packets to be transmitted previously in the TX fifo of the nic without actually updating the register which counts the number of packets in the fifo queue. To do this a student modified the network driver adding an entry in /proc/net/e1000/eth#. If you read from there you will get the values of the internal registers of the NIC regarding the internal fifo. Writing a number to it, you can set the TDFPC register which contains the number of pkts in the TX queue of the internal FIFO. To get the above result you have to: Compile this version of the driver (don't remember on which version it was based on) Load it. After that you can take a look at the internal registers with: cat /proc/net/e1000/eth# (# replace it with the correct number) Then we start placing something inthe TX fifo. To do this i simply used: ping -c 10 x.x.x.x This has placed and also transmitted 10 ping pkts. But they aren't deleted from the internal FIFO; only the pointers have been updated. Take a look at the registers again with: cat /proc/net/e1000/eth# Now use: echo 10 > /proc/net/e1000/eth# Naturally 10 is the number we used above. This "resets" the registers and writes in the TDFPC that there are 10 pkts in the TX queue. Now when we do: ping -c 1 x.x.x.x You will see that the NIC will transmit 11 pkts (10 we "preloaded" + the new one). If you try to measure the TX speed you will see that it is ~ the wire speed. Note: - note that if you haven't static arp tables there will be also some arp pkts (should be two more pkts) - probably if you write too many pkts it won't work because the FIFO is organized like a circular buffer and you will begin to overwrite the first pkts. - the normal ping pkts aren't minimum size but reduce them with the -s option - the code modoifications have been writen with having "quick and dirty" in mind, certainly it is possible to write them better -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From Robert.Olsson@data.slu.se Mon Nov 29 05:09:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 05:09:51 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATD9jr6014511 for ; Mon, 29 Nov 2004 05:09:46 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iATD98iu005378; Mon, 29 Nov 2004 14:09:09 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id AF128EC001; Mon, 29 Nov 2004 14:09:08 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16811.8052.678955.795327@robur.slu.se> Date: Mon, 29 Nov 2004 14:09:08 +0100 To: hadi@cyberus.ca Cc: P@draigBrady.com, mellia@prezzemolo.polito.it, Robert Olsson , e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit In-Reply-To: <1101499285.1079.45.camel@jzny.localdomain> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12284 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev jamal writes: > Have to read the paper - When Robert was last visiting here; we did some > tests and packet recycling is not very valuable as far as SMP is > concerned (given that packets can be alloced on one CPU and freed on > another). There a clear win on single CPU machines. Correct yes at you lab about 2 1/2 years ago. I see those experiments in a different light today as we never got any packet budget contribution from SMP with shared mem arch whatsoever. Spent a week w. Alexey in the lab to understand whats going on. Two flows with total affinity (for each CPU) even removed all locks and part of the IP stack. We were still confused... When Opteron/NUMA gave good contribution in those setups. We start thinking it must be latency and memory controllers that makes the difference. As w. each CPU has it's own memory and memory controller in Opteron case. So from that aspect we expecting the impossible from recycling patch maybe it will do better on boxes w. local memory. But I think we should give it up in current form skb recycling. If extend it to deal cache bouncing etc. We end up having something like slab in every driver. slab has improved is not so dominant in profiles now. Also from what I understand new HW and MSI can help in the case where pass objects between CPU. Did I dream or did someone tell me that S2IO could have several TX ring that could via MSI be routed to proper cpu? slab packet-objects have been discussed. It would do some contribution but is the complexity worth it? Also I think it could possible to do more lightweight variant of skb recycling in case we need to recycle PCI-mapping etc. --ro From hadi@cyberus.ca Mon Nov 29 05:50:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 05:50:24 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATDoJqW016004 for ; Mon, 29 Nov 2004 05:50:20 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CYlue-0005nE-Fs for netdev@oss.sgi.com; Mon, 29 Nov 2004 08:49:56 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CYluc-00033N-M4; Mon, 29 Nov 2004 08:49:54 -0500 Subject: Re: pktgen From: jamal Reply-To: hadi@cyberus.ca To: Lennert Buytenhek Cc: Robert Olsson , netdev@oss.sgi.com, Grant Grundler In-Reply-To: <20041128183143.GD6045@xi.wantstofly.org> References: <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> <20041127143923.GA25155@xi.wantstofly.org> <1101567861.1044.87.camel@jzny.localdomain> <20041128183143.GD6045@xi.wantstofly.org> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101736191.1044.196.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 29 Nov 2004 08:49:52 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12285 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Sun, 2004-11-28 at 13:31, Lennert Buytenhek wrote: > On Sat, Nov 27, 2004 at 10:04:22AM -0500, jamal wrote: > > > It would be interesting to see a study in this area though. > > Indeed. Right now it feels like I'm just poking around in the dark. I'm > really interested by now in finding out exactly what part of packet TX is > taking how long and where all my cycles are going. > > I don't have an Itanic but it's still possible to instrument the driver > and do some stuff Grant talks about in his OLS paper, something like the > attached. (Exports # of MMIO reads/writes/flushes in the RX frame/ > TX carrier/collision stats field. Beware, flushes are double-counted > as reads. Produces lots of output.) > > During a 10Mpkt pktgen session (~16 seconds), I'm seeing: > - 131757 interrupts, ~8k ints/sec, ~76 pkts/int > - 131789 pure MMIO reads (i.e. not counting MMIO reads intended as write > flushes), which is E1000_READ_REG(icr) in the irq handler > - 10263536 MMIO writes (which would be 1 per packet plus 2 per interrupt) > - 131757 MMIO write flushes (readl() of the e1000 status register after > re-enabling IRQs in dev->poll()) > > Pretty consistent with what Grant was seeing. > > MMIO reads from the e1000 are somewhere between 2000 and 3000 cycles a > pop on my hardware. 2400MHz CPU -> ~1us/each. (Reading netdevice stats > does ~50 of those in a row.) > Reads are known to be expensive. Good to see how much they are reduced. Not sure if this applies to MMIO reads though. Grant? cheers, jamal From bill@crowellsystems.com Mon Nov 29 06:07:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 06:07:58 -0800 (PST) Received: from mail.crowellsystems.com (66-193-215-164.gen.twtelecom.net [66.193.215.164]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iATE7qol016934 for ; Mon, 29 Nov 2004 06:07:52 -0800 Received: (qmail 31619 invoked by uid 4009); 29 Nov 2004 14:07:26 -0000 Received: from unknown (HELO crowellsystems.com) (10.1.10.201) by s2 with SMTP; 29 Nov 2004 14:07:26 -0000 Message-ID: <41AB2F3D.5060903@crowellsystems.com> Date: Mon, 29 Nov 2004 09:16:29 -0500 From: Bill Crowell User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031007 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Patrick McHardy CC: Herbert Xu , James Morris , akpm@osdl.org, netdev@oss.sgi.com, mg@iceni.pl Subject: Re: Fw: ipsec hang References: <41A5D1CF.10504@trash.net> In-Reply-To: <41A5D1CF.10504@trash.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12286 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bill@crowellsystems.com Precedence: bulk X-list: netdev I will attempt to load the patch today and rerun the test. It is very reproduceable. I've been trying to read the diff view on kernel.org to see about any updates, but the server keeps giving me nasty messages: internal server error, too many users, etc. I prefer to read the diff before patching from bk to see if anything else is impacted. We'll give it a go this afternoon. As a backup, I've successfully installed and tested OpenVPN, though it doesn't provide connectivity to other systems (read Cisco) running IPSec. I'll keep all informed as to the progress. Thanks for the quick response! I sent a bug report to Redmond about 7 years ago and am still awaiting a reply ;-) Bill Patrick McHardy wrote: > Herbert Xu wrote: > >> James Morris wrote: >> >> >>> I wonder if it's the same bug as >>> http://bugme.osdl.org/show_bug.cgi?id=3796 >>> >> >> >> Quite likely. >> >> Bill, can you please try the latest BK tree and see if you can >> still reproduce the hang? >> >> > The patch is not in Linus's tree yet, so you need to apply it > yourself. > > Regards > Patrick > > > -- William G. Crowell, VP & CTO | Phone 704.665.2000 Crowell Systems | Fax 704.665.2180 4235 South Stream Blvd Suite 100 | NOC 704.357.1885 Charlotte NC 28217 USA Computers are like airconditioners: They stop working properly if you open Windows. From mellia@prezzemolo.polito.it Mon Nov 29 06:23:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 06:23:48 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATENcVD017671 for ; Mon, 29 Nov 2004 06:23:39 -0800 Received: from verza.polito.it (IDENT:iyx9X27S/5dZB7pWqla5ZOz+8x8ZvDUH@verza.polito.it [130.192.9.150]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iATELwfm031052; Mon, 29 Nov 2004 15:22:01 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: hadi@cyberus.ca Cc: mellia@prezzemolo.polito.it, P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <1101498963.1076.39.camel@jzny.localdomain> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <1101498963.1076.39.camel@jzny.localdomain> Content-Type: text/plain Organization: Message-Id: <1101738118.14930.142.camel@verza.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 29 Nov 2004 15:21:58 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (score=-4.811, required 5.5, AWL 0.09, BAYES_00 -4.90) X-archive-position: 12287 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev On Fri, 2004-11-26 at 20:56, jamal wrote: > On Fri, 2004-11-26 at 10:31, Marco Mellia wrote: > > If you don't trust us, please, ignore this email. > > Sorry. > > Dont take it the wrong way please - nobody has been able to produce the > results you have. So thats why you may be getting that comment. > The fact you have been able to do this is a good thing. No problem from this side. I also forgot a couple of 8-! I guess... [...] > prefetching as in the use of prefetch()? > What were you prefetching if you end up dropping packet? > Sorry I used the wrong terms there. What we discovered, is that the CPU caching mechanisms as a HUGE impact. And that you have very little control on it. Prefetching may help, but it is difficult to tredict its impacts... Indeed, if you access to the packet struct, the CPU has to fetch data from the main memory, which stored the packet transfered using DMA from the NIC. The penalty in the memory access is huge, and you have little control on it. In our experiments, we modified the kernel to drop packets just after receiving them. skb are just deallocated (using standerd kernel routines, i.e., no recycling is used). Logically, that happen when the netif_rx() is called. Now, we have three cases 1) just mofify the netif_rx() to drop packets. 2) as in one, plus remove the protocol check in the driver (i.e., comment the line skb->protocol = eth_type_trans(skb, netdev); ) to avoid to access the real packet data. 3) as in 2, but dealloc is performed at the driver level, instead of calling the netif_rx() In the first case, we can receive about 1.1Mpps (~80% of packets) In the second case, we can receive 100% of packets, as we removed the penalty of looking at the packet headers to discover its protocol type. In the third case, we can NOT receive 100% of packets! The only difference is that we actually _REMOVED_ a funcion call. This reduces the overhead, and the compiler/cpu/whatever can not optimize the data path to access to the skb which must be freed. Our guess is that by freeing up the skb in the netif_rx() function actually allows the compiler/cpu to prefetch the skb itself, and therefore keep the pipeline working... My guess is that if you change compiler, cpu, memory subsystem, you may get very counterintuitive results... -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From manjunath@ece.iisc.ernet.in Mon Nov 29 06:45:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 06:45:41 -0800 (PST) Received: from ece.iisc.ernet.in (ece.iisc.ernet.in [144.16.64.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATEjWMS020199 for ; Mon, 29 Nov 2004 06:45:34 -0800 Received: from ece.iisc.ernet.in (localhost.localdomain [127.0.0.1]) by ece.iisc.ernet.in (8.12.6/8.12.6) with ESMTP id iATEwLFA058942 for ; Mon, 29 Nov 2004 20:28:21 +0530 (IST) (envelope-from manjunath@ece.iisc.ernet.in) Received: from localhost (manjunath@localhost) by ece.iisc.ernet.in (8.12.6/8.12.6/Submit) with ESMTP id iATEwKHU058939 for ; Mon, 29 Nov 2004 20:28:20 +0530 (IST) Date: Mon, 29 Nov 2004 20:28:20 +0530 (IST) From: MANJUNATH To: netdev@oss.sgi.com Subject: iptables Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12288 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manjunath@ece.iisc.ernet.in Precedence: bulk X-list: netdev I am new to linux kernal source,I understand that iptables MASQUERADE chain inturn makes use of NF_IP_POST_ROUTING HOOK to change src addr, src port of the outgoing packets. Is NF_IP_PRE_ROUTING HOOK is used to map public address of the incoming packets to the local private address ? Regards Manjunath From buytenh@wantstofly.org Mon Nov 29 06:50:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 06:50:55 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATEopwm020667 for ; Mon, 29 Nov 2004 06:50:52 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 23BBA2B0ED; Mon, 29 Nov 2004 15:50:28 +0100 (MET) Date: Mon, 29 Nov 2004 15:50:28 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: Harald Welte , P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041129145028.GC18788@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041127092503.GA12592@sunbeam.de.gnumonks.org> <1101718412.14930.46.camel@verza.polito.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101718412.14930.46.camel@verza.polito.it> User-Agent: Mutt/1.4.1i X-archive-position: 12289 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 09:53:33AM +0100, Marco Mellia wrote: > Th's our intuition too. > Notice that we get the same results with 3com (broadcom based) gigabit > cards. > We are thinking of sending packet in "bursts" instead of single > transfers. The only problem is to let the NIC know that there are more > than a packet in a burst... Jamal implemented exactly this for e1000 already, he might be persuaded into posting his patch here. Jamal? :) --L From buytenh@wantstofly.org Mon Nov 29 07:20:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 07:20:06 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATFK107021804 for ; Mon, 29 Nov 2004 07:20:02 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id C571E2B0ED; Mon, 29 Nov 2004 16:19:40 +0100 (MET) Date: Mon, 29 Nov 2004 16:19:40 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041129151940.GA19184@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <20041127200030.GD27762@xi.wantstofly.org> <1101732267.14930.75.camel@verza.polito.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101732267.14930.75.camel@verza.polito.it> User-Agent: Mutt/1.4.1i X-archive-position: 12290 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 01:44:27PM +0100, Marco Mellia wrote: > This "resets" the registers and writes in the TDFPC that there are 10 > pkts in the TX queue. > Now when we do: > > ping -c 1 x.x.x.x > > You will see that the NIC will transmit 11 pkts (10 we "preloaded" + the > new one). > If you try to measure the TX speed you will see that it is ~ the wire > speed. How are you measuring this? cheers, Lennert From Robert.Olsson@data.slu.se Mon Nov 29 07:28:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 07:28:28 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATFSOvP022283 for ; Mon, 29 Nov 2004 07:28:25 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iATFRviu021381; Mon, 29 Nov 2004 16:27:59 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id 7EBFCEC001; Mon, 29 Nov 2004 16:27:57 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16811.16381.487066.667426@robur.slu.se> Date: Mon, 29 Nov 2004 16:27:57 +0100 To: Lennert Buytenhek Cc: Robert Olsson , hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: pktgen In-Reply-To: <20041127135354.GA24617@xi.wantstofly.org> References: <20041111233507.GA3202@xi.wantstofly.org> <20041124161848.GA18059@xi.wantstofly.org> <16804.48120.375307.718766@robur.slu.se> <20041124170948.GC18059@xi.wantstofly.org> <16804.60621.990421.525393@robur.slu.se> <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12291 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Lennert Buytenhek writes: > Your data is a bit noisy -- can you rerun the test for the 60-200 byte > packet range but using 10M packets per run instead of 1M? OK! 60 825976 64 746730 68 730215 72 720942 76 721090 80 721772 84 704472 88 704489 92 705184 96 714750 100 694178 104 700853 108 703332 112 715865 116 692223 120 677893 124 678306 128 736908 132 712328 136 722271 140 706784 144 716770 148 694497 152 647868 156 647693 160 678071 164 663694 168 649894 172 636478 176 623761 180 611580 184 599835 188 588540 192 577549 196 567044 200 556967 --ro From thomas.spatzier@de.ibm.com Mon Nov 29 07:58:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 07:59:00 -0800 (PST) Received: from mtagate4.de.ibm.com (mtagate4.de.ibm.com [195.212.29.153]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATFwsIH023121 for ; Mon, 29 Nov 2004 07:58:56 -0800 Received: from d12nrmr1507.megacenter.de.ibm.com (d12nrmr1507.megacenter.de.ibm.com [9.149.167.1]) by mtagate4.de.ibm.com (8.12.10/8.12.10) with ESMTP id iATFw3vU197008 for ; Mon, 29 Nov 2004 15:58:03 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1507.megacenter.de.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iATFvwvQ123218 for ; Mon, 29 Nov 2004 16:57:58 +0100 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iATFvhnC013451 for ; Mon, 29 Nov 2004 16:57:44 +0100 Received: from d12ml061.megacenter.de.ibm.com (d12nrml1501.megacenter.de.ibm.com [9.149.164.51] (may be forged)) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iATFvgIZ013366; Mon, 29 Nov 2004 16:57:42 +0100 In-Reply-To: Subject: Re: [patch 4/10] s390: network driver. To: paul@clubi.ie Cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Thomas Spatzier Date: Mon, 29 Nov 2004 16:57:25 +0100 X-MIMETrack: Serialize by Router on D12ML061/12/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 29/11/2004 16:57:48 MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII X-archive-position: 12292 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: thomas.spatzier@de.ibm.com Precedence: bulk X-list: netdev > Using a socket per interface wont address problem of sending > quite stale packets when a link > comes back after a long time > down, AUI. (not a huge problem - but not nice). > > Jeff??? Has there been any outcome on the discussion about whether or not a device driver should drop packets when the cable is disconnected? It seems that from the zebra point of view, as Paul wrote, it would be better to not block sockets by queueing up packets when there is no cable connection. I do also think that it does not make sense to keep packets in the queue and then send those packets when the cable is plugged in again after a possibly long time. There are protocols like TCP that handle packet loss anyway. Regards, Thomas. From Robert.Olsson@data.slu.se Mon Nov 29 08:16:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 08:16:39 -0800 (PST) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATGGYZm023827 for ; Mon, 29 Nov 2004 08:16:35 -0800 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id iATGGDiu032325; Mon, 29 Nov 2004 17:16:13 +0100 Received: by robur.slu.se (Postfix, from userid 1000) id A385BEC001; Mon, 29 Nov 2004 17:16:13 +0100 (CET) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16811.19277.594137.939120@robur.slu.se> Date: Mon, 29 Nov 2004 17:16:13 +0100 To: Lennert Buytenhek Cc: robert.olsson@data.slu.se, netdev@oss.sgi.com Subject: [PATCH,pktgen] account for preamble and inter-packet gap In-Reply-To: <20041128213251.GA9330@xi.wantstofly.org> References: <20041128213251.GA9330@xi.wantstofly.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 12293 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Lennert Buytenhek writes: > If you account for the Frame Check Sequence when computing bandwidth > stats, it's only fair that you count the preamble and inter-packet gap > as well. Suggested patch attached. Well from pktgen TX view we don't know what the layer under us will do. We simply deliver packets and hope those get transmitted but we are not 100% sure neither about ipg or preample. We don't even know that packets are seen on the wire. We use to verify this in our specific HW setup. So what trusted statistics can we give? I've heard some boxes that didn't do the ipg correctly. Don't know what NIC this was. We can only estimate stats at the point where we are delivering packets. Other devices has "true" L2 stats. OK. Adding FCS yes kinda compromise and maybe was wrong in this aspect. Also we should think of calculation should work with link other link link layers not only ethernet. The only solution I can think of is of having a selectable option in the config for output stats. To support different L2 layers and with warning if we are "predicting" L2 statistics. Feel free to extend your patch. --ro From paul@clubi.ie Mon Nov 29 08:31:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 08:31:12 -0800 (PST) Received: from hibernia.jakma.org (hibernia.jakma.org [212.17.55.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATGUxvJ027564 for ; Mon, 29 Nov 2004 08:31:03 -0800 Received: from hibernia.jakma.org (IDENT:paul@hibernia.jakma.org [192.168.0.3]) by hibernia.jakma.org (8.12.11/8.12.11) with ESMTP id iATGUN1M030988; Mon, 29 Nov 2004 16:30:23 GMT Date: Mon, 29 Nov 2004 16:30:23 +0000 (GMT) From: Paul Jakma X-X-Sender: paul@hibernia.jakma.org To: Thomas Spatzier cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [patch 4/10] s390: network driver. In-Reply-To: Message-ID: References: Mail-Followup-To: paul@hibernia.jakma.org X-NSA: arafat al aqsar jihad musharef jet-A1 avgas ammonium qran inshallah allah al-akbar martyr iraq saddam hammas hisballah rabin ayatollah korea vietnam revolt mustard gas british airways washington MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 12294 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@clubi.ie Precedence: bulk X-list: netdev On Mon, 29 Nov 2004, Thomas Spatzier wrote: > Has there been any outcome on the discussion about whether or not a > device driver should drop packets when the cable is disconnected? There hasnt. > It seems that from the zebra point of view, as Paul wrote, it would > be better to not block sockets by queueing up packets when there is > no cable connection. I'd prefer either to get ENOBUFS or to have kernel drop the packet - we're privileged apps writing to raw sockets and/or with IP_HDRINCL, the kernel should assume we know what we're doing (cause if we dont, there's far /worse/ we could do than send packets to an effective /dev/null). > I do also think that it does not make sense to keep packets in the > queue and then send those packets when the cable is plugged in > again after a possibly long time. Well, if the kernel is going to queue these packets without notifying us, we absolutely *must* have some way to flush those queues. Sending stale packets many minutes after the application generated them could have serious consequences for routing (eg, think sending RIP, IPv4 IRDP or v6 RAs which are no longer valid - client receives them and installs routes which are long invalid and loses connectivity to some part of the network). So even if we moved to socket/interface, we still need some way to tell kernel to flush a socket when we receive link-down over netlink later. Not trying to queue on sockets where app has no expectation of reliability in first place would be even better ;) > There are protocols like TCP that handle packet loss anyway. Yes. I'd be very interested to hear advice from the kernel gurus (eg "god, dont be so stupid, do xyz in your application instead"). We can accomodate whatever kernel wants as long as its workable. > Regards, > Thomas. regards, -- Paul Jakma paul@clubi.ie paul@jakma.org Key ID: 64A2FF6A Fortune: You will pay for your sins. If you have already paid, please disregard this message. From thomas.spatzier@de.ibm.com Mon Nov 29 08:42:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 08:42:20 -0800 (PST) Received: from mtagate2.de.ibm.com (mtagate2.de.ibm.com [195.212.29.151]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATGgFKk028023 for ; Mon, 29 Nov 2004 08:42:15 -0800 Received: from d12nrmr1507.megacenter.de.ibm.com (d12nrmr1507.megacenter.de.ibm.com [9.149.167.1]) by mtagate2.de.ibm.com (8.12.10/8.12.10) with ESMTP id iATGfmbP209010 for ; Mon, 29 Nov 2004 16:41:48 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1507.megacenter.de.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iATGfivQ126560 for ; Mon, 29 Nov 2004 17:41:44 +0100 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iATGfmAe008690 for ; Mon, 29 Nov 2004 17:41:48 +0100 Received: from d12ml061.megacenter.de.ibm.com ([9.149.165.51]) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iATGfm0D008687; Mon, 29 Nov 2004 17:41:48 +0100 In-Reply-To: Subject: Re: [patch 4/10] s390: network driver. To: Paul Jakma Cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Thomas Spatzier Date: Mon, 29 Nov 2004 17:41:42 +0100 X-MIMETrack: Serialize by Router on D12ML061/12/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 29/11/2004 17:41:54 MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII X-archive-position: 12295 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: thomas.spatzier@de.ibm.com Precedence: bulk X-list: netdev Paul Jakma wrote on 29.11.2004 17:30:23: > Well, if the kernel is going to queue these packets without notifying > us, we absolutely *must* have some way to flush those queues. Sending > stale packets many minutes after the application generated them could > have serious consequences for routing (eg, think sending RIP, IPv4 > IRDP or v6 RAs which are no longer valid - client receives them and > installs routes which are long invalid and loses connectivity to some > part of the network). > Yes, for the examples you mentioned the app should better be notified. However, AFAICS, there are no such notification mechanisms on a per-packet basis implemented in the kernel. And I doubt that they are going to be implemented. > I'd be very interested to hear advice from the kernel gurus (eg "god, > dont be so stupid, do xyz in your application instead"). We can > accomodate whatever kernel wants as long as its workable. Good suggestion, if anyone has an interesting and feasible solution I will be happy to integrate it. So far, however, it don't see one and I would point people being worried about lost packets to TCP. Regards, Thomas. From grundler@lackof.org Mon Nov 29 08:58:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 08:58:26 -0800 (PST) Received: from colo.lackof.org (colo.lackof.org [198.49.126.79]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATGwH64028735 for ; Mon, 29 Nov 2004 08:58:18 -0800 Received: from localhost (localhost [127.0.0.1]) by colo.lackof.org (Postfix) with ESMTP id BE38A298058; Mon, 29 Nov 2004 09:57:51 -0700 (MST) Received: from colo.lackof.org ([127.0.0.1]) by localhost (colo.lackof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 12317-04; Mon, 29 Nov 2004 09:57:50 -0700 (MST) Received: by colo.lackof.org (Postfix, from userid 27253) id 20CCF29803C; Mon, 29 Nov 2004 09:57:50 -0700 (MST) Date: Mon, 29 Nov 2004 09:57:50 -0700 From: Grant Grundler To: jamal Cc: Lennert Buytenhek , Robert Olsson , netdev@oss.sgi.com, Grant Grundler Subject: Re: pktgen Message-ID: <20041129165750.GA11413@colo.lackof.org> References: <20041125030450.GA24417@xi.wantstofly.org> <16805.40983.937641.670275@robur.slu.se> <20041127002841.GA17184@xi.wantstofly.org> <20041127004325.GA17401@xi.wantstofly.org> <16808.28005.74903.881087@robur.slu.se> <20041127135354.GA24617@xi.wantstofly.org> <20041127143923.GA25155@xi.wantstofly.org> <1101567861.1044.87.camel@jzny.localdomain> <20041128183143.GD6045@xi.wantstofly.org> <1101736191.1044.196.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101736191.1044.196.camel@jzny.localdomain> User-Agent: Mutt/1.3.28i X-Home-Page: http://www.parisc-linux.org/ X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at lackof.org X-archive-position: 12296 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: grundler@parisc-linux.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 08:49:52AM -0500, jamal wrote: > On Sun, 2004-11-28 at 13:31, Lennert Buytenhek wrote: > > Indeed. Right now it feels like I'm just poking around in the dark. I'm > > really interested by now in finding out exactly what part of packet TX is > > taking how long and where all my cycles are going. ia64 PMU can measure exactly where/why the CPU is stalling. MMIO reads are by far the worst offenders - but not the only ones. "bubbles" in the pipeline can be caused by lots of other stalls and will affect CPU utilization as well. A very nice description of CPU stalls caused by memory subsystem is here: http://www.gelato.org/pdf/mysql_itanium2_perf.pdf Gelato.org, sgi.com, intel.com, hp.com have more white papers on ia64 performance tools and tuning. > > I don't have an Itanic but it's still possible to instrument the driver > > and do some stuff Grant talks about in his OLS paper, something like the > > attached. (Exports # of MMIO reads/writes/flushes in the RX frame/ > > TX carrier/collision stats field. Beware, flushes are double-counted > > as reads. Produces lots of output.) I'd be happy to give you access to an IA64 machine to poke at. If you can send me: o preferred login o public ssh key o work telephone # BTW, Jamal, I'm expecting we'll be able to get Robur an RX2600 to play with this quarter. I need to ask about that again. > > During a 10Mpkt pktgen session (~16 seconds), I'm seeing: > > - 131757 interrupts, ~8k ints/sec, ~76 pkts/int > > - 131789 pure MMIO reads (i.e. not counting MMIO reads intended as write > > flushes), which is E1000_READ_REG(icr) in the irq handler > > - 10263536 MMIO writes (which would be 1 per packet plus 2 per interrupt) > > - 131757 MMIO write flushes (readl() of the e1000 status register after > > re-enabling IRQs in dev->poll()) > > > > Pretty consistent with what Grant was seeing. yup. > > > > MMIO reads from the e1000 are somewhere between 2000 and 3000 cycles a > > pop on my hardware. 2400MHz CPU -> ~1us/each. (Reading netdevice stats > > does ~50 of those in a row.) > > > > Reads are known to be expensive. Good to see how much they are reduced. > Not sure if this applies to MMIO reads though. Grant? I don't differentiate between "pure" MMIO reads and posted MMIO write flushes. They cost the same AFAIK. If one can tweak the algorithm so either is not needed, it's a win. But I didn't see any opportunity to do that in e1000 driver. There is such an opportunity in tg3 though. I just won't have a chance to pursue it. :^( The absolute cost in CPU cycles of an MMIO read will depend on chipset, CPU speed, and number of bridges the transaction has to cross. On an idle 1Ghz system, I've measured ~1000-1200 cycles. When measured in time (not CPU cycles), the cost hasn't changed that much in the past 6-8 years (mostly 66Mhz PCI busses). Adding or removing a PCI-PCI bridge is the biggest variable in absolute time. thanks, grant From mellia@prezzemolo.polito.it Mon Nov 29 09:32:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 09:32:51 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATHWh1k031885 for ; Mon, 29 Nov 2004 09:32:45 -0800 Received: from verza.polito.it (IDENT:T/bD0Xaht6gUW78ClUdPovSG/64472x2@verza.polito.it [130.192.9.150]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iATHWDfm020996; Mon, 29 Nov 2004 18:32:13 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: Lennert Buytenhek Cc: Marco Mellia , e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041129151940.GA19184@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <20041127200030.GD27762@xi.wantstofly.org> <1101732267.14930.75.camel@verza.polito.it> <20041129151940.GA19184@xi.wantstofly.org> Content-Type: text/plain Organization: Message-Id: <1101749533.17091.3.camel@verza.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 29 Nov 2004 18:32:13 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (score=-4.811, required 5.5, AWL 0.09, BAYES_00 -4.90) X-archive-position: 12297 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev Using the Agilent Router tester as receiver... :-( > On Mon, Nov 29, 2004 at 01:44:27PM +0100, Marco Mellia wrote: > > > This "resets" the registers and writes in the TDFPC that there are 10 > > pkts in the TX queue. > > Now when we do: > > > > ping -c 1 x.x.x.x > > > > You will see that the NIC will transmit 11 pkts (10 we "preloaded" + the > > new one). > > If you try to measure the TX speed you will see that it is ~ the wire > > speed. > > How are you measuring this? > > > cheers, > Lennert -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From shemminger@osdl.org Mon Nov 29 09:37:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 09:37:23 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATHbHRX032290 for ; Mon, 29 Nov 2004 09:37:17 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iATHapPE006167 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 29 Nov 2004 09:36:51 -0800 Date: Mon, 29 Nov 2004 09:40:32 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH] via-velocity: convert to module_param Message-Id: <20041129094032.3b9cb540@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12298 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Convert via-velocity driver to module_param. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c --- a/drivers/net/via-velocity.c 2004-11-29 09:39:10 -08:00 +++ b/drivers/net/via-velocity.c 2004-11-29 09:39:10 -08:00 @@ -100,8 +100,8 @@ MODULE_DESCRIPTION("VIA Networking Velocity Family Gigabit Ethernet Adapter Driver"); #define VELOCITY_PARAM(N,D) \ - static const int N[MAX_UNITS]=OPTION_DEFAULT;\ - MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UNITS) "i");\ + static int N[MAX_UNITS]=OPTION_DEFAULT;\ + module_param_array(N, int, NULL, 0); \ MODULE_PARM_DESC(N, D); #define RX_DESC_MIN 64 @@ -229,7 +229,7 @@ VELOCITY_PARAM(int_works, "Number of packets per interrupt services"); static int rx_copybreak = 200; -MODULE_PARM(rx_copybreak, "i"); +module_param(rx_copybreak, int, 0644); MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info); From shemminger@osdl.org Mon Nov 29 09:42:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 09:42:13 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATHg9uQ032755 for ; Mon, 29 Nov 2004 09:42:09 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iATHfgPE006668 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 29 Nov 2004 09:41:42 -0800 Date: Mon, 29 Nov 2004 09:45:23 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: "David S. Miller" , netdev@oss.sgi.com Subject: [PATCH] b44: allow ethtool get_settings when down Message-Id: <20041129094523.3185c64c@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12299 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev The FC and Suse startup scripts use ethtool to check for link present. This has problems on my laptop with Broadcom because it quieries settings before bringing link up. The problem is driver returns EAGAIN when queried for settings but not up. Just go ahead and return values anyway, the supported and link state values will be correct, speed will end up being 10BaseT/Half which is a reasonable default. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/b44.c b/drivers/net/b44.c --- a/drivers/net/b44.c 2004-11-29 09:41:27 -08:00 +++ b/drivers/net/b44.c 2004-11-29 09:41:27 -08:00 @@ -1487,8 +1487,6 @@ { struct b44 *bp = netdev_priv(dev); - if (!(bp->flags & B44_FLAG_INIT_COMPLETE)) - return -EAGAIN; cmd->supported = (SUPPORTED_Autoneg); cmd->supported |= (SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | From kernel@nea-fast.com Mon Nov 29 10:03:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 10:03:56 -0800 (PST) Received: from int1.nea-fast.com (mail.nea-fast.com [66.35.146.201]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATI3qCx002855 for ; Mon, 29 Nov 2004 10:03:52 -0800 Received: from nea-fast.com (unknown [192.168.1.101]) by int1.nea-fast.com (Postfix) with ESMTP id 7E45E28058BE; Mon, 29 Nov 2004 13:03:31 -0500 (EST) Message-ID: <41AB6476.8060405@nea-fast.com> Date: Mon, 29 Nov 2004 13:03:34 -0500 From: kernel User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.2) Gecko/20040602 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: 2.6.9 tcp problems Content-Type: multipart/mixed; boundary="------------010402040202050206090202" X-archive-position: 12300 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kernel@nea-fast.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------010402040202050206090202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I've run into a problem with 2.6.(8.1,9) after installing a secondary firewall. When I try to pull data through the original firewall (mail, http, ssh), it stops after approx. 260k. Running ethereal tells me "A segment before the frame was lost" followed by a bunch of "This is a TCP duplicate ack" when using ssh. All 2.4.x machines and windows clients work fine. I built 2.4.28 and it works fine from my machine. I also fiddled with tcp_ecn and that didn't fix it either. I don't have any problems communicating to "local" machines. I've attached the tcpdump output from an scp attempt. NIC is a 3Com Corporation 3c905B. Thanks ! walt --------------010402040202050206090202 Content-Type: application/x-gzip; name="dump.txt.gz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="dump.txt.gz" H4sICChjq0EAA2R1bXAudHh0ALWZQWskNxCF7/kVfRyTbKOqkkolsexeQs4m5BZyGNYbYhKP zXog+fkpqafdya5boxKYGYNhjPXpPVX1Kw1gDjGHMKMgcJj+Pv51nk+fj+9+Pz6f50+PDzOh cJw+TODm5Y1ufn7+I0+3E4gPwpyi5OXXCIgH8P5mOn76Uz8mD8F51H97f5qQIk7vT49PP5Sf 8/3D5+fz8eFpAnK6eJpSjOSAJHyYDj/+dPMdbGgUEr2KFqNXtPvTGf7/yd3jw/H+lKcJGCh8 P93+8vPHCdcd6Pv+9O54d/dlPn55Os7TwePN14sqjk9f71oX21Go6pGJDoSX3Xtft51ienXb dbuIzq0CfLNt1RXA4shcFya6Lreyvaz/7briWIwnwfuMTg58sb6LIewzkOOAYlOfKAscvCwE StMlP6wwryCwN8l/WxbNKHIQt0AIXJch0MayMEy/nh+fJ/eP/Db9BwcSebIpIpAB0yaJ9EmC K1gbxztvVEdEC4RfeJTtujzMG1eLhzyzM5YrpowYDonXQ8td+viVrMUTXErRpo+un0n85ldP 49RFXrhaPNGhN+kzl/UzcKTS0S9IitclEa9wTSTBaDrR81RwMgHCGzKlNNBzFalCkKDb8yrh 1vGaZydx8qbmN1eA7AOnAWHSStdg8i44MJ6fgpPZQXxDJv96LmiaVZAqREB9zu2ZFXCDaUHo H0e2CVMAcvQc3koYpIDGyio4WRIMVDvgqtgVJm3QZrMKUoXQcMm7ZkXXZxZBkGgTpgBkcMQD PadPGa13q1uVJwOIGyj4bioa6ISVqVIIsN81THijaVH4GJ3RsEqQgTAMNB49bJcD1aIKIQZj zVeeDD66garvptKgYHesMC0UDHtBg5zDjaZFwSSERm0KgUYNCCPdp0ubCJLMWUN5MkTt1gNU YT3nbarkTCHx4lhhqhQAjvfyhg7T0mdZ1KhqLbKCkBXfjzSgLnEkJjGOgJVHB1GfRkq/j0qc GxjKK9NiGQa3lzr0FTacFkZiF40RsSJk1MFtpAPFtQs0qDSOARoPUuXJSJRGar+XaiQmVqbF MkphL3uQC7DhtDA0oSfjQ6MiZPTiR1pQlzg6VpOxyipPRtZZaoBK1t50hSqYrqAulhWmxbJQ rif2LOPYZxkKOWuVFYSM+t9HWlCXOMT6MlIVnowJZKT2e6niQF6sTItlrGvtWia04bQwdEz1 3ihOQch6KmigBaFbG3eTSupNo2miLzyZ0MlA7XdTwUCVVabrloELG04Lg7VkrOIUhEw65g60 oD5xoic05tjKk0kfswO1j7A+Tq5Q0UBirEwdliH0WSboS1wyiVMQMrHHgRaE2COOpr9grP3K kynKyDVnNxWPWFaYOiyjuOE0MSTYvj+YF4SsEWTkvhVpfdY2qNhxSNaDVHiyd3HksrOXqkzC ZssqU4dl21c+2JrLGPTgmMS5XRCyL8HmrcRBjNZQVHmyJx658sSwJoArVGj6PupiWWHqsIxT n2WkY5n1mrwgZB9g5O61TxwSoddr/18FoO0mACAAAA== --------------010402040202050206090202-- From shemminger@osdl.org Mon Nov 29 10:16:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 10:16:11 -0800 (PST) Received: from fire-1.osdl.org (fire.osdl.org [65.172.181.4]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATIG5QP011834 for ; Mon, 29 Nov 2004 10:16:05 -0800 Received: from zqx3.pdx.osdl.net (fw.osdl.org [65.172.181.6]) (authenticated bits=0) by fire-1.osdl.org (8.12.8/8.12.8) with ESMTP id iATIFcPE010595 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 29 Nov 2004 10:15:38 -0800 Date: Mon, 29 Nov 2004 10:19:19 -0800 From: Stephen Hemminger To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH] hamachi: module_param and __iomem cleanup Message-Id: <20041129101919.504f73ef@zqx3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i686-suse-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: osdl$Revision: 1.95 $ X-Scanned-By: MIMEDefang 2.36 X-archive-position: 12301 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Cleanup the Packet Engines Hamachi driver to get rid of warnings. Convert to the new format module_param macros. The device is memory mapped so store the memory base in the device structure and use that rather than dev->base_addr. Compiles clean, but not tested. Signed-off-by: Stephen Hemminger diff -Nru a/drivers/net/hamachi.c b/drivers/net/hamachi.c --- a/drivers/net/hamachi.c 2004-11-29 10:16:33 -08:00 +++ b/drivers/net/hamachi.c 2004-11-29 10:16:33 -08:00 @@ -153,6 +153,7 @@ #define TX_TIMEOUT (5*HZ) #include +#include #include #include #include @@ -512,27 +513,28 @@ u32 rx_int_var, tx_int_var; /* interrupt control variables */ u32 option; /* Hold on to a copy of the options */ struct pci_dev *pci_dev; + void __iomem *ioaddr; }; MODULE_AUTHOR("Donald Becker , Eric Kasten , Keith Underwood "); MODULE_DESCRIPTION("Packet Engines 'Hamachi' GNIC-II Gigabit Ethernet driver"); MODULE_LICENSE("GPL"); -MODULE_PARM(max_interrupt_work, "i"); -MODULE_PARM(mtu, "i"); -MODULE_PARM(debug, "i"); -MODULE_PARM(min_rx_pkt, "i"); -MODULE_PARM(max_rx_gap, "i"); -MODULE_PARM(max_rx_latency, "i"); -MODULE_PARM(min_tx_pkt, "i"); -MODULE_PARM(max_tx_gap, "i"); -MODULE_PARM(max_tx_latency, "i"); -MODULE_PARM(rx_copybreak, "i"); -MODULE_PARM(rx_params, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM(tx_params, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); -MODULE_PARM(force32, "i"); +module_param(max_interrupt_work, int, 0); +module_param(mtu, int, 0); +module_param(debug, int, 0); +module_param(min_rx_pkt, int, 0); +module_param(max_rx_gap, int, 0); +module_param(max_rx_latency, int, 0); +module_param(min_tx_pkt, int, 0); +module_param(max_tx_gap, int, 0); +module_param(max_tx_latency, int, 0); +module_param(rx_copybreak, int, 0); +module_param_array(rx_params, int, NULL, 0); +module_param_array(tx_params, int, NULL, 0); +module_param_array(options, int, NULL, 0); +module_param_array(full_duplex, int, NULL, 0); +module_param(force32, int, 0); MODULE_PARM_DESC(max_interrupt_work, "GNIC-II maximum events handled per interrupt"); MODULE_PARM_DESC(mtu, "GNIC-II MTU (all boards)"); MODULE_PARM_DESC(debug, "GNIC-II debug level (0-7)"); @@ -549,7 +551,7 @@ MODULE_PARM_DESC(full_duplex, "GNIC-II full duplex setting(s) (1)"); MODULE_PARM_DESC(force32, "GNIC-II: Bit 0: 32 bit PCI, bit 1: disable parity, bit 2: 64 bit PCI (all boards)"); -static int read_eeprom(long ioaddr, int location); +static int read_eeprom(void __iomem *ioaddr, int location); static int mdio_read(struct net_device *dev, int phy_id, int location); static void mdio_write(struct net_device *dev, int phy_id, int location, int value); static int hamachi_open(struct net_device *dev); @@ -575,7 +577,8 @@ int option, i, rx_int_var, tx_int_var, boguscnt; int chip_id = ent->driver_data; int irq; - long ioaddr; + unsigned long base; + void __iomem *ioaddr; static int card_idx; struct net_device *dev; void *ring_space; @@ -594,9 +597,9 @@ goto err_out; } - ioaddr = pci_resource_start(pdev, 0); + base = pci_resource_start(pdev, 0); #ifdef __alpha__ /* Really "64 bit addrs" */ - ioaddr |= (pci_resource_start(pdev, 1) << 32); + base |= (pci_resource_start(pdev, 1) << 32); #endif pci_set_master(pdev); @@ -605,7 +608,7 @@ if (i) return i; irq = pdev->irq; - ioaddr = (long) ioremap(ioaddr, 0x400); + ioaddr = ioremap(base, 0x400); if (!ioaddr) goto err_out_release; @@ -678,7 +681,7 @@ i = readb(ioaddr + PCIClkMeas); } - dev->base_addr = ioaddr; + dev->base_addr = (unsigned long) ioaddr; dev->irq = irq; pci_set_drvdata(pdev, dev); @@ -743,7 +746,7 @@ printk(KERN_INFO "%s: %s type %x at 0x%lx, ", dev->name, chip_tbl[chip_id].name, readl(ioaddr + ChipRev), - ioaddr); + dev->base_addr); for (i = 0; i < 5; i++) printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq); @@ -797,7 +800,7 @@ return ret; } -static int __devinit read_eeprom(long ioaddr, int location) +static int __devinit read_eeprom(void __iomem *ioaddr, int location) { int bogus_cnt = 1000; @@ -819,7 +822,8 @@ static int mdio_read(struct net_device *dev, int phy_id, int location) { - long ioaddr = dev->base_addr; + struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; int i; /* We should check busy first - per docs -KDU */ @@ -836,7 +840,8 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int value) { - long ioaddr = dev->base_addr; + struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; int i; /* We should check busy first - per docs -KDU */ @@ -857,7 +862,7 @@ static int hamachi_open(struct net_device *dev) { struct hamachi_private *hmp = netdev_priv(dev); - long ioaddr = dev->base_addr; + void __iomem *ioaddr = hmp->ioaddr; int i; u32 rx_int_var, tx_int_var; u16 fifo_info; @@ -987,7 +992,7 @@ writew(0x001D, ioaddr + RxDMACtrl); writew(0x001D, ioaddr + TxDMACtrl); #endif - writew(0x0001, dev->base_addr + RxCmd); + writew(0x0001, ioaddr + RxCmd); if (hamachi_debug > 2) { printk(KERN_DEBUG "%s: Done hamachi_open(), status: Rx %x Tx %x.\n", @@ -1038,7 +1043,7 @@ { struct net_device *dev = (struct net_device *)data; struct hamachi_private *hmp = netdev_priv(dev); - long ioaddr = dev->base_addr; + void __iomem *ioaddr = hmp->ioaddr; int next_tick = 10*HZ; if (hamachi_debug > 2) { @@ -1063,7 +1068,7 @@ { int i; struct hamachi_private *hmp = netdev_priv(dev); - long ioaddr = dev->base_addr; + void __iomem *ioaddr = hmp->ioaddr; printk(KERN_WARNING "%s: Hamachi transmit timed out, status %8.8x," " resetting...\n", dev->name, (int)readw(ioaddr + TxStatus)); @@ -1115,7 +1120,7 @@ } udelay(60); /* Sleep 60 us just for safety sake */ - writew(0x0002, dev->base_addr + RxCmd); /* STOP Rx */ + writew(0x0002, ioaddr + RxCmd); /* STOP Rx */ writeb(0x01, ioaddr + ChipReset); /* Reinit the hardware */ @@ -1157,9 +1162,9 @@ hmp->stats.tx_errors++; /* Restart the chip's Tx/Rx processes . */ - writew(0x0002, dev->base_addr + TxCmd); /* STOP Tx */ - writew(0x0001, dev->base_addr + TxCmd); /* START Tx */ - writew(0x0001, dev->base_addr + RxCmd); /* START Rx */ + writew(0x0002, ioaddr + TxCmd); /* STOP Tx */ + writew(0x0001, ioaddr + TxCmd); /* START Tx */ + writew(0x0001, ioaddr + RxCmd); /* START Rx */ netif_wake_queue(dev); } @@ -1275,9 +1280,9 @@ /* Wake the potentially-idle transmit channel. */ /* If we don't need to read status, DON'T -KDU */ - status=readw(dev->base_addr + TxStatus); + status=readw(hmp->ioaddr + TxStatus); if( !(status & 0x0001) || (status & 0x0002)) - writew(0x0001, dev->base_addr + TxCmd); + writew(0x0001, hmp->ioaddr + TxCmd); return 1; } @@ -1343,9 +1348,9 @@ /* Wake the potentially-idle transmit channel. */ /* If we don't need to read status, DON'T -KDU */ - status=readw(dev->base_addr + TxStatus); + status=readw(hmp->ioaddr + TxStatus); if( !(status & 0x0001) || (status & 0x0002)) - writew(0x0001, dev->base_addr + TxCmd); + writew(0x0001, hmp->ioaddr + TxCmd); /* Immediately before returning, let's clear as many entries as we can. */ hamachi_tx(dev); @@ -1376,8 +1381,9 @@ static irqreturn_t hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; - struct hamachi_private *hmp; - long ioaddr, boguscnt = max_interrupt_work; + struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; + long boguscnt = max_interrupt_work; int handled = 0; #ifndef final_version /* Can never occur. */ @@ -1386,9 +1392,7 @@ return IRQ_NONE; } #endif - - ioaddr = dev->base_addr; - hmp = netdev_priv(dev); + spin_lock(&hmp->lock); do { @@ -1687,8 +1691,8 @@ /* Restart Rx engine if stopped. */ /* If we don't need to check status, don't. -KDU */ - if (readw(dev->base_addr + RxStatus) & 0x0002) - writew(0x0001, dev->base_addr + RxCmd); + if (readw(hmp->ioaddr + RxStatus) & 0x0002) + writew(0x0001, hmp->ioaddr + RxCmd); return 0; } @@ -1697,8 +1701,8 @@ than just errors. */ static void hamachi_error(struct net_device *dev, int intr_status) { - long ioaddr = dev->base_addr; struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; if (intr_status & (LinkChange|NegotiationChange)) { if (hamachi_debug > 1) @@ -1731,8 +1735,8 @@ static int hamachi_close(struct net_device *dev) { - long ioaddr = dev->base_addr; struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; struct sk_buff *skb; int i; @@ -1817,8 +1821,8 @@ static struct net_device_stats *hamachi_get_stats(struct net_device *dev) { - long ioaddr = dev->base_addr; struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; /* We should lock this segment of code for SMP eventually, although the vulnerability window is very small and statistics are @@ -1845,7 +1849,8 @@ static void set_rx_mode(struct net_device *dev) { - long ioaddr = dev->base_addr; + struct hamachi_private *hmp = netdev_priv(dev); + void __iomem *ioaddr = hmp->ioaddr; if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ /* Unconditionally log net taps. */ @@ -1950,11 +1955,11 @@ */ if (!capable(CAP_NET_ADMIN)) return -EPERM; - writel(d[0], dev->base_addr + TxIntrCtrl); - writel(d[1], dev->base_addr + RxIntrCtrl); + writel(d[0], np->ioaddr + TxIntrCtrl); + writel(d[1], np->ioaddr + RxIntrCtrl); printk(KERN_NOTICE "%s: tx %08x, rx %08x intr\n", dev->name, - (u32) readl(dev->base_addr + TxIntrCtrl), - (u32) readl(dev->base_addr + RxIntrCtrl)); + (u32) readl(np->ioaddr + TxIntrCtrl), + (u32) readl(np->ioaddr + RxIntrCtrl)); rc = 0; } @@ -1980,7 +1985,7 @@ pci_free_consistent(pdev, TX_TOTAL_SIZE, hmp->tx_ring, hmp->tx_ring_dma); unregister_netdev(dev); - iounmap((char *)dev->base_addr); + iounmap(hmp->ioaddr); free_netdev(dev); pci_release_regions(pdev); pci_set_drvdata(pdev, NULL); From buytenh@wantstofly.org Mon Nov 29 11:08:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 11:08:34 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATJ8UAO014170 for ; Mon, 29 Nov 2004 11:08:30 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 0BBB12B0ED; Mon, 29 Nov 2004 20:08:09 +0100 (MET) Date: Mon, 29 Nov 2004 20:08:08 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041129190808.GA21164@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <20041127200030.GD27762@xi.wantstofly.org> <1101732267.14930.75.camel@verza.polito.it> <20041129151940.GA19184@xi.wantstofly.org> <1101749533.17091.3.camel@verza.polito.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101749533.17091.3.camel@verza.polito.it> User-Agent: Mutt/1.4.1i X-archive-position: 12302 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 06:32:13PM +0100, Marco Mellia wrote: > Using the Agilent Router tester as receiver... > :-( OK, so you're measuring the inter-packet gap and in that burst of 11 (or whatever many) packets it's 96 bit times between every packet, yes? Interesting. Can you also try 'pre-loading' the TX ring with a bunch of packets and then writing the values 0, 1, 2, 3 ... n-1 to the TXD register with back-to-back MMIO writes (instead of doing a single write of the value 'n'), and check what inter-packet gap you get then? cheers, Lennert From buytenh@wantstofly.org Mon Nov 29 11:10:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 11:10:09 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATJA46d014568 for ; Mon, 29 Nov 2004 11:10:04 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id D9C402B0ED; Mon, 29 Nov 2004 20:09:43 +0100 (MET) Date: Mon, 29 Nov 2004 20:09:43 +0100 From: Lennert Buytenhek To: Marco Mellia Cc: e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041129190943.GB21164@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <20041127200030.GD27762@xi.wantstofly.org> <1101732267.14930.75.camel@verza.polito.it> <20041129151940.GA19184@xi.wantstofly.org> <1101749533.17091.3.camel@verza.polito.it> <20041129190808.GA21164@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041129190808.GA21164@xi.wantstofly.org> User-Agent: Mutt/1.4.1i X-archive-position: 12303 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 08:08:08PM +0100, Lennert Buytenhek wrote: > packets and then writing the values 0, 1, 2, 3 ... n-1 to the TXD register ^^^ That should be TDT. --L From davem@davemloft.net Mon Nov 29 12:19:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 12:19:20 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATKJCtI024122 for ; Mon, 29 Nov 2004 12:19:12 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYrwK-0001p6-00; Mon, 29 Nov 2004 12:16:04 -0800 Date: Mon, 29 Nov 2004 12:16:04 -0800 From: "David S. Miller" To: Robert Olsson Cc: hadi@cyberus.ca, P@draigBrady.com, mellia@prezzemolo.polito.it, Robert.Olsson@data.slu.se, e1000-devel@lists.sourceforge.net, jorge.finochietto@polito.it, galante@polito.it, netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-Id: <20041129121604.47eb6593.davem@davemloft.net> In-Reply-To: <16811.8052.678955.795327@robur.slu.se> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12304 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 29 Nov 2004 14:09:08 +0100 Robert Olsson wrote: > Did I dream or did someone tell me that S2IO > could have several TX ring that could via MSI be routed to proper cpu? One of Sun's gigabit chips can do this too, except it isn't via MSI, the driver has to read the descriptor to figure out which cpu gets the software interrupt to process the packet. SGI had hardware which allowed you to do this kind of stuff too. Obviously the MSI version works much better. It is important, the cpu selection process. First of all, it must be calculated such that flows always go through the same cpu. Otherwise TCP sockets bounce between the cpus for a streaming transfer. And even this doesn't avoid all such problems, TCP LISTEN state sockets will still thrash between the cpus with such a "pick a cpu based upon" flow scheme. Anyways, just some thoughts. From paul@clubi.ie Mon Nov 29 12:28:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 12:28:43 -0800 (PST) Received: from hibernia.jakma.org (hibernia.jakma.org [212.17.55.49]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATKSR1b024687 for ; Mon, 29 Nov 2004 12:28:28 -0800 Received: from hibernia.jakma.org (IDENT:paul@hibernia.jakma.org [192.168.0.3]) by hibernia.jakma.org (8.12.11/8.12.11) with ESMTP id iATKRv6C000680; Mon, 29 Nov 2004 20:27:57 GMT Date: Mon, 29 Nov 2004 20:27:57 +0000 (GMT) From: Paul Jakma X-X-Sender: paul@hibernia.jakma.org To: Thomas Spatzier cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [patch 4/10] s390: network driver. In-Reply-To: Message-ID: References: Mail-Followup-To: paul@hibernia.jakma.org X-NSA: arafat al aqsar jihad musharef jet-A1 avgas ammonium qran inshallah allah al-akbar martyr iraq saddam hammas hisballah rabin ayatollah korea vietnam revolt mustard gas british airways washington MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-archive-position: 12305 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@clubi.ie Precedence: bulk X-list: netdev On Mon, 29 Nov 2004, Thomas Spatzier wrote: > Yes, for the examples you mentioned the app should better be > notified. However, AFAICS, there are no such notification > mechanisms on a per-packet basis implemented in the kernel. And I > doubt that they are going to be implemented. We do get notified. We get a netlink interface update with unset IFF_RUNNING from the interface flags. However, it can take time before zebra gets to read it, and further time before zebra sends its own interface update to protocol daemons, and further time before they might get to read and update their own interface state. By which time those daemons may have sent packets down those interfaces (which packets may become invalid before link becomes back, but which still will be sent and hence which potentially could disrupt routing). Ideally, we should be notified synchronously (EBUFS?) or if thats not possible, packet should be dropped (see my below presumption though). The other solution is some means for a daemon to be able flush queues for a specific interface. (but thats a bit ugly). > Good suggestion, if anyone has an interesting and feasible solution > I will be happy to integrate it. So far, however, it don't see one > and I would point people being worried about lost packets to TCP. Surely TCP already was able to take care of retransmits? I'm not familiar with Linux internals, but how did TCP cope with the previous driver behaviour? (I get the vague impression that we're talking about a driver specific buffer here, rather than the applications socket buffer - is that correct?). Jeff, David, enlighten us please! :) > Regards, > Thomas. regards, -- Paul Jakma paul@clubi.ie paul@jakma.org Key ID: 64A2FF6A Fortune: I can't understand why people are frightened of new ideas. I'm frightened of the old ones. -- John Cage From anton@ozlabs.org Mon Nov 29 13:22:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 13:22:17 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATLMA4T026414 for ; Mon, 29 Nov 2004 13:22:13 -0800 Received: by ozlabs.org (Postfix, from userid 1010) id 462342BDF2; Tue, 30 Nov 2004 08:21:44 +1100 (EST) Date: Tue, 30 Nov 2004 08:18:57 +1100 From: Anton Blanchard To: netdev@oss.sgi.com Subject: KERNEL: assertion (!sk->sk_forward_alloc) Message-ID: <20041129211855.GC17540@krispykreme.ozlabs.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-archive-position: 12306 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: anton@samba.org Precedence: bulk X-list: netdev Hi, I was running a network test on a machine with a number of e1000s in it (netperf TCP_RR). The test included a range of message sizes from 64B up to 64kB. The kernel is 2.6.10-rc2 BK from November 22. I set tcp_tso_win_divisor to 2: # cat /proc/sys/net/ipv4/tcp_tso_win_divisor 2 After a while some network assertion errors appeared in the log: KERNEL: assertion (!sk->sk_forward_alloc) failed at net/core/stream.c (279) KERNEL: assertion (!sk->sk_forward_alloc) failed at net/ipv4/af_inet.c (180) Note that this test was run using the send-to-self patch. Anton From terryg@axian.com Mon Nov 29 14:08:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 14:08:12 -0800 (PST) Received: from zaphod.axian.com (zaphod.axian.com [64.122.196.146]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATM85VV027881 for ; Mon, 29 Nov 2004 14:08:05 -0800 Received: from [192.168.132.223] (trillian.axian.com [64.122.196.158]) by zaphod.axian.com (8.12.11/8.12.11) with ESMTP id iATM7eDo016447; Mon, 29 Nov 2004 14:07:40 -0800 Subject: Re: odd behavior with r8169 and pcap From: Terry Griffin To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com In-Reply-To: <20041129210213.GA3880@electric-eye.fr.zoreil.com> References: <1101751909.2291.21.camel@tux.hq.axian.com> <20041129210213.GA3880@electric-eye.fr.zoreil.com> Content-Type: text/plain Message-Id: <1101766059.3382.57.camel@tux.hq.axian.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Mon, 29 Nov 2004 14:07:39 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 12307 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: terryg@axian.com Precedence: bulk X-list: netdev On Mon, 2004-11-29 at 13:02, Francois Romieu wrote: > Terry Griffin : > [...] > > So the obvious questions are: Is this a known problem? Why the > > heck does it do this? Is there a fix or workaround to get the > > high rate all the time other than running a pcap utility 24x7? > > 1 - not really > 2 - details please: > - which kernel versions have been tested ? > - when did the bahavior appear first ? > - which compiler version ? > - can you provide a short description of the hardware ? > - lspci -vx, lsmod, dmesg after boot, /proc/interrupts, vmstat 1 > for a few seconds when ok/nok will be welcome > 3 - can it be reproduced with latest -bk ? > > Please Cc: netdev@oss.sgi.com. > > -- > Ueimor > - I don't know when it first appeared. I just got my hands on this hardware and the problem has been there from the beginning. I've tested the pre-built 2.6.5-1 kernel that came with Fedora Core 2 and the 2.6.9 kernel from kernel.org. The compiler is gcc 3.3.3. The hardware is a Dell Dimension 3000, 2.8 GHz P4 (not hyperthreading), with 512MB RAM. There are *two* Realtek RTL-8169 adapters installed. lspci identifies them as: 01:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10) 01:02.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10) lspci -vx gives: 00:00.0 Host bridge: Intel Corp. 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, fast devsel, latency 0 Memory at f0000000 (32-bit, prefetchable) Capabilities: [e4] #09 [1106] 00: 86 80 70 25 06 01 90 20 02 00 00 06 00 00 00 00 10: 08 00 00 f0 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 e4 00 00 00 00 00 00 00 00 00 00 00 00:02.0 VGA compatible controller: Intel Corp. 82865G Integrated Graphics Device (rev 02) (prog-if 00 [VGA]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: fast devsel, IRQ 11 Memory at e8000000 (32-bit, prefetchable) Memory at feb80000 (32-bit, non-prefetchable) [size=512K] I/O ports at ed98 [size=8] Capabilities: [d0] Power Management version 1 00: 86 80 72 25 03 00 90 00 02 00 00 03 00 00 00 00 10: 08 00 00 e8 00 00 b8 fe 99 ed 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 d0 00 00 00 00 00 00 00 0b 01 00 00 00:1d.0 USB Controller: Intel Corp. 82801EB/ER (ICH5/ICH5R) USB UHCI #1 (rev 02) (prog-if 00 [UHCI]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 11 I/O ports at ff80 [size=32] 00: 86 80 d2 24 05 00 80 02 02 00 03 0c 00 00 80 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 81 ff 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 00 00 00 00 00 00 00 00 0b 01 00 00 00:1d.1 USB Controller: Intel Corp. 82801EB/ER (ICH5/ICH5R) USB UHCI #2 (rev 02) (prog-if 00 [UHCI]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 10 I/O ports at ff60 [size=32] 00: 86 80 d4 24 05 00 80 02 02 00 03 0c 00 00 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 61 ff 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 00 00 00 00 00 00 00 00 0a 02 00 00 00:1d.3 USB Controller: Intel Corp. 82801EB/ER (ICH5/ICH5R) USB UHCI #4 (rev 02) (prog-if 00 [UHCI]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 11 I/O ports at ff20 [size=32] 00: 86 80 de 24 05 00 80 02 02 00 03 0c 00 00 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 21 ff 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 00 00 00 00 00 00 00 00 0b 01 00 00 00:1d.7 USB Controller: Intel Corp. 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller (rev 02) (prog-if 20 [EHCI]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 9 Memory at ffa80800 (32-bit, non-prefetchable) Capabilities: [50] Power Management version 2 Capabilities: [58] #0a [20a0] 00: 86 80 dd 24 06 01 90 02 02 20 03 0c 00 00 00 00 10: 00 08 a8 ff 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 50 00 00 00 00 00 00 00 09 04 00 00 00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB/ER Hub interface to PCI Bridge (rev c2) (prog-if 00 [Normal decode]) Flags: bus master, fast devsel, latency 0 Bus: primary=00, secondary=01, subordinate=01, sec-latency=32 I/O behind bridge: 0000d000-0000dfff Memory behind bridge: fe900000-feafffff 00: 86 80 4e 24 07 01 80 00 c2 00 04 06 00 00 01 00 10: 00 00 00 00 00 00 00 00 00 01 01 20 d0 d0 80 22 20: 90 fe a0 fe f0 ff 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00:1f.0 ISA bridge: Intel Corp. 82801EB/ER (ICH5/ICH5R) LPC Bridge (rev 02) Flags: bus master, medium devsel, latency 0 00: 86 80 d0 24 0f 01 80 02 02 00 01 06 00 00 80 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:1f.1 IDE interface: Intel Corp. 82801EB/ER (ICH5/ICH5R) Ultra ATA 100 Storage Controller (rev 02) (prog-if 8a [Master SecP PriP]) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 5 I/O ports at I/O ports at I/O ports at I/O ports at I/O ports at ffa0 [size=16] Memory at feb7fc00 (32-bit, non-prefetchable) [size=1K] 00: 86 80 db 24 07 00 88 02 02 8a 01 01 00 00 00 00 10: f1 01 00 00 f5 03 00 00 71 01 00 00 75 03 00 00 20: a1 ff 00 00 00 fc b7 fe 00 00 00 00 28 10 9d 01 30: 00 00 00 00 00 00 00 00 00 00 00 00 05 01 00 00 00:1f.3 SMBus: Intel Corp. 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: medium devsel, IRQ 3 I/O ports at eda0 [size=32] 00: 86 80 d3 24 01 00 80 02 02 00 05 0c 00 00 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: a1 ed 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 00 00 00 00 00 00 00 00 03 02 00 00 00:1f.5 Multimedia audio controller: Intel Corp. 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller (rev 02) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 0, IRQ 3 I/O ports at ee00 I/O ports at edc0 [size=64] Memory at feb7fa00 (32-bit, non-prefetchable) [size=512] Memory at feb7f900 (32-bit, non-prefetchable) [size=256] Capabilities: [50] Power Management version 2 00: 86 80 d5 24 07 00 90 02 02 00 01 04 00 00 00 00 10: 01 ee 00 00 c1 ed 00 00 00 fa b7 fe 00 f9 b7 fe 20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 50 00 00 00 00 00 00 00 03 02 00 00 01:00.0 FireWire (IEEE 1394): Texas Instruments TSB82AA2 IEEE-1394b Link Layer Controller (rev 01) (prog-if 10 [OHCI]) Subsystem: AFAVLAB Technology Inc: Unknown device 702a Flags: bus master, medium devsel, latency 64, IRQ 10 Memory at fe9fa800 (32-bit, non-prefetchable) Memory at fe9fc000 (32-bit, non-prefetchable) [size=16K] Capabilities: [44] Power Management version 2 00: 4c 10 25 80 16 01 10 02 01 10 00 0c 10 40 00 00 10: 00 a8 9f fe 00 c0 9f fe 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 db 14 2a 70 30: 00 00 00 00 44 00 00 00 00 00 00 00 0a 01 02 04 01:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10) Subsystem: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet Flags: bus master, 66Mhz, medium devsel, latency 64, IRQ 9 I/O ports at dd00 [size=fea00000] Memory at fe9fa600 (32-bit, non-prefetchable) [size=256] Expansion ROM at 00020000 [disabled] Capabilities: [dc] Power Management version 2 00: ec 10 69 81 17 01 b0 02 10 00 00 02 10 40 00 00 10: 01 dd 00 00 00 a6 9f fe 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 ec 10 69 81 30: 00 00 a0 fe dc 00 00 00 00 00 00 00 09 01 20 40 01:02.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10) Subsystem: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet Flags: bus master, 66Mhz, medium devsel, latency 64, IRQ 3 I/O ports at de00 [size=fea00000] Memory at fe9fa700 (32-bit, non-prefetchable) [size=256] Expansion ROM at 00020000 [disabled] Capabilities: [dc] Power Management version 2 00: ec 10 69 81 17 01 b0 02 10 00 00 02 10 40 00 00 10: 01 de 00 00 00 a7 9f fe 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 ec 10 69 81 30: 00 00 a0 fe dc 00 00 00 00 00 00 00 03 01 20 40 01:08.0 Ethernet controller: Intel Corp. 82562EZ 10/100 Ethernet Controller (rev 02) Subsystem: Dell Computer Corporation: Unknown device 019d Flags: bus master, medium devsel, latency 64, IRQ 5 Memory at fe9fb000 (32-bit, non-prefetchable) I/O ports at dcc0 [size=64] Capabilities: [dc] Power Management version 2 00: 86 80 50 10 17 01 90 02 02 00 00 02 10 40 00 00 10: 00 b0 9f fe c1 dc 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 9d 01 30: 00 00 00 00 dc 00 00 00 00 00 00 00 05 01 08 38 lsmod gives: Module Size Used by r8169 16008 0 md5 3968 1 ipv6 216448 10 autofs4 14852 0 sunrpc 124516 1 e100 29568 0 mii 3968 1 e100 microcode 5408 0 dm_mod 48508 0 uhci_hcd 27920 0 ehci_hcd 26884 0 button 5008 0 battery 7300 0 ac 3460 0 ext3 102120 2 jbd 48664 1 ext3 ata_piix 6404 0 libata 36484 1 ata_piix sd_mod 14096 0 scsi_mod 100044 2 libata,sd_mod dmesg after boot gives: Linux version 2.6.9tg3 (root@tux.hq.axian.com) (gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)) #5 Tue Nov 23 09:48:48 PST 2004 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 00000000000a0000 (usable) BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000001fe70000 (usable) BIOS-e820: 000000001fe70000 - 000000001fe72000 (ACPI NVS) BIOS-e820: 000000001fe72000 - 000000001fe93000 (ACPI data) BIOS-e820: 000000001fe93000 - 000000001ff00000 (reserved) BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved) BIOS-e820: 00000000fecf0000 - 00000000fecf1000 (reserved) BIOS-e820: 00000000fed20000 - 00000000fed90000 (reserved) BIOS-e820: 00000000fee00000 - 00000000fee10000 (reserved) BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved) 0MB HIGHMEM available. 510MB LOWMEM available. On node 0 totalpages: 130672 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 126576 pages, LIFO batch:16 HighMem zone: 0 pages, LIFO batch:1 DMI 2.3 present. ACPI: RSDP (v000 DELL ) @ 0x000feb90 ACPI: RSDT (v001 DELL 3000 0x00000007 ASL 0x00000061) @ 0x000fd28b ACPI: FADT (v001 DELL 3000 0x00000007 ASL 0x00000061) @ 0x000fd2bf ACPI: SSDT (v001 DELL st_ex 0x00001000 MSFT 0x0100000d) @ 0xfffd1a9a ACPI: MADT (v001 DELL 3000 0x00000007 ASL 0x00000061) @ 0x000fd333 ACPI: BOOT (v001 DELL 3000 0x00000007 ASL 0x00000061) @ 0x000fd39f ACPI: DSDT (v001 DELL dt_ex 0x00001000 MSFT 0x0100000d) @ 0x00000000 ACPI: PM-Timer IO Port: 0x808 Built 1 zonelists Kernel command line: ro root=LABEL=/ Initializing CPU#0 PID hash table entries: 2048 (order: 11, 32768 bytes) Detected 2794.847 MHz processor. Using pmtmr for high-res timesource Console: colour VGA+ 80x25 Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 514128k/522688k available (1949k kernel code, 7900k reserved, 655k data, 160k init, 0k highmem) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay loop... 5537.79 BogoMIPS (lpj=2768896) Security Scaffold v1.0.0 initialized SELinux: Initializing. SELinux: Starting in permissive mode There is already a security framework initialized, register_security failed. selinux_register_security: Registering secondary module capability Capability LSM initialized as secondary Mount-cache hash table entries: 512 (order: 0, 4096 bytes) CPU: After generic identify, caps: bfebfbff 00000000 00000000 00000000 CPU: After vendor identify, caps: bfebfbff 00000000 00000000 00000000 monitor/mwait feature present. using mwait in idle threads. CPU: Trace cache: 12K uops, L1 D cache: 16K CPU: L2 cache: 1024K CPU: After all inits, caps: bfebfbff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. CPU0: Intel P4/Xeon Extended MCE MSRs (12) available CPU: Intel(R) Pentium(R) 4 CPU 2.80GHz stepping 04 Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Checking 'hlt' instruction... OK. ACPI: IRQ9 SCI: Level Trigger. checking if image is initramfs...it isn't (no cpio magic); looks like an initrd Freeing initrd memory: 270k freed NET: Registered protocol family 16 PCI: PCI BIOS revision 2.10 entry at 0xfbbf8, last bus=1 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20040816 ACPI: Interpreter enabled ACPI: Using PIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) PCI: Ignoring BAR0-3 of IDE controller 0000:00:1f.1 PCI: Transparent bridge - 0000:00:1e.0 ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PCI1._PRT] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 9 10 *11 12 15) ACPI: PCI Interrupt Link [LNKB] (IRQs *3 4 5 6 7 9 10 11 12 15) ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 9 10 11 12 15) ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 9 *10 11 12 15) ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 *5 6 7 9 10 11 12 15) ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 9 *10 11 12 15) ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 *9 10 11 12 15) ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 *9 10 11 12 15) Linux Plug and Play Support v0.97 (c) Adam Belay usbcore: registered new driver usbfs usbcore: registered new driver hub PCI: Using ACPI for IRQ routing ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 11 ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 11 (level, low) -> IRQ 11 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 11 (level, low) -> IRQ 11 ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 10 ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 10 (level, low) -> IRQ 10 ACPI: PCI interrupt 0000:00:1d.3[A] -> GSI 11 (level, low) -> IRQ 11 ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 9 ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 9 (level, low) -> IRQ 9 ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 5 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 5 (level, low) -> IRQ 5 ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 3 ACPI: PCI interrupt 0000:00:1f.3[B] -> GSI 3 (level, low) -> IRQ 3 ACPI: PCI interrupt 0000:00:1f.5[B] -> GSI 3 (level, low) -> IRQ 3 ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 10 ACPI: PCI interrupt 0000:01:00.0[A] -> GSI 10 (level, low) -> IRQ 10 ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 9 ACPI: PCI interrupt 0000:01:01.0[A] -> GSI 9 (level, low) -> IRQ 9 ACPI: PCI interrupt 0000:01:02.0[A] -> GSI 3 (level, low) -> IRQ 3 ACPI: PCI Interrupt Link [LNKE] enabled at IRQ 5 ACPI: PCI interrupt 0000:01:08.0[A] -> GSI 5 (level, low) -> IRQ 5 Simple Boot Flag value 0x87 read from CMOS RAM was invalid Simple Boot Flag at 0x7a set to 0x1 apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16ac) apm: overridden by ACPI. audit: initializing netlink socket (disabled) audit(1101763151.4294967114:0): initialized Total HugeTLB memory allocated, 0 VFS: Disk quotas dquot_6.5.1 Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) SELinux: Registering netfilter hooks Initializing Cryptographic API vesafb: probe of vesafb0 failed with error -6 ACPI: Processor [CPU0] (supports C1) isapnp: Scanning for PnP cards... isapnp: No Plug & Play device found Real Time Clock Driver v1.12 Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected an Intel 865 Chipset. agpgart: Maximum main memory to use for agp memory: 438M agpgart: Detected 892K stolen memory. agpgart: AGP aperture is 128M @ 0xe8000000 ACPI: PCI interrupt 0000:00:02.0[A] -> GSI 11 (level, low) -> IRQ 11 [drm] Initialized i830 1.3.2 20021108 on minor 0: serio: i8042 AUX port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing enabled ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize divert: not allocating divert_blk for non-ethernet device lo Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx ICH5: IDE controller at PCI slot 0000:00:1f.1 ACPI: PCI interrupt 0000:00:1f.1[A] -> GSI 5 (level, low) -> IRQ 5 ICH5: chipset revision 2 ICH5: not 100% native mode: will probe irqs later ide0: BM-DMA at 0xffa0-0xffa7, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0xffa8-0xffaf, BIOS settings: hdc:DMA, hdd:pio Probing IDE interface ide0... hda: ST340014A, ATA DISK drive Using anticipatory io scheduler ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 Probing IDE interface ide1... hdc: GCR-8483B, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 Probing IDE interface ide2... ide2: Wait for ready failed before probe ! Probing IDE interface ide3... ide3: Wait for ready failed before probe ! Probing IDE interface ide4... ide4: Wait for ready failed before probe ! Probing IDE interface ide5... ide5: Wait for ready failed before probe ! hda: max request size: 1024KiB hda: 78125000 sectors (40000 MB) w/2048KiB Cache, CHS=16383/255/63, UDMA(100) hda: cache flushes supported hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 > hdc: ATAPI 48X CD-ROM drive, 128kB Cache, UDMA(33) Uniform CD-ROM driver Revision: 3.20 ide-floppy driver 0.99.newide usbcore: registered new driver hiddev usbcore: registered new driver usbhid drivers/usb/input/hid-core.c: v2.0:USB HID core driver mice: PS/2 mouse device common for all mice input: AT Translated Set 2 keyboard on isa0060/serio0 input: ImPS/2 Generic Wheel Mouse on isa0060/serio1 md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27 NET: Registered protocol family 2 IP: routing cache hash table of 4096 buckets, 32Kbytes TCP: Hash tables configured (established 32768 bind 65536) Initializing IPsec netlink socket NET: Registered protocol family 1 NET: Registered protocol family 17 ACPI: (supports S0 S1 S3 S4 S5) ACPI wakeup devices: VBTN PCI0 USB0 USB1 USB2 USB3 PCI1 KBD md: Autodetecting RAID arrays. md: autorun ... md: ... autorun DONE. RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). SCSI subsystem initialized libata version 1.02 loaded. kjournald starting. Commit interval 5 seconds EXT3-fs: mounted filesystem with ordered data mode. Freeing unused kernel memory: 160k freed SELinux: Disabled at runtime. SELinux: Unregistering netfilter hooks ACPI: Power Button (FF) [PWRF] ACPI: PCI interrupt 0000:00:1d.7[D] -> GSI 9 (level, low) -> IRQ 9 ehci_hcd 0000:00:1d.7: EHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.7 to 64 ehci_hcd 0000:00:1d.7: irq 9, pci mem e082e800 ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1 PCI: cache line size of 128 is not supported by device 0000:00:1d.7 ehci_hcd 0000:00:1d.7: USB 2.0 enabled, EHCI 1.00, driver 2004-May-10 hub 1-0:1.0: USB hub found hub 1-0:1.0: 8 ports detected USB Universal Host Controller Interface driver v2.2 ACPI: PCI interrupt 0000:00:1d.0[A] -> GSI 11 (level, low) -> IRQ 11 uhci_hcd 0000:00:1d.0: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.0 to 64 uhci_hcd 0000:00:1d.0: irq 11, io base 0000ff80 uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.1[B] -> GSI 10 (level, low) -> IRQ 10 uhci_hcd 0000:00:1d.1: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.1 to 64 uhci_hcd 0000:00:1d.1: irq 10, io base 0000ff60 uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3 hub 3-0:1.0: USB hub found hub 3-0:1.0: 2 ports detected ACPI: PCI interrupt 0000:00:1d.3[A] -> GSI 11 (level, low) -> IRQ 11 uhci_hcd 0000:00:1d.3: UHCI Host Controller PCI: Setting latency timer of device 0000:00:1d.3 to 64 uhci_hcd 0000:00:1d.3: irq 11, io base 0000ff20 uhci_hcd 0000:00:1d.3: new USB bus registered, assigned bus number 4 hub 4-0:1.0: USB hub found hub 4-0:1.0: 2 ports detected EXT3 FS on hda2, internal journal device-mapper: 4.1.0-ioctl (2003-12-10) initialised: dm@uk.sistina.com cdrom: open failed. Adding 1044216k swap on /dev/hda3. Priority:-1 extents:1 kjournald starting. Commit interval 5 seconds EXT3 FS on hda1, internal journal EXT3-fs: mounted filesystem with ordered data mode. IA-32 Microcode Update Driver: v1.14 microcode: No suitable data for CPU0 e100: Intel(R) PRO/100 Network Driver, 3.0.27-k2-NAPI e100: Copyright(c) 1999-2004 Intel Corporation ACPI: PCI interrupt 0000:01:08.0[A] -> GSI 5 (level, low) -> IRQ 5 divert: allocating divert_blk for eth0 e100: eth0: e100_probe: addr 0xfe9fb000, irq 5, MAC addr 00:11:11:5C:BF:ED e100: eth0: e100_watchdog: link up, 100Mbps, full-duplex NET: Registered protocol family 10 Disabled Privacy Extensions on device c034c5c0(lo) IPv6 over IPv4 tunneling driver divert: not allocating divert_blk for non-ethernet device sit0 eth0: no IPv6 routers present r8169 Gigabit Ethernet driver 1.2 loaded ACPI: PCI interrupt 0000:01:01.0[A] -> GSI 9 (level, low) -> IRQ 9 divert: allocating divert_blk for eth1 eth1: Identified chip type is 'RTL8169s/8110s'. eth1: RTL8169 at 0xe085c600, 00:40:f4:a9:d7:b2, IRQ 9 ACPI: PCI interrupt 0000:01:02.0[A] -> GSI 3 (level, low) -> IRQ 3 divert: allocating divert_blk for eth2 eth2: Identified chip type is 'RTL8169s/8110s'. eth2: RTL8169 at 0xe0862700, 00:40:f4:a9:d8:84, IRQ 3 r8169: eth1: link up r8169: eth2: link up eth1: no IPv6 routers present eth2: no IPv6 routers present When slow (no pcap monitoring) /proc/interrupts is: CPU0 0: 1531617 XT-PIC timer 1: 16 XT-PIC i8042 2: 0 XT-PIC cascade 3: 56 XT-PIC eth2 5: 2918 XT-PIC eth0 8: 1 XT-PIC rtc 9: 8861 XT-PIC acpi, ehci_hcd, eth1 10: 0 XT-PIC uhci_hcd 11: 0 XT-PIC uhci_hcd, uhci_hcd 12: 290 XT-PIC i8042 14: 3391 XT-PIC ide0 15: 18 XT-PIC ide1 NMI: 0 ERR: 0 And vmstat 1 gives: procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 406816 8636 72444 0 0 19 36 1023 34 0 0 99 1 0 0 0 399968 8652 79164 0 0 0 11680 4477 3563 0 11 67 22 0 0 0 398944 8652 80184 0 0 0 0 1567 557 0 3 88 9 0 0 0 395808 8656 83244 0 0 0 0 2671 1787 0 5 95 0 0 0 0 392992 8656 85944 0 0 0 0 2483 1547 0 4 90 6 0 0 0 390432 8668 88404 0 0 0 36 2334 1475 0 6 84 10 0 0 0 384416 8680 94524 0 0 0 14260 4229 3411 0 12 53 35 0 0 0 383200 8684 95664 0 0 0 0 1633 635 0 1 89 10 0 0 0 381728 8684 97104 0 0 0 0 1788 841 1 3 96 0 When fast (with pcap monitoring) /proc/interrupts is: CPU0 0: 1652710 XT-PIC timer 1: 16 XT-PIC i8042 2: 0 XT-PIC cascade 3: 56 XT-PIC eth2 5: 3147 XT-PIC eth0 8: 1 XT-PIC rtc 9: 232548 XT-PIC acpi, ehci_hcd, eth1 10: 0 XT-PIC uhci_hcd 11: 0 XT-PIC uhci_hcd, uhci_hcd 12: 290 XT-PIC i8042 14: 4086 XT-PIC ide0 15: 18 XT-PIC ide1 NMI: 0 ERR: 0 and vmstat 1 gives: procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 1 0 183316 2864 304900 0 0 18 572 1207 148 0 1 97 1 0 1 0 134420 2868 352420 0 0 0 49156 10313 3223 1 83 0 16 0 0 0 89236 2868 396700 0 0 0 40960 11536 3147 1 79 8 12 1 0 0 44500 2868 440320 0 0 0 45056 13089 3174 1 80 19 0 0 3 0 2796 2868 483520 0 0 0 44372 12912 3184 2 81 10 7 0 2 0 2216 860 487284 0 0 0 6392 12956 3243 0 84 0 16 1 0 0 2280 844 486720 0 0 0 33296 13276 3207 1 81 11 7 0 0 0 2152 848 486588 0 0 0 40960 12911 3241 2 81 17 0 1 0 0 1704 848 486552 0 0 0 45068 12938 3169 1 80 19 0 I will try -bk and follow up. I will also try yanking one of the two RealTek adapters to see if that makes any difference for the remaining adapter. (I should have thought of that before.) Thanks, Terry From bill@crowellsystems.com Mon Nov 29 14:09:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 14:09:25 -0800 (PST) Received: from mail.crowellsystems.com (66-193-215-164.gen.twtelecom.net [66.193.215.164]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iATM9JoN028063 for ; Mon, 29 Nov 2004 14:09:20 -0800 Received: (qmail 18238 invoked by uid 4009); 29 Nov 2004 22:08:52 -0000 Received: from unknown (HELO crowellsystems.com) (10.1.10.201) by s2 with SMTP; 29 Nov 2004 22:08:52 -0000 Message-ID: <41ABA014.4090309@crowellsystems.com> Date: Mon, 29 Nov 2004 17:17:56 -0500 From: Bill Crowell User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031007 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Patrick McHardy CC: Herbert Xu , James Morris , akpm@osdl.org, netdev@oss.sgi.com, mg@iceni.pl Subject: Re: Fw: ipsec hang References: <41A5D1CF.10504@trash.net> In-Reply-To: <41A5D1CF.10504@trash.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12308 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bill@crowellsystems.com Precedence: bulk X-list: netdev Hi, I'm trying to test the IPSec, but haven't been able to get the new update onto the remote computer due to problems that appear to be based on memory management. The bootloader uses tmpfs to build a file system and it's dying there. On the development server, I'm getting such nifty things as: root@s3:/mfxlinux/Npublish# grep -ri Slackware * Build_Modules.sh:Base="Slackware" Build_Modules.sh: if [ "$Base" = "Slackware" ]; then Build_Modules.sh: Line=${Line/"RedHat"/"Slackware"} Build_Modules.sh: Line=${Line/"Slackware"/"RedHat"} Initial/etc/Base:Slackware grep: memory exhausted root@s3:/mfxlinux/Npublish# The memory exhausted is not nice. 2GB ram on this server. Runs fine when I rev to 2.6.10-rc2. Obviously something else is broken in bk12. *** Also, Herbert's email system is blocking messages from my zone. If you can forward to him, that would be appreciated. *** Re the bk12, is there just 1 patch that I should install to 2.6.10-rc2 to test IPSec? If I don't fiddle with the mm code, we might be able to make some progress on this part. I just love simultaneous equations with 1000 or more variables... ;-) Bill Patrick McHardy wrote: > Herbert Xu wrote: > >> James Morris wrote: >> >> >>> I wonder if it's the same bug as >>> http://bugme.osdl.org/show_bug.cgi?id=3796 >>> >> >> >> Quite likely. >> >> Bill, can you please try the latest BK tree and see if you can >> still reproduce the hang? >> >> > The patch is not in Linus's tree yet, so you need to apply it > yourself. > > Regards > Patrick > > > -- William G. Crowell, VP & CTO | Phone 704.665.2000 Crowell Systems | Fax 704.665.2180 4235 South Stream Blvd Suite 100 | NOC 704.357.1885 Charlotte NC 28217 USA Computers are like airconditioners: They stop working properly if you open Windows. From buytenh@wantstofly.org Mon Nov 29 14:27:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 14:27:26 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATMRMKD028920 for ; Mon, 29 Nov 2004 14:27:22 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id E79F02B0ED; Mon, 29 Nov 2004 23:27:00 +0100 (MET) Date: Mon, 29 Nov 2004 23:27:00 +0100 From: Lennert Buytenhek To: Roger Luethi Cc: netdev@oss.sgi.com Subject: via-rhine unable to send back-to-back packets? Message-ID: <20041129222700.GA22918@xi.wantstofly.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 12309 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev Hi, I'm running some pktgen experiments on an Nehemiah mini-ITX board which has dual via-rhine controllers, and I'm seeing something odd -- it appears as if either the hardware can't send back-to-back packets, or the driver it making every packet two bytes longer than it should be. For example, when transmitting 300-byte packets, I can TX 38261 packets per second, but I should be able to TX ~38580. When doing the math, it turns out that 38261 is exactly the number of 302-byte packets you can stuff into Fast Ethernet per second. This test is not CPU limited -- I'm seeing the same issue from 100B packet size up to 1500B. Any ideas? I had a look at the driver but found nothing odd. cheers, Lennert From romieu@fr.zoreil.com Mon Nov 29 15:18:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 15:18:35 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATNIT8t032089 for ; Mon, 29 Nov 2004 15:18:30 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iATNI0vr006881; Tue, 30 Nov 2004 00:18:00 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iATNI0HF006880; Tue, 30 Nov 2004 00:18:00 +0100 Date: Tue, 30 Nov 2004 00:18:00 +0100 From: Francois Romieu To: Terry Griffin Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: odd behavior with r8169 and pcap Message-ID: <20041129231800.GB3880@electric-eye.fr.zoreil.com> References: <1101751909.2291.21.camel@tux.hq.axian.com> <20041129210213.GA3880@electric-eye.fr.zoreil.com> <1101766059.3382.57.camel@tux.hq.axian.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101766059.3382.57.camel@tux.hq.axian.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12310 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Terry Griffin : [...] Ok, thanks for the info. It may sound like voodoo, but... Could you pass acpi=off to the kernel and disable whatever acpi or USB option appearing in the bios ? -- Ueimor From kaber@trash.net Mon Nov 29 15:55:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 15:55:32 -0800 (PST) Received: from kaber.coreworks.de ([62.206.217.67]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iATNtPfW008370 for ; Mon, 29 Nov 2004 15:55:25 -0800 Received: from localhost ([127.0.0.1]) by kaber.coreworks.de with esmtp (Exim 4.34) id 1CYvLs-00084f-2t; Tue, 30 Nov 2004 00:54:40 +0100 Message-ID: <41ABB6BF.4080205@trash.net> Date: Tue, 30 Nov 2004 00:54:39 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041008 Debian/1.7.3-5 X-Accept-Language: en MIME-Version: 1.0 To: Bill Crowell CC: Herbert Xu , James Morris , akpm@osdl.org, netdev@oss.sgi.com, mg@iceni.pl Subject: Re: Fw: ipsec hang References: <41A5D1CF.10504@trash.net> <41ABA014.4090309@crowellsystems.com> In-Reply-To: <41ABA014.4090309@crowellsystems.com> Content-Type: multipart/mixed; boundary="------------020605010005050707010805" X-archive-position: 12311 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------020605010005050707010805 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Bill Crowell wrote: > Re the bk12, is there just 1 patch that I should install to 2.6.10-rc2 > to test IPSec? If I don't fiddle with the mm code, we might be able to > make some progress on this part. I just love simultaneous equations > with 1000 or more variables... ;-) Patch is attached. Regards Patrick --------------020605010005050707010805 Content-Type: text/plain; name="x" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/23 18:21:09-08:00 kaber@trash.net # [XFRM]: Fix endless loop in xfrm_policy_insert # # The patch 'Fix policy update bug when increasing # priority of last policy' broke this, when a policy # with lower priority than an existing policy is inserted # xfrm_policy_insert loops forever. # # Signed-off-by: Patrick McHardy # Signed-off-by: David S. Miller # # net/xfrm/xfrm_policy.c # 2004/11/23 18:20:49-08:00 kaber@trash.net +1 -0 # [XFRM]: Fix endless loop in xfrm_policy_insert # # The patch 'Fix policy update bug when increasing # priority of last policy' broke this, when a policy # with lower priority than an existing policy is inserted # xfrm_policy_insert loops forever. # # Signed-off-by: Patrick McHardy # Signed-off-by: David S. Miller # diff -Nru a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c --- a/net/xfrm/xfrm_policy.c 2004-11-30 00:51:18 +01:00 +++ b/net/xfrm/xfrm_policy.c 2004-11-30 00:51:18 +01:00 @@ -353,6 +353,7 @@ newpos = p; if (delpol) break; + p = &pol->next; } if (newpos) p = newpos; --------------020605010005050707010805-- From terryg@axian.com Mon Nov 29 16:01:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 16:01:46 -0800 (PST) Received: from zaphod.axian.com (zaphod.axian.com [64.122.196.146]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU01fL4008907 for ; Mon, 29 Nov 2004 16:01:42 -0800 Received: from [192.168.132.223] (trillian.axian.com [64.122.196.158]) by zaphod.axian.com (8.12.11/8.12.11) with ESMTP id iAU019ua026101; Mon, 29 Nov 2004 16:01:09 -0800 Subject: Re: odd behavior with r8169 and pcap From: Terry Griffin To: Francois Romieu Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20041129231800.GB3880@electric-eye.fr.zoreil.com> References: <1101751909.2291.21.camel@tux.hq.axian.com> <20041129210213.GA3880@electric-eye.fr.zoreil.com> <1101766059.3382.57.camel@tux.hq.axian.com> <20041129231800.GB3880@electric-eye.fr.zoreil.com> Content-Type: text/plain Message-Id: <1101772869.3382.101.camel@tux.hq.axian.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Mon, 29 Nov 2004 16:01:09 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 12312 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: terryg@axian.com Precedence: bulk X-list: netdev On Mon, 2004-11-29 at 15:18, Francois Romieu wrote: > Terry Griffin : > [...] > > Ok, thanks for the info. It may sound like voodoo, but... > > Could you pass acpi=off to the kernel and disable whatever acpi > or USB option appearing in the bios ? > > -- > Ueimor It was already voodoo with pcap in the causal loop. So more voodoo doesn't have the thrill it might have otherwise. Passing acpi=off did the trick. Throughput is at the higher rate with or without pcap monitoring. I did not have to change any BIOS settings. More info previously promised: - Removing one of the RealTek adapters did not help. - The problem still exists in 2.6.10-rc2 and 2.6.10-rc2-bk13. Terry From latten@austin.ibm.com Mon Nov 29 16:12:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 16:12:52 -0800 (PST) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU0CLuL009505 for ; Mon, 29 Nov 2004 16:12:38 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAU0Bojd434656 for ; Mon, 29 Nov 2004 19:11:50 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAU0Bom2400278 for ; Mon, 29 Nov 2004 17:11:50 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAU0BoAs021006 for ; Mon, 29 Nov 2004 17:11:50 -0700 Received: from austin.ibm.com (netmail1.austin.ibm.com [9.41.248.175]) by d03av02.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAU0BoZ5020984 for ; Mon, 29 Nov 2004 17:11:50 -0700 Received: from faith.austin.ibm.com (faith.austin.ibm.com [9.41.94.16]) by austin.ibm.com (8.12.9/8.12.10) with ESMTP id iAU0Bnss025032 for ; Mon, 29 Nov 2004 18:11:49 -0600 Received: from faith.austin.ibm.com (localhost.localdomain [127.0.0.1]) by faith.austin.ibm.com (8.12.10/8.12.8) with ESMTP id iB1JPs2A024627 for ; Wed, 1 Dec 2004 13:25:54 -0600 Received: (from jml@localhost) by faith.austin.ibm.com (8.12.10/8.12.10/Submit) id iB1JPsIM024625 for netdev@oss.sgi.com; Wed, 1 Dec 2004 13:25:54 -0600 Date: Wed, 1 Dec 2004 13:25:54 -0600 From: Joy Latten Message-Id: <200412011925.iB1JPsIM024625@faith.austin.ibm.com> To: netdev@oss.sgi.com Subject: [BUG?] IP Compression over 2 interfaces X-archive-position: 12313 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: latten@austin.ibm.com Precedence: bulk X-list: netdev I tried running an IP Compression stress testcase and noticed odd behaviour. I used 2 machines with 2 ethernet cards each and a simple transport mode configuration; sending compressed packets across each ethernet to the other machine. I start sending packets over first interface with no problems. But when I start sending over second interface, hardly any packets get sent. Meanwhile, first interface is sending hundreds of packets. My network cards are identical (ethernet pro 100). Has anyone else noticed this? Regards, Joy Latten From romieu@fr.zoreil.com Mon Nov 29 16:22:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 16:22:36 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU0MTg0013249 for ; Mon, 29 Nov 2004 16:22:30 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.10/8.12.1) with ESMTP id iAU0LRvr007810; Tue, 30 Nov 2004 01:21:27 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.10/8.12.10/Submit) id iAU0LRQs007809; Tue, 30 Nov 2004 01:21:27 +0100 Date: Tue, 30 Nov 2004 01:21:27 +0100 From: Francois Romieu To: Terry Griffin Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: odd behavior with r8169 and pcap Message-ID: <20041130002127.GC3880@electric-eye.fr.zoreil.com> References: <1101751909.2291.21.camel@tux.hq.axian.com> <20041129210213.GA3880@electric-eye.fr.zoreil.com> <1101766059.3382.57.camel@tux.hq.axian.com> <20041129231800.GB3880@electric-eye.fr.zoreil.com> <1101772869.3382.101.camel@tux.hq.axian.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101772869.3382.101.camel@tux.hq.axian.com> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 12314 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Terry Griffin : [...] > Passing acpi=off did the trick. Throughput is at the higher rate > with or without pcap monitoring. I did not have to change any BIOS > settings. As a longer term solution, something can surely be extracted from the acpi tables of your computer. See http://forums.gentoo.org/viewtopic.php?t=122145%22%22 for an intro. -- Ueimor From davem@davemloft.net Mon Nov 29 17:24:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 17:25:02 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU1OtWx015581 for ; Mon, 29 Nov 2004 17:24:56 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYwiY-0002Mu-00; Mon, 29 Nov 2004 17:22:10 -0800 Date: Mon, 29 Nov 2004 17:22:10 -0800 From: "David S. Miller" To: Anton Blanchard Cc: netdev@oss.sgi.com Subject: Re: KERNEL: assertion (!sk->sk_forward_alloc) Message-Id: <20041129172210.687bcad3.davem@davemloft.net> In-Reply-To: <20041129211855.GC17540@krispykreme.ozlabs.ibm.com> References: <20041129211855.GC17540@krispykreme.ozlabs.ibm.com> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12315 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 08:18:57 +1100 Anton Blanchard wrote: > KERNEL: assertion (!sk->sk_forward_alloc) failed at net/core/stream.c (279) > KERNEL: assertion (!sk->sk_forward_alloc) failed at net/ipv4/af_inet.c (180) > > Note that this test was run using the send-to-self patch. Try to reproduce without that patch installed. If there is any mixup of SKB handling by any element in the path the packet travels, you're screw up all the TCP accounting knobs on the socket and easily trigger messages like the above. From davem@davemloft.net Mon Nov 29 17:28:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 17:28:41 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU1SZqB016105 for ; Mon, 29 Nov 2004 17:28:35 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYwlw-0002Na-00; Mon, 29 Nov 2004 17:25:40 -0800 Date: Mon, 29 Nov 2004 17:25:40 -0800 From: "David S. Miller" To: Lennert Buytenhek Cc: rl@hellgate.ch, netdev@oss.sgi.com Subject: Re: via-rhine unable to send back-to-back packets? Message-Id: <20041129172540.6b959858.davem@davemloft.net> In-Reply-To: <20041129222700.GA22918@xi.wantstofly.org> References: <20041129222700.GA22918@xi.wantstofly.org> X-Mailer: Sylpheed version 0.9.99 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12316 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 29 Nov 2004 23:27:00 +0100 Lennert Buytenhek wrote: > For example, when transmitting 300-byte packets, I can TX 38261 packets > per second, but I should be able to TX ~38580. When doing the math, it > turns out that 38261 is exactly the number of 302-byte packets you can > stuff into Fast Ethernet per second. Is the packet length in those calculations taking into consideration the CRC et al. bytes that the card adds to the packet? From davem@davemloft.net Mon Nov 29 19:25:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 19:25:59 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU3Pr1a020647 for ; Mon, 29 Nov 2004 19:25:54 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYybZ-0002pM-00; Mon, 29 Nov 2004 19:23:05 -0800 Date: Mon, 29 Nov 2004 19:23:05 -0800 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [BK PATCH] [IPV6] Multiple locking fixes/improvements Message-Id: <20041129192305.4008be86.davem@davemloft.net> In-Reply-To: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> References: <20041122.223205.14979415.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iAU3Pr1a020647 X-archive-position: 12317 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 22 Nov 2004 22:32:05 -0500 (EST) YOSHIFUJI Hideaki / 吉藤英明 wrote: > Please pull the following changesets available at: > It all looks good to me, pulled. Thank you Yoshifuji-san. From davem@davemloft.net Mon Nov 29 19:51:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 19:51:55 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU3poLh021505 for ; Mon, 29 Nov 2004 19:51:50 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYz0h-0002tB-00; Mon, 29 Nov 2004 19:49:03 -0800 Date: Mon, 29 Nov 2004 19:49:03 -0800 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] [IPV6] Fix races in ip6_route_{input,output}(). Message-Id: <20041129194903.5899cd25.davem@davemloft.net> In-Reply-To: <20041128.103626.88640124.yoshfuji@linux-ipv6.org> References: <20041128.103626.88640124.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id iAU3poLh021505 X-archive-position: 12318 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Sun, 28 Nov 2004 10:36:26 +0900 (JST) YOSHIFUJI Hideaki / 吉藤英明 wrote: > We need to hold refcnt before releasing rt6_lock. Looks good, patch applied, thanks a lot. From klsxl@vip.163.com Mon Nov 29 19:52:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 19:53:03 -0800 (PST) Received: from RsProxy ([219.141.90.208]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAU3qt70021710 for ; Mon, 29 Nov 2004 19:52:58 -0800 Message-Id: <200411300352.iAU3qt70021710@oss.sgi.com> From: "klsxl@vip.163.com" To: netdev@oss.sgi.com Content-Type: text/plain;charset="GB2312" Reply-To: klsxl@vip.163.com Date: Tue, 30 Nov 2004 12:07:22 +0800 X-Priority: 3 X-Mailer: FoxMail 4.0 beta 2 [cn] X-archive-position: 12319 Subject: (no subject) X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: klsxl@vip.163.com Precedence: bulk X-list: netdev From davem@davemloft.net Mon Nov 29 20:05:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 20:05:14 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU457rZ022497 for ; Mon, 29 Nov 2004 20:05:08 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CYzDZ-0002uE-00; Mon, 29 Nov 2004 20:02:21 -0800 Date: Mon, 29 Nov 2004 20:02:20 -0800 From: "David S. Miller" To: Olaf Kirch Cc: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv Message-Id: <20041129200220.25ff3f7a.davem@davemloft.net> In-Reply-To: <20041125205503.GA18083@suse.de> References: <20041125205503.GA18083@suse.de> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12320 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Thu, 25 Nov 2004 21:55:03 +0100 Olaf Kirch wrote: > Before introduction of lock-less loopback, all of netdev_xmit_nit was > running with bottom halves disabled, and some code seems to rely on > this. One of them is af_packet's packet_rcv handler, which is called > from the receive path via netdev_xmit_nit. It takes a spin lock, > and if an interrupt occurs and calls netdev_xmit during this time, > the CPU deadlocks. > > The patch below disables BHs while in the TX path for loopback and > similar devices. > > An alternative, less conservative fix would be to just use spin_lock_bh > in af_packet.c. Good spotting. If it's only the dev_queue_xmit_nit() handlers which all want BHs disabled, why don't we just disable BHs in that function? From buytenh@wantstofly.org Mon Nov 29 22:48:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 22:48:50 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU6mjmb030567 for ; Mon, 29 Nov 2004 22:48:45 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id 18F132B0ED; Tue, 30 Nov 2004 07:48:24 +0100 (MET) Date: Tue, 30 Nov 2004 07:48:23 +0100 From: Lennert Buytenhek To: "David S. Miller" Cc: rl@hellgate.ch, netdev@oss.sgi.com Subject: Re: via-rhine unable to send back-to-back packets? Message-ID: <20041130064823.GA27872@xi.wantstofly.org> References: <20041129222700.GA22918@xi.wantstofly.org> <20041129172540.6b959858.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041129172540.6b959858.davem@davemloft.net> User-Agent: Mutt/1.4.1i X-archive-position: 12321 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Mon, Nov 29, 2004 at 05:25:40PM -0800, David S. Miller wrote: > > For example, when transmitting 300-byte packets, I can TX 38261 packets > > per second, but I should be able to TX ~38580. When doing the math, it > > turns out that 38261 is exactly the number of 302-byte packets you can > > stuff into Fast Ethernet per second. > > Is the packet length in those calculations taking into consideration > the CRC et al. bytes that the card adds to the packet? Yeah, preamble (8 bytes), CRC (4 bytes), inter-packet gap (12 bytes). Perhaps the via-rhine simply can't send out packets back-to-back and needs 14 byte times of inter-packet gap. I couldn't find any stray +2 in the driver anywhere but I'm just checking. From willy@w.ods.org Mon Nov 29 22:52:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 22:52:58 -0800 (PST) Received: from willy.net1.nerim.net (willy.net1.nerim.net [62.212.114.60]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU6qroc031033 for ; Mon, 29 Nov 2004 22:52:53 -0800 Date: Tue, 30 Nov 2004 07:43:38 +0100 From: Willy Tarreau To: kernel Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: 2.6.9 tcp problems Message-ID: <20041130064338.GI783@alpha.home.local> References: <41AB6476.8060405@nea-fast.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41AB6476.8060405@nea-fast.com> User-Agent: Mutt/1.4i X-archive-position: 12322 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: willy@w.ods.org Precedence: bulk X-list: netdev It is possible that the autoneg code has changed between 2.4 and 2.6 for the interface connected to the current firewall, and that you lose packets because of a duplex mismatch. Please check the negociation with ethtool on your system, and do so on the other firewall. Regards, willy On Mon, Nov 29, 2004 at 01:03:34PM -0500, kernel wrote: > I've run into a problem with 2.6.(8.1,9) after installing a secondary > firewall. When I try to pull data through the original firewall (mail, > http, ssh), it stops after approx. 260k. Running ethereal tells me "A > segment before the frame was lost" followed by a bunch of "This is a > TCP duplicate ack" when using ssh. All 2.4.x machines and windows > clients work fine. I built 2.4.28 and it works fine from my machine. I > also fiddled with tcp_ecn and that didn't fix it either. I don't have > any problems communicating to "local" machines. I've attached the > tcpdump output from an scp attempt. NIC is a 3Com Corporation 3c905B. > > Thanks ! > walt > From thomas.spatzier@de.ibm.com Mon Nov 29 23:30:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 29 Nov 2004 23:30:59 -0800 (PST) Received: from mtagate4.de.ibm.com (mtagate4.de.ibm.com [195.212.29.153]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU7Upa8007860 for ; Mon, 29 Nov 2004 23:30:52 -0800 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate4.de.ibm.com (8.12.10/8.12.10) with ESMTP id iAU7UPvU174708 for ; Tue, 30 Nov 2004 07:30:25 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAU7UYWp116836 for ; Tue, 30 Nov 2004 08:30:34 +0100 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iAU7UOr5008075 for ; Tue, 30 Nov 2004 08:30:25 +0100 Received: from d12ml061.megacenter.de.ibm.com (d12nrml1501.megacenter.de.ibm.com [9.149.164.51] (may be forged)) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id iAU7UOiS008056; Tue, 30 Nov 2004 08:30:24 +0100 In-Reply-To: Subject: Re: [patch 4/10] s390: network driver. To: Paul Jakma Cc: jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Thomas Spatzier Date: Tue, 30 Nov 2004 08:22:01 +0100 X-MIMETrack: Serialize by Router on D12ML061/12/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 30/11/2004 08:30:31 MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII X-archive-position: 12323 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: thomas.spatzier@de.ibm.com Precedence: bulk X-list: netdev Paul Jakma wrote on 29.11.2004 21:27:57: > We do get notified. We get a netlink interface update with > unset IFF_RUNNING from the interface flags. > > However, it can take time before zebra gets to read it, and further > time before zebra sends its own interface update to protocol daemons, > and further time before they might get to read and update their own > interface state. By which time those daemons may have sent packets > down those interfaces (which packets may become invalid before link > becomes back, but which still will be sent and hence which > potentially could disrupt routing). Ok, then some logic could be implemented in userland to take appropriate actions. It must be ensured that zebra handles the netlink notification fast enough. > > Ideally, we should be notified synchronously (EBUFS?) or if thats not > possible, packet should be dropped (see my below presumption though). In the manpages for send/sendto/sendmsg it says that there is a -ENOBUFS return value, if a sockets write queue is full. It also says: "Normally, this does not occur in Linux. Packets are just silently dropped when a device queue overflows." So, if packets are 'silently dropped' anyway, the fact that we drop them in our driver (and increment the error count in the net_device_stats accordingly) should not be a problem. > Surely TCP already was able to take care of retransmits? I'm not > familiar with Linux internals, but how did TCP cope with the previous > driver behaviour? I think that both behaviours are similar for TCP. TCP waits for ACKs for each packet. If they do not arrive, a retransmit is done. Sooner or later the connection will be reset, if no responses from the other side arrive. So the result for both driver behaviours should be the same. Regards, Thomas From mellia@prezzemolo.polito.it Tue Nov 30 00:43:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 00:43:28 -0800 (PST) Received: from prezzemolo.polito.it (IDENT:root@prezzemolo.polito.it [130.192.9.131]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAU8hMse013519 for ; Tue, 30 Nov 2004 00:43:23 -0800 Received: from mellia.lipar.polito.it ([192.168.85.105]) by prezzemolo.polito.it (8.12.10/8.12.10) with ESMTP id iAU8gQfm021477; Tue, 30 Nov 2004 09:42:26 +0100 Subject: Re: [E1000-devel] Transmission limit From: Marco Mellia Reply-To: mellia@prezzemolo.polito.it To: Lennert Buytenhek Cc: Marco Mellia , Harald Welte , P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041129145028.GC18788@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <20041127092503.GA12592@sunbeam.de.gnumonks.org> <1101718412.14930.46.camel@verza.polito.it> <20041129145028.GC18788@xi.wantstofly.org> Content-Type: text/plain Organization: Message-Id: <1101804146.11111.23.camel@mellia.lipar.polito.it> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 30 Nov 2004 09:42:26 +0100 Content-Transfer-Encoding: 7bit X-TLC-MailScanner-Information: Please contact the ISP for more information X-TLC-MailScanner: Found to be clean X-TLC-MailScanner-SpamCheck: not spam, SpamAssassin (score=-4.795, required 5.5, AWL 0.10, BAYES_00 -4.90) X-archive-position: 12324 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mellia@prezzemolo.polito.it Precedence: bulk X-list: netdev On Mon, 2004-11-29 at 15:50, Lennert Buytenhek wrote: > On Mon, Nov 29, 2004 at 09:53:33AM +0100, Marco Mellia wrote: > > > Th's our intuition too. > > Notice that we get the same results with 3com (broadcom based) gigabit > > cards. > > We are thinking of sending packet in "bursts" instead of single > > transfers. The only problem is to let the NIC know that there are more > > than a packet in a burst... > > Jamal implemented exactly this for e1000 already, he might be persuaded > into posting his patch here. Jamal? :) I guess that saying that we are _very_ interested in this might help. :-) We can offer as "beta-testers" as well... -- Ciao, /\/\/\rco +-----------------------------------+ | Marco Mellia - Assistant Professor| | Tel: 39-011-2276-608 | | Tel: 39-011-564-4173 | | Cel: 39-340-9674888 | /"\ .. . . . . . . . . . . . . | Politecnico di Torino | \ / . ASCII Ribbon Campaign . | Corso Duca degli Abruzzi 24 | X .- NO HTML/RTF in e-mail . | Torino - 10129 - Italy | / \ .- NO Word docs in e-mail. | http://www1.tlc.polito.it/mellia | .. . . . . . . . . . . . . +-----------------------------------+ The box said "Requires Windows 95 or Better." So I installed Linux. From tommy.christensen@tpack.net Tue Nov 30 01:32:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 01:32:32 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAU9WQ8F016817 for ; Tue, 30 Nov 2004 01:32:27 -0800 Received: (qmail 4625 invoked from network); 30 Nov 2004 09:31:59 -0000 Received: from dhcp-80.cph.tpack.net (HELO ?172.17.159.11?) (192.168.0.80) by 0 with SMTP; 30 Nov 2004 09:31:59 -0000 Message-ID: <41AC3E2F.2030003@tpack.net> Date: Tue, 30 Nov 2004 10:32:31 +0100 From: Tommy Christensen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Olaf Kirch CC: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv References: <20041125205503.GA18083@suse.de> In-Reply-To: <20041125205503.GA18083@suse.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12325 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Olaf Kirch wrote: > Before introduction of lock-less loopback, all of netdev_xmit_nit was > running with bottom halves disabled, and some code seems to rely on > this. One of them is af_packet's packet_rcv handler, which is called > from the receive path via netdev_xmit_nit. It takes a spin lock, > and if an interrupt occurs and calls netdev_xmit during this time, > the CPU deadlocks. An interrupt handler shouldn't call dev_queue_xmit() directly. If this indeed happens, it needs to be fixed. Which handler is this? > The patch below disables BHs while in the TX path for loopback and > similar devices. dev_queue_xmit() already have BHs disabled, so this won't do anything. And weren't you talking about interrupts ?? Protocol handlers are called with bottom halves disabled, but IRQs are enabled. This hasn't changed - and is assumed in lots of places. -Tommy From okir@suse.de Tue Nov 30 02:48:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 02:48:41 -0800 (PST) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUAmYau020580 for ; Tue, 30 Nov 2004 02:48:35 -0800 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id B59611196A78; Tue, 30 Nov 2004 11:48:08 +0100 (CET) Date: Tue, 30 Nov 2004 11:48:04 +0100 From: Olaf Kirch To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv Message-ID: <20041130104804.GC16970@suse.de> References: <20041125205503.GA18083@suse.de> <20041129200220.25ff3f7a.davem@davemloft.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="YiEDa0DAkWCtVeE4" Content-Disposition: inline In-Reply-To: <20041129200220.25ff3f7a.davem@davemloft.net> User-Agent: Mutt/1.5.6i X-archive-position: 12326 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev --YiEDa0DAkWCtVeE4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Nov 29, 2004 at 08:02:20PM -0800, David S. Miller wrote: > If it's only the dev_queue_xmit_nit() handlers which all want > BHs disabled, why don't we just disable BHs in that function? That was my original fix (see attachment), but Andi Kleen suggested to actually disable BHs at that level; I think as a matter of caution. Olaf -- Olaf Kirch | Things that make Monday morning interesting, #2: okir@suse.de | "We have 8,000 NFS mount points, why do we keep ---------------+ running out of privileged ports?" --YiEDa0DAkWCtVeE4 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=netdev-xmit Index: linux-2.6.9/net/core/dev.c =================================================================== --- linux-2.6.9.orig/net/core/dev.c 2004-10-18 23:54:08.000000000 +0200 +++ linux-2.6.9/net/core/dev.c 2004-11-30 11:46:39.000000000 +0100 @@ -1094,9 +1094,15 @@ void dev_queue_xmit_nit(struct sk_buff * skb2->nh.raw = skb2->data; } + /* The packet handler may expect BHs to be disabled, + * so don't let them down */ + local_bh_disable(); + skb2->h.raw = skb2->nh.raw; skb2->pkt_type = PACKET_OUTGOING; ptype->func(skb2, skb->dev, ptype); + + local_bh_enable(); } } rcu_read_unlock(); --YiEDa0DAkWCtVeE4-- From okir@suse.de Tue Nov 30 03:01:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 03:01:41 -0800 (PST) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUB1aXV021124 for ; Tue, 30 Nov 2004 03:01:37 -0800 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id F0DF61196BAC; Tue, 30 Nov 2004 12:01:10 +0100 (CET) Date: Tue, 30 Nov 2004 12:01:10 +0100 From: Olaf Kirch To: Tommy Christensen Cc: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv Message-ID: <20041130110110.GD16970@suse.de> References: <20041125205503.GA18083@suse.de> <41AC3E2F.2030003@tpack.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41AC3E2F.2030003@tpack.net> User-Agent: Mutt/1.5.6i X-archive-position: 12327 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev On Tue, Nov 30, 2004 at 10:32:31AM +0100, Tommy Christensen wrote: > An interrupt handler shouldn't call dev_queue_xmit() directly. If > this indeed happens, it needs to be fixed. Which handler is this? The call path according to KDB goes like this: application does sendmsg() udp_push_pending_frames ip_push_pending_frames ip_output dev_queue_xmit dev_queue_xmit_nit calls ptype->func(skb2, skb->dev, ptype), where func=packet_rcv packet_rcv (and this runs with BHs enabled) take the &sk->sk_receive_queue spinlock *** timer interrupt net_tx_action take the dev->queue_lock spin lock qdisc_run qdisc_restart dev_queue_xmit_nit as above packet_rcv blocks on the &sk->sk_receive_queue spinlock Before lockless-loopback this never triggered because we did a spin_lock_bh(&dev->xmit_lock) around the call to dev_queue_xmit_nit. Olaf -- Olaf Kirch | Things that make Monday morning interesting, #2: okir@suse.de | "We have 8,000 NFS mount points, why do we keep ---------------+ running out of privileged ports?" From tommy.christensen@tpack.net Tue Nov 30 03:31:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 03:31:50 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAUBViv1022260 for ; Tue, 30 Nov 2004 03:31:45 -0800 Received: (qmail 26153 invoked from network); 30 Nov 2004 11:31:18 -0000 Received: from dhcp-80.cph.tpack.net (HELO ?172.17.159.11?) (192.168.0.80) by 0 with SMTP; 30 Nov 2004 11:31:18 -0000 Message-ID: <41AC5A26.6000400@tpack.net> Date: Tue, 30 Nov 2004 12:31:50 +0100 From: Tommy Christensen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Olaf Kirch CC: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv References: <20041125205503.GA18083@suse.de> <41AC3E2F.2030003@tpack.net> <20041130110110.GD16970@suse.de> In-Reply-To: <20041130110110.GD16970@suse.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12328 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Olaf Kirch wrote: > On Tue, Nov 30, 2004 at 10:32:31AM +0100, Tommy Christensen wrote: > >>An interrupt handler shouldn't call dev_queue_xmit() directly. If >>this indeed happens, it needs to be fixed. Which handler is this? > > > The call path according to KDB goes like this: > > application does sendmsg() > udp_push_pending_frames > ip_push_pending_frames > ip_output > dev_queue_xmit > dev_queue_xmit_nit > calls ptype->func(skb2, skb->dev, ptype), > where func=packet_rcv > packet_rcv (and this runs with BHs enabled) > take the &sk->sk_receive_queue spinlock > *** timer interrupt > net_tx_action > take the dev->queue_lock spin lock > qdisc_run > qdisc_restart > dev_queue_xmit_nit > as above > packet_rcv > blocks on the &sk->sk_receive_queue spinlock > > Before lockless-loopback this never triggered because we did a > spin_lock_bh(&dev->xmit_lock) around the call to dev_queue_xmit_nit. > > Olaf Ahh, back-traces are *so* nice to have. I still don't agree with the conclusion, though. The spin_lock_bh() is changed to a local_bh_disable() and an optional spin_lock(). That should not lead to what you are seeing! I think perhaps your 'BH disabled count' has been corrupted. There's a fix for that in 2.6.10-rc2. -Tommy From trikkenews@trikke.com Tue Nov 30 03:42:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 03:42:28 -0800 (PST) Received: from 192.168.0.2 (c-24-130-84-240.we.client2.attbi.com [24.130.84.240]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAUBgMKF022759 for ; Tue, 30 Nov 2004 03:42:22 -0800 Message-Id: <200411301142.iAUBgMKF022759@oss.sgi.com> From: "Trikke" To: Subject: The evolution of your rolling ways Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit Date: Tue, 30 Nov 2004 03:42:01 -0800 Reply-To: "Trikke" X-archive-position: 12329 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: trikkenews@trikke.com Precedence: bulk X-list: netdev This holiday's newest ride that will change everything. See it first at www.trikke.com/home From okir@suse.de Tue Nov 30 03:46:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 03:46:26 -0800 (PST) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUBkKSi023154 for ; Tue, 30 Nov 2004 03:46:21 -0800 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 6628C11902E0; Tue, 30 Nov 2004 12:45:35 +0100 (CET) Date: Tue, 30 Nov 2004 12:45:35 +0100 From: Olaf Kirch To: Tommy Christensen Cc: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv Message-ID: <20041130114535.GF16970@suse.de> References: <20041125205503.GA18083@suse.de> <41AC3E2F.2030003@tpack.net> <20041130110110.GD16970@suse.de> <41AC5A26.6000400@tpack.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41AC5A26.6000400@tpack.net> User-Agent: Mutt/1.5.6i X-archive-position: 12330 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev On Tue, Nov 30, 2004 at 12:31:50PM +0100, Tommy Christensen wrote: > I still don't agree with the conclusion, though. The spin_lock_bh() > is changed to a local_bh_disable() and an optional spin_lock(). > That should not lead to what you are seeing! Well, the code in 2.6.9 has #define HARD_TX_LOCK(dev, cpu) { \ if ((dev->features & NETIF_F_LLTX) == 0) { \ spin_lock(&dev->xmit_lock); \ dev->xmit_lock_owner = cpu; \ } \ } i.e. there's no local_bh_disable at all - adding the local_bh_disable was the whole point of my patch. Or did you refer to a different spinlock? Olaf -- Olaf Kirch | Things that make Monday morning interesting, #2: okir@suse.de | "We have 8,000 NFS mount points, why do we keep ---------------+ running out of privileged ports?" From tommy.christensen@tpack.net Tue Nov 30 03:56:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 03:56:31 -0800 (PST) Received: from mail.tpack.net (ip18.tpack.net [213.173.228.18]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iAUBuOYW023581 for ; Tue, 30 Nov 2004 03:56:27 -0800 Received: (qmail 30503 invoked from network); 30 Nov 2004 11:55:58 -0000 Received: from dhcp-80.cph.tpack.net (HELO ?172.17.159.11?) (192.168.0.80) by 0 with SMTP; 30 Nov 2004 11:55:58 -0000 Message-ID: <41AC5FEE.8020707@tpack.net> Date: Tue, 30 Nov 2004 12:56:30 +0100 From: Tommy Christensen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Olaf Kirch CC: netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv References: <20041125205503.GA18083@suse.de> <41AC3E2F.2030003@tpack.net> <20041130110110.GD16970@suse.de> <41AC5A26.6000400@tpack.net> <20041130114535.GF16970@suse.de> In-Reply-To: <20041130114535.GF16970@suse.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12331 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tommy.christensen@tpack.net Precedence: bulk X-list: netdev Olaf Kirch wrote: > On Tue, Nov 30, 2004 at 12:31:50PM +0100, Tommy Christensen wrote: > >>I still don't agree with the conclusion, though. The spin_lock_bh() >>is changed to a local_bh_disable() and an optional spin_lock(). >>That should not lead to what you are seeing! > > > Well, the code in 2.6.9 has > > #define HARD_TX_LOCK(dev, cpu) { \ > if ((dev->features & NETIF_F_LLTX) == 0) { \ > spin_lock(&dev->xmit_lock); \ > dev->xmit_lock_owner = cpu; \ > } \ > } > > i.e. there's no local_bh_disable at all - adding the local_bh_disable > was the whole point of my patch. Or did you refer to a different spinlock? The local_bh_disable() is called earlier in dev_queue_xmit(), and is held across the whole HARD_TX_LOCK/dev_queue_xmit_nit/ hard_start_xmit/HARD_TX_UNLOCK sequence. -Tommy From hadi@cyberus.ca Tue Nov 30 05:32:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 05:32:18 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUDWCCH030969 for ; Tue, 30 Nov 2004 05:32:12 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CZ86e-0004gG-9f for netdev@oss.sgi.com; Tue, 30 Nov 2004 08:31:48 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CZ86a-0004gQ-NF; Tue, 30 Nov 2004 08:31:44 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: Robert Olsson Cc: P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <16811.8052.678955.795327@robur.slu.se> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101821501.1043.43.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 30 Nov 2004 08:31:41 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12332 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-11-29 at 08:09, Robert Olsson wrote: > jamal writes: > > > Have to read the paper - When Robert was last visiting here; we did some > > tests and packet recycling is not very valuable as far as SMP is > > concerned (given that packets can be alloced on one CPU and freed on > > another). There a clear win on single CPU machines. > > > Correct yes at you lab about 2 1/2 years ago. How time flies when you are having fun ;-> > I see those experiments in a > different light today as we never got any packet budget contribution > from SMP with shared mem arch whatsoever. Spent a week w. Alexey in the lab > to understand whats going on. Two flows with total affinity (for each CPU) > even removed all locks and part of the IP stack. We were still confused... > > When Opteron/NUMA gave good contribution in those setups. We start thinking > it must be latency and memory controllers that makes the difference. As w. > each CPU has it's own memory and memory controller in Opteron case. > > So from that aspect we expecting the impossible from recycling patch > maybe it will do better on boxes w. local memory. > Interesting thought. Not using a lot of my brain cells to compute i would say that it would get worse. But i suppose the real reason this gets nasty on x86 style SMP is because cache misses are more expensive there, maybe? > But I think we should give it up in current form skb recycling. If extend > it to deal cache bouncing etc. We end up having something like slab in > every driver. slab has improved is not so dominant in profiles now. > nod. > Also from what I understand new HW and MSI can help in the case where > pass objects between CPU. Did I dream or did someone tell me that S2IO > could have several TX ring that could via MSI be routed to proper cpu? I am wondering if the per CPU tx/rx irqs are valuable at all. They sound like more hell to maintain. > slab packet-objects have been discussed. It would do some contribution > but is the complexity worth it? May not be worth it. > > Also I think it could possible to do more lightweight variant of skb > recycling in case we need to recycle PCI-mapping etc. > I think its valuable to have it for people with UP; its not worth the complexity for SMP IMO. cheers, jamal From buytenh@wantstofly.org Tue Nov 30 05:46:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 05:46:26 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUDkLRF031630 for ; Tue, 30 Nov 2004 05:46:22 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id C2DF52B0ED; Tue, 30 Nov 2004 14:46:00 +0100 (MET) Date: Tue, 30 Nov 2004 14:46:00 +0100 From: Lennert Buytenhek To: jamal Cc: Robert Olsson , P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041130134600.GA31515@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> <1101821501.1043.43.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101821501.1043.43.camel@jzny.localdomain> User-Agent: Mutt/1.4.1i X-archive-position: 12333 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Tue, Nov 30, 2004 at 08:31:41AM -0500, jamal wrote: > > Also from what I understand new HW and MSI can help in the case where > > pass objects between CPU. Did I dream or did someone tell me that S2IO > > could have several TX ring that could via MSI be routed to proper cpu? > > I am wondering if the per CPU tx/rx irqs are valuable at all. They sound > like more hell to maintain. On the TX path you'd have qdiscs to deal with as well, no? --L From hadi@cyberus.ca Tue Nov 30 05:47:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 05:47:35 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUDlTCk031840 for ; Tue, 30 Nov 2004 05:47:30 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CZ8LL-0001Jr-Vx for netdev@oss.sgi.com; Tue, 30 Nov 2004 08:46:59 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CZ8KV-00064j-E5; Tue, 30 Nov 2004 08:46:07 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: mellia@prezzemolo.polito.it Cc: P@draigBrady.com, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <1101738118.14930.142.camel@verza.polito.it> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <1101483081.24742.174.camel@mellia.lipar.polito.it> <1101498963.1076.39.camel@jzny.localdomain> <1101738118.14930.142.camel@verza.polito.it> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101822364.1044.60.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 30 Nov 2004 08:46:04 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12334 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-11-29 at 09:21, Marco Mellia wrote: > On Fri, 2004-11-26 at 20:56, jamal wrote: > > On Fri, 2004-11-26 at 10:31, Marco Mellia wrote: > > > If you don't trust us, please, ignore this email. > > > Sorry. > > > > Dont take it the wrong way please - nobody has been able to produce the > > results you have. So thats why you may be getting that comment. > > The fact you have been able to do this is a good thing. > > No problem from this side. I also forgot a couple of 8-! I guess... > > [...] > > > prefetching as in the use of prefetch()? > > What were you prefetching if you end up dropping packet? > > > I read your paper on the weekend - theres one thing which i dont think has been written on before on NAPI that you covered unfortunetly with no melodrama ;-> This is the min-max fairness issue. If you actually mix and match different speeds then it becomes a really interesting problem. Example try congesting a 100Mbps with 2x1Gbps. What quotas to use etc. Could this be done cleverly at runtime with dynamic adjustments etc. Next time you want you want to slave students to do some work talk to us - I got plenty of things you could try out and keep them busy forever;-> > Sorry I used the wrong terms there. > What we discovered, is that the CPU caching mechanisms as a HUGE impact. > And that you have very little control on it. Prefetching may help, but > it is difficult to tredict its impacts... Prefetching is hard. The only evidence i have seen of actually what "appears" to be working prefetching is some code from David Morsberger at HP. Other architectures are known to be more friendly - my eperiences with MIPs are far more pleasant. BTW, thats another topic to get those students to investigate ;-> > Indeed, if you access to the packet struct, the CPU has to fetch data > from the main memory, which stored the packet transfered using DMA from > the NIC. The penalty in the memory access is huge, and you have little > control on it. > > In our experiments, we modified the kernel to drop packets just after > receiving them. skb are just deallocated (using standerd kernel > routines, i.e., no recycling is used). Logically, that happen when the > netif_rx() is called. > > Now, we have three cases > 1) just mofify the netif_rx() to drop packets. > 2) as in one, plus remove the protocol check in the driver > (i.e., comment the line > skb->protocol = eth_type_trans(skb, netdev); > ) to avoid to access the real packet data. > 3) as in 2, but dealloc is performed at the driver level, instead of > calling the netif_rx() > > In the first case, we can receive about 1.1Mpps (~80% of packets) Possible. I was able to receive 900Kpps or so in my experiments with gact drop which is slightly above this with a 2.4 Ghz machine with IRQ affinity. > In the second case, we can receive 100% of packets, as we removed the > penalty of looking at the packet headers to discover its protocol type. > This is the one people found hard to believe. I will go and retest this. It is possible. > In the third case, we can NOT receive 100% of packets! > The only difference is that we actually _REMOVED_ a funcion call. This > reduces the overhead, and the compiler/cpu/whatever can not optimize the > data path to access to the skb which must be freed. It doesnt seem like you were runing NAPI if you depended on calling netif_rx In that case, #3 would be freeing in hard IRQ context while #2 is softIRQ. > Our guess is that by freeing up the skb in the netif_rx() function > actually allows the compiler/cpu to prefetch the skb itself, and > therefore keep the pipeline working... > > My guess is that if you change compiler, cpu, memory subsystem, you may > get very counterintuitive results... Refer to my comment above. Repeat tests with NAPI and see if you get same results. cheers, jamal From hadi@cyberus.ca Tue Nov 30 06:26:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 06:26:31 -0800 (PST) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUEQQIf000914 for ; Tue, 30 Nov 2004 06:26:26 -0800 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.30) id 1CZ8x4-0000RW-RR for netdev@oss.sgi.com; Tue, 30 Nov 2004 09:25:58 -0500 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.9]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1CZ8x3-0004DG-B2; Tue, 30 Nov 2004 09:25:57 -0500 Subject: Re: [E1000-devel] Transmission limit From: jamal Reply-To: hadi@cyberus.ca To: Lennert Buytenhek Cc: Robert Olsson , P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041130134600.GA31515@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> <1101821501.1043.43.camel@jzny.localdomain> <20041130134600.GA31515@xi.wantstofly.org> Content-Type: text/plain Organization: jamalopolous Message-Id: <1101824754.1044.126.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 30 Nov 2004 09:25:54 -0500 Content-Transfer-Encoding: 7bit X-archive-position: 12335 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Tue, 2004-11-30 at 08:46, Lennert Buytenhek wrote: > On Tue, Nov 30, 2004 at 08:31:41AM -0500, jamal wrote: > > > > Also from what I understand new HW and MSI can help in the case where > > > pass objects between CPU. Did I dream or did someone tell me that S2IO > > > could have several TX ring that could via MSI be routed to proper cpu? > > > > I am wondering if the per CPU tx/rx irqs are valuable at all. They sound > > like more hell to maintain. > > On the TX path you'd have qdiscs to deal with as well, no? I think management of it would be non-trivial in SMP. Youd have to start playing stupid loadbalancing tricks which would reduce the value of existence of tx irqs to begin with. cheers, jamal From mitch@sfgoth.com Tue Nov 30 06:52:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 06:52:17 -0800 (PST) Received: from gaz.sfgoth.com (gaz.sfgoth.com [69.36.241.230]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUEqA2r001686 for ; Tue, 30 Nov 2004 06:52:10 -0800 Received: from gaz.sfgoth.com (localhost.sfgoth.com [127.0.0.1]) by gaz.sfgoth.com (8.12.10/8.12.10) with ESMTP id iAUEsii0067940 for ; Tue, 30 Nov 2004 06:54:44 -0800 (PST) (envelope-from mitch@gaz.sfgoth.com) Received: (from mitch@localhost) by gaz.sfgoth.com (8.12.10/8.12.6/Submit) id iAUEsihK067939 for netdev@oss.sgi.com; Tue, 30 Nov 2004 06:54:44 -0800 (PST) (envelope-from mitch) Date: Tue, 30 Nov 2004 06:54:44 -0800 From: Mitchell Blank Jr To: netdev@oss.sgi.com Subject: [PATCH] fix missing security_*() check in net/compat.c Message-ID: <20041130145444.GF63669@gaz.sfgoth.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-1.2.2 (gaz.sfgoth.com [127.0.0.1]); Tue, 30 Nov 2004 06:54:44 -0800 (PST) X-archive-position: 12336 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mitch@sfgoth.com Precedence: bulk X-list: netdev While looking at the SCM passing code in net/core/scm.c I noticed that there's a 32-bit compat implementation of scm_detach_fds()'s called scm_detach_fds_compat() living in net/compat.c. While these two functions are mostly the same the latter does not include the call to the security_file_receive() hook which is almost certainly a bug. My sparc64 test box isn't set up currently so this is not tested. Someone running a 64-bit kernel with CONFIG_COMPAT should verify that this at least compiles. Signed-off-by: Mitchell Blank Jr -Mitch --- linux-2.6.10-rc2-bk9-VIRGIN/net/compat.c 2004-10-18 14:54:37.000000000 -0700 +++ linux-2.6.10-rc2-bk9/net/compat.c 2004-11-30 06:40:52.156434868 -0800 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -264,6 +265,9 @@ for (i = 0, cmfptr = (int __user *) CMSG_COMPAT_DATA(cm); i < fdmax; i++, cmfptr++) { int new_fd; + err = security_file_receive(fp[i]); + if (err) + break; err = get_unused_fd(); if (err < 0) break; From jheffner@psc.edu Tue Nov 30 07:45:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 07:45:21 -0800 (PST) Received: from mailer2.psc.edu (mailer2.psc.edu [128.182.66.106]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUFjGe0002965 for ; Tue, 30 Nov 2004 07:45:16 -0800 Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by mailer2.psc.edu (8.12.10/8.12.5) with ESMTP id iAUFihDV027494 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 30 Nov 2004 10:44:44 -0500 (EST) Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by dexter.psc.edu (8.12.11/8.12.10) with ESMTP id iAUFiheq017208; Tue, 30 Nov 2004 10:44:43 -0500 Date: Tue, 30 Nov 2004 10:44:43 -0500 (EST) From: John Heffner To: kernel cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: 2.6.9 tcp problems In-Reply-To: <41AB6476.8060405@nea-fast.com> Message-ID: References: <41AB6476.8060405@nea-fast.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: clamd / ClamAV version 0.75, clamav-milter version 0.75 on mailer2.psc.edu X-Virus-Status: Clean X-archive-position: 12337 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jheffner@psc.edu Precedence: bulk X-list: netdev On Mon, 29 Nov 2004, kernel wrote: > I've run into a problem with 2.6.(8.1,9) after installing a secondary > firewall. When I try to pull data through the original firewall (mail, > http, ssh), it stops after approx. 260k. Running ethereal tells me "A > segment before the frame was lost" followed by a bunch of "This is a > TCP duplicate ack" when using ssh. All 2.4.x machines and windows > clients work fine. I built 2.4.28 and it works fine from my machine. I > also fiddled with tcp_ecn and that didn't fix it either. I don't have > any problems communicating to "local" machines. I've attached the > tcpdump output from an scp attempt. NIC is a 3Com Corporation 3c905B. Try `echo 0 > /proc/sys/net/ipv4/tcp_window_scaling'. If this makes it work, it's almost certainly a buggy firewall. Also, tcpdumps are far more useful if they are binary (tcpdump -w) and capture the beginning of the connection. -John From tgraf@suug.ch Tue Nov 30 07:56:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 07:56:44 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUFuYZW003597 for ; Tue, 30 Nov 2004 07:56:35 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id E3FB9F; Tue, 30 Nov 2004 16:55:49 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 4FFED1C0EA; Tue, 30 Nov 2004 16:56:30 +0100 (CET) Date: Tue, 30 Nov 2004 16:56:30 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] gnet_stats: kernel-api doc for gnet stats/estimator Message-ID: <20041130155630.GH31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 12338 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev kernel-api documentation for gnet stats/estimator Signed-off-by: Thomas Graf diff -Nru linux-2.6.10-rc2-bk13.orig/Documentation/DocBook/kernel-api.tmpl linux-2.6.10-rc2-bk13/Documentation/DocBook/kernel-api.tmpl --- linux-2.6.10-rc2-bk13.orig/Documentation/DocBook/kernel-api.tmpl 2004-11-30 14:01:13.000000000 +0100 +++ linux-2.6.10-rc2-bk13/Documentation/DocBook/kernel-api.tmpl 2004-11-30 15:42:19.000000000 +0100 @@ -133,6 +133,11 @@ Socket Filter !Enet/core/filter.c + Generic Network Statistics +!Iinclude/linux/gen_stats.h +!Enet/core/gen_stats.c +!Enet/core/gen_estimator.c + diff -Nru linux-2.6.10-rc2-bk13.orig/include/linux/gen_stats.h linux-2.6.10-rc2-bk13/include/linux/gen_stats.h --- linux-2.6.10-rc2-bk13.orig/include/linux/gen_stats.h 2004-11-30 14:01:11.000000000 +0100 +++ linux-2.6.10-rc2-bk13/include/linux/gen_stats.h 2004-11-30 14:41:46.000000000 +0100 @@ -14,6 +14,7 @@ #define TCA_STATS_MAX (__TCA_STATS_MAX - 1) /** + * struct gnet_stats_basic - byte/packet throughput statistics * @bytes: number of seen bytes * @packets: number of seen packets */ @@ -24,6 +25,7 @@ }; /** + * struct gnet_stats_rate_est - rate estimator * @bps: current byte rate * @pps: current packet rate */ @@ -34,10 +36,12 @@ }; /** + * struct gnet_stats_queue - queuing statistics * @qlen: queue length * @backlog: backlog size of queue * @drops: number of dropped packets * @requeues: number of requeues + * @overlimits: number of enqueues over the limit */ struct gnet_stats_queue { @@ -49,6 +53,7 @@ }; /** + * struct gnet_estimator - rate estimator configuration * @interval: sampling period * @ewma_log: the log of measurement window weight */ diff -Nru linux-2.6.10-rc2-bk13.orig/net/core/gen_estimator.c linux-2.6.10-rc2-bk13/net/core/gen_estimator.c --- linux-2.6.10-rc2-bk13.orig/net/core/gen_estimator.c 2004-11-30 14:01:12.000000000 +0100 +++ linux-2.6.10-rc2-bk13/net/core/gen_estimator.c 2004-11-30 15:54:24.000000000 +0100 @@ -132,6 +132,21 @@ read_unlock(&est_lock); } +/** + * gen_new_estimator - create a new rate estimator + * @bstats: basic statistics + * @rate_est: rate estimator statistics + * @stats_lock: statistics lock + * @opt: rate estimator configuration TLV + * + * Creates a new rate estimator with &bstats as source and &rate_est + * as destination. A new timer with the interval specified in the + * configuration TLV is created. Upon each interval, the latest statistics + * will be read from &bstats and the estimated rate will be stored in + * &rate_est with the statistics lock grabed during this period. + * + * Returns 0 on success or a negative error code. + */ int gen_new_estimator(struct gnet_stats_basic *bstats, struct gnet_stats_rate_est *rate_est, spinlock_t *stats_lock, struct rtattr *opt) { @@ -173,6 +188,14 @@ return 0; } +/** + * gen_kill_estimator - remove a rate estimator + * @bstats: basic statistics + * @rate_est: rate estimator statistics + * + * Removes the rate estimator specified by &bstats and &rate_est + * and deletes the timer. + */ void gen_kill_estimator(struct gnet_stats_basic *bstats, struct gnet_stats_rate_est *rate_est) { @@ -200,6 +223,18 @@ } } +/** + * gen_replace_estimator - replace rate estimator configruation + * @bstats: basic statistics + * @rate_est: rate estimator statistics + * @stats_lock: statistics lock + * @opt: rate estimator configuration TLV + * + * Replaces the configuration of a rate estimator by calling + * gen_kill_estimator() and gen_new_estimator(). + * + * Returns 0 on success or a negative error code. + */ int gen_replace_estimator(struct gnet_stats_basic *bstats, struct gnet_stats_rate_est *rate_est, spinlock_t *stats_lock, diff -Nru linux-2.6.10-rc2-bk13.orig/net/core/gen_stats.c linux-2.6.10-rc2-bk13/net/core/gen_stats.c --- linux-2.6.10-rc2-bk13.orig/net/core/gen_stats.c 2004-11-30 14:01:12.000000000 +0100 +++ linux-2.6.10-rc2-bk13/net/core/gen_stats.c 2004-11-30 15:34:59.000000000 +0100 @@ -34,6 +34,24 @@ return -1; } +/** + * gnet_stats_start_copy_compat - start dumping procedure in compatibility mode + * @skb: socket buffer to put statistics TLVs into + * @type: TLV type for top level statistic TLV + * @tc_stats_type: TLV type for backward compatibility struct tc_stats TLV + * @xstats_type: TLV type for backward compatibility xstats TLV + * @lock: statistics lock + * @d: dumping handle + * + * Initializes the dumping handle, grabs the statistic lock and appends + * an empty TLV header to the socket buffer for use a container for all + * other statistic TLVS. + * + * The dumping handle is marked to be in backward compatibility mode telling + * all gnet_stats_copy_XXX() functions to fill a local copy of struct tc_stats. + * + * Returns 0 on success or -1 if the room in the socket buffer was not sufficient. + */ int gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type, int xstats_type, spinlock_t *lock, struct gnet_dump *d) @@ -52,6 +70,19 @@ return gnet_stats_copy(d, type, NULL, 0); } +/** + * gnet_stats_start_copy_compat - start dumping procedure in compatibility mode + * @skb: socket buffer to put statistics TLVs into + * @type: TLV type for top level statistic TLV + * @lock: statistics lock + * @d: dumping handle + * + * Initializes the dumping handle, grabs the statistic lock and appends + * an empty TLV header to the socket buffer for use a container for all + * other statistic TLVS. + * + * Returns 0 on success or -1 if the room in the socket buffer was not sufficient. + */ int gnet_stats_start_copy(struct sk_buff *skb, int type, spinlock_t *lock, struct gnet_dump *d) @@ -59,7 +90,17 @@ return gnet_stats_start_copy_compat(skb, type, 0, 0, lock, d); } - +/** + * gnet_stats_copy_basic - copy basic statistics into statistic TLV + * @d: dumping handle + * @b: basic statistics + * + * Appends the basic statistics to the top level TLV created by + * gnet_stats_start_copy(). + * + * Returns 0 on success or -1 with the statistic lock released + * if the room in the socket buffer was not sufficient. + */ int gnet_stats_copy_basic(struct gnet_dump *d, struct gnet_stats_basic *b) { @@ -71,6 +112,17 @@ return gnet_stats_copy(d, TCA_STATS_BASIC, b, sizeof(*b)); } +/** + * gnet_stats_copy_rate_est - copy rate estimator statistics into statistics TLV + * @d: dumping handle + * @r: rate estimator statistics + * + * Appends the rate estimator statistics to the top level TLV created by + * gnet_stats_start_copy(). + * + * Returns 0 on success or -1 with the statistic lock released + * if the room in the socket buffer was not sufficient. + */ int gnet_stats_copy_rate_est(struct gnet_dump *d, struct gnet_stats_rate_est *r) { @@ -82,6 +134,17 @@ return gnet_stats_copy(d, TCA_STATS_RATE_EST, r, sizeof(*r)); } +/** + * gnet_stats_copy_queue - copy queue statistics into statistics TLV + * @d: dumping handle + * @q: queue statistics + * + * Appends the queue statistics to the top level TLV created by + * gnet_stats_start_copy(). + * + * Returns 0 on success or -1 with the statistic lock released + * if the room in the socket buffer was not sufficient. + */ int gnet_stats_copy_queue(struct gnet_dump *d, struct gnet_stats_queue *q) { @@ -95,6 +158,19 @@ return gnet_stats_copy(d, TCA_STATS_QUEUE, q, sizeof(*q)); } +/** + * gnet_stats_copy_app - copy application specific statistics into statistics TLV + * @d: dumping handle + * @st: application specific statistics data + * @len: length of data + * + * Appends the application sepecific statistics to the top level TLV created by + * gnet_stats_start_copy() and remembers the data for XSTATS if the dumping + * handle is in backward compatibility mode. + * + * Returns 0 on success or -1 with the statistic lock released + * if the room in the socket buffer was not sufficient. + */ int gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) { @@ -103,6 +179,18 @@ return gnet_stats_copy(d, TCA_STATS_APP, st, len); } +/** + * gnet_stats_finish_copy - finish dumping procedure + * @d: dumping handle + * + * Corrects the length of the top level TLV to include all TLVs added + * by gnet_stats_copy_XXX() calls. Adds the backward compatibility TLVs + * if gnet_stats_start_copy_compat() was used and releases the statistics + * lock. + * + * Returns 0 on success or -1 with the statistic lock released + * if the room in the socket buffer was not sufficient. + */ int gnet_stats_finish_copy(struct gnet_dump *d) { From jmorris@redhat.com Tue Nov 30 08:18:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 08:18:31 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUGIN8J004456 for ; Tue, 30 Nov 2004 08:18:24 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iAUGHv8S026774; Tue, 30 Nov 2004 11:17:57 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.76.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iAUGHgr22764; Tue, 30 Nov 2004 11:17:42 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.80.63]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id iAUGHeVY017845; Tue, 30 Nov 2004 11:17:40 -0500 Date: Tue, 30 Nov 2004 11:17:41 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Mitchell Blank Jr cc: netdev@oss.sgi.com, Chris Wright , Stephen Smalley , "David S. Miller" Subject: Re: [PATCH] fix missing security_*() check in net/compat.c In-Reply-To: <20041130145444.GF63669@gaz.sfgoth.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 12339 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Tue, 30 Nov 2004, Mitchell Blank Jr wrote: > While looking at the SCM passing code in net/core/scm.c I noticed that there's > a 32-bit compat implementation of scm_detach_fds()'s called > scm_detach_fds_compat() living in net/compat.c. While these two functions > are mostly the same the latter does not include the call to the > security_file_receive() hook which is almost certainly a bug. > > My sparc64 test box isn't set up currently so this is not tested. Someone > running a 64-bit kernel with CONFIG_COMPAT should verify that this at > least compiles. > > Signed-off-by: Mitchell Blank Jr Looks correct to me. Signed-off-by: James Morris -- James Morris From chrisw@osdl.org Tue Nov 30 09:07:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 09:07:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUH735F022671 for ; Tue, 30 Nov 2004 09:07:04 -0800 Received: from build.pdx.osdl.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id iAUH6Y929954; Tue, 30 Nov 2004 09:06:34 -0800 Received: (from chrisw@localhost) by build.pdx.osdl.net (8.11.6/8.11.6) id iAUH6YG20369; Tue, 30 Nov 2004 09:06:34 -0800 Date: Tue, 30 Nov 2004 09:06:34 -0800 From: Chris Wright To: James Morris Cc: Mitchell Blank Jr , netdev@oss.sgi.com, Chris Wright , Stephen Smalley , "David S. Miller" Subject: Re: [PATCH] fix missing security_*() check in net/compat.c Message-ID: <20041130090634.Y2357@build.pdx.osdl.net> References: <20041130145444.GF63669@gaz.sfgoth.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jmorris@redhat.com on Tue, Nov 30, 2004 at 11:17:41AM -0500 X-archive-position: 12340 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chrisw@osdl.org Precedence: bulk X-list: netdev * James Morris (jmorris@redhat.com) wrote: > On Tue, 30 Nov 2004, Mitchell Blank Jr wrote: > > > While looking at the SCM passing code in net/core/scm.c I noticed that there's > > a 32-bit compat implementation of scm_detach_fds()'s called > > scm_detach_fds_compat() living in net/compat.c. While these two functions > > are mostly the same the latter does not include the call to the > > security_file_receive() hook which is almost certainly a bug. > > > > My sparc64 test box isn't set up currently so this is not tested. Someone > > running a 64-bit kernel with CONFIG_COMPAT should verify that this at > > least compiles. > > > > Signed-off-by: Mitchell Blank Jr > > Looks correct to me. > > Signed-off-by: James Morris Yup, looks fine. thanks, -chris -- Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net From greearb@candelatech.com Tue Nov 30 09:41:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 09:41:50 -0800 (PST) Received: from www.lanforge.com (ns1.lanforge.com [66.165.47.210]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUHfiIA023556 for ; Tue, 30 Nov 2004 09:41:45 -0800 Received: from [4.33.45.22] (evrtwa1-ar2-4-33-045-022.evrtwa1.dsl-verizon.net [4.33.45.22]) (authenticated bits=0) by www.lanforge.com (8.12.8/8.12.8) with ESMTP id iAUHqpLH001834; Tue, 30 Nov 2004 09:52:52 -0800 Message-ID: <41ACB0C3.5020408@candelatech.com> Date: Tue, 30 Nov 2004 09:41:23 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041020 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Lennert Buytenhek CC: netdev@oss.sgi.com Subject: Re: via-rhine unable to send back-to-back packets? References: <20041129222700.GA22918@xi.wantstofly.org> <20041129172540.6b959858.davem@davemloft.net> <20041130064823.GA27872@xi.wantstofly.org> In-Reply-To: <20041130064823.GA27872@xi.wantstofly.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 12341 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Lennert Buytenhek wrote: > Yeah, preamble (8 bytes), CRC (4 bytes), inter-packet gap (12 bytes). > > Perhaps the via-rhine simply can't send out packets back-to-back and > needs 14 byte times of inter-packet gap. I couldn't find any stray +2 > in the driver anywhere but I'm just checking. Couldn't you just sniff the resulting traffic to see if it is too big? Ben -- Ben Greear Candela Technologies Inc http://www.candelatech.com From sfeldma@pobox.com Tue Nov 30 12:21:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 12:21:57 -0800 (PST) Received: from orb.pobox.com (orb.pobox.com [207.8.226.5]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUKLpAi006413 for ; Tue, 30 Nov 2004 12:21:52 -0800 Received: from orb (localhost [127.0.0.1]) by orb.pobox.com (Postfix) with ESMTP id 581122FC000; Tue, 30 Nov 2004 15:21:30 -0500 (EST) Received: from [192.168.0.19] (wbar2.sea1-4-5-062-153.sea1.dsl-verizon.net [4.5.62.153]) by orb.sasl.smtp.pobox.com (Postfix) with ESMTP id C50B92FBFDD; Tue, 30 Nov 2004 15:21:28 -0500 (EST) Subject: [PATCH] pktgen: clear error count before each run From: Scott Feldman Reply-To: sfeldma@pobox.com To: davem@redhat.com Cc: netdev@oss.sgi.com Content-Type: text/plain Message-Id: <1101846256.4663.31.camel@sfeldma-mobl.dsl-verizon.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Tue, 30 Nov 2004 12:24:16 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 12342 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sfeldma@pobox.com Precedence: bulk X-list: netdev Signed-off-by: Scott Feldman --- linux-2.6.10-rc2/net/core/pktgen.c.orig 2004-11-30 12:16:35.914025424 -0800 +++ linux-2.6.10-rc2/net/core/pktgen.c 2004-11-30 12:18:36.588680088 -0800 @@ -647,6 +647,7 @@ info->do_run_run = 1; /* Cranke yeself! */ info->idle_acc = 0; info->sofar = 0; + info->errors = 0; lcount = info->count; From davem@davemloft.net Tue Nov 30 12:28:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 12:28:18 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUKSBgm006904 for ; Tue, 30 Nov 2004 12:28:12 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZEYZ-0004jK-00; Tue, 30 Nov 2004 12:25:03 -0800 Date: Tue, 30 Nov 2004 12:25:03 -0800 From: "David S. Miller" To: Lennert Buytenhek Cc: rl@hellgate.ch, netdev@oss.sgi.com Subject: Re: via-rhine unable to send back-to-back packets? Message-Id: <20041130122503.0adac947.davem@davemloft.net> In-Reply-To: <20041130064823.GA27872@xi.wantstofly.org> References: <20041129222700.GA22918@xi.wantstofly.org> <20041129172540.6b959858.davem@davemloft.net> <20041130064823.GA27872@xi.wantstofly.org> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12343 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 07:48:23 +0100 Lennert Buytenhek wrote: > Yeah, preamble (8 bytes), CRC (4 bytes), inter-packet gap (12 bytes). Ok. > Perhaps the via-rhine simply can't send out packets back-to-back and > needs 14 byte times of inter-packet gap. I couldn't find any stray +2 > in the driver anywhere but I'm just checking. Or the via-rhine driver is not programming one of the registers proper to get optimal spacing. As with most Donald Becker drivers, many of the register layouts are not documented in the sources so it's not possible to just scan the driver looking for potential problems like this. For example, maybe the TxConfig register has an "IPG" field but we'll never know by reading anything in the driver source. From jdmason@us.ibm.com Tue Nov 30 12:34:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 12:35:07 -0800 (PST) Received: from over.ny.us.ibm.com (over.ny.us.ibm.com [32.97.182.111]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUKX72I007302 for ; Tue, 30 Nov 2004 12:33:23 -0800 Received: from e31.co.us.ibm.com (e31.esmtp.ibm.com [9.14.4.129]) by pokfb.esmtp.ibm.com (8.12.10/8.12.9) with ESMTP id iAUJqjtE117666 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Tue, 30 Nov 2004 14:52:46 -0500 Received: from westrelay01.boulder.ibm.com (westrelay01.boulder.ibm.com [9.17.195.10]) by e31.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id iAUJqIjd345324 for ; Tue, 30 Nov 2004 14:52:18 -0500 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by westrelay01.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id iAUJqISw142458 for ; Tue, 30 Nov 2004 12:52:18 -0700 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAUJqHLZ025600 for ; Tue, 30 Nov 2004 12:52:17 -0700 Received: from dreadnought.austin.ibm.com (dreadnought.austin.ibm.com [9.41.94.123]) by d03av01.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id iAUJqHdR025548; Tue, 30 Nov 2004 12:52:17 -0700 From: Jon Mason Organization: IBM To: Richard Dawe Subject: Re: Acer Aspire 1524WLMi and RealTek 8169 - very slow Date: Tue, 30 Nov 2004 13:52:15 -0600 User-Agent: KMail/1.7 Cc: Francois Romieu , netdev@oss.sgi.com References: <41A09541.5040405@phekda.gotadsl.co.uk> <20041122213008.GA9618@electric-eye.fr.zoreil.com> <41A4E2C9.4070502@phekda.gotadsl.co.uk> In-Reply-To: <41A4E2C9.4070502@phekda.gotadsl.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411301352.15927.jdmason@us.ibm.com> X-archive-position: 12344 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jdmason@us.ibm.com Precedence: bulk X-list: netdev On Wednesday 24 November 2004 01:36 pm, Richard Dawe wrote: > Hello. > > I don't know if it will help, but FreeBSD's re driver source code is here: > > http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/re/if_re.c?only_with_tag= >HEAD > > Have you ever looked at that? It has some interesting comments about the > maximum Jumbo packet length and vendor-specific registers in the 8110. > > Thanks, bye, Rich =] I've experimented with the value of EarlyTxThld, and have been able to get it to work upto a MTU of 8000. I still need to do some more experimentation to find the optimal value (and see if modifying any other registers will help this). -- Jon Mason jdmason@us.ibm.com From davem@davemloft.net Tue Nov 30 13:10:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 13:10:31 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAULAOmY008490 for ; Tue, 30 Nov 2004 13:10:25 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZFDL-0005CB-00; Tue, 30 Nov 2004 13:07:11 -0800 Date: Tue, 30 Nov 2004 13:07:11 -0800 From: "David S. Miller" To: Tommy Christensen Cc: okir@suse.de, netdev@oss.sgi.com Subject: Re: [PATCH] Deadlock in af_packet/packet_rcv Message-Id: <20041130130711.5524a935.davem@davemloft.net> In-Reply-To: <41AC5FEE.8020707@tpack.net> References: <20041125205503.GA18083@suse.de> <41AC3E2F.2030003@tpack.net> <20041130110110.GD16970@suse.de> <41AC5A26.6000400@tpack.net> <20041130114535.GF16970@suse.de> <41AC5FEE.8020707@tpack.net> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12345 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 12:56:30 +0100 Tommy Christensen wrote: > > i.e. there's no local_bh_disable at all - adding the local_bh_disable > > was the whole point of my patch. Or did you refer to a different spinlock? > > The local_bh_disable() is called earlier in dev_queue_xmit(), and > is held across the whole HARD_TX_LOCK/dev_queue_xmit_nit/ > hard_start_xmit/HARD_TX_UNLOCK sequence. He's right. There must be something else happening in your tree Olaf. From davem@davemloft.net Tue Nov 30 13:42:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 13:42:19 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAULgDA6009400 for ; Tue, 30 Nov 2004 13:42:14 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZFiF-0005Il-00; Tue, 30 Nov 2004 13:39:07 -0800 Date: Tue, 30 Nov 2004 13:39:07 -0800 From: "David S. Miller" To: sfeldma@pobox.com Cc: netdev@oss.sgi.com Subject: Re: [PATCH] pktgen: clear error count before each run Message-Id: <20041130133907.539b4e48.davem@davemloft.net> In-Reply-To: <1101846256.4663.31.camel@sfeldma-mobl.dsl-verizon.net> References: <1101846256.4663.31.camel@sfeldma-mobl.dsl-verizon.net> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12346 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 12:24:16 -0800 Scott Feldman wrote: > Signed-off-by: Scott Feldman Applied, thanks Scott. From davem@davemloft.net Tue Nov 30 13:43:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 13:44:04 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAULhwJO009629 for ; Tue, 30 Nov 2004 13:43:58 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZFjx-0005J9-00; Tue, 30 Nov 2004 13:40:53 -0800 Date: Tue, 30 Nov 2004 13:40:53 -0800 From: "David S. Miller" To: Chris Wright Cc: jmorris@redhat.com, mitch@sfgoth.com, netdev@oss.sgi.com, chrisw@osdl.org, sds@epoch.ncsc.mil Subject: Re: [PATCH] fix missing security_*() check in net/compat.c Message-Id: <20041130134053.268d4134.davem@davemloft.net> In-Reply-To: <20041130090634.Y2357@build.pdx.osdl.net> References: <20041130145444.GF63669@gaz.sfgoth.com> <20041130090634.Y2357@build.pdx.osdl.net> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12347 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 09:06:34 -0800 Chris Wright wrote: > * James Morris (jmorris@redhat.com) wrote: > > On Tue, 30 Nov 2004, Mitchell Blank Jr wrote: > > > > > While looking at the SCM passing code in net/core/scm.c I noticed that there's > > > a 32-bit compat implementation of scm_detach_fds()'s called > > > scm_detach_fds_compat() living in net/compat.c. While these two functions > > > are mostly the same the latter does not include the call to the > > > security_file_receive() hook which is almost certainly a bug. > > > > > > My sparc64 test box isn't set up currently so this is not tested. Someone > > > running a 64-bit kernel with CONFIG_COMPAT should verify that this at > > > least compiles. > > > > > > Signed-off-by: Mitchell Blank Jr > > > > Looks correct to me. > > > > Signed-off-by: James Morris > > Yup, looks fine. Applied, thanks everyone. From rl@hellgate.ch Tue Nov 30 14:08:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 14:08:10 -0800 (PST) Received: from mail3.bluewin.ch ([195.186.1.75]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUM82hj010721 for ; Tue, 30 Nov 2004 14:08:03 -0800 Received: from k3.hellgate.ch (81.63.84.29) by mail3.bluewin.ch (Bluewin AG 7.0.030.2) id 41862FF20030D9C9; Tue, 30 Nov 2004 22:06:40 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 8B3FADD58AD; Tue, 30 Nov 2004 23:06:44 +0100 (CET) Date: Tue, 30 Nov 2004 23:06:44 +0100 From: Roger Luethi To: "David S. Miller" Cc: Lennert Buytenhek , netdev@oss.sgi.com Subject: Re: via-rhine unable to send back-to-back packets? Message-ID: <20041130220644.GC29947@k3.hellgate.ch> References: <20041129222700.GA22918@xi.wantstofly.org> <20041129172540.6b959858.davem@davemloft.net> <20041130064823.GA27872@xi.wantstofly.org> <20041130122503.0adac947.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041130122503.0adac947.davem@davemloft.net> X-Operating-System: Linux 2.6.10-rc2-bk11 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 12349 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 12:25:03 -0800, David S. Miller wrote: > Lennert Buytenhek wrote: > > Perhaps the via-rhine simply can't send out packets back-to-back and > > needs 14 byte times of inter-packet gap. I couldn't find any stray +2 > > in the driver anywhere but I'm just checking. > > Or the via-rhine driver is not programming one of the registers > proper to get optimal spacing. > > As with most Donald Becker drivers, many of the register layouts > are not documented in the sources so it's not possible to just > scan the driver looking for potential problems like this. > For example, maybe the TxConfig register has an "IPG" field but > we'll never know by reading anything in the driver source. Presumably Donald Becker had only access to the publicly available documentation at the time which is very incomplete and buggy. What little time my day job leaves for hacking via-rhine is consumed by the WOL issues that have come up with 2.6.9+, but if you have a specific question that can be answered by someone who knows the chip but not necessarily Linux I can try and poke my contacts. Of course, you can always check if VIA's driver has the same issue. If it doesn't, chances are we can borrow the fix. Roger From tgraf@suug.ch Tue Nov 30 14:07:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 14:07:07 -0800 (PST) Received: from b.mx.projectdream.org (eth0-0.arisu.projectdream.org [194.158.4.191]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iAUM6xXn010618 for ; Tue, 30 Nov 2004 14:07:00 -0800 Received: from postel.suug.ch (unknown [195.134.158.23]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by b.mx.projectdream.org (Postfix) with ESMTP id 69CBEF; Tue, 30 Nov 2004 23:06:16 +0100 (CET) Received: by postel.suug.ch (Postfix, from userid 10001) id 244B61C0EA; Tue, 30 Nov 2004 23:06:59 +0100 (CET) Date: Tue, 30 Nov 2004 23:06:59 +0100 From: Thomas Graf To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] rtnetlink: link attribute modification by interface name Message-ID: <20041130220659.GK31969@postel.suug.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 12348 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tgraf@suug.ch Precedence: bulk X-list: netdev Dave, This patch allows modification of link attributes by the interface name, avoids the requirement of translating a name to an ifindex first, and provides better atomicity to userspace. It works by setting the ifindex to a negative number and provide the interface name via the IFLA_IFNAME TLV and let the kernel lookup the device by name instead of ifindex. Changing the interface name will not work using this method because IFLA_IFNAME also transports the new interface name. The patch also fixes a possible source for bugs if IFNAMSIZ is ever changed to a number not aligned to RTA_ALIGNTO. Signed-off-by: Thomas Graf --- linux-2.6.10-rc2-bk13.orig/net/core/rtnetlink.c 2004-11-30 14:01:12.000000000 +0100 +++ linux-2.6.10-rc2-bk13/net/core/rtnetlink.c 2004-11-30 14:23:23.000000000 +0100 @@ -267,7 +267,22 @@ struct net_device *dev; int err, send_addr_notify = 0; - dev = dev_get_by_index(ifm->ifi_index); + if (ifm->ifi_index >= 0) + dev = dev_get_by_index(ifm->ifi_index); + else if (ida[IFLA_IFNAME - 1]) { + char ifname[IFNAMSIZ]; + + if (RTA_PAYLOAD(ida[IFLA_IFNAME - 1]) > RTA_ALIGN(sizeof(ifname))) + return -EINVAL; + + memset(ifname, 0, sizeof(ifname)); + memcpy(ifname, RTA_DATA(ida[IFLA_IFNAME - 1]), + RTA_PAYLOAD(ida[IFLA_IFNAME - 1])); + ifname[IFNAMSIZ - 1] = '\0'; + dev = dev_get_by_name(ifname); + } else + return -EINVAL; + if (!dev) return -ENODEV; @@ -358,10 +373,10 @@ dev->weight = *((u32 *) RTA_DATA(ida[IFLA_WEIGHT - 1])); } - if (ida[IFLA_IFNAME - 1]) { + if (ifm->ifi_index >= 0 && ida[IFLA_IFNAME - 1]) { char ifname[IFNAMSIZ]; - if (ida[IFLA_IFNAME - 1]->rta_len > RTA_LENGTH(sizeof(ifname))) + if (RTA_PAYLOAD(ida[IFLA_IFNAME - 1]) > RTA_ALIGN(sizeof(ifname))) goto out; memset(ifname, 0, sizeof(ifname)); From buytenh@wantstofly.org Tue Nov 30 16:11:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 16:11:34 -0800 (PST) Received: from xi.wantstofly.org (alephnull.demon.nl [212.238.201.82]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB10BTLa015550 for ; Tue, 30 Nov 2004 16:11:30 -0800 Received: by xi.wantstofly.org (Postfix, from userid 500) id C162D2B0ED; Wed, 1 Dec 2004 01:11:07 +0100 (MET) Date: Wed, 1 Dec 2004 01:11:07 +0100 From: Lennert Buytenhek To: jamal Cc: Robert Olsson , P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com Subject: Re: [E1000-devel] Transmission limit Message-ID: <20041201001107.GE4203@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> <1101821501.1043.43.camel@jzny.localdomain> <20041130134600.GA31515@xi.wantstofly.org> <1101824754.1044.126.camel@jzny.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1101824754.1044.126.camel@jzny.localdomain> User-Agent: Mutt/1.4.1i X-archive-position: 12350 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: buytenh@wantstofly.org Precedence: bulk X-list: netdev On Tue, Nov 30, 2004 at 09:25:54AM -0500, jamal wrote: > > > > Also from what I understand new HW and MSI can help in the case where > > > > pass objects between CPU. Did I dream or did someone tell me that S2IO > > > > could have several TX ring that could via MSI be routed to proper cpu? > > > > > > I am wondering if the per CPU tx/rx irqs are valuable at all. They sound > > > like more hell to maintain. > > > > On the TX path you'd have qdiscs to deal with as well, no? > > I think management of it would be non-trivial in SMP. Youd have to start > playing stupid loadbalancing tricks which would reduce the value of > existence of tx irqs to begin with. You mean the management of qdiscs would be non-trivial? Probably the idea of these kinds of tricks is to skip the qdisc step altogether. --L From sfeldma@pobox.com Tue Nov 30 17:07:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 17:07:57 -0800 (PST) Received: from orb.pobox.com (orb.pobox.com [207.8.226.5]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB117i5W020703 for ; Tue, 30 Nov 2004 17:07:45 -0800 Received: from orb (localhost [127.0.0.1]) by orb.pobox.com (Postfix) with ESMTP id 3969E2FB9BC; Tue, 30 Nov 2004 20:07:23 -0500 (EST) Received: from [192.168.0.19] (wbar2.sea1-4-5-062-153.sea1.dsl-verizon.net [4.5.62.153]) by orb.sasl.smtp.pobox.com (Postfix) with ESMTP id 7A9822F36A4; Tue, 30 Nov 2004 20:07:12 -0500 (EST) Subject: Re: [E1000-devel] Transmission limit From: Scott Feldman Reply-To: sfeldma@pobox.com To: Lennert Buytenhek Cc: jamal , Robert Olsson , P@draigBrady.com, mellia@prezzemolo.polito.it, e1000-devel@lists.sourceforge.net, Jorge Manuel Finochietto , Giulio Galante , netdev@oss.sgi.com In-Reply-To: <20041201001107.GE4203@xi.wantstofly.org> References: <1101467291.24742.70.camel@mellia.lipar.polito.it> <41A73826.3000109@draigBrady.com> <16807.20052.569125.686158@robur.slu.se> <1101484740.24742.213.camel@mellia.lipar.polito.it> <41A76085.7000105@draigBrady.com> <1101499285.1079.45.camel@jzny.localdomain> <16811.8052.678955.795327@robur.slu.se> <1101821501.1043.43.camel@jzny.localdomain> <20041130134600.GA31515@xi.wantstofly.org> <1101824754.1044.126.camel@jzny.localdomain> <20041201001107.GE4203@xi.wantstofly.org> Content-Type: text/plain Message-Id: <1101863399.4663.54.camel@sfeldma-mobl.dsl-verizon.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Tue, 30 Nov 2004 17:09:59 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 12351 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sfeldma@pobox.com Precedence: bulk X-list: netdev Hey, turns out, I know some e1000 tricks that might help get the kpps numbers up. My problem is I only have a P4 desktop system with a 82544 nic running at PCI 32/33Mhz, so I can't play with the big boys. But, attached is a rework of the Tx path to eliminate 1) Tx interrupts, and 2) Tx descriptor write-backs. For me, I see a nice jump in kpps, but I'd like others to try with their setups. We should be able to get to wire speed with 60-byte packets. I'm using pktgen in linux-2.6.9, count = 1000000. System: Intel 865 (HT 2.6Ghz) Nic: 82544 PCI 32-bit/33Mhz Driver: linux-2.6.9 e1000 (5.3.19-k2-NAPI), no Interrupt Delays BEFORE 256 descs pkt_size = 60: 253432pps 129Mb/sec errors: 0 pkt_size = 1500: 56356pps 678Mb/sec errors: 499791 4096 descs pkt_size = 60: 254222pps 130Mb/sec errors: 0 pkt_size = 1500: 52693pps 634Mb/sec errors: 497556 AFTER Modified driver to turn off Tx interrupts and descriptor write-backs. Uses a timer to schedule Tx cleanup. The timer runs at 1ms. This would work poorly where HZ=100. Needed to bump Tx descriptors up to 4096 because 1ms is a lot of time with 60-byte packets at 1GbE. Every time the timer expires, there is only one PIO read to get HW head pointer. This wouldn't work at lower media speeds like 10Mbps or 100Mbps because the ring isn't large enough (or we would need a higher resolution timer). This also get Tx cleanup out of the NAPI path. 4096 descs pkt_size = 60: 541618pps 277Mb/sec errors: 914 pkt_size = 1500: 76198pps 916Mb/sec errors: 12419 This doubles the kpps numbers for 60-byte packets. I'd like to see what happens on higher bus bandwidth systems. Anyone? -scott diff -Naurp linux-2.6.9/drivers/net/e1000/e1000.h linux-2.6.9/drivers/net/e1000.mod/e1000.h --- linux-2.6.9/drivers/net/e1000/e1000.h 2004-10-18 14:53:06.000000000 -0700 +++ linux-2.6.9/drivers/net/e1000.mod/e1000.h 2004-11-30 14:41:07.045391488 -0800 @@ -103,7 +103,7 @@ struct e1000_adapter; #define E1000_MAX_INTR 10 /* TX/RX descriptor defines */ -#define E1000_DEFAULT_TXD 256 +#define E1000_DEFAULT_TXD 4096 #define E1000_MAX_TXD 256 #define E1000_MIN_TXD 80 #define E1000_MAX_82544_TXD 4096 @@ -189,6 +189,7 @@ struct e1000_desc_ring { /* board specific private data structure */ struct e1000_adapter { + struct timer_list tx_cleanup_timer; struct timer_list tx_fifo_stall_timer; struct timer_list watchdog_timer; struct timer_list phy_info_timer; @@ -224,6 +225,7 @@ struct e1000_adapter { uint32_t tx_fifo_size; atomic_t tx_fifo_stall; boolean_t pcix_82544; + boolean_t tx_cleanup_scheduled; /* RX */ struct e1000_desc_ring rx_ring; diff -Naurp linux-2.6.9/drivers/net/e1000/e1000_hw.h linux-2.6.9/drivers/net/e1000.mod/e1000_hw.h --- linux-2.6.9/drivers/net/e1000/e1000_hw.h 2004-10-18 14:55:06.000000000 -0700 +++ linux-2.6.9/drivers/net/e1000.mod/e1000_hw.h 2004-11-30 13:48:07.983682328 -0800 @@ -417,14 +417,12 @@ int32_t e1000_set_d3_lplu_state(struct e /* This defines the bits that are set in the Interrupt Mask * Set/Read Register. Each bit is documented below: * o RXT0 = Receiver Timer Interrupt (ring 0) - * o TXDW = Transmit Descriptor Written Back * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) * o RXSEQ = Receive Sequence Error * o LSC = Link Status Change */ #define IMS_ENABLE_MASK ( \ E1000_IMS_RXT0 | \ - E1000_IMS_TXDW | \ E1000_IMS_RXDMT0 | \ E1000_IMS_RXSEQ | \ E1000_IMS_LSC) diff -Naurp linux-2.6.9/drivers/net/e1000/e1000_main.c linux-2.6.9/drivers/net/e1000.mod/e1000_main.c --- linux-2.6.9/drivers/net/e1000/e1000_main.c 2004-10-18 14:53:50.000000000 -0700 +++ linux-2.6.9/drivers/net/e1000.mod/e1000_main.c 2004-11-30 16:15:13.777957656 -0800 @@ -131,7 +131,7 @@ static int e1000_set_mac(struct net_devi static void e1000_irq_disable(struct e1000_adapter *adapter); static void e1000_irq_enable(struct e1000_adapter *adapter); static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs); -static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter); +static void e1000_clean_tx(unsigned long data); #ifdef CONFIG_E1000_NAPI static int e1000_clean(struct net_device *netdev, int *budget); static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter, @@ -286,6 +286,7 @@ e1000_down(struct e1000_adapter *adapter e1000_irq_disable(adapter); free_irq(adapter->pdev->irq, netdev); + del_timer_sync(&adapter->tx_cleanup_timer); del_timer_sync(&adapter->tx_fifo_stall_timer); del_timer_sync(&adapter->watchdog_timer); del_timer_sync(&adapter->phy_info_timer); @@ -533,6 +534,10 @@ e1000_probe(struct pci_dev *pdev, e1000_get_bus_info(&adapter->hw); + init_timer(&adapter->tx_cleanup_timer); + adapter->tx_cleanup_timer.function = &e1000_clean_tx; + adapter->tx_cleanup_timer.data = (unsigned long) adapter; + init_timer(&adapter->tx_fifo_stall_timer); adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall; adapter->tx_fifo_stall_timer.data = (unsigned long) adapter; @@ -893,14 +898,9 @@ e1000_configure_tx(struct e1000_adapter e1000_config_collision_dist(&adapter->hw); /* Setup Transmit Descriptor Settings for eop descriptor */ - adapter->txd_cmd = E1000_TXD_CMD_IDE | E1000_TXD_CMD_EOP | + adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS; - if(adapter->hw.mac_type < e1000_82543) - adapter->txd_cmd |= E1000_TXD_CMD_RPS; - else - adapter->txd_cmd |= E1000_TXD_CMD_RS; - /* Cache if we're 82544 running in PCI-X because we'll * need this to apply a workaround later in the send path. */ if(adapter->hw.mac_type == e1000_82544 && @@ -1820,6 +1820,11 @@ e1000_xmit_frame(struct sk_buff *skb, st return NETDEV_TX_LOCKED; } + if(!adapter->tx_cleanup_scheduled) { + adapter->tx_cleanup_scheduled = TRUE; + mod_timer(&adapter->tx_cleanup_timer, jiffies + 1); + } + /* need: count + 2 desc gap to keep tail from touching * head, otherwise try next time */ if(E1000_DESC_UNUSED(&adapter->tx_ring) < count + 2) { @@ -1856,6 +1861,7 @@ e1000_xmit_frame(struct sk_buff *skb, st netdev->trans_start = jiffies; spin_unlock_irqrestore(&adapter->tx_lock, flags); + return NETDEV_TX_OK; } @@ -2151,8 +2157,7 @@ e1000_intr(int irq, void *data, struct p } #else for(i = 0; i < E1000_MAX_INTR; i++) - if(unlikely(!e1000_clean_rx_irq(adapter) & - !e1000_clean_tx_irq(adapter))) + if(unlikely(!e1000_clean_rx_irq(adapter))) break; #endif @@ -2170,18 +2175,15 @@ e1000_clean(struct net_device *netdev, i { struct e1000_adapter *adapter = netdev->priv; int work_to_do = min(*budget, netdev->quota); - int tx_cleaned; int work_done = 0; - tx_cleaned = e1000_clean_tx_irq(adapter); e1000_clean_rx_irq(adapter, &work_done, work_to_do); *budget -= work_done; netdev->quota -= work_done; - /* if no Rx and Tx cleanup work was done, exit the polling mode */ - if(!tx_cleaned || (work_done < work_to_do) || - !netif_running(netdev)) { + /* if no Rx cleanup work was done, exit the polling mode */ + if((work_done < work_to_do) || !netif_running(netdev)) { netif_rx_complete(netdev); e1000_irq_enable(adapter); return 0; @@ -2192,66 +2194,74 @@ e1000_clean(struct net_device *netdev, i #endif /** - * e1000_clean_tx_irq - Reclaim resources after transmit completes - * @adapter: board private structure + * e1000_clean_tx - Reclaim resources after transmit completes + * @data: timer callback data (board private structure) **/ -static boolean_t -e1000_clean_tx_irq(struct e1000_adapter *adapter) +static void +e1000_clean_tx(unsigned long data) { + struct e1000_adapter *adapter = (struct e1000_adapter *)data; struct e1000_desc_ring *tx_ring = &adapter->tx_ring; struct net_device *netdev = adapter->netdev; struct pci_dev *pdev = adapter->pdev; - struct e1000_tx_desc *tx_desc, *eop_desc; struct e1000_buffer *buffer_info; - unsigned int i, eop; - boolean_t cleaned = FALSE; + unsigned int i, next; + int size = 0, count = 0; + uint32_t tx_head; - i = tx_ring->next_to_clean; - eop = tx_ring->buffer_info[i].next_to_watch; - eop_desc = E1000_TX_DESC(*tx_ring, eop); + spin_lock(&adapter->tx_lock); - while(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) { - for(cleaned = FALSE; !cleaned; ) { - tx_desc = E1000_TX_DESC(*tx_ring, i); - buffer_info = &tx_ring->buffer_info[i]; + tx_head = E1000_READ_REG(&adapter->hw, TDH); - if(likely(buffer_info->dma)) { - pci_unmap_page(pdev, - buffer_info->dma, - buffer_info->length, - PCI_DMA_TODEVICE); - buffer_info->dma = 0; - } + i = next = tx_ring->next_to_clean; - if(buffer_info->skb) { - dev_kfree_skb_any(buffer_info->skb); - buffer_info->skb = NULL; - } + while(i != tx_head) { + size++; + if(i == tx_ring->buffer_info[next].next_to_watch) { + count += size; + size = 0; + if(unlikely(++i == tx_ring->count)) + i = 0; + next = i; + } else { + if(unlikely(++i == tx_ring->count)) + i = 0; + } + } - tx_desc->buffer_addr = 0; - tx_desc->lower.data = 0; - tx_desc->upper.data = 0; + i = tx_ring->next_to_clean; + while(count--) { + buffer_info = &tx_ring->buffer_info[i]; - cleaned = (i == eop); - if(unlikely(++i == tx_ring->count)) i = 0; + if(likely(buffer_info->dma)) { + pci_unmap_page(pdev, + buffer_info->dma, + buffer_info->length, + PCI_DMA_TODEVICE); + buffer_info->dma = 0; } - - eop = tx_ring->buffer_info[i].next_to_watch; - eop_desc = E1000_TX_DESC(*tx_ring, eop); + + if(buffer_info->skb) { + dev_kfree_skb_any(buffer_info->skb); + buffer_info->skb = NULL; + } + + if(unlikely(++i == tx_ring->count)) + i = 0; } tx_ring->next_to_clean = i; - spin_lock(&adapter->tx_lock); + if(E1000_DESC_UNUSED(tx_ring) != tx_ring->count) + mod_timer(&adapter->tx_cleanup_timer, jiffies + 1); + else + adapter->tx_cleanup_scheduled = FALSE; - if(unlikely(cleaned && netif_queue_stopped(netdev) && - netif_carrier_ok(netdev))) + if(unlikely(netif_queue_stopped(netdev) && netif_carrier_ok(netdev))) netif_wake_queue(netdev); spin_unlock(&adapter->tx_lock); - - return cleaned; } /** From mato@kotelna.sk Tue Nov 30 17:17:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 17:17:27 -0800 (PST) Received: from kotol.kotelna.sk (daemon@kotol.kotelna.sk [212.89.232.170]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB11HFIX021233 for ; Tue, 30 Nov 2004 17:17:20 -0800 Received: from nodbug.tuatara.sk (nodbug.tuatara.sk [::ffff:81.0.220.98]) (AUTH: CRAM-MD5 mato, TLS: TLSv1/SSLv3,168bits,DES-CBC3-SHA) by kotol.kotelna.sk with esmtp; Wed, 01 Dec 2004 02:16:45 +0100 Received: by nodbug.tuatara.sk (Postfix, from userid 1000) id 3E7926813B2C; Wed, 1 Dec 2004 02:16:13 +0100 (CET) Date: Wed, 1 Dec 2004 02:16:12 +0100 From: Martin Lucina To: netdev@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: PROBLEM: OOPS in Linux 2.6.9, fib_release_info Message-ID: <20041201011612.GA3423@kotelna.sk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline User-Agent: Mutt/1.5.6+20040722i X-archive-position: 12352 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mato@kotelna.sk Precedence: bulk X-list: netdev All, I have found a reproducible OOPS in fib_release_info, in the 2.6.9 kernel. Tested on two different systems, one UP, one SMP, both i386, both w/ CONFIG_PREEMPT=y, both Debian sarge, both w/ iproute2 version 20010824-13.1 (Debian). Steps to reproduce: # ip route add unreachable 1.2.3.4/32 # ip route del 1.2.3.4/32 Memory fault # Sample OOPS: ksymoops 2.4.9 on i686 2.6.9+t7220cte. Options used -V (default) -K (specified) -l /proc/modules (default) -o /lib/modules/2.6.9+t7220cte/ (default) -m /boot/System.map-2.6.9+t7220cte (specified) No modules in ksyms, skipping objects No ksyms, skipping lsmod Unable to handle kernel NULL pointer dereference at virtual address 00000000 c02bd6c0 *pde = 00000000 Oops: 0002 [#1] CPU: 0 EIP: 0060:[] Not tainted VLI Using defaults from ksymoops -t elf32-i386 -a i386 EFLAGS: 00010246 (2.6.9+t7220cte) eax: 00000000 ebx: d1ddb280 ecx: 00000000 edx: d1ddb220 esi: d1ddb284 edi: d3a34380 ebp: d037dbf8 esp: d037dbec ds: 007b es: 007b ss: 0068 Stack: 00000000 00000001 d3a34388 d037dc40 c02bfb8c d1ddb220 d3a34380 d3277310 00000020 000000fe d3fa24e0 c13b3378 d3277310 00000fcc d06ea2c0 00000020 d3a34380 04030201 d3fa24f0 d3fa24e0 c12fc1a0 d037dc68 c02bce93 d3fa6d00 Call Trace: [] show_stack+0x7f/0xa0 [] show_registers+0x156/0x1c0 [] die+0xea/0x180 [] do_page_fault+0x256/0x609 [] error_code+0x2d/0x38 [] fn_hash_delete+0x1dc/0x2a0 [] inet_rtm_delroute+0x63/0x80 [] rtnetlink_rcv+0x2f0/0x3c0 [] netlink_data_ready+0x5e/0x70 [] netlink_sendskb+0x9c/0xa0 [] netlink_sendmsg+0x1f9/0x2f0 [] sock_sendmsg+0xbb/0xe0 [] sys_sendmsg+0x1c2/0x240 [] sys_socketcall+0x228/0x250 [] sysenter_past_esp+0x52/0x71 Code: 8d 5a 08 8b 4b 04 85 c0 89 01 74 03 89 48 04 c7 42 08 00 01 10 00 c7 43 04 00 02 20 00 8d 5a 60 8b 43 04 8d 72 64 8b 4e 04 85 c0 <89> 01 74 03 89 48 04 c7 43 04 00 01 10 00 c7 46 04 00 02 20 00 >>EIP; c02bd6c0 <===== >>ebx; d1ddb280 >>edx; d1ddb220 >>esi; d1ddb284 >>edi; d3a34380 >>ebp; d037dbf8 >>esp; d037dbec Trace; c0104a6f Trace; c0104c16 Trace; c0104e2a Trace; c01120e6 Trace; c0104645 Trace; c02bfb8c Trace; c02bce93 Trace; c027d2b0 Trace; c028759e Trace; c0286acc Trace; c0287219 Trace; c026a85b Trace; c026c362 Trace; c026c808 Trace; c0104449 This architecture has variable length instructions, decoding before eip is unreliable, take these instructions with a pinch of salt. Code; c02bd695 00000000 <_EIP>: Code; c02bd695 0: 8d 5a 08 lea 0x8(%edx),%ebx Code; c02bd698 3: 8b 4b 04 mov 0x4(%ebx),%ecx Code; c02bd69b 6: 85 c0 test %eax,%eax Code; c02bd69d 8: 89 01 mov %eax,(%ecx) Code; c02bd69f a: 74 03 je f <_EIP+0xf> Code; c02bd6a1 c: 89 48 04 mov %ecx,0x4(%eax) Code; c02bd6a4 f: c7 42 08 00 01 10 00 movl $0x100100,0x8(%edx) Code; c02bd6ab 16: c7 43 04 00 02 20 00 movl $0x200200,0x4(%ebx) Code; c02bd6b2 1d: 8d 5a 60 lea 0x60(%edx),%ebx Code; c02bd6b5 20: 8b 43 04 mov 0x4(%ebx),%eax Code; c02bd6b8 23: 8d 72 64 lea 0x64(%edx),%esi Code; c02bd6bb 26: 8b 4e 04 mov 0x4(%esi),%ecx Code; c02bd6be 29: 85 c0 test %eax,%eax This decode from eip onwards should be reliable Code; c02bd6c0 00000000 <_EIP>: Code; c02bd6c0 <===== 0: 89 01 mov %eax,(%ecx) <===== Code; c02bd6c2 2: 74 03 je 7 <_EIP+0x7> Code; c02bd6c4 4: 89 48 04 mov %ecx,0x4(%eax) Code; c02bd6c7 7: c7 43 04 00 01 10 00 movl $0x100100,0x4(%ebx) Code; c02bd6ce e: c7 46 04 00 02 20 00 movl $0x200200,0x4(%esi) [] dump_stack+0x1e/0x30 [] schedule+0x4ec/0x500 [] unmap_vmas+0x1a6/0x1c0 [] exit_mmap+0x7d/0x160 [] mmput+0x66/0xb0 [] do_exit+0x148/0x420 [] die+0x17d/0x180 [] do_page_fault+0x256/0x609 [] error_code+0x2d/0x38 [] fn_hash_delete+0x1dc/0x2a0 [] inet_rtm_delroute+0x63/0x80 [] rtnetlink_rcv+0x2f0/0x3c0 [] netlink_data_ready+0x5e/0x70 [] netlink_sendskb+0x9c/0xa0 [] netlink_sendmsg+0x1f9/0x2f0 [] sock_sendmsg+0xbb/0xe0 [] sys_sendmsg+0x1c2/0x240 [] sys_socketcall+0x228/0x250 [] sysenter_past_esp+0x52/0x71 Will send other relevant information on request. -mato From davem@davemloft.net Tue Nov 30 20:49:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 20:50:04 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB14ntP7030649 for ; Tue, 30 Nov 2004 20:49:58 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZMO5-0006Aq-00; Tue, 30 Nov 2004 20:46:45 -0800 Date: Tue, 30 Nov 2004 20:46:44 -0800 From: "David S. Miller" To: Martin Lucina Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: PROBLEM: OOPS in Linux 2.6.9, fib_release_info Message-Id: <20041130204644.4319f974.davem@davemloft.net> In-Reply-To: <20041201011612.GA3423@kotelna.sk> References: <20041201011612.GA3423@kotelna.sk> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12353 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 1 Dec 2004 02:16:12 +0100 Martin Lucina wrote: > I have found a reproducible OOPS in fib_release_info, in the 2.6.9 kernel. > Tested on two different systems, one UP, one SMP, both i386, both w/ > CONFIG_PREEMPT=y, both Debian sarge, both w/ iproute2 version 20010824-13.1 > (Debian). Already fixed in 2.6.10 by this patch. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/10/25 20:09:20-07:00 ehrhardt@mathematik.uni-ulm.de # [IPV4]: Do not try to unhash null-netdev nexthops. # # Signed-off-by: Christian Ehrhardt # Signed-off-by: David S. Miller # # net/ipv4/fib_semantics.c # 2004/10/25 20:09:01-07:00 ehrhardt@mathematik.uni-ulm.de +2 -0 # [IPV4]: Do not try to unhash null-netdev nexthops. # # Signed-off-by: Christian Ehrhardt # Signed-off-by: David S. Miller # diff -Nru a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c --- a/net/ipv4/fib_semantics.c 2004-11-30 20:22:10 -08:00 +++ b/net/ipv4/fib_semantics.c 2004-11-30 20:22:10 -08:00 @@ -163,6 +163,8 @@ if (fi->fib_prefsrc) hlist_del(&fi->fib_lhash); change_nexthops(fi) { + if (!nh->nh_dev) + continue; hlist_del(&nh->nh_hash); } endfor_nexthops(fi) fi->fib_dead = 1; From tibet@oracle.co.jp Tue Nov 30 21:01:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 21:02:03 -0800 (PST) Received: from MINSHENG-31VW0K ([221.208.135.2]) by oss.sgi.com (8.13.0/8.13.0) with SMTP id iB151e9L031291 for ; Tue, 30 Nov 2004 21:01:56 -0800 Date: Tue, 30 Nov 2004 21:01:40 -0800 Message-Id: <200412010501.iB151e9L031291@oss.sgi.com> From: "=?iso-2022-jp?B?YTEwLm5ldA==?=" To: "netdev@oss.sgi.com" X-mailer: Super Mailer 9 [en][outlook] Subject: =?iso-2022-jp?B?GyRCISE0KCQkJEckOSQrISkbKEI=?= MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4927.1200 X-archive-position: 12354 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sdf@yahoo.co.jp Precedence: bulk X-list: netdev いいね〜今週も最高です! http://iidote.info/kinjyo ****メルマガ解除/問い合わせ**** 広東省 藩 浩 yotsuba_kouyou@yahoo.co.jp ******************************* From davem@davemloft.net Tue Nov 30 21:50:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 21:50:09 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB15o1CD032534 for ; Tue, 30 Nov 2004 21:50:02 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNK7-0006VB-00; Tue, 30 Nov 2004 21:46:43 -0800 Date: Tue, 30 Nov 2004 21:46:43 -0800 From: "David S. Miller" To: Stephen Hemminger Cc: michael.vittrup.larsen@ericsson.com, netdev@oss.sgi.com Subject: Re: [PATCH] tcp: efficient port randomisation (revised) Message-Id: <20041130214643.7b72300e.davem@davemloft.net> In-Reply-To: <20041117153025.160eaa04@zqx3.pdx.osdl.net> References: <20041027092531.78fe438c@guest-251-240.pdx.osdl.net> <200411020854.44745.michael.vittrup.larsen@ericsson.com> <20041104100104.570e67cd@dxpl.pdx.osdl.net> <200411051103.59032.michael.vittrup.larsen@ericsson.com> <20041117153025.160eaa04@zqx3.pdx.osdl.net> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12355 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 17 Nov 2004 15:30:25 -0800 Stephen Hemminger wrote: > Here is a more conservative version of earlier patch vthat keeps the > same port rover locking and global port rover. This randomizes TCP > ephemeral ports of incoming connections using variation of existing > sequence number hash. > > Thanks to original author Michael Larsen. > http://www.ietf.org/internet-drafts/draft-larsen-tsvwg-port-randomisation-00.txt > > It behaves correctly if someone is perverse and sets low > high > and it separates the outgoing port rover (tcp_port_rover) from the > incoming port rover (start_rover). I'm fine with this patch semantically. What do the before/after microbenchmarks look like? We're adding a MD4 transform plus a modulus for every local port select operation. From davem@davemloft.net Tue Nov 30 21:53:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 21:53:04 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB15r0Qi000445 for ; Tue, 30 Nov 2004 21:53:00 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNN9-0006WB-00; Tue, 30 Nov 2004 21:49:51 -0800 Date: Tue, 30 Nov 2004 21:49:51 -0800 From: "David S. Miller" To: Stephen Hemminger Cc: mitch@sfgoth.com, netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: [PATCH] UDP select handling of bad checksums. Message-Id: <20041130214951.0e216ceb.davem@davemloft.net> In-Reply-To: <20041122100907.2ab81f18@dxpl.pdx.osdl.net> References: <20041102162454.3f153ff0@dxpl.pdx.osdl.net> <20041103005253.GA77817@gaz.sfgoth.com> <20041122100907.2ab81f18@dxpl.pdx.osdl.net> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12356 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Mon, 22 Nov 2004 10:09:07 -0800 Stephen Hemminger wrote: > Alternate workaround for blocking usage of select() by UDP applications. Ok, I've applied this to my 2.6.x tree. Please provide a 2.4.x backport, it needs this too. From davem@davemloft.net Tue Nov 30 22:04:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 22:05:00 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB164rvT001213 for ; Tue, 30 Nov 2004 22:04:53 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNYd-0006Zc-00; Tue, 30 Nov 2004 22:01:43 -0800 Date: Tue, 30 Nov 2004 22:01:43 -0800 From: "David S. Miller" To: Robert Olsson Cc: netdev@oss.sgi.com Subject: Re: FIB reorg (1) Message-Id: <20041130220143.3786e400.davem@davemloft.net> In-Reply-To: <16804.56438.318740.779153@robur.slu.se> References: <16804.56438.318740.779153@robur.slu.se> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12357 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 24 Nov 2004 20:09:42 +0100 Robert Olsson wrote: > rtmsg_fib() can be made a bit more generic and put in fib_semantics.c > something like below. Looks nice. I've made a minor modification as I applied it to my 2.6.11 pending tree. We have a private header for routines shared between fib_hash and fib_semantics, namely net/ipv4/fib_lookup.h so that's where I placed the rtmsg_fib() extern declaration. This is the final patch I applied. Thanks Robert. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/30 21:37:16-08:00 davem@nuts.davemloft.net # [IPV4]: FIB cleanup, rtmsg_fib() # # Based largely upon a patch by Robert Olsson. # # Abstract out rtmsg_fib() so that it does not depend # upon fib_hash internal datastructures, move it to # fib_semantics.c # # Signed-off-by: David S. Miller # # net/ipv4/fib_semantics.c # 2004/11/30 21:36:06-08:00 davem@nuts.davemloft.net +27 -0 # [IPV4]: FIB cleanup, rtmsg_fib() # # net/ipv4/fib_lookup.h # 2004/11/30 21:36:06-08:00 davem@nuts.davemloft.net +3 -0 # [IPV4]: FIB cleanup, rtmsg_fib() # # net/ipv4/fib_hash.c # 2004/11/30 21:36:06-08:00 davem@nuts.davemloft.net +2 -34 # [IPV4]: FIB cleanup, rtmsg_fib() # diff -Nru a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c --- a/net/ipv4/fib_hash.c 2004-11-30 21:37:44 -08:00 +++ b/net/ipv4/fib_hash.c 2004-11-30 21:37:44 -08:00 @@ -376,11 +376,6 @@ read_unlock(&fib_hash_lock); } -static void rtmsg_fib(int, struct fib_node *, struct fib_alias *, - int, int, - struct nlmsghdr *n, - struct netlink_skb_parms *); - /* Insert node F to FZ. */ static inline void fib_insert_node(struct fn_zone *fz, struct fib_node *f) { @@ -565,7 +560,7 @@ fz->fz_nent++; rt_cache_flush(-1); - rtmsg_fib(RTM_NEWROUTE, f, new_fa, z, tb->tb_id, n, req); + rtmsg_fib(RTM_NEWROUTE, key, new_fa, z, tb->tb_id, n, req); return 0; out_free_new_fa: @@ -631,7 +626,7 @@ int kill_fn; fa = fa_to_delete; - rtmsg_fib(RTM_DELROUTE, f, fa, z, tb->tb_id, n, req); + rtmsg_fib(RTM_DELROUTE, key, fa, z, tb->tb_id, n, req); kill_fn = 0; write_lock_bh(&fib_hash_lock); @@ -794,33 +789,6 @@ read_unlock(&fib_hash_lock); cb->args[1] = m; return skb->len; -} - -static void rtmsg_fib(int event, struct fib_node *f, struct fib_alias *fa, - int z, int tb_id, - struct nlmsghdr *n, struct netlink_skb_parms *req) -{ - struct sk_buff *skb; - u32 pid = req ? req->pid : 0; - int size = NLMSG_SPACE(sizeof(struct rtmsg)+256); - - skb = alloc_skb(size, GFP_KERNEL); - if (!skb) - return; - - if (fib_dump_info(skb, pid, n->nlmsg_seq, event, tb_id, - fa->fa_type, fa->fa_scope, &f->fn_key, z, - fa->fa_tos, - fa->fa_info) < 0) { - kfree_skb(skb); - return; - } - NETLINK_CB(skb).dst_groups = RTMGRP_IPV4_ROUTE; - if (n->nlmsg_flags&NLM_F_ECHO) - atomic_inc(&skb->users); - netlink_broadcast(rtnl, skb, pid, RTMGRP_IPV4_ROUTE, GFP_KERNEL); - if (n->nlmsg_flags&NLM_F_ECHO) - netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); } #ifdef CONFIG_IP_MULTIPLE_TABLES diff -Nru a/net/ipv4/fib_lookup.h b/net/ipv4/fib_lookup.h --- a/net/ipv4/fib_lookup.h 2004-11-30 21:37:44 -08:00 +++ b/net/ipv4/fib_lookup.h 2004-11-30 21:37:44 -08:00 @@ -30,5 +30,8 @@ extern int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, u8 tb_id, u8 type, u8 scope, void *dst, int dst_len, u8 tos, struct fib_info *fi); +extern void rtmsg_fib(int event, u32 key, struct fib_alias *fa, + int z, int tb_id, + struct nlmsghdr *n, struct netlink_skb_parms *req); #endif /* _FIB_LOOKUP_H */ diff -Nru a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c --- a/net/ipv4/fib_semantics.c 2004-11-30 21:37:44 -08:00 +++ b/net/ipv4/fib_semantics.c 2004-11-30 21:37:44 -08:00 @@ -270,6 +270,33 @@ return -1; } +void rtmsg_fib(int event, u32 key, struct fib_alias *fa, + int z, int tb_id, + struct nlmsghdr *n, struct netlink_skb_parms *req) +{ + struct sk_buff *skb; + u32 pid = req ? req->pid : 0; + int size = NLMSG_SPACE(sizeof(struct rtmsg)+256); + + skb = alloc_skb(size, GFP_KERNEL); + if (!skb) + return; + + if (fib_dump_info(skb, pid, n->nlmsg_seq, event, tb_id, + fa->fa_type, fa->fa_scope, &key, z, + fa->fa_tos, + fa->fa_info) < 0) { + kfree_skb(skb); + return; + } + NETLINK_CB(skb).dst_groups = RTMGRP_IPV4_ROUTE; + if (n->nlmsg_flags&NLM_F_ECHO) + atomic_inc(&skb->users); + netlink_broadcast(rtnl, skb, pid, RTMGRP_IPV4_ROUTE, GFP_KERNEL); + if (n->nlmsg_flags&NLM_F_ECHO) + netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); +} + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From davem@davemloft.net Tue Nov 30 22:13:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 22:13:23 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB16DE1K001651 for ; Tue, 30 Nov 2004 22:13:16 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNgi-0006bi-00; Tue, 30 Nov 2004 22:10:04 -0800 Date: Tue, 30 Nov 2004 22:10:04 -0800 From: "David S. Miller" To: Robert Olsson Cc: netdev@oss.sgi.com Subject: Re: FIB reorg (2) Message-Id: <20041130221004.7fa2d526.davem@davemloft.net> In-Reply-To: <16804.56817.259589.279556@robur.slu.se> References: <16804.56817.259589.279556@robur.slu.se> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12358 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 24 Nov 2004 20:16:01 +0100 Robert Olsson wrote: > And a variant of fib_find_alias for fib_semantics Applied to my 2.6.11 pending tree. I made the same fixup here as I did for the first FIB reorg patch, namely making use of the net/ipv4/fib_lookup.h header file. Thanks Robert. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/30 21:45:25-08:00 robert.olsson@data.slu.se # [IPV4]: FIB cleanup, fib_find_alias() # # Abstract out fib_node arg usage in fib_find_alias(), # move to fib_semantics.c # # Signed-off-by: David S. Miller # # net/ipv4/fib_semantics.c # 2004/11/30 21:44:45-08:00 robert.olsson@data.slu.se +18 -0 # [IPV4]: FIB cleanup, fib_find_alias() # # net/ipv4/fib_lookup.h # 2004/11/30 21:44:45-08:00 robert.olsson@data.slu.se +2 -0 # [IPV4]: FIB cleanup, fib_find_alias() # # net/ipv4/fib_hash.c # 2004/11/30 21:44:45-08:00 robert.olsson@data.slu.se +10 -22 # [IPV4]: FIB cleanup, fib_find_alias() # diff -Nru a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c --- a/net/ipv4/fib_hash.c 2004-11-30 21:45:41 -08:00 +++ b/net/ipv4/fib_hash.c 2004-11-30 21:45:41 -08:00 @@ -399,26 +399,6 @@ return NULL; } -/* Return the first fib alias matching TOS with - * priority less than or equal to PRIO. - */ -static struct fib_alias *fib_find_alias(struct fib_node *fn, u8 tos, u32 prio) -{ - if (fn) { - struct list_head *head = &fn->fn_alias; - struct fib_alias *fa; - - list_for_each_entry(fa, head, fa_list) { - if (fa->fa_tos > tos) - continue; - if (fa->fa_info->fib_priority >= prio || - fa->fa_tos < tos) - return fa; - } - } - return NULL; -} - static int fn_hash_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, struct nlmsghdr *n, struct netlink_skb_parms *req) @@ -458,7 +438,11 @@ fn_rehash_zone(fz); f = fib_find_node(fz, key); - fa = fib_find_alias(f, tos, fi->fib_priority); + + if (!f) + fa = NULL; + else + fa = fib_find_alias(&f->fn_alias, tos, fi->fib_priority); /* Now fa, if non-NULL, points to the first fib alias * with the same keys [prefix,tos,priority], if such key already @@ -598,7 +582,11 @@ } f = fib_find_node(fz, key); - fa = fib_find_alias(f, tos, 0); + + if (!f) + fa = NULL; + else + fa = fib_find_alias(&f->fn_alias, tos, 0); if (!fa) return -ESRCH; diff -Nru a/net/ipv4/fib_lookup.h b/net/ipv4/fib_lookup.h --- a/net/ipv4/fib_lookup.h 2004-11-30 21:45:41 -08:00 +++ b/net/ipv4/fib_lookup.h 2004-11-30 21:45:41 -08:00 @@ -33,5 +33,7 @@ extern void rtmsg_fib(int event, u32 key, struct fib_alias *fa, int z, int tb_id, struct nlmsghdr *n, struct netlink_skb_parms *req); +extern struct fib_alias *fib_find_alias(struct list_head *fah, + u8 tos, u32 prio); #endif /* _FIB_LOOKUP_H */ diff -Nru a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c --- a/net/ipv4/fib_semantics.c 2004-11-30 21:45:41 -08:00 +++ b/net/ipv4/fib_semantics.c 2004-11-30 21:45:41 -08:00 @@ -297,6 +297,24 @@ netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); } +/* Return the first fib alias matching TOS with + * priority less than or equal to PRIO. + */ +struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio) +{ + if (fah) { + struct fib_alias *fa; + list_for_each_entry(fa, fah, fa_list) { + if (fa->fa_tos > tos) + continue; + if (fa->fa_info->fib_priority >= prio || + fa->fa_tos < tos) + return fa; + } + } + return NULL; +} + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From davem@davemloft.net Tue Nov 30 22:19:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 22:19:49 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB16JidV002059 for ; Tue, 30 Nov 2004 22:19:44 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNn0-0006dr-00; Tue, 30 Nov 2004 22:16:34 -0800 Date: Tue, 30 Nov 2004 22:16:34 -0800 From: "David S. Miller" To: Robert Olsson Cc: Robert.Olsson@data.slu.se, netdev@oss.sgi.com Subject: Re: FIB reorg (3) Message-Id: <20041130221634.258cd191.davem@davemloft.net> In-Reply-To: <16804.57005.843753.810704@robur.slu.se> References: <16804.57005.843753.810704@robur.slu.se> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12359 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Wed, 24 Nov 2004 20:19:09 +0100 Robert Olsson wrote: > And also fib_detect_death. Also applied to my 2.6.11 pending tree with the fib_lookup.h usage fixup. Thanks Robert. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/11/30 21:51:06-08:00 robert.olsson@data.slu.se # [IPV4]: FIB cleanup, fib_detect_death() # # Remove dependancy upon fib_hash specific # fn_hash_select_dflt and move it over to # fib_semantics.c # # Signed-off-by: David S. Miller # # net/ipv4/fib_semantics.c # 2004/11/30 21:50:04-08:00 robert.olsson@data.slu.se +23 -0 # [IPV4]: FIB cleanup, fib_detect_death() # # net/ipv4/fib_lookup.h # 2004/11/30 21:50:04-08:00 robert.olsson@data.slu.se +3 -0 # [IPV4]: FIB cleanup, fib_detect_death() # # net/ipv4/fib_hash.c # 2004/11/30 21:50:04-08:00 robert.olsson@data.slu.se +2 -25 # [IPV4]: FIB cleanup, fib_detect_death() # diff -Nru a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c --- a/net/ipv4/fib_hash.c 2004-11-30 21:51:41 -08:00 +++ b/net/ipv4/fib_hash.c 2004-11-30 21:51:41 -08:00 @@ -274,29 +274,6 @@ static int fn_hash_last_dflt=-1; -static int fib_detect_death(struct fib_info *fi, int order, - struct fib_info **last_resort, int *last_idx) -{ - struct neighbour *n; - int state = NUD_NONE; - - n = neigh_lookup(&arp_tbl, &fi->fib_nh[0].nh_gw, fi->fib_dev); - if (n) { - state = n->nud_state; - neigh_release(n); - } - if (state==NUD_REACHABLE) - return 0; - if ((state&NUD_VALID) && order != fn_hash_last_dflt) - return 0; - if ((state&NUD_VALID) || - (*last_idx<0 && order > fn_hash_last_dflt)) { - *last_resort = fi; - *last_idx = order; - } - return 1; -} - static void fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res) { @@ -337,7 +314,7 @@ if (next_fi != res->fi) break; } else if (!fib_detect_death(fi, order, &last_resort, - &last_idx)) { + &last_idx, &fn_hash_last_dflt)) { if (res->fi) fib_info_put(res->fi); res->fi = fi; @@ -355,7 +332,7 @@ goto out; } - if (!fib_detect_death(fi, order, &last_resort, &last_idx)) { + if (!fib_detect_death(fi, order, &last_resort, &last_idx, &fn_hash_last_dflt)) { if (res->fi) fib_info_put(res->fi); res->fi = fi; diff -Nru a/net/ipv4/fib_lookup.h b/net/ipv4/fib_lookup.h --- a/net/ipv4/fib_lookup.h 2004-11-30 21:51:41 -08:00 +++ b/net/ipv4/fib_lookup.h 2004-11-30 21:51:41 -08:00 @@ -35,5 +35,8 @@ struct nlmsghdr *n, struct netlink_skb_parms *req); extern struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 prio); +extern int fib_detect_death(struct fib_info *fi, int order, + struct fib_info **last_resort, + int *last_idx, int *dflt); #endif /* _FIB_LOOKUP_H */ diff -Nru a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c --- a/net/ipv4/fib_semantics.c 2004-11-30 21:51:41 -08:00 +++ b/net/ipv4/fib_semantics.c 2004-11-30 21:51:41 -08:00 @@ -315,6 +315,29 @@ return NULL; } +int fib_detect_death(struct fib_info *fi, int order, + struct fib_info **last_resort, int *last_idx, int *dflt) +{ + struct neighbour *n; + int state = NUD_NONE; + + n = neigh_lookup(&arp_tbl, &fi->fib_nh[0].nh_gw, fi->fib_dev); + if (n) { + state = n->nud_state; + neigh_release(n); + } + if (state==NUD_REACHABLE) + return 0; + if ((state&NUD_VALID) && order != *dflt) + return 0; + if ((state&NUD_VALID) || + (*last_idx<0 && order > *dflt)) { + *last_resort = fi; + *last_idx = order; + } + return 1; +} + #ifdef CONFIG_IP_ROUTE_MULTIPATH static u32 fib_get_attr32(struct rtattr *attr, int attrlen, int type) From davem@davemloft.net Tue Nov 30 22:29:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 22:29:36 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB16TQHC002604 for ; Tue, 30 Nov 2004 22:29:30 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNwN-0006gK-00; Tue, 30 Nov 2004 22:26:15 -0800 Date: Tue, 30 Nov 2004 22:26:15 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com Subject: Re: [PATCH] gnet_stats: kernel-api doc for gnet stats/estimator Message-Id: <20041130222615.4db5813f.davem@davemloft.net> In-Reply-To: <20041130155630.GH31969@postel.suug.ch> References: <20041130155630.GH31969@postel.suug.ch> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12360 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 16:56:30 +0100 Thomas Graf wrote: > kernel-api documentation for gnet stats/estimator > > Signed-off-by: Thomas Graf Applied, thanks Thomas. From davem@davemloft.net Tue Nov 30 22:31:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 30 Nov 2004 22:31:27 -0800 (PST) Received: from cheetah.davemloft.net (mail@adsl-63-197-226-105.dsl.snfc21.pacbell.net [63.197.226.105]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iB16VNAF002971 for ; Tue, 30 Nov 2004 22:31:23 -0800 Received: from localhost ([127.0.0.1] helo=cheetah.davemloft.net ident=davem) by cheetah.davemloft.net with smtp (Exim 3.36 #1 (Debian)) id 1CZNyH-0006gi-00; Tue, 30 Nov 2004 22:28:13 -0800 Date: Tue, 30 Nov 2004 22:28:13 -0800 From: "David S. Miller" To: Thomas Graf Cc: netdev@oss.sgi.com Subject: Re: [PATCH] rtnetlink: link attribute modification by interface name Message-Id: <20041130222813.0cc61616.davem@davemloft.net> In-Reply-To: <20041130220659.GK31969@postel.suug.ch> References: <20041130220659.GK31969@postel.suug.ch> X-Mailer: Sylpheed version 1.0.0beta3 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 12361 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@davemloft.net Precedence: bulk X-list: netdev On Tue, 30 Nov 2004 23:06:59 +0100 Thomas Graf wrote: > This patch allows modification of link attributes by the interface name, > avoids the requirement of translating a name to an ifindex first, and > provides better atomicity to userspace. It works by setting the ifindex > to a negative number and provide the interface name via the IFLA_IFNAME > TLV and let the kernel lookup the device by name instead of ifindex. Changing > the interface name will not work using this method because IFLA_IFNAME also > transports the new interface name. The patch also fixes a possible source for > bugs if IFNAMSIZ is ever changed to a number not aligned to RTA_ALIGNTO. Looks good, applied to my 2.6.11 pending tree. Thanks.