From: Robert H. <rob...@sk...> - 2006-01-28 23:09:11
|
Hi all, Sometimes following error occurs in an UML when enabling the ethernet device: uml:~ # ifconfig eth0 up SIOCSIFFLAGS: Device or resource busy This happens when logging in to the uml via a telnet port. The problem is that in this case the /dev/net/tun device remains attached to 3 proceses on the host: host:~ # lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME in.telnet 7971 hillenr 24u CHR 10,200 4874 /dev/net/tun port-help 7972 hillenr 24u CHR 10,200 4874 /dev/net/tun linux 7974 hillenr 24u CHR 10,200 4874 /dev/net/tun When exiting the telnet session, these 3 processes are terminated and "ifconfig eth0 up" on the uml works again. Following is the complete scenario on how this problem can be reproduced: - After start of an uml instance, a number of processes are attached to the /dev/net/tun device on the host: host:~ # lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME linux 7621 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7627 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7628 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7629 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7630 hillenr 27u CHR 10,200 4874 /dev/net/tun - Now telnet to the uml port and log on. 3 additional processes are created on the host, each attached to /dev/net/tun: host:~ # lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME linux 7621 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7627 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7628 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7629 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 7630 hillenr 27u CHR 10,200 4874 /dev/net/tun in.telnet 8496 hillenr 27u CHR 10,200 4874 /dev/net/tun port-help 8497 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 8499 hillenr 27u CHR 10,200 4874 /dev/net/tun - On the uml, take down eth0 with "ifconfig eth0 down". All uml processes are now detached from /dev/net/tun, except the ones related to the telnet session: host:~ # lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME in.telnet 8496 hillenr 27u CHR 10,200 4874 /dev/net/tun port-help 8497 hillenr 27u CHR 10,200 4874 /dev/net/tun linux 8499 hillenr 27u CHR 10,200 4874 /dev/net/tun Now as long as the telnet session remains open, the status of eth0 can not be manipulated anymore because of "device or recource busy". I'm not sure if this is a bug on how the /dev/net/tun device is attached to the various uml processes or if this is expected behaviour somehow. Any ideas? Thanks, Robert |
From: Jeff D. <jd...@ad...> - 2006-01-29 02:38:12
|
On Sun, Jan 29, 2006 at 12:08:54AM +0100, Robert Hillen wrote: > This happens when logging in to the uml via a telnet port. The problem > is that in this case the /dev/net/tun device remains attached to 3 > proceses on the host: Nice diagnosis - does this patch below help? Index: linux-2.6.15-mm/arch/um/os-Linux/drivers/tuntap_user.c =================================================================== --- linux-2.6.15-mm.orig/arch/um/os-Linux/drivers/tuntap_user.c 2006-01-03 17:39:46.000000000 -0500 +++ linux-2.6.15-mm/arch/um/os-Linux/drivers/tuntap_user.c 2006-01-28 21:08:13.000000000 -0500 @@ -122,6 +122,7 @@ static int tuntap_open_tramp(char *gate, return(-EINVAL); } *fd_out = ((int *) CMSG_DATA(cmsg))[0]; + os_set_exec_close(*fd_out, 1); return(0); } @@ -137,7 +138,8 @@ static int tuntap_open(void *data) return(err); if(pri->fixed_config){ - pri->fd = os_open_file("/dev/net/tun", of_rdwr(OPENFLAGS()), 0); + pri->fd = os_open_file("/dev/net/tun", + of_cloexec(of_rdwr(OPENFLAGS())), 0); if(pri->fd < 0){ printk("Failed to open /dev/net/tun, err = %d\n", -pri->fd); |
From: Robert H. <rob...@sk...> - 2006-01-29 13:28:05
|
Thanks Jeff. Your patch seems to fix the problem partly, but I still get the "device busy" error because the tun device still remains attached to one process after eth0 is disabled in the uml. These are the uml related processes on the host after uml is started: hillenr@host:~> pstree -p 26848 linux(26848)???linux(26855) ??linux(26856) ??linux(26857) ??linux(26858) Each of these processes except 26855 is attached to the tun device: hillenr@host:~> lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME linux 26848 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26856 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26857 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26858 hillenr 31u CHR 10,200 4874 /dev/net/tun After starting a telnet session to the uml telnet port, 3 more processes are created on the host: telnetd, port-helper and another "linux" process. hillenr@host:~> pstree -p 26848 linux(26848)???in.telnetd(27160)???port-helper(27161) ??linux(26855) ??linux(26856) ??linux(26857) ??linux(26858) ??linux(27163) Thanks to your patch the tun device is not attached to the telnetd and port-helper processes anymore, but still to the newly created linux process: hillenr@host:~> lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME linux 26848 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26856 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26857 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 26858 hillenr 31u CHR 10,200 4874 /dev/net/tun linux 27163 hillenr 31u CHR 10,200 4874 /dev/net/tun And after taking down eth0 in the uml, the tun device remains stuck in that process until the telnet session is terminated: hillenr@host:~> lsof /dev/net/tun COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME linux 27163 hillenr 31u CHR 10,200 4874 /dev/net/tun Many thanks, Robert > -----Original Message----- > From: Jeff Dike [mailto:jd...@ad...] > Sent: Sunday, January 29, 2006 3:39 AM > To: Robert Hillen > Cc: use...@li... > Subject: Re: [uml-user] Not possible to enable eth0 in UML: > Device or resource busy > > > On Sun, Jan 29, 2006 at 12:08:54AM +0100, Robert Hillen wrote: > > This happens when logging in to the uml via a telnet port. > The problem > > is that in this case the /dev/net/tun device remains attached to 3 > > proceses on the host: > > Nice diagnosis - does this patch below help? > > Index: linux-2.6.15-mm/arch/um/os-Linux/drivers/tuntap_user.c > =================================================================== > --- > linux-2.6.15-mm.orig/arch/um/os-Linux/drivers/tuntap_user.c > 2006-01-03 17:39:46.000000000 -0500 > +++ linux-2.6.15-mm/arch/um/os-Linux/drivers/tuntap_user.c > 2006-01-28 21:08:13.000000000 -0500 > @@ -122,6 +122,7 @@ static int tuntap_open_tramp(char *gate, > return(-EINVAL); > } > *fd_out = ((int *) CMSG_DATA(cmsg))[0]; > + os_set_exec_close(*fd_out, 1); > return(0); > } > > @@ -137,7 +138,8 @@ static int tuntap_open(void *data) > return(err); > > if(pri->fixed_config){ > - pri->fd = os_open_file("/dev/net/tun", > of_rdwr(OPENFLAGS()), 0); > + pri->fd = os_open_file("/dev/net/tun", > + > of_cloexec(of_rdwr(OPENFLAGS())), 0); > if(pri->fd < 0){ > printk("Failed to open /dev/net/tun, > err = %d\n", > -pri->fd); > |
From: Jeff D. <jd...@ad...> - 2006-01-30 19:25:37
Attachments:
tuntap-close
|
On Sun, Jan 29, 2006 at 02:27:42PM +0100, Robert Hillen wrote: > Thanks Jeff. Your patch seems to fix the problem partly, but I still get > the "device busy" error because the tun device still remains attached to > one process after eth0 is disabled in the uml. Can you try the attached patch, which replaces the earlier one? Jeff |
From: Blaisorblade <bla...@ya...> - 2006-01-30 22:32:29
|
On Monday 30 January 2006 20:26, Jeff Dike wrote: > On Sun, Jan 29, 2006 at 02:27:42PM +0100, Robert Hillen wrote: > > Thanks Jeff. Your patch seems to fix the problem partly, but I still get > > the "device busy" error because the tun device still remains attached to > > one process after eth0 is disabled in the uml. > Can you try the attached patch, which replaces the earlier one? Ack from me - I was dubious about moving that os_close_file but it's correct, with CLONE_FILES it must be skipped in the success case (or you close the read end for the thread). To be remarked however or someone may "fix" it. And keeping both sides of the pipe open is ok, as long as you don't rely on getting reports that the other side of the pipe was closed (aka, you don't get any 0-sized read, nor EPIPE/SIGPIPE on write). -- Inform me of my mistakes, so I can keep imitating Homer Simpson's "Doh!". Paolo Giarrusso, aka Blaisorblade (Skype ID "PaoloGiarrusso", ICQ 215621894) http://www.user-mode-linux.org/~blaisorblade ___________________________________ Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB http://mail.yahoo.it |
From: Robert H. <rob...@sk...> - 2006-02-02 20:52:30
|
> -----Original Message----- > On Sun, Jan 29, 2006 at 02:27:42PM +0100, Robert Hillen wrote: > > Thanks Jeff. Your patch seems to fix the problem partly, > but I still > > get the "device busy" error because the tun device still remains > > attached to one process after eth0 is disabled in the uml. > > Can you try the attached patch, which replaces the earlier one? This patch solves the problem completely. Thanks a lot for your help. Robert |