WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH v3] libxl: reimplement buffer for bootloading and dro

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH v3] libxl: reimplement buffer for bootloading and drop data if buffer is full
From: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
Date: Tue, 18 Oct 2011 13:17:17 +0200
Cc: Ian.Jackson@xxxxxxxxxxxxx
Delivery-date: Tue, 18 Oct 2011 04:19:37 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:content-type:mime-version:content-transfer-encoding:subject :x-mercurial-node:message-id:user-agent:date:from:to:cc; bh=Y0fDWJHIypKId1pbMzGFIZbNFsVKTGxqoElsXE9sCeU=; b=bsL9bRtWWR9a9aTbLTiv+F6aZSVomy3dErAgFu9UPP7r2aiImSeFHowxkHJu0ZzkKK OK+597k70/RsdBUadZbDzX0qMC/p6rOKIzUxgt/5bJf+U1w7WHDlkV3HQEcI8YSK848W ltDKOU+6xlorP84IUjUFFPZIp6ldenf7RE3j0=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.9.2
# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1318936435 -7200
# Node ID 4a591584e20718b06f3e9dc72897ee2a87f43c3c
# Parent  0a720316685a73e2d5aee56c1572b9ee8d98ab4e
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end 
until it's full. Drop output from bootloader if a timeout has occurred and the 
buffer is full. Prevents the bootloader from getting stuck when using ptys with 
small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>

diff -r 0a720316685a -r 4a591584e207 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c    Tue Oct 18 11:26:43 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c    Tue Oct 18 13:13:55 2011 +0200
@@ -21,6 +21,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -28,7 +29,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
  */
 static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int 
bootloader_fd, int fifo_fd)
 {
-    int ret;
+    int ret, read_ahead;
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -181,39 +184,74 @@ static char * bootloader_interact(libxl_
         fd_set wsel, rsel;
         int nfds;
 
+        /* Set timeout to 1s before starting to discard data */
+        wait.tv_sec = BOOTLOADER_TIMEOUT;
+        wait.tv_usec = 0;
+
         if (xenconsoled_prod == xenconsoled_cons)
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
+                    xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
+                    bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE 
&& xenconsoled_cons == 0)) {
+        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
-        }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && 
bootloader_cons == 0)) {
+        } 
+        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
         FD_ZERO(&wsel);
-        if (bootloader_prod != bootloader_cons) {
+        if (bootloader_prod > 0) {
             FD_SET(xenconsoled_fd, &wsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (xenconsoled_prod != xenconsoled_cons) {
+        if (xenconsoled_prod > 0) {
             FD_SET(bootloader_fd, &wsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
-        if (ret < 0)
+        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
+            bootloader_prod == BOOTLOADER_BUF_SIZE)
+            ret = select(nfds, &rsel, &wsel, NULL, &wait);
+        else
+            ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        if (ret < 0) {
+            if (errno == EINTR)
+                continue;
             goto out_err;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
-        if (FD_ISSET(xenconsoled_fd, &rsel)) {
+        if (FD_ISSET(xenconsoled_fd, &rsel) || ret == 0) {
+            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= XENCONSOLED_BUF_SIZE)
+                    /* The whole buffer will be overwritten */
+                    read_ahead = XENCONSOLED_BUF_SIZE;
+                else
+                    memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead],
+                            XENCONSOLED_BUF_SIZE - read_ahead);
+                xenconsoled_prod -= read_ahead;
+            }
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], 
XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -229,7 +267,18 @@ static char * bootloader_interact(libxl_
         }
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
-        if (FD_ISSET(bootloader_fd, &rsel)) {
+        if (FD_ISSET(bootloader_fd, &rsel) || ret == 0) {
+            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
+                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= BOOTLOADER_BUF_SIZE)
+                    /* The whole buffer will be overwritten */
+                    read_ahead = BOOTLOADER_BUF_SIZE;
+                else
+                    memmove(bootloader_buf, &bootloader_buf[read_ahead],
+                            BOOTLOADER_BUF_SIZE - read_ahead);
+                bootloader_prod -= read_ahead;
+            }
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], 
BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>