All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libxl: add "xl qemu-monitor-command"
@ 2016-09-05  9:29 Juergen Gross
  2016-09-05 10:32 ` Ian Jackson
  0 siblings, 1 reply; 5+ messages in thread
From: Juergen Gross @ 2016-09-05  9:29 UTC (permalink / raw)
  To: xen-devel; +Cc: Juergen Gross, wei.liu2, ian.jackson

Add a new xl command "qemu-monitor-command" to issue arbitrary commands
to a domain's device model. Syntax is:

xl qemu-monitor-command <domain> <command>

The command is issued via qmp human-monitor-command command. Any
information returned by the command is printed to stdout.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 docs/man/xl.pod.1.in           | 21 +++++++++++++++++++++
 tools/libxl/libxl.h            | 14 ++++++++++++++
 tools/libxl/libxl_colo_qdisk.c |  2 +-
 tools/libxl/libxl_internal.h   |  3 ++-
 tools/libxl/libxl_qmp.c        | 38 ++++++++++++++++++++++++++++++++++++--
 tools/libxl/xl.h               |  1 +
 tools/libxl/xl_cmdimpl.c       | 27 +++++++++++++++++++++++++++
 tools/libxl/xl_cmdtable.c      |  5 +++++
 8 files changed, 107 insertions(+), 4 deletions(-)

diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in
index 1adf322..f1bf9b2 100644
--- a/docs/man/xl.pod.1.in
+++ b/docs/man/xl.pod.1.in
@@ -1516,6 +1516,27 @@ List pass-through usb devices for a domain.
 
 =back
 
+=head1 DEVICE-MODEL CONTROL
+
+=over 4
+
+=item B<qemu-monitor-command> I<domain-id> I<command>
+
+Issue a monitor command to the device model of the domain specified by
+I<domain-id>. I<command> can be any valid command qemu understands. This
+can be e.g. used to add non-standard devices or devices with non-standard
+parameters to a domain. The output of the command is printed to stdout.
+
+B<EXAMPLE>
+
+Obtain information of USB devices connected via the device model to a
+domain:
+
+ xl qemu-monitor-command vm1 'info usb'
+  Device 0.2, Port 5, Speed 480 Mb/s, Product Mass Storage
+
+=back
+
 =head1 TMEM
 
 =over 4
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index e4c25c4..7cfa540 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -275,6 +275,12 @@
 #define LIBXL_HAVE_BUILD_ID 1
 
 /*
+ * LIBXL_HAVE_QEMU_MONITOR_COMMAND indiactes the availability of the
+ * libxl_qemu_monitor_command() function.
+ */
+#define LIBXL_HAVE_QEMU_MONITOR_COMMAND 1
+
+/*
  * libxl ABI compatibility
  *
  * The only guarantee which libxl makes regarding ABI compatibility
@@ -2152,6 +2158,14 @@ void libxl_psr_cat_info_list_free(libxl_psr_cat_info *list, int nr);
 int libxl_fd_set_cloexec(libxl_ctx *ctx, int fd, int cloexec);
 int libxl_fd_set_nonblock(libxl_ctx *ctx, int fd, int nonblock);
 
+/*
+ * Issue a qmp monitor command to the device model of the specified domain.
+ * The function returns the output of the command in a new allocated buffer
+ * via output.
+ */
+int libxl_qemu_monitor_command(libxl_ctx *ctx, uint32_t domid,
+                               const char *command_line, char **output);
+
 #include <libxl_event.h>
 
 #endif /* LIBXL_H */
diff --git a/tools/libxl/libxl_colo_qdisk.c b/tools/libxl/libxl_colo_qdisk.c
index c23b81b..d271d1f 100644
--- a/tools/libxl/libxl_colo_qdisk.c
+++ b/tools/libxl/libxl_colo_qdisk.c
@@ -173,7 +173,7 @@ static void colo_qdisk_save_preresume(libxl__egc *egc,
                     "file.driver=nbd,file.host=%s,file.port=%d,"
                     "file.export=%s,node-name=%s,if=none",
                     host, port, export_name, node);
-    ret = libxl__qmp_hmp(gc, domid, cmd);
+    ret = libxl__qmp_hmp(gc, domid, cmd, NULL);
     if (ret)
         rc = ERROR_FAIL;
 
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index ce8e17a..9f534c4 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1818,7 +1818,8 @@ _hidden int libxl__qmp_x_blockdev_change(libxl__gc *gc, int domid,
                                          const char *parant,
                                          const char *child, const char *node);
 /* run a hmp command in qmp mode */
-_hidden int libxl__qmp_hmp(libxl__gc *gc, int domid, const char *command_line);
+_hidden int libxl__qmp_hmp(libxl__gc *gc, int domid, const char *command_line,
+                           char **out);
 /* close and free the QMP handler */
 _hidden void libxl__qmp_close(libxl__qmp_handler *qmp);
 /* remove the socket file, if the file has already been removed,
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 63c49c5..33883b8 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -1103,14 +1103,48 @@ int libxl__qmp_x_blockdev_change(libxl__gc *gc, int domid, const char *parent,
     return qmp_run_command(gc, domid, "x-blockdev-change", args, NULL, NULL);
 }
 
-int libxl__qmp_hmp(libxl__gc *gc, int domid, const char *command_line)
+static int hmp_callback(libxl__qmp_handler *qmp,
+                        const libxl__json_object *response,
+                        void *opaque)
+{
+    char **output = opaque;
+    GC_INIT(qmp->ctx);
+    int rc = 0;
+
+    if (!output)
+        goto out;
+
+    *output = NULL;
+
+    if (libxl__json_object_is_string(response)) {
+        *output = libxl__strdup(gc, libxl__json_object_get_string(response));
+        goto out;
+    }
+
+    LOG(ERROR, "Response has unexpected format");
+    rc = ERROR_FAIL;
+
+out:
+    return rc;
+}
+
+int libxl__qmp_hmp(libxl__gc *gc, int domid, const char *command_line,
+                   char **output)
 {
     libxl__json_object *args = NULL;
 
     qmp_parameters_add_string(gc, &args, "command-line", command_line);
 
     return qmp_run_command(gc, domid, "human-monitor-command", args,
-                           NULL, NULL);
+                           hmp_callback, output);
+}
+
+int libxl_qemu_monitor_command(libxl_ctx *ctx, uint32_t domid,
+                               const char *command_line, char **output)
+{
+    GC_INIT(ctx);
+
+    return libxl__qmp_hmp(gc, domid, command_line, output);
 }
 
 int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid,
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index e601ca1..0a8c813 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -133,6 +133,7 @@ int main_psr_cmt_show(int argc, char **argv);
 int main_psr_cat_cbm_set(int argc, char **argv);
 int main_psr_cat_show(int argc, char **argv);
 #endif
+int main_qemu_monitor_command(int argc, char **argv);
 
 void help(const char *command);
 
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 7540fb1..ad2cba5 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -9536,6 +9536,33 @@ int main_psr_hwinfo(int argc, char **argv)
 
 #endif
 
+int main_qemu_monitor_command(int argc, char **argv)
+{
+    int opt;
+    uint32_t domid;
+    char *cmd;
+    char *output;
+    int ret;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "qemu-monitor-command", 2) {
+        /* No options */
+    }
+
+    domid = find_domain(argv[optind]);
+    cmd = argv[optind + 1];
+
+    if (argc - optind > 2) {
+        fprintf(stderr, "Invalid arguments.\n");
+        return 1;
+    }
+
+    ret = libxl_qemu_monitor_command(ctx, domid, cmd, &output);
+    if (!ret && output)
+        printf("%s\n", output);
+
+    return ret;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index 85c1e0f..78786fe 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -584,6 +584,11 @@ struct cmd_spec cmd_table[] = {
       "List information about all USB controllers and devices for a domain",
       "<Domain>",
     },
+    { "qemu-monitor-command",
+      &main_qemu_monitor_command, 0, 1,
+      "Issue a qemu monitor command to the device model of a domain",
+      "<Domain> <Command>",
+    },
 };
 
 int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);
-- 
2.6.6


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add "xl qemu-monitor-command"
  2016-09-05  9:29 [PATCH] libxl: add "xl qemu-monitor-command" Juergen Gross
@ 2016-09-05 10:32 ` Ian Jackson
  2016-09-05 11:30   ` Juergen Gross
  0 siblings, 1 reply; 5+ messages in thread
From: Ian Jackson @ 2016-09-05 10:32 UTC (permalink / raw)
  To: Juergen Gross; +Cc: wei.liu2, xen-devel

Juergen Gross writes ("[PATCH] libxl: add "xl qemu-monitor-command""):
> Add a new xl command "qemu-monitor-command" to issue arbitrary commands
> to a domain's device model. Syntax is:
> 
> xl qemu-monitor-command <domain> <command>
> 
> The command is issued via qmp human-monitor-command command. Any
> information returned by the command is printed to stdout.
...
> +=item B<qemu-monitor-command> I<domain-id> I<command>
> +
> +Issue a monitor command to the device model of the domain specified by
> +I<domain-id>. I<command> can be any valid command qemu understands. This
> +can be e.g. used to add non-standard devices or devices with non-standard
> +parameters to a domain. The output of the command is printed to stdout.

This needs some kind of health warning.  Something like:

 Warning: This qemu monitor access is provided for convenience when
 debugging, troubleshooting, and experimenting.  Its use is not
 supported by the Xen Project.

 Specifically, not all information printed by the qemu monitor will
 necessarily be accurate or complete, because in a Xen system qemu
 does not have a complete view of the guest.

 Furthermore, modifying the guest's setup via the qemu monitor may
 conflict with the Xen toolstack's assumptions.  Resulting problems
 may include, but are not limited to: guest crashes; toolstack error
 messages; inability to migrate the guest; and security
 vulnerabilities which are not covered by the Xen Project security
 response policy.

The rest of the documentation will need adjusting.  As an example of
the incompleteness I am talking about I think the example shows only
some of the USB devices presented to the guest.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add "xl qemu-monitor-command"
  2016-09-05 10:32 ` Ian Jackson
@ 2016-09-05 11:30   ` Juergen Gross
  2016-09-05 12:18     ` Ian Jackson
  0 siblings, 1 reply; 5+ messages in thread
From: Juergen Gross @ 2016-09-05 11:30 UTC (permalink / raw)
  To: Ian Jackson; +Cc: wei.liu2, xen-devel

On 05/09/16 12:32, Ian Jackson wrote:
> Juergen Gross writes ("[PATCH] libxl: add "xl qemu-monitor-command""):
>> Add a new xl command "qemu-monitor-command" to issue arbitrary commands
>> to a domain's device model. Syntax is:
>>
>> xl qemu-monitor-command <domain> <command>
>>
>> The command is issued via qmp human-monitor-command command. Any
>> information returned by the command is printed to stdout.
> ...
>> +=item B<qemu-monitor-command> I<domain-id> I<command>
>> +
>> +Issue a monitor command to the device model of the domain specified by
>> +I<domain-id>. I<command> can be any valid command qemu understands. This
>> +can be e.g. used to add non-standard devices or devices with non-standard
>> +parameters to a domain. The output of the command is printed to stdout.
> 
> This needs some kind of health warning.  Something like:
> 
>  Warning: This qemu monitor access is provided for convenience when
>  debugging, troubleshooting, and experimenting.  Its use is not
>  supported by the Xen Project.
> 
>  Specifically, not all information printed by the qemu monitor will
>  necessarily be accurate or complete, because in a Xen system qemu
>  does not have a complete view of the guest.
> 
>  Furthermore, modifying the guest's setup via the qemu monitor may
>  conflict with the Xen toolstack's assumptions.  Resulting problems
>  may include, but are not limited to: guest crashes; toolstack error
>  messages; inability to migrate the guest; and security
>  vulnerabilities which are not covered by the Xen Project security
>  response policy.

Thanks for the complete text! I'll add it to the man page.

> The rest of the documentation will need adjusting.  As an example of
> the incompleteness I am talking about I think the example shows only
> some of the USB devices presented to the guest.

Hmm, I think the statement:

+Obtain information of USB devices connected via the device model to a
+domain:

is absolutely correct. Which USB devices connected via the device model
won't be shown?


Juergen

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add "xl qemu-monitor-command"
  2016-09-05 11:30   ` Juergen Gross
@ 2016-09-05 12:18     ` Ian Jackson
  2016-09-05 12:29       ` Juergen Gross
  0 siblings, 1 reply; 5+ messages in thread
From: Ian Jackson @ 2016-09-05 12:18 UTC (permalink / raw)
  To: Juergen Gross; +Cc: wei.liu2, xen-devel

Juergen Gross writes ("Re: [PATCH] libxl: add "xl qemu-monitor-command""):
> On 05/09/16 12:32, Ian Jackson wrote:
> > The rest of the documentation will need adjusting.  As an example of
> > the incompleteness I am talking about I think the example shows only
> > some of the USB devices presented to the guest.
> 
> Hmm, I think the statement:
> 
> +Obtain information of USB devices connected via the device model to a
> +domain:
> 
> is absolutely correct. Which USB devices connected via the device model
> won't be shown?

Well, technically the statement is true.  But it's a bear trap for the
incautious (or hurried) reader.  Perhaps add `(only!)' after `device
model' ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add "xl qemu-monitor-command"
  2016-09-05 12:18     ` Ian Jackson
@ 2016-09-05 12:29       ` Juergen Gross
  0 siblings, 0 replies; 5+ messages in thread
From: Juergen Gross @ 2016-09-05 12:29 UTC (permalink / raw)
  To: Ian Jackson; +Cc: wei.liu2, xen-devel

On 05/09/16 14:18, Ian Jackson wrote:
> Juergen Gross writes ("Re: [PATCH] libxl: add "xl qemu-monitor-command""):
>> On 05/09/16 12:32, Ian Jackson wrote:
>>> The rest of the documentation will need adjusting.  As an example of
>>> the incompleteness I am talking about I think the example shows only
>>> some of the USB devices presented to the guest.
>>
>> Hmm, I think the statement:
>>
>> +Obtain information of USB devices connected via the device model to a
>> +domain:
>>
>> is absolutely correct. Which USB devices connected via the device model
>> won't be shown?
> 
> Well, technically the statement is true.  But it's a bear trap for the
> incautious (or hurried) reader.  Perhaps add `(only!)' after `device
> model' ?

Sure, I can do that. And perhaps I should say:

Obtain information of USB devices connected as such via the device
model (only!) to a domain.

Just in case somebody connects e.g. a USB stick as a disk...


Juergen

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-09-05 12:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-05  9:29 [PATCH] libxl: add "xl qemu-monitor-command" Juergen Gross
2016-09-05 10:32 ` Ian Jackson
2016-09-05 11:30   ` Juergen Gross
2016-09-05 12:18     ` Ian Jackson
2016-09-05 12:29       ` Juergen Gross

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.