[Mesa-dev] [PATCH] virgl: Use right key to insert resource to hash.
Chia-I Wu
olvaffe at gmail.com
Wed Mar 20 22:03:32 UTC 2019
On Mon, Mar 18, 2019 at 2:22 PM Lepton Wu <lepton at chromium.org> wrote:
> The old code could use gem name as key when inserting it to bo_handles
> hash table while trying to remove it from hash table with bo_handle as
> key in virgl_hw_res_destroy. This triggers use after free. Also, we
> should only reuse resource from bo_handle hash when the handle type is
> FD.
>
Reuse is not very accurate. Opening a shared handle (flink name) twice
gives two GEM handles. Importing an fd handle (prime fd) twice gives the
same GEM handle. In all cases, within a virgl_winsys, we want only one GEM
handle and only one virgl_resource for each kernel GEM object.
I think the logic should go like:
if (HANDLE_TYPE_SHARED) {
if (bo_names.has(flink_name))
return bo_names[flink_name];
gem_handle = gem_open(flink_name);
} else {
gem_handle = drmPrimeFDToHandle(prime_fd);
}
if (bo_handles.has(gem_handle))
return bo_handles[gem_handle];
bo_handles[gem_handle] = create_new_resource();
> Signed-off-by: Lepton Wu <lepton at chromium.org>
> ---
> src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 15 ++++++++-------
> 1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> index 120e8eda2cd..01811a0e997 100644
> --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> @@ -424,13 +424,13 @@ virgl_drm_winsys_resource_create_handle(struct
> virgl_winsys *qws,
> res = NULL;
> goto done;
> }
> - }
>
> - res = util_hash_table_get(qdws->bo_handles, (void*)(uintptr_t)handle);
> - if (res) {
> - struct virgl_hw_res *r = NULL;
> - virgl_drm_resource_reference(qdws, &r, res);
> - goto done;
> + res = util_hash_table_get(qdws->bo_handles,
> (void*)(uintptr_t)handle);
> + if (res) {
> + struct virgl_hw_res *r = NULL;
> + virgl_drm_resource_reference(qdws, &r, res);
> + goto done;
> + }
> }
>
> res = CALLOC_STRUCT(virgl_hw_res);
> @@ -469,7 +469,8 @@ virgl_drm_winsys_resource_create_handle(struct
> virgl_winsys *qws,
> res->num_cs_references = 0;
> res->fence_fd = -1;
>
> - util_hash_table_set(qdws->bo_handles, (void *)(uintptr_t)handle, res);
> + util_hash_table_set(qdws->bo_handles, (void
> *)(uintptr_t)res->bo_handle,
> + res);
>
> done:
> mtx_unlock(&qdws->bo_handles_mutex);
> --
> 2.21.0.225.g810b269d1ac-goog
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190320/2d0fdfbb/attachment.html>
More information about the mesa-dev
mailing list