From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ross Lagerwall Subject: [PATCH v3 6/6] tools/libxl: Adjust datacopiers POLLHUP handling when the fd is also readable Date: Mon, 16 Mar 2015 13:29:54 +0000 Message-ID: <1426512594-11585-6-git-send-email-ross.lagerwall@citrix.com> References: <1426512594-11585-1-git-send-email-ross.lagerwall@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1426512594-11585-1-git-send-email-ross.lagerwall@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Andrew Cooper , Ian Jackson , Ian Campbell , Wei Liu List-Id: xen-devel@lists.xenproject.org From: Andrew Cooper POLLHUP|POLLIN is a valid revent to receive when there is readable data in a pipe, but the writable fd has been closed. This occurs in migration v2 when the legacy conversion process (which transforms the data inline) completes and exits successfully. In the case that there is data to read, suppress the POLLHUP. POSIX states that the hangup state is latched[1], which means it will reoccur on subsequent poll() calls. The datacopier is thus provided the opportunity to read until EOF, if possible. A POLLHUP on its own is treated exactly as before, indicating a different error with the fd. [1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html Signed-off-by: Andrew Cooper CC: Ian Campbell CC: Ian Jackson CC: Wei Liu --- tools/libxl/libxl_aoutils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/libxl/libxl_aoutils.c b/tools/libxl/libxl_aoutils.c index a5a10fb..0d4c8af 100644 --- a/tools/libxl/libxl_aoutils.c +++ b/tools/libxl/libxl_aoutils.c @@ -205,6 +205,9 @@ static void datacopier_readable(libxl__egc *egc, libxl__ev_fd *ev, libxl__datacopier_state *dc = CONTAINER_OF(ev, *dc, toread); STATE_AO_GC(dc->ao); + if ((revents & (POLLHUP|POLLIN)) == (POLLHUP|POLLIN)) + revents &= ~POLLHUP; + if (datacopier_pollhup_handled(egc, dc, revents, 0)) return; -- 2.1.0