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:
commit
ab27740f76
@ -284,9 +284,9 @@ static void check_success(const char *msg)
|
||||
nr_tests++;
|
||||
|
||||
if (ret)
|
||||
ksft_test_result_pass(msg);
|
||||
ksft_test_result_pass("%s", msg);
|
||||
else
|
||||
ksft_test_result_fail(msg);
|
||||
ksft_test_result_fail("%s", msg);
|
||||
}
|
||||
|
||||
static void launch_instruction_breakpoints(char *buf, int local, int global)
|
||||
|
@ -89,7 +89,7 @@ int run_test(int cpu)
|
||||
|
||||
wpid = waitpid(pid, &status, __WALL);
|
||||
if (wpid != pid) {
|
||||
ksft_print_msg("waitpid() failed: $s\n", strerror(errno));
|
||||
ksft_print_msg("waitpid() failed: %s\n", strerror(errno));
|
||||
return KSFT_FAIL;
|
||||
}
|
||||
if (WIFEXITED(status)) {
|
||||
|
@ -88,11 +88,7 @@ static bool create_and_enter_ns(uid_t inner_uid)
|
||||
outer_uid = getuid();
|
||||
outer_gid = getgid();
|
||||
|
||||
/*
|
||||
* TODO: If we're already root, we could skip creating the userns.
|
||||
*/
|
||||
|
||||
if (unshare(CLONE_NEWNS) == 0) {
|
||||
if (outer_uid == 0 && unshare(CLONE_NEWNS) == 0) {
|
||||
ksft_print_msg("[NOTE]\tUsing global UIDs for tests\n");
|
||||
if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0)
|
||||
ksft_exit_fail_msg("PR_SET_KEEPCAPS - %s\n",
|
||||
|
114
tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc
Normal file
114
tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc
Normal 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
|
@ -12,6 +12,7 @@
|
||||
#define CHANGE_NAME "changename"
|
||||
#define EMPTY_NAME ""
|
||||
#define TASK_COMM_LEN 16
|
||||
#define MAX_PATH_LEN 50
|
||||
|
||||
int set_name(char *name)
|
||||
{
|
||||
@ -47,6 +48,35 @@ int check_null_pointer(char *check_name)
|
||||
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) {
|
||||
|
||||
EXPECT_GE(set_name(CHANGE_NAME), 0);
|
||||
@ -57,6 +87,8 @@ TEST(rename_process) {
|
||||
|
||||
EXPECT_GE(set_name(CHANGE_NAME), 0);
|
||||
EXPECT_LT(check_null_pointer(CHANGE_NAME), 0);
|
||||
|
||||
EXPECT_TRUE(check_name());
|
||||
}
|
||||
|
||||
TEST_HARNESS_MAIN
|
||||
|
@ -72,7 +72,7 @@ struct child_args {
|
||||
|
||||
static struct child_args procs[MAX_PROCESSES];
|
||||
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,
|
||||
unsigned long arg5)
|
||||
|
@ -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 time_t (*vdso_time_t)(time_t *t);
|
||||
|
||||
#define VDSO_TEST_PASS_MSG() "\n%s(): PASS\n", __func__
|
||||
#define VDSO_TEST_FAIL_MSG(x) "\n%s(): %s FAIL\n", __func__, x
|
||||
#define VDSO_TEST_SKIP_MSG(x) "\n%s(): SKIP: Could not find %s\n", __func__, x
|
||||
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",
|
||||
};
|
||||
|
||||
static void vdso_test_gettimeofday(void)
|
||||
{
|
||||
@ -44,7 +55,8 @@ static void vdso_test_gettimeofday(void)
|
||||
(vdso_gettimeofday_t)vdso_sym(version, name[0]);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -54,9 +66,9 @@ static void vdso_test_gettimeofday(void)
|
||||
if (ret == 0) {
|
||||
ksft_print_msg("The time is %lld.%06lld\n",
|
||||
(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 {
|
||||
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]);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -77,9 +91,11 @@ static void vdso_test_clock_gettime(clockid_t clk_id)
|
||||
if (ret == 0) {
|
||||
ksft_print_msg("The time is %lld.%06lld\n",
|
||||
(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 {
|
||||
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]);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -99,9 +116,9 @@ static void vdso_test_time(void)
|
||||
if (ret > 0) {
|
||||
ksft_print_msg("The time in hours since January 1, 1970 is %lld\n",
|
||||
(long long)(ret / 3600));
|
||||
ksft_test_result_pass(VDSO_TEST_PASS_MSG());
|
||||
ksft_test_result_pass("%s\n", name[2]);
|
||||
} 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]);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -137,34 +156,21 @@ static void vdso_test_clock_getres(clockid_t clk_id)
|
||||
clock_getres_fail++;
|
||||
|
||||
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 {
|
||||
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
|
||||
* with different values for 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);
|
||||
|
||||
@ -181,14 +187,14 @@ int main(int argc, char **argv)
|
||||
ksft_set_plan(VDSO_TEST_PLAN);
|
||||
|
||||
if (!sysinfo_ehdr) {
|
||||
printf("AT_SYSINFO_EHDR is not present!\n");
|
||||
ksft_print_msg("AT_SYSINFO_EHDR is not present!\n");
|
||||
return KSFT_SKIP;
|
||||
}
|
||||
|
||||
version = versions[VDSO_VERSION];
|
||||
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));
|
||||
|
||||
|
@ -817,7 +817,7 @@ static void run_test(struct testcases *test, int count)
|
||||
|
||||
/* return 3 is not support LA57, the case should be skipped */
|
||||
if (ret == 3) {
|
||||
ksft_test_result_skip(t->msg);
|
||||
ksft_test_result_skip("%s", t->msg);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -826,7 +826,7 @@ static void run_test(struct testcases *test, int count)
|
||||
else
|
||||
ret = !(t->expected);
|
||||
|
||||
ksft_test_result(ret, t->msg);
|
||||
ksft_test_result(ret, "%s", t->msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user