Commit b395e55b authored by Gustavo Romero's avatar Gustavo Romero Committed by Michael Ellerman

selftests/powerpc: Skip tm-unavailable if TM is not enabled

Some processor revisions do not support transactional memory, and
additionally kernel support can be disabled. In either case the
tm-unavailable test should be skipped, otherwise it will fail with
a SIGILL.

That commit also sets this selftest to be called through the test
harness as it's done for other TM selftests.

Finally, it avoids using "ping" as a thread name since it's
ambiguous and can be confusing when shown, for instance,
in a kernel backtrace log.

Fixes: 77fad8bf ("selftests/powerpc: Check FP/VEC on exception in TM")
Signed-off-by: default avatarGustavo Romero <gromero@linux.vnet.ibm.com>
Reviewed-by: default avatarCyril Bur <cyrilbur@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 58935176
...@@ -80,7 +80,7 @@ bool is_failure(uint64_t condition_reg) ...@@ -80,7 +80,7 @@ bool is_failure(uint64_t condition_reg)
return ((condition_reg >> 28) & 0xa) == 0xa; return ((condition_reg >> 28) & 0xa) == 0xa;
} }
void *ping(void *input) void *tm_una_ping(void *input)
{ {
/* /*
...@@ -280,7 +280,7 @@ void *ping(void *input) ...@@ -280,7 +280,7 @@ void *ping(void *input)
} }
/* Thread to force context switch */ /* Thread to force context switch */
void *pong(void *not_used) void *tm_una_pong(void *not_used)
{ {
/* Wait thread get its name "pong". */ /* Wait thread get its name "pong". */
if (DEBUG) if (DEBUG)
...@@ -311,11 +311,11 @@ void test_fp_vec(int fp, int vec, pthread_attr_t *attr) ...@@ -311,11 +311,11 @@ void test_fp_vec(int fp, int vec, pthread_attr_t *attr)
do { do {
int rc; int rc;
/* Bind 'ping' to CPU 0, as specified in 'attr'. */ /* Bind to CPU 0, as specified in 'attr'. */
rc = pthread_create(&t0, attr, ping, (void *) &flags); rc = pthread_create(&t0, attr, tm_una_ping, (void *) &flags);
if (rc) if (rc)
pr_err(rc, "pthread_create()"); pr_err(rc, "pthread_create()");
rc = pthread_setname_np(t0, "ping"); rc = pthread_setname_np(t0, "tm_una_ping");
if (rc) if (rc)
pr_warn(rc, "pthread_setname_np"); pr_warn(rc, "pthread_setname_np");
rc = pthread_join(t0, &ret_value); rc = pthread_join(t0, &ret_value);
...@@ -333,13 +333,15 @@ void test_fp_vec(int fp, int vec, pthread_attr_t *attr) ...@@ -333,13 +333,15 @@ void test_fp_vec(int fp, int vec, pthread_attr_t *attr)
} }
} }
int main(int argc, char **argv) int tm_unavailable_test(void)
{ {
int rc, exception; /* FP = 0, VEC = 1, VSX = 2 */ int rc, exception; /* FP = 0, VEC = 1, VSX = 2 */
pthread_t t1; pthread_t t1;
pthread_attr_t attr; pthread_attr_t attr;
cpu_set_t cpuset; cpu_set_t cpuset;
SKIP_IF(!have_htm());
/* Set only CPU 0 in the mask. Both threads will be bound to CPU 0. */ /* Set only CPU 0 in the mask. Both threads will be bound to CPU 0. */
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
CPU_SET(0, &cpuset); CPU_SET(0, &cpuset);
...@@ -354,12 +356,12 @@ int main(int argc, char **argv) ...@@ -354,12 +356,12 @@ int main(int argc, char **argv)
if (rc) if (rc)
pr_err(rc, "pthread_attr_setaffinity_np()"); pr_err(rc, "pthread_attr_setaffinity_np()");
rc = pthread_create(&t1, &attr /* Bind 'pong' to CPU 0 */, pong, NULL); rc = pthread_create(&t1, &attr /* Bind to CPU 0 */, tm_una_pong, NULL);
if (rc) if (rc)
pr_err(rc, "pthread_create()"); pr_err(rc, "pthread_create()");
/* Name it for systemtap convenience */ /* Name it for systemtap convenience */
rc = pthread_setname_np(t1, "pong"); rc = pthread_setname_np(t1, "tm_una_pong");
if (rc) if (rc)
pr_warn(rc, "pthread_create()"); pr_warn(rc, "pthread_create()");
...@@ -394,3 +396,9 @@ int main(int argc, char **argv) ...@@ -394,3 +396,9 @@ int main(int argc, char **argv)
exit(0); exit(0);
} }
} }
int main(int argc, char **argv)
{
test_harness_set_timeout(220);
return test_harness(tm_unavailable_test, "tm_unavailable_test");
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment