[igt-dev] [PATCH i-g-t 3/4] i915/gem_create: use __atomic_* instead of __sync_*

Guillaume Tucker
2019-06-03T11:54:49Z

Replace calls to the older __sync_* functions with the new __atomic_*
standard ones. This fixes builds on some architectures, in particular
MIPS which doesn't have __sync_add_and_fetch_8 and
__sync_val_compare_and_swap_8 for 64-bit variable handling.

Signed-off-by: Guillaume Tucker <guillaume.tucker@collabora.com>
---
tests/Makefile.am | 2 +-
tests/i915/gem_create.c | 12 ++++++++++--
2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5097debf629c..18a0f1f20592 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -90,7 +90,7 @@ AM_LDFLAGS = -Wl,--as-needed
drm_import_export_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
drm_import_export_LDADD = $(LDADD) -lpthread
gem_create_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
-gem_create_LDADD = $(LDADD) -lpthread
+gem_create_LDADD = $(LDADD) -lpthread -latomic
gem_close_race_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
gem_close_race_LDADD = $(LDADD) -lpthread
gem_ctx_thrash_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index 43cbf45f289b..a4aeb94b3f93 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -156,6 +156,14 @@ static void invalid_nonaligned_size(int fd)
gem_close(fd, create.handle);
}

+static uint64_t atomic_compare_swap_u64(uint64_t *ptr, uint64_t oldval,
+ uint64_t newval)
+{
+ __atomic_compare_exchange_n(ptr, &oldval, newval, 0,
+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+ return oldval;
+}
+
static uint64_t get_npages(uint64_t *global, uint64_t npages)
{
uint64_t try, old, max;
@@ -165,7 +173,7 @@ static uint64_t get_npages(uint64_t *global, uint64_t npages)
old = max;
try = 1 + npages % (max / 2);
max -= try;
- } while ((max = __sync_val_compare_and_swap(global, old, max)) != old);
+ } while ((max = atomic_compare_swap_u64(global, old, max)) != old);

return try;
}
@@ -202,7 +210,7 @@ static void *thread_clear(void *data)
}
gem_close(i915, create.handle);

- __sync_add_and_fetch(&arg->max, npages);
+ __atomic_add_fetch(&arg->max, npages, __ATOMIC_SEQ_CST);
}

return NULL;
--
2.20.1