Implement basic percpu ops mm_cid test
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 25 Apr 2023 16:13:33 +0000 (12:13 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 25 Apr 2023 22:38:09 +0000 (18:38 -0400)
Adapt to the rseq.h API changes introduced by commits
"selftests/rseq: <arch>: Template memory ordering and percpu access mode".

Build a new basic_percpu_ops_mm_cid_test to test the new "mm_cid" rseq
field.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I35faa59281b0c7c0d0a449352a45a2d2b0df480d

.gitignore
tests/Makefile.am
tests/basic_percpu_ops_test.c

index e3fc65e70bd1d7cc17368fcf806744d8c9f4e1b0..bfd59eca86c59865e2706995ee22540b2faa7fb1 100644 (file)
@@ -58,6 +58,8 @@ dkms.conf
 /src/librseq.pc
 /tests/basic_percpu_ops_test.tap
 /tests/basic_percpu_ops_test_cxx.tap
+/tests/basic_percpu_ops_mm_cid_test.tap
+/tests/basic_percpu_ops_mm_cid_test_cxx.tap
 /tests/basic_test.tap
 /tests/basic_test_cxx.tap
 /tests/param_test
index c60f345e794635da84a11c2aea1314465b7fb167..afc3d9e7c26615dee3ed348c9333e4d63373e7a4 100644 (file)
@@ -15,6 +15,8 @@ TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' \
 noinst_PROGRAMS = \
        basic_percpu_ops_test.tap \
        basic_percpu_ops_test_cxx.tap \
+       basic_percpu_ops_mm_cid_test.tap \
+       basic_percpu_ops_mm_cid_test_cxx.tap \
        basic_test.tap \
        basic_test_cxx.tap \
        param_test \
@@ -34,6 +36,14 @@ basic_percpu_ops_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)
 basic_percpu_ops_test_cxx_tap_SOURCES = basic_percpu_ops_test_cxx.cpp
 basic_percpu_ops_test_cxx_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
 
+basic_percpu_ops_mm_cid_test_tap_SOURCES = basic_percpu_ops_test.c
+basic_percpu_ops_mm_cid_test_tap_CPPFLAGS = $(AM_CPPFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID_ID
+basic_percpu_ops_mm_cid_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
+
+basic_percpu_ops_mm_cid_test_cxx_tap_SOURCES = basic_percpu_ops_test_cxx.cpp
+basic_percpu_ops_mm_cid_test_cxx_tap_CPPFLAGS = $(AM_CPPFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID_ID
+basic_percpu_ops_mm_cid_test_cxx_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
+
 basic_test_tap_SOURCES = basic_test.c
 basic_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
 
index 634b6eea4204cffa7ffe56e5a780f3c040bd19bd..f8b48ecdf434c8acc55e526c89a38382b1d15f75 100644 (file)
 
 #define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof((arr)[0]))
 
+#ifdef BUILDOPT_RSEQ_PERCPU_MM_CID
+# define RSEQ_PERCPU   RSEQ_PERCPU_MM_CID
+static
+int get_current_cpu_id(void)
+{
+       return rseq_current_mm_cid();
+}
+static
+bool rseq_validate_cpu_id(void)
+{
+       return rseq_mm_cid_available();
+}
+#else
+# define RSEQ_PERCPU   RSEQ_PERCPU_CPU_ID
+static
+int get_current_cpu_id(void)
+{
+       return rseq_cpu_start();
+}
+static
+bool rseq_validate_cpu_id(void)
+{
+       return rseq_current_cpu_raw() >= 0;
+}
+#endif
+
 struct percpu_lock_entry {
        intptr_t v;
 } __attribute__((aligned(128)));
@@ -60,9 +86,9 @@ static int rseq_this_cpu_lock(struct percpu_lock *lock)
        for (;;) {
                int ret;
 
-               cpu = rseq_cpu_start();
-               ret = rseq_cmpeqv_storev(&lock->c[cpu].v,
-                                        0, 1, cpu);
+               cpu = get_current_cpu_id();
+               ret = rseq_cmpeqv_storev(RSEQ_MO_RELAXED, RSEQ_PERCPU,
+                                        &lock->c[cpu].v, 0, 1, cpu);
                if (rseq_likely(!ret))
                        break;
                /* Retry if comparison fails or rseq aborts. */
@@ -154,13 +180,14 @@ static void this_cpu_list_push(struct percpu_list *list,
                intptr_t *targetptr, newval, expect;
                int ret;
 
-               cpu = rseq_cpu_start();
+               cpu = get_current_cpu_id();
                /* Load list->c[cpu].head with single-copy atomicity. */
                expect = (intptr_t)RSEQ_READ_ONCE(list->c[cpu].head);
                newval = (intptr_t)node;
                targetptr = (intptr_t *)&list->c[cpu].head;
                node->next = (struct percpu_list_node *)expect;
-               ret = rseq_cmpeqv_storev(targetptr, expect, newval, cpu);
+               ret = rseq_cmpeqv_storev(RSEQ_MO_RELAXED, RSEQ_PERCPU,
+                                        targetptr, expect, newval, cpu);
                if (rseq_likely(!ret))
                        break;
                /* Retry if comparison fails or rseq aborts. */
@@ -183,12 +210,13 @@ static struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,
                long offset;
                int ret, cpu;
 
-               cpu = rseq_cpu_start();
+               cpu = get_current_cpu_id();
                targetptr = (intptr_t *)&list->c[cpu].head;
                expectnot = (intptr_t)NULL;
                offset = offsetof(struct percpu_list_node, next);
                load = (intptr_t *)&head;
-               ret = rseq_cmpnev_storeoffp_load(targetptr, expectnot,
+               ret = rseq_cmpnev_storeoffp_load(RSEQ_MO_RELAXED, RSEQ_PERCPU,
+                                                targetptr, expectnot,
                                                 offset, load, cpu);
                if (rseq_likely(!ret)) {
                        if (_cpu)
@@ -319,7 +347,10 @@ int main(void)
        } else {
                pass("Registered current thread with rseq");
        }
-
+       if (!rseq_validate_cpu_id()) {
+               skip(NR_TESTS, "Error: cpu id getter unavailable");
+               goto end;
+       }
        test_percpu_spinlock();
        test_percpu_list();
 
@@ -330,7 +361,6 @@ int main(void)
        } else {
                pass("Unregistered current thread with rseq");
        }
-
 end:
        exit(exit_status());
 }
This page took 0.032222 seconds and 4 git commands to generate.