From b2f4bf010574c501f93697d90f182a9bc6c83356 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 24 Oct 2020 12:20:57 -0700 Subject: [PATCH] freedreno/drm: Make ring refcnt atomic again In general, rings are not shared across contexts/threads. But this can happen with texture stateobjs, which can be invalidated by other contexts. And while we're here, lets convert the rest of freedreno/drm to u_atomic Signed-off-by: Rob Clark Part-of: --- src/freedreno/drm/freedreno_bo.c | 2 +- src/freedreno/drm/freedreno_device.c | 4 ++-- src/freedreno/drm/freedreno_pipe.c | 2 +- src/freedreno/drm/freedreno_priv.h | 2 -- src/freedreno/drm/freedreno_ringbuffer.h | 5 +++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c index 1ea514ceae3..315a3bbc361 100644 --- a/src/freedreno/drm/freedreno_bo.c +++ b/src/freedreno/drm/freedreno_bo.c @@ -251,7 +251,7 @@ void fd_bo_del(struct fd_bo *bo) { struct fd_device *dev = bo->dev; - if (!atomic_dec_and_test(&bo->refcnt)) + if (!p_atomic_dec_zero(&bo->refcnt)) return; simple_mtx_lock(&table_lock); diff --git a/src/freedreno/drm/freedreno_device.c b/src/freedreno/drm/freedreno_device.c index e64640c2e2b..2accf5ce67f 100644 --- a/src/freedreno/drm/freedreno_device.c +++ b/src/freedreno/drm/freedreno_device.c @@ -121,14 +121,14 @@ static void fd_device_del_impl(struct fd_device *dev) void fd_device_del_locked(struct fd_device *dev) { - if (!atomic_dec_and_test(&dev->refcnt)) + if (!p_atomic_dec_zero(&dev->refcnt)) return; fd_device_del_impl(dev); } void fd_device_del(struct fd_device *dev) { - if (!atomic_dec_and_test(&dev->refcnt)) + if (!p_atomic_dec_zero(&dev->refcnt)) return; simple_mtx_lock(&table_lock); fd_device_del_impl(dev); diff --git a/src/freedreno/drm/freedreno_pipe.c b/src/freedreno/drm/freedreno_pipe.c index a4fd856bea6..e09ffe4be8c 100644 --- a/src/freedreno/drm/freedreno_pipe.c +++ b/src/freedreno/drm/freedreno_pipe.c @@ -77,7 +77,7 @@ struct fd_pipe * fd_pipe_ref(struct fd_pipe *pipe) void fd_pipe_del(struct fd_pipe *pipe) { - if (!atomic_dec_and_test(&pipe->refcnt)) + if (!p_atomic_dec_zero(&pipe->refcnt)) return; pipe->funcs->destroy(pipe); } diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h index ee2cc02ced1..0c7915f761c 100644 --- a/src/freedreno/drm/freedreno_priv.h +++ b/src/freedreno/drm/freedreno_priv.h @@ -51,8 +51,6 @@ #include "freedreno_drmif.h" #include "freedreno_ringbuffer.h" -#define atomic_dec_and_test(x) (__sync_add_and_fetch (x, -1) == 0) - struct fd_device_funcs { int (*bo_new_handle)(struct fd_device *dev, uint32_t size, uint32_t flags, uint32_t *handle); diff --git a/src/freedreno/drm/freedreno_ringbuffer.h b/src/freedreno/drm/freedreno_ringbuffer.h index 3456c7df73c..f634781a324 100644 --- a/src/freedreno/drm/freedreno_ringbuffer.h +++ b/src/freedreno/drm/freedreno_ringbuffer.h @@ -28,6 +28,7 @@ #define FREEDRENO_RINGBUFFER_H_ #include +#include "util/u_atomic.h" #include "util/u_debug.h" #include "util/u_dynarray.h" @@ -127,7 +128,7 @@ struct fd_ringbuffer * fd_ringbuffer_new_object(struct fd_pipe *pipe, static inline void fd_ringbuffer_del(struct fd_ringbuffer *ring) { - if (--ring->refcnt > 0) + if (!p_atomic_dec_zero(&ring->refcnt)) return; ring->funcs->destroy(ring); @@ -137,7 +138,7 @@ static inline struct fd_ringbuffer * fd_ringbuffer_ref(struct fd_ringbuffer *ring) { - ring->refcnt++; + p_atomic_inc(&ring->refcnt); return ring; }