* "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
@ 2002-08-01 13:35 Jacek Konieczny
2002-08-01 17:43 ` kuznet
2002-08-02 23:54 ` "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Maksim (Max) Krasnyanskiy
0 siblings, 2 replies; 12+ messages in thread
From: Jacek Konieczny @ 2002-08-01 13:35 UTC (permalink / raw)
To: maxk, vtun; +Cc: netdev, underley, linux-kernel
I had a lot of problem with tun devices created with both openvpn and
vtund. When I wanted to shut down my system when the devices were in
use (eg. TCP connection established on tun0 interface), even if the
tunneling daemon was killed, it stopped while trying to deconfigure
network. And "unregister_netdevice: waiting for tun0 to become free"
message was displayed again and again. I tried to resolve this problem
using Google, but I have only found out, that this is behaviour of 2.4
kernels, and that it is proper. After further investigation, in kernel
sources, I found out, that there are "old style" and "new style" network
devices, and that only the "old style" devices have this problem.
I had similar problem with VLAN devices some time ago, so I checked VLAN
driver sources too. As I suspected, it was "new style" device now.
The patch below is my try to make tun device "new style" too. It seems
to work for me, but I am not sure if it is 100% proper. This is patch
against 2.4.18 sources.
Sorry, for spamming all those addresses, but I am not sure which one is
correct. Driver on URL given in MAINTAINERS file seems to be a bit
outdated.
Greets,
Jacek
--- linux/drivers/net/tun.c.orig Sun Sep 30 21:26:07 2001
+++ linux/drivers/net/tun.c Thu Aug 1 14:41:12 2002
@@ -20,6 +20,14 @@
* Modifications for 2.3.99-pre5 kernel.
*/
+/*
+ * 01.08.2002
+ * Jacek Konieczny <jajcus@pld.org.pl>
+ * Modifications for "new style" device allocation
+ * (fixes "wating for tunX to become free" problem)
+ */
+
+
#define TUN_VER "1.4"
#include <linux/config.h>
@@ -159,6 +167,17 @@
return 0;
}
+void tun_net_destruct(struct net_device *dev)
+{
+ if (dev) {
+ if (dev->priv) {
+ kfree(dev->priv);
+ dev->priv=NULL;
+ MOD_DEC_USE_COUNT;
+ }
+ }
+}
+
/* Character device part */
/* Poll */
@@ -204,14 +223,14 @@
skb_reserve(skb, 2);
copy_from_user(skb_put(skb, len), ptr, len);
- skb->dev = &tun->dev;
+ skb->dev = tun->dev;
switch (tun->flags & TUN_TYPE_MASK) {
case TUN_TUN_DEV:
skb->mac.raw = skb->data;
skb->protocol = pi.proto;
break;
case TUN_TAP_DEV:
- skb->protocol = eth_type_trans(skb, &tun->dev);
+ skb->protocol = eth_type_trans(skb, tun->dev);
break;
};
@@ -310,7 +329,7 @@
schedule();
continue;
}
- netif_start_queue(&tun->dev);
+ netif_start_queue(tun->dev);
if (!verify_area(VERIFY_WRITE, buf, count))
ret = tun_put_user(tun, skb, buf, count);
@@ -357,8 +376,6 @@
init_waitqueue_head(&tun->read_wait);
tun->owner = -1;
- tun->dev.init = tun_net_init;
- tun->dev.priv = tun;
err = -EINVAL;
@@ -377,17 +394,21 @@
if (*ifr->ifr_name)
name = ifr->ifr_name;
- if ((err = dev_alloc_name(&tun->dev, name)) < 0)
- goto failed;
- if ((err = register_netdevice(&tun->dev)))
- goto failed;
-
- MOD_INC_USE_COUNT;
+ dev = dev_alloc(name, &err);
+ if (!dev) goto failed;
+
+ tun->dev=dev;
+ dev->init = tun_net_init;
+ dev->priv = tun;
+ dev->destructor = tun_net_destruct;
+ dev->features |= NETIF_F_DYNALLOC;
+ tun->name = dev->name;
- tun->name = tun->dev.name;
- }
+ err=register_netdevice(dev);
+ if (err<0) goto failed;
- DBG(KERN_INFO "%s: tun_set_iff\n", tun->name);
+ MOD_INC_USE_COUNT;
+ }
if (ifr->ifr_flags & IFF_NO_PI)
tun->flags |= TUN_NO_PI;
@@ -402,6 +423,7 @@
return 0;
failed:
+ kfree(dev);
kfree(tun);
return err;
}
@@ -532,10 +554,8 @@
skb_queue_purge(&tun->readq);
if (!(tun->flags & TUN_PERSIST)) {
- dev_close(&tun->dev);
- unregister_netdevice(&tun->dev);
- kfree(tun);
- MOD_DEC_USE_COUNT;
+ dev_close(tun->dev);
+ unregister_netdevice(tun->dev);
}
rtnl_unlock();
--- linux/include/linux/if_tun.h.orig Tue Jun 12 04:15:27 2001
+++ linux/include/linux/if_tun.h Thu Aug 1 14:33:40 2002
@@ -40,7 +40,7 @@
wait_queue_head_t read_wait;
struct sk_buff_head readq;
- struct net_device dev;
+ struct net_device *dev;
struct net_device_stats stats;
struct fasync_struct *fasync;
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
2002-08-01 13:35 "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Jacek Konieczny
@ 2002-08-01 17:43 ` kuznet
2002-08-01 17:52 ` Jacek Konieczny
2002-08-02 23:54 ` "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Maksim (Max) Krasnyanskiy
1 sibling, 1 reply; 12+ messages in thread
From: kuznet @ 2002-08-01 17:43 UTC (permalink / raw)
To: jajcus; +Cc: netdev
Hello!
> network. And "unregister_netdevice: waiting for tun0 to become free"
This smells like a leakage. I think this should be investigated.
> devices, and that only the "old style" devices have this problem.
> I had similar problem with VLAN devices some time ago, so I checked VLAN
> driver sources too.
Well, switching to "new style" does not solve the problem. If we have
a leakage, it will continue silently which is even worse.
Probably, you should to define NET_REFCNT_DEBUG in net/core/dev.c
to track what happens with the device.
Alexey
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
2002-08-01 17:43 ` kuznet
@ 2002-08-01 17:52 ` Jacek Konieczny
2002-08-01 18:01 ` kuznet
2002-08-02 0:27 ` two net_device ? ??
0 siblings, 2 replies; 12+ messages in thread
From: Jacek Konieczny @ 2002-08-01 17:52 UTC (permalink / raw)
To: kuznet; +Cc: netdev
On Thu, Aug 01, 2002 at 09:43:23PM +0400, kuznet@ms2.inr.ac.ru wrote:
> Hello!
>
> > network. And "unregister_netdevice: waiting for tun0 to become free"
>
> This smells like a leakage. I think this should be investigated.
I am not sure. Sometimes it is not easy to free such device.
> > devices, and that only the "old style" devices have this problem.
> > I had similar problem with VLAN devices some time ago, so I checked VLAN
> > driver sources too.
>
> Well, switching to "new style" does not solve the problem. If we have
> a leakage, it will continue silently which is even worse.
> Probably, you should to define NET_REFCNT_DEBUG in net/core/dev.c
> to track what happens with the device.
After applying my patch, the device unregistration is usually defered,
but finally it is finished. On system shutdown, when all routes are
removed, all interfaces downed and all processes killed the device will
not be used any more and the device is freed. Without the patch my
system doesn't even come to this point, as it stops on the first process
which tries to access any network device (eg. any iproute2 command).
Usually it stops on postfix shutdown. Probably because I use the tun
device for tunneling SMTP connections to my home machine. Probably
shutting down postfix before openvpn would help, but failing to do this
should not hang the system.
And even if there is a bug in tun module it should never prevent system
from clean shutdown. Even if the device will be never freed and module
unloaded. So I thing this patch (or similar) should be applied.
Greets,
Jacek
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
2002-08-01 17:52 ` Jacek Konieczny
@ 2002-08-01 18:01 ` kuznet
2002-08-02 0:27 ` two net_device ? ??
1 sibling, 0 replies; 12+ messages in thread
From: kuznet @ 2002-08-01 18:01 UTC (permalink / raw)
To: Jacek Konieczny; +Cc: netdev
Hello!
> but finally it is finished. On system shutdown, when all routes are
> removed, all interfaces downed and all processes killed the device will
> not be used any more and the device is freed.
I do not understand this. It is leak and we have to find who continues
to use the device.
> And even if there is a bug
Nope. The bug is the first, the cleanup is the second.
Alexey
^ permalink raw reply [flat|nested] 12+ messages in thread
* two net_device ?
2002-08-01 17:52 ` Jacek Konieczny
2002-08-01 18:01 ` kuznet
@ 2002-08-02 0:27 ` ??
1 sibling, 0 replies; 12+ messages in thread
From: ?? @ 2002-08-02 0:27 UTC (permalink / raw)
To: netdev
Hi, there.
I implemented 32 pseudo interface(eth1 ~ eth32) using a module.
When I up the interfaces using "ifconfig eth1 xx.xx.xx.xx" command,
there are two "eth1" interface. Before I up the interfaces, there is a "eth1" interface.
I can't find what thing goes wrong.
For test, I made just 2 pseudo interface using same mechanizm. then
above problem doesn't occur.
any suggestion, thanks..
I use 2.4.17 kernel.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
2002-08-01 13:35 "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Jacek Konieczny
2002-08-01 17:43 ` kuznet
@ 2002-08-02 23:54 ` Maksim (Max) Krasnyanskiy
[not found] ` <20020803140858.GA5314@nic.nigdzie>
1 sibling, 1 reply; 12+ messages in thread
From: Maksim (Max) Krasnyanskiy @ 2002-08-02 23:54 UTC (permalink / raw)
To: jajcus; +Cc: linux-kernel
Hi Jacek,
>I had a lot of problem with tun devices created with both openvpn and
>vtund. When I wanted to shut down my system when the devices were in
>use (eg. TCP connection established on tun0 interface), even if the
>tunneling daemon was killed, it stopped while trying to deconfigure
>network. And "unregister_netdevice: waiting for tun0 to become free"
>message was displayed again and again. I tried to resolve this problem
>using Google, but I have only found out, that this is behaviour of 2.4
>kernels, and that it is proper. After further investigation, in kernel
>sources, I found out, that there are "old style" and "new style" network
>devices, and that only the "old style" devices have this problem.
>I had similar problem with VLAN devices some time ago, so I checked VLAN
>driver sources too. As I suspected, it was "new style" device now.
>The patch below is my try to make tun device "new style" too. It seems
>to work for me, but I am not sure if it is 100% proper. This is patch
>against 2.4.18 sources.
You're fixing the wrong problem. It seems that some subsystem is not releasing
tun device during shutdown/deregistration. (See comment in
net/core/dev.c:unregister_netdev).
You're not gonna see "waiting for" warning anymore if you change to new
style allocation.
But you're gonna leak tun devices because destructor is not called unless
refcount is zero.
>Sorry, for spamming all those addresses, but I am not sure which one is
>correct. Driver on URL given in MAINTAINERS file seems to be a bit
>outdated.
URL is ok. Mailing list has to be update though.
Max
^ permalink raw reply [flat|nested] 12+ messages in thread
* "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
@ 2002-08-01 13:35 Jacek Konieczny
0 siblings, 0 replies; 12+ messages in thread
From: Jacek Konieczny @ 2002-08-01 13:35 UTC (permalink / raw)
To: maxk, vtun; +Cc: netdev, underley, linux-kernel
I had a lot of problem with tun devices created with both openvpn and
vtund. When I wanted to shut down my system when the devices were in
use (eg. TCP connection established on tun0 interface), even if the
tunneling daemon was killed, it stopped while trying to deconfigure
network. And "unregister_netdevice: waiting for tun0 to become free"
message was displayed again and again. I tried to resolve this problem
using Google, but I have only found out, that this is behaviour of 2.4
kernels, and that it is proper. After further investigation, in kernel
sources, I found out, that there are "old style" and "new style" network
devices, and that only the "old style" devices have this problem.
I had similar problem with VLAN devices some time ago, so I checked VLAN
driver sources too. As I suspected, it was "new style" device now.
The patch below is my try to make tun device "new style" too. It seems
to work for me, but I am not sure if it is 100% proper. This is patch
against 2.4.18 sources.
Sorry, for spamming all those addresses, but I am not sure which one is
correct. Driver on URL given in MAINTAINERS file seems to be a bit
outdated.
Greets,
Jacek
--- linux/drivers/net/tun.c.orig Sun Sep 30 21:26:07 2001
+++ linux/drivers/net/tun.c Thu Aug 1 14:41:12 2002
@@ -20,6 +20,14 @@
* Modifications for 2.3.99-pre5 kernel.
*/
+/*
+ * 01.08.2002
+ * Jacek Konieczny <jajcus@pld.org.pl>
+ * Modifications for "new style" device allocation
+ * (fixes "wating for tunX to become free" problem)
+ */
+
+
#define TUN_VER "1.4"
#include <linux/config.h>
@@ -159,6 +167,17 @@
return 0;
}
+void tun_net_destruct(struct net_device *dev)
+{
+ if (dev) {
+ if (dev->priv) {
+ kfree(dev->priv);
+ dev->priv=NULL;
+ MOD_DEC_USE_COUNT;
+ }
+ }
+}
+
/* Character device part */
/* Poll */
@@ -204,14 +223,14 @@
skb_reserve(skb, 2);
copy_from_user(skb_put(skb, len), ptr, len);
- skb->dev = &tun->dev;
+ skb->dev = tun->dev;
switch (tun->flags & TUN_TYPE_MASK) {
case TUN_TUN_DEV:
skb->mac.raw = skb->data;
skb->protocol = pi.proto;
break;
case TUN_TAP_DEV:
- skb->protocol = eth_type_trans(skb, &tun->dev);
+ skb->protocol = eth_type_trans(skb, tun->dev);
break;
};
@@ -310,7 +329,7 @@
schedule();
continue;
}
- netif_start_queue(&tun->dev);
+ netif_start_queue(tun->dev);
if (!verify_area(VERIFY_WRITE, buf, count))
ret = tun_put_user(tun, skb, buf, count);
@@ -357,8 +376,6 @@
init_waitqueue_head(&tun->read_wait);
tun->owner = -1;
- tun->dev.init = tun_net_init;
- tun->dev.priv = tun;
err = -EINVAL;
@@ -377,17 +394,21 @@
if (*ifr->ifr_name)
name = ifr->ifr_name;
- if ((err = dev_alloc_name(&tun->dev, name)) < 0)
- goto failed;
- if ((err = register_netdevice(&tun->dev)))
- goto failed;
-
- MOD_INC_USE_COUNT;
+ dev = dev_alloc(name, &err);
+ if (!dev) goto failed;
+
+ tun->dev=dev;
+ dev->init = tun_net_init;
+ dev->priv = tun;
+ dev->destructor = tun_net_destruct;
+ dev->features |= NETIF_F_DYNALLOC;
+ tun->name = dev->name;
- tun->name = tun->dev.name;
- }
+ err=register_netdevice(dev);
+ if (err<0) goto failed;
- DBG(KERN_INFO "%s: tun_set_iff\n", tun->name);
+ MOD_INC_USE_COUNT;
+ }
if (ifr->ifr_flags & IFF_NO_PI)
tun->flags |= TUN_NO_PI;
@@ -402,6 +423,7 @@
return 0;
failed:
+ kfree(dev);
kfree(tun);
return err;
}
@@ -532,10 +554,8 @@
skb_queue_purge(&tun->readq);
if (!(tun->flags & TUN_PERSIST)) {
- dev_close(&tun->dev);
- unregister_netdevice(&tun->dev);
- kfree(tun);
- MOD_DEC_USE_COUNT;
+ dev_close(tun->dev);
+ unregister_netdevice(tun->dev);
}
rtnl_unlock();
--- linux/include/linux/if_tun.h.orig Tue Jun 12 04:15:27 2001
+++ linux/include/linux/if_tun.h Thu Aug 1 14:33:40 2002
@@ -40,7 +40,7 @@
wait_queue_head_t read_wait;
struct sk_buff_head readq;
- struct net_device dev;
+ struct net_device *dev;
struct net_device_stats stats;
struct fasync_struct *fasync;
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: "new style" netdevice allocation patch for TUN driver (2.4.18 kernel)
@ 2002-08-07 3:10 Julian Anastasov
0 siblings, 0 replies; 12+ messages in thread
From: Julian Anastasov @ 2002-08-07 3:10 UTC (permalink / raw)
To: Jacek Konieczny; +Cc: linux-kernel, Alexey Kuznetsov
Hello,
Jacek Konieczny wrote:
> I had a lot of problem with tun devices created with both openvpn and
> vtund. When I wanted to shut down my system when the devices were in
> use (eg. TCP connection established on tun0 interface), even if the
> tunneling daemon was killed, it stopped while trying to deconfigure
> network. And "unregister_netdevice: waiting for tun0 to become free"
> message was displayed again and again. I tried to resolve this problem
> using Google, but I have only found out, that this is behaviour of 2.4
> kernels, and that it is proper
...
> This is patch against 2.4.18 sources.
Don't waste time, now when 2.4.19 is out can you try with it? It
has fix for such problem if you have multipath routes with such devices,
Alexey already forgot about it :) As for tun in kernel it looks correct,
unregister_netdevice() under rtnl_lock, only that dev_close is redundant.
Regards
--
Julian Anastasov <ja@ssi.bg>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2002-08-07 0:06 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-08-01 13:35 "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Jacek Konieczny
2002-08-01 17:43 ` kuznet
2002-08-01 17:52 ` Jacek Konieczny
2002-08-01 18:01 ` kuznet
2002-08-02 0:27 ` two net_device ? ??
2002-08-02 23:54 ` "new style" netdevice allocation patch for TUN driver (2.4.18 kernel) Maksim (Max) Krasnyanskiy
[not found] ` <20020803140858.GA5314@nic.nigdzie>
2002-08-06 17:07 ` Maksim (Max) Krasnyanskiy
2002-08-06 17:07 ` David S. Miller
2002-08-06 20:03 ` Maksim (Max) Krasnyanskiy
2002-08-06 17:29 ` Jacek Konieczny
-- strict thread matches above, loose matches on Subject: below --
2002-08-01 13:35 Jacek Konieczny
2002-08-07 3:10 Julian Anastasov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.