Patchwork [V9,15/16] xen: Set running state in xenstore.

login
register
mail settings
Submitter Anthony PERARD
Date Jan. 25, 2011, 2:29 p.m.
Message ID <1295965760-31508-16-git-send-email-anthony.perard@citrix.com>
Download mbox | patch
Permalink /patch/80366/
State New
Headers show

Comments

Anthony PERARD - Jan. 25, 2011, 2:29 p.m.
From: Anthony PERARD <anthony.perard@citrix.com>

This tells to the xen management tool that the machine can begin run.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 xen-all.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)
Anthony Liguori - Jan. 26, 2011, 11:12 p.m.
On 01/25/2011 08:29 AM, anthony.perard@citrix.com wrote:
> From: Anthony PERARD<anthony.perard@citrix.com>
>
> This tells to the xen management tool that the machine can begin run.
>
> Signed-off-by: Anthony PERARD<anthony.perard@citrix.com>
> ---
>   xen-all.c |   27 +++++++++++++++++++++++++++
>   1 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/xen-all.c b/xen-all.c
> index a0248ee..c2d37d6 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -58,6 +58,8 @@ typedef struct XenIOState {
>       /* which vcpu we are serving */
>       int send_vcpu;
>
> +    struct xs_handle *xenstore;
> +
>       Notifier exit;
>   } XenIOState;
>
> @@ -426,6 +428,21 @@ static void cpu_handle_ioreq(void *opaque)
>       }
>   }
>
> +static void xenstore_record_dm_state(XenIOState *s, const char *state)
> +{
> +    char *path = NULL;
> +
> +    if (asprintf(&path, "/local/domain/0/device-model/%u/state", xen_domid) == -1) {
> +        fprintf(stderr, "out of memory recording dm state\n");
> +        exit(1);
> +    }
>    

asprintf() is very unportable.

> +    if (!xs_write(s->xenstore, XBT_NULL, path, state, strlen(state))) {
> +        fprintf(stderr, "error recording dm state\n");
> +        exit(1);
> +    }
> +    free(path);
> +}
> +
>   static void xen_main_loop_prepare(XenIOState *state)
>   {
>       int evtchn_fd = -1;
> @@ -441,6 +458,9 @@ static void xen_main_loop_prepare(XenIOState *state)
>       if (evtchn_fd != -1) {
>           qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
>       }
> +
> +    /* record state running */
> +    xenstore_record_dm_state(state, "running");
>   }
>
>
> @@ -459,6 +479,7 @@ static void xen_exit_notifier(Notifier *n)
>       XenIOState *state = container_of(n, XenIOState, exit);
>
>       xc_evtchn_close(state->xce_handle);
> +    xs_daemon_close(state->xenstore);
>   }
>
>   int xen_init(int smp_cpus)
> @@ -484,6 +505,12 @@ int xen_init(int smp_cpus)
>           return -errno;
>       }
>
> +    state->xenstore = xs_daemon_open();
> +    if (state->xenstore == NULL) {
> +        perror("xen: xenstore open");
> +        return -errno;
> +    }
> +
>       state->exit.notify = xen_exit_notifier;
>       qemu_add_exit_notifier(&state->exit);
>
>

Patch

diff --git a/xen-all.c b/xen-all.c
index a0248ee..c2d37d6 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -58,6 +58,8 @@  typedef struct XenIOState {
     /* which vcpu we are serving */
     int send_vcpu;
 
+    struct xs_handle *xenstore;
+
     Notifier exit;
 } XenIOState;
 
@@ -426,6 +428,21 @@  static void cpu_handle_ioreq(void *opaque)
     }
 }
 
+static void xenstore_record_dm_state(XenIOState *s, const char *state)
+{
+    char *path = NULL;
+
+    if (asprintf(&path, "/local/domain/0/device-model/%u/state", xen_domid) == -1) {
+        fprintf(stderr, "out of memory recording dm state\n");
+        exit(1);
+    }
+    if (!xs_write(s->xenstore, XBT_NULL, path, state, strlen(state))) {
+        fprintf(stderr, "error recording dm state\n");
+        exit(1);
+    }
+    free(path);
+}
+
 static void xen_main_loop_prepare(XenIOState *state)
 {
     int evtchn_fd = -1;
@@ -441,6 +458,9 @@  static void xen_main_loop_prepare(XenIOState *state)
     if (evtchn_fd != -1) {
         qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
     }
+
+    /* record state running */
+    xenstore_record_dm_state(state, "running");
 }
 
 
@@ -459,6 +479,7 @@  static void xen_exit_notifier(Notifier *n)
     XenIOState *state = container_of(n, XenIOState, exit);
 
     xc_evtchn_close(state->xce_handle);
+    xs_daemon_close(state->xenstore);
 }
 
 int xen_init(int smp_cpus)
@@ -484,6 +505,12 @@  int xen_init(int smp_cpus)
         return -errno;
     }
 
+    state->xenstore = xs_daemon_open();
+    if (state->xenstore == NULL) {
+        perror("xen: xenstore open");
+        return -errno;
+    }
+
     state->exit.notify = xen_exit_notifier;
     qemu_add_exit_notifier(&state->exit);