[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] libxl: add basic spice support for pv domUs



On Tue, Dec 01, 2015 at 05:04:35PM +0100, Fabio Fantoni wrote:
> This patch adds basic spice support for pv domUs.
> The qemu parameters are the same as the hvm ones and they works.
> Therefore xl cfg parameters are the same as the hvm ones except that
> features not supported yet by pv domUs (vdagent and usbredirection)
> are kept disabled by default.
> It also enables vfb and vkb required to have basic spice working.
> 
> Signed-off-by: Fabio Fantoni <fabio.fantoni@xxxxxxx>
> 
> ---
> 
> Notes:
> - The vfb part is only a draft and needs to be improved.
> - Patch is tested and working, except for the pointer not
> visible in some cases with pv domUs but always working.
> - I not use the api, test the u.hvm.spice retro-compatibility with
> api is needed.
> 
> Any feedback is appreciated.
> 
> Changes in v8:
> - refresh all for xen 4.7
> 
> Changes in v7:
> - refresh xl_sxp.c
> 
> Changes in v6:
> - refresh libxl_create.c
> 
> Changes in v5:
> - libxl_create.c: * don't copy u.hvm.spice in the newer if
> the newer is already used
> * set default for all spice bool options in any case
> * spice features not supported in pv will be disabled and
> will show a warning about them if was setted enabled
> - xl_cmdimpl.c: parse all spice options out of hvm part
> - libxl_dm.c: changed some forgotten u.hvm.spice to spice
> 
> Changes in v4:
> - added libxl.h changes
> - libxl_create.c: added older u.hvm.spice compatibility
> copying it in newer one
> 
> Changes in v3:
> - xl.cfg.pod.5: moved spice out of hvm section and specified
> the features for now hvm only.
> - libxl_types.idl: added spice struct out of keyedunion hvm only.
> - use new generic spice struct instead of hvm only ones.
> 
> Changes in v2:
> - xl_cmdimpl.c: always set vnc and sdl toplevel parameters in &vfb
> with vnc or spice enabled on pv domUs otherwise in some cases it
> would fail with error for one bool default value missing.
> - libxl_dm.c: do not add -nographic if spice is enabled, even though
> -nographic seems buggy in upstream qemu.
> ---
>  docs/man/xl.cfg.pod.5       | 155 
> ++++++++++++++++++++++----------------------
>  tools/libxl/libxl.h         |  13 ++++
>  tools/libxl/libxl_create.c  |  49 +++++++++-----
>  tools/libxl/libxl_dm.c      |  39 ++++++-----
>  tools/libxl/libxl_types.idl |   3 +-
>  tools/libxl/xl_cmdimpl.c    |  51 ++++++++-------
>  tools/libxl/xl_sxp.c        |  12 ++--
>  7 files changed, 179 insertions(+), 143 deletions(-)
> 
> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
> index 3b695bd..04a96ba 100644
> --- a/docs/man/xl.cfg.pod.5
> +++ b/docs/man/xl.cfg.pod.5
> @@ -1607,82 +1607,6 @@ it.
>  
>  =back
>  
> -=head3 Spice Graphics Support
> -
> -The following options control the features of SPICE.
> -
> -=over 4
> -
> -=item B<spice=BOOLEAN>
> -

To be honest I'm a bit confused by this large hunk. Did you notice some
sort of misplacement of this section? Or is it your editor is using
different wrapping setting?

>  =head2 Keymaps
>  
>  The keymaps available are defined by the device-model which you are
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index 6b73848..a5cbcfc 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -510,6 +510,19 @@ typedef struct libxl__ctx libxl_ctx;
>  #define LIBXL_HAVE_BUILDINFO_USBVERSION 1
>  
>  /*
> + * LIBXL_HAVE_BUILDINFO_SPICE
> + *
> + * If this is defined, then the libxl_domain_build_info structure will
> + * contain spice, a libxl_spice_info struct instead of older hvm.spice one
> + * which is now deprecated.
> + *

This reads like hvm.spice is removed but I think hvm.spice still exists.

> + * If it is set, callers may use spice to specify the spice values.
> + *

May use which one? hvm.spice or the new spice (libxl_spice_info).

> + * If this is not defined, the spice struct does not exist.
> + */
> +#define LIBXL_HAVE_BUILDINFO_SPICE 1
> +
> +/*
>   * LIBXL_HAVE_DEVICE_BACKEND_DOMNAME
>   *
>   * If this is defined, libxl_device_* structures containing a backend_domid
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index 8770486..a1853dc 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -195,6 +195,19 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
>      if (!b_info->event_channels)
>          b_info->event_channels = 1023;
>  
> +    /* If older u.hvm.spice is enabled then propagate it to the top level */
> +    libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);

This is wrong -- don't set u.hvm without checking the guest is actually
hvm guest.

> +    libxl_defbool_setdefault(&b_info->spice.enable, false);
> +    if (!libxl_defbool_val(b_info->spice.enable) &&
> +        libxl_defbool_val(b_info->u.hvm.spice.enable)) {
> +            b_info->spice = b_info->u.hvm.spice;

Please use libxl_spice_info_copy (an autogenerated function) to do the
copying.  Doing a shallow copy like this is prone to error -- consider
in the future your structure contains pointers to allocated memory,
doing shallow copy will cause double free.

> +    }
> +
> +    libxl_defbool_setdefault(&b_info->spice.disable_ticketing, false);
> +    libxl_defbool_setdefault(&b_info->spice.agent_mouse, true);
> +    libxl_defbool_setdefault(&b_info->spice.vdagent, false);
> +    libxl_defbool_setdefault(&b_info->spice.clipboard_sharing, false);
> +
>      switch (b_info->type) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>          if (b_info->shadow_memkb == LIBXL_MEMKB_DEFAULT)
> @@ -291,18 +304,17 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
>          libxl_defbool_setdefault(&b_info->u.hvm.usb,                false);
>          libxl_defbool_setdefault(&b_info->u.hvm.xen_platform_pci,   true);
>  
> -        libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);
> -        if (!libxl_defbool_val(b_info->u.hvm.spice.enable) &&
> -            (b_info->u.hvm.spice.usbredirection > 0) ){
> -            b_info->u.hvm.spice.usbredirection = 0;
> -            LOG(WARN, "spice disabled, disabling usbredirection");
> +        if (!libxl_defbool_val(b_info->spice.enable) &&
> +            (b_info->spice.usbredirection > 0) ){
> +            b_info->spice.usbredirection = 0;
> +            LOG(WARN,"spice disabled, disabling usbredirection");
>          }
>  
>          if (!b_info->u.hvm.usbversion &&
> -            (b_info->u.hvm.spice.usbredirection > 0) )
> +            (b_info->spice.usbredirection > 0) )
>              b_info->u.hvm.usbversion = 2;
>  
> -        if ((b_info->u.hvm.usbversion || b_info->u.hvm.spice.usbredirection) 
> &&
> +        if ((b_info->u.hvm.usbversion || b_info->spice.usbredirection) &&
>              ( libxl_defbool_val(b_info->u.hvm.usb)
>              || b_info->u.hvm.usbdevice_list
>              || b_info->u.hvm.usbdevice) ){
> @@ -330,15 +342,6 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
>              libxl_defbool_setdefault(&b_info->u.hvm.sdl.opengl, false);
>          }
>  
> -        if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
> -            libxl_defbool_setdefault(&b_info->u.hvm.spice.disable_ticketing,
> -                                     false);
> -            libxl_defbool_setdefault(&b_info->u.hvm.spice.agent_mouse, true);
> -            libxl_defbool_setdefault(&b_info->u.hvm.spice.vdagent, false);
> -            libxl_defbool_setdefault(&b_info->u.hvm.spice.clipboard_sharing,
> -                                     false);
> -        }
> -
>          libxl_defbool_setdefault(&b_info->u.hvm.nographic, false);
>  
>          libxl_defbool_setdefault(&b_info->u.hvm.gfx_passthru, false);
> @@ -372,6 +375,20 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
>              b_info->cmdline = b_info->u.pv.cmdline;
>              b_info->u.pv.cmdline = NULL;
>          }
> +
> +        if (libxl_defbool_val(b_info->spice.vdagent)) {
> +            libxl_defbool_set(&b_info->spice.vdagent, false);
> +            LOG(WARN, "vdagent is not supported for PV guests");
> +        }
> +        if (libxl_defbool_val(b_info->spice.clipboard_sharing)) {
> +            libxl_defbool_set(&b_info->spice.clipboard_sharing, false);
> +            LOG(WARN, "clipboard sharing is not supported for PV guests");
> +        }
> +        if (b_info->spice.usbredirection > 0) {
> +            b_info->spice.usbredirection = 0;
> +            LOG(WARN, "usbredirection is not supported for PV guests");
> +        }
> +

Is there any support matrix in QEMU that can be used as reference?

>          break;
>      default:
>          LOG(ERROR, "invalid domain type %s in create info",
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index a4934df..bf7cf1c 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -897,6 +897,21 @@ static int libxl__build_device_model_args_new(libxl__gc 
> *gc,
>          flexarray_vappend(dm_args, "-k", keymap, NULL);
>      }
>  
> +    if (libxl_defbool_val(b_info->spice.enable)) {
> +        const libxl_spice_info *spice = &b_info->spice;
> +        char *spiceoptions = dm_spice_options(gc, spice);
> +        if (!spiceoptions)
> +            return ERROR_INVAL;
> +
> +        flexarray_append(dm_args, "-spice");
> +        flexarray_append(dm_args, spiceoptions);
> +        if (libxl_defbool_val(b_info->spice.vdagent)) {
> +            flexarray_vappend(dm_args, "-device", "virtio-serial",
> +                "-chardev", "spicevmc,id=vdagent,name=vdagent", "-device",
> +                "virtserialport,chardev=vdagent,name=com.redhat.spice.0", 
> NULL);

There is hardcoded string here. Any reference why it is used?

> +        }
> +    }
> +
>      if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
>          int ioemu_nics = 0;
>  
> @@ -934,22 +949,6 @@ static int libxl__build_device_model_args_new(libxl__gc 
> *gc,
>              flexarray_append(dm_args, "-nographic");
>          }
>  
> -        if (libxl_defbool_val(b_info->u.hvm.spice.enable)) {
> -            const libxl_spice_info *spice = &b_info->u.hvm.spice;
> -            char *spiceoptions = dm_spice_options(gc, spice);
> -            if (!spiceoptions)
> -                return ERROR_INVAL;
> -
> -            flexarray_append(dm_args, "-spice");
> -            flexarray_append(dm_args, spiceoptions);
> -            if (libxl_defbool_val(b_info->u.hvm.spice.vdagent)) {
> -                flexarray_vappend(dm_args, "-device", "virtio-serial",
> -                    "-chardev", "spicevmc,id=vdagent,name=vdagent", 
> "-device",
> -                    "virtserialport,chardev=vdagent,name=com.redhat.spice.0",
> -                    NULL);
> -            }
> -        }
> -
>          switch (b_info->u.hvm.vga.kind) {
>          case LIBXL_VGA_INTERFACE_TYPE_STD:
>              flexarray_append_pair(dm_args, "-device",
> @@ -1021,9 +1020,9 @@ static int libxl__build_device_model_args_new(libxl__gc 
> *gc,
>                      "must be between 1 and 3");
>                  return ERROR_INVAL;
>              }
> -            if (b_info->u.hvm.spice.usbredirection >= 0 &&
> -                b_info->u.hvm.spice.usbredirection < 5) {
> -                for (i = 1; i <= b_info->u.hvm.spice.usbredirection; i++)
> +            if (b_info->spice.usbredirection >= 0 &&
> +                b_info->spice.usbredirection < 5) {
> +                for (i = 1; i <= b_info->spice.usbredirection; i++)
>                      flexarray_vappend(dm_args, "-chardev",
>                          GCSPRINTF("spicevmc,name=usbredir,id=usbrc%d", i),
>                          "-device",
> @@ -1081,7 +1080,7 @@ static int libxl__build_device_model_args_new(libxl__gc 
> *gc,
>              flexarray_append(dm_args, "none");
>          }
>      } else {
> -        if (!sdl && !vnc) {
> +        if (!sdl && !vnc && !libxl_defbool_val(b_info->spice.enable)) {
>              flexarray_append(dm_args, "-nographic");
>          }
>      }
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index cf3730f..354af0a 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -455,7 +455,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>      ("ioports",          Array(libxl_ioport_range, "num_ioports")),
>      ("irqs",             Array(uint32, "num_irqs")),
>      ("iomem",            Array(libxl_iomem_range, "num_iomem")),
> -    ("claim_mode",        libxl_defbool),
> +    ("claim_mode",       libxl_defbool),

Unrelated change.


Wei.

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.