summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Engestrom <eric@engestrom.ch>2017-03-15 23:27:25 +0000
committerMatt Turner <mattst88@gmail.com>2022-08-23 22:49:34 +0000
commit3ff3d59ed96f71523e0aa52461b01a1b1168c5e0 (patch)
tree26ea5b34b9b784a683de40890d79836dd01755a3
parentcf54ebf6cf4badeb9f980b21c6f9d19e988b456e (diff)
downloaddrm-3ff3d59ed96f71523e0aa52461b01a1b1168c5e0.tar.gz
atomic: fix atomic_add_unless() fallback's return value
According to the kernel documentation: Returns non-zero if @v was not @u, and zero otherwise. Fixes: 63fc571863aa64683400 ("atomic: add atomic_add_unless()") Closes: https://gitlab.freedesktop.org/mesa/drm/issues/17 Signed-off-by: David Shao <davshao@gmail.com> Reviewed-by: Eric Engestrom <eric@engestrom.ch> [Eric: fix its callers to maintain current behaviour] Signed-off-by: Eric Engestrom <eric@engestrom.ch>
-rw-r--r--intel/intel_bufmgr_gem.c38
-rw-r--r--xf86atomic.h2
2 files changed, 21 insertions, 19 deletions
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index b28ea74d..e208c68d 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -1382,22 +1382,23 @@ static void drm_intel_gem_bo_unreference(drm_intel_bo *bo)
assert(atomic_read(&bo_gem->refcount) > 0);
- if (atomic_add_unless(&bo_gem->refcount, -1, 1)) {
- drm_intel_bufmgr_gem *bufmgr_gem =
- (drm_intel_bufmgr_gem *) bo->bufmgr;
- struct timespec time;
+ if (atomic_add_unless(&bo_gem->refcount, -1, 1))
+ return;
- clock_gettime(CLOCK_MONOTONIC, &time);
+ drm_intel_bufmgr_gem *bufmgr_gem =
+ (drm_intel_bufmgr_gem *) bo->bufmgr;
+ struct timespec time;
- pthread_mutex_lock(&bufmgr_gem->lock);
+ clock_gettime(CLOCK_MONOTONIC, &time);
- if (atomic_dec_and_test(&bo_gem->refcount)) {
- drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
- drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec);
- }
+ pthread_mutex_lock(&bufmgr_gem->lock);
- pthread_mutex_unlock(&bufmgr_gem->lock);
+ if (atomic_dec_and_test(&bo_gem->refcount)) {
+ drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
+ drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec);
}
+
+ pthread_mutex_unlock(&bufmgr_gem->lock);
}
static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
@@ -3377,16 +3378,17 @@ drm_intel_bufmgr_gem_unref(drm_intel_bufmgr *bufmgr)
{
drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
- if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) {
- pthread_mutex_lock(&bufmgr_list_mutex);
+ if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1))
+ return;
- if (atomic_dec_and_test(&bufmgr_gem->refcount)) {
- DRMLISTDEL(&bufmgr_gem->managers);
- drm_intel_bufmgr_gem_destroy(bufmgr);
- }
+ pthread_mutex_lock(&bufmgr_list_mutex);
- pthread_mutex_unlock(&bufmgr_list_mutex);
+ if (atomic_dec_and_test(&bufmgr_gem->refcount)) {
+ DRMLISTDEL(&bufmgr_gem->managers);
+ drm_intel_bufmgr_gem_destroy(bufmgr);
}
+
+ pthread_mutex_unlock(&bufmgr_list_mutex);
}
drm_public void *drm_intel_gem_bo_map__gtt(drm_intel_bo *bo)
diff --git a/xf86atomic.h b/xf86atomic.h
index efa47a77..c19e493b 100644
--- a/xf86atomic.h
+++ b/xf86atomic.h
@@ -108,7 +108,7 @@ static inline int atomic_add_unless(atomic_t *v, int add, int unless)
c = atomic_read(v);
while (c != unless && (old = atomic_cmpxchg(v, c, c + add)) != c)
c = old;
- return c == unless;
+ return c != unless;
}
#endif