Thread (7 messages) 7 messages, 3 authors, 2004-06-01

Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown

From: Herbert Xu <herbert@gondor.apana.org.au>
Date: 2004-05-29 12:00:52

Herbert Xu [off-list ref] wrote:
OK, I've had a look and it looks like the free_netdev call in
ppp_shutdown_inteface is the problem.  What's happening is that
the todo list is being processed either on another CPU or by
preemption in another context.  As a result when the subsequent
free_netdev is called the device hasn't yet been processed and
is still in state UNREGISTERING.

Why do we need to call free_netdev after unregistering the netdev
from the drivers at all? What's wrong with calling it from run_todo
itself?
Well I guess someone might want to reregister the net device :)

Here is a minimal fix for this problem.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} [off-list ref]
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
===== net/core/dev.c 1.141 vs edited =====
--- 1.141/net/core/dev.c	2004-05-23 06:45:55 +10:00
+++ edited/net/core/dev.c	2004-05-29 21:56:18 +10:00
@@ -2999,7 +2999,6 @@
 
 		case NETREG_UNREGISTERING:
 			netdev_unregister_sysfs(dev);
-			dev->reg_state = NETREG_UNREGISTERED;
 
 			netdev_wait_allrefs(dev);
 
@@ -3015,6 +3014,7 @@
 			 */
 			if (dev->destructor)
 				dev->destructor(dev);
+			class_device_put(&dev->class_dev);
 			break;
 
 		default:
@@ -3140,6 +3140,8 @@
 	free_divert_blk(dev);
 
 	/* Finish processing unregister after unlock */
+	dev->reg_state = NETREG_UNREGISTERED;
+	class_device_get(&dev->class_dev);
 	net_set_todo(dev);
 
 	dev_put(dev);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help