Re: patch review: avoid com delay() in VMs

Emile `iMil' Heitor <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
On Tue, 4 Feb 2025, Emile `iMil' Heitor wrote:

> com_attach_subr() in sys/dev/ic/com.c has a delay(10000) waiting for
> output to finish, this is very unlikely to be useful inside a virtual
> machine and slows down boot time in such machine.

After several back-and-forths, thanks Martin, Simon and Taylor for
your help, here's a cleaner approach based on prop_dictionary_util,
avoiding #ifdefs:

ba0f8fc85baa9144d0a3e1194865b6995f67c1de Avoid delay(10000) for virtual machines
diff --git a/sys/arch/x86/x86/x86_autoconf.c b/sys/arch/x86/x86/x86_autoconf.c
index 835bb019175..6357967184b 100644
--- a/sys/arch/x86/x86/x86_autoconf.c
+++ b/sys/arch/x86/x86/x86_autoconf.c
@@ -602,6 +602,10 @@ device_register(device_t dev, void *aux)
  	(void)device_hyperv_register(dev, aux);
  #endif

+	if (device_is_a(dev, "com") && vm_guest > VM_GUEST_NO)
+		prop_dictionary_set_bool(device_properties(dev),
+		    "skip_attach_delay", true);
+
  	if (isaboot == NULL && pciboot == NULL)
  		return;

diff --git a/sys/dev/ic/com.c b/sys/dev/ic/com.c
index d271b594346..5e15ed17a1d 100644
--- a/sys/dev/ic/com.c
+++ b/sys/dev/ic/com.c
@@ -540,12 +540,14 @@ com_attach_subr(struct com_softc *sc)
  	prop_dictionary_t dict;
  	bool is_console = true;
  	bool force_console = false;
+	bool skip_attach_delay = false;

  	aprint_naive("\n");

  	dict = device_properties(sc->sc_dev);
  	prop_dictionary_get_bool(dict, "is_console", &is_console);
  	prop_dictionary_get_bool(dict, "force_console", &force_console);
+	prop_dictionary_get_bool(dict, "skip_attach_delay", &skip_attach_delay);
  	callout_init(&sc->sc_diag_callout, 0);
  	callout_init(&sc->sc_poll_callout, 0);
  	callout_setfunc(&sc->sc_poll_callout, com_intr_poll, sc);
@@ -589,8 +591,11 @@ com_attach_subr(struct com_softc *sc)
  			break;
  		}

+		/* No need for a delay on virtual machines. */
+		if (!skip_attach_delay)
+			delay(10000); /* wait for output to finish */
+
  		/* Make sure the console is always "hardwired". */
-		delay(10000);			/* wait for output to finish */
  		if (is_console) {
  			SET(sc->sc_hwflags, COM_HW_CONSOLE);
  		}

------------------------------------------------------------------------
Emile `iMil' Heitor <imil@{home.imil.net,NetBSD.org}> | https://imil.net
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.