Jiang XueQian <jiangxueq...@gmail.com> writes:

> This property passes socket of a externally started virgl_render_server
> to virglrenderer, so that it won't try to spawn new process and get
> killed by seccomp, allowing virtio-gpu-gl venus and sandbox to enable
> at the same time.

Do we have an example of how to start such a virgl server?
docs/syste,/devices/virtio-gpu.rst could be expanded with some example
invocations of the various modes.

>
> Signed-off-by: Jiang XueQian <jiangxueq...@gmail.com>
> ---
>  hw/display/virtio-gpu-gl.c     | 15 +++++++++++++++
>  hw/display/virtio-gpu-virgl.c  | 17 +++++++++++++++++
>  include/hw/virtio/virtio-gpu.h |  2 ++
>  3 files changed, 34 insertions(+)
>
> diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c
> index 683fad3bf8..e7c89f7c29 100644
> --- a/hw/display/virtio-gpu-gl.c
> +++ b/hw/display/virtio-gpu-gl.c
> @@ -22,6 +22,7 @@
>  #include "hw/virtio/virtio-gpu-bswap.h"
>  #include "hw/virtio/virtio-gpu-pixman.h"
>  #include "hw/qdev-properties.h"
> +#include "monitor/monitor.h"
>  
>  #include <virglrenderer.h>
>  
> @@ -143,6 +144,17 @@ static void virtio_gpu_gl_device_realize(DeviceState 
> *qdev, Error **errp)
>          return;
>      }
>  
> +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
> +    if (g->parent_obj.conf.serverfd) {
> +        g->parent_obj.conf.serverfd_parsed =
> +            monitor_fd_param(monitor_cur(),
> g->parent_obj.conf.serverfd, errp);

I think the right place to validate we have a valid serverfd is in a
property setter function.

> +        if (g->parent_obj.conf.serverfd_parsed < 0) {
> +            error_prepend(errp, "unable to parse serverfd: ");
> +            return;
> +        }
> +    }
> +#endif
> +
>      g->parent_obj.conf.flags |= (1 << VIRTIO_GPU_FLAG_VIRGL_ENABLED);
>      g->capset_ids = virtio_gpu_virgl_get_capsets(g);
>      VIRTIO_GPU_BASE(g)->virtio_config.num_capsets = g->capset_ids->len;
> @@ -159,6 +171,9 @@ static const Property virtio_gpu_gl_properties[] = {
>                      VIRTIO_GPU_FLAG_STATS_ENABLED, false),
>      DEFINE_PROP_BIT("venus", VirtIOGPU, parent_obj.conf.flags,
>                      VIRTIO_GPU_FLAG_VENUS_ENABLED, false),
> +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
> +    DEFINE_PROP_STRING("serverfd", VirtIOGPU,
> parent_obj.conf.serverfd),

Use DEFINE_PROP with a PropertyInfo structure.

> +#endif
>  };
>  
>  static void virtio_gpu_gl_device_unrealize(DeviceState *qdev)
> diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
> index 145a0b3879..420aae3b05 100644
> --- a/hw/display/virtio-gpu-virgl.c
> +++ b/hw/display/virtio-gpu-virgl.c
> @@ -1030,6 +1030,19 @@ static int virgl_make_context_current(void *opaque, 
> int scanout_idx,
>                                     qctx);
>  }
>  
> +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
> +static int virgl_get_server_fd(void *opaque, uint32_t version)
> +{
> +    VirtIOGPU *g = opaque;
> +
> +    if (g->parent_obj.conf.serverfd) {
> +        return g->parent_obj.conf.serverfd_parsed;
> +    }
> +
> +    return -1;
> +}
> +#endif
> +
>  static struct virgl_renderer_callbacks virtio_gpu_3d_cbs = {
>      .version             = 1,
>      .write_fence         = virgl_write_fence,
> @@ -1097,6 +1110,10 @@ int virtio_gpu_virgl_init(VirtIOGPU *g)
>      uint32_t flags = 0;
>      VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);
>  
> +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
> +    virtio_gpu_3d_cbs.version = 3;
> +    virtio_gpu_3d_cbs.get_server_fd = virgl_get_server_fd;
> +#endif
>  #if VIRGL_RENDERER_CALLBACKS_VERSION >= 4
>      if (qemu_egl_display) {
>          virtio_gpu_3d_cbs.version = 4;
> diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
> index a42957c4e2..40a81f500c 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -128,6 +128,8 @@ struct virtio_gpu_base_conf {
>      uint32_t xres;
>      uint32_t yres;
>      uint64_t hostmem;
> +    char *serverfd;
> +    int serverfd_parsed;

And we can drop char serverfd and have an explicit place for the fd. Is
0 a valid fd or do we need a initialise to -1?

>  };
>  
>  struct virtio_gpu_ctrl_command {

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to