[PATCH libdrm] etnaviv: Use hash table to track BO indexes

Marek Vasut marex at denx.de
Thu Jun 27 11:34:10 UTC 2019


On 6/27/19 5:26 AM, Christian Gmeiner wrote:
> Am Di., 4. Juni 2019 um 01:40 Uhr schrieb Marek Vasut <marex at denx.de>:
>>
>> Use hash table instead of ad-hoc arrays.
>>
> 
> Please re-spin this patch in mesa on top of latest master. If you see
> a real benefit for setups where
> newest libdrm with older mesa gets used I will push this patch too.

I have usecase with libdrm 2.4.97 + mesa 19.1 , so it would be nice.

>> Signed-off-by: Marek Vasut <marex at denx.de>
>> Cc: Christian Gmeiner <christian.gmeiner at gmail.com>
>> Cc: Lucas Stach <l.stach at pengutronix.de>
>> ---
>>  etnaviv/etnaviv_bo.c         |  6 +++---
>>  etnaviv/etnaviv_cmd_stream.c | 31 ++++++++++++++++++++++---------
>>  etnaviv/etnaviv_priv.h       | 17 ++++++++++-------
>>  3 files changed, 35 insertions(+), 19 deletions(-)
>>
>> diff --git a/etnaviv/etnaviv_bo.c b/etnaviv/etnaviv_bo.c
>> index 43ce6b4e..28ad3162 100644
>> --- a/etnaviv/etnaviv_bo.c
>> +++ b/etnaviv/etnaviv_bo.c
>> @@ -44,14 +44,14 @@ drm_private void bo_del(struct etna_bo *bo)
>>         if (bo->map)
>>                 drm_munmap(bo->map, bo->size);
>>
>> -       if (bo->name)
>> -               drmHashDelete(bo->dev->name_table, bo->name);
>> -
>>         if (bo->handle) {
>>                 struct drm_gem_close req = {
>>                         .handle = bo->handle,
>>                 };
>>
>> +               if (bo->name)
>> +                       drmHashDelete(bo->dev->name_table, bo->name);
>> +
>>                 drmHashDelete(bo->dev->handle_table, bo->handle);
>>                 drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &req);
>>         }
>> diff --git a/etnaviv/etnaviv_cmd_stream.c b/etnaviv/etnaviv_cmd_stream.c
>> index 261777b0..f550b2ff 100644
>> --- a/etnaviv/etnaviv_cmd_stream.c
>> +++ b/etnaviv/etnaviv_cmd_stream.c
>> @@ -61,6 +61,7 @@ drm_public struct etna_cmd_stream *etna_cmd_stream_new(struct etna_pipe *pipe,
>>                 void *priv)
>>  {
>>         struct etna_cmd_stream_priv *stream = NULL;
>> +       struct etna_device *dev = pipe->gpu->dev;
>>
>>         if (size == 0) {
>>                 ERROR_MSG("invalid size of 0");
>> @@ -86,6 +87,7 @@ drm_public struct etna_cmd_stream *etna_cmd_stream_new(struct etna_pipe *pipe,
>>         stream->pipe = pipe;
>>         stream->reset_notify = reset_notify;
>>         stream->reset_notify_priv = priv;
>> +       stream->seqno = ++dev->stream_cnt;
>>
>>         return &stream->base;
>>
>> @@ -150,18 +152,24 @@ static uint32_t bo2idx(struct etna_cmd_stream *stream, struct etna_bo *bo,
>>
>>         pthread_mutex_lock(&idx_lock);
>>
>> -       if (bo->current_stream == stream) {
>> +       if (bo->current_stream_seqno == priv->seqno) {
>>                 idx = bo->idx;
>>         } else {
>> -               /* slow-path: */
>> -               for (idx = 0; idx < priv->nr_bos; idx++)
>> -                       if (priv->bos[idx] == bo)
>> -                               break;
>> -               if (idx == priv->nr_bos) {
>> -                       /* not found */
>> +               void *val;
>> +
>> +               if (!priv->bo_table)
>> +                       priv->bo_table = drmHashCreate();
> 
> Would it make sense to move this to etna_cmd_stream_new(..)? I am not
> sure if there is ever a stream
> without any bo attached to it.

There can be one after flush, no?

I try to keep this implemented the same way as the freedreno one, but I
can drop this part.

-- 
Best regards,
Marek Vasut


More information about the dri-devel mailing list