All of lore.kernel.org
 help / color / mirror / Atom feed
* [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe
@ 2024-08-30  9:49 Anthony PERARD
  2024-08-30  9:49 ` [XEN PATCH v2 1/2] libxl: Probe QEMU for -run-with chroot=dir and use it Anthony PERARD
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Anthony PERARD @ 2024-08-30  9:49 UTC (permalink / raw)
  To: xen-devel; +Cc: Anthony PERARD, Juergen Gross

Patch series available in this git branch:
https://xenbits.xen.org/git-http/people/aperard/xen-unstable.git br.libxl-qemu-cmdline-probe-v2

v2:
- removed commited patch
- rename "qemu_cmdline" to "qemu_opts" in struct field and func parameters.
- rename "struct libxl__qemu_available_cmd_line" to
  "struct libxl__qemu_available_opts".

Starting with QEMU 9.0, the option "-chroot", that we use for the
"dmrestrict" feature, is removed. We need to find out which to use
between "-chroot" and "-run-with chroot=dir".

Also, "-runas" is deprecated in QEMU 9.1 and will be remove in a future
release, it's replaced with "-run-with user=user".

To find out which command line option we can use, we'll spawn QEMU, and run the
QMP command "query-command-line-options".

Some example of running these patches:
    with qemu-xen (8.0):
        http://logs.test-lab.xenproject.org/osstest/logs/187352/
    with QEMU (upstream, 9.1-rc3):
        http://logs.test-lab.xenproject.org/osstest/logs/187353/

Anthony PERARD (2):
  libxl: Probe QEMU for -run-with chroot=dir and use it
  libxl: Probe QEMU for -run-with user=user and use it

 tools/libs/light/libxl_dm.c       | 90 +++++++++++++++++++++++++------
 tools/libs/light/libxl_internal.h |  6 +++
 2 files changed, 80 insertions(+), 16 deletions(-)

-- 


Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


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

* [XEN PATCH v2 1/2] libxl: Probe QEMU for -run-with chroot=dir and use it
  2024-08-30  9:49 [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Anthony PERARD
@ 2024-08-30  9:49 ` Anthony PERARD
  2024-08-30  9:49 ` [XEN PATCH v2 2/2] libxl: Probe QEMU for -run-with user=user " Anthony PERARD
  2024-08-30 17:16 ` [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Andrew Cooper
  2 siblings, 0 replies; 4+ messages in thread
From: Anthony PERARD @ 2024-08-30  9:49 UTC (permalink / raw)
  To: xen-devel; +Cc: Anthony PERARD, Jason Andryuk, Juergen Gross

QEMU 9.0 have removed "-chroot" command line option, which have been
deprecated since QEMU 8.1 in favor of "-run-with chroot=dir".

Look into the result of the QMP command "query-command-line-options"
to find out if "-run-with chroot=dir" is available. Then use it in
place of "-chroot".

Resolves: xen-project/xen#187
Signed-off-by: Anthony PERARD <anthony.perard@vates.tech>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---

Notes:
    v2:
    - rename "qemu_cmdline" to "qemu_opts" in struct field and func
      parameters.
    - rename "struct libxl__qemu_available_cmd_line" to
      "struct libxl__qemu_available_opts".

 tools/libs/light/libxl_dm.c       | 78 +++++++++++++++++++++++++------
 tools/libs/light/libxl_internal.h |  5 ++
 2 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c
index 46babfed0b..15b157060f 100644
--- a/tools/libs/light/libxl_dm.c
+++ b/tools/libs/light/libxl_dm.c
@@ -1183,11 +1183,12 @@ static int libxl__pre_open_qmp_socket(libxl__gc *gc, libxl_domid domid,
 }
 
 static int libxl__build_device_model_args_new(libxl__gc *gc,
-                                        const char *dm, int guest_domid,
-                                        const libxl_domain_config *guest_config,
-                                        char ***args, char ***envs,
-                                        const libxl__domain_build_state *state,
-                                        int *dm_state_fd)
+    const char *dm, int guest_domid,
+    const libxl_domain_config *guest_config,
+    char ***args, char ***envs,
+    const libxl__domain_build_state *state,
+    const libxl__qemu_available_opts *qemu_opts,
+    int *dm_state_fd)
 {
     const libxl_domain_create_info *c_info = &guest_config->c_info;
     const libxl_domain_build_info *b_info = &guest_config->b_info;
@@ -1778,8 +1779,13 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
         }
 
         /* Add "-chroot [dir]" to command-line */
-        flexarray_append(dm_args, "-chroot");
-        flexarray_append(dm_args, chroot_dir);
+        if (qemu_opts->have_runwith_chroot) {
+            flexarray_append_pair(dm_args, "-run-with",
+                                  GCSPRINTF("chroot=%s", chroot_dir));
+        } else {
+            flexarray_append(dm_args, "-chroot");
+            flexarray_append(dm_args, chroot_dir);
+        }
     }
 
     if (state->saved_state) {
@@ -2059,11 +2065,12 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
 }
 
 static int libxl__build_device_model_args(libxl__gc *gc,
-                                        const char *dm, int guest_domid,
-                                        const libxl_domain_config *guest_config,
-                                        char ***args, char ***envs,
-                                        const libxl__domain_build_state *state,
-                                        int *dm_state_fd)
+    const char *dm, int guest_domid,
+    const libxl_domain_config *guest_config,
+    char ***args, char ***envs,
+    const libxl__domain_build_state *state,
+    const libxl__qemu_available_opts *qemu_opts,
+    int *dm_state_fd)
 /* dm_state_fd may be NULL iff caller knows we are using stubdom
  * and therefore will be passing a filename rather than a fd. */
 {
@@ -2081,7 +2088,9 @@ static int libxl__build_device_model_args(libxl__gc *gc,
         return libxl__build_device_model_args_new(gc, dm,
                                                   guest_domid, guest_config,
                                                   args, envs,
-                                                  state, dm_state_fd);
+                                                  state,
+                                                  qemu_opts,
+                                                  dm_state_fd);
     default:
         LOGED(ERROR, guest_domid, "unknown device model version %d",
               guest_config->b_info.device_model_version);
@@ -2403,7 +2412,9 @@ void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss)
 
     ret = libxl__build_device_model_args(gc, "stubdom-dm", guest_domid,
                                          guest_config, &args, NULL,
-                                         d_state, NULL);
+                                         d_state,
+                                         &sdss->dm.qemu_opts,
+                                         NULL);
     if (ret) {
         ret = ERROR_FAIL;
         goto out;
@@ -3024,6 +3035,7 @@ static void device_model_probe_detached(libxl__egc *egc,
 static void device_model_probe_cmdline(libxl__egc *egc,
     libxl__ev_qmp *qmp, const libxl__json_object *response, int rc)
 {
+    EGC_GC;
     libxl__dm_spawn_state *dmss = CONTAINER_OF(qmp, *dmss, qmp);
 
     if (rc)
@@ -3033,6 +3045,43 @@ static void device_model_probe_cmdline(libxl__egc *egc,
      * query-command-line-options response:
      * [ { 'option': 'str', 'parameters': [{ 'name': 'str', ... }] } ]
      */
+    const libxl__json_object *option;
+    for (int i_option = 0;
+         (option = libxl__json_array_get(response, i_option));
+         i_option++) {
+        const libxl__json_object *o;
+        const char *opt_str;
+
+        o = libxl__json_map_get("option", option, JSON_STRING);
+        if (!o) {
+            rc = ERROR_QEMU_API;
+            goto out;
+        }
+        opt_str = libxl__json_object_get_string(o);
+
+        if (!strcmp("run-with", opt_str)) {
+            const libxl__json_object *params;
+            const libxl__json_object *item;
+
+            params = libxl__json_map_get("parameters", option, JSON_ARRAY);
+            for (int i = 0; (item = libxl__json_array_get(params, i)); i++) {
+                o = libxl__json_map_get("name", item, JSON_STRING);
+                if (!o) {
+                    rc = ERROR_QEMU_API;
+                    goto out;
+                }
+                if (!strcmp("chroot", libxl__json_object_get_string(o))) {
+                    dmss->qemu_opts.have_runwith_chroot = true;
+                }
+            }
+
+            /*
+             * No need to parse more options, we are only interested with
+             * -run-with at the moment.
+             */
+            break;
+        }
+    }
 
     qmp->callback = device_model_probe_quit;
     rc = libxl__ev_qmp_send(egc, qmp, "quit", NULL);
@@ -3113,6 +3162,7 @@ static void device_model_launch(libxl__egc *egc,
 
     rc = libxl__build_device_model_args(gc, dm, domid, guest_config,
                                           &args, &envs, state,
+                                          &dmss->qemu_opts,
                                           &dm_state_fd);
     if (rc)
         goto out;
diff --git a/tools/libs/light/libxl_internal.h b/tools/libs/light/libxl_internal.h
index e99adc56cb..0133c57e01 100644
--- a/tools/libs/light/libxl_internal.h
+++ b/tools/libs/light/libxl_internal.h
@@ -4142,6 +4142,10 @@ _hidden void libxl__add_nics(libxl__egc *egc, libxl__ao *ao, uint32_t domid,
 /* First layer; wraps libxl__spawn_spawn. */
 
 typedef struct libxl__dm_spawn_state libxl__dm_spawn_state;
+typedef struct libxl__qemu_available_opts libxl__qemu_available_opts;
+struct libxl__qemu_available_opts {
+    bool have_runwith_chroot;
+};
 
 typedef void libxl__dm_spawn_cb(libxl__egc *egc, libxl__dm_spawn_state*,
                                 int rc /* if !0, error was logged */);
@@ -4154,6 +4158,7 @@ struct libxl__dm_spawn_state {
     libxl__ev_qmp qmp;
     libxl__ev_time timeout;
     libxl__dm_resume_state dmrs;
+    libxl__qemu_available_opts qemu_opts;
     const char *dm;
     /* filled in by user, must remain valid: */
     uint32_t guest_domid; /* domain being served */
-- 


Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


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

* [XEN PATCH v2 2/2] libxl: Probe QEMU for -run-with user=user and use it
  2024-08-30  9:49 [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Anthony PERARD
  2024-08-30  9:49 ` [XEN PATCH v2 1/2] libxl: Probe QEMU for -run-with chroot=dir and use it Anthony PERARD
@ 2024-08-30  9:49 ` Anthony PERARD
  2024-08-30 17:16 ` [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Andrew Cooper
  2 siblings, 0 replies; 4+ messages in thread
From: Anthony PERARD @ 2024-08-30  9:49 UTC (permalink / raw)
  To: xen-devel; +Cc: Anthony PERARD, Jason Andryuk, Juergen Gross

"-runas" is deprecated since QEMU 9.1 and will be remove in a future
release.

Signed-off-by: Anthony PERARD <anthony.perard@vates.tech>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---

Notes:
    v2:
    - rename "qemu_cmdline" to "qemu_opts" in struct field and func
      parameters.

 tools/libs/light/libxl_dm.c       | 12 ++++++++++--
 tools/libs/light/libxl_internal.h |  1 +
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c
index 15b157060f..1f2f5bd97a 100644
--- a/tools/libs/light/libxl_dm.c
+++ b/tools/libs/light/libxl_dm.c
@@ -2052,8 +2052,13 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
         }
 
         if (state->dm_runas) {
-            flexarray_append(dm_args, "-runas");
-            flexarray_append(dm_args, state->dm_runas);
+            if (qemu_opts->have_runwith_user) {
+                flexarray_append_pair(dm_args, "-run-with",
+                                      GCSPRINTF("user=%s", state->dm_runas));
+            } else {
+                flexarray_append(dm_args, "-runas");
+                flexarray_append(dm_args, state->dm_runas);
+            }
         }
     }
     flexarray_append(dm_args, NULL);
@@ -3073,6 +3078,9 @@ static void device_model_probe_cmdline(libxl__egc *egc,
                 if (!strcmp("chroot", libxl__json_object_get_string(o))) {
                     dmss->qemu_opts.have_runwith_chroot = true;
                 }
+                else if (!strcmp("user", libxl__json_object_get_string(o))) {
+                    dmss->qemu_opts.have_runwith_user = true;
+                }
             }
 
             /*
diff --git a/tools/libs/light/libxl_internal.h b/tools/libs/light/libxl_internal.h
index 0133c57e01..089a2f949c 100644
--- a/tools/libs/light/libxl_internal.h
+++ b/tools/libs/light/libxl_internal.h
@@ -4145,6 +4145,7 @@ typedef struct libxl__dm_spawn_state libxl__dm_spawn_state;
 typedef struct libxl__qemu_available_opts libxl__qemu_available_opts;
 struct libxl__qemu_available_opts {
     bool have_runwith_chroot;
+    bool have_runwith_user;
 };
 
 typedef void libxl__dm_spawn_cb(libxl__egc *egc, libxl__dm_spawn_state*,
-- 


Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


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

* Re: [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe
  2024-08-30  9:49 [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Anthony PERARD
  2024-08-30  9:49 ` [XEN PATCH v2 1/2] libxl: Probe QEMU for -run-with chroot=dir and use it Anthony PERARD
  2024-08-30  9:49 ` [XEN PATCH v2 2/2] libxl: Probe QEMU for -run-with user=user " Anthony PERARD
@ 2024-08-30 17:16 ` Andrew Cooper
  2 siblings, 0 replies; 4+ messages in thread
From: Andrew Cooper @ 2024-08-30 17:16 UTC (permalink / raw)
  To: Anthony PERARD, xen-devel; +Cc: Juergen Gross

On 30/08/2024 10:49 am, Anthony PERARD wrote:
> Patch series available in this git branch:
> https://xenbits.xen.org/git-http/people/aperard/xen-unstable.git br.libxl-qemu-cmdline-probe-v2
>
> v2:
> - removed commited patch
> - rename "qemu_cmdline" to "qemu_opts" in struct field and func parameters.
> - rename "struct libxl__qemu_available_cmd_line" to
>   "struct libxl__qemu_available_opts".
>
> Starting with QEMU 9.0, the option "-chroot", that we use for the
> "dmrestrict" feature, is removed. We need to find out which to use
> between "-chroot" and "-run-with chroot=dir".
>
> Also, "-runas" is deprecated in QEMU 9.1 and will be remove in a future
> release, it's replaced with "-run-with user=user".
>
> To find out which command line option we can use, we'll spawn QEMU, and run the
> QMP command "query-command-line-options".
>
> Some example of running these patches:
>     with qemu-xen (8.0):
>         http://logs.test-lab.xenproject.org/osstest/logs/187352/
>     with QEMU (upstream, 9.1-rc3):
>         http://logs.test-lab.xenproject.org/osstest/logs/187353/
>
> Anthony PERARD (2):
>   libxl: Probe QEMU for -run-with chroot=dir and use it
>   libxl: Probe QEMU for -run-with user=user and use it
>
>  tools/libs/light/libxl_dm.c       | 90 +++++++++++++++++++++++++------
>  tools/libs/light/libxl_internal.h |  6 +++
>  2 files changed, 80 insertions(+), 16 deletions(-)

I've committed these as they're fully reviewed, but I think this
warrants a CHANGELOG.md update as we're fixing libxl to work with newer
QEMU.

~Andrew


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

end of thread, other threads:[~2024-08-30 17:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-30  9:49 [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Anthony PERARD
2024-08-30  9:49 ` [XEN PATCH v2 1/2] libxl: Probe QEMU for -run-with chroot=dir and use it Anthony PERARD
2024-08-30  9:49 ` [XEN PATCH v2 2/2] libxl: Probe QEMU for -run-with user=user " Anthony PERARD
2024-08-30 17:16 ` [XEN PATCH v2 0/2] libxl: Implement QEMU command line probe Andrew Cooper

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.