On 10/28/25 19:22, Roman Bogorodskiy wrote:
> After executing the bhyve binary, it might happen that it fails very
> early due to configuration issues (missing/inaccessible files, incorrect
> custom args), bugs, etc. In this case it'll look like the domain has
> started normally, but quickly turned off.
> 
> Improve that by waiting for the domain's vmm entity to appear in
> /dev/vmm.
> 
> Signed-off-by: Roman Bogorodskiy <[email protected]>
> ---
> Ideally, I'd also like to display the errors that the bhyve binary logs
> in this case. But as I'm doing:
> 
>  virCommandSetErrorFD(cmd, &logfd);
> 
> I'm not sure if I should read that again from logfd, or are there more
> optimal ways to do that?
> 
> 
>  src/bhyve/bhyve_process.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)

Please consider a squashing this in:


diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
index 591c2d1ded..61638abf85 100644
--- a/src/bhyve/bhyve_process.c
+++ b/src/bhyve/bhyve_process.c
@@ -51,6 +51,7 @@
 #include "virnetdev.h"
 #include "virnetdevbridge.h"
 #include "virnetdevtap.h"
+#include "virtime.h"
 
 #define VIR_FROM_THIS   VIR_FROM_BHYVE
 
@@ -143,11 +144,9 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
     g_autoptr(virCommand) cmd = NULL;
     g_autoptr(virCommand) load_cmd = NULL;
     bhyveDomainObjPrivate *priv = vm->privateData;
-    g_auto(virBuffer) domain_vmm_path_buf = VIR_BUFFER_INITIALIZER;
     g_autofree char *domain_vmm_path = NULL;
+    virTimeBackOffVar timebackoff;
     int ret = -1, rc;
-    size_t i = 0;
-    int timeout = 3;
     bool vmm_appeared = false;
 
     logfile = g_strdup_printf("%s/%s.log", BHYVE_LOG_DIR, vm->def->name);
@@ -233,17 +232,16 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
         goto cleanup;
     }
 
-    virBufferAsprintf(&domain_vmm_path_buf, "/dev/vmm/%s", vm->def->name);
-    domain_vmm_path = virBufferContentAndReset(&domain_vmm_path_buf);
+    domain_vmm_path = g_strdup_printf("/dev/vmm/%s", vm->def->name);
 
-    do {
+    if (virTimeBackOffStart(&timebackoff, 1, 1000) < 0)
+        goto cleanup;
+    while (virTimeBackOffWait(&timebackoff)) {
         if (virFileExists(domain_vmm_path)) {
             vmm_appeared = true;
             break;
         }
-
-        g_usleep(500000);
-    } while (!vmm_appeared && ++i < timeout);
+    }
 
     if (!vmm_appeared) {
         virReportError(VIR_ERR_INTERNAL_ERROR,


Reviewed-by: Michal Privoznik <[email protected]>

Michal

Reply via email to