From patchwork Mon Jun 3 23:39:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 10974303 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 859B01398 for ; Tue, 4 Jun 2019 07:15:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E1C41FE95 for ; Tue, 4 Jun 2019 07:15:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6249128742; Tue, 4 Jun 2019 07:15:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A96FC1FE95 for ; Tue, 4 Jun 2019 07:15:44 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5CBEC896E5; Tue, 4 Jun 2019 07:14:38 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2D0698934F for ; Mon, 3 Jun 2019 23:40:27 +0000 (UTC) Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 45Hs4973bGz1rwJL; Tue, 4 Jun 2019 01:40:25 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 45Hs496gF8z1qqkb; Tue, 4 Jun 2019 01:40:25 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id z9f2sek0AuoN; Tue, 4 Jun 2019 01:40:24 +0200 (CEST) X-Auth-Info: cZo50q+ISbjfiBQKMOAo40iAGzEdzuKJF2QKS1FgwJQ= Received: from kurokawa.lan (ip-86-49-110-70.net.upcbroadband.cz [86.49.110.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Tue, 4 Jun 2019 01:40:24 +0200 (CEST) From: Marek Vasut To: dri-devel@lists.freedesktop.org Subject: [PATCH libdrm] etnaviv: Use hash table to track BO indexes Date: Tue, 4 Jun 2019 01:39:29 +0200 Message-Id: <20190603233929.23048-1-marex@denx.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 04 Jun 2019 07:14:23 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marek Vasut Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Use hash table instead of ad-hoc arrays. Signed-off-by: Marek Vasut Cc: Christian Gmeiner Cc: Lucas Stach Reviewed-by: Wladimir J. van der Laan --- 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(); + + if (!drmHashLookup(priv->bo_table, bo->handle, &val)) { + /* found */ + idx = (uint32_t)(uintptr_t)val; + } else { idx = append_bo(stream, bo); + val = (void *)(uintptr_t)idx; + drmHashInsert(priv->bo_table, bo->handle, val); } - bo->current_stream = stream; + + bo->current_stream_seqno = priv->seqno; bo->idx = idx; } pthread_mutex_unlock(&idx_lock); @@ -213,10 +221,15 @@ static void flush(struct etna_cmd_stream *stream, int in_fence_fd, for (uint32_t i = 0; i < priv->nr_bos; i++) { struct etna_bo *bo = priv->bos[i]; - bo->current_stream = NULL; + bo->current_stream_seqno = 0; etna_bo_del(bo); } + if (priv->bo_table) { + drmHashDestroy(priv->bo_table); + priv->bo_table = NULL; + } + if (out_fence_fd) *out_fence_fd = req.fence_fd; } diff --git a/etnaviv/etnaviv_priv.h b/etnaviv/etnaviv_priv.h index eef7f49c..bc82324e 100644 --- a/etnaviv/etnaviv_priv.h +++ b/etnaviv/etnaviv_priv.h @@ -76,6 +76,8 @@ struct etna_device { struct etna_bo_cache bo_cache; int closefd; /* call close(fd) upon destruction */ + + unsigned int stream_cnt; }; drm_private void etna_bo_cache_init(struct etna_bo_cache *cache); @@ -98,14 +100,12 @@ struct etna_bo { uint64_t offset; /* offset to mmap() */ atomic_t refcnt; - /* in the common case, a bo won't be referenced by more than a single - * command stream. So to avoid looping over all the bo's in the - * reloc table to find the idx of a bo that might already be in the - * table, we cache the idx in the bo. But in order to detect the - * slow-path where bo is ref'd in multiple streams, we also must track - * the current_stream for which the idx is valid. See bo2idx(). + /* + * To avoid excess hashtable lookups, cache the stream this bo was + * last emitted on (since that will probably also be the next ring + * it is emitted on). */ - struct etna_cmd_stream *current_stream; + unsigned int current_stream_seqno; uint32_t idx; int reuse; @@ -153,6 +153,9 @@ struct etna_cmd_stream_priv { /* notify callback if buffer reset happened */ void (*reset_notify)(struct etna_cmd_stream *stream, void *priv); void *reset_notify_priv; + + unsigned int seqno; + void *bo_table; }; struct etna_perfmon {