[glib: 1/2] closures test: Avoid timeout on ARM64 CPUs



commit cb98e37357b03ce078d859a78ec603e7797bc931
Author: Simon McVittie <smcv debian org>
Date:   Mon Dec 18 10:47:29 2017 +0000

    closures test: Avoid timeout on ARM64 CPUs
    
    Closures use a 16-bit atomic reference count, which is really slow
    on certain ARM64 CPUs such as the Cortex-A57 (glib#1316). This is
    non-trivial to solve, since the public struct field cannot be enlarged
    to 32-bit while preserving ABI, and 16-bit atomic operations would be new
    (and rather niche) API.
    
    Until this can be solved properly (hopefully in GLib 2.59.x), cut down
    the number of signal emission cycles and bump up the timeout in the
    Meson build system, so that builds won't time out. We can't just take
    another zero off the number of signal emission cycles, as was done in the
    original version of this patch in Debian, because if we do that it can
    result in test failures when the main thread starves the other threads.
    
    ARM64 CPUs are backwards-compatible with 32-bit ARM, and the same
    slowdown can be seen when building and testing 32-bit code on these
    CPUs, so check for both 32- and 64-bit ARM.
    
    Bug-Debian: https://bugs.debian.org/880883
    Co-authored-by: Iain Lane <laney debian org>
    Signed-off-by: Simon McVittie <smcv debian org>

 tests/refcount/closures.c  | 12 ++++++++++++
 tests/refcount/meson.build |  7 +++++++
 2 files changed, 19 insertions(+)
---
diff --git a/tests/refcount/closures.c b/tests/refcount/closures.c
index 25b0a2779..188406786 100644
--- a/tests/refcount/closures.c
+++ b/tests/refcount/closures.c
@@ -259,7 +259,19 @@ main (int    argc,
   thread1 = g_thread_create (thread1_main, closure, TRUE, NULL);
   thread2 = g_thread_create (thread2_main, closure, TRUE, NULL);
 
+  /* The 16-bit compare-and-swap operations currently used for closure
+   * refcounts are really slow on some ARM CPUs, notably Cortex-A57.
+   * Reduce the number of iterations so that the test completes in a
+   * finite time, but don't reduce it so much that the main thread
+   * starves the other threads and causes a test failure.
+   *
+   * https://gitlab.gnome.org/GNOME/glib/issues/1316
+   * aka https://bugs.debian.org/880883 */
+#if defined(__aarch64__) || defined(__arm__)
+  for (i = 0; i < 100000; i++)
+#else
   for (i = 0; i < 1000000; i++)
+#endif
     {
       static guint count = 0;
       test_emissions (object);
diff --git a/tests/refcount/meson.build b/tests/refcount/meson.build
index 68c23cc41..22b9655d7 100644
--- a/tests/refcount/meson.build
+++ b/tests/refcount/meson.build
@@ -54,6 +54,13 @@ foreach test_name, extra_args : refcount_tests
 
   suite = ['refcount'] + extra_args.get('suite', [])
   timeout = suite.contains('slow') ? test_timeout_slow : test_timeout
+
+  # https://gitlab.gnome.org/GNOME/glib/issues/1316
+  # aka https://bugs.debian.org/880883
+  if test_name == 'closures' and ['arm', 'aarch64'].contains(host_cpu_family)
+    timeout = timeout * 10
+  endif
+
   # FIXME? TESTS_ENVIRONMENT = LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset
   test(test_name, exe, env : test_env, timeout : timeout, suite : suite)
 endforeach


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]