[Mesa-dev] [PATCH v5 06/12] etnaviv: use common pipe_screen ref counting
Wladimir
laanwj at gmail.com
Tue Aug 8 09:49:06 UTC 2017
On Tue, Aug 8, 2017 at 12:58 AM, Rob Herring <robh at kernel.org> wrote:
> Use the common pipe_screen ref counting and fd hashing functions.
> The mutex can be dropped as the pipe loader serializes the
> create_screen() and destroy() calls.
>
> Signed-off-by: Rob Herring <robh at kernel.org>
> Cc: Christian Gmeiner <christian.gmeiner at gmail.com>
> Cc: Wladimir J. van der Laan <laanwj at gmail.com>
> Cc: Lucas Stach <l.stach at pengutronix.de>
This sure cleans up a lot.
Reviewed-by: Wladimir J. van der Laan <laanwj at gmail.com>
(will test)
> ---
> src/gallium/drivers/etnaviv/etnaviv_screen.c | 1 -
> src/gallium/drivers/etnaviv/etnaviv_screen.h | 4 --
> .../winsys/etnaviv/drm/etnaviv_drm_winsys.c | 81 +++-------------------
> 3 files changed, 8 insertions(+), 78 deletions(-)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 9aca90642c37..92950c3bfbb5 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -806,7 +806,6 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
> screen->dev = dev;
> screen->gpu = gpu;
> screen->ro = renderonly_dup(ro);
> - screen->refcnt = 1;
>
> if (!screen->ro) {
> DBG("could not create renderonly object");
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.h b/src/gallium/drivers/etnaviv/etnaviv_screen.h
> index dc57a38dbb80..74b8e98d1695 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.h
> @@ -30,7 +30,6 @@
>
> #include "etnaviv_internal.h"
>
> -#include "os/os_thread.h"
> #include "pipe/p_screen.h"
> #include "renderonly/renderonly.h"
> #include "util/slab.h"
> @@ -59,9 +58,6 @@ enum viv_features_word {
> struct etna_screen {
> struct pipe_screen base;
>
> - int refcnt;
> - void *winsys_priv;
> -
> struct etna_device *dev;
> struct etna_gpu *gpu;
> struct etna_pipe *pipe;
> diff --git a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
> index 8e3f7a06a9a0..09b20389810b 100644
> --- a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
> +++ b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
> @@ -28,6 +28,7 @@
>
> #include "util/u_hash_table.h"
> #include "util/u_memory.h"
> +#include "util/u_screen.h"
>
> #include "etnaviv/etnaviv_screen.h"
> #include "etnaviv/hw/common.xml.h"
> @@ -67,85 +68,19 @@ screen_create(struct renderonly *ro)
> return etna_screen_create(dev, gpu, ro);
> }
>
> -static struct util_hash_table *etna_tab = NULL;
> -
> -static mtx_t etna_screen_mutex = _MTX_INITIALIZER_NP;
> -
> -static void
> -etna_drm_screen_destroy(struct pipe_screen *pscreen)
> -{
> - struct etna_screen *screen = etna_screen(pscreen);
> - boolean destroy;
> -
> - mtx_lock(&etna_screen_mutex);
> - destroy = --screen->refcnt == 0;
> - if (destroy) {
> - int fd = etna_device_fd(screen->dev);
> - util_hash_table_remove(etna_tab, intptr_to_pointer(fd));
> - }
> - mtx_unlock(&etna_screen_mutex);
> -
> - if (destroy) {
> - pscreen->destroy = screen->winsys_priv;
> - pscreen->destroy(pscreen);
> - }
> -}
> -
> -static unsigned hash_fd(void *key)
> -{
> - int fd = pointer_to_intptr(key);
> - struct stat stat;
> -
> - fstat(fd, &stat);
> -
> - return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
> -}
> -
> -static int compare_fd(void *key1, void *key2)
> -{
> - int fd1 = pointer_to_intptr(key1);
> - int fd2 = pointer_to_intptr(key2);
> - struct stat stat1, stat2;
> -
> - fstat(fd1, &stat1);
> - fstat(fd2, &stat2);
> -
> - return stat1.st_dev != stat2.st_dev ||
> - stat1.st_ino != stat2.st_ino ||
> - stat1.st_rdev != stat2.st_rdev;
> -}
> -
> struct pipe_screen *
> etna_drm_screen_create_renderonly(struct renderonly *ro)
> {
> - struct pipe_screen *pscreen = NULL;
> + struct etna_screen *screen;
> + struct pipe_screen *pscreen = pipe_screen_reference(ro->gpu_fd);
>
> - mtx_lock(&etna_screen_mutex);
> - if (!etna_tab) {
> - etna_tab = util_hash_table_create(hash_fd, compare_fd);
> - if (!etna_tab)
> - goto unlock;
> - }
> + if (pscreen)
> + return pscreen;
>
> - pscreen = util_hash_table_get(etna_tab, intptr_to_pointer(ro->gpu_fd));
> - if (pscreen) {
> - etna_screen(pscreen)->refcnt++;
> - } else {
> - pscreen = screen_create(ro);
> - if (pscreen) {
> - int fd = etna_device_fd(etna_screen(pscreen)->dev);
> - util_hash_table_set(etna_tab, intptr_to_pointer(fd), pscreen);
> -
> - /* Bit of a hack, to avoid circular linkage dependency,
> - * ie. pipe driver having to call in to winsys, we
> - * override the pipe drivers screen->destroy() */
> - etna_screen(pscreen)->winsys_priv = pscreen->destroy;
> - pscreen->destroy = etna_drm_screen_destroy;
> - }
> - }
> + pscreen = screen_create(ro);
>
> -unlock:
> - mtx_unlock(&etna_screen_mutex);
> + screen = etna_screen(pscreen);
> + pipe_screen_reference_init(pscreen, etna_device_fd(screen->dev));
> return pscreen;
> }
>
> --
> 2.11.0
>
More information about the mesa-dev
mailing list