Diego Ongaro
2008-Jul-23 17:01 UTC
[Xen-devel] [PATCH] mini-os: select call incorrectly reports xce_handle as ready
The current implementation in minios of xc_evtchn_pending doesn''t set read=0 when there is exactly one port pending. This resulted in select() incorrectly reporting the file descriptor as ready. Signed-off-by: Diego Ongaro <diego.ongaro@citrix.com> Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com> --- diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c --- a/tools/libxc/xc_minios.c +++ b/tools/libxc/xc_minios.c @@ -287,22 +287,28 @@ evtchn_port_or_error_t xc_evtchn_pending(int xce_handle) { int i; unsigned long flags; + evtchn_port_t ret = -1; + local_irq_save(flags); + files[xce_handle].read = 0; for (i = 0; i < MAX_EVTCHN_PORTS; i++) { - evtchn_port_t port = files[xce_handle].evtchn.ports[i].port; - if (port != -1 && files[xce_handle].evtchn.ports[i].pending) { - files[xce_handle].evtchn.ports[i].pending = 0; - local_irq_restore(flags); - return port; - } + evtchn_port_t port = files[xce_handle].evtchn.ports[i].port; + if (port != -1 && files[xce_handle].evtchn.ports[i].pending) { + if (ret == -1) { + ret = port; + files[xce_handle].evtchn.ports[i].pending = 0; + } else { + files[xce_handle].read = 1; + break; + } + } } - files[xce_handle].read = 0; local_irq_restore(flags); - return -1; + return ret; } int xc_evtchn_unmask(int xce_handle, evtchn_port_t port) { unmask_evtchn(port); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel