linux-kselftest-5.0-rc4
This Kselftest update for Linux 5.0-rc4 consists of fixes to rtc, seccomp and other tests. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAlxHTz0ACgkQCwJExA0N Qxzt9hAAutAJagSuFROtzJN//x7oGQl5v1DnbLERI388vK4a+vL3bEsHh7QRlUbe x3mu6PZCQ/kFl5f7mrICuBPRWxSJA4rDVGeLWJlKUKqoB/rW/W1bvCBVPXCO2XMc FLxAXDd/bL/NsDOBJUjkk1mHYcfmB8dqPlLZM/ArbZbQLRBKXocTP7VclNtrZmgJ vIB3WU+JfgW4Bx8DlkZbiWohe+vazfDYbBoYMmh4OrCwuxOZL0T6cAd3qddCoP/N SOpryfCMHN8TX5f3L+BFqkF2vk7EbKRGxVW1bOJ9SXIN1/XCKTp9/VqVrryJ4Dx2 Hf6YNnoRGGphFErJ+9IRF3qLWxObkHYRWwKL4ZEqkB7VxIHNqpfYO9t5H8lhzFoy rhSQM0a9UNoCplKfzsLx5uRGC+/dPPVDCashF6grpqws3nDBIYwTdN3bdtYBkhjL V1AYslysX+frxzTtPdRvJI2w8Y7BUjRBjuFkXJxTsfPzyPa/oyIx8QEP1yifTJu4 4ijfsZbmSoCynCK9ckw7DL2IOLHUrVbr2jldPsbPROo+Vy0nDhILbvbm+bYQXchM OmBRnX9NbWLrnI3ZeF4tuKbz1R4Ax/Z1qRWzZoKo9V469l5wSTkYHkZFPcmwNWyo vvSSJ0YmtKkLclrT4/GYvL2qVYXAGFy2HV44Ag5S3b+KehkIZFI= =xk1L -----END PGP SIGNATURE----- Merge tag 'linux-kselftest-5.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest Pull kselftest fixes from Shuah Khan: "Fixes to rtc, seccomp and other tests" * tag 'linux-kselftest-5.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest: selftests/seccomp: Abort without user notification support selftests: gpio-mockup-chardev: Check asprintf() for error selftests: seccomp: use LDLIBS instead of LDFLAGS selftests/vm/gup_benchmark.c: match gup struct to kernel tools/testing/selftests/x86/unwind_vdso.c: Remove duplicate header x86/mpx/selftests: fix spelling mistake "succeded" -> "succeeded" selftests: rtc: rtctest: add alarm test on minute boundary selftests: rtc: rtctest: fix alarm tests
This commit is contained in:
commit
8f45fa2724
|
@ -37,7 +37,7 @@ static int get_debugfs(char **path)
|
||||||
struct libmnt_table *tb;
|
struct libmnt_table *tb;
|
||||||
struct libmnt_iter *itr = NULL;
|
struct libmnt_iter *itr = NULL;
|
||||||
struct libmnt_fs *fs;
|
struct libmnt_fs *fs;
|
||||||
int found = 0;
|
int found = 0, ret;
|
||||||
|
|
||||||
cxt = mnt_new_context();
|
cxt = mnt_new_context();
|
||||||
if (!cxt)
|
if (!cxt)
|
||||||
|
@ -58,8 +58,11 @@ static int get_debugfs(char **path)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found)
|
if (found) {
|
||||||
asprintf(path, "%s/gpio", mnt_fs_get_target(fs));
|
ret = asprintf(path, "%s/gpio", mnt_fs_get_target(fs));
|
||||||
|
if (ret < 0)
|
||||||
|
err(EXIT_FAILURE, "failed to format string");
|
||||||
|
}
|
||||||
|
|
||||||
mnt_free_iter(itr);
|
mnt_free_iter(itr);
|
||||||
mnt_free_context(cxt);
|
mnt_free_context(cxt);
|
||||||
|
|
|
@ -145,15 +145,12 @@ TEST_F(rtc, alarm_alm_set) {
|
||||||
|
|
||||||
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
||||||
ASSERT_NE(-1, rc);
|
ASSERT_NE(-1, rc);
|
||||||
EXPECT_NE(0, rc);
|
ASSERT_NE(0, rc);
|
||||||
|
|
||||||
/* Disable alarm interrupts */
|
/* Disable alarm interrupts */
|
||||||
rc = ioctl(self->fd, RTC_AIE_OFF, 0);
|
rc = ioctl(self->fd, RTC_AIE_OFF, 0);
|
||||||
ASSERT_NE(-1, rc);
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
if (rc == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
rc = read(self->fd, &data, sizeof(unsigned long));
|
rc = read(self->fd, &data, sizeof(unsigned long));
|
||||||
ASSERT_NE(-1, rc);
|
ASSERT_NE(-1, rc);
|
||||||
TH_LOG("data: %lx", data);
|
TH_LOG("data: %lx", data);
|
||||||
|
@ -202,7 +199,109 @@ TEST_F(rtc, alarm_wkalm_set) {
|
||||||
|
|
||||||
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
||||||
ASSERT_NE(-1, rc);
|
ASSERT_NE(-1, rc);
|
||||||
EXPECT_NE(0, rc);
|
ASSERT_NE(0, rc);
|
||||||
|
|
||||||
|
rc = read(self->fd, &data, sizeof(unsigned long));
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_RD_TIME, &tm);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
new = timegm((struct tm *)&tm);
|
||||||
|
ASSERT_EQ(new, secs);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(rtc, alarm_alm_set_minute) {
|
||||||
|
struct timeval tv = { .tv_sec = 62 };
|
||||||
|
unsigned long data;
|
||||||
|
struct rtc_time tm;
|
||||||
|
fd_set readfds;
|
||||||
|
time_t secs, new;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_RD_TIME, &tm);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
secs = timegm((struct tm *)&tm) + 60 - tm.tm_sec;
|
||||||
|
gmtime_r(&secs, (struct tm *)&tm);
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_ALM_SET, &tm);
|
||||||
|
if (rc == -1) {
|
||||||
|
ASSERT_EQ(EINVAL, errno);
|
||||||
|
TH_LOG("skip alarms are not supported.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_ALM_READ, &tm);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
TH_LOG("Alarm time now set to %02d:%02d:%02d.",
|
||||||
|
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||||
|
|
||||||
|
/* Enable alarm interrupts */
|
||||||
|
rc = ioctl(self->fd, RTC_AIE_ON, 0);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
FD_ZERO(&readfds);
|
||||||
|
FD_SET(self->fd, &readfds);
|
||||||
|
|
||||||
|
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
ASSERT_NE(0, rc);
|
||||||
|
|
||||||
|
/* Disable alarm interrupts */
|
||||||
|
rc = ioctl(self->fd, RTC_AIE_OFF, 0);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
rc = read(self->fd, &data, sizeof(unsigned long));
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
TH_LOG("data: %lx", data);
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_RD_TIME, &tm);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
new = timegm((struct tm *)&tm);
|
||||||
|
ASSERT_EQ(new, secs);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(rtc, alarm_wkalm_set_minute) {
|
||||||
|
struct timeval tv = { .tv_sec = 62 };
|
||||||
|
struct rtc_wkalrm alarm = { 0 };
|
||||||
|
struct rtc_time tm;
|
||||||
|
unsigned long data;
|
||||||
|
fd_set readfds;
|
||||||
|
time_t secs, new;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_RD_TIME, &alarm.time);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
secs = timegm((struct tm *)&alarm.time) + 60 - alarm.time.tm_sec;
|
||||||
|
gmtime_r(&secs, (struct tm *)&alarm.time);
|
||||||
|
|
||||||
|
alarm.enabled = 1;
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_WKALM_SET, &alarm);
|
||||||
|
if (rc == -1) {
|
||||||
|
ASSERT_EQ(EINVAL, errno);
|
||||||
|
TH_LOG("skip alarms are not supported.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ioctl(self->fd, RTC_WKALM_RD, &alarm);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
|
||||||
|
TH_LOG("Alarm time now set to %02d/%02d/%02d %02d:%02d:%02d.",
|
||||||
|
alarm.time.tm_mday, alarm.time.tm_mon + 1,
|
||||||
|
alarm.time.tm_year + 1900, alarm.time.tm_hour,
|
||||||
|
alarm.time.tm_min, alarm.time.tm_sec);
|
||||||
|
|
||||||
|
FD_ZERO(&readfds);
|
||||||
|
FD_SET(self->fd, &readfds);
|
||||||
|
|
||||||
|
rc = select(self->fd + 1, &readfds, NULL, NULL, &tv);
|
||||||
|
ASSERT_NE(-1, rc);
|
||||||
|
ASSERT_NE(0, rc);
|
||||||
|
|
||||||
rc = read(self->fd, &data, sizeof(unsigned long));
|
rc = read(self->fd, &data, sizeof(unsigned long));
|
||||||
ASSERT_NE(-1, rc);
|
ASSERT_NE(-1, rc);
|
||||||
|
|
|
@ -9,7 +9,7 @@ BINARIES := seccomp_bpf seccomp_benchmark
|
||||||
CFLAGS += -Wl,-no-as-needed -Wall
|
CFLAGS += -Wl,-no-as-needed -Wall
|
||||||
|
|
||||||
seccomp_bpf: seccomp_bpf.c ../kselftest_harness.h
|
seccomp_bpf: seccomp_bpf.c ../kselftest_harness.h
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -lpthread $< -o $@
|
$(CC) $(CFLAGS) $(LDFLAGS) $< -lpthread -o $@
|
||||||
|
|
||||||
TEST_PROGS += $(BINARIES)
|
TEST_PROGS += $(BINARIES)
|
||||||
EXTRA_CLEAN := $(BINARIES)
|
EXTRA_CLEAN := $(BINARIES)
|
||||||
|
|
|
@ -3044,7 +3044,7 @@ TEST(user_notification_basic)
|
||||||
/* Check that the basic notification machinery works */
|
/* Check that the basic notification machinery works */
|
||||||
listener = user_trap_syscall(__NR_getpid,
|
listener = user_trap_syscall(__NR_getpid,
|
||||||
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
||||||
EXPECT_GE(listener, 0);
|
ASSERT_GE(listener, 0);
|
||||||
|
|
||||||
/* Installing a second listener in the chain should EBUSY */
|
/* Installing a second listener in the chain should EBUSY */
|
||||||
EXPECT_EQ(user_trap_syscall(__NR_getpid,
|
EXPECT_EQ(user_trap_syscall(__NR_getpid,
|
||||||
|
@ -3103,7 +3103,7 @@ TEST(user_notification_kill_in_middle)
|
||||||
|
|
||||||
listener = user_trap_syscall(__NR_getpid,
|
listener = user_trap_syscall(__NR_getpid,
|
||||||
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
||||||
EXPECT_GE(listener, 0);
|
ASSERT_GE(listener, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that nothing bad happens when we kill the task in the middle
|
* Check that nothing bad happens when we kill the task in the middle
|
||||||
|
@ -3152,7 +3152,7 @@ TEST(user_notification_signal)
|
||||||
|
|
||||||
listener = user_trap_syscall(__NR_gettid,
|
listener = user_trap_syscall(__NR_gettid,
|
||||||
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
||||||
EXPECT_GE(listener, 0);
|
ASSERT_GE(listener, 0);
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
ASSERT_GE(pid, 0);
|
ASSERT_GE(pid, 0);
|
||||||
|
@ -3215,7 +3215,7 @@ TEST(user_notification_closed_listener)
|
||||||
|
|
||||||
listener = user_trap_syscall(__NR_getpid,
|
listener = user_trap_syscall(__NR_getpid,
|
||||||
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
SECCOMP_FILTER_FLAG_NEW_LISTENER);
|
||||||
EXPECT_GE(listener, 0);
|
ASSERT_GE(listener, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that we get an ENOSYS when the listener is closed.
|
* Check that we get an ENOSYS when the listener is closed.
|
||||||
|
@ -3376,7 +3376,7 @@ TEST(seccomp_get_notif_sizes)
|
||||||
{
|
{
|
||||||
struct seccomp_notif_sizes sizes;
|
struct seccomp_notif_sizes sizes;
|
||||||
|
|
||||||
EXPECT_EQ(seccomp(SECCOMP_GET_NOTIF_SIZES, 0, &sizes), 0);
|
ASSERT_EQ(seccomp(SECCOMP_GET_NOTIF_SIZES, 0, &sizes), 0);
|
||||||
EXPECT_EQ(sizes.seccomp_notif, sizeof(struct seccomp_notif));
|
EXPECT_EQ(sizes.seccomp_notif, sizeof(struct seccomp_notif));
|
||||||
EXPECT_EQ(sizes.seccomp_notif_resp, sizeof(struct seccomp_notif_resp));
|
EXPECT_EQ(sizes.seccomp_notif_resp, sizeof(struct seccomp_notif_resp));
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ struct gup_benchmark {
|
||||||
__u64 size;
|
__u64 size;
|
||||||
__u32 nr_pages_per_call;
|
__u32 nr_pages_per_call;
|
||||||
__u32 flags;
|
__u32 flags;
|
||||||
|
__u64 expansion[10]; /* For future use */
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|
|
@ -1503,7 +1503,7 @@ exit:
|
||||||
exit(20);
|
exit(20);
|
||||||
}
|
}
|
||||||
if (successes != total_nr_tests) {
|
if (successes != total_nr_tests) {
|
||||||
eprintf("ERROR: succeded fewer than number of tries (%d != %d)\n",
|
eprintf("ERROR: succeeded fewer than number of tries (%d != %d)\n",
|
||||||
successes, total_nr_tests);
|
successes, total_nr_tests);
|
||||||
exit(21);
|
exit(21);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,6 @@ int main()
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <link.h>
|
#include <link.h>
|
||||||
#include <sys/auxv.h>
|
#include <sys/auxv.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
Loading…
Reference in New Issue