Skip to content

Commit

Permalink
selftests/x86/xstate: Consolidate test invocations into a single entry
Browse files Browse the repository at this point in the history
Currently, each of the three xstate tests runs as a separate invocation,
requiring the xstate number to be passed and state information to be
reconstructed repeatedly. This approach arose from their individual and
isolated development, but now it makes sense to unify them.

Introduce a wrapper function that first verifies feature availability
from the kernel and constructs the necessary state information once. The
wrapper then sequentially invokes all tests to ensure consistent
execution.

Update the AMX test to use this unified invocation.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20250226010731.2456-8-chang.seok.bae@intel.com
  • Loading branch information
Chang S. Bae authored and Ingo Molnar committed Feb 26, 2025
1 parent e075d9f commit 10d8a20
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 19 deletions.
11 changes: 5 additions & 6 deletions tools/testing/selftests/x86/amx.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,6 @@ static void test_fork(void)

int main(void)
{
const unsigned int ctxtsw_num_threads = 5, ctxtsw_iterations = 10;
unsigned long features;
long rc;

Expand All @@ -506,11 +505,11 @@ int main(void)

test_fork();

test_context_switch(XFEATURE_XTILEDATA, ctxtsw_num_threads, ctxtsw_iterations);

test_ptrace(XFEATURE_XTILEDATA);

test_signal(XFEATURE_XTILEDATA);
/*
* Perform generic xstate tests for context switching, ptrace,
* and signal.
*/
test_xstate(XFEATURE_XTILEDATA);

clearhandler(SIGILL);
free_stashed_xsave();
Expand Down
38 changes: 28 additions & 10 deletions tools/testing/selftests/x86/xstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
#include <pthread.h>
#include <stdbool.h>

#include <asm/prctl.h>
#include <sys/ptrace.h>
#include <sys/syscall.h>
#include <sys/uio.h>
#include <sys/wait.h>

Expand Down Expand Up @@ -189,15 +191,13 @@ static void affinitize_cpu0(void)
ksft_exit_fail_msg("sched_setaffinity to CPU 0 failed\n");
}

void test_context_switch(uint32_t feature_num, uint32_t num_threads, uint32_t iterations)
static void test_context_switch(uint32_t num_threads, uint32_t iterations)
{
struct futex_info *finfo;

/* Affinitize to one CPU to force context switches */
affinitize_cpu0();

xstate = get_xstate_info(feature_num);

printf("[RUN]\t%s: check context switches, %d iterations, %d threads.\n",
xstate.name, iterations, num_threads);

Expand Down Expand Up @@ -299,13 +299,11 @@ static void ptracer_inject_xstate(pid_t target)
free(xbuf2);
}

void test_ptrace(uint32_t feature_num)
static void test_ptrace(void)
{
pid_t child;
int status;

xstate = get_xstate_info(feature_num);

child = fork();
if (child < 0) {
ksft_exit_fail_msg("fork() failed\n");
Expand Down Expand Up @@ -392,17 +390,14 @@ static void validate_sigfpstate(int sig, siginfo_t *si, void *ctx_void)
copy_xstate(stashed_xbuf, xbuf);
}

void test_signal(uint32_t feature_num)
static void test_signal(void)
{
bool valid_xstate;

xstate = get_xstate_info(feature_num);

/*
* The signal handler will access this to verify xstate context
* preservation.
*/

stashed_xbuf = alloc_xbuf();
if (!stashed_xbuf)
ksft_exit_fail_msg("unable to allocate XSAVE buffer\n");
Expand Down Expand Up @@ -433,3 +428,26 @@ void test_signal(uint32_t feature_num)
clearhandler(SIGUSR1);
free(stashed_xbuf);
}

void test_xstate(uint32_t feature_num)
{
const unsigned int ctxtsw_num_threads = 5, ctxtsw_iterations = 10;
unsigned long features;
long rc;

rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_SUPP, &features);
if (rc || !(features & (1 << feature_num))) {
ksft_print_msg("The kernel does not support feature number: %u\n", feature_num);
return;
}

xstate = get_xstate_info(feature_num);
if (!xstate.size || !xstate.xbuf_offset) {
ksft_exit_fail_msg("invalid state size/offset (%d/%d)\n",
xstate.size, xstate.xbuf_offset);
}

test_context_switch(ctxtsw_num_threads, ctxtsw_iterations);
test_ptrace();
test_signal();
}
5 changes: 2 additions & 3 deletions tools/testing/selftests/x86/xstate.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,7 @@ static inline void set_rand_data(struct xstate_info *xstate, struct xsave_buffer
*ptr = data;
}

void test_context_switch(uint32_t feature_num, uint32_t num_threads, uint32_t iterations);
void test_ptrace(uint32_t feature_num);
void test_signal(uint32_t feature_num);
/* Testing kernel's context switching and ABI support for the xstate. */
void test_xstate(uint32_t feature_num);

#endif /* __SELFTESTS_X86_XSTATE_H */

0 comments on commit 10d8a20

Please sign in to comment.