Commit 9abb16ba authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'linux-kselftest-fixes-5.18-rc2' of...

Merge tag 'linux-kselftest-fixes-5.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull Kselftest fixes from Shuah Khan:
 "Build and run-times fixes to tests:

   - header dependencies

   - missing tear-downs to release allocated resources in assert paths

   - missing error messages when build fails

   - coccicheck and unused variable warnings"

* tag 'linux-kselftest-fixes-5.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  selftests/harness: Pass variant to teardown
  selftests/harness: Run TEARDOWN for ASSERT failures
  selftests: fix an unused variable warning in pidfd selftest
  selftests: fix header dependency for pid_namespace selftests
  selftests: x86: add 32bit build warnings for SUSE
  selftests/proc: fix array_size.cocci warning
  selftests/vDSO: fix array_size.cocci warning
parents 911b2b95 79ee8aa3
Loading
Loading
Loading
Loading
+40 −19
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <setjmp.h>

#include "kselftest.h"

@@ -183,7 +184,10 @@
		struct __test_metadata *_metadata, \
		struct __fixture_variant_metadata *variant) \
	{ \
		_metadata->setup_completed = true; \
		if (setjmp(_metadata->env) == 0) \
			test_name(_metadata); \
		__test_check_assert(_metadata); \
	} \
	static struct __test_metadata _##test_name##_object = \
		{ .name = #test_name, \
@@ -287,7 +291,9 @@
#define FIXTURE_TEARDOWN(fixture_name) \
	void fixture_name##_teardown( \
		struct __test_metadata __attribute__((unused)) *_metadata, \
		FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
		FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \
		const FIXTURE_VARIANT(fixture_name) \
			__attribute__((unused)) *variant)

/**
 * FIXTURE_VARIANT() - Optionally called once per fixture
@@ -302,9 +308,9 @@
 *       ...
 *     };
 *
 * Defines type of constant parameters provided to FIXTURE_SETUP() and TEST_F()
 * as *variant*. Variants allow the same tests to be run with different
 * arguments.
 * Defines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and
 * FIXTURE_TEARDOWN as *variant*. Variants allow the same tests to be run with
 * different arguments.
 */
#define FIXTURE_VARIANT(fixture_name) struct _fixture_variant_##fixture_name

@@ -356,10 +362,7 @@
 * Defines a test that depends on a fixture (e.g., is part of a test case).
 * Very similar to TEST() except that *self* is the setup instance of fixture's
 * datatype exposed for use by the implementation.
 *
 * Warning: use of ASSERT_* here will skip TEARDOWN.
 */
/* TODO(wad) register fixtures on dedicated test lists. */
#define TEST_F(fixture_name, test_name) \
	__TEST_F_IMPL(fixture_name, test_name, -1, TEST_TIMEOUT_DEFAULT)

@@ -381,12 +384,17 @@
		/* fixture data is alloced, setup, and torn down per call. */ \
		FIXTURE_DATA(fixture_name) self; \
		memset(&self, 0, sizeof(FIXTURE_DATA(fixture_name))); \
		if (setjmp(_metadata->env) == 0) { \
			fixture_name##_setup(_metadata, &self, variant->data); \
			/* Let setup failure terminate early. */ \
			if (!_metadata->passed) \
				return; \
			_metadata->setup_completed = true; \
			fixture_name##_##test_name(_metadata, &self, variant->data); \
		fixture_name##_teardown(_metadata, &self); \
		} \
		if (_metadata->setup_completed) \
			fixture_name##_teardown(_metadata, &self, variant->data); \
		__test_check_assert(_metadata); \
	} \
	static struct __test_metadata \
		      _##fixture_name##_##test_name##_object = { \
@@ -683,7 +691,7 @@
 */
#define OPTIONAL_HANDLER(_assert) \
	for (; _metadata->trigger; _metadata->trigger = \
			__bail(_assert, _metadata->no_print, _metadata->step))
			__bail(_assert, _metadata))

#define __INC_STEP(_metadata) \
	/* Keep "step" below 255 (which is used for "SKIP" reporting). */	\
@@ -830,6 +838,9 @@ struct __test_metadata {
	bool timed_out;	/* did this test timeout instead of exiting? */
	__u8 step;
	bool no_print; /* manual trigger when TH_LOG_STREAM is not available */
	bool aborted;	/* stopped test due to failed ASSERT */
	bool setup_completed; /* did setup finish? */
	jmp_buf env;	/* for exiting out of test early */
	struct __test_results *results;
	struct __test_metadata *prev, *next;
};
@@ -848,16 +859,26 @@ static inline void __register_test(struct __test_metadata *t)
	__LIST_APPEND(t->fixture->tests, t);
}

static inline int __bail(int for_realz, bool no_print, __u8 step)
static inline int __bail(int for_realz, struct __test_metadata *t)
{
	/* if this is ASSERT, return immediately. */
	if (for_realz) {
		if (no_print)
			_exit(step);
		abort();
		t->aborted = true;
		longjmp(t->env, 1);
	}
	/* otherwise, end the for loop and continue. */
	return 0;
}

static inline void __test_check_assert(struct __test_metadata *t)
{
	if (t->aborted) {
		if (t->no_print)
			_exit(t->step);
		abort();
	}
}

struct __test_metadata *__active_test;
static void __timeout_handler(int sig, siginfo_t *info, void *ucontext)
{
+3 −3
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
CFLAGS += -g -I../../../../usr/include/

TEST_GEN_PROGS := regression_enomem
TEST_GEN_PROGS = regression_enomem

include ../lib.mk
LOCAL_HDRS += $(selfdir)/pidfd/pidfd.h

$(OUTPUT)/regression_enomem: regression_enomem.c ../pidfd/pidfd.h
include ../lib.mk
+0 −1
Original line number Diff line number Diff line
@@ -95,7 +95,6 @@ TEST(wait_states)
		.flags = CLONE_PIDFD | CLONE_PARENT_SETTID,
		.exit_signal = SIGCHLD,
	};
	int ret;
	pid_t pid;
	siginfo_t info = {
		.si_signo = 0,
+4 −2
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@
#include <sys/time.h>
#include <sys/resource.h>

#include "../kselftest.h"

static inline long sys_execveat(int dirfd, const char *pathname, char **argv, char **envp, int flags)
{
	return syscall(SYS_execveat, dirfd, pathname, argv, envp, flags);
@@ -368,7 +370,7 @@ int main(void)
		};
		int i;

		for (i = 0; i < sizeof(S)/sizeof(S[0]); i++) {
		for (i = 0; i < ARRAY_SIZE(S); i++) {
			assert(memmem(buf, rv, S[i], strlen(S[i])));
		}

@@ -417,7 +419,7 @@ int main(void)
		};
		int i;

		for (i = 0; i < sizeof(S)/sizeof(S[0]); i++) {
		for (i = 0; i < ARRAY_SIZE(S); i++) {
			assert(memmem(buf, rv, S[i], strlen(S[i])));
		}
	}
+3 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <limits.h>

#include "vdso_config.h"
#include "../kselftest.h"

static const char **name;

@@ -306,10 +307,8 @@ static void test_clock_gettime(void)
		return;
	}

	for (int clock = 0; clock < sizeof(clocknames) / sizeof(clocknames[0]);
	     clock++) {
	for (int clock = 0; clock < ARRAY_SIZE(clocknames); clock++)
		test_one_clock_gettime(clock, clocknames[clock]);
	}

	/* Also test some invalid clock ids */
	test_one_clock_gettime(-1, "invalid");
@@ -370,10 +369,8 @@ static void test_clock_gettime64(void)
		return;
	}

	for (int clock = 0; clock < sizeof(clocknames) / sizeof(clocknames[0]);
	     clock++) {
	for (int clock = 0; clock < ARRAY_SIZE(clocknames); clock++)
		test_one_clock_gettime64(clock, clocknames[clock]);
	}

	/* Also test some invalid clock ids */
	test_one_clock_gettime64(-1, "invalid");
Loading