On Thu, Mar 28, 2013 at 03:55:53PM +0800, Liu Ping Fan wrote: > From: Liu Ping Fan <pingf...@linux.vnet.ibm.com> > > Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com> > --- > net/tap.c | 7 ++++++- > 1 files changed, 6 insertions(+), 1 deletions(-) > > diff --git a/net/tap.c b/net/tap.c > index 0b663d1..401161c 100644 > --- a/net/tap.c > +++ b/net/tap.c > @@ -321,9 +321,14 @@ static void tap_cleanup(NetClientState *nc) > static void tap_poll(NetClientState *nc, bool enable) > { > TAPState *s = DO_UPCAST(TAPState, nc, nc); > - /* fixme, when tap backend on another thread, the disable should be sync > */ > + > tap_read_poll(s, enable); > tap_write_poll(s, enable); > + > + if (!enable) { > + /* need sync so vhost can take over polling */ > + g_source_remove_poll(&nc->nsrc->source, &nc->nsrc->gfd); > + }
Is this necessary? Since we're in tap_poll() we are currently not in poll(2) waiting on the fd. Therefore it's safe for the caller to use the fd, the prepare function will remove it from the fd set before glib calls poll(2) again. Stefan