The `--event-monitor` option in cloud-hypervisor outputs events to a
specified file. This file can then be used to monitor VM lifecycle,
other vmm events and trigger appropriate actions.
Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
Co-authored-by: Vineeth Pillai <viremana@linux.microsoft.com>
---
src/ch/ch_monitor.c | 20 ++++++++++++++++----
src/ch/ch_monitor.h | 2 ++
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
index 3e49902791..8c99fe1019 100644
--- a/src/ch/ch_monitor.c
+++ b/src/ch/ch_monitor.c
@@ -540,7 +540,6 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
{
g_autoptr(virCHMonitor) mon = NULL;
g_autoptr(virCommand) cmd = NULL;
- const char *socketdir = cfg->stateDir;
int socket_fd = 0;
if (virCHMonitorInitialize() < 0)
@@ -556,11 +555,13 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
}
/* prepare to launch Cloud-Hypervisor socket */
- mon->socketpath = g_strdup_printf("%s/%s-socket", socketdir, vm->def->name);
- if (g_mkdir_with_parents(socketdir, 0777) < 0) {
+ mon->socketpath = g_strdup_printf("%s/%s-socket", cfg->stateDir, vm->def->name);
+ mon->eventmonitorpath = g_strdup_printf("%s/%s-event-monitor",
+ cfg->stateDir, vm->def->name);
+ if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) {
virReportSystemError(errno,
_("Cannot create socket directory '%1$s'"),
- socketdir);
+ cfg->stateDir);
return NULL;
}
@@ -585,6 +586,9 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+ virCommandAddArg(cmd, "--event-monitor");
+ virCommandAddArgFormat(cmd, "path=%s", mon->eventmonitorpath);
+
/* launch Cloud-Hypervisor socket */
if (virCommandRunAsync(cmd, &mon->pid) < 0)
return NULL;
@@ -629,6 +633,14 @@ void virCHMonitorClose(virCHMonitor *mon)
g_free(mon->socketpath);
}
+ if (mon->eventmonitorpath) {
+ if (virFileRemove(mon->eventmonitorpath, -1, -1) < 0) {
+ VIR_WARN("Unable to remove CH event monitor file '%s'",
+ mon->eventmonitorpath);
+ }
+ g_free(mon->eventmonitorpath);
+ }
+
virObjectUnref(mon);
}
diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
index b35f5ea027..2ef8706b99 100644
--- a/src/ch/ch_monitor.h
+++ b/src/ch/ch_monitor.h
@@ -95,6 +95,8 @@ struct _virCHMonitor {
char *socketpath;
+ char *eventmonitorpath;
+
pid_t pid;
virDomainObj *vm;
--
2.34.1
On 9/19/2024 8:02 AM, Purna Pavan Chandra Aekkaladevi wrote:
> The `--event-monitor` option in cloud-hypervisor outputs events to a
> specified file. This file can then be used to monitor VM lifecycle,
> other vmm events and trigger appropriate actions.
>
> Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
> Co-authored-by: Vineeth Pillai <viremana@linux.microsoft.com>
> ---
> src/ch/ch_monitor.c | 20 ++++++++++++++++----
> src/ch/ch_monitor.h | 2 ++
> 2 files changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> index 3e49902791..8c99fe1019 100644
> --- a/src/ch/ch_monitor.c
> +++ b/src/ch/ch_monitor.c
> @@ -540,7 +540,6 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> {
> g_autoptr(virCHMonitor) mon = NULL;
> g_autoptr(virCommand) cmd = NULL;
> - const char *socketdir = cfg->stateDir;
> int socket_fd = 0;
>
> if (virCHMonitorInitialize() < 0)
> @@ -556,11 +555,13 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> }
>
> /* prepare to launch Cloud-Hypervisor socket */
> - mon->socketpath = g_strdup_printf("%s/%s-socket", socketdir, vm->def->name);
> - if (g_mkdir_with_parents(socketdir, 0777) < 0) {
> + mon->socketpath = g_strdup_printf("%s/%s-socket", cfg->stateDir, vm->def->name);
> + mon->eventmonitorpath = g_strdup_printf("%s/%s-event-monitor",
> + cfg->stateDir, vm->def->name);
> + if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) {
> virReportSystemError(errno,
> _("Cannot create socket directory '%1$s'"),
> - socketdir);
> + cfg->stateDir);
> return NULL;
> }
>
> @@ -585,6 +586,9 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
> virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
>
> + virCommandAddArg(cmd, "--event-monitor");
> + virCommandAddArgFormat(cmd, "path=%s", mon->eventmonitorpath);
> +
> /* launch Cloud-Hypervisor socket */
> if (virCommandRunAsync(cmd, &mon->pid) < 0)
> return NULL;
> @@ -629,6 +633,14 @@ void virCHMonitorClose(virCHMonitor *mon)
> g_free(mon->socketpath);
> }
>
> + if (mon->eventmonitorpath) {
> + if (virFileRemove(mon->eventmonitorpath, -1, -1) < 0) {
> + VIR_WARN("Unable to remove CH event monitor file '%s'",
> + mon->eventmonitorpath);
> + }
> + g_free(mon->eventmonitorpath);
> + }
> +
Do you really need to remove mon->eventmonitorpath here?
In patch3, you introduce `virCHStopEventHandler`, which causes the
thread to exit its while loop and run
`VIR_FORCE_CLOSE(event_monitor_fd)`, which also deletes the
event_monitor file.
> virObjectUnref(mon);
> }
>
> diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
> index b35f5ea027..2ef8706b99 100644
> --- a/src/ch/ch_monitor.h
> +++ b/src/ch/ch_monitor.h
> @@ -95,6 +95,8 @@ struct _virCHMonitor {
>
> char *socketpath;
>
> + char *eventmonitorpath;
> +
> pid_t pid;
>
> virDomainObj *vm;
--
Regards,
Praveen K Paladugu
On Mon, Sep 23, 2024 at 04:25:54PM -0500, Praveen K Paladugu wrote:
>
>
> On 9/19/2024 8:02 AM, Purna Pavan Chandra Aekkaladevi wrote:
> >The `--event-monitor` option in cloud-hypervisor outputs events to a
> >specified file. This file can then be used to monitor VM lifecycle,
> >other vmm events and trigger appropriate actions.
> >
> >Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
> >Co-authored-by: Vineeth Pillai <viremana@linux.microsoft.com>
> >---
> > src/ch/ch_monitor.c | 20 ++++++++++++++++----
> > src/ch/ch_monitor.h | 2 ++
> > 2 files changed, 18 insertions(+), 4 deletions(-)
> >
> >diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> >index 3e49902791..8c99fe1019 100644
> >--- a/src/ch/ch_monitor.c
> >+++ b/src/ch/ch_monitor.c
> >@@ -540,7 +540,6 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> > {
> > g_autoptr(virCHMonitor) mon = NULL;
> > g_autoptr(virCommand) cmd = NULL;
> >- const char *socketdir = cfg->stateDir;
> > int socket_fd = 0;
> > if (virCHMonitorInitialize() < 0)
> >@@ -556,11 +555,13 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> > }
> > /* prepare to launch Cloud-Hypervisor socket */
> >- mon->socketpath = g_strdup_printf("%s/%s-socket", socketdir, vm->def->name);
> >- if (g_mkdir_with_parents(socketdir, 0777) < 0) {
> >+ mon->socketpath = g_strdup_printf("%s/%s-socket", cfg->stateDir, vm->def->name);
> >+ mon->eventmonitorpath = g_strdup_printf("%s/%s-event-monitor",
> >+ cfg->stateDir, vm->def->name);
> >+ if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) {
> > virReportSystemError(errno,
> > _("Cannot create socket directory '%1$s'"),
> >- socketdir);
> >+ cfg->stateDir);
> > return NULL;
> > }
> >@@ -585,6 +586,9 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
> > virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
> > virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
> >+ virCommandAddArg(cmd, "--event-monitor");
> >+ virCommandAddArgFormat(cmd, "path=%s", mon->eventmonitorpath);
> >+
> > /* launch Cloud-Hypervisor socket */
> > if (virCommandRunAsync(cmd, &mon->pid) < 0)
> > return NULL;
> >@@ -629,6 +633,14 @@ void virCHMonitorClose(virCHMonitor *mon)
> > g_free(mon->socketpath);
> > }
> >+ if (mon->eventmonitorpath) {
> >+ if (virFileRemove(mon->eventmonitorpath, -1, -1) < 0) {
> >+ VIR_WARN("Unable to remove CH event monitor file '%s'",
> >+ mon->eventmonitorpath);
> >+ }
> >+ g_free(mon->eventmonitorpath);
> >+ }
> >+
>
> Do you really need to remove mon->eventmonitorpath here?
> In patch3, you introduce `virCHStopEventHandler`, which causes the
> thread to exit its while loop and run
> `VIR_FORCE_CLOSE(event_monitor_fd)`, which also deletes the
> event_monitor file.
>
`VIR_FORCE_CLOSE` just closes the fd. The file needs to be explicitly
deleted.
>
>
> > virObjectUnref(mon);
> > }
> >diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
> >index b35f5ea027..2ef8706b99 100644
> >--- a/src/ch/ch_monitor.h
> >+++ b/src/ch/ch_monitor.h
> >@@ -95,6 +95,8 @@ struct _virCHMonitor {
> > char *socketpath;
> >+ char *eventmonitorpath;
> >+
> > pid_t pid;
> > virDomainObj *vm;
>
Regards,
Purna Pavan Chandra
© 2016 - 2026 Red Hat, Inc.