Blob Blame History Raw
From 26a13abce6cc73595eb2adf3db46d25c017c2e06 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 17 Mar 2016 08:35:54 +0000
Subject: [PATCH] appliance: Pass "quiet" option to kernel when !verbose.

The quiet option suppresses kernel messages.  On my laptop it improves
appliance boot times by about 40% (3.5s -> 2.5s).

The emulated UART is slow and has a fixed, small FIFO (16 bytes).  But
it has the advantage of being a simple ISA device which is available
very early in boot, thus enabling us to diagnose early boot problems.
So the aim is to reduce our usage of this UART on fast paths.

Of course when we are in verbose mode, we should not add this flag
because we want to see all the messages.

This change is not entirely invisible:

(1) Progress messages use the "Linux version ..." string from kernel
output in order to determine part of where we are in the boot process.
This string will no longer be detected.  We should probably use a BIOS
message or maybe drop this altogether.  I have added a comment to the
code.

(2) It is possible for programs to be listening for
GUESTFS_EVENT_APPLIANCE events, and they will see fewer messages now
(although what kernel messages programs see is never defined).

(cherry picked from commit ed739e71f634b363c3cf6a0a4eca559eaae7f7b3)
---
 src/launch.c | 4 ++--
 src/proto.c  | 3 +++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/launch.c b/src/launch.c
index de50774..229069f 100644
--- a/src/launch.c
+++ b/src/launch.c
@@ -359,7 +359,7 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev,
      " cgroup_disable=memory"   /* saves us about 5 MB of RAM */
      "%s"                       /* root=appliance_dev */
      " %s"                      /* selinux */
-     "%s"                       /* verbose */
+     " %s"                      /* quiet/verbose */
      "%s"                       /* network */
      " TERM=%s"                 /* TERM environment variable */
      "%s%s"                     /* handle identifier */
@@ -370,7 +370,7 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev,
      lpj_s,
      root,
      g->selinux ? "selinux=1 enforcing=0" : "selinux=0",
-     g->verbose ? " guestfs_verbose=1" : "",
+     g->verbose ? "guestfs_verbose=1" : "quiet",
      g->enable_network ? " guestfs_network=1" : "",
      term ? term : "linux",
      STRNEQ (g->identifier, "") ? " guestfs_identifier=" : "",
diff --git a/src/proto.c b/src/proto.c
index a4fc987..1bc349a 100644
--- a/src/proto.c
+++ b/src/proto.c
@@ -129,6 +129,9 @@ guestfs_int_log_message_callback (guestfs_h *g, const char *buf, size_t len)
     const char *sentinel;
     size_t slen;
 
+    /* Since 2016-03, if !verbose, then we add the "quiet" flag to the
+     * kernel, so the following sentinel will never be produced. XXX
+     */
     sentinel = "Linux version"; /* kernel up */
     slen = strlen (sentinel);
     if (memmem (buf, len, sentinel, slen) != NULL)
-- 
1.8.3.1