[Mesa-dev] [PATCH] virgl: Use right key to insert resource to hash.
Lepton Wu
lepton at chromium.org
Mon Apr 1 19:37:05 UTC 2019
On Wed, Mar 20, 2019 at 3:03 PM Chia-I Wu <olvaffe at gmail.com> wrote:
> 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();
>
> Hi, the current patch did most of what you said with only one difference:
it didn't insert to bo_handles[] hash when the type
is HANDLE_TYPE_SHARED.
I think this is reasonable since opening a shared handle always get a new
gem handle very time and I think it doesn't worth to insert it to
bo_handles[] hash.
What do you think?
>
>> 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/20190401/ba68e5ce/attachment.html>
More information about the mesa-dev
mailing list