Netdev List
 help / color / mirror / Atom feed
* [DSCAPE] rate_control needs some form of reference counting
@ 2006-07-29 21:56 Karol Lewandowski
  2006-08-01 14:10 ` Jiri Benc
  0 siblings, 1 reply; 4+ messages in thread
From: Karol Lewandowski @ 2006-07-29 21:56 UTC (permalink / raw)
  To: netdev

Hi,

I'm getting reproductible oops when removing rt2500pci module
(which uses devicescape ieee802.11 stack):


  # modprobe rt2500pci

Loading module: rt2500pci - CVS (N/A) by http://rt2x00.serialmonkey.com.
ACPI: PCI Interrupt 0000:03:00.0[A] -> GSI 21 (level, low) -> IRQ 18
wmaster0: Failed to select rate control algorithm
wmaster0: Failed to initialize rate control algorithm

  # lsmod
Module                  Size  Used by
rt2500pci              29316  0 
80211                 137096  1 rt2500pci
ipv6                  206752  12 

  Note that rate_control isn't loaded.

  # rmmod rt2500pci

Unloading module: rt2500pci - CVS (N/A) by http://rt2x00.serialmonkey.com.
------------[ cut here ]------------
kernel BUG at :46863!
invalid opcode: 0000 [#1]
SMP 
Modules linked in: rt2500pci 80211 ipv6
CPU:    1
EIP:    0060:[netdev_release+15/30]    Not tainted VLI
EFLAGS: 00010297   (2.6.17-riddly7.0 #1) 
EIP is at netdev_release+0xf/0x1e
eax: d600c2e8   ebx: d600c2e8   ecx: c01ffb73   edx: d600c000
esi: c030b5c0   edi: d600c2f0   ebp: c030b5dc   esp: d4e37ea8
ds: 007b   es: 007b   ss: 0068
Process rmmod (pid: 2306, threadinfo=d4e37000 task=c14f95b0)
Stack: c01ffb3b d600c2f0 c03031f0 c0303220 c01b3139 d600c308 c01b3159 d600c000 
       c149f048 c01b377e d600c58c c01b3159 c01b377e d600c574 d600c400 c01b30de 
       d600c2f0 e08e3f4f d600c400 d600c000 e08e3090 d67f9000 d67f989c e08d9e29 
Call Trace:
 <c01ffb3b> class_dev_release+0x2f/0x67  <c01b3139> kobject_cleanup+0x40/0x60
 <c01b3159> kobject_release+0x0/0x8  <c01b377e> kref_put+0x63/0x6d
 <c01b3159> kobject_release+0x0/0x8  <c01b377e> kref_put+0x63/0x6d
 <c01b30de> kobject_unregister+0x14/0x1c  <e08e3f4f> ieee80211_sysfs_remove_netdevice+0x17/0x2e [80211]
 <e08e3090> __ieee80211_if_del+0x2c/0x35 [80211]  <e08d9e29> ieee80211_unregister_hw+0xa3/0x147 [80211]
 <e0875330> rt2500pci_remove+0x32/0x55 [rt2500pci]  <c01bcfbf> pci_device_remove+0x16/0x28
 <c01ff4ad> __device_release_driver+0x5a/0x72  <c01ff549> driver_detach+0x5e/0x8b
 <c01fef49> bus_remove_driver+0x27/0x41  <c01ff801> driver_unregister+0xb/0x13
 <c01bd13b> pci_unregister_driver+0xb/0x13  <c012b11c> sys_delete_module+0x10d/0x132
 <c013cef5> do_munmap+0xda/0xe7  <c010254f> sysenter_past_esp+0x54/0x75
Code: 01 00 00 00 39 f8 7c 07 b8 f4 ff ff ff eb 09 c7 46 04 00 00 00 00 31 c0 5b 5e 5f c3 8d 90 18 fd ff ff 83 ba 94 02 00 00 04 74 02 <0f> 0b 0f b7 42 64 29 c2 89 d0 e9 c1 4a ef ff 05 e8 02 00 00 e9 
EIP: [netdev_release+15/30] netdev_release+0xf/0x1e SS:ESP 0068:d4e37ea8


Loading rate_control before rt2500 pci "fixes" the problem.

It isn't real fix but just hack -- driver uses rate_control module
(indirectly via dscape) but I can unload it (rate_control) while it's
running.

I'm _guessing_ that rate_control needs its own set of kobjects and do
some kobject_put/kobject_get in appropriate places...

thanks
-- 
This signature intentionally says nothing.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [DSCAPE] rate_control needs some form of reference counting
  2006-07-29 21:56 [DSCAPE] rate_control needs some form of reference counting Karol Lewandowski
@ 2006-08-01 14:10 ` Jiri Benc
  2006-08-01 15:16   ` Karol Lewandowski
  0 siblings, 1 reply; 4+ messages in thread
From: Jiri Benc @ 2006-08-01 14:10 UTC (permalink / raw)
  To: Karol Lewandowski; +Cc: netdev

On Sat, 29 Jul 2006 23:56:45 +0200, Karol Lewandowski wrote:
> I'm getting reproductible oops when removing rt2500pci module
> (which uses devicescape ieee802.11 stack):

Thanks for the report and nice description how to reproduce the problem.

The fix is not easy. In fact, it's as hard as to fix it by implementing
a feature that allows to use different rate control algorithm for each
device. Given the fact the problem doesn't occur in normal conditions,
it's a low priority for me (unless there is a volunteer to fix it). It
needs to be fixed before d80211 is merged, though (sigh).

>   # modprobe rt2500pci
> 
> Loading module: rt2500pci - CVS (N/A) by http://rt2x00.serialmonkey.com.
> ACPI: PCI Interrupt 0000:03:00.0[A] -> GSI 21 (level, low) -> IRQ 18
> wmaster0: Failed to select rate control algorithm
> wmaster0: Failed to initialize rate control algorithm

I suppose you don't have automatic loading of modules enabled, right?

Thanks,

 Jiri

-- 
Jiri Benc
SUSE Labs

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [DSCAPE] rate_control needs some form of reference counting
  2006-08-01 14:10 ` Jiri Benc
@ 2006-08-01 15:16   ` Karol Lewandowski
  2006-08-01 16:04     ` Jiri Benc
  0 siblings, 1 reply; 4+ messages in thread
From: Karol Lewandowski @ 2006-08-01 15:16 UTC (permalink / raw)
  To: Jiri Benc; +Cc: netdev

On Tue, Aug 01, 2006 at 04:10:23PM +0200, Jiri Benc wrote:
> On Sat, 29 Jul 2006 23:56:45 +0200, Karol Lewandowski wrote:

> The fix is not easy. In fact, it's as hard as to fix it by implementing
> a feature that allows to use different rate control algorithm for each
> device. Given the fact the problem doesn't occur in normal conditions,
> it's a low priority for me (unless there is a volunteer to fix it). It
> needs to be fixed before d80211 is merged, though (sigh).

I volunteer to provide this simple fix:

--- ieee80211.c.orig	2006-08-01 16:24:41.000000000 +0200
+++ ieee80211.c	2006-08-01 16:53:01.000000000 +0200
@@ -4462,7 +4462,8 @@
 	if (result < 0)
 		goto fail_if_sysfs;
 
-	if (rate_control_initialize(local) < 0) {
+	result = rate_control_initialize(local);
+	if (result < 0) {
 		printk(KERN_DEBUG "%s: Failed to initialize rate control "
 		       "algorithm\n", dev->name);
 		goto fail_rate;


Without that ieee80211_register_hw was returning value from previous
check:

>>>	result = ieee80211_sysfs_add_netdevice(dev);
	rtnl_unlock();
	if (result < 0)
		goto fail_if_sysfs;

	if (rate_control_initialize(local) < 0) {
		printk(KERN_DEBUG "%s: Failed to initialize rate control "
		       "algorithm\n", dev->name);
		goto fail_rate;
	}


This fixes that oops.  Problem remains, though.  I suppose that oops
would happen anyway if someone would do:

  # modprobe rate_control   # loads 80211
  # modprobe rt2500pci

(Driver needs to initialize cleanly here, mine has some (different)
problem so I'm just guessing here...)

 # rmmod rate_control

<oops here>, I think.
 

> I suppose you don't have automatic loading of modules enabled, right?

Yes, I've disabled it.

-- 
This signature intentionally says nothing.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [DSCAPE] rate_control needs some form of reference counting
  2006-08-01 15:16   ` Karol Lewandowski
@ 2006-08-01 16:04     ` Jiri Benc
  0 siblings, 0 replies; 4+ messages in thread
From: Jiri Benc @ 2006-08-01 16:04 UTC (permalink / raw)
  To: Karol Lewandowski; +Cc: netdev

On Tue, 1 Aug 2006 17:16:32 +0200, Karol Lewandowski wrote:
> Without that ieee80211_register_hw was returning value from previous
> check:

I missed that. Thanks for spotting this.

> This fixes that oops.  Problem remains, though.  I suppose that oops
> would happen anyway if someone would do:
> 
>   # modprobe rate_control   # loads 80211
>   # modprobe rt2500pci
> 
> (Driver needs to initialize cleanly here, mine has some (different)
> problem so I'm just guessing here...)
> 
>  # rmmod rate_control
> 
> <oops here>, I think.

This is the reason I wrote it's not easy to fix.

But your patch is correct and will be applied, thanks.

 Jiri

-- 
Jiri Benc
SUSE Labs

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-08-01 16:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-29 21:56 [DSCAPE] rate_control needs some form of reference counting Karol Lewandowski
2006-08-01 14:10 ` Jiri Benc
2006-08-01 15:16   ` Karol Lewandowski
2006-08-01 16:04     ` Jiri Benc

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