Commit c0176429 authored by Michael Ellerman's avatar Michael Ellerman
Browse files

selftests/powerpc: Fix TM tests when CPU 0 is offline



Several of the TM tests fail spuriously if CPU 0 is offline, because
they blindly try to affinitise to CPU 0.

Fix them by picking any online CPU and using that instead.

Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200813013445.686464-1-mpe@ellerman.id.au
parent 10bf59d9
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@

int tm_poison_test(void)
{
	int pid;
	int cpu, pid;
	cpu_set_t cpuset;
	uint64_t poison = 0xdeadbeefc0dec0fe;
	uint64_t unknown = 0;
@@ -35,10 +35,13 @@ int tm_poison_test(void)

	SKIP_IF(!have_htm());

	/* Attach both Child and Parent to CPU 0 */
	cpu = pick_online_cpu();
	FAIL_IF(cpu < 0);

	// Attach both Child and Parent to the same CPU
	CPU_ZERO(&cpuset);
	CPU_SET(0, &cpuset);
	sched_setaffinity(0, sizeof(cpuset), &cpuset);
	CPU_SET(cpu, &cpuset);
	FAIL_IF(sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0);

	pid = fork();
	if (!pid) {
+6 −4
Original line number Diff line number Diff line
@@ -247,8 +247,7 @@ void *pong(void *not_used)
int tm_trap_test(void)
{
	uint16_t k = 1;

	int rc;
	int cpu, rc;

	pthread_attr_t attr;
	cpu_set_t cpuset;
@@ -267,9 +266,12 @@ int tm_trap_test(void)
	usr1_sa.sa_sigaction = usr1_signal_handler;
	sigaction(SIGUSR1, &usr1_sa, NULL);

	/* Set only CPU 0 in the mask. Both threads will be bound to cpu 0. */
	cpu = pick_online_cpu();
	FAIL_IF(cpu < 0);

	// Set only one CPU in the mask. Both threads will be bound to that CPU.
	CPU_ZERO(&cpuset);
	CPU_SET(0, &cpuset);
	CPU_SET(cpu, &cpuset);

	/* Init pthread attribute */
	rc = pthread_attr_init(&attr);
+6 −3
Original line number Diff line number Diff line
@@ -338,16 +338,19 @@ void test_fp_vec(int fp, int vec, pthread_attr_t *attr)

int tm_unavailable_test(void)
{
	int rc, exception; /* FP = 0, VEC = 1, VSX = 2 */
	int cpu, rc, exception; /* FP = 0, VEC = 1, VSX = 2 */
	pthread_t t1;
	pthread_attr_t attr;
	cpu_set_t cpuset;

	SKIP_IF(!have_htm());

	/* Set only CPU 0 in the mask. Both threads will be bound to CPU 0. */
	cpu = pick_online_cpu();
	FAIL_IF(cpu < 0);

	// Set only one CPU in the mask. Both threads will be bound to that CPU.
	CPU_ZERO(&cpuset);
	CPU_SET(0, &cpuset);
	CPU_SET(cpu, &cpuset);

	/* Init pthread attribute. */
	rc = pthread_attr_init(&attr);