Re: [PATCH] netfilter: ipt_MASQUERADE: NULL check in device_cmp [BUG] panic 2.6.20-rc3 in nf_conntrack
On Thu, Jan 04, 2007 at 02:51:55PM +0100, Jarek Poplawski wrote: Hello, Below I attach a patch proposal. It seems I wasted some time... I wonder if there is any reason to forward netfilter bugs to netdev if patches from netfilter aren't cc-d here? It seems netfilter is really independent from net. Before sending the patch I did some seeking by subject on both lists and found nothing. Now I see it was in netfilter-devel, but wasn't even titled as patch and no masquerade in title also. Maybe I should check netfilter svn also but can't find it yet... Of course I'll try to remember to ignore such messages next time, but others may be tricked. Regards, Jarek P. PS: After some confusion I've also found a good side: other systems will wet themselves when they see linux has such work resources it can fix bugs twice. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH/RFC 00/10] Transparent proxying patches version 4
On Sun, Jan 07, 2007 at 05:11:06PM +0100, Lennert Buytenhek wrote: On Sun, Jan 07, 2007 at 03:11:34PM +0100, Harald Welte wrote: So instead of using NAT to dynamically redirect traffic to local addresses, we now rely on native non-locally-bound sockets and do early socket lookups for inbound IPv4 packets. It's good to see a solid implementation of this 'old idea'. Just as a quick historical note to netdev: This is the way how the netfilter project advised the balabit guys to implement fully transparent proxy support, after having seen the complexity of the old nat-based TPROXY patches. Didn't rusty tell the balabit guys to use the NAT approach? that was originally, way back. It turned out to be a bad idea, after all... way too complex. At least that's how I look at it. Too sad :( Rusty and me then had the idea about the routing based approach at some point, if I remember correctly. We talked about it with Krisztian and Balazs at least on one occasion. All that isn't really important. All I wanted to say was: I (and AFAIR the netfilter core team) believe this is the way to implement good support for transparent proxying. It's already the second completely independent implementation, let's merge it after all. -- - Harald Welte [EMAIL PROTECTED] http://netfilter.org/ 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 signature.asc Description: Digital signature
Re: [PATCH][RFC] tcp: fix ambiguity in the `before' relation
| Since the old definition is not used in the way before(x, y) !before(y, x), but rather in the | fashion before(x, y) or after(y, x), the main advantage of the new definition is that it makes | this type of use a safe case. | | This is not true because | | if (before(x, y)) | goto drop; | | means that you're effectively using it as !before(x, y). In other words, | the change is good if our code read | | if (before(x, y)) | process_packet(); | That is correct - whether it is indeed safe(r) to use needs to be evaluated in the individual context. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [git patches] net driver fixes
Hi Jeff, Could you apply the updates for ucc_geth driver? The patches from Timur that make the driver compile correctly on 2.6.20. [PATCH] Fix phy_read/write redefinition errors in ucc_geth_phy.c [PATCH] Update ucc_geth.c for new workqueue structure The patch from Ahmed that cleans up some unnecessary casts. [PATCH 2.6.20-rc3] UCC Ether driver: kmalloc casting cleanups - Leo -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Jeff Garzik Sent: Monday, January 08, 2007 5:48 PM To: Andrew Morton; Linus Torvalds Cc: netdev@vger.kernel.org; LKML Subject: [git patches] net driver fixes Please pull from 'upstream-linus' branch of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git upstream-linus to receive the following updates: drivers/net/e1000/e1000_main.c |6 drivers/net/ixgb/ixgb.h |1 + drivers/net/ixgb/ixgb_ethtool.c |1 + drivers/net/ixgb/ixgb_hw.c |3 +- drivers/net/ixgb/ixgb_main.c| 57 ++ drivers/net/qla3xxx.c | 38 +++-- drivers/net/wireless/ipw2100.c |2 +- drivers/s390/net/qeth_main.c| 13 +--- include/net/ieee80211.h |2 +- 9 files changed, 88 insertions(+), 35 deletions(-) Aaron Salter (1): ixgb: Write RA register high word first, increment version Heiko Carstens (1): qeth: fix uaccess handling and get rid of unused variable Jeff Garzik (1): Revert e1000: disable TSO on the 82544 with slab debugging Jesse Brandeburg (2): ixgb: Fix early TSO completion ixgb: Maybe stop TX if not enough free descriptors Ron Mercer (2): qla3xxx: Remove NETIF_F_LLTX from driver features. qla3xxx: Add delay to NVRAM register access. Zhu Yi (2): ieee80211: WLAN_GET_SEQ_SEQ fix (select correct region) ipw2100: Fix dropping fragmented small packet problem diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 4c1ff75..c6259c7 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -995,12 +995,6 @@ e1000_probe(struct pci_dev *pdev, (adapter-hw.mac_type != e1000_82547)) netdev-features |= NETIF_F_TSO; -#ifdef CONFIG_DEBUG_SLAB - /* 82544's work arounds do not play nicely with DEBUG SLAB */ - if (adapter-hw.mac_type == e1000_82544) - netdev-features = ~NETIF_F_TSO; -#endif - #ifdef NETIF_F_TSO6 if (adapter-hw.mac_type e1000_82547_rev_2) netdev-features |= NETIF_F_TSO6; diff --git a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h index 50ffe90..f4aba43 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h @@ -171,6 +171,7 @@ struct ixgb_adapter { /* TX */ struct ixgb_desc_ring tx_ring cacheline_aligned_in_smp; + unsigned int restart_queue; unsigned long timeo_start; uint32_t tx_cmd_type; uint64_t hw_csum_tx_good; diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index cd22523..82c044d 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c @@ -79,6 +79,7 @@ static struct ixgb_stats ixgb_gstrings_stats[] = { {tx_window_errors, IXGB_STAT(net_stats.tx_window_errors)}, {tx_deferred_ok, IXGB_STAT(stats.dc)}, {tx_timeout_count, IXGB_STAT(tx_timeout_count) }, + {tx_restart_queue, IXGB_STAT(restart_queue) }, {rx_long_length_errors, IXGB_STAT(stats.roc)}, {rx_short_length_errors, IXGB_STAT(stats.ruc)}, #ifdef NETIF_F_TSO diff --git a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c index 02089b6..ecbf458 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c @@ -399,8 +399,9 @@ ixgb_init_rx_addrs(struct ixgb_hw *hw) /* Zero out the other 15 receive addresses. */ DEBUGOUT(Clearing RAR[1-15]\n); for(i = 1; i IXGB_RAR_ENTRIES; i++) { - IXGB_WRITE_REG_ARRAY(hw, RA, (i 1), 0); + /* Write high reg first to disable the AV bit first */ IXGB_WRITE_REG_ARRAY(hw, RA, ((i 1) + 1), 0); + IXGB_WRITE_REG_ARRAY(hw, RA, (i 1), 0); } return; diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index e628126..a083a91 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c @@ -36,7 +36,7 @@ static char ixgb_driver_string[] = Intel(R) PRO/10GbE Network Driver; #else #define DRIVERNAPI -NAPI #endif -#define DRV_VERSION 1.0.117-k2DRIVERNAPI +#define DRV_VERSION 1.0.126-k2DRIVERNAPI char ixgb_driver_version[] = DRV_VERSION; static char ixgb_copyright[] = Copyright (c) 1999-2006 Intel Corporation.; @@ -1287,6 +1287,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, struct ixgb_buffer *buffer_info; int len = skb-len;
Re: [git patches] net driver fixes
Li Yang-r58472 wrote: Hi Jeff, Could you apply the updates for ucc_geth driver? The patches from Timur that make the driver compile correctly on 2.6.20. [PATCH] Fix phy_read/write redefinition errors in ucc_geth_phy.c [PATCH] Update ucc_geth.c for new workqueue structure The patch from Ahmed that cleans up some unnecessary casts. [PATCH 2.6.20-rc3] UCC Ether driver: kmalloc casting cleanups I don't have any of these in my queue. Jeff - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[git patches] net driver fixes
Please pull from 'upstream-linus' branch of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git upstream-linus to receive the following updates: drivers/net/e1000/e1000_main.c |6 drivers/net/ixgb/ixgb.h |1 + drivers/net/ixgb/ixgb_ethtool.c |1 + drivers/net/ixgb/ixgb_hw.c |3 +- drivers/net/ixgb/ixgb_main.c| 57 ++ drivers/net/qla3xxx.c | 38 +++-- drivers/net/wireless/ipw2100.c |2 +- drivers/s390/net/qeth_main.c| 13 +--- include/net/ieee80211.h |2 +- 9 files changed, 88 insertions(+), 35 deletions(-) Aaron Salter (1): ixgb: Write RA register high word first, increment version Heiko Carstens (1): qeth: fix uaccess handling and get rid of unused variable Jeff Garzik (1): Revert e1000: disable TSO on the 82544 with slab debugging Jesse Brandeburg (2): ixgb: Fix early TSO completion ixgb: Maybe stop TX if not enough free descriptors Ron Mercer (2): qla3xxx: Remove NETIF_F_LLTX from driver features. qla3xxx: Add delay to NVRAM register access. Zhu Yi (2): ieee80211: WLAN_GET_SEQ_SEQ fix (select correct region) ipw2100: Fix dropping fragmented small packet problem diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 4c1ff75..c6259c7 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -995,12 +995,6 @@ e1000_probe(struct pci_dev *pdev, (adapter-hw.mac_type != e1000_82547)) netdev-features |= NETIF_F_TSO; -#ifdef CONFIG_DEBUG_SLAB - /* 82544's work arounds do not play nicely with DEBUG SLAB */ - if (adapter-hw.mac_type == e1000_82544) - netdev-features = ~NETIF_F_TSO; -#endif - #ifdef NETIF_F_TSO6 if (adapter-hw.mac_type e1000_82547_rev_2) netdev-features |= NETIF_F_TSO6; diff --git a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h index 50ffe90..f4aba43 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h @@ -171,6 +171,7 @@ struct ixgb_adapter { /* TX */ struct ixgb_desc_ring tx_ring cacheline_aligned_in_smp; + unsigned int restart_queue; unsigned long timeo_start; uint32_t tx_cmd_type; uint64_t hw_csum_tx_good; diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index cd22523..82c044d 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c @@ -79,6 +79,7 @@ static struct ixgb_stats ixgb_gstrings_stats[] = { {tx_window_errors, IXGB_STAT(net_stats.tx_window_errors)}, {tx_deferred_ok, IXGB_STAT(stats.dc)}, {tx_timeout_count, IXGB_STAT(tx_timeout_count) }, + {tx_restart_queue, IXGB_STAT(restart_queue) }, {rx_long_length_errors, IXGB_STAT(stats.roc)}, {rx_short_length_errors, IXGB_STAT(stats.ruc)}, #ifdef NETIF_F_TSO diff --git a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c index 02089b6..ecbf458 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c @@ -399,8 +399,9 @@ ixgb_init_rx_addrs(struct ixgb_hw *hw) /* Zero out the other 15 receive addresses. */ DEBUGOUT(Clearing RAR[1-15]\n); for(i = 1; i IXGB_RAR_ENTRIES; i++) { - IXGB_WRITE_REG_ARRAY(hw, RA, (i 1), 0); + /* Write high reg first to disable the AV bit first */ IXGB_WRITE_REG_ARRAY(hw, RA, ((i 1) + 1), 0); + IXGB_WRITE_REG_ARRAY(hw, RA, (i 1), 0); } return; diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index e628126..a083a91 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c @@ -36,7 +36,7 @@ static char ixgb_driver_string[] = Intel(R) PRO/10GbE Network Driver; #else #define DRIVERNAPI -NAPI #endif -#define DRV_VERSION1.0.117-k2DRIVERNAPI +#define DRV_VERSION1.0.126-k2DRIVERNAPI char ixgb_driver_version[] = DRV_VERSION; static char ixgb_copyright[] = Copyright (c) 1999-2006 Intel Corporation.; @@ -1287,6 +1287,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, struct ixgb_buffer *buffer_info; int len = skb-len; unsigned int offset = 0, size, count = 0, i; + unsigned int mss = skb_shinfo(skb)-gso_size; unsigned int nr_frags = skb_shinfo(skb)-nr_frags; unsigned int f; @@ -1298,6 +1299,11 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, while(len) { buffer_info = tx_ring-buffer_info[i]; size = min(len, IXGB_MAX_DATA_PER_TXD); + /* Workaround for premature desc write-backs +* in TSO mode. Append 4-byte sentinel desc */ + if (unlikely(mss !nr_frags size == len size 8)) + size -= 4; + buffer_info-length = size;
Re: [PATCH] INET: fix incorrect inet_sock-is_icsk assignment
On 04-01-2007 21:04, Paul Moore wrote: ... +++ net-2.6.20_bugfix_2/net/ipv4/af_inet.c @@ -305,7 +305,7 @@ lookup_protocol: sk-sk_reuse = 1; inet = inet_sk(sk); - inet-is_icsk = INET_PROTOSW_ICSK answer_flags; + inet-is_icsk = (INET_PROTOSW_ICSK answer_flags) == INET_PROTOSW_ICSK; Isn't this more readable like this?: inet-is_icsk = (INET_PROTOSW_ICSK answer_flags) != 0; Regards, Jarek P. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] INET: fix incorrect inet_sock-is_icsk assignment
On Monday, January 8 2007 8:25 am, Jarek Poplawski wrote: On 04-01-2007 21:04, Paul Moore wrote: +++ net-2.6.20_bugfix_2/net/ipv4/af_inet.c @@ -305,7 +305,7 @@ lookup_protocol: sk-sk_reuse = 1; inet = inet_sk(sk); - inet-is_icsk = INET_PROTOSW_ICSK answer_flags; + inet-is_icsk = (INET_PROTOSW_ICSK answer_flags) == INET_PROTOSW_ICSK; Isn't this more readable like this?: inet-is_icsk = (INET_PROTOSW_ICSK answer_flags) != 0; I guess it all depends on who is reading it ;) Personally, I don't care too much either way as long as it is fixed. -- paul moore linux security @ hp - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH]: 8139cp: Don't blindly enable interrupts in cp_start_xmit
All, Similar to this commit: http://kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=d15e9c4d9a75702b30e00cdf95c71c88e3f3f51e It's not safe in cp_start_xmit to blindly call spin_lock_irq and then spin_unlock_irq, since it may very well be the case that cp_start_xmit was called with interrupts already disabled (I came across this bug in the context of netdump in RedHat kernels, but the same issue holds, for example, in netconsole). Therefore, replace all instances of spin_lock_irq and spin_unlock_irq with spin_lock_irqsave and spin_unlock_irqrestore, respectively, in cp_start_xmit(). I tested this against a fully-virtualized Xen guest, which happens to use the 8139cp driver to talk to the emulated hardware. I don't have a real piece of 8139cp hardware to test on, so someone else will have to do that. Signed-off-by: Chris Lalancette [EMAIL PROTECTED] diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index e2cb19b..6f93a76 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c @@ -765,17 +765,18 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) struct cp_private *cp = netdev_priv(dev); unsigned entry; u32 eor, flags; + unsigned long intr_flags; #if CP_VLAN_TAG_USED u32 vlan_tag = 0; #endif int mss = 0; - spin_lock_irq(cp-lock); + spin_lock_irqsave(cp-lock, intr_flags); /* This is a hard error, log it. */ if (TX_BUFFS_AVAIL(cp) = (skb_shinfo(skb)-nr_frags + 1)) { netif_stop_queue(dev); - spin_unlock_irq(cp-lock); + spin_unlock_irqrestore(cp-lock, intr_flags); printk(KERN_ERR PFX %s: BUG! Tx Ring full when queue awake!\n, dev-name); return 1; @@ -908,7 +909,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) if (TX_BUFFS_AVAIL(cp) = (MAX_SKB_FRAGS + 1)) netif_stop_queue(dev); - spin_unlock_irq(cp-lock); + spin_unlock_irqrestore(cp-lock, intr_flags); cpw8(TxPoll, NormalTxPoll); dev-trans_start = jiffies;
[PATCH 3/5] s390: qeth driver fixes
[PATCH 3/5] s390: qeth driver fixes From: Frank Blaschka [EMAIL PROTECTED] - qeth device functions were not callable in atomic context due to usage of wait_event_xxx operations in qeth. schedule while atomic message appeared and kernel dumped when removing slave from bond device. Signed-off-by: Frank Pavlic [EMAIL PROTECTED] --- drivers/s390/net/qeth.h |2 - drivers/s390/net/qeth_main.c | 125 ++ 2 files changed, 30 insertions(+), 97 deletions(-) diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index 53c358c..e95c281 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h @@ -710,7 +710,7 @@ struct qeth_reply { int (*callback)(struct qeth_card *,struct qeth_reply *,unsigned long); u32 seqno; unsigned long offset; - int received; + atomic_t received; int rc; void *param; struct qeth_card *card; diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 337304d..19ec4c8 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -471,7 +471,7 @@ qeth_irq(struct ccw_device *cdev, unsign channel-state == CH_STATE_UP) qeth_issue_next_read(card); - tasklet_schedule(channel-irq_tasklet); + qeth_irq_tasklet((unsigned long)channel); return; out: wake_up(card-wait_q); @@ -951,40 +951,6 @@ qeth_do_run_thread(struct qeth_card *car } static int -qeth_register_ip_addresses(void *ptr) -{ - struct qeth_card *card; - - card = (struct qeth_card *) ptr; - daemonize(qeth_reg_ip); - QETH_DBF_TEXT(trace,4,regipth1); - if (!qeth_do_run_thread(card, QETH_SET_IP_THREAD)) - return 0; - QETH_DBF_TEXT(trace,4,regipth2); - qeth_set_ip_addr_list(card); - qeth_clear_thread_running_bit(card, QETH_SET_IP_THREAD); - return 0; -} - -/* - * Drive the SET_PROMISC_MODE thread - */ -static int -qeth_set_promisc_mode(void *ptr) -{ - struct qeth_card *card = (struct qeth_card *) ptr; - - daemonize(qeth_setprm); - QETH_DBF_TEXT(trace,4,setprm1); - if (!qeth_do_run_thread(card, QETH_SET_PROMISC_MODE_THREAD)) - return 0; - QETH_DBF_TEXT(trace,4,setprm2); - qeth_setadp_promisc_mode(card); - qeth_clear_thread_running_bit(card, QETH_SET_PROMISC_MODE_THREAD); - return 0; -} - -static int qeth_recover(void *ptr) { struct qeth_card *card; @@ -1047,11 +1013,6 @@ qeth_start_kernel_thread(struct work_str if (card-read.state != CH_STATE_UP card-write.state != CH_STATE_UP) return; - - if (qeth_do_start_thread(card, QETH_SET_IP_THREAD)) - kernel_thread(qeth_register_ip_addresses, (void *)card,SIGCHLD); - if (qeth_do_start_thread(card, QETH_SET_PROMISC_MODE_THREAD)) - kernel_thread(qeth_set_promisc_mode, (void *)card, SIGCHLD); if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) kernel_thread(qeth_recover, (void *) card, SIGCHLD); } @@ -1613,8 +1574,6 @@ qeth_issue_next_read(struct qeth_card *c return -ENOMEM; } qeth_setup_ccw(card-read, iob-data, QETH_BUFSIZE); - wait_event(card-wait_q, - atomic_cmpxchg(card-read.irq_pending, 0, 1) == 0); QETH_DBF_TEXT(trace, 6, noirqpnd); rc = ccw_device_start(card-read.ccwdev, card-read.ccw, (addr_t) iob, 0, 0); @@ -1635,6 +1594,7 @@ qeth_alloc_reply(struct qeth_card *card) reply = kzalloc(sizeof(struct qeth_reply), GFP_ATOMIC); if (reply){ atomic_set(reply-refcnt, 1); + atomic_set(reply-received, 0); reply-card = card; }; return reply; @@ -1655,31 +1615,6 @@ qeth_put_reply(struct qeth_reply *reply) kfree(reply); } -static void -qeth_cmd_timeout(unsigned long data) -{ - struct qeth_reply *reply, *list_reply, *r; - unsigned long flags; - - reply = (struct qeth_reply *) data; - spin_lock_irqsave(reply-card-lock, flags); - list_for_each_entry_safe(list_reply, r, -reply-card-cmd_waiter_list, list) { - if (reply == list_reply){ - qeth_get_reply(reply); - list_del_init(reply-list); - spin_unlock_irqrestore(reply-card-lock, flags); - reply-rc = -ETIME; - reply-received = 1; - wake_up(reply-wait_q); - qeth_put_reply(reply); - return; - } - } - spin_unlock_irqrestore(reply-card-lock, flags); -} - - static struct qeth_ipa_cmd * qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob) { @@ -1745,7 +1680,7 @@ qeth_clear_ipacmd_list(struct qeth_card
[PATCH 2/5] s390: qeth driver fixes
[PATCH 2/5] s390: qeth driver fixes From: Frank Blaschka [EMAIL PROTECTED] - packet socket support is not complete. Recvfrom a packet socket does not fill the sockaddr_ll structure. device function hard_header_parse is not implemented. For layer 2 mode and layer 3 mode with fake_ll turned on, we have the information to fill sockaddr_ll. Signed-off-by: Frank Pavlic [EMAIL PROTECTED] --- drivers/s390/net/qeth_main.c | 58 ++ 1 files changed, 53 insertions(+), 5 deletions(-) diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 67062d5..337304d 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -3953,13 +3953,22 @@ static inline struct sk_buff * qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb, struct qeth_hdr **hdr, int ipv) { - struct sk_buff *new_skb; + struct sk_buff *new_skb, *new_skb2; QETH_DBF_TEXT(trace, 6, prepskb); - -new_skb = qeth_realloc_headroom(card, skb, sizeof(struct qeth_hdr)); - if (new_skb == NULL) + new_skb = skb; + new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC); + if (!new_skb) return NULL; + new_skb2 = qeth_realloc_headroom(card, new_skb, +sizeof(struct qeth_hdr)); + if (!new_skb2) { + __qeth_free_new_skb(skb, new_skb); + return NULL; + } + if (new_skb != skb) + __qeth_free_new_skb(new_skb2, new_skb); + new_skb = new_skb2; *hdr = __qeth_prepare_skb(card, new_skb, ipv); if (*hdr == NULL) { __qeth_free_new_skb(skb, new_skb); @@ -6336,6 +6345,42 @@ static struct ethtool_ops qeth_ethtool_o }; static int +qeth_hard_header_parse(struct sk_buff *skb, unsigned char *haddr) +{ + struct qeth_card *card; + struct ethhdr *eth; + + card = qeth_get_card_from_dev(skb-dev); + if (card-options.layer2) + goto haveheader; +#ifdef CONFIG_QETH_IPV6 + /* cause of the manipulated arp constructor and the ARP + flag for OSAE devices we have some nasty exceptions */ + if (card-info.type == QETH_CARD_TYPE_OSAE) { + if (!card-options.fake_ll) { + if ((skb-pkt_type==PACKET_OUTGOING) + (skb-protocol==ETH_P_IPV6)) + goto haveheader; + else + return 0; + } else { + if ((skb-pkt_type==PACKET_OUTGOING) + (skb-protocol==ETH_P_IP)) + return 0; + else + goto haveheader; + } + } +#endif + if (!card-options.fake_ll) + return 0; +haveheader: + eth = eth_hdr(skb); + memcpy(haddr, eth-h_source, ETH_ALEN); + return ETH_ALEN; +} + +static int qeth_netdev_init(struct net_device *dev) { struct qeth_card *card; @@ -6373,7 +6418,10 @@ #endif if (card-options.fake_ll (qeth_get_netdev_flags(card) IFF_NOARP)) dev-hard_header = qeth_fake_header; - dev-hard_header_parse = NULL; + if (dev-type == ARPHRD_IEEE802_TR) + dev-hard_header_parse = NULL; + else + dev-hard_header_parse = qeth_hard_header_parse; dev-set_mac_address = qeth_layer2_set_mac_address; dev-flags |= qeth_get_netdev_flags(card); if ((card-options.fake_broadcast) || -- 1.4.2.3 - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 4/5] s390: iucv Kconfig help description changes
[PATCH 4/5] s390: iucv Kconfig help description changes From: Ursula Braun [EMAIL PROTECTED] remove text from help description which does not apply anymore for 2.6 kernel series. Signed-off-by: Frank Pavlic [EMAIL PROTECTED] --- drivers/s390/net/Kconfig |5 + 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig index 1a93fa6..5262515 100644 --- a/drivers/s390/net/Kconfig +++ b/drivers/s390/net/Kconfig @@ -27,10 +27,7 @@ config IUCV help Select this option if you want to use inter-user communication under VM or VIF. If unsure, say Y to enable a fast communication - link between VM guests. At boot time the user ID of the guest needs - to be passed to the kernel. Note that both kernels need to be - compiled with this option and both need to be booted with the user ID - of the other VM guest. + link between VM guests. config NETIUCV tristate IUCV network device support (VM only) -- 1.4.2.3 - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/5] s390: qeth driver fixes
Hi , please apply following 5 patches for s390 network device drivers. Sorry for the fifth patch containing some lines which just remove whitespaces. Another patch will follow in the next couple of days with more whitespace and coding style cleanups in drivers/s390/net. Thank you Frank [PATCH 1/5] s390: qeth driver fixes From: Frank Blaschka [EMAIL PROTECTED] From: Ursula Braun [EMAIL PROTECTED] - VLAN header reordering did not work on packets received through qeth interface in layer 2 mode. This caused dhcpcd not to work with VLAN devices. - set qeth performance statistics initally inactive Signed-off-by: Frank Pavlic [EMAIL PROTECTED] --- drivers/s390/net/qeth_main.c | 21 +++-- 1 files changed, 3 insertions(+), 18 deletions(-) diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 2bde4f1..67062d5 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -1074,7 +1074,7 @@ #endif /* QETH_IPV6 */ card-options.layer2 = 1; else card-options.layer2 = 0; - card-options.performance_stats = 1; + card-options.performance_stats = 0; } /** @@ -2466,32 +2466,17 @@ qeth_rebuild_skb_fake_ll(struct qeth_car qeth_rebuild_skb_fake_ll_eth(card, skb, hdr); } -static inline __u16 +static inline void qeth_layer2_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, struct qeth_hdr *hdr) { - unsigned short vlan_id = 0; -#ifdef CONFIG_QETH_VLAN - struct vlan_hdr *vhdr; -#endif - skb-pkt_type = PACKET_HOST; skb-protocol = qeth_type_trans(skb, skb-dev); if (card-options.checksum_type == NO_CHECKSUMMING) skb-ip_summed = CHECKSUM_UNNECESSARY; else skb-ip_summed = CHECKSUM_NONE; -#ifdef CONFIG_QETH_VLAN - if (hdr-hdr.l2.flags[2] (QETH_LAYER2_FLAG_VLAN)) { - vhdr = (struct vlan_hdr *) skb-data; - skb-protocol = - __constant_htons(vhdr-h_vlan_encapsulated_proto); - vlan_id = hdr-hdr.l2.vlan_id; - skb_pull(skb, VLAN_HLEN); - } -#endif *((__u32 *)skb-cb) = ++card-seqno.pkt_seqno; - return vlan_id; } static inline __u16 @@ -2571,7 +2556,7 @@ qeth_process_inbound_buffer(struct qeth_ offset, hdr))) { skb-dev = card-dev; if (hdr-hdr.l2.id == QETH_HEADER_TYPE_LAYER2) - vlan_tag = qeth_layer2_rebuild_skb(card, skb, hdr); + qeth_layer2_rebuild_skb(card, skb, hdr); else if (hdr-hdr.l3.id == QETH_HEADER_TYPE_LAYER3) vlan_tag = qeth_rebuild_skb(card, skb, hdr); else { /*in case of OSN*/ -- 1.4.2.3 - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 5/5] s390: qeth driver hardware specs adaptions
[PATCH 5/5] s390: qeth driver hardware specs adaptions From: Peter Tiedemann [EMAIL PROTECTED] - according to the latest OSA hardware specification incorporate actual IPA command and return codes into qeth. - whitespaces removed from qeth_mpc.h Signed-off-by: Frank Pavlic [EMAIL PROTECTED] --- drivers/s390/net/qeth_main.c | 10 ++ drivers/s390/net/qeth_mpc.c | 101 +++ drivers/s390/net/qeth_mpc.h | 220 -- 3 files changed, 238 insertions(+), 93 deletions(-) diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 19ec4c8..be4f815 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -1919,6 +1919,9 @@ qeth_send_ipa_cmd(struct qeth_card *card { int rc; char prot_type; + int cmd; + cmd = ((struct qeth_ipa_cmd *) + (iob-data+IPA_PDU_HEADER_SIZE))-hdr.command; QETH_DBF_TEXT(trace,4,sendipa); @@ -1932,6 +1935,12 @@ qeth_send_ipa_cmd(struct qeth_card *card qeth_prepare_ipa_cmd(card,iob,prot_type); rc = qeth_send_control_data(card, IPA_CMD_LENGTH, iob, reply_cb, reply_param); + if (rc != 0) { + char * ipa_cmd_name; + ipa_cmd_name = qeth_get_ipa_cmd_name(cmd); + printk(%s %s(%x) returned %s(%x)\n,__FUNCTION__, + ipa_cmd_name, cmd, qeth_get_ipa_msg(rc), rc); + } return rc; } @@ -2486,7 +2495,6 @@ qeth_process_inbound_buffer(struct qeth_ int offset; int rxrc; __u16 vlan_tag = 0; - __u16 *vlan_addr; /* get first element of current buffer */ element = (struct qdio_buffer_element *)buf-buffer-element[0]; diff --git a/drivers/s390/net/qeth_mpc.c b/drivers/s390/net/qeth_mpc.c index 77c8320..f54fdfd 100644 --- a/drivers/s390/net/qeth_mpc.c +++ b/drivers/s390/net/qeth_mpc.c @@ -157,12 +157,113 @@ unsigned char READ_CCW[]={ }; +struct ipa_rc_msg { + enum qeth_ipa_return_codes rc; + char *msg; +}; +struct ipa_rc_msg qeth_ipa_rc_msg[] = { + {IPA_RC_SUCCESS,success}, + {IPA_RC_NOTSUPP,Command not supported}, + {IPA_RC_IP_TABLE_FULL, Add Addr IP Table Full - ipv6}, + {IPA_RC_UNKNOWN_ERROR, IPA command failed - reason unknown}, + {IPA_RC_UNSUPPORTED_COMMAND,Command not supported}, + {IPA_RC_DUP_IPV6_REMOTE,ipv6 address already registered remote}, + {IPA_RC_DUP_IPV6_HOME, ipv6 address already registered}, + {IPA_RC_UNREGISTERED_ADDR, Address not registered}, + {IPA_RC_NO_ID_AVAILABLE,No identifiers available}, + {IPA_RC_ID_NOT_FOUND, Identifier not found}, + {IPA_RC_INVALID_IP_VERSION, IP version incorrect}, + {IPA_RC_LAN_FRAME_MISMATCH, LAN and frame mismatch}, + {IPA_RC_L2_UNSUPPORTED_CMD, Unsupported layer 2 command}, + {IPA_RC_L2_DUP_MAC, Duplicate MAC address}, + {IPA_RC_L2_ADDR_TABLE_FULL, Layer2 address table full}, + {IPA_RC_L2_DUP_LAYER3_MAC, Duplicate with layer 3 MAC}, + {IPA_RC_L2_GMAC_NOT_FOUND, GMAC not found}, + {IPA_RC_L2_MAC_NOT_FOUND, L2 mac address not found}, + {IPA_RC_L2_INVALID_VLAN_ID, L2 invalid vlan id}, + {IPA_RC_L2_DUP_VLAN_ID, L2 duplicate vlan id}, + {IPA_RC_L2_VLAN_ID_NOT_FOUND, L2 vlan id not found}, + {IPA_RC_DATA_MISMATCH, Data field mismatch (v4/v6 mixed)}, + {IPA_RC_INVALID_MTU_SIZE, Invalid MTU size}, + {IPA_RC_INVALID_LANTYPE,Invalid LAN type}, + {IPA_RC_INVALID_LANNUM, Invalid LAN num}, + {IPA_RC_DUPLICATE_IP_ADDRESS, Address already registered}, + {IPA_RC_IP_ADDR_TABLE_FULL, IP address table full}, + {IPA_RC_LAN_PORT_STATE_ERROR, LAN port state error}, + {IPA_RC_SETIP_NO_STARTLAN, Setip no startlan received}, + {IPA_RC_SETIP_ALREADY_RECEIVED, Setip already received}, + {IPA_RC_IP_ADDR_ALREADY_USED, IP address already in use on LAN}, + {IPA_RC_MULTICAST_FULL, No task available, multicast full}, + {IPA_RC_SETIP_INVALID_VERSION, SETIP invalid IP version}, + {IPA_RC_UNSUPPORTED_SUBCMD, Unsupported assist subcommand}, + {IPA_RC_ARP_ASSIST_NO_ENABLE, Only partial success, no enable}, + {IPA_RC_PRIMARY_ALREADY_DEFINED,Primary already defined}, + {IPA_RC_SECOND_ALREADY_DEFINED, Secondary already defined}, + {IPA_RC_INVALID_SETRTG_INDICATOR,Invalid SETRTG indicator}, + {IPA_RC_MC_ADDR_ALREADY_DEFINED,Multicast address already defined}, + {IPA_RC_LAN_OFFLINE,STRTLAN_LAN_DISABLED - LAN offline}, + {IPA_RC_INVALID_IP_VERSION2,Invalid IP version}, + {IPA_RC_, Unknown Error} +}; +char * +qeth_get_ipa_msg(enum qeth_ipa_return_codes
Re: BUG: soft lockup detected on CPU#0! (2.6.18.2 plus hacks)
Jarek Poplawski wrote: On Fri, Jan 05, 2007 at 12:33:43PM -0800, Ben Greear wrote: ... So, I do believe this was the problem we were hitting, and it seems fixed. Congratulations! But I can see one strange thing in vlan.c: /* Must be invoked with RCU read lock (no preempt) */ static struct vlan_group *__vlan_find_group(int real_dev_ifindex) ... * Must be invoked with RCU read lock (no preempt) */ struct net_device *__find_vlan_dev(struct net_device *real_dev, ... But later in this file no sign of disabling preemption for these calls and for hlist_add_head_rcu and hlist_del_rcu. I can't imagine how this works? Perhaps...I didn't RCU-ify VLANs, but I can take a look. For the record, the soft lockup was using MAC-VLANs, not 802.1Q VLANs, so it wouldn't have been affected by bugs in VLANs one way or the other. Ben Jarek P. -- Ben Greear [EMAIL PROTECTED] Candela Technologies Inc http://www.candelatech.com - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Question on advanced routing and/or virtual routers.
Hello! I am curious if a single machine can be made to look like several routers. Please consider the following configuration: Linux Router-A has 4 ethernet interfaces. PC-A is connected to eth0 and has IP 192.168.0.2. eth0 on Router-A has IP 192.168.0.1/24 eth1 has IP 192.168.1.1/24, and eth1 is connected directly to eth2 eth2 has IP 192.168.2.1/24 eth3 is connected 'upstream' and has IP 192.168.3.1/24 I would like for PC-A to be able to ping 192.168.0.1 and 192.168.1.1 as normal. The part I'm not sure how to make work is that I want to be able to ping 192.168.2.1 and have the packet route out of eth1 and into eth2 (PC-A - eth0 - eth1 - eth2), and have the return packet follow the eth2 - eth1 - eth0 - PC-A path. A trace-route from PC-A should show each of these hops (or, at least eth0 and eth2.) The eventual goal is to have arbitrary numbers of 'routers' in a single Linux machine for emulation purposes. I was thinking that I might could accomplish this using multiple routing tables and perhaps specific subnet routes for each each virtual router, specifying which interface the packets should leave in order to find the next hop. Has anyone tried something similar to this or have ideas for how to best proceed? Thanks, Ben -- Ben Greear [EMAIL PROTECTED] Candela Technologies Inc http://www.candelatech.com - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: BUG: soft lockup detected on CPU#0! (2.6.18.2 plus hacks)
On Mon, 08 Jan 2007 08:57:10 -0800 Ben Greear [EMAIL PROTECTED] wrote: Jarek Poplawski wrote: On Fri, Jan 05, 2007 at 12:33:43PM -0800, Ben Greear wrote: ... So, I do believe this was the problem we were hitting, and it seems fixed. Congratulations! But I can see one strange thing in vlan.c: /* Must be invoked with RCU read lock (no preempt) */ static struct vlan_group *__vlan_find_group(int real_dev_ifindex) ... * Must be invoked with RCU read lock (no preempt) */ struct net_device *__find_vlan_dev(struct net_device *real_dev, ... But later in this file no sign of disabling preemption for these calls and for hlist_add_head_rcu and hlist_del_rcu. I can't imagine how this works? Preempt is already disabled on the receive path. Perhaps...I didn't RCU-ify VLANs, but I can take a look. For the record, the soft lockup was using MAC-VLANs, not 802.1Q VLANs, so it wouldn't have been affected by bugs in VLANs one way or the other. Ben Jarek P. -- Stephen Hemminger [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Question on advanced routing and/or virtual routers.
On Monday, 08 January 2007 at 09:08, Ben Greear wrote: Hello! I am curious if a single machine can be made to look like several routers. Please consider the following configuration: Linux Router-A has 4 ethernet interfaces. PC-A is connected to eth0 and has IP 192.168.0.2. eth0 on Router-A has IP 192.168.0.1/24 eth1 has IP 192.168.1.1/24, and eth1 is connected directly to eth2 eth2 has IP 192.168.2.1/24 eth3 is connected 'upstream' and has IP 192.168.3.1/24 I would like for PC-A to be able to ping 192.168.0.1 and 192.168.1.1 as normal. The part I'm not sure how to make work is that I want to be able to ping 192.168.2.1 and have the packet route out of eth1 and into eth2 (PC-A - eth0 - eth1 - eth2), and have the return packet follow the eth2 - eth1 - eth0 - PC-A path. A trace-route from PC-A should show each of these hops (or, at least eth0 and eth2.) The eventual goal is to have arbitrary numbers of 'routers' in a single Linux machine for emulation purposes. I was thinking that I might could accomplish this using multiple routing tables and perhaps specific subnet routes for each each virtual router, specifying which interface the packets should leave in order to find the next hop. Has anyone tried something similar to this or have ideas for how to best proceed? I started something like this a while ago (posted at [EMAIL PROTECTED] with a couple of replies by Thomas Graf, but I can't seem to find it in the archives) but then dropped the ball. It seems to work fairly well with a one-line kernel patch to allow route lookup before the local address check. Oh, and I didn't get traceroute working quite right either - I think there was some trick to finding the source address for the generated reply. I've got some info and code here: http://dsg.cs.ubc.ca/~brendan/remus/ - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 3/3] chelsio: more rx speedup
Cleanup receive processing some more: * do the reserve padding of skb during setup * don't pass constants to get_packet * do smart prefetch of skb * make copybreak a module parameter Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- drivers/net/chelsio/sge.c | 87 +++--- 1 file changed, 45 insertions(+), 42 deletions(-) --- netdev-2.6.orig/drivers/net/chelsio/sge.c +++ netdev-2.6/drivers/net/chelsio/sge.c @@ -71,12 +71,9 @@ #define SGE_FREEL_REFILL_THRESH16 #define SGE_RESPQ_E_N 1024 #define SGE_INTRTIMER_NRES 1000 -#define SGE_RX_COPY_THRES 256 #define SGE_RX_SM_BUF_SIZE 1536 #define SGE_TX_DESC_MAX_PLEN 16384 -# define SGE_RX_DROP_THRES 2 - #define SGE_RESPQ_REPLENISH_THRES (SGE_RESPQ_E_N / 4) /* @@ -846,6 +843,8 @@ static void refill_free_list(struct sge skb_reserve(skb, q-dma_offset); mapping = pci_map_single(pdev, skb-data, dma_len, PCI_DMA_FROMDEVICE); + skb_reserve(skb, sge-rx_pkt_pad); + ce-skb = skb; pci_unmap_addr_set(ce, dma_addr, mapping); pci_unmap_len_set(ce, dma_len, dma_len); @@ -1024,6 +1023,10 @@ static void recycle_fl_buf(struct freelQ } } +static int copybreak __read_mostly = 256; +module_param(copybreak, int, 0); +MODULE_PARM_DESC(copybreak, Receive copy threshold); + /** * get_packet - return the next ingress packet buffer * @pdev: the PCI device that received the packet @@ -1043,45 +1046,42 @@ static void recycle_fl_buf(struct freelQ * be copied but there is no memory for the copy. */ static inline struct sk_buff *get_packet(struct pci_dev *pdev, -struct freelQ *fl, unsigned int len, -int dma_pad, int skb_pad, -unsigned int copy_thres, -unsigned int drop_thres) +struct freelQ *fl, unsigned int len) { struct sk_buff *skb; - struct freelQ_ce *ce = fl-centries[fl-cidx]; + const struct freelQ_ce *ce = fl-centries[fl-cidx]; - if (len copy_thres) { - skb = alloc_skb(len + skb_pad, GFP_ATOMIC); - if (likely(skb != NULL)) { - skb_reserve(skb, skb_pad); - skb_put(skb, len); - pci_dma_sync_single_for_cpu(pdev, - pci_unmap_addr(ce, dma_addr), - pci_unmap_len(ce, dma_len), - PCI_DMA_FROMDEVICE); - memcpy(skb-data, ce-skb-data + dma_pad, len); - pci_dma_sync_single_for_device(pdev, + if (len copybreak) { + skb = alloc_skb(len + 2, GFP_ATOMIC); + if (!skb) + goto use_orig_buf; + + skb_reserve(skb, 2);/* align IP header */ + skb_put(skb, len); + pci_dma_sync_single_for_cpu(pdev, pci_unmap_addr(ce, dma_addr), pci_unmap_len(ce, dma_len), PCI_DMA_FROMDEVICE); - } else if (!drop_thres) - goto use_orig_buf; - + memcpy(skb-data, ce-skb-data, len); + pci_dma_sync_single_for_device(pdev, + pci_unmap_addr(ce, dma_addr), + pci_unmap_len(ce, dma_len), + PCI_DMA_FROMDEVICE); recycle_fl_buf(fl, fl-cidx); return skb; } - if (fl-credits drop_thres) { +use_orig_buf: + if (fl-credits 2) { recycle_fl_buf(fl, fl-cidx); return NULL; } -use_orig_buf: pci_unmap_single(pdev, pci_unmap_addr(ce, dma_addr), pci_unmap_len(ce, dma_len), PCI_DMA_FROMDEVICE); skb = ce-skb; - skb_reserve(skb, dma_pad); + prefetch(skb-data); + skb_put(skb, len); return skb; } @@ -1359,27 +1359,25 @@ static void restart_sched(unsigned long * * Process an ingress ethernet pakcet and deliver it to the stack. */ -static int sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len) +static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len) { struct sk_buff *skb; - struct cpl_rx_pkt *p; + const struct cpl_rx_pkt *p; struct adapter *adapter = sge-adapter; struct sge_port_stats *st; - skb = get_packet(adapter-pdev, fl, len - sge-rx_pkt_pad, -sge-rx_pkt_pad, 2, SGE_RX_COPY_THRES, -
[PATCH 2/3] chelsio: NAPI speed improvement
Speedup and cleanup the receive processing by eliminating the mmio read and a lock round trip. Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- drivers/net/chelsio/sge.c | 77 -- 1 file changed, 35 insertions(+), 42 deletions(-) --- netdev-2.6.orig/drivers/net/chelsio/sge.c +++ netdev-2.6/drivers/net/chelsio/sge.c @@ -1559,6 +1559,14 @@ static int process_responses(struct adap return budget; } +static inline int responses_pending(const struct adapter *adapter) +{ + const struct respQ *Q = adapter-sge-respQ; + const struct respQ_e *e = Q-entries[Q-cidx]; + + return (e-GenerationBit == Q-genbit); +} + #ifdef CONFIG_CHELSIO_T1_NAPI /* * A simpler version of process_responses() that handles only pure (i.e., @@ -1568,13 +1576,16 @@ static int process_responses(struct adap * which the caller must ensure is a valid pure response. Returns 1 if it * encounters a valid data-carrying response, 0 otherwise. */ -static int process_pure_responses(struct adapter *adapter, struct respQ_e *e) +static int process_pure_responses(struct adapter *adapter) { struct sge *sge = adapter-sge; struct respQ *q = sge-respQ; + struct respQ_e *e = q-entries[q-cidx]; unsigned int flags = 0; unsigned int cmdq_processed[SGE_CMDQ_N] = {0, 0}; + if (e-DataValid) + return 1; do { flags |= e-Qsleeping; @@ -1610,23 +1621,20 @@ static int process_pure_responses(struct int t1_poll(struct net_device *dev, int *budget) { struct adapter *adapter = dev-priv; - int effective_budget = min(*budget, dev-quota); - int work_done = process_responses(adapter, effective_budget); + int work_done; + work_done = process_responses(adapter, min(*budget, dev-quota)); *budget -= work_done; dev-quota -= work_done; - if (work_done = effective_budget) + if (unlikely(responses_pending(adapter))) return 1; - spin_lock_irq(adapter-async_lock); - __netif_rx_complete(dev); + netif_rx_complete(dev); writel(adapter-sge-respQ.cidx, adapter-regs + A_SG_SLEEPING); - writel(adapter-slow_intr_mask | F_PL_INTR_SGE_DATA, - adapter-regs + A_PL_ENABLE); - spin_unlock_irq(adapter-async_lock); return 0; + } /* @@ -1635,44 +1643,33 @@ int t1_poll(struct net_device *dev, int irqreturn_t t1_interrupt(int irq, void *data) { struct adapter *adapter = data; - struct net_device *dev = adapter-sge-netdev; struct sge *sge = adapter-sge; - u32 cause; - int handled = 0; + int handled; - cause = readl(adapter-regs + A_PL_CAUSE); - if (cause == 0 || cause == ~0) - return IRQ_NONE; - - spin_lock(adapter-async_lock); - if (cause F_PL_INTR_SGE_DATA) { - struct respQ *q = adapter-sge-respQ; - struct respQ_e *e = q-entries[q-cidx]; + if (likely(responses_pending(adapter))) { + struct net_device *dev = sge-netdev; - handled = 1; writel(F_PL_INTR_SGE_DATA, adapter-regs + A_PL_CAUSE); - if (e-GenerationBit == q-genbit - __netif_rx_schedule_prep(dev)) { - if (e-DataValid || process_pure_responses(adapter, e)) { - /* mask off data IRQ */ - writel(adapter-slow_intr_mask, - adapter-regs + A_PL_ENABLE); - __netif_rx_schedule(sge-netdev); - goto unlock; + if (__netif_rx_schedule_prep(dev)) { + if (process_pure_responses(adapter)) + __netif_rx_schedule(dev); + else { + /* no data, no NAPI needed */ + writel(sge-respQ.cidx, adapter-regs + A_SG_SLEEPING); + netif_poll_enable(dev); /* undo schedule_prep */ } - /* no data, no NAPI needed */ - netif_poll_enable(dev); - } - writel(q-cidx, adapter-regs + A_SG_SLEEPING); - } else - handled = t1_slow_intr_handler(adapter); + return IRQ_HANDLED; + } + + spin_lock(adapter-async_lock); + handled = t1_slow_intr_handler(adapter); + spin_unlock(adapter-async_lock); if (!handled) sge-stats.unhandled_irqs++; -unlock: - spin_unlock(adapter-async_lock); + return IRQ_RETVAL(handled != 0); } @@ -1695,17 +1692,13 @@ unlock: irqreturn_t t1_interrupt(int irq, void *cookie) { int work_done; - struct respQ_e *e; struct adapter *adapter = cookie; - struct respQ *Q = adapter-sge-respQ;
Re: d80211: How does TX flow control work?
Jan Kiszka wrote: Jan Kiszka wrote: Jiri Benc wrote: On Wed, 03 Jan 2007 19:10:01 +0100, Jan Kiszka wrote: BUG: warning at /usr/src/rt2x00/rt2x00/ieee80211/ieee80211.c:1256/ieee80211_tx() cfa02245 ieee80211_master_start_xmit+0x105/0x430 [80211] c024e35d __ip_ct_refresh_acct+0x4d/0x60 c024fd11 tcp_packet+0x941/0x970 c0217442 qdisc_restart+0x92/0x100 c020d43d dev_queue_xmit+0xbd/0x1a0 cfa050d8 ieee80211_subif_start_xmit+0x468/0x480 [80211] c0207dca skb_clone+0x3a/0x1a0 c021d16d nf_hook_slow+0x4d/0xc0 c020d495 dev_queue_xmit+0x115/0x1a0 c0226a63 ip_output+0x1c3/0x200 c0225740 ip_finish_output+0x0/0x180 c022628b ip_queue_xmit+0x36b/0x3b0 c0224130 dst_output+0x0/0x10 ce9bae7d usb_hcd_giveback_urb+0x2d/0x60 [usbcore] c0237da2 tcp_v4_send_check+0x82/0xd0 c0237da2 tcp_v4_send_check+0x82/0xd0 c0233244 tcp_transmit_skb+0x5e4/0x610 c0234b36 __tcp_push_pending_frames+0x676/0x740 c0207f81 __alloc_skb+0x51/0x100 c022b817 tcp_sendmsg+0x897/0x980 c0153fa9 core_sys_select+0x1b9/0x2b0 c0241f1d inet_sendmsg+0x3d/0x50 c0202a8f do_sock_write+0x8f/0xa0 c020301f sock_aio_write+0x5f/0x70 c01443d3 do_sync_write+0xc3/0x100 c01247f0 autoremove_wake_function+0x0/0x40 c0144ca1 vfs_write+0xa1/0x140 c01451d3 sys_write+0x43/0x70 c0102ae7 syscall_call+0x7/0xb Does it tell you anything already? Is there something I may instrument? What could the driver do wrong to trigger such bug? Do you have CONFIG_NET_SCHED enabled? Sorry, this was most probably false alarm for the official stack. The problem now appears to be related to a patch against d80211 that is only present in the rt2x00 CVS. Well, I said most probably... The actual problem was meanwhile identified: shorewall happened to overwrite the queueing discipline of wmaster0 with pfifo_fast. I found the magic knob to tell shorewall to no longer do this (at least until I want to manage traffic control that way...), but I still wonder if it is an acceptable situation. Currently, the user can intentionally or accidentally screw up the stack this way. Jan PS: Tests performed on a 2.6.17 kernel, but I don't see a reason why newer kernels should be immune. signature.asc Description: OpenPGP digital signature
Re: [PATCH/RFC 00/10] Transparent proxying patches version 4
Hi Evgeniy, On Wednesday 03 January 2007 18:23, Evgeniy Polyakov wrote: Out of curiosity, would you use netchannels [1] if the implementation will be much broader? Since what you have created works exactly like netchannels netfilter NAT target (although it does not change ports, but it can be trivially extended), but without all existing netfilter overhead and without hacks in core TCP/UDP/IP/route code. Indeed, a netchannels based implementation would be very nice. Combined with a userspace network stack I think this could be a very powerful tool, especially for people doing dirty tricks -- like transparent proxying in our case. However, I think that adopting netchannels now would be an enormous work on our part. Of course, personally I'm really interested in netchannels and the related projects, but I agree with Harald that we still have a long way to go before being able to switch to netchannels. And I definitely _hate_ the previous incarnations of our tproxy patches enough that even this patchset seems acceptable for me. ;) -- Regards, Krisztian Kovacs - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
wireless-dev updated (sync w/ 2.6.20-rc3 + lots of new stuff)
Lots of wireless-dev activity around the holidays...still catching-up... I got stuff compiling, so I thought I'd push it out. John --- The following changes since commit 3622152cf1ed4613addde30bce9cd9f71d17efa2: John W. Linville (1): Merge branch 'from-linus' are found in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-dev.git David Kimdon (9): d80211: allow for hardware crypto of default keys d80211: set default_wep_only dynamically d80211: fix potential interface name overflow d80211: fix potential invalid array index returning key information d80211: remove unused references to sub interface data d80211: fix invalid check for sub interface type AP d80211: do not pass an invalid key index to set_key() d80211: clear ifsta-associated flag when authentication starts d80211: inhibit duplicate authentication requests when setting bssid Jan Kiszka (1): d80211: Reinit keys on mode change Jiri Benc (5): Merge branch 'from-john' d80211: simplify classify_1d d80211: small documentation fix d80211: do not cancel uninitialized work rt2x00: fix breakage after pkt_type field was removed Johannes Berg (3): d80211: add missing \n in skb queue warning fix some wireless ext stuff fix cfg80211 WE compat code John W. Linville (8): Merge branch 'up' of git://git.kernel.org/.../jbenc/dscape Merge branch 'adm8211-week51' of git://git.kernel.org/.../mwu/d80211-drivers Merge branch 'p54-week51' of git://git.kernel.org/.../mwu/d80211-drivers Merge branch 'zd1211rw-week51' of git://git.kernel.org/.../mwu/d80211-drivers Merge branch 'up2' of git://git.kernel.org/.../jbenc/dscape cfg80211: fix build breakage from genlmsg_put signature change bcm43xx, rt2x00: fix build breakage from INIT_DELAYED_WORK changes zd1211rw-d80211: port INIT_DELAYED_WORK changes from mainline Michael Buesch (7): d80211: Fix errorcode in ieee80211_update_hw d80211: Fix passing of invalid pointer d80211: Fix 64bit printk warnings d80211: Turn PHYmode list from an array into a linked list d80211: constify ieee80211_ops pointer bcm43xx-d80211: Fix for PHYmode API change. rt2x00: Fix compilation for d80211 hwmode API change Michael Wu (31): d80211: remove pkt_type/pkt_probe_resp d80211: move 802.11 defines to linux/ieee80211.h d80211: merge d80211_shared.h into d80211.h d80211: merge d80211_mgmt.h into linux/ieee80211.h d80211: move d80211_common.h to net/d80211 zd1211rw-d80211: Fix of a locking bug zd1211rw-d80211: Revert zd1211rw: Removed unneeded packed attributes zd1211rw-d80211: Add 3 more device IDs zd1211rw-d80211: Add ID for ZyXEL G-220 zd1211rw-d80211: Add ID for Planex GW-US54Mini zd1211rw-d80211: Add ID for Belkin F5D7050 v4000 zd1211rw-d80211: cleanups zd1211rw-d80211: Optimized handling of zero length entries in length info zd1211rw-d80211: check IEEE80211_TXCTL_USE_CTS_PROTECT zd1211rw-d80211: Use ieee80211_tx_status p54: fix device memory allocator p54: fix TX of encrypted frames p54: remove unnecessary use of __constant_cpu_to_* p54: use hardware RX frequency reporting p54: use link LED p54: fix issues found by sparse p54: set phymode in RX zd1211rw-d80211: 2 new ZD1211B device ID's zd1211rw-d80211: Add ID for Linksys WUSBF54G adm8211: set phymode in RX d80211: fix wep.c breakage d80211: fix wme.c breakage d80211: fix workqueue breakage adm8211: Fix compilation for d80211 hwmode API change p54: Fix compilation for d80211 hwmode API change zd1211rw-d80211: Fix compilation for d80211 hwmode API change Mohamed Abbas (1): d80211: add mising sta_info_put function Zhu Yi (1): d80211: fix classify_1d() priority selection drivers/net/wireless/d80211/adm8211/adm8211.c |9 +- drivers/net/wireless/d80211/adm8211/adm8211.h |2 +- drivers/net/wireless/d80211/bcm43xx/bcm43xx.h |6 +- drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c | 68 +++-- drivers/net/wireless/d80211/p54/prism54.h |3 +- drivers/net/wireless/d80211/p54/prism54common.c| 123 +--- drivers/net/wireless/d80211/p54/prism54common.h| 15 +- drivers/net/wireless/d80211/p54/prism54pci.c | 65 ++-- drivers/net/wireless/d80211/p54/prism54usb.c | 105 drivers/net/wireless/d80211/rt2x00/rt2400pci.c | 130 + drivers/net/wireless/d80211/rt2x00/rt2400pci.h |6 +- drivers/net/wireless/d80211/rt2x00/rt2500pci.c | 170 ++- drivers/net/wireless/d80211/rt2x00/rt2500pci.h |6 +- drivers/net/wireless/d80211/rt2x00/rt2500usb.c | 170 ++- drivers/net/wireless/d80211/rt2x00/rt2500usb.h |6 +-
[BNX2 1/4]: Don't apply CRC PHY workaround to 5709.
[BNX2]: Don't apply CRC PHY workaround to 5709. The workaround is only needed on 5706/5708 and cannot be applied on 5709. Signed-off-by: Michael Chan [EMAIL PROTECTED] diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index ada5e9b..8d682fc 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -1345,8 +1345,6 @@ bnx2_init_copper_phy(struct bnx2 *bp) { u32 val; - bp-phy_flags |= PHY_CRC_FIX_FLAG; - if (bp-phy_flags PHY_CRC_FIX_FLAG) { bnx2_write_phy(bp, 0x18, 0x0c00); bnx2_write_phy(bp, 0x17, 0x000a); @@ -5880,7 +5878,9 @@ bnx2_init_board(struct pci_dev *pdev, st if (reg BNX2_SHARED_HW_CFG_PHY_2_5G) bp-phy_flags |= PHY_2_5G_CAPABLE_FLAG; } - } + } else if (CHIP_NUM(bp) == CHIP_NUM_5706 || + CHIP_NUM(bp) == CHIP_NUM_5708) + bp-phy_flags |= PHY_CRC_FIX_FLAG; if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || (CHIP_ID(bp) == CHIP_ID_5708_B0) || - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[BNX2 2/4]: Fix 5709 Serdes detection.
[BNX2]: Fix 5709 Serdes detection. 5709 has a new register to detect copper/fiber PHYs. Signed-off-by: Michael Chan [EMAIL PROTECTED] diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 8d682fc..e325f93 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -5643,6 +5643,44 @@ poll_bnx2(struct net_device *dev) } #endif +static void __devinit +bnx2_get_5709_media(struct bnx2 *bp) +{ + u32 val = REG_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL); + u32 bond_id = val BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID; + u32 strap; + + if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C) + return; + else if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_S) { + bp-phy_flags |= PHY_SERDES_FLAG; + return; + } + + if (val BNX2_MISC_DUAL_MEDIA_CTRL_STRAP_OVERRIDE) + strap = (val BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL) 21; + else + strap = (val BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL_STRAP) 8; + + if (PCI_FUNC(bp-pdev-devfn) == 0) { + switch (strap) { + case 0x4: + case 0x5: + case 0x6: + bp-phy_flags |= PHY_SERDES_FLAG; + return; + } + } else { + switch (strap) { + case 0x1: + case 0x2: + case 0x4: + bp-phy_flags |= PHY_SERDES_FLAG; + return; + } + } +} + static int __devinit bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) { @@ -5863,10 +5901,9 @@ bnx2_init_board(struct pci_dev *pdev, st bp-phy_addr = 1; /* Disable WOL support if we are running on a SERDES chip. */ - if (CHIP_NUM(bp) == CHIP_NUM_5709) { - if (CHIP_BOND_ID(bp) != BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C) - bp-phy_flags |= PHY_SERDES_FLAG; - } else if (CHIP_BOND_ID(bp) CHIP_BOND_ID_SERDES_BIT) + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_get_5709_media(bp); + else if (CHIP_BOND_ID(bp) CHIP_BOND_ID_SERDES_BIT) bp-phy_flags |= PHY_SERDES_FLAG; if (bp-phy_flags PHY_SERDES_FLAG) { - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[BNX2 3/4]: Fix bug in bnx2_nvram_write().
[BNX2]: Fix bug in bnx2_nvram_write(). The bug was a bogus pointer being passed to kfree(). The pointer was incremented in the write loop and then passed to kfree(). The fix is to use align_buf to save the original address. Signed-off-by: Michael Chan [EMAIL PROTECTED] diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index e325f93..08a77a3 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -3083,7 +3083,7 @@ bnx2_nvram_write(struct bnx2 *bp, u32 of int buf_size) { u32 written, offset32, len32; - u8 *buf, start[4], end[4], *flash_buffer = NULL; + u8 *buf, start[4], end[4], *align_buf = NULL, *flash_buffer = NULL; int rc = 0; int align_start, align_end; @@ -3111,16 +3111,17 @@ bnx2_nvram_write(struct bnx2 *bp, u32 of } if (align_start || align_end) { - buf = kmalloc(len32, GFP_KERNEL); - if (buf == NULL) + align_buf = kmalloc(len32, GFP_KERNEL); + if (align_buf == NULL) return -ENOMEM; if (align_start) { - memcpy(buf, start, 4); + memcpy(align_buf, start, 4); } if (align_end) { - memcpy(buf + len32 - 4, end, 4); + memcpy(align_buf + len32 - 4, end, 4); } - memcpy(buf + align_start, data_buf, buf_size); + memcpy(align_buf + align_start, data_buf, buf_size); + buf = align_buf; } if (bp-flash_info-buffered == 0) { @@ -3254,11 +3255,8 @@ bnx2_nvram_write(struct bnx2 *bp, u32 of } nvram_write_end: - if (bp-flash_info-buffered == 0) - kfree(flash_buffer); - - if (align_start || align_end) - kfree(buf); + kfree(flash_buffer); + kfree(align_buf); return rc; } - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PACKET]: Add optional checksum computation for recvmsg
Hi Dave: [PACKET]: Add optional checksum computation for recvmsg This patch is needed to make ISC's DHCP server (and probably other DHCP servers/clients using AF_PACKET) to be able to serve another client on the same Xen host. The problem is that packets between different domains on the same Xen host only have partial checksums. Unfortunately this piece of information is not passed along in AF_PACKET unless you're using the mmap interface. Since the standard libpcap doesn't support mmap (and even the ones which do support it don't pass along the flag anyway), UDP packets from the same host come out with apparently bogus checksums. Since there is no way to pass the flag for the recvmsg(2) interface, an alternative is to compute the checksum in the kernel. This is a bit of waste but can be useful for other user-space applications such as tcpdump. The following patch taps into the existing sockopt of SO_NO_CHECK. It changes the default sk_no_check value for packet sockets to 1 so that the default behaviour is identical to the status quo. If the application disables SO_NO_CHECK, then partial checksums will be computed for recvmsg(2) (mmap is unaffected). The checksum computation will only proceed if the packet is not truncated by the socket. In addition, this patch removes the GSO check from skb_checksum_help so that checksums are computed for GSO packets too for consistency. That check is no longer relevant since netfilter now computes the checksum updates for GSO packets correctly. Even without the fixes to netfilter, that check is only a small optimisation since all it does is avoid an unnecessary checksum computation on GSO packets. Signed-off-by: Herbert Xu [EMAIL PROTECTED] Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmVHI~} [EMAIL PROTECTED] Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h diff --git a/net/core/dev.c b/net/core/dev.c index e660cb5..142194f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1175,11 +1175,6 @@ int skb_checksum_help(struct sk_buff *skb) if (skb-ip_summed == CHECKSUM_COMPLETE) goto out_set_summed; - if (unlikely(skb_shinfo(skb)-gso_size)) { - /* Let GSO fix up the checksum. */ - goto out_set_summed; - } - if (skb_cloned(skb)) { ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); if (ret) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index da73e8a..a5efa31 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -526,8 +526,11 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet if (dev-hard_header_parse) sll-sll_halen = dev-hard_header_parse(skb, sll-sll_addr); - if (pskb_trim(skb, snaplen)) - goto drop_n_acct; + if (snaplen skb-len) { + if (__pskb_trim(skb, snaplen)) + goto drop_n_acct; + skb-ip_summed = CHECKSUM_UNNECESSARY; + } skb_set_owner_r(skb, sk); skb-dev = NULL; @@ -1017,6 +1020,9 @@ static int packet_create(struct socket *sock, int protocol) sk-sk_destruct = packet_sock_destruct; atomic_inc(packet_socks_nr); + /* We don't want checksums by default for performance reasons. */ + sk-sk_no_check = 1; + /* * Attach a protocol block */ @@ -1110,6 +1116,12 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, msg-msg_flags|=MSG_TRUNC; } + if (unlikely(!sk-sk_no_check skb-ip_summed == CHECKSUM_PARTIAL)) { + err = skb_checksum_help(skb); + if (err) + goto out_free; + } + err = skb_copy_datagram_iovec(skb, 0, msg-msg_iov, copied); if (err) goto out_free; - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] ucc_geth: kmalloc casting cleanups
From: Ahmed S. Darwish [EMAIL PROTECTED] Switch kmalloc to kzalloc and clean some redundant kmalloc casts. Signed-off-by: Ahmed S. Darwish [EMAIL PROTECTED] Signed-off-by: Li Yang [EMAIL PROTECTED] --- diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 8243150..0f58f5f 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -2926,10 +2926,9 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) /* Init Tx bds */ for (j = 0; j ug_info-numQueuesTx; j++) { /* Setup the skbuff rings */ - ugeth-tx_skbuff[j] = - (struct sk_buff **)kmalloc(sizeof(struct sk_buff *) * - ugeth-ug_info-bdRingLenTx[j], - GFP_KERNEL); + ugeth-tx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) * + ugeth-ug_info-bdRingLenTx[j], + GFP_KERNEL); if (ugeth-tx_skbuff[j] == NULL) { ugeth_err(%s: Could not allocate tx_skbuff, @@ -2958,10 +2957,9 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) /* Init Rx bds */ for (j = 0; j ug_info-numQueuesRx; j++) { /* Setup the skbuff rings */ - ugeth-rx_skbuff[j] = - (struct sk_buff **)kmalloc(sizeof(struct sk_buff *) * - ugeth-ug_info-bdRingLenRx[j], - GFP_KERNEL); + ugeth-rx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) * + ugeth-ug_info-bdRingLenRx[j], + GFP_KERNEL); if (ugeth-rx_skbuff[j] == NULL) { ugeth_err(%s: Could not allocate rx_skbuff, @@ -3450,19 +3448,16 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) * resource. * This shadow structure keeps a copy of what was done so that the * allocated resources can be released when the channel is freed. +* *p_init_enet_param_shadow is zeroed by kzalloc */ - if (!(ugeth-p_init_enet_param_shadow = -(struct ucc_geth_init_pram *) kmalloc(sizeof(struct ucc_geth_init_pram), - GFP_KERNEL))) { + if (!(ugeth-p_init_enet_param_shadow = + kzalloc(sizeof(struct ucc_geth_init_pram), GFP_KERNEL))) { ugeth_err (%s: Can not allocate memory for p_UccInitEnetParamShadows., __FUNCTION__); ucc_geth_memclean(ugeth); return -ENOMEM; } - /* Zero out *p_init_enet_param_shadow */ - memset((char *)ugeth-p_init_enet_param_shadow, - 0, sizeof(struct ucc_geth_init_pram)); /* Fill shadow InitEnet command parameter structure */ - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GIT][Netlabel] Pull request
From: James Morris [EMAIL PROTECTED] Date: Mon, 8 Jan 2007 18:24:41 -0500 (EST) The following changes since commit bf81b46482c0fa8ea638e409d39768ea92a6b0f0: Linus Torvalds: Linux 2.6.20-rc4 are found in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/selinux-2.6.git#for-davem Paul Moore: NetLabel: correct locking in selinux_netlbl_socket_setsid() NetLabel: correct CIPSO tag handling when adding new DOI definitions net/netlabel/netlabel_cipso_v4.c |6 +++--- security/selinux/ss/services.c |4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) Pulled, thanks a lot James. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BNX2 1/4]: Don't apply CRC PHY workaround to 5709.
From: Michael Chan [EMAIL PROTECTED] Date: Mon, 08 Jan 2007 15:56:21 -0800 [BNX2]: Don't apply CRC PHY workaround to 5709. The workaround is only needed on 5706/5708 and cannot be applied on 5709. Signed-off-by: Michael Chan [EMAIL PROTECTED] Applied. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BNX2 2/4]: Fix 5709 Serdes detection.
From: Michael Chan [EMAIL PROTECTED] Date: Mon, 08 Jan 2007 15:56:31 -0800 [BNX2]: Fix 5709 Serdes detection. 5709 has a new register to detect copper/fiber PHYs. Signed-off-by: Michael Chan [EMAIL PROTECTED] Applied. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BNX2 3/4]: Fix bug in bnx2_nvram_write().
From: Michael Chan [EMAIL PROTECTED] Date: Mon, 08 Jan 2007 15:56:48 -0800 [BNX2]: Fix bug in bnx2_nvram_write(). The bug was a bogus pointer being passed to kfree(). The pointer was incremented in the write loop and then passed to kfree(). The fix is to use align_buf to save the original address. Signed-off-by: Michael Chan [EMAIL PROTECTED] Applied. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BNX2 4/4]: Update version and reldate.
From: Michael Chan [EMAIL PROTECTED] Date: Mon, 08 Jan 2007 16:04:24 -0800 Sorry, the date was wrong on the one sent earlier. [BNX2]: Update version and reldate. Update version to 1.5.3. Signed-off-by: Michael Chan [EMAIL PROTECTED] :-) Applied. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [TG3]: Add PHY workaround for 5755M.
From: Michael Chan [EMAIL PROTECTED] Date: Mon, 08 Jan 2007 15:58:00 -0800 [TG3]: Add PHY workaround for 5755M. Some PHY trim values need to be fine-tuned on 5755M to be IEEE-compliant. Update version to 3.72. Signed-off-by: Michael Chan [EMAIL PROTECTED] Applied, thanks Michael. - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] forcedeth: sideband management fix
Ayaz Abdulla wrote: This patch contains a fix that implements proper communication with the sideband management unit. Also, it makes sure that the speed is correctly set for gigabit phys in the case where sideband mgmt unit initialized the phy. Refer to bug #7684 for more details. Signed-Off-By: Ayaz Abdulla [EMAIL PROTECTED] applied - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] ucc_geth: kmalloc casting cleanups
Li Yang wrote: From: Ahmed S. Darwish [EMAIL PROTECTED] Switch kmalloc to kzalloc and clean some redundant kmalloc casts. Signed-off-by: Ahmed S. Darwish [EMAIL PROTECTED] Signed-off-by: Li Yang [EMAIL PROTECTED] --- I should wait for Kumar to resend ucc_geth fixes before applying this, right? Jeff - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/5] s390: qeth driver fixes
Frank Pavlic wrote: Hi , please apply following 5 patches for s390 network device drivers. Sorry for the fifth patch containing some lines which just remove whitespaces. Another patch will follow in the next couple of days with more whitespace and coding style cleanups in drivers/s390/net. Thank you Frank [PATCH 1/5] s390: qeth driver fixes From: Frank Blaschka [EMAIL PROTECTED] From: Ursula Braun [EMAIL PROTECTED] - VLAN header reordering did not work on packets received through qeth interface in layer 2 mode. This caused dhcpcd not to work with VLAN devices. - set qeth performance statistics initally inactive Signed-off-by: Frank Pavlic [EMAIL PROTECTED] applied patches 1-4 of 5. patch #5 failed to apply, and also, it's not really appropriate for the current release candidate bugfix window. Also: 1) Please include notes to me and reviewers following the --- marker. Everything before the --- is copied /verbatim/ into the kernel changelog. Everything after ---, except the patch itself, is ignored. I had to hand-edit each of your patches, to remove the Hi , ... Frank paragraph and the [PATCH 1/5] S390: ... from the body of each email. 2) Your subject line should be more descriptive. The subject line is used to generate a one-line summary. You can see how your subject lines are vague: [PATCH] s390: qeth driver fixes [PATCH] s390: qeth driver fixes [PATCH] s390: qeth driver fixes Here, I had to hand-edit each email subject line to be more descriptive. 3) In general, review Documentation/SubmittingPatches and http://linux.yyz.us/patch-format.html Jeff - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH] ucc_geth: kmalloc casting cleanups
-Original Message- From: Jeff Garzik [mailto:[EMAIL PROTECTED] Sent: Tuesday, January 09, 2007 3:16 PM To: Li Yang-r58472 Cc: netdev@vger.kernel.org; [EMAIL PROTECTED] Subject: Re: [PATCH] ucc_geth: kmalloc casting cleanups Li Yang wrote: From: Ahmed S. Darwish [EMAIL PROTECTED] Switch kmalloc to kzalloc and clean some redundant kmalloc casts. Signed-off-by: Ahmed S. Darwish [EMAIL PROTECTED] Signed-off-by: Li Yang [EMAIL PROTECTED] --- I should wait for Kumar to resend ucc_geth fixes before applying this, right? Ok. The patch is based on 2.6.20-rc3, but I think it can still apply. If not, please ping me. - Leo - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[take31 6/10] kevent: Pipe notifications.
Pipe notifications. diff --git a/fs/pipe.c b/fs/pipe.c index 68090e8..0c75bf1 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -16,6 +16,7 @@ #include linux/uio.h #include linux/highmem.h #include linux/pagemap.h +#include linux/kevent.h #include asm/uaccess.h #include asm/ioctls.h @@ -313,6 +314,7 @@ redo: break; } if (do_wakeup) { + kevent_pipe_notify(inode, KEVENT_SOCKET_SEND); wake_up_interruptible_sync(pipe-wait); kill_fasync(pipe-fasync_writers, SIGIO, POLL_OUT); } @@ -322,6 +324,7 @@ redo: /* Signal writers asynchronously that there is more room. */ if (do_wakeup) { + kevent_pipe_notify(inode, KEVENT_SOCKET_SEND); wake_up_interruptible(pipe-wait); kill_fasync(pipe-fasync_writers, SIGIO, POLL_OUT); } @@ -484,6 +487,7 @@ redo2: break; } if (do_wakeup) { + kevent_pipe_notify(inode, KEVENT_SOCKET_RECV); wake_up_interruptible_sync(pipe-wait); kill_fasync(pipe-fasync_readers, SIGIO, POLL_IN); do_wakeup = 0; @@ -495,6 +499,7 @@ redo2: out: mutex_unlock(inode-i_mutex); if (do_wakeup) { + kevent_pipe_notify(inode, KEVENT_SOCKET_RECV); wake_up_interruptible(pipe-wait); kill_fasync(pipe-fasync_readers, SIGIO, POLL_IN); } @@ -590,6 +595,7 @@ pipe_release(struct inode *inode, int decr, int decw) free_pipe_info(inode); } else { wake_up_interruptible(pipe-wait); + kevent_pipe_notify(inode, KEVENT_SOCKET_SEND|KEVENT_SOCKET_RECV); kill_fasync(pipe-fasync_readers, SIGIO, POLL_IN); kill_fasync(pipe-fasync_writers, SIGIO, POLL_OUT); } diff --git a/kernel/kevent/kevent_pipe.c b/kernel/kevent/kevent_pipe.c new file mode 100644 index 000..91dc1eb --- /dev/null +++ b/kernel/kevent/kevent_pipe.c @@ -0,0 +1,123 @@ +/* + * kevent_pipe.c + * + * 2006 Copyright (c) Evgeniy Polyakov [EMAIL PROTECTED] + * All rights reserved. + * + * 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 linux/kernel.h +#include linux/types.h +#include linux/slab.h +#include linux/spinlock.h +#include linux/file.h +#include linux/fs.h +#include linux/kevent.h +#include linux/pipe_fs_i.h + +static int kevent_pipe_callback(struct kevent *k) +{ + struct inode *inode = k-st-origin; + struct pipe_inode_info *pipe = inode-i_pipe; + int nrbufs = pipe-nrbufs; + + if (k-event.event KEVENT_SOCKET_RECV nrbufs 0) { + if (!pipe-writers) + return -1; + return 1; + } + + if (k-event.event KEVENT_SOCKET_SEND nrbufs PIPE_BUFFERS) { + if (!pipe-readers) + return -1; + return 1; + } + + return 0; +} + +int kevent_pipe_enqueue(struct kevent *k) +{ + struct file *pipe; + int err = -EBADF; + struct inode *inode; + + pipe = fget(k-event.id.raw[0]); + if (!pipe) + goto err_out_exit; + + inode = igrab(pipe-f_dentry-d_inode); + if (!inode) + goto err_out_fput; + + err = -EINVAL; + if (!S_ISFIFO(inode-i_mode)) + goto err_out_iput; + + err = kevent_storage_enqueue(inode-st, k); + if (err) + goto err_out_iput; + + if (k-event.req_flags KEVENT_REQ_ALWAYS_QUEUE) { + kevent_requeue(k); + err = 0; + } else { + err = k-callbacks.callback(k); + if (err) + goto err_out_dequeue; + } + + fput(pipe); + + return err; + +err_out_dequeue: + kevent_storage_dequeue(k-st, k); +err_out_iput: + iput(inode); +err_out_fput: + fput(pipe); +err_out_exit: + return err; +} + +int kevent_pipe_dequeue(struct kevent *k) +{ + struct inode *inode = k-st-origin; + + kevent_storage_dequeue(k-st, k); + iput(inode); + + return 0; +} + +void kevent_pipe_notify(struct inode
[take31 8/10] kevent: Kevent posix timer notifications.
Kevent posix timer notifications. Simple extensions to POSIX timers which allows to deliver notification of the timer expiration through kevent queue. Example application posix_timer.c can be found in archive on project homepage. Signed-off-by: Evgeniy Polyakov [EMAIL PROTECTED] diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index 8786e01..3768746 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h @@ -235,6 +235,7 @@ typedef struct siginfo { #define SIGEV_NONE 1 /* other notification: meaningless */ #define SIGEV_THREAD 2 /* deliver via thread creation */ #define SIGEV_THREAD_ID 4 /* deliver to thread */ +#define SIGEV_KEVENT 8 /* deliver through kevent queue */ /* * This works because the alignment is ok on all current architectures @@ -260,6 +261,8 @@ typedef struct sigevent { void (*_function)(sigval_t); void *_attribute; /* really pthread_attr_t */ } _sigev_thread; + + int kevent_fd; } _sigev_un; } sigevent_t; diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index a7dd38f..4b9deb4 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -4,6 +4,7 @@ #include linux/spinlock.h #include linux/list.h #include linux/sched.h +#include linux/kevent_storage.h union cpu_time_count { cputime_t cpu; @@ -49,6 +50,9 @@ struct k_itimer { sigval_t it_sigev_value;/* value word of sigevent struct */ struct task_struct *it_process; /* process to send signal to */ struct sigqueue *sigq; /* signal queue entry. */ +#ifdef CONFIG_KEVENT_TIMER + struct kevent_storage st; +#endif union { struct { struct hrtimer timer; diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index 5fe87de..5ec805e 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -48,6 +48,8 @@ #include linux/wait.h #include linux/workqueue.h #include linux/module.h +#include linux/kevent.h +#include linux/file.h /* * Management arrays for POSIX timers. Timers are kept in slab memory @@ -224,6 +226,100 @@ static int posix_ktime_get_ts(clockid_t which_clock, struct timespec *tp) return 0; } +#ifdef CONFIG_KEVENT_TIMER +static int posix_kevent_enqueue(struct kevent *k) +{ + /* +* It is not ugly - there is no pointer in the id field union, +* but its size is 64bits, which is ok for any known pointer size. +*/ + struct k_itimer *tmr = (struct k_itimer *)(unsigned long)k-event.id.raw_u64; + return kevent_storage_enqueue(tmr-st, k); +} +static int posix_kevent_dequeue(struct kevent *k) +{ + struct k_itimer *tmr = (struct k_itimer *)(unsigned long)k-event.id.raw_u64; + kevent_storage_dequeue(tmr-st, k); + return 0; +} +static int posix_kevent_callback(struct kevent *k) +{ + return 1; +} +static int posix_kevent_init(void) +{ + struct kevent_callbacks tc = { + .callback = posix_kevent_callback, + .enqueue = posix_kevent_enqueue, + .dequeue = posix_kevent_dequeue, + .flags = KEVENT_CALLBACKS_KERNELONLY}; + + return kevent_add_callbacks(tc, KEVENT_POSIX_TIMER); +} + +extern struct file_operations kevent_user_fops; + +static int posix_kevent_init_timer(struct k_itimer *tmr, int fd) +{ + struct ukevent uk; + struct file *file; + struct kevent_user *u; + int err; + + file = fget(fd); + if (!file) { + err = -EBADF; + goto err_out; + } + + if (file-f_op != kevent_user_fops) { + err = -EINVAL; + goto err_out_fput; + } + + u = file-private_data; + + memset(uk, 0, sizeof(struct ukevent)); + + uk.event = KEVENT_MASK_ALL; + uk.type = KEVENT_POSIX_TIMER; + uk.id.raw_u64 = (unsigned long)(tmr); /* Just cast to something unique */ + uk.req_flags = KEVENT_REQ_ONESHOT | KEVENT_REQ_ALWAYS_QUEUE; + uk.ptr = tmr-it_sigev_value.sival_ptr; + + err = kevent_user_add_ukevent(uk, u); + if (err) + goto err_out_fput; + + fput(file); + + return 0; + +err_out_fput: + fput(file); +err_out: + return err; +} + +static void posix_kevent_fini_timer(struct k_itimer *tmr) +{ + kevent_storage_fini(tmr-st); +} +#else +static int posix_kevent_init_timer(struct k_itimer *tmr, int fd) +{ + return -ENOSYS; +} +static int posix_kevent_init(void) +{ + return 0; +} +static void posix_kevent_fini_timer(struct k_itimer *tmr) +{ +} +#endif + + /* * Initialize everything, well, just everything in Posix clocks/timers ;) */ @@ -241,6 +337,11 @@ static __init int init_posix_timers(void) register_posix_clock(CLOCK_REALTIME, clock_realtime);
[take31 5/10] kevent: Timer notifications.
Timer notifications. Timer notifications can be used for fine grained per-process time management, since interval timers are very inconvenient to use, and they are limited. This subsystem uses high-resolution timers. id.raw[0] is used as number of seconds id.raw[1] is used as number of nanoseconds Signed-off-by: Evgeniy Polyakov [EMAIL PROTECTED] diff --git a/kernel/kevent/kevent_timer.c b/kernel/kevent/kevent_timer.c new file mode 100644 index 000..c21a155 --- /dev/null +++ b/kernel/kevent/kevent_timer.c @@ -0,0 +1,114 @@ +/* + * 2006 Copyright (c) Evgeniy Polyakov [EMAIL PROTECTED] + * All rights reserved. + * + * 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 linux/kernel.h +#include linux/types.h +#include linux/list.h +#include linux/slab.h +#include linux/spinlock.h +#include linux/hrtimer.h +#include linux/jiffies.h +#include linux/kevent.h + +struct kevent_timer +{ + struct hrtimer ktimer; + struct kevent_storage ktimer_storage; + struct kevent *ktimer_event; +}; + +static int kevent_timer_func(struct hrtimer *timer) +{ + struct kevent_timer *t = container_of(timer, struct kevent_timer, ktimer); + struct kevent *k = t-ktimer_event; + + kevent_storage_ready(t-ktimer_storage, NULL, KEVENT_MASK_ALL); + hrtimer_forward(timer, timer-base-softirq_time, + ktime_set(k-event.id.raw[0], k-event.id.raw[1])); + return HRTIMER_RESTART; +} + +static struct lock_class_key kevent_timer_key; + +static int kevent_timer_enqueue(struct kevent *k) +{ + int err; + struct kevent_timer *t; + + t = kmalloc(sizeof(struct kevent_timer), GFP_KERNEL); + if (!t) + return -ENOMEM; + + hrtimer_init(t-ktimer, CLOCK_MONOTONIC, HRTIMER_REL); + t-ktimer.expires = ktime_set(k-event.id.raw[0], k-event.id.raw[1]); + t-ktimer.function = kevent_timer_func; + t-ktimer_event = k; + + err = kevent_storage_init(t-ktimer, t-ktimer_storage); + if (err) + goto err_out_free; + lockdep_set_class(t-ktimer_storage.lock, kevent_timer_key); + + err = kevent_storage_enqueue(t-ktimer_storage, k); + if (err) + goto err_out_st_fini; + + hrtimer_start(t-ktimer, t-ktimer.expires, HRTIMER_REL); + + return 0; + +err_out_st_fini: + kevent_storage_fini(t-ktimer_storage); +err_out_free: + kfree(t); + + return err; +} + +static int kevent_timer_dequeue(struct kevent *k) +{ + struct kevent_storage *st = k-st; + struct kevent_timer *t = container_of(st, struct kevent_timer, ktimer_storage); + + hrtimer_cancel(t-ktimer); + kevent_storage_dequeue(st, k); + kfree(t); + + return 0; +} + +static int kevent_timer_callback(struct kevent *k) +{ + k-event.ret_data[0] = jiffies_to_msecs(jiffies); + return 1; +} + +static int __init kevent_init_timer(void) +{ + struct kevent_callbacks tc = { + .callback = kevent_timer_callback, + .enqueue = kevent_timer_enqueue, + .dequeue = kevent_timer_dequeue, + .flags = 0, + }; + + return kevent_add_callbacks(tc, KEVENT_TIMER); +} +module_init(kevent_init_timer); + - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[take31 1/10] kevent: Description.
Description. diff --git a/Documentation/kevent.txt b/Documentation/kevent.txt new file mode 100644 index 000..95cb36e --- /dev/null +++ b/Documentation/kevent.txt @@ -0,0 +1,244 @@ +Description. + +int kevent_init(struct kevent_ring *ring, unsigned int ring_size, + unsigned int flags); + +num - size of the ring buffer in events +ring - pointer to allocated ring buffer +flags - various flags, see KEVENT_FLAGS_* definitions. + +Return value: kevent control file descriptor or negative error value. + + struct kevent_ring + { + unsigned int ring_kidx, ring_over; + struct ukevent event[0]; + } + +ring_kidx - index in the ring buffer where kernel will put new events + when kevent_wait() or kevent_get_events() is called +ring_over - number of overflows of ring_uidx happend from the start. + Overflow counter is used to prevent situation when two threads + are going to free the same events, but one of them was scheduled + away for too long, so ring indexes were wrapped, so when that + thread will be awakened, it will free not those events, which + it suppose to free. + +Example userspace code (ring_buffer.c) can be found on project's homepage. + +Each kevent syscall can be so called cancellation point in glibc, i.e. when +thread has been cancelled in kevent syscall, thread can be safely removed +and no events will be lost, since each syscall (kevent_wait() or +kevent_get_events()) will copy event into special ring buffer, accessible +from other threads or even processes (if shared memory is used). + +When kevent is removed (not dequeued when it is ready, but just removed), +even if it was ready, it is not copied into ring buffer, since if it is +removed, no one cares about it (otherwise user would wait until it becomes +ready and got it through usual way using kevent_get_events() or kevent_wait()) +and thus no need to copy it to the ring buffer. + +--- + + +int kevent_ctl(int fd, unsigned int cmd, unsigned int num, struct ukevent *arg); + +fd - is the file descriptor referring to the kevent queue to manipulate. +It is created by opening /dev/kevent char device, which is created with +dynamic minor number and major number assigned for misc devices. + +cmd - is the requested operation. It can be one of the following: +KEVENT_CTL_ADD - add event notification +KEVENT_CTL_REMOVE - remove event notification +KEVENT_CTL_MODIFY - modify existing notification +KEVENT_CTL_READY - mark existing events as ready, if number of events is zero, + it just wakes up parked in syscall thread + +num - number of struct ukevent in the array pointed to by arg +arg - array of struct ukevent + +Return value: + number of events processed or negative error value. + +When called, kevent_ctl will carry out the operation specified in the +cmd parameter. +--- + + int kevent_get_events(int ctl_fd, unsigned int min_nr, unsigned int max_nr, + struct timespec timeout, struct ukevent *buf, unsigned flags); + +ctl_fd - file descriptor referring to the kevent queue +min_nr - minimum number of completed events that kevent_get_events will block +waiting for +max_nr - number of struct ukevent in buf +timeout - time to wait before returning less than min_nr + events. If this is -1, then wait forever. +buf - pointer to an array of struct ukevent. +flags - various flags, see KEVENT_FLAGS_* definitions. + +Return value: + number of events copied or negative error value. + +kevent_get_events will wait timeout milliseconds for at least min_nr completed +events, copying completed struct ukevents to buf and deleting any +KEVENT_REQ_ONESHOT event requests. In nonblocking mode it returns as many +events as possible, but not more than max_nr. In blocking mode it waits until +timeout or if at least min_nr events are ready. + +This function copies event into ring buffer if it was initialized, if ring buffer +is full, KEVENT_RET_COPY_FAILED flag is set in ret_flags field. +--- + + int kevent_wait(int ctl_fd, unsigned int num, unsigned int old_uidx, + struct timespec timeout, unsigned int flags); + +ctl_fd - file descriptor referring to the kevent queue +num - number of processed kevents +old_uidx - the last index user is aware of +timeout - time to wait until there is free space in kevent queue +flags - various flags, see KEVENT_FLAGS_* definitions. + +Return value: + number of events copied into ring buffer or negative error value. + +This syscall waits until either timeout expires or at least one event becomes +ready. It also copies events into special ring buffer. If ring buffer is full, +it waits until there are ready events and then return. +If kevent is one-shot kevent it is
[take31 7/10] kevent: Signal notifications.
Signal notifications. This type of notifications allows to deliver signals through kevent queue. One can find example application signal.c on project homepage. If KEVENT_SIGNAL_NOMASK bit is set in raw_u64 id then signal will be delivered only through queue, otherwise both delivery types are used - old through update of mask of pending signals and through queue. If signal is delivered only through kevent queue mask of pending signals is not updated at all, which is equal to putting signal into blocked mask, but with delivery of that signal through kevent queue. Signed-off-by: Evgeniy Polyakov [EMAIL PROTECTED] diff --git a/include/linux/sched.h b/include/linux/sched.h index 4463735..e7372f2 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -82,6 +82,7 @@ struct sched_param { #include linux/resource.h #include linux/timer.h #include linux/hrtimer.h +#include linux/kevent_storage.h #include linux/task_io_accounting.h #include asm/processor.h @@ -1048,6 +1049,10 @@ struct task_struct { #ifdef CONFIG_TASK_DELAY_ACCT struct task_delay_info *delays; #endif +#ifdef CONFIG_KEVENT_SIGNAL + struct kevent_storage st; + u32 kevent_signals; +#endif #ifdef CONFIG_FAULT_INJECTION int make_it_fail; #endif diff --git a/kernel/fork.c b/kernel/fork.c index fc723e5..fd7c749 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -49,6 +49,7 @@ #include linux/delayacct.h #include linux/taskstats_kern.h #include linux/random.h +#include linux/kevent.h #include asm/pgtable.h #include asm/pgalloc.h @@ -118,6 +119,9 @@ void __put_task_struct(struct task_struct *tsk) WARN_ON(atomic_read(tsk-usage)); WARN_ON(tsk == current); +#ifdef CONFIG_KEVENT_SIGNAL + kevent_storage_fini(tsk-st); +#endif security_task_free(tsk); free_uid(tsk-user); put_group_info(tsk-group_info); @@ -1126,6 +1130,10 @@ static struct task_struct *copy_process(unsigned long clone_flags, if (retval) goto bad_fork_cleanup_namespaces; +#ifdef CONFIG_KEVENT_SIGNAL + kevent_storage_init(p, p-st); +#endif + p-set_child_tid = (clone_flags CLONE_CHILD_SETTID) ? child_tidptr : NULL; /* * Clear TID on mm_release()? diff --git a/kernel/kevent/kevent_signal.c b/kernel/kevent/kevent_signal.c new file mode 100644 index 000..abe3972 --- /dev/null +++ b/kernel/kevent/kevent_signal.c @@ -0,0 +1,94 @@ +/* + * kevent_signal.c + * + * 2006 Copyright (c) Evgeniy Polyakov [EMAIL PROTECTED] + * All rights reserved. + * + * 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 linux/kernel.h +#include linux/types.h +#include linux/slab.h +#include linux/spinlock.h +#include linux/file.h +#include linux/fs.h +#include linux/kevent.h + +static int kevent_signal_callback(struct kevent *k) +{ + struct task_struct *tsk = k-st-origin; + int sig = k-event.id.raw[0]; + int ret = 0; + + if (sig == tsk-kevent_signals) + ret = 1; + + if (ret (k-event.id.raw_u64 KEVENT_SIGNAL_NOMASK)) + tsk-kevent_signals |= 0x8000; + + return ret; +} + +int kevent_signal_enqueue(struct kevent *k) +{ + int err; + + err = kevent_storage_enqueue(current-st, k); + if (err) + goto err_out_exit; + + if (k-event.req_flags KEVENT_REQ_ALWAYS_QUEUE) { + kevent_requeue(k); + err = 0; + } else { + err = k-callbacks.callback(k); + if (err) + goto err_out_dequeue; + } + + return err; + +err_out_dequeue: + kevent_storage_dequeue(k-st, k); +err_out_exit: + return err; +} + +int kevent_signal_dequeue(struct kevent *k) +{ + kevent_storage_dequeue(k-st, k); + return 0; +} + +int kevent_signal_notify(struct task_struct *tsk, int sig) +{ + tsk-kevent_signals = sig; + kevent_storage_ready(tsk-st, NULL, KEVENT_SIGNAL_DELIVERY); + return (tsk-kevent_signals 0x8000); +} + +static int __init kevent_init_signal(void) +{ + struct kevent_callbacks sc = { + .callback = kevent_signal_callback, + .enqueue = kevent_signal_enqueue, + .dequeue = kevent_signal_dequeue, + .flags = 0, +
[PATCH] X.25 Add missing sock_put in x25_receive_data
__x25_find_socket does a sock_hold. This adds a missing sock_put in x25_receive_data. Signed-off-by: Andrew Hendry [EMAIL PROTECTED] --- linux-2.6.19-vanilla/net/x25/x25_dev.c 2006-12-31 22:31:07.0 +1100 +++ linux-2.6.19/net/x25/x25_dev.c 2007-01-06 16:40:54.0 +1100 @@ -56,6 +56,7 @@ static int x25_receive_data(struct sk_bu sk_add_backlog(sk, skb); } bh_unlock_sock(sk); + sock_put(sk); return queued; } - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BUG KERNEL 2.6.20-rc1] ftp: get or put stops during file-transfer
In article [EMAIL PROTECTED] (at Thu, 4 Jan 2007 14:23:30 +0200), Craig Schlenter [EMAIL PROTECTED] says: On Fri, Jan 05, 2007 at 05:45:46AM +0900, Komuro wrote: Hi, I made a patch below. With this patch, the ftp-transfer-stop problem does not happen. Therefore, I think this is not a problem of vsftpd. Mr.YOSHIFUJI san, why did you set TCPOLEN_TSTAMP_ALIGNED to iov_len? --- linux-2.6.20-rc3/net/ipv4/tcp_ipv4.c.orig 2007-01-03 11:50:04.0 +0900 +++ linux-2.6.20-rc3/net/ipv4/tcp_ipv4.c2007-01-03 15:30:44.0 +0900 @@ -648,7 +648,7 @@ static void tcp_v4_send_ack(struct tcp_t TCPOLEN_TIMESTAMP); rep.opt[1] = htonl(tcp_time_stamp); rep.opt[2] = htonl(ts); - arg.iov[0].iov_len = TCPOLEN_TSTAMP_ALIGNED; + arg.iov[0].iov_len = sizeof(rep); Perhaps this was supposed to be arg.iov[0].iov_len += TCPOLEN_TSTAMP_ALIGNED; That's what the ipv6 stuff does in places. Good catch! I agree. Craig, please provide a patch for us, please. Thank you again. --yoshfuji - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH 2.6.20-rc3] UCC Ether driver: kmalloc casting cleanups
-Original Message- From: Ahmed S. Darwish [mailto:[EMAIL PROTECTED] Sent: Saturday, January 06, 2007 9:19 PM To: Li Yang-r58472 Cc: linux-kernel@vger.kernel.org Subject: [PATCH 2.6.20-rc3] UCC Ether driver: kmalloc casting cleanups [Please inform me if you are not the maintaner cause I'm not sure:)] Hi, A kmalloc casting cleanup patch. I wasn't able to compile the file drivers/net/ucc_geth.c cause of some not found headers (asm/of_platform.h, asm/qe.h, and others ) You need to use ARCH=powerpc to compile this driver. I don't know how you could select this driver without using powerpc arch. Signed-off-by: Ahmed Darwish [EMAIL PROTECTED] diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 8243150..001109e 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -2864,8 +2864,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) if (UCC_GETH_TX_BD_RING_ALIGNMENT 4) align = UCC_GETH_TX_BD_RING_ALIGNMENT; ugeth-tx_bd_ring_offset[j] = - (u32) (kmalloc((u32) (length + align), - GFP_KERNEL)); + kmalloc((u32) (length + align), GFP_KERNEL); + if (ugeth-tx_bd_ring_offset[j] != 0) ugeth-p_tx_bd_ring[j] = (void*)((ugeth-tx_bd_ring_offset[j] + @@ -2900,7 +2900,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) if (UCC_GETH_RX_BD_RING_ALIGNMENT 4) align = UCC_GETH_RX_BD_RING_ALIGNMENT; ugeth-rx_bd_ring_offset[j] = - (u32) (kmalloc((u32) (length + align), GFP_KERNEL)); + kmalloc((u32) (length + align), GFP_KERNEL); NACK about the 2 clean-ups above. Cast from pointer to integer is required here. if (ugeth-rx_bd_ring_offset[j] != 0) ugeth-p_rx_bd_ring[j] = (void*)((ugeth-rx_bd_ring_offset[j] + @@ -2926,10 +2926,9 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) /* Init Tx bds */ for (j = 0; j ug_info-numQueuesTx; j++) { /* Setup the skbuff rings */ - ugeth-tx_skbuff[j] = - (struct sk_buff **)kmalloc(sizeof(struct sk_buff *) * - ugeth-ug_info-bdRingLenTx[j], -GFP_KERNEL); + ugeth-tx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) * + ugeth-ug_info-bdRingLenTx[j], + GFP_KERNEL); if (ugeth-tx_skbuff[j] == NULL) { ugeth_err(%s: Could not allocate tx_skbuff, @@ -2958,10 +2957,9 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) /* Init Rx bds */ for (j = 0; j ug_info-numQueuesRx; j++) { /* Setup the skbuff rings */ - ugeth-rx_skbuff[j] = - (struct sk_buff **)kmalloc(sizeof(struct sk_buff *) * - ugeth-ug_info-bdRingLenRx[j], -GFP_KERNEL); + ugeth-rx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) * + ugeth-ug_info-bdRingLenRx[j], + GFP_KERNEL); if (ugeth-rx_skbuff[j] == NULL) { ugeth_err(%s: Could not allocate rx_skbuff, @@ -3452,8 +3450,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) * allocated resources can be released when the channel is freed. */ if (!(ugeth-p_init_enet_param_shadow = - (struct ucc_geth_init_pram *) kmalloc(sizeof(struct ucc_geth_init_pram), - GFP_KERNEL))) { + kmalloc(sizeof(struct ucc_geth_init_pram), GFP_KERNEL))) { ugeth_err (%s: Can not allocate memory for p_UccInitEnetParamShadows., __FUNCTION__); -- Ahmed S. Darwish http://darwish-07.blogspot.com - Leo - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] Re: [BUG KERNEL 2.6.20-rc1] ftp: get or put stops during file-transfer
Hi Dave YOSHIFUJI Hideaki / 吉藤英明 has suggested that I send the patch below to fix the ftp stalls present in the current kernels. All credit goes to Komuro [EMAIL PROTECTED] for tracking this down. The patch is untested but it looks *cough* obviously correct. Signed-off-by: Craig Schlenter [EMAIL PROTECTED] Thank you! --Craig diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index bf7a224..12de90a 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -648,7 +648,7 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk, TCPOLEN_TIMESTAMP); rep.opt[1] = htonl(tcp_time_stamp); rep.opt[2] = htonl(ts); - arg.iov[0].iov_len = TCPOLEN_TSTAMP_ALIGNED; + arg.iov[0].iov_len += TCPOLEN_TSTAMP_ALIGNED; } /* Swap the send and the receive. */ - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Re: [BUG KERNEL 2.6.20-rc1] ftp: get or put stops during file-transfer
Dave, please apply. Thank you. In article [EMAIL PROTECTED] (at Tue, 9 Jan 2007 07:11:39 +0200), Craig Schlenter [EMAIL PROTECTED] says: All credit goes to Komuro [EMAIL PROTECTED] for tracking this down. The patch is untested but it looks *cough* obviously correct. Signed-off-by: Craig Schlenter [EMAIL PROTECTED] Signed-off-by: YOSHIFUJI Hideaki [EMAIL PROTECTED] ---BeginMessage--- SGkgRGF2ZQ0KDQpZT1NISUZVSkkgSGlkZWFraSAvIOWQieiXpOiLseaYjiBoYXMgc3VnZ2VzdGVk IHRoYXQgSSBzZW5kIHRoZSBwYXRjaA0KYmVsb3cgdG8gZml4IHRoZSBmdHAgc3RhbGxzIHByZXNl bnQgaW4gdGhlIGN1cnJlbnQga2VybmVscy4NCg0KQWxsIGNyZWRpdCBnb2VzIHRvIEtvbXVybyA8 a29tdXJvanVuLW1ibkBuaWZ0eS5jb20+IGZvciB0cmFja2luZw0KdGhpcyBkb3duLiBUaGUgcGF0 Y2ggaXMgdW50ZXN0ZWQgYnV0IGl0IGxvb2tzICpjb3VnaCogb2J2aW91c2x5DQpjb3JyZWN0Lg0K DQpTaWduZWQtb2ZmLWJ5OiBDcmFpZyBTY2hsZW50ZXIgPGNyYWlnQGNvZGVmb3VudGFpbi5jb20+ DQoNClRoYW5rIHlvdSENCg0KLS1DcmFpZw0KDQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lw djQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMNCmluZGV4IGJmN2EyMjQuLjEyZGU5MGEgMTAwNjQ0 DQotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jDQorKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jDQpA QCAtNjQ4LDcgKzY0OCw3IEBAIHN0YXRpYyB2b2lkIHRjcF92NF9zZW5kX2FjayhzdHJ1Y3QgdGNw X3RpbWV3YWl0X3NvY2sgKnR3c2ssDQogCQkJCSAgIFRDUE9MRU5fVElNRVNUQU1QKTsNCiAJCXJl cC5vcHRbMV0gPSBodG9ubCh0Y3BfdGltZV9zdGFtcCk7DQogCQlyZXAub3B0WzJdID0gaHRvbmwo dHMpOw0KLQkJYXJnLmlvdlswXS5pb3ZfbGVuID0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsNCisJ CWFyZy5pb3ZbMF0uaW92X2xlbiArPSBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOw0KIAl9DQogDQog CS8qIFN3YXAgdGhlIHNlbmQgYW5kIHRoZSByZWNlaXZlLiAqLw0K ---End Message---
2.6.20-rc4: known regressions with patches (v2)
This email lists some known regressions in 2.6.20-rc4 compared to 2.6.19 with patches available. If you find your name in the Cc header, you are either submitter of one of the bugs, maintainer of an affectected subsystem or driver, a patch of you caused a breakage or I'm considering you in any other way possibly involved with one or more of these issues. Due to the huge amount of recipients, please trim the Cc when answering. Subject: BUG: at mm/truncate.c:60 cancel_dirty_page() (XFS) References : http://lkml.org/lkml/2007/1/5/308 Submitter : Sami Farin [EMAIL PROTECTED] Handled-By : David Chinner [EMAIL PROTECTED] Patch : http://lkml.org/lkml/2007/1/7/201 Status : patch available Subject: bluetooth oopses because of multiple kobject_add() References : http://lkml.org/lkml/2007/1/2/101 Submitter : Pavel Machek [EMAIL PROTECTED] Handled-By : Marcel Holtmann [EMAIL PROTECTED] Patch : http://lkml.org/lkml/2007/1/2/147 Status : patch available Subject: ftp: get or put stops during file-transfer References : http://lkml.org/lkml/2006/12/16/174 Submitter : Komuro [EMAIL PROTECTED] Caused-By : YOSHIFUJI Hideaki [EMAIL PROTECTED] commit cfb6eeb4c860592edd123fdea908d23c6ad1c7dc Handled-By : Craig Schlenter [EMAIL PROTECTED] YOSHIFUJI Hideaki [EMAIL PROTECTED] Patch : http://lkml.org/lkml/2007/1/9/5 Status : patch available Subject: nf_conntrack_netbios_ns.c causes Oops References : http://lkml.org/lkml/2007/1/7/188 Submitter : Peter Osterlund [EMAIL PROTECTED] Caused-By : Patrick McHardy [EMAIL PROTECTED] commit 92703eee4ccde3c55ee067a89c373e8a51a8adf9 Handled-By : Patrick McHardy [EMAIL PROTECTED] Patch : http://lkml.org/lkml/2007/1/8/290 Status : patch available Subject: forcedeth.c 0.59: problem with sideband managment References : http://bugzilla.kernel.org/show_bug.cgi?id=7684 Submitter : Michael Reske [EMAIL PROTECTED] Handled-By : Ayaz Abdulla [EMAIL PROTECTED] Patch : http://bugzilla.kernel.org/show_bug.cgi?id=7684 Status : patch available Subject: nVidia CK804 chipset: not detecting HT MSI capabilities References : http://lkml.org/lkml/2007/1/5/215 Submitter : Brice Goglin [EMAIL PROTECTED] Robert Hancock [EMAIL PROTECTED] Handled-By : Brice Goglin [EMAIL PROTECTED] Patch : http://lkml.org/lkml/2007/1/5/215 Status : patch available - To unsubscribe from this list: send the line unsubscribe netdev in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html