Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Sep 2009 17:43:15 +0200
From:      Juergen Lock <nox@jelal.kn-bremen.de>
To:        Mark McLoughlin <markmc@redhat.com>
Cc:        freebsd-emulation@freebsd.org, Juergen Lock <nox@jelal.kn-bremen.de>, Anthony Liguori <anthony@codemonkey.ws>, qemu-devel@nongnu.org
Subject:   Re: close tapfd before running down_script [was Re: [Qemu-devel] ANNOUNCE: Release 0.11.0-rc2 of QEMU]
Message-ID:  <20090906154315.GA88187@triton8.kn-bremen.de>
In-Reply-To: <1252241425.3191.81.camel@blaa>
References:  <4AA11B9F.9050101@codemonkey.ws> <20090904201347.GA77929@triton8.kn-bremen.de> <1252241425.3191.81.camel@blaa>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Sep 06, 2009 at 01:50:25PM +0100, Mark McLoughlin wrote:
> On Fri, 2009-09-04 at 22:13 +0200, Juergen Lock wrote:
> 
> >  The second change is a small patch to tap_cleanup that makes it close
> > the tap fd before calling the ifdown script instead of after, otherwise
> > FreeBSD's tap driver may hit a KASSERT in case the ifdown script does
> > something like an `ifconfig tap0 destroy'...
> > 
> > Index: qemu/net.c
> > @@ -1643,12 +1643,13 @@ static void tap_cleanup(VLANClientState 
> >  
> >      qemu_purge_queued_packets(vc);
> >  
> > -    if (s->down_script[0])
> > -        launch_script(s->down_script, s->down_script_arg, s->fd);
> > -
> >      tap_read_poll(s, 0);
> >      tap_write_poll(s, 0);
> >      close(s->fd);
> > +
> > +    if (s->down_script[0])
> > +        launch_script(s->down_script, s->down_script_arg, -1);
> > +
> >      qemu_free(s);
> >  }
> >  
> >  I don't know if there are use cases where the ifdown script needs the
> > tap fd still open, otherwise I guess this can also be committed upstream.
> > And in case you want to: :)
> > 
> >  Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> 
> I don't ever use the the down script myself, but a couple of things to
> bear in mind:
> 
>   a) 0.9.1 never actually closed the tap fd and since 0.10.0 we've 
>      been closing the fd after calling the script
> 
>   b) where qemu creates the tap interface, by closing the tap fd before 
>      the script we'd be destroying the interface before passing the 
>      interface name to the script
> 
Ah, then that sounds like a difference between Linux and FreeBSD,
on FreeBSD the tap interface continues to exist after closing the fd...
(which is why these scripts call `ifconfig tapX destroy' in the
first place.)

> The current behaviour seems right to me. Could you explain your use case
> a bit more? Maybe post the up and down scripts?

 Here's the thread that started this:
	http://lists.freebsd.org/pipermail/freebsd-emulation/2009-August/006700.html

 And here is FreeBSD's tap_destroy() fn with the mentioned KASSERT:
	http://fxr.watson.org/fxr/source/net/if_tap.c#L213

 Anyway, sounds like the patch is the wrong thing to do on Linux
hosts so I guess I'll just keep it private to the FreeBSD port(s)...
(Or should I repost it with an #ifdef __FreeBSD__ etc?)

 Thanx,
	Juergen



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090906154315.GA88187>