From 921dafc98b2c9926be0902ef158cd0ea4779c9a3 Mon Sep 17 00:00:00 2001 From: Lepton Wu Date: Fri, 19 Mar 2021 13:57:13 -0700 Subject: virgl: Use atomic operation directly. This make sure we don't trigger assert in pipe_reference Signed-off-by: Lepton Wu Reviewed-by: Chia-I Wu Reviewed-by: John Bates Part-of: --- src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index 0031db7d278..76e122536b2 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -474,8 +474,13 @@ virgl_drm_winsys_resource_create_handle(struct virgl_winsys *qws, } if (res) { - struct virgl_hw_res *r = NULL; - virgl_drm_resource_reference(&qdws->base, &r, res); + /* qdws->bo_{names,handles} hold weak pointers to virgl_hw_res. Because + * virgl_drm_resource_reference does not take qdws->bo_handles_mutex + * until it enters virgl_hw_res_destroy, there is a small window that + * the refcount can drop to zero. Call p_atomic_inc directly instead of + * virgl_drm_resource_reference to avoid hitting assert failures. + */ + p_atomic_inc(&res->reference.count); goto done; } -- cgit v1.2.3