Netdev List
 help / color / mirror / Atom feed
* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Andi Kleen @ 2008-01-08 17:08 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Kevin Winchester, J. Bruce Fields, Al Viro, Arjan van de Ven,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <alpine.LFD.1.00.0801071851120.3148@woody.linux-foundation.org>

Linus Torvalds <torvalds@linux-foundation.org> writes:
>
> I usually just compile a small program like

Just use scripts/decodecode and cat the Code line into that.

> particularly good way to do it, and the old "ksymoops" program used to do 
> a pretty good job of this, but I'm used to that particular idiotic way 
> myself, since it's how I've basically always done it)
>
> After that, you still need to try to match up the assembly code with the 
> source code and figure out what variables the register contents actually 
> are all about. You can often try to do a
>
> 	make the/affected/file.s


IMHO better is  

make the/file/xyz.lst        

which gives you a listing with binary data in there which can be
grepped for.

But you should install a very recent binutils because older objdump -S
couldn't deal with unit-at-a-time compilers.

-Andi

^ permalink raw reply

* [ANNOUNCE] iproute2-2.6.24-rc7
From: Stephen Hemminger @ 2008-01-08 17:12 UTC (permalink / raw)
  To: netdev, lartc

This is a preliminary release that includes all the changes for new
features in 2.6.24.  It should be backward compatible with older kernels.

   http://devresources.linux-foundation.org/dev/iproute2/download/iproute2-2.6.24-rc7.tar.bz2

Note: This release is for validation (don't put it in your distros), therefore
I didn't bother signing it.

Changelog since v2.6.23 release (edited).

Alexander Wirt (2):
      Fix various typos and nitpicks
      Add parameters to usage help text.

Andreas Barth (1):
      Remove bogus reference to tc-filters(8) from tc(8) manpage.

Andreas Henriksson (4):
      Fix corruption when using batch files with comments and broken lines.
      iproute2: support dotted-quad netmask notation.
      iproute2: revert syntax help text mistake.
      iproute2: add synonyms for ip rule options to ip(8) manpage.

Denys Fedoryshchenko (1):
      iptables compatiablity

François Delawarde (1):
      tc mask patch

Herbert Xu:
      Fix typo in tunnel code (o_key vs. i_key).
      Add NAT action

Jesper Dangaard Brouer (3):
      Overhead calculation is now done in the kernel.
      Cleanup: tc_calc_rtable().
      Change the rate table calc of transmit cost to use upper bound value.

Patrick McHardy (1):
      iproute 2.6.23 incompatibility

Pavel Emelyanov (1):
      iplink_parse() routine

Stephen Hemminger
      2.6.24-rc3 headers
      Fix off by one in nested attribute management.
      Fix dotted quad for bit order
      veth: use kernel header file
      snapshot target for makefile
      veth.h move to linux/
      Manual page fixes
      add decode of match rules
      Use netinet/tcp.h (with correction) rather than kernel headers
      add include/netinet/tcp.h
      Revert "TC action parsing bug fix"

Tomas Janousek (1):
      Correct documentation regarding PROMISC and ALLMULTI.

Vitaliy Gusev (2):
      Fix lost export-dynamic
      veth device link management

YOSHIFUJI Hideaki / 吉藤英明 (1):
      rto_min value display overflow


^ permalink raw reply

* Re: [PATCH 6/8] [PATCH] Split up rndis_host.c
From: Johannes Berg @ 2008-01-08 17:32 UTC (permalink / raw)
  To: David Brownell
  Cc: Jussi Kivilinna, bjd-a1rhEgazXTw, netdev-u79uwXL29TY76Z2rM5mHXA,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <200801080319.23299.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 422 bytes --]


> I see that the rndis_wext.c Kconfig won't kick in unless the
> 802.11 stuff is available ... what additional dependencies
> does that imply for a fatter rndis_host module?

No extra modules are currently required for just plain wext [1]. In the
future, we hope to migrate stuff to cfg80211 though, which is a separate
module.

johannes

[1] mostly because all the code is simply compiled into the kernel...

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Arjan van de Ven @ 2008-01-08 17:42 UTC (permalink / raw)
  To: Randy Dunlap
  Cc: Linus Torvalds, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <20080108081401.d9576ac5.randy.dunlap@oracle.com>

Randy Dunlap wrote:
>>
>> (You can do it other and smarter ways too, I'm not claiming that's a 
>> particularly good way to do it, and the old "ksymoops" program used to do 
>> a pretty good job of this, but I'm used to that particular idiotic way 
>> myself, since it's how I've basically always done it)
> 
> One other way to do it (at least for x86-32/64) is to use
> $kerneltree/scripts/decodecode.  It may work on other $arches also,
> but I haven't tested it on others.

I've made life easier for those using the www.kerneloops.org website;
at least for x86 oopses the website now does this for you and shows
the decoded Code: line in the raw oops data:

http://www.kerneloops.org/raw.php?rawid=2716

^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Linus Torvalds @ 2008-01-08 18:08 UTC (permalink / raw)
  To: Arjan van de Ven
  Cc: Randy Dunlap, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <4783B602.1050307@linux.intel.com>



On Tue, 8 Jan 2008, Arjan van de Ven wrote:
> 
> I've made life easier for those using the www.kerneloops.org website;
> at least for x86 oopses the website now does this for you and shows
> the decoded Code: line in the raw oops data:
> 
> http://www.kerneloops.org/raw.php?rawid=2716

Cool.

One thing I wonder about - could you separate out the bug-ons and warnings 
from the oopses? They really are different issues, and an oops with 
register information etc is very different from a BUG() with line numbers, 
which in turn is very different from a WARN_ON().

Right now, it says

	Oopses reported for kernel 2.6.24-rc7


	7 oopses reported

	hfsplus_releasepage	3
	enqueue_task		1
	lock_acquire		1
	__hfs_brec_find		1
	__ieee80211_rx		1

and in fact three of those five entries are really WARN_ON's. It would be 
nicer if it would look more along the lines of

	Backtraces reported for kernel 2.6.24-rc7


	4 oopses reported

	hfsplus_releasepage     3
	__hfs_brec_find         1


	3 warnings repored

	enqueue_task            1
	lock_acquire            1
	__ieee80211_rx          1

because those things really don't have the same kind of impact at all, and 
tend to be very different to debug (a "BUG_ON()" is perhaps somewhat 
closer to an oops, but a WARN_ON() is definitely in a class of its own).

On that "Code:" side, it seems there is still some problem with oops 
parsing. See for example:

	http://www.kerneloops.org/raw.php?rawid=1521&msgid=http://mid.gmane.org/20071017154655.GA13394@elte.hu

and notice how the Code: never made it into the raw message (and thus 
there is also no instruction disassembly).

			Linus

^ permalink raw reply

* RE: [PATCH 3/7]: [NET]: Do not check netif_running() and carrier state in ->poll()
From: Ramkrishna Vepa @ 2008-01-08 18:17 UTC (permalink / raw)
  To: David Miller, netdev
In-Reply-To: <20080107.213907.160610552.davem@davemloft.net>

Dave,

This change is not required as the macro, is_s2io_card_up() checks for
an internal state of the adapter and not netif's state. We want to make
sure that the adapter registers are not accessed when the adapter is
being brought down.

> @@ -2704,9 +2704,6 @@ static int s2io_poll(struct napi_struct *napi,
int
> budget)
>  	struct XENA_dev_config __iomem *bar0 = nic->bar0;
>  	int i;
> 
> -	if (!is_s2io_card_up(nic))
> -		return 0;
> -
>  	mac_control = &nic->mac_control;
>  	config = &nic->config;
> 

Ram

^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Arjan van de Ven @ 2008-01-08 18:16 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Randy Dunlap, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <alpine.LFD.1.00.0801080957280.3148@woody.linux-foundation.org>

Linus Torvalds wrote:
> Cool.
> 
> One thing I wonder about - could you separate out the bug-ons and warnings 
> from the oopses? They really are different issues, and an oops with 
> register information etc is very different from a BUG() with line numbers, 
> which in turn is very different from a WARN_ON().


> and in fact three of those five entries are really WARN_ON's. It would be 
> nicer if it would look more along the lines of
> 
> 	Backtraces reported for kernel 2.6.24-rc7
> 
> 
> 	4 oopses reported
> 
> 	hfsplus_releasepage     3
> 	__hfs_brec_find         1
> 
> 
> 	3 warnings repored
> 
> 	enqueue_task            1
> 	lock_acquire            1
> 	__ieee80211_rx          1
> 
> because those things really don't have the same kind of impact at all, and 
> tend to be very different to debug (a "BUG_ON()" is perhaps somewhat 
> closer to an oops, but a WARN_ON() is definitely in a class of its own).

the database has the information so it's just a matter of slightly different php code ;)
Before I do that... do you want the BUG's separate, part of the warnings or part of the oopses?
(I rather make this change once ;)

> 
> On that "Code:" side, it seems there is still some problem with oops 
> parsing. See for example:
> 
> 	http://www.kerneloops.org/raw.php?rawid=1521&msgid=http://mid.gmane.org/20071017154655.GA13394@elte.hu
> 
> and notice how the Code: never made it into the raw message (and thus 
> there is also no instruction disassembly).

ok I'll fix this; I can fix this for all new entries at least, fixing retroactive is going to be
near impossible I suspect.

^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Linus Torvalds @ 2008-01-08 18:27 UTC (permalink / raw)
  To: Arjan van de Ven
  Cc: Randy Dunlap, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <4783BE06.1070507@linux.intel.com>



On Tue, 8 Jan 2008, Arjan van de Ven wrote:
> 
> the database has the information so it's just a matter of slightly different
> php code ;)
> Before I do that... do you want the BUG's separate, part of the warnings or
> part of the oopses?
> (I rather make this change once ;)

I'd like them all separate, they tend to be very different and contain 
different information.

Put the warnings last, as the least important. Oopses at the top, since 
they tend to be the ones that are less expected.

> > and notice how the Code: never made it into the raw message (and thus there
> > is also no instruction disassembly).
> 
> ok I'll fix this; I can fix this for all new entries at least, fixing
> retroactive is going to be near impossible I suspect.

Oh well..

		Linus

^ permalink raw reply

* RE: WARNING: at kernel/softirq.c:139 local_bh_enable()
From: Jayakrishnan.Chathu @ 2008-01-08 18:36 UTC (permalink / raw)
  To: auke-jan.h.kok; +Cc: linux-kernel, netdev
In-Reply-To: <4782CD50.90006@intel.com>

It is an embedded system, With a small file system and 2.6.23 kernel.
There are no link-monitoring tool running.  I will
Try to reproduce with 2.6.24-rc7. 

Chathu

-----Original Message-----
From: ext Kok, Auke [mailto:auke-jan.h.kok@intel.com] 
Sent: Monday, January 07, 2008 5:10 PM
To: Chathu Jayakrishnan (Nokia-S&S/MtView)
Cc: linux-kernel@vger.kernel.org; NetDev
Subject: Re: WARNING: at kernel/softirq.c:139 local_bh_enable()

Jayakrishnan.Chathu@nokia.com wrote:
> I am running 2.6.23 kernel on a DUAL core and QUAD core i386 boxes and

> after everyboot, when the ethernet traffic starts i get this warning.
> 
> All the ports in the system are e1000 and i am using the kernel e1000 
> driver.

[added netdev to the Cc:]

can you repro this with 2.6.24-rc7? What distro are you using? Is your
distro running a link-monitoring tool of some sorts?

Auke



> 
> Jan  7 22:31:00 localhost [warning] WARNING: at kernel/softirq.c:139
> local_bh_enable()
> Jan  7 22:31:00 localhost [warning] [<c012bd0f>]
> local_bh_enable+0x49/0xa9
> Jan  7 22:31:00 localhost [warning] [<c039ba1a>]
> dev_queue_xmit+0x26c/0x275
> Jan  7 22:31:00 localhost [warning] [<c03cdf6c>] arp_xmit+0x4d/0x51 
> Jan  7 22:31:00 localhost [warning] [<c03cd9f6>] 
> arp_solicit+0x156/0x174
> 
> Jan  7 22:31:00 localhost [warning] [<c03a047f>]
> neigh_timer_handler+0x1e0/0x224
> Jan  7 22:31:00 localhost [warning] [<c012f820>]
> run_timer_softirq+0x113/0x172
> Jan  7 22:31:00 localhost [warning] [<c013b042>] WARNING: at
> kernel/softirq.c:139 local_bh_enable() Jan  7 22:31:00 localhost 
> [warning] hrtimer_interrupt+0x19c/0x1c4 Jan  7 22:31:00 localhost 
> [warning] [<c014002a>]  [<c012bd0f>]
> local_bh_enable+0x49/0xa9
> Jan  7 22:31:00 localhost [warning] [<c039ba1a>]
> dev_queue_xmit+0x26c/0x275
> Jan  7 22:31:00 localhost [warning] [<c03a0c05>] 
> neigh_resolve_output+0x12c/0x15e Jan  7 22:31:00 localhost [warning] 
> [<c03a0881>] neigh_update+0x246/0x2cb Jan  7 22:31:00 localhost 
> [warning] [<c039fb21>] neigh_lookup+0xa9/0xb3 Jan  7 22:31:00 
> localhost [warning] [<c03ce410>] arp_process+0x43c/0x477
> 
> Jan  7 22:31:00 localhost [warning] [<c0120b73>] 
> enqueue_task_fair+0x2d/0x30 Jan  7 22:31:00 localhost [warning] 
> tick_sched_timer+0x0/0xba Jan  7 22:31:00 localhost [warning] 
> [<c03ce554>] arp_rcv+0x104/0x119 Jan  7 22:31:00 localhost [warning] 
> [<c03a029f>]  [<c039bda6>] netif_receive_skb+0x1c5/0x1de Jan  7 
> 22:31:00 localhost [warning] [<f897a61d>] 
> e1000_clean_rx_irq+0x40e/0x4ca [e1000] Jan  7 22:31:00 localhost 
> [warning] [<c013bdc6>]
> getnstimeofday+0x36/0x10c
> Jan  7 22:31:00 localhost [warning] neigh_timer_handler+0x0/0x224 Jan

> 7 22:31:00 localhost [warning] [<c012be12>] __do_softirq+0x60/0xc1 Jan

> 7 22:31:00 localhost [warning] [<f8979e34>] e1000_clean+0x74/0x119 
> [e1000] Jan  7 22:31:00 localhost [warning] [<c039bf03>]  [<c012bea4>]
> net_rx_action+0x5a/0xd3
> Jan  7 22:31:00 localhost [warning] [<c012be12>] 
> __do_softirq+0x60/0xc1 Jan  7 22:31:00 localhost [warning] 
> do_softirq+0x31/0x35 Jan  7 22:31:00 localhost [warning] [<c012bea4>] 
> do_softirq+0x31/0x35 Jan  7 22:31:00 localhost [warning] [<c012bf03>] 
> irq_exit+0x38/0x6b Jan  7 22:31:00 localhost [warning] [<c0106a1e>]  
> [<c012bf03>]
> do_IRQ+0x80/0x93
> Jan  7 22:31:00 localhost [warning] irq_exit+0x38/0x6b Jan  7 22:31:00

> localhost [warning] [<c01057b7>]
> common_interrupt+0x23/0x28
> Jan  7 22:31:00 localhost [warning] [<c01600d8>]  [<c011a34d>]
> get_swap_page+0xe7/0x215
> Jan  7 22:31:00 localhost [warning] [<c0103232>]
> mwait_idle_with_hints+0x34/0x38 Jan  7 22:31:00 localhost [warning] 
> [<c0103236>] mwait_idle+0x0/0xa Jan  7 22:31:00 localhost [warning] 
> [<c01030f2>] cpu_idle+0x98/0xb9 Jan  7 22:31:00 localhost [warning] 
> smp_apic_timer_interrupt+0x2c/0x35
> Jan  7 22:31:00 localhost [warning] ======================= Jan  7 
> 22:31:00 localhost [warning] [<c0105874>] 
> apic_timer_interrupt+0x28/0x30 Jan  7 22:31:00 localhost [warning] 
> [<c01600d8>]
> get_swap_page+0xe7/0x215
> Jan  7 22:31:00 localhost [warning] [<c0103232>]
> mwait_idle_with_hints+0x34/0x38
> Jan  7 22:31:00 localhost [warning] [<c0103236>] mwait_idle+0x0/0xa 
> Jan  7 22:31:00 localhost [warning] [<c01030f2>] cpu_idle+0x98/0xb9 
> Jan  7 22:31:00 localhost [warning] =======================
> 
> 
> Thanks
> Jayakrishnan Chathu
> --
> To unsubscribe from this list: send the line "unsubscribe
linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply

* [XFRM]: xfrm_algo_clone() allocates too much memory
From: Eric Dumazet @ 2008-01-08 18:37 UTC (permalink / raw)
  To: David S. Miller; +Cc: Linux Netdev List

[-- Attachment #1: Type: text/plain, Size: 378 bytes --]

alg_key_len is the length in bits of the key, not in bytes.

Best way to fix this is to move alg_len() function from net/xfrm/xfrm_user.c 
to include/net/xfrm.h, and to use it in xfrm_algo_clone()

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>

  include/net/xfrm.h   |    7 ++++++-
  net/xfrm/xfrm_user.c |    5 -----
  2 files changed, 6 insertions(+), 6 deletions(-)





[-- Attachment #2: xfrm_algo_clone.patch --]
[-- Type: text/plain, Size: 1074 bytes --]

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 58dfa82..731f0a8 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -1188,10 +1188,15 @@ static inline int xfrm_aevent_is_on(void)
 	return ret;
 }
 
+static inline int alg_len(struct xfrm_algo *alg)
+{
+	return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
+}
+
 #ifdef CONFIG_XFRM_MIGRATE
 static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
 {
-	return (struct xfrm_algo *)kmemdup(orig, sizeof(*orig) + orig->alg_key_len, GFP_KERNEL);
+	return kmemdup(orig, alg_len(orig), GFP_KERNEL);
 }
 
 static inline void xfrm_states_put(struct xfrm_state **states, int n)
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index e75dbdc..aa667a4 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -31,11 +31,6 @@
 #include <linux/in6.h>
 #endif
 
-static inline int alg_len(struct xfrm_algo *alg)
-{
-	return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
-}
-
 static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type)
 {
 	struct nlattr *rt = attrs[type];

^ permalink raw reply related

* Re: [PATCH 6/8] [PATCH] Split up rndis_host.c
From: David Brownell @ 2008-01-08 18:49 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Jussi Kivilinna, bjd-a1rhEgazXTw, netdev-u79uwXL29TY76Z2rM5mHXA,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1199813561.6762.13.camel-YfaajirXv214zXjbi5bjpg@public.gmane.org>

On Tuesday 08 January 2008, Johannes Berg wrote:
> 
> > I see that the rndis_wext.c Kconfig won't kick in unless the
> > 802.11 stuff is available ... what additional dependencies
> > does that imply for a fatter rndis_host module?
> 
> No extra modules are currently required for just plain wext [1]. In the
> future, we hope to migrate stuff to cfg80211 though, which is a separate
> module.

Hmmm.  Well, go the current route then ... but come up with a good
plan to split it up later, so that connecting a typical non-wireless
RNDIS device won't incur such needless extra modules.

- Dave


> johannes
> 
> [1] mostly because all the code is simply compiled into the kernel...
> 

^ permalink raw reply

* Re: [PATCH 0/3] bonding: 3 fixes for 2.6.24
From: Krzysztof Oledzki @ 2008-01-08 18:50 UTC (permalink / raw)
  To: Jay Vosburgh; +Cc: netdev, Jeff Garzik, David Miller, Andy Gospodarek
In-Reply-To: <11997574203125-git-send-email-fubar@us.ibm.com>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 56733 bytes --]



On Mon, 7 Jan 2008, Jay Vosburgh wrote:

> 	Following are three fixes to fix locking problems and
> silence locking-related warnings in the current 2.6.24-rc.
>
> 	patch 1: fix locking in sysfs primary/active selection
>
> 	Call core network functions with expected locks to
> eliminate potential deadlock and silence warnings.
>
> 	patch 2: fix ASSERT_RTNL that produces spurious warnings
>
> 	Relocate ASSERT_RTNL to remove a false warning; after patch,
> ASSERT is located in code that holds only RTNL (additional locks were
> causing the ASSERT to trip)
>
> 	patch 3: fix locking during alb failover and slave removal
>
> 	Fix all call paths into alb_fasten_mac_swap to hold only RTNL.
> Eliminates deadlock and silences warnings.
>
> 	Patches are against the current netdev-2.6#upstream branch.
>
> 	Please apply for 2.6.24.

2.6.24-rc7 + patches #1, #2, #3:

bonding: bond0: setting mode to active-backup (1).
bonding: bond0: Setting MII monitoring interval to 100.
ADDRCONF(NETDEV_UP): bond0: link is not ready
bonding: bond0: Adding slave eth0.
e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
bonding: bond0: making interface eth0 the new active one.
bonding: bond0: first active interface up!
bonding: bond0: enslaving eth0 as an active interface with an up link.
bonding: bond0: Adding slave eth1.
ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready

=========================================================
[ INFO: possible irq lock inversion dependency detected ]
2.6.24-rc7 #1
---------------------------------------------------------
events/0/9 just changed the state of lock:
  (&mc->mca_lock){-+..}, at: [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
but this lock took another, soft-read-irq-unsafe lock in the past:
  (&bond->lock){-.--}

and interrupts could create inverse lock ordering between them.


other info that might help us debug this:
4 locks held by events/0/9:
  #0:  (events){--..}, at: [<c0133d33>] run_workqueue+0x87/0x1b6
  #1:  ((linkwatch_work).work){--..}, at: [<c0133d33>] run_workqueue+0x87/0x1b6
  #2:  (rtnl_mutex){--..}, at: [<c03ac678>] linkwatch_event+0x5/0x22
  #3:  (&ndev->lock){-.-+}, at: [<c0412475>] mld_ifc_timer_expire+0x17/0x1fb

the first lock's dependencies:
-> (&mc->mca_lock){-+..} ops: 10 {
    initial-use  at:
                         [<c0104ee2>] dump_trace+0x83/0x8d
                         [<c0142890>] __lock_acquire+0x4ba/0xc07
                         [<c0109ef2>] save_stack_trace+0x20/0x3a
                         [<c0142f95>] __lock_acquire+0xbbf/0xc07
                         [<c0412d66>] ipv6_dev_mc_inc+0x24d/0x31c
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                         [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                         [<c0412d66>] ipv6_dev_mc_inc+0x24d/0x31c
                         [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                         [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                         [<c0402168>] ipv6_add_dev+0x21c/0x24b
                         [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                         [<c05c5ae9>] addrconf_init+0x13/0x193
                         [<c019a04b>] proc_net_fops_create+0x10/0x21
                         [<c041a44c>] ip6_flowlabel_init+0x1e/0x20
                         [<c05c59c9>] inet6_init+0x1f0/0x2ad
                         [<c05a9499>] kernel_init+0x150/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
    in-softirq-W at:
                         [<c014197a>] mark_lock+0x64/0x451
                         [<c0142816>] __lock_acquire+0x440/0xc07
                         [<c0103f7b>] restore_nocheck+0x12/0x15
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
                         [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
                         [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                         [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
                         [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
                         [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
                         [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
                         [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
                         [<c012e02e>] run_timer_softirq+0xfa/0x15d
                         [<c012a982>] __do_softirq+0x56/0xdb
                         [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
                         [<c012a994>] __do_softirq+0x68/0xdb
                         [<c012aa3d>] do_softirq+0x36/0x51
                         [<c012af26>] local_bh_enable_ip+0xad/0xed
                         [<c03bfa37>] rt_run_flush+0x64/0x8b
                         [<c03e9bbe>] fib_netdev_event+0x61/0x65
                         [<c013ac34>] notifier_call_chain+0x2a/0x52
                         [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
                         [<c03a340d>] netdev_state_change+0x18/0x29
                         [<c03ac645>] __linkwatch_run_queue+0x150/0x17e
                         [<c03ac690>] linkwatch_event+0x1d/0x22
                         [<c0133d87>] run_workqueue+0xdb/0x1b6
                         [<c0133d33>] run_workqueue+0x87/0x1b6
                         [<c03ac673>] linkwatch_event+0x0/0x22
                         [<c01347a7>] worker_thread+0x0/0x85
                         [<c0134820>] worker_thread+0x79/0x85
                         [<c0137255>] autoremove_wake_function+0x0/0x35
                         [<c013719e>] kthread+0x38/0x5e
                         [<c0137166>] kthread+0x0/0x5e
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
    hardirq-on-W at:
                         [<c01417e2>] find_usage_backwards+0xbb/0xe2
                         [<c0104ee2>] dump_trace+0x83/0x8d
                         [<c014285e>] __lock_acquire+0x488/0xc07
                         [<c0109ef2>] save_stack_trace+0x20/0x3a
                         [<c0142f95>] __lock_acquire+0xbbf/0xc07
                         [<c0412d66>] ipv6_dev_mc_inc+0x24d/0x31c
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c04129ea>] igmp6_group_added+0x18/0x11d
                         [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                         [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                         [<c0412d66>] ipv6_dev_mc_inc+0x24d/0x31c
                         [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                         [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                         [<c0402168>] ipv6_add_dev+0x21c/0x24b
                         [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                         [<c05c5ae9>] addrconf_init+0x13/0x193
                         [<c019a04b>] proc_net_fops_create+0x10/0x21
                         [<c041a44c>] ip6_flowlabel_init+0x1e/0x20
                         [<c05c59c9>] inet6_init+0x1f0/0x2ad
                         [<c05a9499>] kernel_init+0x150/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
  }
  ... key      at: [<c087e2d8>] __key.30803+0x0/0x8
  -> (_xmit_ETHER){-...} ops: 8 {
     initial-use  at:
                           [<c0142890>] __lock_acquire+0x4ba/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
     hardirq-on-W at:
                           [<c014197a>] mark_lock+0x64/0x451
                           [<c014285e>] __lock_acquire+0x488/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
   }
   ... key      at: [<c087adc8>] netdev_xmit_lock_key+0x8/0x1c0
  ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043a8aa>] _spin_lock_bh+0x3b/0x64
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c0412a28>] igmp6_group_added+0x56/0x11d
    [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
    [<c0410100>] icmpv6_rcv+0x6a4/0x828
    [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
    [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
    [<c0402168>] ipv6_add_dev+0x21c/0x24b
    [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
    [<c040274b>] addrconf_notify+0x60/0x7b7
    [<c0142f95>] __lock_acquire+0xbbf/0xc07
    [<c0141da0>] mark_held_locks+0x39/0x53
    [<c043997e>] mutex_lock_nested+0x286/0x2ac
    [<c0141f93>] trace_hardirqs_on+0x122/0x14c
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c03a4875>] register_netdevice_notifier+0xe/0x126
    [<c03a4875>] register_netdevice_notifier+0xe/0x126
    [<c03a48b0>] register_netdevice_notifier+0x49/0x126
    [<c05c5b83>] addrconf_init+0xad/0x193
    [<c05c5af1>] addrconf_init+0x1b/0x193
    [<c05c59c9>] inet6_init+0x1f0/0x2ad
    [<c05a9499>] kernel_init+0x150/0x2b7
    [<c05a9349>] kernel_init+0x0/0x2b7
    [<c05a9349>] kernel_init+0x0/0x2b7
    [<c0104baf>] kernel_thread_helper+0x7/0x10
    [<ffffffff>] 0xffffffff

  -> (&bonding_netdev_xmit_lock_key){-...} ops: 6 {
     initial-use  at:
                           [<c0142890>] __lock_acquire+0x4ba/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
     hardirq-on-W at:
                           [<c014197a>] mark_lock+0x64/0x451
                           [<c014285e>] __lock_acquire+0x488/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
   }
   ... key      at: [<c0877804>] bonding_netdev_xmit_lock_key+0x0/0x8
   -> (&bond->lock){-.--} ops: 99 {
      initial-use  at:
                             [<c013fe29>] put_lock_stats+0xa/0x1e
                             [<c0142890>] __lock_acquire+0x4ba/0xc07
                             [<c0141da0>] mark_held_locks+0x39/0x53
                             [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                             [<c0143056>] lock_acquire+0x79/0x93
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c043aa36>] _read_lock_bh+0x3b/0x64
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c03aad0f>] rtnl_fill_ifinfo+0x2bf/0x563
                             [<c03ab28d>] rtmsg_ifinfo+0x5d/0xdf
                             [<c03ab34e>] rtnetlink_event+0x3f/0x42
                             [<c013ac34>] notifier_call_chain+0x2a/0x52
                             [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
                             [<c03a3b06>] register_netdevice+0x2a7/0x2e7
                             [<c02ed842>] bond_create+0x1f2/0x26a
                             [<c05bed76>] bonding_init+0x761/0x7ea
                             [<c05be5de>] e1000_init_module+0x45/0x7c
                             [<c05a9499>] kernel_init+0x150/0x2b7
                             [<c05a9349>] kernel_init+0x0/0x2b7
                             [<c05a9349>] kernel_init+0x0/0x2b7
                             [<c0104baf>] kernel_thread_helper+0x7/0x10
                             [<ffffffff>] 0xffffffff
      hardirq-on-W at:
                             [<c014285e>] __lock_acquire+0x488/0xc07
                             [<c01208c9>] try_to_wake_up+0x2ce/0x2d8
                             [<c0142f95>] __lock_acquire+0xbbf/0xc07
                             [<c0143056>] lock_acquire+0x79/0x93
                             [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                             [<c043a96d>] _write_lock_bh+0x3b/0x64
                             [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                             [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                             [<c013fe29>] put_lock_stats+0xa/0x1e
                             [<c03a1e03>] __dev_set_rx_mode+0x7b/0x7d
                             [<c03a1f9d>] dev_set_rx_mode+0x23/0x36
                             [<c03a4678>] dev_open+0x5e/0x77
                             [<c03a3347>] dev_change_flags+0x9d/0x14b
                             [<c03a214b>] __dev_get_by_name+0x68/0x73
                             [<c03e4176>] devinet_ioctl+0x22b/0x536
                             [<c03a446d>] dev_ioctl+0x46f/0x5b7
                             [<c039a598>] sock_ioctl+0x167/0x18b
                             [<c039a431>] sock_ioctl+0x0/0x18b
                             [<c0172677>] do_ioctl+0x1f/0x62
                             [<c01728e7>] vfs_ioctl+0x22d/0x23f
                             [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                             [<c017292c>] sys_ioctl+0x33/0x4b
                             [<c0103e92>] sysenter_past_esp+0x5f/0xa5
                             [<ffffffff>] 0xffffffff
      softirq-on-R at:
                             [<c014197a>] mark_lock+0x64/0x451
                             [<c013583a>] __kernel_text_address+0x5/0xe
                             [<c0104ee2>] dump_trace+0x83/0x8d
                             [<c014287d>] __lock_acquire+0x4a7/0xc07
                             [<c013fc6a>] save_trace+0x37/0x89
                             [<c0133d33>] run_workqueue+0x87/0x1b6
                             [<c0143056>] lock_acquire+0x79/0x93
                             [<c02eee43>] bond_mii_monitor+0x19/0x85
                             [<c043aa95>] _read_lock+0x36/0x5f
                             [<c02eee43>] bond_mii_monitor+0x19/0x85
                             [<c02eee43>] bond_mii_monitor+0x19/0x85
                             [<c0133d87>] run_workqueue+0xdb/0x1b6
                             [<c0133d33>] run_workqueue+0x87/0x1b6
                             [<c02eee2a>] bond_mii_monitor+0x0/0x85
                             [<c01347a7>] worker_thread+0x0/0x85
                             [<c0134820>] worker_thread+0x79/0x85
                             [<c0137255>] autoremove_wake_function+0x0/0x35
                             [<c013719e>] kthread+0x38/0x5e
                             [<c0137166>] kthread+0x0/0x5e
                             [<c0104baf>] kernel_thread_helper+0x7/0x10
                             [<ffffffff>] 0xffffffff
      hardirq-on-R at:
                             [<c013fdfe>] get_lock_stats+0xd/0x2e
                             [<c013fe29>] put_lock_stats+0xa/0x1e
                             [<c0142838>] __lock_acquire+0x462/0xc07
                             [<c0141da0>] mark_held_locks+0x39/0x53
                             [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                             [<c0143056>] lock_acquire+0x79/0x93
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c043aa36>] _read_lock_bh+0x3b/0x64
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c02edca1>] bond_get_stats+0x28/0xd0
                             [<c03aad0f>] rtnl_fill_ifinfo+0x2bf/0x563
                             [<c03ab28d>] rtmsg_ifinfo+0x5d/0xdf
                             [<c03ab34e>] rtnetlink_event+0x3f/0x42
                             [<c013ac34>] notifier_call_chain+0x2a/0x52
                             [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
                             [<c03a3b06>] register_netdevice+0x2a7/0x2e7
                             [<c02ed842>] bond_create+0x1f2/0x26a
                             [<c05bed76>] bonding_init+0x761/0x7ea
                             [<c05be5de>] e1000_init_module+0x45/0x7c
                             [<c05a9499>] kernel_init+0x150/0x2b7
                             [<c05a9349>] kernel_init+0x0/0x2b7
                             [<c05a9349>] kernel_init+0x0/0x2b7
                             [<c0104baf>] kernel_thread_helper+0x7/0x10
                             [<ffffffff>] 0xffffffff
    }
    ... key      at: [<c08777d0>] __key.32976+0x0/0x8
    -> (_xmit_ETHER){-...} ops: 8 {
       initial-use  at:
                               [<c0142890>] __lock_acquire+0x4ba/0xc07
                               [<c0143056>] lock_acquire+0x79/0x93
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c0412a28>] igmp6_group_added+0x56/0x11d
                               [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                               [<c0410100>] icmpv6_rcv+0x6a4/0x828
                               [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                               [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                               [<c0402168>] ipv6_add_dev+0x21c/0x24b
                               [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                               [<c040274b>] addrconf_notify+0x60/0x7b7
                               [<c0142f95>] __lock_acquire+0xbbf/0xc07
                               [<c0141da0>] mark_held_locks+0x39/0x53
                               [<c043997e>] mutex_lock_nested+0x286/0x2ac
                               [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                               [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                               [<c03a4875>] register_netdevice_notifier+0xe/0x126
                               [<c03a4875>] register_netdevice_notifier+0xe/0x126
                               [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                               [<c05c5b83>] addrconf_init+0xad/0x193
                               [<c05c5af1>] addrconf_init+0x1b/0x193
                               [<c05c59c9>] inet6_init+0x1f0/0x2ad
                               [<c05a9499>] kernel_init+0x150/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c0104baf>] kernel_thread_helper+0x7/0x10
                               [<ffffffff>] 0xffffffff
       hardirq-on-W at:
                               [<c014197a>] mark_lock+0x64/0x451
                               [<c014285e>] __lock_acquire+0x488/0xc07
                               [<c0143056>] lock_acquire+0x79/0x93
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c03a63c9>] dev_mc_add+0x1a/0x6a
                               [<c0412a28>] igmp6_group_added+0x56/0x11d
                               [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                               [<c0410100>] icmpv6_rcv+0x6a4/0x828
                               [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                               [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                               [<c0402168>] ipv6_add_dev+0x21c/0x24b
                               [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                               [<c040274b>] addrconf_notify+0x60/0x7b7
                               [<c0142f95>] __lock_acquire+0xbbf/0xc07
                               [<c0141da0>] mark_held_locks+0x39/0x53
                               [<c043997e>] mutex_lock_nested+0x286/0x2ac
                               [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                               [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                               [<c03a4875>] register_netdevice_notifier+0xe/0x126
                               [<c03a4875>] register_netdevice_notifier+0xe/0x126
                               [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                               [<c05c5b83>] addrconf_init+0xad/0x193
                               [<c05c5af1>] addrconf_init+0x1b/0x193
                               [<c05c59c9>] inet6_init+0x1f0/0x2ad
                               [<c05a9499>] kernel_init+0x150/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c0104baf>] kernel_thread_helper+0x7/0x10
                               [<ffffffff>] 0xffffffff
     }
     ... key      at: [<c087adc8>] netdev_xmit_lock_key+0x8/0x1c0
    ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
    [<c0109ef2>] save_stack_trace+0x20/0x3a
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043a8aa>] _spin_lock_bh+0x3b/0x64
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c02ee472>] bond_change_active_slave+0x1a9/0x3bf
    [<c02ec7a3>] bond_update_speed_duplex+0x26/0x65
    [<c02ee991>] bond_select_active_slave+0x97/0xd3
    [<c02ed20b>] bond_compute_features+0x45/0x84
    [<c02ef9b6>] bond_enslave+0x6a7/0x884
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c02f61af>] bonding_store_slaves+0x1ae/0x2fb
    [<c02f6001>] bonding_store_slaves+0x0/0x2fb
    [<c02ce8b7>] dev_attr_store+0x27/0x2c
    [<c019bda1>] sysfs_write_file+0xad/0xe0
    [<c019bcf4>] sysfs_write_file+0x0/0xe0
    [<c0168e5c>] vfs_write+0x8a/0x10c
    [<c0118562>] do_page_fault+0x0/0x54a
    [<c01693e1>] sys_write+0x41/0x67
    [<c0103e92>] sysenter_past_esp+0x5f/0xa5
    [<ffffffff>] 0xffffffff

    -> (lweventlist_lock){.+..} ops: 10 {
       initial-use  at:
                               [<c014197a>] mark_lock+0x64/0x451
                               [<c0142890>] __lock_acquire+0x4ba/0xc07
                               [<c02e363c>] e1000_read_phy_reg+0x1c7/0x1d3
                               [<c02e346b>] e1000_write_phy_reg+0xb9/0xc3
                               [<c024a82e>] delay_tsc+0x25/0x3b
                               [<c0143056>] lock_acquire+0x79/0x93
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
                               [<c02e1c23>] e1000_probe+0xad1/0xbe8
                               [<c0257f1b>] pci_device_probe+0x36/0x57
                               [<c02d0e3f>] driver_probe_device+0xe1/0x15f
                               [<c043ae41>] _spin_unlock+0x25/0x3b
                               [<c0437ec6>] klist_next+0x58/0x6d
                               [<c02d0f4f>] __driver_attach+0x0/0x7f
                               [<c02d0f98>] __driver_attach+0x49/0x7f
                               [<c02d03e3>] bus_for_each_dev+0x36/0x58
                               [<c02d0c97>] driver_attach+0x16/0x18
                               [<c02d0f4f>] __driver_attach+0x0/0x7f
                               [<c02d06da>] bus_add_driver+0x6d/0x18d
                               [<c0258065>] __pci_register_driver+0x53/0x7f
                               [<c05be5de>] e1000_init_module+0x45/0x7c
                               [<c05a9499>] kernel_init+0x150/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c05a9349>] kernel_init+0x0/0x2b7
                               [<c0104baf>] kernel_thread_helper+0x7/0x10
                               [<ffffffff>] 0xffffffff
       in-softirq-W at:
                               [<c011d1c0>] __wake_up_common+0x32/0x5c
                               [<c0142816>] __lock_acquire+0x440/0xc07
                               [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                               [<c0143056>] lock_acquire+0x79/0x93
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c02dfee1>] e1000_watchdog+0x0/0x5c9
                               [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                               [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
                               [<c03af46a>] netif_carrier_on+0x16/0x27
                               [<c02e0136>] e1000_watchdog+0x255/0x5c9
                               [<c02dfee1>] e1000_watchdog+0x0/0x5c9
                               [<c012e02e>] run_timer_softirq+0xfa/0x15d
                               [<c012a982>] __do_softirq+0x56/0xdb
                               [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
                               [<c012a994>] __do_softirq+0x68/0xdb
                               [<c012aa3d>] do_softirq+0x36/0x51
                               [<c012abe3>] irq_exit+0x43/0x4e
                               [<c0114122>] smp_apic_timer_interrupt+0x74/0x80
                               [<c0104a01>] apic_timer_interrupt+0x29/0x38
                               [<c0104a0b>] apic_timer_interrupt+0x33/0x38
                               [<c01600d8>] sys_swapon+0x254/0x9aa
                               [<c01021a6>] mwait_idle_with_hints+0x3b/0x3f
                               [<c0102447>] mwait_idle+0x0/0xf
                               [<c0102581>] cpu_idle+0x99/0xc6
                               [<c05a98c7>] start_kernel+0x2c7/0x2cf
                               [<c05a90e0>] unknown_bootoption+0x0/0x195
                               [<ffffffff>] 0xffffffff
     }
     ... key      at: [<c058a194>] lweventlist_lock+0x14/0x40
    ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c0142f95>] __lock_acquire+0xbbf/0xc07
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
    [<c03af46a>] netif_carrier_on+0x16/0x27
    [<c02ede0c>] bond_set_carrier+0x31/0x55
    [<c02ee998>] bond_select_active_slave+0x9e/0xd3
    [<c02ed20b>] bond_compute_features+0x45/0x84
    [<c02ef9b6>] bond_enslave+0x6a7/0x884
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c02f61af>] bonding_store_slaves+0x1ae/0x2fb
    [<c02f6001>] bonding_store_slaves+0x0/0x2fb
    [<c02ce8b7>] dev_attr_store+0x27/0x2c
    [<c019bda1>] sysfs_write_file+0xad/0xe0
    [<c019bcf4>] sysfs_write_file+0x0/0xe0
    [<c0168e5c>] vfs_write+0x8a/0x10c
    [<c0118562>] do_page_fault+0x0/0x54a
    [<c01693e1>] sys_write+0x41/0x67
    [<c0103e92>] sysenter_past_esp+0x5f/0xa5
    [<ffffffff>] 0xffffffff

   ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c02eda55>] bond_set_multicast_list+0x1d/0x241
    [<c0143056>] lock_acquire+0x79/0x93
    [<c02eda55>] bond_set_multicast_list+0x1d/0x241
    [<c043a96d>] _write_lock_bh+0x3b/0x64
    [<c02eda55>] bond_set_multicast_list+0x1d/0x241
    [<c02eda55>] bond_set_multicast_list+0x1d/0x241
    [<c013fe29>] put_lock_stats+0xa/0x1e
    [<c03a1e03>] __dev_set_rx_mode+0x7b/0x7d
    [<c03a1f9d>] dev_set_rx_mode+0x23/0x36
    [<c03a4678>] dev_open+0x5e/0x77
    [<c03a3347>] dev_change_flags+0x9d/0x14b
    [<c03a214b>] __dev_get_by_name+0x68/0x73
    [<c03e4176>] devinet_ioctl+0x22b/0x536
    [<c03a446d>] dev_ioctl+0x46f/0x5b7
    [<c039a598>] sock_ioctl+0x167/0x18b
    [<c039a431>] sock_ioctl+0x0/0x18b
    [<c0172677>] do_ioctl+0x1f/0x62
    [<c01728e7>] vfs_ioctl+0x22d/0x23f
    [<c0141f93>] trace_hardirqs_on+0x122/0x14c
    [<c017292c>] sys_ioctl+0x33/0x4b
    [<c0103e92>] sysenter_past_esp+0x5f/0xa5
    [<ffffffff>] 0xffffffff

  ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043a8aa>] _spin_lock_bh+0x3b/0x64
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c0412a28>] igmp6_group_added+0x56/0x11d
    [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
    [<c0410100>] icmpv6_rcv+0x6a4/0x828
    [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
    [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
    [<c0402168>] ipv6_add_dev+0x21c/0x24b
    [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
    [<c040274b>] addrconf_notify+0x60/0x7b7
    [<c0142f95>] __lock_acquire+0xbbf/0xc07
    [<c0141da0>] mark_held_locks+0x39/0x53
    [<c043997e>] mutex_lock_nested+0x286/0x2ac
    [<c0141f93>] trace_hardirqs_on+0x122/0x14c
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c03a4875>] register_netdevice_notifier+0xe/0x126
    [<c03a4875>] register_netdevice_notifier+0xe/0x126
    [<c03a48b0>] register_netdevice_notifier+0x49/0x126
    [<c05c5b83>] addrconf_init+0xad/0x193
    [<c05c5af1>] addrconf_init+0x1b/0x193
    [<c05c59c9>] inet6_init+0x1f0/0x2ad
    [<c05a9499>] kernel_init+0x150/0x2b7
    [<c05a9349>] kernel_init+0x0/0x2b7
    [<c05a9349>] kernel_init+0x0/0x2b7
    [<c0104baf>] kernel_thread_helper+0x7/0x10
    [<ffffffff>] 0xffffffff


the second lock's dependencies:
-> (&bond->lock){-.--} ops: 99 {
    initial-use  at:
                         [<c013fe29>] put_lock_stats+0xa/0x1e
                         [<c0142890>] __lock_acquire+0x4ba/0xc07
                         [<c0141da0>] mark_held_locks+0x39/0x53
                         [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c043aa36>] _read_lock_bh+0x3b/0x64
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c03aad0f>] rtnl_fill_ifinfo+0x2bf/0x563
                         [<c03ab28d>] rtmsg_ifinfo+0x5d/0xdf
                         [<c03ab34e>] rtnetlink_event+0x3f/0x42
                         [<c013ac34>] notifier_call_chain+0x2a/0x52
                         [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
                         [<c03a3b06>] register_netdevice+0x2a7/0x2e7
                         [<c02ed842>] bond_create+0x1f2/0x26a
                         [<c05bed76>] bonding_init+0x761/0x7ea
                         [<c05be5de>] e1000_init_module+0x45/0x7c
                         [<c05a9499>] kernel_init+0x150/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
    hardirq-on-W at:
                         [<c014285e>] __lock_acquire+0x488/0xc07
                         [<c01208c9>] try_to_wake_up+0x2ce/0x2d8
                         [<c0142f95>] __lock_acquire+0xbbf/0xc07
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                         [<c043a96d>] _write_lock_bh+0x3b/0x64
                         [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                         [<c02eda55>] bond_set_multicast_list+0x1d/0x241
                         [<c013fe29>] put_lock_stats+0xa/0x1e
                         [<c03a1e03>] __dev_set_rx_mode+0x7b/0x7d
                         [<c03a1f9d>] dev_set_rx_mode+0x23/0x36
                         [<c03a4678>] dev_open+0x5e/0x77
                         [<c03a3347>] dev_change_flags+0x9d/0x14b
                         [<c03a214b>] __dev_get_by_name+0x68/0x73
                         [<c03e4176>] devinet_ioctl+0x22b/0x536
                         [<c03a446d>] dev_ioctl+0x46f/0x5b7
                         [<c039a598>] sock_ioctl+0x167/0x18b
                         [<c039a431>] sock_ioctl+0x0/0x18b
                         [<c0172677>] do_ioctl+0x1f/0x62
                         [<c01728e7>] vfs_ioctl+0x22d/0x23f
                         [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                         [<c017292c>] sys_ioctl+0x33/0x4b
                         [<c0103e92>] sysenter_past_esp+0x5f/0xa5
                         [<ffffffff>] 0xffffffff
    softirq-on-R at:
                         [<c014197a>] mark_lock+0x64/0x451
                         [<c013583a>] __kernel_text_address+0x5/0xe
                         [<c0104ee2>] dump_trace+0x83/0x8d
                         [<c014287d>] __lock_acquire+0x4a7/0xc07
                         [<c013fc6a>] save_trace+0x37/0x89
                         [<c0133d33>] run_workqueue+0x87/0x1b6
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c02eee43>] bond_mii_monitor+0x19/0x85
                         [<c043aa95>] _read_lock+0x36/0x5f
                         [<c02eee43>] bond_mii_monitor+0x19/0x85
                         [<c02eee43>] bond_mii_monitor+0x19/0x85
                         [<c0133d87>] run_workqueue+0xdb/0x1b6
                         [<c0133d33>] run_workqueue+0x87/0x1b6
                         [<c02eee2a>] bond_mii_monitor+0x0/0x85
                         [<c01347a7>] worker_thread+0x0/0x85
                         [<c0134820>] worker_thread+0x79/0x85
                         [<c0137255>] autoremove_wake_function+0x0/0x35
                         [<c013719e>] kthread+0x38/0x5e
                         [<c0137166>] kthread+0x0/0x5e
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
    hardirq-on-R at:
                         [<c013fdfe>] get_lock_stats+0xd/0x2e
                         [<c013fe29>] put_lock_stats+0xa/0x1e
                         [<c0142838>] __lock_acquire+0x462/0xc07
                         [<c0141da0>] mark_held_locks+0x39/0x53
                         [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                         [<c0143056>] lock_acquire+0x79/0x93
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c043aa36>] _read_lock_bh+0x3b/0x64
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c02edca1>] bond_get_stats+0x28/0xd0
                         [<c03aad0f>] rtnl_fill_ifinfo+0x2bf/0x563
                         [<c03ab28d>] rtmsg_ifinfo+0x5d/0xdf
                         [<c03ab34e>] rtnetlink_event+0x3f/0x42
                         [<c013ac34>] notifier_call_chain+0x2a/0x52
                         [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
                         [<c03a3b06>] register_netdevice+0x2a7/0x2e7
                         [<c02ed842>] bond_create+0x1f2/0x26a
                         [<c05bed76>] bonding_init+0x761/0x7ea
                         [<c05be5de>] e1000_init_module+0x45/0x7c
                         [<c05a9499>] kernel_init+0x150/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c05a9349>] kernel_init+0x0/0x2b7
                         [<c0104baf>] kernel_thread_helper+0x7/0x10
                         [<ffffffff>] 0xffffffff
  }
  ... key      at: [<c08777d0>] __key.32976+0x0/0x8
  -> (_xmit_ETHER){-...} ops: 8 {
     initial-use  at:
                           [<c0142890>] __lock_acquire+0x4ba/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
     hardirq-on-W at:
                           [<c014197a>] mark_lock+0x64/0x451
                           [<c014285e>] __lock_acquire+0x488/0xc07
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c043a8aa>] _spin_lock_bh+0x3b/0x64
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c03a63c9>] dev_mc_add+0x1a/0x6a
                           [<c0412a28>] igmp6_group_added+0x56/0x11d
                           [<c0412dbc>] ipv6_dev_mc_inc+0x2a3/0x31c
                           [<c0410100>] icmpv6_rcv+0x6a4/0x828
                           [<c0412df1>] ipv6_dev_mc_inc+0x2d8/0x31c
                           [<c0412b19>] ipv6_dev_mc_inc+0x0/0x31c
                           [<c0402168>] ipv6_add_dev+0x21c/0x24b
                           [<c040b991>] ndisc_ifinfo_sysctl_change+0x0/0x1ef
                           [<c040274b>] addrconf_notify+0x60/0x7b7
                           [<c0142f95>] __lock_acquire+0xbbf/0xc07
                           [<c0141da0>] mark_held_locks+0x39/0x53
                           [<c043997e>] mutex_lock_nested+0x286/0x2ac
                           [<c0141f93>] trace_hardirqs_on+0x122/0x14c
                           [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a4875>] register_netdevice_notifier+0xe/0x126
                           [<c03a48b0>] register_netdevice_notifier+0x49/0x126
                           [<c05c5b83>] addrconf_init+0xad/0x193
                           [<c05c5af1>] addrconf_init+0x1b/0x193
                           [<c05c59c9>] inet6_init+0x1f0/0x2ad
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
   }
   ... key      at: [<c087adc8>] netdev_xmit_lock_key+0x8/0x1c0
  ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
    [<c0109ef2>] save_stack_trace+0x20/0x3a
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c043a8aa>] _spin_lock_bh+0x3b/0x64
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c03a63c9>] dev_mc_add+0x1a/0x6a
    [<c02ee472>] bond_change_active_slave+0x1a9/0x3bf
    [<c02ec7a3>] bond_update_speed_duplex+0x26/0x65
    [<c02ee991>] bond_select_active_slave+0x97/0xd3
    [<c02ed20b>] bond_compute_features+0x45/0x84
    [<c02ef9b6>] bond_enslave+0x6a7/0x884
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c02f61af>] bonding_store_slaves+0x1ae/0x2fb
    [<c02f6001>] bonding_store_slaves+0x0/0x2fb
    [<c02ce8b7>] dev_attr_store+0x27/0x2c
    [<c019bda1>] sysfs_write_file+0xad/0xe0
    [<c019bcf4>] sysfs_write_file+0x0/0xe0
    [<c0168e5c>] vfs_write+0x8a/0x10c
    [<c0118562>] do_page_fault+0x0/0x54a
    [<c01693e1>] sys_write+0x41/0x67
    [<c0103e92>] sysenter_past_esp+0x5f/0xa5
    [<ffffffff>] 0xffffffff

  -> (lweventlist_lock){.+..} ops: 10 {
     initial-use  at:
                           [<c014197a>] mark_lock+0x64/0x451
                           [<c0142890>] __lock_acquire+0x4ba/0xc07
                           [<c02e363c>] e1000_read_phy_reg+0x1c7/0x1d3
                           [<c02e346b>] e1000_write_phy_reg+0xb9/0xc3
                           [<c024a82e>] delay_tsc+0x25/0x3b
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
                           [<c02e1c23>] e1000_probe+0xad1/0xbe8
                           [<c0257f1b>] pci_device_probe+0x36/0x57
                           [<c02d0e3f>] driver_probe_device+0xe1/0x15f
                           [<c043ae41>] _spin_unlock+0x25/0x3b
                           [<c0437ec6>] klist_next+0x58/0x6d
                           [<c02d0f4f>] __driver_attach+0x0/0x7f
                           [<c02d0f98>] __driver_attach+0x49/0x7f
                           [<c02d03e3>] bus_for_each_dev+0x36/0x58
                           [<c02d0c97>] driver_attach+0x16/0x18
                           [<c02d0f4f>] __driver_attach+0x0/0x7f
                           [<c02d06da>] bus_add_driver+0x6d/0x18d
                           [<c0258065>] __pci_register_driver+0x53/0x7f
                           [<c05be5de>] e1000_init_module+0x45/0x7c
                           [<c05a9499>] kernel_init+0x150/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c05a9349>] kernel_init+0x0/0x2b7
                           [<c0104baf>] kernel_thread_helper+0x7/0x10
                           [<ffffffff>] 0xffffffff
     in-softirq-W at:
                           [<c011d1c0>] __wake_up_common+0x32/0x5c
                           [<c0142816>] __lock_acquire+0x440/0xc07
                           [<c043af0d>] _spin_unlock_irqrestore+0x40/0x58
                           [<c0143056>] lock_acquire+0x79/0x93
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c02dfee1>] e1000_watchdog+0x0/0x5c9
                           [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c03ac41f>] linkwatch_add_event+0xd/0x2c
                           [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
                           [<c03af46a>] netif_carrier_on+0x16/0x27
                           [<c02e0136>] e1000_watchdog+0x255/0x5c9
                           [<c02dfee1>] e1000_watchdog+0x0/0x5c9
                           [<c012e02e>] run_timer_softirq+0xfa/0x15d
                           [<c012a982>] __do_softirq+0x56/0xdb
                           [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
                           [<c012a994>] __do_softirq+0x68/0xdb
                           [<c012aa3d>] do_softirq+0x36/0x51
                           [<c012abe3>] irq_exit+0x43/0x4e
                           [<c0114122>] smp_apic_timer_interrupt+0x74/0x80
                           [<c0104a01>] apic_timer_interrupt+0x29/0x38
                           [<c0104a0b>] apic_timer_interrupt+0x33/0x38
                           [<c01600d8>] sys_swapon+0x254/0x9aa
                           [<c01021a6>] mwait_idle_with_hints+0x3b/0x3f
                           [<c0102447>] mwait_idle+0x0/0xf
                           [<c0102581>] cpu_idle+0x99/0xc6
                           [<c05a98c7>] start_kernel+0x2c7/0x2cf
                           [<c05a90e0>] unknown_bootoption+0x0/0x195
                           [<ffffffff>] 0xffffffff
   }
   ... key      at: [<c058a194>] lweventlist_lock+0x14/0x40
  ... acquired at:
    [<c0142df3>] __lock_acquire+0xa1d/0xc07
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c0142f95>] __lock_acquire+0xbbf/0xc07
    [<c0143056>] lock_acquire+0x79/0x93
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c043abc7>] _spin_lock_irqsave+0x3f/0x6c
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c03ac41f>] linkwatch_add_event+0xd/0x2c
    [<c03ac4e3>] linkwatch_fire_event+0x25/0x37
    [<c03af46a>] netif_carrier_on+0x16/0x27
    [<c02ede0c>] bond_set_carrier+0x31/0x55
    [<c02ee998>] bond_select_active_slave+0x9e/0xd3
    [<c02ed20b>] bond_compute_features+0x45/0x84
    [<c02ef9b6>] bond_enslave+0x6a7/0x884
    [<c043999c>] mutex_lock_nested+0x2a4/0x2ac
    [<c02f61af>] bonding_store_slaves+0x1ae/0x2fb
    [<c02f6001>] bonding_store_slaves+0x0/0x2fb
    [<c02ce8b7>] dev_attr_store+0x27/0x2c
    [<c019bda1>] sysfs_write_file+0xad/0xe0
    [<c019bcf4>] sysfs_write_file+0x0/0xe0
    [<c0168e5c>] vfs_write+0x8a/0x10c
    [<c0118562>] do_page_fault+0x0/0x54a
    [<c01693e1>] sys_write+0x41/0x67
    [<c0103e92>] sysenter_past_esp+0x5f/0xa5
    [<ffffffff>] 0xffffffff


stack backtrace:
Pid: 9, comm: events/0 Not tainted 2.6.24-rc7 #1
  [<c0140b2c>] print_irq_inversion_bug+0x108/0x112
  [<c0141911>] check_usage_forwards+0x3c/0x41
  [<c0141afd>] mark_lock+0x1e7/0x451
  [<c0142816>] __lock_acquire+0x440/0xc07
  [<c0103f7b>] restore_nocheck+0x12/0x15
  [<c0143056>] lock_acquire+0x79/0x93
  [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
  [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
  [<c043a8aa>] _spin_lock_bh+0x3b/0x64
  [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
  [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
  [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
  [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
  [<c041245e>] mld_ifc_timer_expire+0x0/0x1fb
  [<c012e02e>] run_timer_softirq+0xfa/0x15d
  [<c012a982>] __do_softirq+0x56/0xdb
  [<c0141f7d>] trace_hardirqs_on+0x10c/0x14c
  [<c012a994>] __do_softirq+0x68/0xdb
  [<c012aa3d>] do_softirq+0x36/0x51
  [<c012af26>] local_bh_enable_ip+0xad/0xed
  [<c03bfa37>] rt_run_flush+0x64/0x8b
  [<c03e9bbe>] fib_netdev_event+0x61/0x65
  [<c013ac34>] notifier_call_chain+0x2a/0x52
  [<c013ac7e>] raw_notifier_call_chain+0x17/0x1a
  [<c03a340d>] netdev_state_change+0x18/0x29
  [<c03ac645>] __linkwatch_run_queue+0x150/0x17e
  [<c03ac690>] linkwatch_event+0x1d/0x22
  [<c0133d87>] run_workqueue+0xdb/0x1b6
  [<c0133d33>] run_workqueue+0x87/0x1b6
  [<c03ac673>] linkwatch_event+0x0/0x22
  [<c01347a7>] worker_thread+0x0/0x85
  [<c0134820>] worker_thread+0x79/0x85
  [<c0137255>] autoremove_wake_function+0x0/0x35
  [<c013719e>] kthread+0x38/0x5e
  [<c0137166>] kthread+0x0/0x5e
  [<c0104baf>] kernel_thread_helper+0x7/0x10
  =======================
bonding: bond0: enslaving eth1 as a backup interface with a down link.
bond0: no IPv6 routers present



Best regards,

 				Krzysztof Olędzki

^ permalink raw reply

* [PATCH for 2.6.24][NET] fs_enet: check for phydev existence in the ethtool handlers
From: Anton Vorontsov @ 2008-01-08 19:05 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev, linuxppc-dev

Otherwise oops will happen if ethernet device has not been opened:

Unable to handle kernel paging request for data at address 0x0000014c
Faulting instruction address: 0xc016f7f0
Oops: Kernel access of bad area, sig: 11 [#1]
MPC85xx
NIP: c016f7f0 LR: c01722a0 CTR: 00000000
REGS: c79ddc70 TRAP: 0300   Not tainted  (2.6.24-rc3-g820a386b)
MSR: 00029000 <EE,ME>  CR: 20004428  XER: 20000000
DEAR: 0000014c, ESR: 00000000
TASK = c789f5e0[999] 'snmpd' THREAD: c79dc000
GPR00: c01aceb8 c79ddd20 c789f5e0 00000000 c79ddd3c 00000000 c79ddd64 00000000
GPR08: 00000000 c7845b60 c79dde3c c01ace80 20004422 200249fc 000002a0 100da728
GPR16: 100c0000 00000000 00000000 00000000 20022078 00000009 200220e0 bfc85558
GPR24: c79ddd3c 00000000 00000000 c02e0e70 c022fc64 ffffffff c7845800 bfc85498
NIP [c016f7f0] phy_ethtool_gset+0x0/0x4c
LR [c01722a0] fs_get_settings+0x18/0x28
Call Trace:
[c79ddd20] [c79dde38] 0xc79dde38 (unreliable)
[c79ddd30] [c01aceb8] dev_ethtool+0x294/0x11ec
[c79dde30] [c01aaa44] dev_ioctl+0x454/0x6a8
[c79ddeb0] [c019b9d4] sock_ioctl+0x84/0x230
[c79dded0] [c007ded8] do_ioctl+0x34/0x8c
[c79ddee0] [c007dfbc] vfs_ioctl+0x8c/0x41c
[c79ddf10] [c007e38c] sys_ioctl+0x40/0x74
[c79ddf40] [c000d4c0] ret_from_syscall+0x0/0x3c
Instruction dump:
81630000 800b0030 2f800000 419e0010 7c0803a6 4e800021 7c691b78 80010014
7d234b78 38210010 7c0803a6 4e800020 <8003014c> 7c6b1b78 38600000 90040004

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Acked-by: Vitaly Bordug <vitb@kernel.crashing.org>
---

Just resending it, it feels like it got lost during holidays.

 drivers/net/fs_enet/fs_enet-main.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
index f2a4d39..23fddc3 100644
--- a/drivers/net/fs_enet/fs_enet-main.c
+++ b/drivers/net/fs_enet/fs_enet-main.c
@@ -897,14 +897,21 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs,
 static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
 	struct fs_enet_private *fep = netdev_priv(dev);
+
+	if (!fep->phydev)
+		return -ENODEV;
+
 	return phy_ethtool_gset(fep->phydev, cmd);
 }
 
 static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
 	struct fs_enet_private *fep = netdev_priv(dev);
-	phy_ethtool_sset(fep->phydev, cmd);
-	return 0;
+
+	if (!fep->phydev)
+		return -ENODEV;
+
+	return phy_ethtool_sset(fep->phydev, cmd);
 }
 
 static int fs_nway_reset(struct net_device *dev)
-- 
1.5.2.2

^ permalink raw reply related

* Re: [PATCH 7/7]: [NET]: Make ->poll() breakout consistent in Intel ethernet drivers.
From: Kok, Auke @ 2008-01-08 19:04 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Jesse Brandeburg, Ronciak, John
In-Reply-To: <20080107.214110.257940011.davem@davemloft.net>

David Miller wrote:
> [NET]: Make ->poll() breakout consistent in Intel ethernet drivers.
> 
> This makes the ->poll() routines of the E100, E1000, E1000E, IXGB, and
> IXGBE drivers complete ->poll() consistently.
> 
> Now they will all break out when the amount of RX work done is less
> than 'budget'.
> 
> At a later time, we may want put back code to include the TX work as
> well (as at least one other NAPI driver does, but by in large NAPI
> drivers do not do this).  But if so, it should be done consistently
> across the board to all of these drivers.
> 
> Signed-off-by: David S. Miller <davem@davemloft.net>


this is exactly the change I was eyeballing and indeed this seems to be the
general use case in most drivers anyway.

I'll try to see how this impacts the (especially 4-port) TX performance issue with
e1000e, but this should be just fine for now, and we can address later anyway.

Acked-by: Auke Kok <auke-jan.h.kok@intel.com>


Auke


> ---
>  drivers/net/e100.c             |    7 +++----
>  drivers/net/e1000/e1000_main.c |   10 +++++-----
>  drivers/net/e1000e/netdev.c    |    8 ++++----
>  drivers/net/ixgb/ixgb_main.c   |    7 +++----
>  drivers/net/ixgbe/ixgbe_main.c |    8 ++++----
>  5 files changed, 19 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/net/e100.c b/drivers/net/e100.c
> index 68316f1..b87402b 100644
> --- a/drivers/net/e100.c
> +++ b/drivers/net/e100.c
> @@ -1991,13 +1991,12 @@ static int e100_poll(struct napi_struct *napi, int budget)
>  	struct nic *nic = container_of(napi, struct nic, napi);
>  	struct net_device *netdev = nic->netdev;
>  	unsigned int work_done = 0;
> -	int tx_cleaned;
>  
>  	e100_rx_clean(nic, &work_done, budget);
> -	tx_cleaned = e100_tx_clean(nic);
> +	e100_tx_clean(nic);
>  
> -	/* If no Rx and Tx cleanup work was done, exit polling mode. */
> -	if((!tx_cleaned && (work_done == 0))) {
> +	/* If budget not fully consumed, exit the polling mode */
> +	if (work_done < budget) {
>  		netif_rx_complete(netdev, napi);
>  		e100_enable_irq(nic);
>  	}
> diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
> index 9de7144..13d57b0 100644
> --- a/drivers/net/e1000/e1000_main.c
> +++ b/drivers/net/e1000/e1000_main.c
> @@ -3919,7 +3919,7 @@ e1000_clean(struct napi_struct *napi, int budget)
>  {
>  	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
>  	struct net_device *poll_dev = adapter->netdev;
> -	int tx_cleaned = 0, work_done = 0;
> +	int work_done = 0;
>  
>  	/* Must NOT use netdev_priv macro here. */
>  	adapter = poll_dev->priv;
> @@ -3929,16 +3929,16 @@ e1000_clean(struct napi_struct *napi, int budget)
>  	 * simultaneously.  A failure obtaining the lock means
>  	 * tx_ring[0] is currently being cleaned anyway. */
>  	if (spin_trylock(&adapter->tx_queue_lock)) {
> -		tx_cleaned = e1000_clean_tx_irq(adapter,
> -		                                &adapter->tx_ring[0]);
> +		e1000_clean_tx_irq(adapter,
> +				   &adapter->tx_ring[0]);
>  		spin_unlock(&adapter->tx_queue_lock);
>  	}
>  
>  	adapter->clean_rx(adapter, &adapter->rx_ring[0],
>  	                  &work_done, budget);
>  
> -	/* If no Tx and not enough Rx work done, exit the polling mode */
> -	if ((!tx_cleaned && (work_done == 0))) {
> +	/* If budget not fully consumed, exit the polling mode */
> +	if (work_done < budget) {
>  		if (likely(adapter->itr_setting & 3))
>  			e1000_set_itr(adapter);
>  		netif_rx_complete(poll_dev, napi);
> diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
> index dd9698c..4a6fc74 100644
> --- a/drivers/net/e1000e/netdev.c
> +++ b/drivers/net/e1000e/netdev.c
> @@ -1384,7 +1384,7 @@ static int e1000_clean(struct napi_struct *napi, int budget)
>  {
>  	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
>  	struct net_device *poll_dev = adapter->netdev;
> -	int tx_cleaned = 0, work_done = 0;
> +	int work_done = 0;
>  
>  	/* Must NOT use netdev_priv macro here. */
>  	adapter = poll_dev->priv;
> @@ -1394,14 +1394,14 @@ static int e1000_clean(struct napi_struct *napi, int budget)
>  	 * simultaneously.  A failure obtaining the lock means
>  	 * tx_ring is currently being cleaned anyway. */
>  	if (spin_trylock(&adapter->tx_queue_lock)) {
> -		tx_cleaned = e1000_clean_tx_irq(adapter);
> +		e1000_clean_tx_irq(adapter);
>  		spin_unlock(&adapter->tx_queue_lock);
>  	}
>  
>  	adapter->clean_rx(adapter, &work_done, budget);
>  
> -	/* If no Tx and not enough Rx work done, exit the polling mode */
> -	if ((!tx_cleaned && (work_done < budget))) {
> +	/* If budget not fully consumed, exit the polling mode */
> +	if (work_done < budget) {
>  		if (adapter->itr_setting & 3)
>  			e1000_set_itr(adapter);
>  		netif_rx_complete(poll_dev, napi);
> diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
> index a8bef52..d2fb88d 100644
> --- a/drivers/net/ixgb/ixgb_main.c
> +++ b/drivers/net/ixgb/ixgb_main.c
> @@ -1787,14 +1787,13 @@ ixgb_clean(struct napi_struct *napi, int budget)
>  {
>  	struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi);
>  	struct net_device *netdev = adapter->netdev;
> -	int tx_cleaned;
>  	int work_done = 0;
>  
> -	tx_cleaned = ixgb_clean_tx_irq(adapter);
> +	ixgb_clean_tx_irq(adapter);
>  	ixgb_clean_rx_irq(adapter, &work_done, budget);
>  
> -	/* if no Tx and not enough Rx work done, exit the polling mode */
> -	if((!tx_cleaned && (work_done == 0))) {
> +	/* If budget not fully consumed, exit the polling mode */
> +	if (work_done < budget) {
>  		netif_rx_complete(netdev, napi);
>  		ixgb_irq_enable(adapter);
>  	}
> diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
> index 7c31930..a564916 100644
> --- a/drivers/net/ixgbe/ixgbe_main.c
> +++ b/drivers/net/ixgbe/ixgbe_main.c
> @@ -1468,15 +1468,15 @@ static int ixgbe_clean(struct napi_struct *napi, int budget)
>  	struct ixgbe_adapter *adapter = container_of(napi,
>  					struct ixgbe_adapter, napi);
>  	struct net_device *netdev = adapter->netdev;
> -	int tx_cleaned = 0, work_done = 0;
> +	int work_done = 0;
>  
>  	/* In non-MSIX case, there is no multi-Tx/Rx queue */
> -	tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
> +	ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
>  	ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done,
>  			   budget);
>  
> -	/* If no Tx and not enough Rx work done, exit the polling mode */
> -	if ((!tx_cleaned && (work_done < budget))) {
> +	/* If budget not fully consumed, exit the polling mode */
> +	if (work_done < budget) {
>  		netif_rx_complete(netdev, napi);
>  		ixgbe_irq_enable(adapter);
>  	}


^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Arjan van de Ven @ 2008-01-08 19:05 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Randy Dunlap, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev
In-Reply-To: <alpine.LFD.1.00.0801081025470.3148@woody.linux-foundation.org>

Linus Torvalds wrote:
> 
> On Tue, 8 Jan 2008, Arjan van de Ven wrote:
>> the database has the information so it's just a matter of slightly different
>> php code ;)
>> Before I do that... do you want the BUG's separate, part of the warnings or
>> part of the oopses?
>> (I rather make this change once ;)
> 
> I'd like them all separate, they tend to be very different and contain 
> different information.
> 
> Put the warnings last, as the least important. Oopses at the top, since 
> they tend to be the ones that are less expected.

ok done; I had to fizzle a bit because some things aren't *exactly* a BUG() statement
but I track them anyway (things like the "sleeping in invalid context" check), so I
had to somewhat arbitrarily assign categories for those. I might fine tune these over time
some; if you or someone else sees problems with categorization please let me know


^ permalink raw reply

* Re: [PATCH 0/3] bonding: 3 fixes for 2.6.24
From: Andy Gospodarek @ 2008-01-08 19:17 UTC (permalink / raw)
  To: Krzysztof Oledzki
  Cc: Jay Vosburgh, netdev, Jeff Garzik, David Miller, Andy Gospodarek
In-Reply-To: <Pine.LNX.4.64.0801081949290.1135@bizon.gios.gov.pl>

On Tue, Jan 08, 2008 at 07:50:22PM +0100, Krzysztof Oledzki wrote:
> 
> 
> On Mon, 7 Jan 2008, Jay Vosburgh wrote:
> 
> >	Following are three fixes to fix locking problems and
> >silence locking-related warnings in the current 2.6.24-rc.
> >
> >	patch 1: fix locking in sysfs primary/active selection
> >
> >	Call core network functions with expected locks to
> >eliminate potential deadlock and silence warnings.
> >
> >	patch 2: fix ASSERT_RTNL that produces spurious warnings
> >
> >	Relocate ASSERT_RTNL to remove a false warning; after patch,
> >ASSERT is located in code that holds only RTNL (additional locks were
> >causing the ASSERT to trip)
> >
> >	patch 3: fix locking during alb failover and slave removal
> >
> >	Fix all call paths into alb_fasten_mac_swap to hold only RTNL.
> >Eliminates deadlock and silences warnings.
> >
> >	Patches are against the current netdev-2.6#upstream branch.
> >
> >	Please apply for 2.6.24.
> 
> 2.6.24-rc7 + patches #1, #2, #3:
> 
> bonding: bond0: setting mode to active-backup (1).
> bonding: bond0: Setting MII monitoring interval to 100.
> ADDRCONF(NETDEV_UP): bond0: link is not ready
> bonding: bond0: Adding slave eth0.
> e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow 
> Control: RX/TX
> bonding: bond0: making interface eth0 the new active one.
> bonding: bond0: first active interface up!
> bonding: bond0: enslaving eth0 as an active interface with an up link.
> bonding: bond0: Adding slave eth1.
> ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
> 
> =========================================================
> [ INFO: possible irq lock inversion dependency detected ]
> 2.6.24-rc7 #1
> ---------------------------------------------------------
> events/0/9 just changed the state of lock:
>  (&mc->mca_lock){-+..}, at: [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
> but this lock took another, soft-read-irq-unsafe lock in the past:
>  (&bond->lock){-.--}
> 
> and interrupts could create inverse lock ordering between them.
> 
> 

Jay's patches will not fix this issue.  I think something like this did
it for me, but as I mentioned to Jay in the last thread, I'm not
convinced it doesn't violate some of the locking expectations we have.

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 423298c..3c6619a 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3915,7 +3915,7 @@ static void bond_set_multicast_list(struct net_device *bond_dev)
 	struct bonding *bond = bond_dev->priv;
 	struct dev_mc_list *dmi;
 
-	write_lock_bh(&bond->lock);
+	read_lock(&bond->lock);
 
 	/*
 	 * Do promisc before checking multicast_mode
@@ -3957,7 +3957,7 @@ static void bond_set_multicast_list(struct net_device *bond_dev)
 	bond_mc_list_destroy(bond);
 	bond_mc_list_copy(bond_dev->mc_list, bond, GFP_ATOMIC);
 
-	write_unlock_bh(&bond->lock);
+	read_unlock(&bond->lock);
 }
 
 /*



^ permalink raw reply related

* Re: [PATCH 0/3] bonding: 3 fixes for 2.6.24
From: Jay Vosburgh @ 2008-01-08 19:30 UTC (permalink / raw)
  To: Krzysztof Oledzki; +Cc: netdev, Jeff Garzik, David Miller, Andy Gospodarek
In-Reply-To: <Pine.LNX.4.64.0801081949290.1135@bizon.gios.gov.pl>

Krzysztof Oledzki <olel@ans.pl> wrote:

>On Mon, 7 Jan 2008, Jay Vosburgh wrote:
>
>> 	Following are three fixes to fix locking problems and
>> silence locking-related warnings in the current 2.6.24-rc.
>>
>> 	patch 1: fix locking in sysfs primary/active selection
>>
>> 	Call core network functions with expected locks to
>> eliminate potential deadlock and silence warnings.
>>
>> 	patch 2: fix ASSERT_RTNL that produces spurious warnings
>>
>> 	Relocate ASSERT_RTNL to remove a false warning; after patch,
>> ASSERT is located in code that holds only RTNL (additional locks were
>> causing the ASSERT to trip)
>>
>> 	patch 3: fix locking during alb failover and slave removal
>>
>> 	Fix all call paths into alb_fasten_mac_swap to hold only RTNL.
>> Eliminates deadlock and silences warnings.
>>
>> 	Patches are against the current netdev-2.6#upstream branch.
>>
>> 	Please apply for 2.6.24.
>
>2.6.24-rc7 + patches #1, #2, #3:
>
>bonding: bond0: setting mode to active-backup (1).
>bonding: bond0: Setting MII monitoring interval to 100.
>ADDRCONF(NETDEV_UP): bond0: link is not ready
>bonding: bond0: Adding slave eth0.
>e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
>bonding: bond0: making interface eth0 the new active one.
>bonding: bond0: first active interface up!
>bonding: bond0: enslaving eth0 as an active interface with an up link.
>bonding: bond0: Adding slave eth1.
>ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
>
>=========================================================
>[ INFO: possible irq lock inversion dependency detected ]
>2.6.24-rc7 #1
>---------------------------------------------------------
>events/0/9 just changed the state of lock:
> (&mc->mca_lock){-+..}, at: [<c041258e>] mld_ifc_timer_expire+0x130/0x1fb
>but this lock took another, soft-read-irq-unsafe lock in the past:
> (&bond->lock){-.--}
>
>and interrupts could create inverse lock ordering between them.

	Just to be clear: the patch set I posted yesterday was not
intended to resolve the lockdep problem; I haven't studied that one yet.

	-J

---
	-Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com

^ permalink raw reply

* Re: Top 10 kernel oopses for the week ending January 5th, 2008
From: Linus Torvalds @ 2008-01-08 19:31 UTC (permalink / raw)
  To: Arjan van de Ven
  Cc: Randy Dunlap, Kevin Winchester, J. Bruce Fields, Al Viro,
	Linux Kernel Mailing List, Andrew Morton, NetDev,
	Rafael J. Wysocki
In-Reply-To: <4783C95C.7050303@linux.intel.com>



On Tue, 8 Jan 2008, Arjan van de Ven wrote:
> 
> ok done; I had to fizzle a bit because some things aren't *exactly* a 
> BUG() statement but I track them anyway (things like the "sleeping in 
> invalid context" check), so I had to somewhat arbitrarily assign 
> categories for those. I might fine tune these over time some; if you or 
> someone else sees problems with categorization please let me know

Looking good. I wonder if we could also have some way to cross-ref these 
things with the regression list (notably try to get pointers to them in 
the regression list). 

Right now, the regression list keeps track of the things that are closed, 
but kerneloops.org obviously doesn't see that, so it's not obvious which 
oopses are "uninteresting" since they've been fixed.

			Linus

^ permalink raw reply

* Please pull 'upstream-davem' branch of wireless-2.6
From: John W. Linville @ 2008-01-08 19:29 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-wireless

Dave,

Here are a few more for 2.6.25.  The are mostly clean-ups for the new
PID rate control algorithm, and some A-MPDU bits related to supporting
802.11n.

Please let me know if there are problems!

Thanks,

John

---

Individual patches are available here:

	http://www.kernel.org/pub/linux/kernel/people/linville/wireless-2.6/upstream-davem

---

The following changes since commit 60d4ec5e8360560484bdac9244758f1ff7046dd6:
  Eric Dumazet (1):
        [XFRM]: xfrm_state_clone() should be static, not exported

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git upstream-davem

Andrew Lutomirski (1):
      rc80211_pid should respect fixed rates.

Helmut Schaa (1):
      mac80211: Restore rx.fc before every invocation of ieee80211_invoke_rx_handlers

Ivo van Doorn (1):
      mac80211: Add radio led trigger

Johannes Berg (3):
      mac80211: remove misleading 'res' variable
      mac80211: make rc_pid_fop_events static
      mac80211: better rate control algorithm selection

Ron Rindjunsky (8):
      mac80211: restructure __ieee80211_rx
      mac80211: A-MPDU Rx add low level driver API
      mac80211: A-MPDU Rx add MLME structures
      mac80211: A-MPDU Rx adding basic functionality
      mac80211: A-MPDU Rx MLME data initialization
      mac80211: A-MPDU Rx handling aggregation reordering
      mac80211: A-MPDU Rx adding BAR handling capability
      mac80211: A-MPDU Rx handling DELBA requests

Stefano Brivio (7):
      rc80211-pid: export human-readable target_pf value to debugfs
      rc80211-pid: add kerneldoc for tunable parameters
      rc80211-pid: simplify and fix shift_adjust
      rc80211-pid: fix sta_info refcounting
      rc80211-pid: pf_target tuning
      rc80211-pid: add MAINTAINERS entry
      rc80211-pid: fix definition of rate control interval

 MAINTAINERS                        |   10 +
 include/linux/ieee80211.h          |    7 +
 include/net/mac80211.h             |   50 ++++++
 net/mac80211/Kconfig               |   37 ++--
 net/mac80211/Makefile              |   41 +++--
 net/mac80211/ieee80211.c           |   46 +++---
 net/mac80211/ieee80211_i.h         |   11 +-
 net/mac80211/ieee80211_ioctl.c     |    2 +
 net/mac80211/ieee80211_led.c       |   35 ++++
 net/mac80211/ieee80211_led.h       |    6 +
 net/mac80211/ieee80211_rate.c      |    4 +
 net/mac80211/ieee80211_rate.h      |   38 ++++-
 net/mac80211/ieee80211_sta.c       |  269 ++++++++++++++++++++++++++++--
 net/mac80211/rc80211_pid.h         |   52 ++++--
 net/mac80211/rc80211_pid_algo.c    |   75 ++++++---
 net/mac80211/rc80211_pid_debugfs.c |    2 +-
 net/mac80211/rc80211_simple.c      |   21 +++-
 net/mac80211/rx.c                  |  331 +++++++++++++++++++++++++++++++-----
 net/mac80211/sta_info.c            |   17 ++
 net/mac80211/sta_info.h            |   47 +++++
 net/mac80211/tx.c                  |    3 +-
 net/mac80211/util.c                |   15 ++-
 22 files changed, 957 insertions(+), 162 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index fc16750..120d114 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2480,6 +2480,16 @@ W:	http://linuxwireless.org/
 T:	git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
 S:	Maintained
 
+MAC80211 PID RATE CONTROL
+P:	Stefano Brivio
+M:	stefano.brivio@polimi.it
+P:	Mattias Nissler
+M:	mattias.nissler@gmx.de
+L:	linux-wireless@vger.kernel.org
+W:	http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID
+T:	git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
+S:	Maintained
+
 MACVLAN DRIVER
 P:	Patrick McHardy
 M:	kaber@trash.net
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 3e64159..4d5a4c9 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -472,6 +472,13 @@ enum ieee80211_back_actioncode {
 	WLAN_ACTION_DELBA = 2,
 };
 
+/* BACK (block-ack) parties */
+enum ieee80211_back_parties {
+	WLAN_BACK_RECIPIENT = 0,
+	WLAN_BACK_INITIATOR = 1,
+	WLAN_BACK_TIMER = 2,
+};
+
 /* A-MSDU 802.11n */
 #define IEEE80211_QOS_CONTROL_A_MSDU_PRESENT 0x0080
 
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index a762a75..be2a383 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -918,6 +918,18 @@ enum ieee80211_erp_change_flags {
 	IEEE80211_ERP_CHANGE_PREAMBLE	= 1<<1,
 };
 
+/**
+ * enum ieee80211_ampdu_mlme_action - A-MPDU actions
+ *
+ * These flags are used with the ampdu_action() callback in
+ * &struct ieee80211_ops to indicate which action is needed.
+ * @IEEE80211_AMPDU_RX_START: start Rx aggregation
+ * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
+ */
+enum ieee80211_ampdu_mlme_action {
+	IEEE80211_AMPDU_RX_START,
+	IEEE80211_AMPDU_RX_STOP,
+};
 
 /**
  * struct ieee80211_ops - callbacks from mac80211 to the driver
@@ -1046,6 +1058,12 @@ enum ieee80211_erp_change_flags {
  *	used to determine whether to reply to Probe Requests.
  *
  * @conf_ht: Configures low level driver with 802.11n HT data. Must be atomic.
+ *
+ * @ampdu_action: Perform a certain A-MPDU action
+ * 	The RA/TID combination determines the destination and TID we want
+ * 	the ampdu action to be performed for. The action is defined through
+ * 	ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
+ * 	is the first frame we expect to perform the action on.
  */
 struct ieee80211_ops {
 	int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb,
@@ -1091,6 +1109,9 @@ struct ieee80211_ops {
 			     struct ieee80211_tx_control *control);
 	int (*tx_last_beacon)(struct ieee80211_hw *hw);
 	int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
+	int (*ampdu_action)(struct ieee80211_hw *hw,
+			    enum ieee80211_ampdu_mlme_action action,
+			    const u8 *ra, u16 tid, u16 ssn);
 };
 
 /**
@@ -1122,6 +1143,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
+extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw);
 #endif
 /**
  * ieee80211_get_tx_led_name - get name of TX LED
@@ -1161,6 +1183,16 @@ static inline char *ieee80211_get_rx_led_name(struct ieee80211_hw *hw)
 #endif
 }
 
+/**
+ * ieee80211_get_assoc_led_name - get name of association LED
+ *
+ * mac80211 creates a association LED trigger for each wireless hardware
+ * that can be used to drive LEDs if your driver registers a LED device.
+ * This function returns the name (or %NULL if not configured for LEDs)
+ * of the trigger so you can automatically link the LED device.
+ *
+ * @hw: the hardware to get the LED trigger name for
+ */
 static inline char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
 {
 #ifdef CONFIG_MAC80211_LEDS
@@ -1170,6 +1202,24 @@ static inline char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
 #endif
 }
 
+/**
+ * ieee80211_get_radio_led_name - get name of radio LED
+ *
+ * mac80211 creates a radio change LED trigger for each wireless hardware
+ * that can be used to drive LEDs if your driver registers a LED device.
+ * This function returns the name (or %NULL if not configured for LEDs)
+ * of the trigger so you can automatically link the LED device.
+ *
+ * @hw: the hardware to get the LED trigger name for
+ */
+static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
+{
+#ifdef CONFIG_MAC80211_LEDS
+	return __ieee80211_get_radio_led_name(hw);
+#else
+	return NULL;
+#endif
+}
 
 /* Register a new hardware PHYMODE capability to the stack. */
 int ieee80211_register_hwmode(struct ieee80211_hw *hw,
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig
index cac6cf2..09c2550 100644
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -13,25 +13,17 @@ config MAC80211
 	  This option enables the hardware independent IEEE 802.11
 	  networking stack.
 
-config MAC80211_RC_DEFAULT_CHOICE
-	bool "Choose default rate control algorithm" if EMBEDDED
-	default y
-	depends on MAC80211
-	---help---
-	  This options enables selection of a default rate control
-	  algorithm to be built into the mac80211 module.  Alternate
-	  rate control algorithms might be built into the mac80211
-	  module as well.
+menu "Rate control algorithm selection"
+	depends on MAC80211 != n
 
 choice
 	prompt "Default rate control algorithm"
 	default MAC80211_RC_DEFAULT_PID
-	depends on MAC80211 && MAC80211_RC_DEFAULT_CHOICE
 	---help---
 	  This option selects the default rate control algorithm
 	  mac80211 will use. Note that this default can still be
 	  overriden through the ieee80211_default_rc_algo module
-	  parameter.
+	  parameter if different algorithms are available.
 
 config MAC80211_RC_DEFAULT_PID
 	bool "PID controller based rate control algorithm"
@@ -50,19 +42,27 @@ config MAC80211_RC_DEFAULT_SIMPLE
 	  dumb algorithm. You should choose the PID rate control
 	  instead.
 
+config MAC80211_RC_DEFAULT_NONE
+	bool "No default algorithm"
+	depends on EMBEDDED
+	help
+	  Selecting this option will select no default algorithm
+	  and allow you to not build any. Do not choose this
+	  option unless you know your driver comes with another
+	  suitable algorithm.
 endchoice
 
+comment "Selecting 'y' for an algorithm will"
+comment "build the algorithm into mac80211."
+
 config MAC80211_RC_DEFAULT
 	string
-	depends on MAC80211
 	default "pid" if MAC80211_RC_DEFAULT_PID
 	default "simple" if MAC80211_RC_DEFAULT_SIMPLE
 	default ""
 
 config MAC80211_RC_PID
-	bool "PID controller based rate control algorithm"
-	default y
-	depends on MAC80211
+	tristate "PID controller based rate control algorithm"
 	---help---
 	  This option enables a TX rate control algorithm for
 	  mac80211 that uses a PID controller to select the TX
@@ -72,16 +72,15 @@ config MAC80211_RC_PID
 	  different rate control algorithm.
 
 config MAC80211_RC_SIMPLE
-	bool "Simple rate control algorithm (DEPRECATED)"
-	default n
-	depends on MAC80211
+	tristate "Simple rate control algorithm (DEPRECATED)"
 	---help---
 	  This option enables a very simple, non-responsive TX
 	  rate control algorithm. This algorithm is deprecated
-	  and will be removed from the kernel in near future.
+	  and will be removed from the kernel in the near future.
 	  It has been replaced by the PID algorithm.
 
 	  Say N unless you know what you are doing.
+endmenu
 
 config MAC80211_LEDS
 	bool "Enable LED triggers"
diff --git a/net/mac80211/Makefile b/net/mac80211/Makefile
index 06aea80..54f46bc 100644
--- a/net/mac80211/Makefile
+++ b/net/mac80211/Makefile
@@ -1,19 +1,15 @@
 obj-$(CONFIG_MAC80211) += mac80211.o
 
-mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o
-mac80211-objs-$(CONFIG_NET_SCHED) += wme.o
-mac80211-objs-$(CONFIG_MAC80211_RC_SIMPLE) += rc80211_simple.o
-mac80211-objs-$(CONFIG_MAC80211_RC_PID) += rc80211_pid_algo.o
+# objects for PID algorithm
+rc80211_pid-y := rc80211_pid_algo.o
+rc80211_pid-$(CONFIG_MAC80211_DEBUGFS) += rc80211_pid_debugfs.o
 
-mac80211-debugfs-objs-$(CONFIG_MAC80211_RC_PID) += rc80211_pid_debugfs.o
-mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += \
-	debugfs.o \
-	debugfs_sta.o \
-	debugfs_netdev.o \
-	debugfs_key.o \
-	$(mac80211-debugfs-objs-y)
+# build helper for PID algorithm
+rc-pid-y := $(rc80211_pid-y)
+rc-pid-m := rc80211_pid.o
 
-mac80211-objs := \
+# mac80211 objects
+mac80211-y := \
 	ieee80211.o \
 	ieee80211_ioctl.o \
 	sta_info.o \
@@ -31,5 +27,22 @@ mac80211-objs := \
 	tx.o \
 	key.o \
 	util.o \
-	event.o \
-	$(mac80211-objs-y)
+	event.o
+
+mac80211-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o
+mac80211-$(CONFIG_NET_SCHED) += wme.o
+mac80211-$(CONFIG_MAC80211_DEBUGFS) += \
+	debugfs.o \
+	debugfs_sta.o \
+	debugfs_netdev.o \
+	debugfs_key.o
+
+
+# Build rate control algorithm(s)
+CFLAGS_rc80211_simple.o += -DRC80211_SIMPLE_COMPILE
+CFLAGS_rc80211_pid_algo.o += -DRC80211_PID_COMPILE
+mac80211-$(CONFIG_MAC80211_RC_SIMPLE) += rc80211_simple.o
+mac80211-$(CONFIG_MAC80211_RC_PID) += $(rc-pid-$(CONFIG_MAC80211_RC_PID))
+
+# Modular rate algorithms are assigned to mac80211-m - make separate modules
+obj-m += $(mac80211-m)
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index 9c14e3d..4807e52 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -219,6 +219,7 @@ static int ieee80211_open(struct net_device *dev)
 		if (res)
 			return res;
 		ieee80211_hw_config(local);
+		ieee80211_led_radio(local, local->hw.conf.radio_enabled);
 	}
 
 	switch (sdata->type) {
@@ -292,9 +293,18 @@ static int ieee80211_stop(struct net_device *dev)
 	struct ieee80211_sub_if_data *sdata;
 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 	struct ieee80211_if_init_conf conf;
+	struct sta_info *sta;
+	int i;
 
 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
+	list_for_each_entry(sta, &local->sta_list, list) {
+		for (i = 0; i <  STA_TID_NUM; i++)
+			ieee80211_sta_stop_rx_ba_session(sta->dev, sta->addr,
+						i, WLAN_BACK_RECIPIENT,
+						WLAN_REASON_QSTA_LEAVE_QBSS);
+	}
+
 	netif_stop_queue(dev);
 
 	/*
@@ -383,6 +393,8 @@ static int ieee80211_stop(struct net_device *dev)
 		if (local->ops->stop)
 			local->ops->stop(local_to_hw(local));
 
+		ieee80211_led_radio(local, 0);
+
 		tasklet_disable(&local->tx_pending_tasklet);
 		tasklet_disable(&local->tasklet);
 	}
@@ -1314,23 +1326,19 @@ static int __init ieee80211_init(void)
 
 	BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb));
 
-#ifdef CONFIG_MAC80211_RC_SIMPLE
-	ret = ieee80211_rate_control_register(&mac80211_rcsimple);
+	ret = rc80211_simple_init();
 	if (ret)
 		goto fail;
-#endif
 
-#ifdef CONFIG_MAC80211_RC_PID
-	ret = ieee80211_rate_control_register(&mac80211_rcpid);
+	ret = rc80211_pid_init();
 	if (ret)
-		goto fail;
-#endif
+		goto fail_simple;
 
 	ret = ieee80211_wme_register();
 	if (ret) {
 		printk(KERN_DEBUG "ieee80211_init: failed to "
 		       "initialize WME (err=%d)\n", ret);
-		goto fail;
+		goto fail_pid;
 	}
 
 	ieee80211_debugfs_netdev_init();
@@ -1338,26 +1346,18 @@ static int __init ieee80211_init(void)
 
 	return 0;
 
-fail:
-
-#ifdef CONFIG_MAC80211_RC_SIMPLE
-	ieee80211_rate_control_unregister(&mac80211_rcsimple);
-#endif
-#ifdef CONFIG_MAC80211_RC_PID
-	ieee80211_rate_control_unregister(&mac80211_rcpid);
-#endif
-
+ fail_pid:
+	rc80211_simple_exit();
+ fail_simple:
+	rc80211_pid_exit();
+ fail:
 	return ret;
 }
 
 static void __exit ieee80211_exit(void)
 {
-#ifdef CONFIG_MAC80211_RC_SIMPLE
-	ieee80211_rate_control_unregister(&mac80211_rcsimple);
-#endif
-#ifdef CONFIG_MAC80211_RC_PID
-	ieee80211_rate_control_unregister(&mac80211_rcpid);
-#endif
+	rc80211_simple_exit();
+	rc80211_pid_exit();
 
 	ieee80211_wme_unregister();
 	ieee80211_debugfs_netdev_exit();
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index baf53c0..b898b31 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -500,8 +500,9 @@ struct ieee80211_local {
 
 #ifdef CONFIG_MAC80211_LEDS
 	int tx_led_counter, rx_led_counter;
-	struct led_trigger *tx_led, *rx_led, *assoc_led;
-	char tx_led_name[32], rx_led_name[32], assoc_led_name[32];
+	struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led;
+	char tx_led_name[32], rx_led_name[32],
+	     assoc_led_name[32], radio_led_name[32];
 #endif
 
 	u32 channel_use;
@@ -767,6 +768,9 @@ int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie,
 int ieee80211_ht_addt_info_ie_to_ht_bss_info(
 			struct ieee80211_ht_addt_info *ht_add_info_ie,
 			struct ieee80211_ht_bss_info *bss_info);
+void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *da,
+				u16 tid, u16 initiator, u16 reason);
+void sta_rx_agg_session_timer_expired(unsigned long data);
 /* ieee80211_iface.c */
 int ieee80211_if_add(struct net_device *dev, const char *name,
 		     struct net_device **new_dev, int type);
@@ -798,7 +802,8 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev);
 extern void *mac80211_wiphy_privid; /* for wiphy privid */
 extern const unsigned char rfc1042_header[6];
 extern const unsigned char bridge_tunnel_header[6];
-u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len);
+u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
+			enum ieee80211_if_types type);
 int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
 			     int rate, int erp, int short_preamble);
 void mac80211_ev_michael_mic_failure(struct net_device *dev, int keyidx,
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index 0c52ed8..02b4092 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -21,6 +21,7 @@
 
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
+#include "ieee80211_led.h"
 #include "ieee80211_rate.h"
 #include "wpa.h"
 #include "aes_ccm.h"
@@ -652,6 +653,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
 	if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
 		local->hw.conf.radio_enabled = !(data->txpower.disabled);
 		need_reconfig = 1;
+		ieee80211_led_radio(local, local->hw.conf.radio_enabled);
 	}
 
 	if (need_reconfig) {
diff --git a/net/mac80211/ieee80211_led.c b/net/mac80211/ieee80211_led.c
index 4cf89af..f401484 100644
--- a/net/mac80211/ieee80211_led.c
+++ b/net/mac80211/ieee80211_led.c
@@ -43,6 +43,16 @@ void ieee80211_led_assoc(struct ieee80211_local *local, bool associated)
 		led_trigger_event(local->assoc_led, LED_OFF);
 }
 
+void ieee80211_led_radio(struct ieee80211_local *local, bool enabled)
+{
+	if (unlikely(!local->radio_led))
+		return;
+	if (enabled)
+		led_trigger_event(local->radio_led, LED_FULL);
+	else
+		led_trigger_event(local->radio_led, LED_OFF);
+}
+
 void ieee80211_led_init(struct ieee80211_local *local)
 {
 	local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
@@ -77,10 +87,25 @@ void ieee80211_led_init(struct ieee80211_local *local)
 			local->assoc_led = NULL;
 		}
 	}
+
+	local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
+	if (local->radio_led) {
+		snprintf(local->radio_led_name, sizeof(local->radio_led_name),
+			 "%sradio", wiphy_name(local->hw.wiphy));
+		local->radio_led->name = local->radio_led_name;
+		if (led_trigger_register(local->radio_led)) {
+			kfree(local->radio_led);
+			local->radio_led = NULL;
+		}
+	}
 }
 
 void ieee80211_led_exit(struct ieee80211_local *local)
 {
+	if (local->radio_led) {
+		led_trigger_unregister(local->radio_led);
+		kfree(local->radio_led);
+	}
 	if (local->assoc_led) {
 		led_trigger_unregister(local->assoc_led);
 		kfree(local->assoc_led);
@@ -95,6 +120,16 @@ void ieee80211_led_exit(struct ieee80211_local *local)
 	}
 }
 
+char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
+{
+	struct ieee80211_local *local = hw_to_local(hw);
+
+	if (local->radio_led)
+		return local->radio_led_name;
+	return NULL;
+}
+EXPORT_SYMBOL(__ieee80211_get_radio_led_name);
+
 char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
 {
 	struct ieee80211_local *local = hw_to_local(hw);
diff --git a/net/mac80211/ieee80211_led.h b/net/mac80211/ieee80211_led.h
index 0feb226..77b1e1b 100644
--- a/net/mac80211/ieee80211_led.h
+++ b/net/mac80211/ieee80211_led.h
@@ -16,6 +16,8 @@ extern void ieee80211_led_rx(struct ieee80211_local *local);
 extern void ieee80211_led_tx(struct ieee80211_local *local, int q);
 extern void ieee80211_led_assoc(struct ieee80211_local *local,
 				bool associated);
+extern void ieee80211_led_radio(struct ieee80211_local *local,
+				bool enabled);
 extern void ieee80211_led_init(struct ieee80211_local *local);
 extern void ieee80211_led_exit(struct ieee80211_local *local);
 #else
@@ -29,6 +31,10 @@ static inline void ieee80211_led_assoc(struct ieee80211_local *local,
 				       bool associated)
 {
 }
+static inline void ieee80211_led_radio(struct ieee80211_local *local,
+				       bool enabled)
+{
+}
 static inline void ieee80211_led_init(struct ieee80211_local *local)
 {
 }
diff --git a/net/mac80211/ieee80211_rate.c b/net/mac80211/ieee80211_rate.c
index 65fc9ad..5676a26 100644
--- a/net/mac80211/ieee80211_rate.c
+++ b/net/mac80211/ieee80211_rate.c
@@ -115,6 +115,10 @@ ieee80211_rate_control_ops_get(const char *name)
 		/* try default if specific alg requested but not found */
 		ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo);
 
+	/* try built-in one if specific alg requested but not found */
+	if (!ops && strlen(CONFIG_MAC80211_RC_DEFAULT))
+		ops = ieee80211_try_rate_control_ops_get(CONFIG_MAC80211_RC_DEFAULT);
+
 	return ops;
 }
 
diff --git a/net/mac80211/ieee80211_rate.h b/net/mac80211/ieee80211_rate.h
index 3eb0696..73f19e8 100644
--- a/net/mac80211/ieee80211_rate.h
+++ b/net/mac80211/ieee80211_rate.h
@@ -58,12 +58,6 @@ struct rate_control_ref {
 	struct kref kref;
 };
 
-/* default 'simple' algorithm */
-extern struct rate_control_ops mac80211_rcsimple;
-
-/* 'PID' algorithm */
-extern struct rate_control_ops mac80211_rcpid;
-
 int ieee80211_rate_control_register(struct rate_control_ops *ops);
 void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
 
@@ -170,4 +164,36 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local,
 				 const char *name);
 void rate_control_deinitialize(struct ieee80211_local *local);
 
+
+/* Rate control algorithms */
+#if defined(RC80211_SIMPLE_COMPILE) || \
+	(defined(CONFIG_MAC80211_RC_SIMPLE) && \
+	 !defined(CONFIG_MAC80211_RC_SIMPLE_MODULE))
+extern int rc80211_simple_init(void);
+extern void rc80211_simple_exit(void);
+#else
+static inline int rc80211_simple_init(void)
+{
+	return 0;
+}
+static inline void rc80211_simple_exit(void)
+{
+}
+#endif
+
+#if defined(RC80211_PID_COMPILE) || \
+	(defined(CONFIG_MAC80211_RC_PID) && \
+	 !defined(CONFIG_MAC80211_RC_PID_MODULE))
+extern int rc80211_pid_init(void);
+extern void rc80211_pid_exit(void);
+#else
+static inline int rc80211_pid_init(void)
+{
+	return 0;
+}
+static inline void rc80211_pid_exit(void)
+{
+}
+#endif
+
 #endif /* IEEE80211_RATE_H */
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index 5b8f484..d1f7199 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -63,6 +63,13 @@
 #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
 #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
 #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
+#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
+#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
+
+/* next values represent the buffer size for A-MPDU frame.
+ * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) */
+#define IEEE80211_MIN_AMPDU_BUF 0x8
+#define IEEE80211_MAX_AMPDU_BUF 0x40
 
 static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
 				     u8 *ssid, size_t ssid_len);
@@ -1005,7 +1012,8 @@ static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
 	struct ieee80211_mgmt *mgmt;
 	u16 capab;
 
-	skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
+	skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom + 1 +
+					sizeof(mgmt->u.action.u.addba_resp));
 	if (!skb) {
 		printk(KERN_DEBUG "%s: failed to allocate buffer "
 		       "for addba resp frame\n", dev->name);
@@ -1047,9 +1055,14 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
 						size_t len)
 {
 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+	struct ieee80211_hw *hw = &local->hw;
+	struct ieee80211_conf *conf = &hw->conf;
 	struct sta_info *sta;
-	u16 capab, tid, timeout, ba_policy, buf_size, status;
+	struct tid_ampdu_rx *tid_agg_rx;
+	u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status;
 	u8 dialog_token;
+	int ret = -EOPNOTSUPP;
+	DECLARE_MAC_BUF(mac);
 
 	sta = sta_info_get(local, mgmt->sa);
 	if (!sta)
@@ -1058,28 +1071,254 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
 	/* extract session parameters from addba request frame */
 	dialog_token = mgmt->u.action.u.addba_req.dialog_token;
 	timeout = le16_to_cpu(mgmt->u.action.u.addba_req.timeout);
+	start_seq_num =
+		le16_to_cpu(mgmt->u.action.u.addba_req.start_seq_num) >> 4;
 
 	capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
 	ba_policy = (capab & IEEE80211_ADDBA_PARAM_POLICY_MASK) >> 1;
 	tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
 	buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
 
-	/* TODO - currently aggregation is declined (A-MPDU add BA request
-	* acceptance is not obligatory by 802.11n draft), but here is
-	* the entry point for dealing with it */
-#ifdef MAC80211_HT_DEBUG
-	if (net_ratelimit())
-		printk(KERN_DEBUG "Add Block Ack request arrived,"
-				   " currently denying it\n");
-#endif /* MAC80211_HT_DEBUG */
-
 	status = WLAN_STATUS_REQUEST_DECLINED;
 
+	/* sanity check for incoming parameters:
+	 * check if configuration can support the BA policy
+	 * and if buffer size does not exceeds max value */
+	if (((ba_policy != 1)
+		&& (!(conf->ht_conf.cap & IEEE80211_HT_CAP_DELAY_BA)))
+		|| (buf_size > IEEE80211_MAX_AMPDU_BUF)) {
+		status = WLAN_STATUS_INVALID_QOS_PARAM;
+#ifdef CONFIG_MAC80211_HT_DEBUG
+		if (net_ratelimit())
+			printk(KERN_DEBUG "Block Ack Req with bad params from "
+				"%s on tid %u. policy %d, buffer size %d\n",
+				print_mac(mac, mgmt->sa), tid, ba_policy,
+				buf_size);
+#endif /* CONFIG_MAC80211_HT_DEBUG */
+		goto end_no_lock;
+	}
+	/* determine default buffer size */
+	if (buf_size == 0) {
+		struct ieee80211_hw_mode *mode = conf->mode;
+		buf_size = IEEE80211_MIN_AMPDU_BUF;
+		buf_size = buf_size << mode->ht_info.ampdu_factor;
+	}
+
+	tid_agg_rx = &sta->ampdu_mlme.tid_rx[tid];
+
+	/* examine state machine */
+	spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
+
+	if (tid_agg_rx->state != HT_AGG_STATE_IDLE) {
+#ifdef CONFIG_MAC80211_HT_DEBUG
+		if (net_ratelimit())
+			printk(KERN_DEBUG "unexpected Block Ack Req from "
+				"%s on tid %u\n",
+				print_mac(mac, mgmt->sa), tid);
+#endif /* CONFIG_MAC80211_HT_DEBUG */
+		goto end;
+	}
+
+	/* prepare reordering buffer */
+	tid_agg_rx->reorder_buf =
+		kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC);
+	if ((!tid_agg_rx->reorder_buf) && net_ratelimit()) {
+		printk(KERN_ERR "can not allocate reordering buffer "
+						"to tid %d\n", tid);
+		goto end;
+	}
+	memset(tid_agg_rx->reorder_buf, 0,
+		buf_size * sizeof(struct sk_buf *));
+
+	if (local->ops->ampdu_action)
+		ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START,
+					       sta->addr, tid, start_seq_num);
+#ifdef CONFIG_MAC80211_HT_DEBUG
+	printk(KERN_DEBUG "Rx A-MPDU on tid %d result %d", tid, ret);
+#endif /* CONFIG_MAC80211_HT_DEBUG */
+
+	if (ret) {
+		kfree(tid_agg_rx->reorder_buf);
+		goto end;
+	}
+
+	/* change state and send addba resp */
+	tid_agg_rx->state = HT_AGG_STATE_OPERATIONAL;
+	tid_agg_rx->dialog_token = dialog_token;
+	tid_agg_rx->ssn = start_seq_num;
+	tid_agg_rx->head_seq_num = start_seq_num;
+	tid_agg_rx->buf_size = buf_size;
+	tid_agg_rx->timeout = timeout;
+	tid_agg_rx->stored_mpdu_num = 0;
+	status = WLAN_STATUS_SUCCESS;
+end:
+	spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
+
+end_no_lock:
 	ieee80211_send_addba_resp(sta->dev, sta->addr, tid, dialog_token,
 				status, 1, buf_size, timeout);
 	sta_info_put(sta);
 }
 
+void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
+				u16 initiator, u16 reason_code)
+{
+	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+	struct ieee80211_if_sta *ifsta = &sdata->u.sta;
+	struct sk_buff *skb;
+	struct ieee80211_mgmt *mgmt;
+	u16 params;
+
+	skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom + 1 +
+					sizeof(mgmt->u.action.u.delba));
+
+	if (!skb) {
+		printk(KERN_ERR "%s: failed to allocate buffer "
+					"for delba frame\n", dev->name);
+		return;
+	}
+
+	skb_reserve(skb, local->hw.extra_tx_headroom);
+	mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
+	memset(mgmt, 0, 24);
+	memcpy(mgmt->da, da, ETH_ALEN);
+	memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+	if (sdata->type == IEEE80211_IF_TYPE_AP)
+		memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
+	else
+		memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
+	mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
+					IEEE80211_STYPE_ACTION);
+
+	skb_put(skb, 1 + sizeof(mgmt->u.action.u.delba));
+
+	mgmt->u.action.category = WLAN_CATEGORY_BACK;
+	mgmt->u.action.u.delba.action_code = WLAN_ACTION_DELBA;
+	params = (u16)(initiator << 11); 	/* bit 11 initiator */
+	params |= (u16)(tid << 12); 		/* bit 15:12 TID number */
+
+	mgmt->u.action.u.delba.params = cpu_to_le16(params);
+	mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
+
+	ieee80211_sta_tx(dev, skb, 0);
+}
+
+void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
+					u16 initiator, u16 reason)
+{
+	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+	struct ieee80211_hw *hw = &local->hw;
+	struct sta_info *sta;
+	int ret, i;
+
+	sta = sta_info_get(local, ra);
+	if (!sta)
+		return;
+
+	/* check if TID is in operational state */
+	spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
+	if (sta->ampdu_mlme.tid_rx[tid].state
+				!= HT_AGG_STATE_OPERATIONAL) {
+		spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
+		if (net_ratelimit())
+			printk(KERN_DEBUG "rx BA session requested to stop on "
+				"inactive tid %d\n", tid);
+		sta_info_put(sta);
+		return;
+	}
+	sta->ampdu_mlme.tid_rx[tid].state =
+		HT_AGG_STATE_REQ_STOP_BA_MSK |
+		(initiator << HT_AGG_STATE_INITIATOR_SHIFT);
+		spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
+
+	/* stop HW Rx aggregation. ampdu_action existence
+	 * already verified in session init so we add the BUG_ON */
+	BUG_ON(!local->ops->ampdu_action);
+
+	ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_STOP,
+					ra, tid, EINVAL);
+	if (ret)
+		printk(KERN_DEBUG "HW problem - can not stop rx "
+				"aggergation for tid %d\n", tid);
+
+	/* shutdown timer has not expired */
+	if (initiator != WLAN_BACK_TIMER)
+		del_timer_sync(&sta->ampdu_mlme.tid_rx[tid].
+					session_timer);
+
+	/* check if this is a self generated aggregation halt */
+	if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER)
+		ieee80211_send_delba(dev, ra, tid, 0, reason);
+
+	/* free the reordering buffer */
+	for (i = 0; i < sta->ampdu_mlme.tid_rx[tid].buf_size; i++) {
+		if (sta->ampdu_mlme.tid_rx[tid].reorder_buf[i]) {
+			/* release the reordered frames */
+			dev_kfree_skb(sta->ampdu_mlme.tid_rx[tid].reorder_buf[i]);
+			sta->ampdu_mlme.tid_rx[tid].stored_mpdu_num--;
+			sta->ampdu_mlme.tid_rx[tid].reorder_buf[i] = NULL;
+		}
+	}
+	kfree(sta->ampdu_mlme.tid_rx[tid].reorder_buf);
+
+	sta->ampdu_mlme.tid_rx[tid].state = HT_AGG_STATE_IDLE;
+	sta_info_put(sta);
+}
+
+static void ieee80211_sta_process_delba(struct net_device *dev,
+			struct ieee80211_mgmt *mgmt, size_t len)
+{
+	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+	struct sta_info *sta;
+	u16 tid, params;
+	u16 initiator;
+	DECLARE_MAC_BUF(mac);
+
+	sta = sta_info_get(local, mgmt->sa);
+	if (!sta)
+		return;
+
+	params = le16_to_cpu(mgmt->u.action.u.delba.params);
+	tid = (params & IEEE80211_DELBA_PARAM_TID_MASK) >> 12;
+	initiator = (params & IEEE80211_DELBA_PARAM_INITIATOR_MASK) >> 11;
+
+#ifdef CONFIG_MAC80211_HT_DEBUG
+	if (net_ratelimit())
+		printk(KERN_DEBUG "delba from %s on tid %d reason code %d\n",
+			print_mac(mac, mgmt->sa), tid,
+			mgmt->u.action.u.delba.reason_code);
+#endif /* CONFIG_MAC80211_HT_DEBUG */
+
+	if (initiator == WLAN_BACK_INITIATOR)
+		ieee80211_sta_stop_rx_ba_session(dev, sta->addr, tid,
+						 WLAN_BACK_INITIATOR, 0);
+	sta_info_put(sta);
+}
+
+/*
+ * After receiving Block Ack Request (BAR) we activated a
+ * timer after each frame arrives from the originator.
+ * if this timer expires ieee80211_sta_stop_rx_ba_session will be executed.
+ */
+void sta_rx_agg_session_timer_expired(unsigned long data)
+{
+	/* not an elegant detour, but there is no choice as the timer passes
+	 * only one argument, and verious sta_info are needed here, so init
+	 * flow in sta_info_add gives the TID as data, while the timer_to_id
+	 * array gives the sta through container_of */
+	u8 *ptid = (u8 *)data;
+	u8 *timer_to_id = ptid - *ptid;
+	struct sta_info *sta = container_of(timer_to_id, struct sta_info,
+					 timer_to_tid[0]);
+
+	printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);
+	ieee80211_sta_stop_rx_ba_session(sta->dev, sta->addr, (u16)*ptid,
+					 WLAN_BACK_TIMER,
+					 WLAN_REASON_QSTA_TIMEOUT);
+}
+
+
 static void ieee80211_rx_mgmt_auth(struct net_device *dev,
 				   struct ieee80211_if_sta *ifsta,
 				   struct ieee80211_mgmt *mgmt,
@@ -1997,9 +2236,15 @@ static void ieee80211_rx_mgmt_action(struct net_device *dev,
 				break;
 			ieee80211_sta_process_addba_request(dev, mgmt, len);
 			break;
+		case WLAN_ACTION_DELBA:
+			if (len < (IEEE80211_MIN_ACTION_SIZE +
+				   sizeof(mgmt->u.action.u.delba)))
+				break;
+			ieee80211_sta_process_delba(dev, mgmt, len);
+			break;
 		default:
 			if (net_ratelimit())
-			   printk(KERN_DEBUG "%s: received unsupported BACK\n",
+			   printk(KERN_DEBUG "%s: Rx unknown A-MPDU action\n",
 					dev->name);
 			break;
 		}
diff --git a/net/mac80211/rc80211_pid.h b/net/mac80211/rc80211_pid.h
index 425eb70..04afc13 100644
--- a/net/mac80211/rc80211_pid.h
+++ b/net/mac80211/rc80211_pid.h
@@ -1,5 +1,6 @@
 /*
  * Copyright 2007, Mattias Nissler <mattias.nissler@gmx.de>
+ * Copyright 2007, Stefano Brivio <stefano.brivio@polimi.it>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -9,42 +10,42 @@
 #ifndef RC80211_PID_H
 #define RC80211_PID_H
 
-/* Sampling period for measuring percentage of failed frames. */
-#define RC_PID_INTERVAL (HZ / 8)
+/* Sampling period for measuring percentage of failed frames in ms. */
+#define RC_PID_INTERVAL			125
 
 /* Exponential averaging smoothness (used for I part of PID controller) */
-#define RC_PID_SMOOTHING_SHIFT 3
-#define RC_PID_SMOOTHING (1 << RC_PID_SMOOTHING_SHIFT)
+#define RC_PID_SMOOTHING_SHIFT		3
+#define RC_PID_SMOOTHING		(1 << RC_PID_SMOOTHING_SHIFT)
 
 /* Sharpening factor (used for D part of PID controller) */
-#define RC_PID_SHARPENING_FACTOR 0
-#define RC_PID_SHARPENING_DURATION 0
+#define RC_PID_SHARPENING_FACTOR	0
+#define RC_PID_SHARPENING_DURATION	0
 
 /* Fixed point arithmetic shifting amount. */
-#define RC_PID_ARITH_SHIFT 8
+#define RC_PID_ARITH_SHIFT		8
 
 /* Fixed point arithmetic factor. */
-#define RC_PID_ARITH_FACTOR (1 << RC_PID_ARITH_SHIFT)
+#define RC_PID_ARITH_FACTOR		(1 << RC_PID_ARITH_SHIFT)
 
 /* Proportional PID component coefficient. */
-#define RC_PID_COEFF_P 15
+#define RC_PID_COEFF_P			15
 /* Integral PID component coefficient. */
-#define RC_PID_COEFF_I 9
+#define RC_PID_COEFF_I			9
 /* Derivative PID component coefficient. */
-#define RC_PID_COEFF_D 15
+#define RC_PID_COEFF_D			15
 
 /* Target failed frames rate for the PID controller. NB: This effectively gives
  * maximum failed frames percentage we're willing to accept. If the wireless
  * link quality is good, the controller will fail to adjust failed frames
  * percentage to the target. This is intentional.
  */
-#define RC_PID_TARGET_PF (11 << RC_PID_ARITH_SHIFT)
+#define RC_PID_TARGET_PF		14
 
 /* Rate behaviour normalization quantity over time. */
-#define RC_PID_NORM_OFFSET 3
+#define RC_PID_NORM_OFFSET		3
 
 /* Push high rates right after loading. */
-#define RC_PID_FAST_START 0
+#define RC_PID_FAST_START		0
 
 /* Arithmetic right shift for positive and negative values for ISO C. */
 #define RC_PID_DO_ARITH_RIGHT_SHIFT(x, y) \
@@ -119,6 +120,29 @@ struct rc_pid_events_file_info {
 	unsigned int next_entry;
 };
 
+/**
+ * struct rc_pid_debugfs_entries - tunable parameters
+ *
+ * Algorithm parameters, tunable via debugfs.
+ * @dir: the debugfs directory for a specific phy
+ * @target: target percentage for failed frames
+ * @sampling_period: error sampling interval in milliseconds
+ * @coeff_p: absolute value of the proportional coefficient
+ * @coeff_i: absolute value of the integral coefficient
+ * @coeff_d: absolute value of the derivative coefficient
+ * @smoothing_shift: absolute value of the integral smoothing factor (i.e.
+ *	amount of smoothing introduced by the exponential moving average)
+ * @sharpen_factor: absolute value of the derivative sharpening factor (i.e.
+ *	amount of emphasis given to the derivative term after low activity
+ *	events)
+ * @sharpen_duration: duration of the sharpening effect after the detected low
+ *	activity event, relative to sampling_period
+ * @norm_offset: amount of normalization periodically performed on the learnt
+ *	rate behaviour values (lower means we should trust more what we learnt
+ *	about behaviour of rates, higher means we should trust more the natural
+ *	ordering of rates)
+ * @fast_start: if Y, push high rates right after initialization
+ */
 struct rc_pid_debugfs_entries {
 	struct dentry *dir;
 	struct dentry *target;
diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c
index 631e468..66cae53 100644
--- a/net/mac80211/rc80211_pid_algo.c
+++ b/net/mac80211/rc80211_pid_algo.c
@@ -12,7 +12,7 @@
 #include <linux/netdevice.h>
 #include <linux/types.h>
 #include <linux/skbuff.h>
-
+#include <linux/debugfs.h>
 #include <net/mac80211.h>
 #include "ieee80211_rate.h"
 
@@ -74,29 +74,27 @@ static int rate_control_pid_shift_adjust(struct rc_pid_rateinfo *r,
 {
 	int i, j, k, tmp;
 
-	if (cur + adj < 0)
-		return 0;
-	if (cur + adj >= l)
-		return l - 1;
+	j = r[cur].rev_index;
+	i = j + adj;
 
-	i = r[cur + adj].rev_index;
+	if (i < 0)
+		return r[0].index;
+	if (i >= l - 1)
+		return r[l - 1].index;
 
-	j = r[cur].rev_index;
+	tmp = i;
 
 	if (adj < 0) {
-			tmp = i;
-			for (k = j; k >= i; k--)
-				if (r[k].diff <= r[j].diff)
-					tmp = k;
-			return r[tmp].index;
-	} else if (adj > 0) {
-			tmp = i;
-			for (k = i + 1; k + i < l; k++)
-				if (r[k].diff <= r[i].diff)
-					tmp = k;
-			return r[tmp].index;
+		for (k = j; k >= i; k--)
+			if (r[k].diff <= r[j].diff)
+				tmp = k;
+	} else {
+		for (k = i + 1; k + i < l; k++)
+			if (r[k].diff <= r[i].diff)
+				tmp = k;
 	}
-	return cur + adj;
+
+	return r[tmp].index;
 }
 
 static void rate_control_pid_adjust_rate(struct ieee80211_local *local,
@@ -110,10 +108,6 @@ static void rate_control_pid_adjust_rate(struct ieee80211_local *local,
 	int back = (adj > 0) ? 1 : -1;
 
 	sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
-	if (sdata->bss && sdata->bss->force_unicast_rateidx > -1) {
-		/* forced unicast rate - do not change STA rate */
-		return;
-	}
 
 	mode = local->oper_hw_mode;
 	maxrate = sdata->bss ? sdata->bss->max_ratectrl_rateidx : -1;
@@ -210,7 +204,7 @@ static void rate_control_pid_sample(struct rc_pid_info *pinfo,
 	rate_control_pid_normalize(pinfo, mode->num_rates);
 
 	/* Compute the proportional, integral and derivative errors. */
-	err_prop = pinfo->target - pf;
+	err_prop = (pinfo->target << RC_PID_ARITH_SHIFT) - pf;
 
 	err_avg = spinfo->err_avg_sc >> pinfo->smoothing_shift;
 	spinfo->err_avg_sc = spinfo->err_avg_sc - err_avg + err_prop;
@@ -243,6 +237,7 @@ static void rate_control_pid_tx_status(void *priv, struct net_device *dev,
 {
 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+	struct ieee80211_sub_if_data *sdata;
 	struct rc_pid_info *pinfo = priv;
 	struct sta_info *sta;
 	struct rc_pid_sta_info *spinfo;
@@ -253,10 +248,17 @@ static void rate_control_pid_tx_status(void *priv, struct net_device *dev,
 	if (!sta)
 		return;
 
+	/* Don't update the state if we're not controlling the rate. */
+	sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
+	if (sdata->bss && sdata->bss->force_unicast_rateidx > -1) {
+		sta->txrate = sdata->bss->max_ratectrl_rateidx;
+		return;
+	}
+
 	/* Ignore all frames that were sent with a different rate than the rate
 	 * we currently advise mac80211 to use. */
 	if (status->control.rate != &local->oper_hw_mode->rates[sta->txrate])
-		return;
+		goto ignore;
 
 	spinfo = sta->rate_ctrl_priv;
 	spinfo->tx_num_xmit++;
@@ -297,6 +299,7 @@ static void rate_control_pid_tx_status(void *priv, struct net_device *dev,
 	if (time_after(jiffies, spinfo->last_sample + period))
 		rate_control_pid_sample(pinfo, local, sta);
 
+ignore:
 	sta_info_put(sta);
 }
 
@@ -493,7 +496,7 @@ static void rate_control_pid_free_sta(void *priv, void *priv_sta)
 	kfree(spinfo);
 }
 
-struct rate_control_ops mac80211_rcpid = {
+static struct rate_control_ops mac80211_rcpid = {
 	.name = "pid",
 	.tx_status = rate_control_pid_tx_status,
 	.get_rate = rate_control_pid_get_rate,
@@ -508,3 +511,23 @@ struct rate_control_ops mac80211_rcpid = {
 	.remove_sta_debugfs = rate_control_pid_remove_sta_debugfs,
 #endif
 };
+
+MODULE_DESCRIPTION("PID controller based rate control algorithm");
+MODULE_AUTHOR("Stefano Brivio");
+MODULE_AUTHOR("Mattias Nissler");
+MODULE_LICENSE("GPL");
+
+int __init rc80211_pid_init(void)
+{
+	return ieee80211_rate_control_register(&mac80211_rcpid);
+}
+
+void __exit rc80211_pid_exit(void)
+{
+	ieee80211_rate_control_unregister(&mac80211_rcpid);
+}
+
+#ifdef CONFIG_MAC80211_RC_PID_MODULE
+module_init(rc80211_pid_init);
+module_exit(rc80211_pid_exit);
+#endif
diff --git a/net/mac80211/rc80211_pid_debugfs.c b/net/mac80211/rc80211_pid_debugfs.c
index 91818e4..88b8dc9 100644
--- a/net/mac80211/rc80211_pid_debugfs.c
+++ b/net/mac80211/rc80211_pid_debugfs.c
@@ -197,7 +197,7 @@ static ssize_t rate_control_pid_events_read(struct file *file, char __user *buf,
 
 #undef RC_PID_PRINT_BUF_SIZE
 
-struct file_operations rc_pid_fop_events = {
+static struct file_operations rc_pid_fop_events = {
 	.owner = THIS_MODULE,
 	.read = rate_control_pid_events_read,
 	.poll = rate_control_pid_events_poll,
diff --git a/net/mac80211/rc80211_simple.c b/net/mac80211/rc80211_simple.c
index c1c8b76..33de6f9 100644
--- a/net/mac80211/rc80211_simple.c
+++ b/net/mac80211/rc80211_simple.c
@@ -13,6 +13,7 @@
 #include <linux/slab.h>
 #include <linux/skbuff.h>
 #include <linux/compiler.h>
+#include <linux/module.h>
 
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
@@ -349,7 +350,7 @@ static void rate_control_simple_remove_sta_debugfs(void *priv, void *priv_sta)
 }
 #endif
 
-struct rate_control_ops mac80211_rcsimple = {
+static struct rate_control_ops mac80211_rcsimple = {
 	.name = "simple",
 	.tx_status = rate_control_simple_tx_status,
 	.get_rate = rate_control_simple_get_rate,
@@ -364,3 +365,21 @@ struct rate_control_ops mac80211_rcsimple = {
 	.remove_sta_debugfs = rate_control_simple_remove_sta_debugfs,
 #endif
 };
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Simple rate control algorithm");
+
+int __init rc80211_simple_init(void)
+{
+	return ieee80211_rate_control_register(&mac80211_rcsimple);
+}
+
+void __exit rc80211_simple_exit(void)
+{
+	ieee80211_rate_control_unregister(&mac80211_rcsimple);
+}
+
+#ifdef CONFIG_MAC80211_RC_SIMPLE_MODULE
+module_init(rc80211_simple_init);
+module_exit(rc80211_simple_exit);
+#endif
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 505159f..ed3b816 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -24,6 +24,10 @@
 #include "tkip.h"
 #include "wme.h"
 
+u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
+				struct tid_ampdu_rx *tid_agg_rx,
+				struct sk_buff *skb, u16 mpdu_seq_num,
+				int bar_req);
 /*
  * monitor mode reception
  *
@@ -64,7 +68,9 @@ static inline int should_drop_frame(struct ieee80211_rx_status *status,
 	if (((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
 			cpu_to_le16(IEEE80211_FTYPE_CTL)) &&
 	    ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE)) !=
-			cpu_to_le16(IEEE80211_STYPE_PSPOLL)))
+			cpu_to_le16(IEEE80211_STYPE_PSPOLL)) &&
+	    ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE)) !=
+			cpu_to_le16(IEEE80211_STYPE_BACK_REQ)))
 		return 1;
 	return 0;
 }
@@ -288,11 +294,11 @@ ieee80211_rx_h_parse_qos(struct ieee80211_txrx_data *rx)
 	return TXRX_CONTINUE;
 }
 
-static ieee80211_txrx_result
-ieee80211_rx_h_load_stats(struct ieee80211_txrx_data *rx)
+
+u32 ieee80211_rx_load_stats(struct ieee80211_local *local,
+			      struct sk_buff *skb,
+			      struct ieee80211_rx_status *status)
 {
-	struct ieee80211_local *local = rx->local;
-	struct sk_buff *skb = rx->skb;
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 	u32 load = 0, hdrtime;
 	struct ieee80211_rate *rate;
@@ -306,7 +312,7 @@ ieee80211_rx_h_load_stats(struct ieee80211_txrx_data *rx)
 
 	rate = &mode->rates[0];
 	for (i = 0; i < mode->num_rates; i++) {
-		if (mode->rates[i].val == rx->u.rx.status->rate) {
+		if (mode->rates[i].val == status->rate) {
 			rate = &mode->rates[i];
 			break;
 		}
@@ -330,16 +336,13 @@ ieee80211_rx_h_load_stats(struct ieee80211_txrx_data *rx)
 
 	/* Divide channel_use by 8 to avoid wrapping around the counter */
 	load >>= CHAN_UTIL_SHIFT;
-	local->channel_use_raw += load;
-	rx->u.rx.load = load;
 
-	return TXRX_CONTINUE;
+	return load;
 }
 
 ieee80211_rx_handler ieee80211_rx_pre_handlers[] =
 {
 	ieee80211_rx_h_parse_qos,
-	ieee80211_rx_h_load_stats,
 	NULL
 };
 
@@ -637,7 +640,8 @@ ieee80211_rx_h_sta_process(struct ieee80211_txrx_data *rx)
 	 * BSSID to avoid keeping the current IBSS network alive in cases where
 	 * other STAs are using different BSSID. */
 	if (rx->sdata->type == IEEE80211_IF_TYPE_IBSS) {
-		u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len);
+		u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len,
+						IEEE80211_IF_TYPE_IBSS);
 		if (compare_ether_addr(bssid, rx->sdata->u.sta.bssid) == 0)
 			sta->last_rx = jiffies;
 	} else
@@ -1380,6 +1384,49 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
 }
 
 static ieee80211_txrx_result
+ieee80211_rx_h_ctrl(struct ieee80211_txrx_data *rx)
+{
+	struct ieee80211_local *local = rx->local;
+	struct ieee80211_hw *hw = &local->hw;
+	struct sk_buff *skb = rx->skb;
+	struct ieee80211_bar *bar = (struct ieee80211_bar *) skb->data;
+	struct tid_ampdu_rx *tid_agg_rx;
+	u16 start_seq_num;
+	u16 tid;
+
+	if (likely((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_CTL))
+		return TXRX_CONTINUE;
+
+	if ((rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BACK_REQ) {
+		if (!rx->sta)
+			return TXRX_CONTINUE;
+		tid = le16_to_cpu(bar->control) >> 12;
+		tid_agg_rx = &(rx->sta->ampdu_mlme.tid_rx[tid]);
+		if (tid_agg_rx->state != HT_AGG_STATE_OPERATIONAL)
+			return TXRX_CONTINUE;
+
+		start_seq_num = le16_to_cpu(bar->start_seq_num) >> 4;
+
+		/* reset session timer */
+		if (tid_agg_rx->timeout) {
+			unsigned long expires =
+				jiffies + (tid_agg_rx->timeout / 1000) * HZ;
+			mod_timer(&tid_agg_rx->session_timer, expires);
+		}
+
+		/* manage reordering buffer according to requested */
+		/* sequence number */
+		rcu_read_lock();
+		ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, NULL,
+						 start_seq_num, 1);
+		rcu_read_unlock();
+		return TXRX_DROP;
+	}
+
+	return TXRX_CONTINUE;
+}
+
+static ieee80211_txrx_result
 ieee80211_rx_h_mgmt(struct ieee80211_txrx_data *rx)
 {
 	struct ieee80211_sub_if_data *sdata;
@@ -1530,6 +1577,7 @@ ieee80211_rx_handler ieee80211_rx_handlers[] =
 	ieee80211_rx_h_remove_qos_control,
 	ieee80211_rx_h_amsdu,
 	ieee80211_rx_h_data,
+	ieee80211_rx_h_ctrl,
 	ieee80211_rx_h_mgmt,
 	NULL
 };
@@ -1613,11 +1661,11 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
 }
 
 /*
- * This is the receive path handler. It is called by a low level driver when an
- * 802.11 MPDU is received from the hardware.
+ * This is the actual Rx frames handler. as it blongs to Rx path it must
+ * be called with rcu_read_lock protection.
  */
-void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
-		    struct ieee80211_rx_status *status)
+void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, struct sk_buff *skb,
+			    struct ieee80211_rx_status *status, u32 load)
 {
 	struct ieee80211_local *local = hw_to_local(hw);
 	struct ieee80211_sub_if_data *sdata;
@@ -1625,37 +1673,19 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 	struct ieee80211_hdr *hdr;
 	struct ieee80211_txrx_data rx;
 	u16 type;
-	int prepres;
+	int prepares;
 	struct ieee80211_sub_if_data *prev = NULL;
 	struct sk_buff *skb_new;
 	u8 *bssid;
 	int hdrlen;
 
-	/*
-	 * key references and virtual interfaces are protected using RCU
-	 * and this requires that we are in a read-side RCU section during
-	 * receive processing
-	 */
-	rcu_read_lock();
-
-	/*
-	 * Frames with failed FCS/PLCP checksum are not returned,
-	 * all other frames are returned without radiotap header
-	 * if it was previously present.
-	 * Also, frames with less than 16 bytes are dropped.
-	 */
-	skb = ieee80211_rx_monitor(local, skb, status);
-	if (!skb) {
-		rcu_read_unlock();
-		return;
-	}
-
 	hdr = (struct ieee80211_hdr *) skb->data;
 	memset(&rx, 0, sizeof(rx));
 	rx.skb = skb;
 	rx.local = local;
 
 	rx.u.rx.status = status;
+	rx.u.rx.load = load;
 	rx.fc = le16_to_cpu(hdr->frame_control);
 	type = rx.fc & IEEE80211_FCTL_FTYPE;
 
@@ -1704,8 +1734,6 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 		return;
 	}
 
-	bssid = ieee80211_get_bssid(hdr, skb->len);
-
 	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 		if (!netif_running(sdata->dev))
 			continue;
@@ -1713,12 +1741,13 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 		if (sdata->type == IEEE80211_IF_TYPE_MNTR)
 			continue;
 
+		bssid = ieee80211_get_bssid(hdr, skb->len, sdata->type);
 		rx.flags |= IEEE80211_TXRXD_RXRA_MATCH;
-		prepres = prepare_for_handlers(sdata, bssid, &rx, hdr);
+		prepares = prepare_for_handlers(sdata, bssid, &rx, hdr);
 		/* prepare_for_handlers can change sta */
 		sta = rx.sta;
 
-		if (!prepres)
+		if (!prepares)
 			continue;
 
 		/*
@@ -1746,6 +1775,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 				       prev->dev->name);
 			continue;
 		}
+		rx.fc = le16_to_cpu(hdr->frame_control);
 		rx.skb = skb_new;
 		rx.dev = prev->dev;
 		rx.sdata = prev;
@@ -1754,6 +1784,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 		prev = sdata;
 	}
 	if (prev) {
+		rx.fc = le16_to_cpu(hdr->frame_control);
 		rx.skb = skb;
 		rx.dev = prev->dev;
 		rx.sdata = prev;
@@ -1763,10 +1794,230 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
 		dev_kfree_skb(skb);
 
  end:
-	rcu_read_unlock();
+	if (sta)
+		sta_info_put(sta);
+}
 
+#define SEQ_MODULO 0x1000
+#define SEQ_MASK   0xfff
+
+static inline int seq_less(u16 sq1, u16 sq2)
+{
+	return (((sq1 - sq2) & SEQ_MASK) > (SEQ_MODULO >> 1));
+}
+
+static inline u16 seq_inc(u16 sq)
+{
+	return ((sq + 1) & SEQ_MASK);
+}
+
+static inline u16 seq_sub(u16 sq1, u16 sq2)
+{
+	return ((sq1 - sq2) & SEQ_MASK);
+}
+
+
+/*
+ * As it function blongs to Rx path it must be called with
+ * the proper rcu_read_lock protection for its flow.
+ */
+u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
+				struct tid_ampdu_rx *tid_agg_rx,
+				struct sk_buff *skb, u16 mpdu_seq_num,
+				int bar_req)
+{
+	struct ieee80211_local *local = hw_to_local(hw);
+	struct ieee80211_rx_status status;
+	u16 head_seq_num, buf_size;
+	int index;
+	u32 pkt_load;
+
+	buf_size = tid_agg_rx->buf_size;
+	head_seq_num = tid_agg_rx->head_seq_num;
+
+	/* frame with out of date sequence number */
+	if (seq_less(mpdu_seq_num, head_seq_num)) {
+		dev_kfree_skb(skb);
+		return 1;
+	}
+
+	/* if frame sequence number exceeds our buffering window size or
+	 * block Ack Request arrived - release stored frames */
+	if ((!seq_less(mpdu_seq_num, head_seq_num + buf_size)) || (bar_req)) {
+		/* new head to the ordering buffer */
+		if (bar_req)
+			head_seq_num = mpdu_seq_num;
+		else
+			head_seq_num =
+				seq_inc(seq_sub(mpdu_seq_num, buf_size));
+		/* release stored frames up to new head to stack */
+		while (seq_less(tid_agg_rx->head_seq_num, head_seq_num)) {
+			index = seq_sub(tid_agg_rx->head_seq_num,
+				tid_agg_rx->ssn)
+				% tid_agg_rx->buf_size;
+
+			if (tid_agg_rx->reorder_buf[index]) {
+				/* release the reordered frames to stack */
+				memcpy(&status,
+					tid_agg_rx->reorder_buf[index]->cb,
+					sizeof(status));
+				pkt_load = ieee80211_rx_load_stats(local,
+						tid_agg_rx->reorder_buf[index],
+						&status);
+				__ieee80211_rx_handle_packet(hw,
+					tid_agg_rx->reorder_buf[index],
+					&status, pkt_load);
+				tid_agg_rx->stored_mpdu_num--;
+				tid_agg_rx->reorder_buf[index] = NULL;
+			}
+			tid_agg_rx->head_seq_num =
+				seq_inc(tid_agg_rx->head_seq_num);
+		}
+		if (bar_req)
+			return 1;
+	}
+
+	/* now the new frame is always in the range of the reordering */
+	/* buffer window */
+	index = seq_sub(mpdu_seq_num, tid_agg_rx->ssn)
+				% tid_agg_rx->buf_size;
+	/* check if we already stored this frame */
+	if (tid_agg_rx->reorder_buf[index]) {
+		dev_kfree_skb(skb);
+		return 1;
+	}
+
+	/* if arrived mpdu is in the right order and nothing else stored */
+	/* release it immediately */
+	if (mpdu_seq_num == tid_agg_rx->head_seq_num &&
+			tid_agg_rx->stored_mpdu_num == 0) {
+		tid_agg_rx->head_seq_num =
+			seq_inc(tid_agg_rx->head_seq_num);
+		return 0;
+	}
+
+	/* put the frame in the reordering buffer */
+	tid_agg_rx->reorder_buf[index] = skb;
+	tid_agg_rx->stored_mpdu_num++;
+	/* release the buffer until next missing frame */
+	index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn)
+						% tid_agg_rx->buf_size;
+	while (tid_agg_rx->reorder_buf[index]) {
+		/* release the reordered frame back to stack */
+		memcpy(&status, tid_agg_rx->reorder_buf[index]->cb,
+			sizeof(status));
+		pkt_load = ieee80211_rx_load_stats(local,
+					tid_agg_rx->reorder_buf[index],
+					&status);
+		__ieee80211_rx_handle_packet(hw, tid_agg_rx->reorder_buf[index],
+						&status, pkt_load);
+		tid_agg_rx->stored_mpdu_num--;
+		tid_agg_rx->reorder_buf[index] = NULL;
+		tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num);
+		index =	seq_sub(tid_agg_rx->head_seq_num,
+			tid_agg_rx->ssn) % tid_agg_rx->buf_size;
+	}
+	return 1;
+}
+
+u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
+			      struct sk_buff *skb)
+{
+	struct ieee80211_hw *hw = &local->hw;
+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+	struct sta_info *sta;
+	struct tid_ampdu_rx *tid_agg_rx;
+	u16 fc, sc;
+	u16 mpdu_seq_num;
+	u8 ret = 0, *qc;
+	int tid;
+
+	sta = sta_info_get(local, hdr->addr2);
+	if (!sta)
+		return ret;
+
+	fc = le16_to_cpu(hdr->frame_control);
+
+	/* filter the QoS data rx stream according to
+	 * STA/TID and check if this STA/TID is on aggregation */
+	if (!WLAN_FC_IS_QOS_DATA(fc))
+		goto end_reorder;
+
+	qc = skb->data + ieee80211_get_hdrlen(fc) - QOS_CONTROL_LEN;
+	tid = qc[0] & QOS_CONTROL_TID_MASK;
+	tid_agg_rx = &(sta->ampdu_mlme.tid_rx[tid]);
+
+	if (tid_agg_rx->state != HT_AGG_STATE_OPERATIONAL)
+		goto end_reorder;
+
+	/* null data frames are excluded */
+	if (unlikely(fc & IEEE80211_STYPE_QOS_NULLFUNC))
+		goto end_reorder;
+
+	/* new un-ordered ampdu frame - process it */
+
+	/* reset session timer */
+	if (tid_agg_rx->timeout) {
+		unsigned long expires =
+			jiffies + (tid_agg_rx->timeout / 1000) * HZ;
+		mod_timer(&tid_agg_rx->session_timer, expires);
+	}
+
+	/* if this mpdu is fragmented - terminate rx aggregation session */
+	sc = le16_to_cpu(hdr->seq_ctrl);
+	if (sc & IEEE80211_SCTL_FRAG) {
+		ieee80211_sta_stop_rx_ba_session(sta->dev, sta->addr,
+			tid, 0, WLAN_REASON_QSTA_REQUIRE_SETUP);
+		ret = 1;
+		goto end_reorder;
+	}
+
+	/* according to mpdu sequence number deal with reordering buffer */
+	mpdu_seq_num = (sc & IEEE80211_SCTL_SEQ) >> 4;
+	ret = ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, skb,
+						mpdu_seq_num, 0);
+end_reorder:
 	if (sta)
 		sta_info_put(sta);
+	return ret;
+}
+
+/*
+ * This is the receive path handler. It is called by a low level driver when an
+ * 802.11 MPDU is received from the hardware.
+ */
+void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
+		    struct ieee80211_rx_status *status)
+{
+	struct ieee80211_local *local = hw_to_local(hw);
+	u32 pkt_load;
+
+	/*
+	 * key references and virtual interfaces are protected using RCU
+	 * and this requires that we are in a read-side RCU section during
+	 * receive processing
+	 */
+	rcu_read_lock();
+
+	/*
+	 * Frames with failed FCS/PLCP checksum are not returned,
+	 * all other frames are returned without radiotap header
+	 * if it was previously present.
+	 * Also, frames with less than 16 bytes are dropped.
+	 */
+	skb = ieee80211_rx_monitor(local, skb, status);
+	if (!skb) {
+		rcu_read_unlock();
+		return;
+	}
+
+	pkt_load = ieee80211_rx_load_stats(local, skb, status);
+	local->channel_use_raw += pkt_load;
+
+	if (!ieee80211_rx_reorder_ampdu(local, skb))
+		__ieee80211_rx_handle_packet(hw, skb, status, pkt_load);
+
+	rcu_read_unlock();
 }
 EXPORT_SYMBOL(__ieee80211_rx);
 
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index ffe8a49..1257c7a 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -104,6 +104,7 @@ static void sta_info_release(struct kref *kref)
 	struct sta_info *sta = container_of(kref, struct sta_info, kref);
 	struct ieee80211_local *local = sta->local;
 	struct sk_buff *skb;
+	int i;
 
 	/* free sta structure; it has already been removed from
 	 * hash table etc. external structures. Make sure that all
@@ -116,6 +117,8 @@ static void sta_info_release(struct kref *kref)
 	while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL) {
 		dev_kfree_skb_any(skb);
 	}
+	for (i = 0; i <  STA_TID_NUM; i++)
+		del_timer_sync(&sta->ampdu_mlme.tid_rx[i].session_timer);
 	rate_control_free_sta(sta->rate_ctrl, sta->rate_ctrl_priv);
 	rate_control_put(sta->rate_ctrl);
 	kfree(sta);
@@ -133,6 +136,7 @@ struct sta_info * sta_info_add(struct ieee80211_local *local,
 			       struct net_device *dev, u8 *addr, gfp_t gfp)
 {
 	struct sta_info *sta;
+	int i;
 	DECLARE_MAC_BUF(mac);
 
 	sta = kzalloc(sizeof(*sta), gfp);
@@ -152,6 +156,19 @@ struct sta_info * sta_info_add(struct ieee80211_local *local,
 	memcpy(sta->addr, addr, ETH_ALEN);
 	sta->local = local;
 	sta->dev = dev;
+	spin_lock_init(&sta->ampdu_mlme.ampdu_rx);
+	for (i = 0; i < STA_TID_NUM; i++) {
+		/* timer_to_tid must be initialized with identity mapping to
+		 * enable session_timer's data differentiation. refer to
+		 * sta_rx_agg_session_timer_expired for useage */
+		sta->timer_to_tid[i] = i;
+		/* rx timers */
+		sta->ampdu_mlme.tid_rx[i].session_timer.function =
+			sta_rx_agg_session_timer_expired;
+		sta->ampdu_mlme.tid_rx[i].session_timer.data =
+			(unsigned long)&sta->timer_to_tid[i];
+		init_timer(&sta->ampdu_mlme.tid_rx[i].session_timer);
+	}
 	skb_queue_head_init(&sta->ps_tx_buf);
 	skb_queue_head_init(&sta->tx_filtered);
 	__sta_info_get(sta);	/* sta used by caller, decremented by
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index e1a4ac1..96fe3ed 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -31,6 +31,51 @@
 #define WLAN_STA_WME BIT(9)
 #define WLAN_STA_WDS BIT(27)
 
+#define STA_TID_NUM 16
+#define ADDBA_RESP_INTERVAL HZ
+
+#define HT_AGG_STATE_INITIATOR_SHIFT	(4)
+
+#define HT_AGG_STATE_REQ_STOP_BA_MSK	BIT(3)
+
+#define HT_AGG_STATE_IDLE		(0x0)
+#define HT_AGG_STATE_OPERATIONAL	(0x7)
+
+/**
+ * struct tid_ampdu_rx - TID aggregation information (Rx).
+ *
+ * @state: TID's state in session state machine.
+ * @dialog_token: dialog token for aggregation session
+ * @ssn: Starting Sequence Number expected to be aggregated.
+ * @buf_size: buffer size for incoming A-MPDUs
+ * @timeout: reset timer value.
+ * @head_seq_num: head sequence number in reordering buffer.
+ * @stored_mpdu_num: number of MPDUs in reordering buffer
+ * @reorder_buf: buffer to reorder incoming aggregated MPDUs
+ * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value)
+ */
+struct tid_ampdu_rx {
+	u8 state;
+	u8 dialog_token;
+	u16 ssn;
+	u16 buf_size;
+	u16 timeout;
+	u16 head_seq_num;
+	u16 stored_mpdu_num;
+	struct sk_buff **reorder_buf;
+	struct timer_list session_timer;
+};
+
+/**
+ * struct sta_ampdu_mlme - STA aggregation information.
+ *
+ * @tid_agg_info_rx: aggregation info for Rx per TID
+ * @ampdu_rx: for locking sections in aggregation Rx flow
+ */
+struct sta_ampdu_mlme {
+	struct tid_ampdu_rx tid_rx[STA_TID_NUM];
+	spinlock_t ampdu_rx;
+};
 
 struct sta_info {
 	struct kref kref;
@@ -101,6 +146,8 @@ struct sta_info {
 
 	struct ieee80211_ht_info ht_info; /* 802.11n HT capabilities
 					     of this STA */
+	struct sta_ampdu_mlme ampdu_mlme;
+	u8 timer_to_tid[STA_TID_NUM];	/* convert timer id to tid */
 
 #ifdef CONFIG_MAC80211_DEBUGFS
 	struct sta_info_debugfsdentries {
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 8302c70..f619416 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -932,7 +932,6 @@ __ieee80211_tx_prepare(struct ieee80211_txrx_data *tx,
 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 	struct ieee80211_hdr *hdr;
 	struct ieee80211_sub_if_data *sdata;
-	ieee80211_txrx_result res = TXRX_CONTINUE;
 
 	int hdrlen;
 
@@ -997,7 +996,7 @@ __ieee80211_tx_prepare(struct ieee80211_txrx_data *tx,
 	}
 	control->flags |= IEEE80211_TXCTL_FIRST_FRAGMENT;
 
-	return res;
+	return TXRX_CONTINUE;
 }
 
 /* Device in tx->dev has a reference added; use dev_put(tx->dev) when
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 2b02b2b..adb85dd 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -127,7 +127,8 @@ void ieee80211_prepare_rates(struct ieee80211_local *local,
 	}
 }
 
-u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len)
+u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
+			enum ieee80211_if_types type)
 {
 	u16 fc;
 
@@ -159,6 +160,18 @@ u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len)
 	case IEEE80211_FTYPE_CTL:
 		if ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)
 			return hdr->addr1;
+		else if ((fc & IEEE80211_FCTL_STYPE) ==
+						IEEE80211_STYPE_BACK_REQ) {
+			switch (type) {
+			case IEEE80211_IF_TYPE_STA:
+				return hdr->addr2;
+			case IEEE80211_IF_TYPE_AP:
+			case IEEE80211_IF_TYPE_VLAN:
+				return hdr->addr1;
+			default:
+				return NULL;
+			}
+		}
 		else
 			return NULL;
 	}
-- 
John W. Linville
linville@tuxdriver.com

^ permalink raw reply related

* Re: [PATCH 0/3] bonding: 3 fixes for 2.6.24
From: Jay Vosburgh @ 2008-01-08 20:28 UTC (permalink / raw)
  To: Andy Gospodarek; +Cc: Krzysztof Oledzki, netdev, Jeff Garzik, David Miller
In-Reply-To: <20080108191706.GD8728@gospo.usersys.redhat.com>

Andy Gospodarek <andy@greyhouse.net> wrote:
[...]
>Jay's patches will not fix this issue.  I think something like this did
>it for me, but as I mentioned to Jay in the last thread, I'm not
>convinced it doesn't violate some of the locking expectations we have.
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index 423298c..3c6619a 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -3915,7 +3915,7 @@ static void bond_set_multicast_list(struct net_device *bond_dev)
> 	struct bonding *bond = bond_dev->priv;
> 	struct dev_mc_list *dmi;
>
>-	write_lock_bh(&bond->lock);
>+	read_lock(&bond->lock);
>
> 	/*
> 	 * Do promisc before checking multicast_mode
>@@ -3957,7 +3957,7 @@ static void bond_set_multicast_list(struct net_device *bond_dev)
> 	bond_mc_list_destroy(bond);
> 	bond_mc_list_copy(bond_dev->mc_list, bond, GFP_ATOMIC);
>
>-	write_unlock_bh(&bond->lock);
>+	read_unlock(&bond->lock);
> }
>
> /*

	Actually, I think we might be good here with no locks at all, as
it appears that all of the accesses to and manipulations of the
bond->mc_list are protected under RTNL.  I haven't checked this 100%,
but it looks that way to me after 20 minutes of poking around.  I'm
pretty sure that bonding doesn't internally mess with the mc_lists
without RTNL, it's the outside callers that I'm not entirely sure of.

	I delve into "no locks" because bond_set_multicast_list should
do a bunch of things with no extra locks beyond RTNL (all of the calls
to bond_set_promisc, and _allmulti), so simply removing the acquisition
of bond->lock would help there, too.  I don't think we'll go down the
promisc or allmulti paths when called from ipv6 (which holds extra locks
in addition to RTNL) because those (apparently) won't alter the
IFF_PROMISC or IFF_ALLMULTI flags.

	-J

---
	-Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com

^ permalink raw reply

* [SOCK]: Adds a rcu_dereference() in sk_filter
From: Eric Dumazet @ 2008-01-08 20:31 UTC (permalink / raw)
  To: David S. Miller; +Cc: Linux Netdev List, dim, Alexey Kuznetsov

[-- Attachment #1: Type: text/plain, Size: 297 bytes --]

It seems commit fda9ef5d679b07c9d9097aaf6ef7f069d794a8f9 introduced a RCU 
protection for sk_filter(), without a rcu_dereference()

Either we need a rcu_dereference(), either a comment should explain why we 
dont need it. I vote for the former.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>


[-- Attachment #2: sk_filter.patch --]
[-- Type: text/plain, Size: 423 bytes --]

diff --git a/include/net/sock.h b/include/net/sock.h
index 67e35c7..6e1542d 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -944,7 +944,7 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
 		return err;
 	
 	rcu_read_lock_bh();
-	filter = sk->sk_filter;
+	filter = rcu_dereference(sk->sk_filter);
 	if (filter) {
 		unsigned int pkt_len = sk_run_filter(skb, filter->insns,
 				filter->len);

^ permalink raw reply related

* Re: [PATCH 3/3] drivers/net/ipg.c: fix horrible mdio_read and _write
From: Francois Romieu @ 2008-01-08 20:47 UTC (permalink / raw)
  To: linux; +Cc: netdev, akpm, davem
In-Reply-To: <20080108124049.12199.qmail@science.horizon.com>

linux@horizon.com <linux@horizon.com> :
[...]
> diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c
> index 3860fcd..b3d3fc8 100644
> --- a/drivers/net/ipg.c
> +++ b/drivers/net/ipg.c
> @@ -202,12 +202,31 @@ static u16 read_phy_bit(void __iomem * ioaddr, u8 phyctrlpolarity)
>  }
>  
>  /*
> + * Transmit the given bits, MSB-first, through the MgmtData bit (bit 1)
> + * of the PhyCtrl register. 1 <= len <= 32.  "ioaddr" is the register
> + * address, and "otherbits" are the values of the other bits.
> + */
> +static void mdio_write_bits(void __iomem *ioaddr, u8 otherbits, u32 data, unsigned len)
> +{
> +	otherbits |= IPG_PC_MGMTDIR;
> +	do {
> +		/* IPG_PC_MGMTDATA is a power of 2; compiler knows to shift */
> +		u8 d = ((data >> --len) & 1) * IPG_PC_MGMTDATA;
> +		/* + rather than | lets compiler microoptimize better */
> +		ipg_drive_phy_ctl_low_high(ioaddr, d + otherbits);
> +	} while (len);

Imho something is not quite right when the code needs a comment every line
and I am mildly convinced that we really want to honk an "optimizing mdio
methods is ok" signal around.

"while (len--) {" is probably more akpm-ish btw.

[...]
>  static int mdio_read(struct net_device * dev, int phy_id, int phy_reg)
>  {
>  	void __iomem *ioaddr = ipg_ioaddr(dev);
> +	u8 const polarity = ipg_r8(PHY_CTRL) &
> +			(IPG_PC_DUPLEX_POLARITY | IPG_PC_LINK_POLARITY);

(IPG_PC_DUPLEX_POLARITY | IPG_PC_LINK_POLARITY) appears twice. I would not
mind a #define for it.

> @@ -221,75 +240,30 @@ static int mdio_read(struct net_device * dev, int phy_id, int phy_reg)
[...]
> -	for (i = 0; i < p[6].len; i++) {
> -		p[6].field |=
> -		    (read_phy_bit(ioaddr, polarity) << (p[6].len - 1 - i));
> -	}
> +	send_three_state(ioaddr, polarity);	/* TA first bit */
> +	(void)read_phy_bit(ioaddr, polarity);		/* TA second bit */
> +
> +	for (i = 0; i < 16; i++)
> +		data += data + read_phy_bit(ioaddr, polarity);
                ^^^^^^^^^^^^
Huh ?

> @@ -299,11 +273,13 @@ static int mdio_read(struct net_device * dev, int phy_id, int phy_reg)
>  static void mdio_write(struct net_device *dev, int phy_id, int phy_reg, int val)
[...]
> +	mdio_write_bits(ioaddr, polarity, GMII_PREAMBLE, 32);
> +	mdio_write_bits(ioaddr, polarity, GMII_ST << 14 | GMII_WRITE << 12 |
> +	                                  phy_id << 7 | phy_reg << 2 |
> +					  0x2, 16);

Use the 80 cols luke:
	                                  phy_id << 7 | phy_reg << 2 | 0x2, 16);

It is a nice improvement otherwise.

-- 
Ueimor

^ permalink raw reply

* Re: [PATCH 1/3] drivers/net/ipg.c: Fix skbuff leak
From: Francois Romieu @ 2008-01-08 21:36 UTC (permalink / raw)
  To: linux; +Cc: netdev, akpm, davem
In-Reply-To: <20080108131956.13905.qmail@science.horizon.com>

linux@horizon.com <linux@horizon.com> :
> I take that back.  This patch does NOT fix the leak, at least if
> ping: sendmsg: No buffer space available
> is any indication...

Can you try the patch below ?

diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c
index dbd23bb..c304e5c 100644
--- a/drivers/net/ipg.c
+++ b/drivers/net/ipg.c
@@ -860,7 +860,7 @@ static void ipg_nic_txfree(struct net_device *dev)
 	void __iomem *ioaddr = sp->ioaddr;
 	unsigned int curr;
 	u64 txd_map;
-	unsigned int released, pending;
+	unsigned int released, pending, dirty;
 
 	txd_map = (u64)sp->txd_map;
 	curr = ipg_r32(TFD_LIST_PTR_0) -
@@ -869,9 +869,9 @@ static void ipg_nic_txfree(struct net_device *dev)
 	IPG_DEBUG_MSG("_nic_txfree\n");
 
 	pending = sp->tx_current - sp->tx_dirty;
+	dirty = sp->tx_dirty % IPG_TFDLIST_LENGTH;
 
 	for (released = 0; released < pending; released++) {
-		unsigned int dirty = sp->tx_dirty % IPG_TFDLIST_LENGTH;
 		struct sk_buff *skb = sp->TxBuff[dirty];
 		struct ipg_tx *txfd = sp->txd + dirty;
 
@@ -898,6 +898,7 @@ static void ipg_nic_txfree(struct net_device *dev)
 
 			sp->TxBuff[dirty] = NULL;
 		}
+		dirty = (dirty + 1) % IPG_TFDLIST_LENGTH;
 	}
 
 	sp->tx_dirty += released;
-- 
1.5.3.3


^ permalink raw reply related

* Re: [PATCH] Add Linksys WCF11 to hostap driver
From: John W. Linville @ 2008-01-08 21:29 UTC (permalink / raw)
  To: Pavel Roskin; +Cc: Marcin Juszkiewicz, linux-wireless, Jouni Malinen, netdev
In-Reply-To: <20071230113931.d96ytsjusgos48oo@webmail.spamcop.net>

On Sun, Dec 30, 2007 at 11:39:31AM -0500, Pavel Roskin wrote:
> Quoting Marcin Juszkiewicz <openembedded@haerwu.biz>:
>
>> +       PCMCIA_DEVICE_PROD_ID1233(
>> +               "The Linksys Group, Inc.", "Wireless Network CF  Card", 
>> "ISL37300P",
>> +               0xa5f472c2, 0x9c05598d, 0xc9049a39),
>
> Acked-by: Pavel Roskin <proski@gnu.org>

The ID1234 version of this patch is already in Linus' tree.  Feel free
to submit a patch that redacts it to the ID123 form.

John
-- 
John W. Linville
linville@tuxdriver.com

^ permalink raw reply

* FW:  ccid2/ccid3 oopses
From: devzero @ 2008-01-08 22:06 UTC (permalink / raw)
  To: dccp; +Cc: netdev

Hello !

as suggested by Ian McDonald, i`m forwarding this to dccp and netdev mailing lists.


> hi !
>
> i know dccp_ccid2 and ccid3 modules are considered experimental, but i`m unsure if i probably triggered a bug inside or outside that modules here (i`m no kernel developer)
>
> apparently, i got crashes when loading/unloading other driver modules just after ccid2 or ccid3 had been loaded/unloaded _once_ (have not used them at all, just modprobe module;modprobe -r module)
>
> this was detected during some hardcore module load/unload testing session and apparently these modules seem to be the root cause of other modules crashing, so they seem to leave the system in an inconsistent state after load/unload.
>
> this can be reproduced with recent 2.6.24rc6 kernel which was mostly built with allmodconfig.
> i could not reproduce this with a more minimalistic configuration, e.g. the suse kernel of the day runs fine.
>
> the easiest way to reproduce is:
>
> while true;do modprobe dccp_ccid2/3;modprobe -r dccp_ccid2/3;done
> after short time, the kernel oopses (messages below)
>
> i`m not sure if this is worth to be filed at kernel bugzilla, so i`m contacting you personally first.
>
> i`d happily assist in helping debug this or provide more input (.config etc) if you want to take a look.
>
> regards
> Roland 
>
>
> [ 2322.177054] CCID: Unregistered CCID 2 (ccid2)
> [ 2322.377927] CCID: Registered CCID 2 (ccid2)
>
> [ 2322.413793] BUG: unable to handle kernel paging request at virtual address 40000864
> [ 2322.425066] printing eip: c01792e1 *pde = 00000000
> [ 2322.431523] Oops: 0000 [#1] SMP
> [ 2322.435249] Modules linked in: dccp_ccid2 dccp edd iptable_filter ip_tables ip6table_filter ip6_tables x_tables ipv6 microcode firmware_class fuse loop dm_mod ide_cd cdrom pata_acpi ata_piix ahci parport_pc floppy ata_generic parport pcnet32 rtc_cmos libata rtc_core rtc_lib mii pcspkr container thermal piix generic i2c_piix4 processor button ac i2c_core power_supply shpchp ide_core intel_agp pci_hotplug agpgart mousedev evdev sg ext3 jbd mbcache sd_mod mptspi mptscsih mptbase scsi_transport_spi ehci_hcd uhci_hcd scsi_mod usbcore
> [ 2322.489115]
> [ 2322.491535] Pid: 1730, comm: kjournald Not tainted (2.6.24-rc6 #4)
> [ 2322.497266] EIP: 0060:[<c01792e1>] EFLAGS: 00010002 CPU: 0
> [ 2322.503205] EIP is at kmem_cache_alloc+0x5d/0xa6
> [ 2322.508789] EAX: 00000000 EBX: 00000282 ECX: c03750a0 EDX: 40000864
> [ 2322.514864] ESI: c1408314 EDI: 40000864 EBP: c03750a0 ESP: df9cfe94
> [ 2322.521110]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
> [ 2322.527346] Process kjournald (pid: 1730, ti=df9ce000 task=deaf31a0 task.ti=df9ce000)
> [ 2322.535722] Stack: c016094d c1408314 40000864 00011200 df4032a0 df408e40 def45000 0000000f
> [ 2322.545350]        00011210 c016094d 00000010 e08cb15f 00000000 dead9c00 df161ab8 00000004
> [ 2322.556833]        00000000 def45000 0000000f 00000000 c019acdf 00000000 df402940 00000010
> [ 2322.565168] Call Trace:
> [ 2322.568637]  [<c016094d>] mempool_alloc+0x24/0xc2
> [ 2322.573169]  [<c016094d>] mempool_alloc+0x24/0xc2
> [ 2322.577175]  [<e08cb15f>] __journal_file_buffer+0x9b/0x11c [jbd]
> [ 2322.585033]  [<c019acdf>] bio_alloc_bioset+0x8c/0xe6
> [ 2322.589301]  [<c019ad44>] bio_alloc+0xb/0x17
> [ 2322.593309]  [<c0197688>] submit_bh+0x6e/0xf8
> [ 2322.597358]  [<e08ccdba>] journal_commit_transaction+0x6de/0xbe8 [jbd]
> [ 2322.605109]  [<c013095c>] lock_timer_base+0x19/0x35
> [ 2322.610478]  [<e08cf9e6>] kjournald+0xae/0x1dd [jbd]
> [ 2322.616182]  [<c0139985>] autoremove_wake_function+0x0/0x33
> [ 2322.621341]  [<e08cf938>] kjournald+0x0/0x1dd [jbd]
> [ 2322.628588]  [<c01398bc>] kthread+0x38/0x60
> [ 2322.633306]  [<c0139884>] kthread+0x0/0x60
> [ 2322.637365]  [<c0107beb>] kernel_thread_helper+0x7/0x10
> [ 2322.645002]  =======================
> [ 2322.649049] Code: 3e 85 ff 89 7c 24 08 75 1b 89 14 24 8b 54 24 0c 83 c9 ff 89 e8 89 74 24 04 e8 2b fb ff ff 89 44 24 08 eb 0c 8b 54 24 08 8b 46 0c <8b> 04 82 89 06 89 d8 50 9d 0f 1f 84 00 00 00 00 00 66 83 7c 24
> [ 2322.673340] EIP: [<c01792e1>] kmem_cache_alloc+0x5d/0xa6 SS:ESP 0068:df9cfe94
> [ 2322.681327] ---[ end trace 35dbcab07ee48cc5 ]---
> [ 2322.737700] ------------[ cut here ]------------
> [ 2322.748822] Kernel BUG at c0199e6d [verbose debug info unavailable]
> [ 2322.755960] invalid opcode: 0000 [#2] SMP
> [ 2322.760773] Modules linked in: dccp_ccid2 dccp edd iptable_filter ip_tables ip6table_filter ip6_tables x_tables ipv6 microcode firmware_class fuse loop dm_mod ide_cd cdrom pata_acpi ata_piix ahci parport_pc floppy ata_generic parport pcnet32 rtc_cmos libata rtc_core rtc_lib mii pcspkr container thermal piix generic i2c_piix4 processor button ac i2c_core power_supply shpchp ide_core intel_agp pci_hotplug agpgart mousedev evdev sg ext3 jbd mbcache sd_mod mptspi mptscsih mptbase scsi_transport_spi ehci_hcd uhci_hcd scsi_mod usbcore
> [ 2322.813338]
> [ 2322.817134] Pid: 3125, comm: klogd Tainted: G      D (2.6.24-rc6 #4)
> [ 2322.821416] EIP: 0060:[<c0199e6d>] EFLAGS: 00010246 CPU: 0
> [ 2322.828832] EIP is at end_buffer_async_write+0x6f/0xfd
> [ 2322.833341] EAX: 00000000 EBX: df1d2268 ECX: df1d2268 EDX: 00000001
> [ 2322.839963] ESI: def45080 EDI: df77c0c0 EBP: c13a9d40 ESP: dee9be6c
> [ 2322.845409]  DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
> [ 2322.851864] Process klogd (pid: 3125, ti=dee9a000 task=df474bc0 task.ti=dee9a000)
> [ 2322.859787] Stack: dfa61000 00000015 ffffffff e088db79 c0107a5c ffffffff 00000202 00000200
> [ 2322.868770]        e088db79 dfa61000 def45080 def45080 df77c0c0 00001000 c01994fd c01994dc
> [ 2322.877370]        c019a99d 00001000 c01d919a 00000000 dee9bedc c02d8c44 dee9bfa0 dee9bedc
> [ 2322.887755] Call Trace:
> [ 2322.889427]  [<e088db79>] mptscsih_io_done+0x0/0xa52 [mptscsih]
> [ 2322.896192]  [<c0107a5c>] apic_timer_interrupt+0x28/0x30
> [ 2322.901439]  [<e088db79>] mptscsih_io_done+0x0/0xa52 [mptscsih]
> [ 2322.909389]  [<c01994fd>] end_bio_bh_io_sync+0x21/0x29
> [ 2322.915672]  [<c01994dc>] end_bio_bh_io_sync+0x0/0x29
> [ 2322.921404]  [<c019a99d>] bio_endio+0x27/0x29
> [ 2322.928198]  [<c01d919a>] __end_that_request_first+0x192/0x33d
> [ 2322.933405]  [<e0816a93>] scsi_end_request+0x1a/0xa8 [scsi_mod]
> [ 2322.940634]  [<e081761b>] scsi_io_completion+0x14c/0x2fb [scsi_mod]
> [ 2322.947318]  [<c01db7e1>] blk_done_softirq+0x5b/0x67
> [ 2322.953414]  [<c012cfae>] __do_softirq+0x75/0xe1
> [ 2322.957435]  [<c012d05f>] do_softirq+0x45/0x53
> [ 2322.962434]  [<c012d2c3>] irq_exit+0x38/0x6b
> [ 2322.966576]  [<c0109843>] do_IRQ+0x5c/0x71
> [ 2322.971256]  [<c012d2de>] irq_exit+0x53/0x6b
> [ 2322.975864]  [<c011a12a>] smp_apic_timer_interrupt+0x71/0x7d
> [ 2322.981461]  [<c010799f>] common_interrupt+0x23/0x28
> [ 2322.989075]  =======================
> [ 2322.995502] Code: 24 16 7b 31 c0 e8 59 f4 f8 ff 8b 45 10 90 0f ba 68 3c 15 90 0f ba 2b 0b 90 0f ba 33 00 90 0f ba 6d 00 01 8b 45 00 f6 c4 08 75 04 <0f> 0b eb fe 8b 75 0c 9c 58 0f 1f 84 00 00 00 00 00 89 c7 fa 0f
> [ 2323.023538] EIP: [<c0199e6d>] end_buffer_async_write+0x6f/0xfd SS:ESP 0068:dee9be6c
> [ 2323.033481] Kernel panic - not syncing: Fatal exception in interrupt
>
>
>
>
> [  306.079477] CCID: Unregistered CCID 3 (ccid3)
> [  306.143890] BUG: unable to handle kernel paging request at virtual address 40001864
> [  306.152506] printing eip: c01792e1 *pde = 00000000
> [  306.156682] Oops: 0000 [#1] SMP
> [  306.160469] Modules linked in: dccp_tfrc_lib dccp edd iptable_filter ip_tables ip6table_filter ip6_tables x_tables ipv6 microcode firmware_class fuse loop dm_mod ide_cd cdrom pata_acpi ata_piix ahci ata_generic libata floppy parport_pc rtc_cmos parport pcnet32 rtc_core mii i2c_piix4 rtc_lib i2c_core pcspkr piix generic ac thermal container ide_core power_supply button shpchp intel_agp processor pci_hotplug agpgart mousedev evdev sg ext3 jbd mbcache sd_mod mptspi mptscsih mptbase scsi_transport_spi uhci_hcd ehci_hcd scsi_mod usbcore
> [  306.220412]
> [  306.222927] Pid: 136, comm: pdflush Not tainted (2.6.24-rc6 #4)
> [  306.228691] EIP: 0060:[<c01792e1>] EFLAGS: 00010002 CPU: 0
> [  306.238499] EIP is at kmem_cache_alloc+0x5d/0xa6
> [  306.242756] EAX: 00000000 EBX: 00000282 ECX: c03750a0 EDX: 40001864
> [  306.248712] ESI: c1408314 EDI: 40001864 EBP: c03750a0 ESP: dead3d54
> [  306.254538]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
> [  306.258526] Process pdflush (pid: 136, ti=dead2000 task=df49e5e0 task.ti=dead2000)
> [  306.264717] Stack: c016094d c1408314 40001864 00011200 de5fb000 df446080 de65e680 00000000
> [  306.276685]        00011210 c016094d 00000010 00000000 00000003 de6bc378 00000003 de6bcde0
> [  306.284594]        00000000 de65e680 00000000 00000000 c019acdf 00000000 df402a20 00000010
> [  306.296711] Call Trace:
> [  306.298976]  [<c016094d>] mempool_alloc+0x24/0xc2
> [  306.304602]  [<c016094d>] mempool_alloc+0x24/0xc2
> [  306.308722]  [<c019acdf>] bio_alloc_bioset+0x8c/0xe6
> [  306.314133]  [<c019ad44>] bio_alloc+0xb/0x17
> [  306.318609]  [<c0197688>] submit_bh+0x6e/0xf8
> [  306.324696]  [<c0199265>] __block_write_full_page+0x222/0x30f
> [  306.330100]  [<c019c810>] blkdev_get_block+0x0/0x43
> [  306.334949]  [<c0199420>] block_write_full_page+0xce/0xd6
> [  306.340733]  [<c019c810>] blkdev_get_block+0x0/0x43
> [  306.348460]  [<c0163588>] __writepage+0x8/0x21
> [  306.352736]  [<c0163a1e>] write_cache_pages+0x15b/0x273
> [  306.362425]  [<c0163580>] __writepage+0x0/0x21
> [  306.369968]  [<c0163b36>] generic_writepages+0x0/0x26
> [  306.375911]  [<c0163b55>] generic_writepages+0x1f/0x26
> [  306.380734]  [<c0163b7c>] do_writepages+0x20/0x30
> [  306.386999]  [<c019423b>] __writeback_single_inode+0x17c/0x2a0
> [  306.394198]  [<c012d2de>] irq_exit+0x53/0x6b
> [  306.398880]  [<c011a12a>] smp_apic_timer_interrupt+0x71/0x7d
> [  306.403016]  [<c0194650>] sync_sb_inodes+0x18a/0x240
> [  306.410354]  [<c01948a4>] writeback_inodes+0x5a/0x9c
> [  306.414853]  [<c01643d1>] wb_kupdate+0x7c/0xde
> [  306.419014]  [<c01648b8>] pdflush+0x130/0x1d0
> [  306.424730]  [<c0164355>] wb_kupdate+0x0/0xde
> [  306.430029]  [<c0164788>] pdflush+0x0/0x1d0
> [  306.435018]  [<c01398bc>] kthread+0x38/0x60
> [  306.439003]  [<c0139884>] kthread+0x0/0x60
> [  306.442884]  [<c0107beb>] kernel_thread_helper+0x7/0x10
> [  306.448467]  =======================
> [  306.451998] Code: 3e 85 ff 89 7c 24 08 75 1b 89 14 24 8b 54 24 0c 83 c9 ff 89 e8 89 74 24 04 e8 2b fb ff ff 89 44 24 08 eb 0c 8b 54 24 08 8b 46 0c <8b> 04 82 89 06 89 d8 50 9d 0f 1f 84 00 00 00 00 00 66 83 7c 24
> [  306.478944] EIP: [<c01792e1>] kmem_cache_alloc+0x5d/0xa6 SS:ESP 0068:dead3d54
> [  306.486157] ---[ end trace 0170fd34e372695a ]---
> [  306.511450] sd 0:0:0:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE,SUGGEST_OK
> [  306.532261] sd 0:0:0:0: [sda] Sense Key : Hardware Error [current]
> [  306.551315] sd 0:0:0:0: [sda] Add. Sense: Data phase error
> [  306.563451] end_request: I/O error, dev sda, sector 4437024
> [  306.575308] Buffer I/O error on device sda2, logical block 426108
> [  306.587177] lost page write due to I/O error on sda2
> [  306.596911] Buffer I/O error on device sda2, logical block 426109
> [  306.608804] lost page write due to I/O error on sda2
> [  306.617992] Buffer I/O error on device sda2, logical block 426110
> [  306.628005] lost page write due to I/O error on sda2
> [  306.636004] Buffer I/O error on device sda2, logical block 426111
> [  306.644813] lost page write due to I/O error on sda2
> [  306.652236] Buffer I/O error on device sda2, logical block 426112
> [  306.662203] lost page write due to I/O error on sda2
> [  306.671197] Buffer I/O error on device sda2, logical block 426113
> [  306.679141] lost page write due to I/O error on sda2
> [  306.699255] BUG: unable to handle kernel paging request at virtual address 100d4a84
> [  306.715348] printing eip: c0139945 *pde = 00000000
> [  306.724664] Oops: 0000 [#2] SMP
> [  306.730582] Modules linked in: dccp_tfrc_lib dccp edd iptable_filter ip_tables ip6table_filter ip6_tables x_tables ipv6 microcode firmware_class fuse loop dm_mod ide_cd cdrom pata_acpi ata_piix ahci ata_generic libata floppy parport_pc rtc_cmos parport pcnet32 rtc_core mii i2c_piix4 rtc_lib i2c_core pcspkr piix generic ac thermal container ide_core power_supply button shpchp intel_agp processor pci_hotplug agpgart mousedev evdev sg ext3 jbd mbcache sd_mod mptspi mptscsih mptbase scsi_transport_spi uhci_hcd ehci_hcd scsi_mod usbcore
> [  306.788046]
> [  306.788569] Pid: 136, comm: pdflush Tainted: G      D (2.6.24-rc6 #4)
> [  306.800851] EIP: 0060:[<c0139945>] EFLAGS: 00010296 CPU: 0
> [  306.806474] EIP is at __wake_up_bit+0x9/0x33
> [  306.814710] EAX: 100d4a84 EBX: 100d4a80 ECX: 0000000c EDX: c13670e0
> [  306.818605] ESI: df39a8f8 EDI: 00000202 EBP: c13670e0 ESP: dead3acc
> [  306.835065]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
> [  306.837951] Process pdflush (pid: 136, ti=dead2000 task=df49e5e0 task.ti=dead2000)
> [  306.844247] Stack: 00000202 c13670e0 c015e5c5 df39a8f8 c0199ee0 c0317b16 dead3ae8 32616473
> [  306.855168]        00000200 c0160924 00000000 df446000 de65ef80 df4e00c0 00004000 de65e200
> [  306.864865]        de65e200 df4e00c0 00003000 c01994fd c01994dc c019a99d 00001000 c01d919a
> [  306.874768] Call Trace:
> [  306.876862]  [<c015e5c5>] end_page_writeback+0x2f/0x3c
> [  306.883188]  [<c0199ee0>] end_buffer_async_write+0xe2/0xfd
> [  306.892703]  [<c0160924>] mempool_free+0x6a/0x6f
> [  306.896859]  [<c01994fd>] end_bio_bh_io_sync+0x21/0x29
> [  306.903132]  [<c01994dc>] end_bio_bh_io_sync+0x0/0x29
> [  306.908307]  [<c019a99d>] bio_endio+0x27/0x29
> [  306.912352]  [<c01d919a>] __end_that_request_first+0x192/0x33d
> [  306.919035]  [<e0816a93>] scsi_end_request+0x1a/0xa8 [scsi_mod]
> [  306.926526]  [<e08177c2>] scsi_io_completion+0x2f3/0x2fb [scsi_mod]
> [  306.932877]  [<c01db7e1>] blk_done_softirq+0x5b/0x67
> [  306.938996]  [<c012cfae>] __do_softirq+0x75/0xe1
> [  306.944407]  [<c012d05f>] do_softirq+0x45/0x53
> [  306.948536]  [<c012d2c3>] irq_exit+0x38/0x6b
> [  306.952574]  [<c011a12a>] smp_apic_timer_interrupt+0x71/0x7d
> [  306.958088]  [<c0107a5c>] apic_timer_interrupt+0x28/0x30
> [  306.963199]  [<c014ce77>] acct_collect+0x152/0x15b
> [  306.968109]  [<c012b710>] do_exit+0x1b9/0x68c
> [  306.972841]  [<c01292c0>] printk+0x1b/0x1f
> [  306.976869]  [<c0108417>] die+0x21d/0x224
> [  306.980899]  [<c0120397>] do_page_fault+0x4b6/0x593
> [  306.986648]  [<c01d9793>] generic_make_request+0x3be/0x3ec
> [  306.991209]  [<c01d9793>] generic_make_request+0x3be/0x3ec
> [  306.996429]  [<c011fee1>] do_page_fault+0x0/0x593
> [  307.000875]  [<c02c2c3a>] error_code+0x72/0x78
> [  307.004889]  [<c01792e1>] kmem_cache_alloc+0x5d/0xa6
> [  307.008678]  [<c016094d>] mempool_alloc+0x24/0xc2
> [  307.011091]  [<c016094d>] mempool_alloc+0x24/0xc2
> [  307.026957]  [<c019acdf>] bio_alloc_bioset+0x8c/0xe6
> [  307.032287]  [<c019ad44>] bio_alloc+0xb/0x17
> [  307.035254]  [<c0197688>] submit_bh+0x6e/0xf8
> [  307.040911]  [<c0199265>] __block_write_full_page+0x222/0x30f
> [  307.048908]  [<c019c810>] blkdev_get_block+0x0/0x43
> [  307.055251]  [<c0199420>] block_write_full_page+0xce/0xd6
> [  307.062257]  [<c019c810>] blkdev_get_block+0x0/0x43
> [  307.067258]  [<c0163588>] __writepage+0x8/0x21
> [  307.072534]  [<c0163a1e>] write_cache_pages+0x15b/0x273
> [  307.076626]  [<c0163580>] __writepage+0x0/0x21
> [  307.078707]  [<c0163b36>] generic_writepages+0x0/0x26
> [  307.084487]  [<c0163b55>] generic_writepages+0x1f/0x26
> [  307.091273]  [<c0163b7c>] do_writepages+0x20/0x30
> [  307.096249]  [<c019423b>] __writeback_single_inode+0x17c/0x2a0
> [  307.102496]  [<c012d2de>] irq_exit+0x53/0x6b
> [  307.107266]  [<c011a12a>] smp_apic_timer_interrupt+0x71/0x7d
> [  307.112929]  [<c0194650>] sync_sb_inodes+0x18a/0x240
> [  307.119285]  [<c01948a4>] writeback_inodes+0x5a/0x9c
> [  307.124927]  [<c01643d1>] wb_kupdate+0x7c/0xde
> [  307.132149]  [<c01648b8>] pdflush+0x130/0x1d0
> [  307.136540]  [<c0164355>] wb_kupdate+0x0/0xde
> [  307.140336]  [<c0164788>] pdflush+0x0/0x1d0
> [  307.144942]  [<c01398bc>] kthread+0x38/0x60
> [  307.150390]  [<c0139884>] kthread+0x0/0x60
> [  307.155285]  [<c0107beb>] kernel_thread_helper+0x7/0x10
> [  307.162728]  =======================
> [  307.164944] Code: c1 eb 1e 69 db 80 07 00 00 81 c3 80 49 35 c0 2b 8b 08 07 00 00 d3 e8 6b c0 0c 03 83 00 07 00 00 5b c3 53 89 c3 83 ec 0c 8d 40 04 <39> 43 04 89 54 24 04 89 4c 24 08 74 18 8d 44 24 04 b9 01 00 00
> [  307.188954] EIP: [<c0139945>] __wake_up_bit+0x9/0x33 SS:ESP 0068:dead3acc
> [  307.199560] Kernel panic - not syncing: Fatal exception in interrupt



_______________________________________________________________________
Jetzt neu! Schützen Sie Ihren PC mit McAfee und WEB.DE. 30 Tage
kostenlos testen. http://www.pc-sicherheit.web.de/startseite/?mc=022220


^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox