linux_kselftest-next-6.8-rc1

This kselftest update for Linux 6.8-rc1 consists of enhancements
 to reporting test results, fixes to root and user run behavior
 and fixing ksft_print_msg() calls.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAmWdmy0ACgkQCwJExA0N
 QxxN0BAA0Uukn5U1LMJ57K+4smPsQ0EfjWCZw9pZ2GL9eWT//JPQDcuGY04jBpmZ
 7zIXMK2k8xctHqmRBkIX8qaLBQI0nHVxpF82UgrvgrJsyCYWvEh6ExDXOFdpYuPi
 t8JOyR2TF3vOeZorIly4ZpxNm5tHG2AXrr2dvaWiuEukfa45YbEHu4qgoLmH0Nr5
 h072085EPTNR6nsBPEwWZFOjQGOGHIqkAiUmXSukQ2iTQXjO4xg/zDiB+sGihUet
 /fNzmAMDnXhf5Uxsk4nRnKTp+XFnJhXpt+mGRcXQBDEveQzxDvl3qdrUOEgIWsAo
 Dz6pUPbarGRsNAMGhHeSdeC5GEWJMB9cZFr3CsTFDzcZHzAacSDBGNpMSCtBq3kU
 Xj/2dFRVN/K4zbCxA+IpjZ3TmSjb7eFi2sOr4EpkKLwkFfXyMpTbtLWSovcfiBzQ
 flnm1Cuhy6nMWBcXH+GtaXb0Ix/R6qFoYi3dt94d686BVSmKbYjSSVanK0cim2lU
 kmf3nBDhZNVunR6mYVWjAovMUHBUmOP6kdBeAS5QCaqwNm1gzXOfOBFIqczPwNbU
 qjxkDhwOb2v7Suze2kTszuHy+zfIrHNN0b8AoLAsA25yVM6ClJZc/Q8Pt0IGvvBF
 bYqup+To8/eUcUD4CsHoE45Huyx7IILBEcCqBk+q8qyaPayFMEA=
 =2+oJ
 -----END PGP SIGNATURE-----

Merge tag 'linux_kselftest-next-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull kselftest update from Shuah Khan:
 "Enhancements to reporting test results, fixes to root and user run
  behavior and fixing ksft_print_msg() calls"

* tag 'linux_kselftest-next-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  tracing/selftests: Add ownership modification tests for eventfs
  selftests: sched: Remove initialization to 0 for a static variable
  selftests: capabilities: namespace create varies for root and normal user
  selftests: prctl: Add prctl test for PR_GET_NAME
  kselftest/vDSO: Use ksft_print_msg() rather than printf in vdso_test_abi
  kselftest/vDSO: Fix message formatting for clock_id logging
  kselftest/vDSO: Make test name reporting for vdso_abi_test tooling friendly
  selftests:x86: Fix Format String Warnings in lam.c
  selftests/breakpoints: Fix format specifier in ksft_print_msg in step_after_suspend_test.c
  selftests:breakpoints: Fix Format String Warning in breakpoint_test
This commit is contained in:
Linus Torvalds 2024-01-09 17:28:41 -08:00
commit ab27740f76
8 changed files with 192 additions and 44 deletions

View File

@ -284,9 +284,9 @@ static void check_success(const char *msg)
nr_tests++; nr_tests++;
if (ret) if (ret)
ksft_test_result_pass(msg); ksft_test_result_pass("%s", msg);
else else
ksft_test_result_fail(msg); ksft_test_result_fail("%s", msg);
} }
static void launch_instruction_breakpoints(char *buf, int local, int global) static void launch_instruction_breakpoints(char *buf, int local, int global)

View File

@ -89,7 +89,7 @@ int run_test(int cpu)
wpid = waitpid(pid, &status, __WALL); wpid = waitpid(pid, &status, __WALL);
if (wpid != pid) { if (wpid != pid) {
ksft_print_msg("waitpid() failed: $s\n", strerror(errno)); ksft_print_msg("waitpid() failed: %s\n", strerror(errno));
return KSFT_FAIL; return KSFT_FAIL;
} }
if (WIFEXITED(status)) { if (WIFEXITED(status)) {

View File

@ -88,11 +88,7 @@ static bool create_and_enter_ns(uid_t inner_uid)
outer_uid = getuid(); outer_uid = getuid();
outer_gid = getgid(); outer_gid = getgid();
/* if (outer_uid == 0 && unshare(CLONE_NEWNS) == 0) {
* TODO: If we're already root, we could skip creating the userns.
*/
if (unshare(CLONE_NEWNS) == 0) {
ksft_print_msg("[NOTE]\tUsing global UIDs for tests\n"); ksft_print_msg("[NOTE]\tUsing global UIDs for tests\n");
if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0)
ksft_exit_fail_msg("PR_SET_KEEPCAPS - %s\n", ksft_exit_fail_msg("PR_SET_KEEPCAPS - %s\n",

View File

@ -0,0 +1,114 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Test file and directory owership changes for eventfs
original_group=`stat -c "%g" .`
original_owner=`stat -c "%u" .`
mount_point=`stat -c '%m' .`
mount_options=`mount | grep "$mount_point" | sed -e 's/.*(\(.*\)).*/\1/'`
# find another owner and group that is not the original
other_group=`tac /etc/group | grep -v ":$original_group:" | head -1 | cut -d: -f3`
other_owner=`tac /etc/passwd | grep -v ":$original_owner:" | head -1 | cut -d: -f3`
# Remove any group ownership already
new_options=`echo "$mount_options" | sed -e "s/gid=[0-9]*/gid=$other_group/"`
if [ "$new_options" = "$mount_options" ]; then
new_options="$mount_options,gid=$other_group"
mount_options="$mount_options,gid=$original_group"
fi
canary="events/timer events/timer/timer_cancel events/timer/timer_cancel/format"
test() {
file=$1
test_group=$2
owner=`stat -c "%u" $file`
group=`stat -c "%g" $file`
echo "testing $file $owner=$original_owner and $group=$test_group"
if [ $owner -ne $original_owner ]; then
exit_fail
fi
if [ $group -ne $test_group ]; then
exit_fail
fi
# Note, the remount does not update ownership so test going to and from owner
echo "test owner $file to $other_owner"
chown $other_owner $file
owner=`stat -c "%u" $file`
if [ $owner -ne $other_owner ]; then
exit_fail
fi
chown $original_owner $file
owner=`stat -c "%u" $file`
if [ $owner -ne $original_owner ]; then
exit_fail
fi
}
run_tests() {
for d in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
test "$d" $other_group
done
chgrp $original_group events
test "events" $original_group
for d in "." "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
test "$d" $other_group
done
chgrp $original_group events/sched
test "events/sched" $original_group
for d in "." "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
test "$d" $other_group
done
chgrp $original_group events/sched/sched_switch
test "events/sched/sched_switch" $original_group
for d in "." "events/sched/sched_switch/enable" $canary; do
test "$d" $other_group
done
chgrp $original_group events/sched/sched_switch/enable
test "events/sched/sched_switch/enable" $original_group
for d in "." $canary; do
test "$d" $other_group
done
}
mount -o remount,"$new_options" .
run_tests
mount -o remount,"$mount_options" .
for d in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
test "$d" $original_group
done
# check instances as well
chgrp $other_group instances
instance="$(mktemp -u test-XXXXXX)"
mkdir instances/$instance
cd instances/$instance
run_tests
cd ../..
rmdir instances/$instance
chgrp $original_group instances
exit 0

View File

@ -12,6 +12,7 @@
#define CHANGE_NAME "changename" #define CHANGE_NAME "changename"
#define EMPTY_NAME "" #define EMPTY_NAME ""
#define TASK_COMM_LEN 16 #define TASK_COMM_LEN 16
#define MAX_PATH_LEN 50
int set_name(char *name) int set_name(char *name)
{ {
@ -47,6 +48,35 @@ int check_null_pointer(char *check_name)
return res; return res;
} }
int check_name(void)
{
int pid;
pid = getpid();
FILE *fptr = NULL;
char path[MAX_PATH_LEN] = {};
char name[TASK_COMM_LEN] = {};
char output[TASK_COMM_LEN] = {};
int j;
j = snprintf(path, MAX_PATH_LEN, "/proc/self/task/%d/comm", pid);
fptr = fopen(path, "r");
if (!fptr)
return -EIO;
fscanf(fptr, "%s", output);
if (ferror(fptr))
return -EIO;
int res = prctl(PR_GET_NAME, name, NULL, NULL, NULL);
if (res < 0)
return -errno;
return !strcmp(output, name);
}
TEST(rename_process) { TEST(rename_process) {
EXPECT_GE(set_name(CHANGE_NAME), 0); EXPECT_GE(set_name(CHANGE_NAME), 0);
@ -57,6 +87,8 @@ TEST(rename_process) {
EXPECT_GE(set_name(CHANGE_NAME), 0); EXPECT_GE(set_name(CHANGE_NAME), 0);
EXPECT_LT(check_null_pointer(CHANGE_NAME), 0); EXPECT_LT(check_null_pointer(CHANGE_NAME), 0);
EXPECT_TRUE(check_name());
} }
TEST_HARNESS_MAIN TEST_HARNESS_MAIN

View File

@ -72,7 +72,7 @@ struct child_args {
static struct child_args procs[MAX_PROCESSES]; static struct child_args procs[MAX_PROCESSES];
static int num_processes = 2; static int num_processes = 2;
static int need_cleanup = 0; static int need_cleanup;
static int _prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, static int _prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4,
unsigned long arg5) unsigned long arg5)

View File

@ -33,9 +33,20 @@ typedef long (*vdso_clock_gettime_t)(clockid_t clk_id, struct timespec *ts);
typedef long (*vdso_clock_getres_t)(clockid_t clk_id, struct timespec *ts); typedef long (*vdso_clock_getres_t)(clockid_t clk_id, struct timespec *ts);
typedef time_t (*vdso_time_t)(time_t *t); typedef time_t (*vdso_time_t)(time_t *t);
#define VDSO_TEST_PASS_MSG() "\n%s(): PASS\n", __func__ const char *vdso_clock_name[12] = {
#define VDSO_TEST_FAIL_MSG(x) "\n%s(): %s FAIL\n", __func__, x "CLOCK_REALTIME",
#define VDSO_TEST_SKIP_MSG(x) "\n%s(): SKIP: Could not find %s\n", __func__, x "CLOCK_MONOTONIC",
"CLOCK_PROCESS_CPUTIME_ID",
"CLOCK_THREAD_CPUTIME_ID",
"CLOCK_MONOTONIC_RAW",
"CLOCK_REALTIME_COARSE",
"CLOCK_MONOTONIC_COARSE",
"CLOCK_BOOTTIME",
"CLOCK_REALTIME_ALARM",
"CLOCK_BOOTTIME_ALARM",
"CLOCK_SGI_CYCLE",
"CLOCK_TAI",
};
static void vdso_test_gettimeofday(void) static void vdso_test_gettimeofday(void)
{ {
@ -44,7 +55,8 @@ static void vdso_test_gettimeofday(void)
(vdso_gettimeofday_t)vdso_sym(version, name[0]); (vdso_gettimeofday_t)vdso_sym(version, name[0]);
if (!vdso_gettimeofday) { if (!vdso_gettimeofday) {
ksft_test_result_skip(VDSO_TEST_SKIP_MSG(name[0])); ksft_print_msg("Couldn't find %s\n", name[0]);
ksft_test_result_skip("%s\n", name[0]);
return; return;
} }
@ -54,9 +66,9 @@ static void vdso_test_gettimeofday(void)
if (ret == 0) { if (ret == 0) {
ksft_print_msg("The time is %lld.%06lld\n", ksft_print_msg("The time is %lld.%06lld\n",
(long long)tv.tv_sec, (long long)tv.tv_usec); (long long)tv.tv_sec, (long long)tv.tv_usec);
ksft_test_result_pass(VDSO_TEST_PASS_MSG()); ksft_test_result_pass("%s\n", name[0]);
} else { } else {
ksft_test_result_fail(VDSO_TEST_FAIL_MSG(name[0])); ksft_test_result_fail("%s\n", name[0]);
} }
} }
@ -67,7 +79,9 @@ static void vdso_test_clock_gettime(clockid_t clk_id)
(vdso_clock_gettime_t)vdso_sym(version, name[1]); (vdso_clock_gettime_t)vdso_sym(version, name[1]);
if (!vdso_clock_gettime) { if (!vdso_clock_gettime) {
ksft_test_result_skip(VDSO_TEST_SKIP_MSG(name[1])); ksft_print_msg("Couldn't find %s\n", name[1]);
ksft_test_result_skip("%s %s\n", name[1],
vdso_clock_name[clk_id]);
return; return;
} }
@ -77,9 +91,11 @@ static void vdso_test_clock_gettime(clockid_t clk_id)
if (ret == 0) { if (ret == 0) {
ksft_print_msg("The time is %lld.%06lld\n", ksft_print_msg("The time is %lld.%06lld\n",
(long long)ts.tv_sec, (long long)ts.tv_nsec); (long long)ts.tv_sec, (long long)ts.tv_nsec);
ksft_test_result_pass(VDSO_TEST_PASS_MSG()); ksft_test_result_pass("%s %s\n", name[1],
vdso_clock_name[clk_id]);
} else { } else {
ksft_test_result_fail(VDSO_TEST_FAIL_MSG(name[1])); ksft_test_result_fail("%s %s\n", name[1],
vdso_clock_name[clk_id]);
} }
} }
@ -90,7 +106,8 @@ static void vdso_test_time(void)
(vdso_time_t)vdso_sym(version, name[2]); (vdso_time_t)vdso_sym(version, name[2]);
if (!vdso_time) { if (!vdso_time) {
ksft_test_result_skip(VDSO_TEST_SKIP_MSG(name[2])); ksft_print_msg("Couldn't find %s\n", name[2]);
ksft_test_result_skip("%s\n", name[2]);
return; return;
} }
@ -99,9 +116,9 @@ static void vdso_test_time(void)
if (ret > 0) { if (ret > 0) {
ksft_print_msg("The time in hours since January 1, 1970 is %lld\n", ksft_print_msg("The time in hours since January 1, 1970 is %lld\n",
(long long)(ret / 3600)); (long long)(ret / 3600));
ksft_test_result_pass(VDSO_TEST_PASS_MSG()); ksft_test_result_pass("%s\n", name[2]);
} else { } else {
ksft_test_result_fail(VDSO_TEST_FAIL_MSG(name[2])); ksft_test_result_fail("%s\n", name[2]);
} }
} }
@ -114,7 +131,9 @@ static void vdso_test_clock_getres(clockid_t clk_id)
(vdso_clock_getres_t)vdso_sym(version, name[3]); (vdso_clock_getres_t)vdso_sym(version, name[3]);
if (!vdso_clock_getres) { if (!vdso_clock_getres) {
ksft_test_result_skip(VDSO_TEST_SKIP_MSG(name[3])); ksft_print_msg("Couldn't find %s\n", name[3]);
ksft_test_result_skip("%s %s\n", name[3],
vdso_clock_name[clk_id]);
return; return;
} }
@ -137,34 +156,21 @@ static void vdso_test_clock_getres(clockid_t clk_id)
clock_getres_fail++; clock_getres_fail++;
if (clock_getres_fail > 0) { if (clock_getres_fail > 0) {
ksft_test_result_fail(VDSO_TEST_FAIL_MSG(name[3])); ksft_test_result_fail("%s %s\n", name[3],
vdso_clock_name[clk_id]);
} else { } else {
ksft_test_result_pass(VDSO_TEST_PASS_MSG()); ksft_test_result_pass("%s %s\n", name[3],
vdso_clock_name[clk_id]);
} }
} }
const char *vdso_clock_name[12] = {
"CLOCK_REALTIME",
"CLOCK_MONOTONIC",
"CLOCK_PROCESS_CPUTIME_ID",
"CLOCK_THREAD_CPUTIME_ID",
"CLOCK_MONOTONIC_RAW",
"CLOCK_REALTIME_COARSE",
"CLOCK_MONOTONIC_COARSE",
"CLOCK_BOOTTIME",
"CLOCK_REALTIME_ALARM",
"CLOCK_BOOTTIME_ALARM",
"CLOCK_SGI_CYCLE",
"CLOCK_TAI",
};
/* /*
* This function calls vdso_test_clock_gettime and vdso_test_clock_getres * This function calls vdso_test_clock_gettime and vdso_test_clock_getres
* with different values for clock_id. * with different values for clock_id.
*/ */
static inline void vdso_test_clock(clockid_t clock_id) static inline void vdso_test_clock(clockid_t clock_id)
{ {
ksft_print_msg("\nclock_id: %s\n", vdso_clock_name[clock_id]); ksft_print_msg("clock_id: %s\n", vdso_clock_name[clock_id]);
vdso_test_clock_gettime(clock_id); vdso_test_clock_gettime(clock_id);
@ -181,14 +187,14 @@ int main(int argc, char **argv)
ksft_set_plan(VDSO_TEST_PLAN); ksft_set_plan(VDSO_TEST_PLAN);
if (!sysinfo_ehdr) { if (!sysinfo_ehdr) {
printf("AT_SYSINFO_EHDR is not present!\n"); ksft_print_msg("AT_SYSINFO_EHDR is not present!\n");
return KSFT_SKIP; return KSFT_SKIP;
} }
version = versions[VDSO_VERSION]; version = versions[VDSO_VERSION];
name = (const char **)&names[VDSO_NAMES]; name = (const char **)&names[VDSO_NAMES];
printf("[vDSO kselftest] VDSO_VERSION: %s\n", version); ksft_print_msg("[vDSO kselftest] VDSO_VERSION: %s\n", version);
vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR)); vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));

View File

@ -817,7 +817,7 @@ static void run_test(struct testcases *test, int count)
/* return 3 is not support LA57, the case should be skipped */ /* return 3 is not support LA57, the case should be skipped */
if (ret == 3) { if (ret == 3) {
ksft_test_result_skip(t->msg); ksft_test_result_skip("%s", t->msg);
continue; continue;
} }
@ -826,7 +826,7 @@ static void run_test(struct testcases *test, int count)
else else
ret = !(t->expected); ret = !(t->expected);
ksft_test_result(ret, t->msg); ksft_test_result(ret, "%s", t->msg);
} }
} }