[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