All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: "Akihiko Odaki" <akihiko.odaki@daynix.com>,
	"Huang Rui" <ray.huang@amd.com>,
	"Marc-André Lureau" <marcandre.lureau@gmail.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Michael S . Tsirkin" <mst@redhat.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Antonio Caggiano" <quic_acaggian@quicinc.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
	"Robert Beckett" <bob.beckett@collabora.com>,
	"Gert Wollny" <gert.wollny@collabora.com>,
	qemu-devel@nongnu.org,
	"Gurchetan Singh" <gurchetansingh@chromium.org>,
	ernunes@redhat.com, "Alyssa Ross" <hi@alyssa.is>,
	"Roger Pau Monné" <roger.pau@citrix.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Stefano Stabellini" <stefano.stabellini@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Xenia Ragiadakou" <xenia.ragiadakou@amd.com>,
	"Pierre-Eric Pelloux-Prayer" <pierre-eric.pelloux-prayer@amd.com>,
	"Honglei Huang" <honglei1.huang@amd.com>,
	"Julia Zhang" <julia.zhang@amd.com>,
	"Chen Jiqian" <Jiqian.Chen@amd.com>,
	"Yiwei Zhang" <zzyiwei@chromium.org>
Subject: Re: [PATCH v12 02/13] virtio-gpu: Handle virtio_gpu_virgl_init() failure
Date: Wed, 22 May 2024 13:37:12 +0100	[thread overview]
Message-ID: <87v836ggzr.fsf@draig.linaro.org> (raw)
In-Reply-To: <20240519212712.2605419-3-dmitry.osipenko@collabora.com> (Dmitry Osipenko's message of "Mon, 20 May 2024 00:27:01 +0300")

Dmitry Osipenko <dmitry.osipenko@collabora.com> writes:

> virtio_gpu_virgl_init() may fail, leading to a further Qemu crash
> because Qemu assumes it never fails. Check virtio_gpu_virgl_init()
> return code and don't execute virtio commands on error. Failed
> virtio_gpu_virgl_init() will result in a timed out virtio commands
> for a guest OS.
>
> Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
> ---
>  hw/display/virtio-gpu-gl.c     | 15 +++++++++++++--
>  hw/display/virtio-gpu-virgl.c  |  3 +++
>  include/hw/virtio/virtio-gpu.h |  1 +
>  3 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c
> index 0c0a8d136954..b353c3193afa 100644
> --- a/hw/display/virtio-gpu-gl.c
> +++ b/hw/display/virtio-gpu-gl.c
> @@ -29,9 +29,14 @@ static void virtio_gpu_gl_update_cursor_data(VirtIOGPU *g,
>                                               struct virtio_gpu_scanout *s,
>                                               uint32_t resource_id)
>  {
> +    VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);
>      uint32_t width, height;
>      uint32_t pixels, *data;
>  
> +    if (!gl->renderer_inited) {
> +        return;
> +    }
> +
>      data = virgl_renderer_get_cursor_data(resource_id, &width, &height);
>      if (!data) {
>          return;
> @@ -60,13 +65,18 @@ static void virtio_gpu_gl_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
>      VirtIOGPU *g = VIRTIO_GPU(vdev);
>      VirtIOGPUGL *gl = VIRTIO_GPU_GL(vdev);
>      struct virtio_gpu_ctrl_command *cmd;
> +    int ret;
>  
> -    if (!virtio_queue_ready(vq)) {
> +    if (!virtio_queue_ready(vq) || gl->renderer_init_failed) {
>          return;
>      }
>  
>      if (!gl->renderer_inited) {
> -        virtio_gpu_virgl_init(g);
> +        ret = virtio_gpu_virgl_init(g);
> +        if (ret) {
> +            gl->renderer_init_failed = true;
> +            return;
> +        }
>          gl->renderer_inited = true;
>      }
>      if (gl->renderer_reset) {
> @@ -101,6 +111,7 @@ static void virtio_gpu_gl_reset(VirtIODevice *vdev)
>      if (gl->renderer_inited && !gl->renderer_reset) {
>          virtio_gpu_virgl_reset_scanout(g);
>          gl->renderer_reset = true;
> +        gl->renderer_init_failed = false;
>      }
>  }
>  
> diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
> index 6ba4c24fda1d..bfbc6553e879 100644
> --- a/hw/display/virtio-gpu-virgl.c
> +++ b/hw/display/virtio-gpu-virgl.c
> @@ -668,6 +668,9 @@ int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g)
>  
>  void virtio_gpu_virgl_deinit(VirtIOGPU *g)
>  {
> +    if (virtio_gpu_stats_enabled(g->parent_obj.conf)) {
> +        timer_free(g->print_stats);
> +    }
>      timer_free(g->fence_poll);
>      virgl_renderer_cleanup(NULL);
>  }
> diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
> index 8ece1ec2e98b..236daba24dd2 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -230,6 +230,7 @@ struct VirtIOGPUGL {
>  
>      bool renderer_inited;
>      bool renderer_reset;
> +    bool renderer_init_failed;

Do we really want 3 bools to represent a bunch of mutually incompatible
state? How about:

  typedef enum {
    /** starting state */
    RS_START = 0,
    /** renderer initialised */
    RS_INITED,
    /** renderer reset */
    RS_RESET,
    /** failed initialisation */
    RS_INIT_FAILED
  } RenderState;

then for example you could flow virtio_gpu_gl_handle_ctrl() as:

  switch (gl->render_state) {
  case RS_START:
  {
        gl->render_state = virtio_gpu_virgl_init(g) ? RS_INIT_FAILED : RS_INITED;  
  }
  case RS_RESET:
  {
        virtio_gpu_virgl_reset(g);
        gl->render_state = RS_INITED;
        break;
  }
  case RS_INIT_FAILED:
       /* nothing to do, return early and maybe log */
       return;
  case RS_INITED:
         /* just continue */
         break;
  }



>  };
>  
>  struct VhostUserGPU {

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


  reply	other threads:[~2024-05-22 12:38 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-19 21:26 [PATCH v12 00/13] Support blob memory and venus on qemu Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 01/13] virtio-gpu: Unrealize GL device Dmitry Osipenko
2024-05-22 10:32   ` Alex Bennée
2024-05-19 21:27 ` [PATCH v12 02/13] virtio-gpu: Handle virtio_gpu_virgl_init() failure Dmitry Osipenko
2024-05-22 12:37   ` Alex Bennée [this message]
2024-05-19 21:27 ` [PATCH v12 03/13] virtio-gpu: Use pkgconfig version to decide which virgl features are available Dmitry Osipenko
2024-05-22 12:48   ` Alex Bennée
2024-05-26 23:57     ` Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 04/13] virtio-gpu: Support context-init feature with virglrenderer Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 05/13] virtio-gpu: Don't require udmabuf when blobs and virgl are enabled Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 06/13] virtio-gpu: Add virgl resource management Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 07/13] virtio-gpu: Support blob scanout using dmabuf fd Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 08/13] virtio-gpu: Support suspension of commands processing Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 09/13] virtio-gpu: Handle resource blob commands Dmitry Osipenko
2024-05-20  3:50   ` Akihiko Odaki
2024-05-19 21:27 ` [PATCH v12 10/13] virtio-gpu: Move fence_poll timer to VirtIOGPUGL Dmitry Osipenko
2024-05-20  3:51   ` Akihiko Odaki
2024-05-22  0:03     ` Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 11/13] virtio-gpu: Move print_stats " Dmitry Osipenko
2024-05-19 21:27 ` [PATCH v12 12/13] virtio-gpu: Register capsets dynamically Dmitry Osipenko
2024-05-23  7:12   ` Manos Pitsidianakis
2024-05-19 21:27 ` [PATCH v12 13/13] virtio-gpu: Support Venus context Dmitry Osipenko
2024-05-23  7:18   ` Manos Pitsidianakis
2024-05-23 23:33     ` Dmitry Osipenko
2024-05-21 13:15 ` [PATCH v12 00/13] Support blob memory and venus on qemu Alex Bennée
2024-05-21 14:57   ` Alex Bennée
2024-05-22  0:02     ` Dmitry Osipenko
2024-05-22  9:00       ` Alex Bennée
2024-05-26 23:46         ` Dmitry Osipenko
2024-05-27  0:52           ` Dmitry Osipenko
2024-06-05 14:47           ` Alex Bennée
2024-06-05 16:29             ` Dmitry Osipenko
2024-06-05 17:37               ` Alex Bennée
2024-05-27  0:07         ` Dmitry Osipenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87v836ggzr.fsf@draig.linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=Jiqian.Chen@amd.com \
    --cc=akihiko.odaki@daynix.com \
    --cc=alexander.deucher@amd.com \
    --cc=bob.beckett@collabora.com \
    --cc=christian.koenig@amd.com \
    --cc=dgilbert@redhat.com \
    --cc=dmitry.osipenko@collabora.com \
    --cc=ernunes@redhat.com \
    --cc=gert.wollny@collabora.com \
    --cc=gurchetansingh@chromium.org \
    --cc=hi@alyssa.is \
    --cc=honglei1.huang@amd.com \
    --cc=julia.zhang@amd.com \
    --cc=kraxel@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=mst@redhat.com \
    --cc=philmd@linaro.org \
    --cc=pierre-eric.pelloux-prayer@amd.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quic_acaggian@quicinc.com \
    --cc=ray.huang@amd.com \
    --cc=roger.pau@citrix.com \
    --cc=sstabellini@kernel.org \
    --cc=stefano.stabellini@amd.com \
    --cc=xenia.ragiadakou@amd.com \
    --cc=zzyiwei@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.