Re: [PATCH] drm/virtio: Don't detach GEM from a non-created context

From: Yiwei Zhang

Date: Tue Jul 07 2026 - 15:03:41 EST


On Mon, Jun 29, 2026 at 2:39 PM Dmitry Osipenko
<dmitry.osipenko@xxxxxxxxxxxxx> wrote:
>
> Hi,
>
> On 6/25/26 20:08, Jason Macnak wrote:
> > Applies the same treatment as commit 7cf6dd467e87 ("drm/virtio:
> > Don't attach GEM to a non-created context in gem_object_open()")
> > to virtio_gpu_gem_object_close() to avoid trying to detach
> > a resource that was never attached due to a context
> > never being created when context_init is supported.
> >
> > Fixes: 086b9f27f0ab ("drm/virtio: Don't create a context with default param if context_init is supported")
> > Cc: <stable@xxxxxxxxxxxxxxx> # v6.14+
> > Signed-off-by: Jason Macnak <natsu@xxxxxxxxxx>
> > ---
> > drivers/gpu/drm/virtio/virtgpu_gem.c | 14 ++++++++------
> > 1 file changed, 8 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c
> > index 435d37d36034..66c3f6f74e9c 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_gem.c
> > +++ b/drivers/gpu/drm/virtio/virtgpu_gem.c
> > @@ -139,13 +139,15 @@ void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
> > if (!vgdev->has_virgl_3d)
> > return;
> >
> > - objs = virtio_gpu_array_alloc(1);
> > - if (!objs)
> > - return;
> > - virtio_gpu_array_add_obj(objs, obj);
> > + if (vfpriv->context_created) {
> > + objs = virtio_gpu_array_alloc(1);
> > + if (!objs)
> > + return;
> > + virtio_gpu_array_add_obj(objs, obj);
> >
> > - virtio_gpu_cmd_context_detach_resource(vgdev, vfpriv->ctx_id,
> > - objs);
> > + virtio_gpu_cmd_context_detach_resource(vgdev, vfpriv->ctx_id,
> > + objs);
> > + }
> > virtio_gpu_notify(vgdev);
> > }
>
> The following scenario still will be troubling:
>
> 1. vgdev->has_context_init = true
> 2. virtio_gpu_gem_object_open() invoked, GEM created and not attached to ctx
> 3. virtio_gpu_context_init_ioctl() invoked, now vfpriv->context_created
> = true
> 4. virtio_gpu_gem_object_close() will detach resource that wasn't attached
>
> Add obj->ctx_attached member to struct virtio_gpu_object. See
> virtio_gpu_object_attach() that uses obj->attached, do the same for
> virtio_gpu_cmd_context_attach_resource().
>
> --
> Best regards,
> Dmitry

Hi Dmitry,

WIth context_init, resource attach/detach is per-context based. So a
simple obj->ctx_attached won't work. One would have to track in the
guest context_init ctx for whether a bo has been attached or not.

Another option is to accept this patch and live with the case you
mentioned. We can consider that "invalid" user behavior.

Best,
Yiwei