> 
> There's an implicit API/ABI contract between QEMU and SPICE that SPICE
> will keep the guest QXL resources alive as long as QEMU can hold a
> pointer to them. This implicit contract was broken in 1c6e7cf7 "Release
> cursor as soon as possible", causing crashes at migration time.
> While the proper fix would be in QEMU so that spice-server does not need
> to have that kind of knowledge regarding QEMU internal implementation,
> this commit reverts to the pre-1c6e7cf7 behaviour to avoid a regression
> while QEMU is being fixed.
> 
> This version of the fix is based on a suggestion from Frediano Ziglio.
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1540919
> 
> Signed-off-by: Christophe Fergeau <cferg...@redhat.com>
> ---
>  server/red-parse-qxl.c | 3 +++
>  server/red-parse-qxl.h | 1 +
>  server/red-worker.c    | 2 +-
>  3 files changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
> index d0e7eb718..ebd7dcee7 100644
> --- a/server/red-parse-qxl.c
> +++ b/server/red-parse-qxl.c
> @@ -1497,4 +1497,7 @@ void red_put_cursor_cmd(RedCursorCmd *red)
>          red_put_cursor(&red->u.set.shape);
>          break;
>      }
> +    if (red->qxl) {
> +        red_qxl_release_resource(red->qxl, red->release_info_ext);
> +    }
>  }

Yes, fix of my code is correct.
However I cannot compile without the include!
Why is compiling for you? Maybe you have another commit in?

> diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h
> index 4a576ca07..f0407b54a 100644
> --- a/server/red-parse-qxl.h
> +++ b/server/red-parse-qxl.h
> @@ -99,6 +99,7 @@ typedef struct RedSurfaceCmd {
>  } RedSurfaceCmd;
>  
>  typedef struct RedCursorCmd {
> +    QXLInstance *qxl;
>      QXLReleaseInfoExt release_info_ext;
>      uint8_t type;
>      union {
> diff --git a/server/red-worker.c b/server/red-worker.c
> index 387f500e8..eb927f3e0 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -118,7 +118,7 @@ static gboolean red_process_cursor_cmd(RedWorker *worker,
> const QXLCommandExt *e
>          g_free(cursor_cmd);
>          return FALSE;
>      }
> -    red_qxl_release_resource(worker->qxl, cursor_cmd->release_info_ext);
> +    cursor_cmd->qxl = worker->qxl;
>      cursor_channel_process_cmd(worker->cursor_channel, cursor_cmd);
>      return TRUE;
>  }

Frediano
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to