Skip to contentSkip to conversation

fix rmmod sbp2 hang in 2.6.7

PATCH In review Hugang 4 participants 8 messages Jul 14, 2004 – Jul 17, 2004 Driver core

lore
Share & tools
lore
author
#1 lore raw

On Wed, 14 Jul 2004 11:48:54 +0800
Hugang <[email protected]> wrote:

| Hi:
| 
|  http://sourceforge.net/mailarchive/forum.php?thread_id=5036991&forum_id=5389
| 
| * modified files
| 
| --- orig/drivers/base/driver.c
| +++ mod/drivers/base/driver.c
| @@ -106,8 +106,8 @@
|  
|  void driver_unregister(struct device_driver * drv)
|  {
| -	bus_remove_driver(drv);
|  	down(&drv->unload_sem);
| +	bus_remove_driver(drv);
|  	up(&drv->unload_sem);
|  }
|  

Sorry, the above patch, can't fix rmmod sbp2 complete,I still got hang when rmmod sbp2 in my PowerBook G4 sometimes.

Signature · 3 lines
Hu Gang / Steve
Linux Registered User 204016
GPG Public Key: http://soulinfo.com/~hugang/hugang.asc
author
#2 lore raw

On Wed, 14 Jul 2004 16:13:57 +0800
Hugang <[email protected]> wrote:

| On Wed, 14 Jul 2004 11:48:54 +0800
| Hugang <[email protected]> wrote:
| 
....
| Sorry, the above patch, can't fix rmmod sbp2 complete,I still got hang when
| rmmod sbp2 in my PowerBook G4 sometimes.
| 

This new patch can complete fix the bug. That's really hack. Any comment are welcome.

drivers/base/driver.c +2 -2
@@ -107,8 +107,8 @@
 void driver_unregister(struct device_driver * drv)
 {
        bus_remove_driver(drv);
-       down(&drv->unload_sem);
-       up(&drv->unload_sem);
+       //down(&drv->unload_sem);
+       //up(&drv->unload_sem);
 }
 
 
Signature · 3 lines
Hu Gang / Steve
Linux Registered User 204016
GPG Public Key: http://soulinfo.com/~hugang/hugang.asc
#3 lore raw
Quoted 10 lines · Hugang

On Wed, 14 Jul 2004 16:13:57 +0800
Hugang <[email protected]> wrote:

| On Wed, 14 Jul 2004 11:48:54 +0800
| Hugang <[email protected]> wrote:
| 
....
| Sorry, the above patch, can't fix rmmod sbp2 complete,I still got hang when
| rmmod sbp2 in my PowerBook G4 sometimes.
| 
Quoted 2 lines

This new patch can complete fix the bug. That's really hack. Any comment are welcome.

This down+up prevents drivers from being unloaded until there are no references to their struct device_driver. By removing this, you open the very real possibility for an oops to occur.

If you're waiting inside that function for the last reference to be dropped, the real question is why you still have references to it.

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
author
#4 lore raw

On Wed, 14 Jul 2004 10:24:17 +0100
Russell King <[email protected]> wrote:

| This down+up prevents drivers from being unloaded until there are no
| references to their struct device_driver.  By removing this, you open
| the very real possibility for an oops to occur.

Yes, I agree with you. When sbp2 is using the module count is not zero, so I can rmmod it, So I think, for sbp2 that's safe, That's true on my laptop.

| 
| If you're waiting inside that function for the last reference to be
| dropped, the real question is why you still have references to it.

There are tree places that reference ->unload_sem in linux kernel tree, but I don't known, why the same code in 2.6.4 can works fine. :)

bus.c:68:       up(&drv->unload_sem);
driver.c:110:   down(&drv->unload_sem);
driver.c:111:   up(&drv->unload_sem);
Signature · 3 lines
Hu Gang / Steve
Linux Registered User 204016
GPG Public Key: http://soulinfo.com/~hugang/hugang.asc
#5 lore raw
Quoted 8 lines · Hugang

On Wed, 14 Jul 2004 10:24:17 +0100
Russell King <[email protected]> wrote:

| This down+up prevents drivers from being unloaded until there are no
| references to their struct device_driver.  By removing this, you open
| the very real possibility for an oops to occur.

Yes, I agree with you. When sbp2 is using the module count is not zero, so I can rmmod it, So I think, for sbp2 that's safe, That's true on my laptop.

The module count does not cover all cases, especially the case which this semaphore protects against.

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#6 lore raw
In reply to Russell King
Quoted 14 lines · Russell King
Quoted 10 lines · Hugang

On Wed, 14 Jul 2004 16:13:57 +0800
Hugang <[email protected]> wrote:

| On Wed, 14 Jul 2004 11:48:54 +0800
| Hugang <[email protected]> wrote:
| 
....
| Sorry, the above patch, can't fix rmmod sbp2 complete,I still got hang when
| rmmod sbp2 in my PowerBook G4 sometimes.
| 
Quoted 2 lines

This new patch can complete fix the bug. That's really hack. Any comment are welcome.

Quoted 6 lines

This down+up prevents drivers from being unloaded until there are no references to their struct device_driver. By removing this, you open the very real possibility for an oops to occur.

If you're waiting inside that function for the last reference to be dropped, the real question is why you still have references to it.

Seems like every 2 months or so I have to revisit the sbp2 module to see where the scsi layer has changed (or the driver model) so that I can get all the reference counting to equal out properly. Guess it's been two months again :)

Signature · 4 lines
Debian     - http://www.debian.org/
Linux 1394 - http://www.linux1394.org/
Subversion - http://subversion.tigris.org/
WatchGuard - http://www.watchguard.com/
#7 lore raw

Here's a wild guess. Is the 'sg' driver loaded. This sounds similar to my complaint with trying to rmmod 'st'. When I load my SCSI HBA driver, it automagically pulls in st for my tape drive *and* sg. Now, if you try to remove it, it "hangs". It's because sg also got a reference. If you rmmod 'sg' then the rmmod of st frees up too.

The problem above is that st has module use count of 0, but that's a lie. sg has glommed on that device, and the true reference count is actually one (if you consider that st owns the tape device). It seems to me that what should happen is for the SCSI layer/drivers to handle kicking sg out when they want to unload. If the consensus is that this is desirable, I'm happy to go off and see what needs to be done. Otherwise, I'll crawl back into my hole :-)

Tim

Quoted 26 lines · Ben Collins
Quoted 14 lines · Russell King
Quoted 10 lines · Hugang

On Wed, 14 Jul 2004 16:13:57 +0800
Hugang <[email protected]> wrote:

| On Wed, 14 Jul 2004 11:48:54 +0800
| Hugang <[email protected]> wrote:
| 
....
| Sorry, the above patch, can't fix rmmod sbp2 complete,I still got hang when
| rmmod sbp2 in my PowerBook G4 sometimes.
| 
Quoted 2 lines

This new patch can complete fix the bug. That's really hack. Any comment are welcome.

Quoted 6 lines

This down+up prevents drivers from being unloaded until there are no references to their struct device_driver. By removing this, you open the very real possibility for an oops to occur.

If you're waiting inside that function for the last reference to be dropped, the real question is why you still have references to it.

Seems like every 2 months or so I have to revisit the sbp2 module to see where the scsi layer has changed (or the driver model) so that I can get all the reference counting to equal out properly. Guess it's been two months again :)

Signature · 2 lines
Tim Wright <[email protected]>
Splhi