From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH] libxl: drop bootloader output if xenconsole file descriptor is not available for writing Date: Mon, 10 Oct 2011 15:11:41 +0100 Message-ID: <4E92FD1D.8070400@citrix.com> References: <1ebcb5d27ead38d6713d.1318255457@loki> Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1ebcb5d27ead38d6713d.1318255457@loki> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Roger Pau Monne Cc: Ian, "xen-devel@lists.xensource.com" , Jackson , Ian Campbell List-Id: xen-devel@lists.xenproject.org On 10/10/11 15:04, Roger Pau Monne wrote: > # HG changeset patch > # User Roger Pau Monne > # Date 1318255452 -7200 > # Node ID 1ebcb5d27ead38d6713d865704394ca99444f93c > # Parent a5b8d5c8c98e0dd17368eea1801a8edaf1e79e69 > libxl: drop bootloader output if xenconsole file descriptor is not available for writing. > > Drop output from bootloader if the pty buffer is full and we cannot write more data. Prevents the bootloader from getting stuck when using ptys with small buffers. > > Signed-off-by: Roger Pau Monne > > diff -r a5b8d5c8c98e -r 1ebcb5d27ead tools/libxl/libxl_bootloader.c > --- a/tools/libxl/libxl_bootloader.c Mon Oct 10 11:26:22 2011 +0200 > +++ b/tools/libxl/libxl_bootloader.c Mon Oct 10 16:04:12 2011 +0200 > @@ -169,6 +169,7 @@ static char * bootloader_interact(libxl_ > > size_t nr_out = 0, size_out = 0; > char *output = NULL; > + struct timeval timeout; > > /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */ > int xenconsoled_prod = 0, xenconsoled_cons = 0; > @@ -177,9 +178,14 @@ static char * bootloader_interact(libxl_ > int bootloader_prod = 0, bootloader_cons = 0; > char bootloader_buf[BOOTLOADER_BUF_SIZE]; > > + /* Set timeout to 1s before starting to discard data */ > + timeout.tv_sec = 1; > + timeout.tv_usec = 0; > + > while(1) { > fd_set wsel, rsel; > int nfds; > + int space; You appear to introduce an unreferenced variable here. > > if (xenconsoled_prod == xenconsoled_cons) > xenconsoled_prod = xenconsoled_cons = 0; > @@ -208,9 +214,14 @@ static char * bootloader_interact(libxl_ > nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds; > } > > - ret = select(nfds, &rsel, &wsel, NULL, NULL); > + ret = select(nfds, &rsel, &wsel, NULL, &timeout); > if (ret < 0) > goto out_err; > + if (ret == 0) { > + /* Timeout reached, force clear buffers */ > + xenconsoled_prod = xenconsoled_cons; > + bootloader_prod = bootloader_cons; > + } > > /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */ > if (FD_ISSET(xenconsoled_fd, &rsel)) { > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel -- Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer T: +44 (0)1223 225 900, http://www.citrix.com