[SeaBIOS] [PATCH] qemu: fast boot when linuxboot optionrom is used

Stefano Garzarella posted 1 patch 2 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/seabios tags/patchew/20181123140938.74612-1-sgarzare@redhat.com
src/bootsplash.c  |  3 +++
src/fw/paravirt.c | 10 ++++++++++
src/fw/paravirt.h |  4 ++++
src/optionroms.c  |  3 ++-
src/post.c        |  3 +++
5 files changed, 22 insertions(+), 1 deletion(-)

[SeaBIOS] [PATCH] qemu: fast boot when linuxboot optionrom is used

Posted by Stefano Garzarella 2 weeks ago
Speed up the boot phase when qemu uses "linuxboot" optionrom
(qemu -kernel) and the boot-menu is not required.
Under these conditions we can skip the setup of devices and VGA,
because they will be initialized (if they are required) during
the Linux boot phase.

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
 src/bootsplash.c  |  3 +++
 src/fw/paravirt.c | 10 ++++++++++
 src/fw/paravirt.h |  4 ++++
 src/optionroms.c  |  3 ++-
 src/post.c        |  3 +++
 5 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/bootsplash.c b/src/bootsplash.c
index 165c98d..0eda7f2 100644
--- a/src/bootsplash.c
+++ b/src/bootsplash.c
@@ -8,6 +8,7 @@
 #include "bregs.h" // struct bregs
 #include "config.h" // CONFIG_*
 #include "farptr.h" // FLATPTR_TO_SEG
+#include "fw/paravirt.h" // runningOnQEMUFastBoot
 #include "malloc.h" // free
 #include "output.h" // dprintf
 #include "romfile.h" // romfile_loadfile
@@ -39,6 +40,8 @@ call16_int10(struct bregs *br)
 void
 enable_vga_console(void)
 {
+    if(runningOnQEMUFastBoot())
+        return;
     dprintf(1, "Turning on vga text mode console\n");
     struct bregs br;
 
diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c
index 0770c47..9e6e618 100644
--- a/src/fw/paravirt.c
+++ b/src/fw/paravirt.c
@@ -621,4 +621,14 @@ void qemu_cfg_init(void)
     if (nogfx && !romfile_find("etc/sercon-port")
         && !romfile_find("vgaroms/sgabios.bin"))
         const_romfile_add_int("etc/sercon-port", PORT_SERIAL1);
+
+    /*
+     * Enable QEMU fast boot if there is "linuxboot" optionrom and
+     * the boot menu is not required.
+     */
+    if ((romfile_find("genroms/linuxboot_dma.bin")
+        || romfile_find("genroms/linuxboot.bin"))
+        && !romfile_loadint("etc/show-boot-menu", 1)) {
+        PlatformRunningOn |= PF_QEMU_FB;
+    }
 }
diff --git a/src/fw/paravirt.h b/src/fw/paravirt.h
index a14d83e..3713bc2 100644
--- a/src/fw/paravirt.h
+++ b/src/fw/paravirt.h
@@ -9,6 +9,7 @@
 #define PF_QEMU     (1<<0)
 #define PF_XEN      (1<<1)
 #define PF_KVM      (1<<2)
+#define PF_QEMU_FB  (1<<3)
 
 typedef struct QemuCfgDmaAccess {
     u32 control;
@@ -24,6 +25,9 @@ static inline int runningOnQEMU(void) {
     return CONFIG_QEMU || (
         CONFIG_QEMU_HARDWARE && GET_GLOBAL(PlatformRunningOn) & PF_QEMU);
 }
+static inline int runningOnQEMUFastBoot(void) {
+    return runningOnQEMU() && GET_GLOBAL(PlatformRunningOn) & PF_QEMU_FB;
+}
 static inline int runningOnXen(void) {
     return CONFIG_XEN && GET_GLOBAL(PlatformRunningOn) & PF_XEN;
 }
diff --git a/src/optionroms.c b/src/optionroms.c
index fc992f6..c312e91 100644
--- a/src/optionroms.c
+++ b/src/optionroms.c
@@ -8,6 +8,7 @@
 #include "bregs.h" // struct bregs
 #include "config.h" // CONFIG_*
 #include "farptr.h" // FLATPTR_TO_SEG
+#include "fw/paravirt.h" // runningOnQEMUFastBoot
 #include "hw/pci.h" // pci_config_readl
 #include "hw/pcidevice.h" // foreachpci
 #include "hw/pci_ids.h" // PCI_CLASS_DISPLAY_VGA
@@ -428,7 +429,7 @@ vgarom_setup(void)
 {
     int have_vga = 0;
 
-    if (! CONFIG_OPTIONROMS)
+    if (!CONFIG_OPTIONROMS || runningOnQEMUFastBoot())
         return;
 
     dprintf(1, "Scan for VGA option rom\n");
diff --git a/src/post.c b/src/post.c
index f93106a..d1c2a54 100644
--- a/src/post.c
+++ b/src/post.c
@@ -126,6 +126,9 @@ interface_init(void)
 void
 device_hardware_setup(void)
 {
+    if(runningOnQEMUFastBoot())
+        return;
+
     usb_setup();
     ps2port_setup();
     block_setup();
-- 
2.19.1


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios

Re: [SeaBIOS] [PATCH] qemu: fast boot when linuxboot optionrom is used

Posted by Stefan Hajnoczi 2 weeks ago
On Fri, Nov 23, 2018 at 2:09 PM Stefano Garzarella <sgarzare@redhat.com> wrote:
> Speed up the boot phase when qemu uses "linuxboot" optionrom
> (qemu -kernel) and the boot-menu is not required.
> Under these conditions we can skip the setup of devices and VGA,
> because they will be initialized (if they are required) during
> the Linux boot phase.

Please include benchmark results in the commit description so the
improvement is quantified and recorded in the commit history.

Thanks,
Stefan

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios

Re: [SeaBIOS] [PATCH] qemu: fast boot when linuxboot optionrom is used

Posted by Stefano Garzarella 2 weeks ago
On Mon, Nov 26, 2018 at 9:48 AM Stefan Hajnoczi <stefanha@gmail.com> wrote:
>
> On Fri, Nov 23, 2018 at 2:09 PM Stefano Garzarella <sgarzare@redhat.com> wrote:
> > Speed up the boot phase when qemu uses "linuxboot" optionrom
> > (qemu -kernel) and the boot-menu is not required.
> > Under these conditions we can skip the setup of devices and VGA,
> > because they will be initialized (if they are required) during
> > the Linux boot phase.
>
> Please include benchmark results in the commit description so the
> improvement is quantified and recorded in the commit history.

Sure, I'll prepare a v2 of this patch.

Thanks,
Stefano

>
> Thanks,
> Stefan



-- 
Stefano Garzarella
Red Hat

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios