Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b43bc38 authored by Athira Rajeev's avatar Athira Rajeev Committed by Greg Kroah-Hartman
Browse files

testing/selftests/mqueue: Fix mq_perf_tests to free the allocated cpu set



[ Upstream commit ce64763c63854b4079f2e036638aa881a1fb3fbc ]

The selftest "mqueue/mq_perf_tests.c" use CPU_ALLOC to allocate
CPU set. This cpu set is used further in pthread_attr_setaffinity_np
and by pthread_create in the code. But in current code, allocated
cpu set is not freed.

Fix this issue by adding CPU_FREE in the "shutdown" function which
is called in most of the error/exit path for the cleanup. There are
few error paths which exit without using shutdown. Add a common goto
error path with CPU_FREE for these cases.

Fixes: 7820b071 ("tools/selftests: add mq_perf_tests")
Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 268d58f5
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -180,6 +180,9 @@ void shutdown(int exit_val, char *err_cause, int line_no)
	if (in_shutdown++)
		return;

	/* Free the cpu_set allocated using CPU_ALLOC in main function */
	CPU_FREE(cpu_set);

	for (i = 0; i < num_cpus_to_pin; i++)
		if (cpu_threads[i]) {
			pthread_kill(cpu_threads[i], SIGUSR1);
@@ -551,6 +554,12 @@ int main(int argc, char *argv[])
		perror("sysconf(_SC_NPROCESSORS_ONLN)");
		exit(1);
	}

	if (getuid() != 0)
		ksft_exit_skip("Not running as root, but almost all tests "
			"require root in order to modify\nsystem settings.  "
			"Exiting.\n");

	cpus_online = min(MAX_CPUS, sysconf(_SC_NPROCESSORS_ONLN));
	cpu_set = CPU_ALLOC(cpus_online);
	if (cpu_set == NULL) {
@@ -589,7 +598,7 @@ int main(int argc, char *argv[])
						cpu_set)) {
					fprintf(stderr, "Any given CPU may "
						"only be given once.\n");
					exit(1);
					goto err_code;
				} else
					CPU_SET_S(cpus_to_pin[cpu],
						  cpu_set_size, cpu_set);
@@ -607,7 +616,7 @@ int main(int argc, char *argv[])
				queue_path = malloc(strlen(option) + 2);
				if (!queue_path) {
					perror("malloc()");
					exit(1);
					goto err_code;
				}
				queue_path[0] = '/';
				queue_path[1] = 0;
@@ -622,17 +631,12 @@ int main(int argc, char *argv[])
		fprintf(stderr, "Must pass at least one CPU to continuous "
			"mode.\n");
		poptPrintUsage(popt_context, stderr, 0);
		exit(1);
		goto err_code;
	} else if (!continuous_mode) {
		num_cpus_to_pin = 1;
		cpus_to_pin[0] = cpus_online - 1;
	}

	if (getuid() != 0)
		ksft_exit_skip("Not running as root, but almost all tests "
			"require root in order to modify\nsystem settings.  "
			"Exiting.\n");

	max_msgs = fopen(MAX_MSGS, "r+");
	max_msgsize = fopen(MAX_MSGSIZE, "r+");
	if (!max_msgs)
@@ -740,4 +744,9 @@ int main(int argc, char *argv[])
			sleep(1);
	}
	shutdown(0, "", 0);

err_code:
	CPU_FREE(cpu_set);
	exit(1);

}