On 6/27/19 5:26 AM, Christian Gmeiner wrote: > Am Di., 4. Juni 2019 um 01:40 Uhr schrieb Marek Vasut <marex@xxxxxxx>: >> >> 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@xxxxxxx> >> Cc: Christian Gmeiner <christian.gmeiner@xxxxxxxxx> >> Cc: Lucas Stach <l.stach@xxxxxxxxxxxxxx> >> --- >> 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel