tools/xenconsoled: Possibly perform repeated xc_readconsolering() hypercalls
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 22 Jul 2014 16:17:15 +0000 (17:17 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Thu, 24 Jul 2014 15:23:19 +0000 (16:23 +0100)
The size of the Xen console ring is runtime configurable, so the statically
sized 16k buffer is not necessarily sufficient.  Make repeated
xc_readconsolering() hypercalls while Xen managed to completely fill the
provided buffer.

Also, change the buffer to being static to save on stack space.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
tools/console/daemon/io.c

index 313b256d143c38f954594f5206544b7a28a7b979..b1268fa8c4ac12184bd6805cb4438cc93d48eb12 100644 (file)
@@ -909,17 +909,24 @@ static void handle_xs(void)
 
 static void handle_hv_logs(xc_evtchn *xce_handle)
 {
-       char buffer[1024*16];
+       static char buffer[1024*16];
        char *bufptr = buffer;
-       unsigned int size = sizeof(buffer);
+       unsigned int size;
        static uint32_t index = 0;
        evtchn_port_or_error_t port;
 
        if ((port = xc_evtchn_pending(xce_handle)) == -1)
                return;
 
-       if (xc_readconsolering(xc, bufptr, &size, 0, 1, &index) == 0 && size > 0) {
+       do
+       {
                int logret;
+
+               size = sizeof(buffer);
+               if (xc_readconsolering(xc, bufptr, &size, 0, 1, &index) != 0 ||
+                   size == 0)
+                       break;
+
                if (log_time_hv)
                        logret = write_with_timestamp(log_hv_fd, buffer, size,
                                                      &log_time_hv_needts);
@@ -929,7 +936,7 @@ static void handle_hv_logs(xc_evtchn *xce_handle)
                if (logret < 0)
                        dolog(LOG_ERR, "Failed to write hypervisor log: "
                                       "%d (%s)", errno, strerror(errno));
-       }
+       } while (size == sizeof(buffer));
 
        (void)xc_evtchn_unmask(xce_handle, port);
 }