Skip to content

Commit

Permalink
selftests: ntsync: Add some tests for wakeup signaling with events.
Browse files Browse the repository at this point in the history
Expand the contended wait tests, which previously only covered events and
semaphores, to cover events as well.

Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
  • Loading branch information
Elizabeth Figura authored and xanmod committed Mar 1, 2024
1 parent e788593 commit 293b07e
Showing 1 changed file with 147 additions and 4 deletions.
151 changes: 147 additions & 4 deletions tools/testing/selftests/drivers/ntsync/ntsync.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,7 @@ TEST(test_wait_any)

TEST(test_wait_all)
{
struct ntsync_event_args event_args = {0};
struct ntsync_mutex_args mutex_args = {0};
struct ntsync_sem_args sem_args = {0};
__u32 owner, index, count;
Expand All @@ -644,6 +645,11 @@ TEST(test_wait_all)
EXPECT_EQ(0, ret);
EXPECT_NE(0xdeadbeef, mutex_args.mutex);

event_args.manual = true;
event_args.signaled = true;
ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
EXPECT_EQ(0, ret);

objs[0] = sem_args.sem;
objs[1] = mutex_args.mutex;

Expand Down Expand Up @@ -692,6 +698,14 @@ TEST(test_wait_all)
check_sem_state(sem_args.sem, 1, 3);
check_mutex_state(mutex_args.mutex, 1, 123);

objs[0] = sem_args.sem;
objs[1] = event_args.event;
ret = wait_all(fd, 2, objs, 123, &index);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, index);
check_sem_state(sem_args.sem, 0, 3);
check_event_state(event_args.event, 1, 1);

/* test waiting on the same object twice */
objs[0] = objs[1] = sem_args.sem;
ret = wait_all(fd, 2, objs, 123, &index);
Expand All @@ -700,6 +714,7 @@ TEST(test_wait_all)

close(sem_args.sem);
close(mutex_args.mutex);
close(event_args.event);

close(fd);
}
Expand Down Expand Up @@ -746,12 +761,13 @@ static int wait_for_thread(pthread_t thread, unsigned int ms)

TEST(wake_any)
{
struct ntsync_event_args event_args = {0};
struct ntsync_mutex_args mutex_args = {0};
struct ntsync_wait_args wait_args = {0};
struct ntsync_sem_args sem_args = {0};
struct wait_args thread_args;
__u32 count, index, signaled;
int objs[2], fd, ret;
__u32 count, index;
pthread_t thread;

fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
Expand Down Expand Up @@ -833,10 +849,101 @@ TEST(wake_any)
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(1, wait_args.index);

/* test waking events */

event_args.manual = false;
event_args.signaled = false;
ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
EXPECT_EQ(0, ret);

objs[1] = event_args.event;
wait_args.timeout = get_abs_timeout(1000);
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

ret = ioctl(event_args.event, NTSYNC_IOC_EVENT_SET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);
check_event_state(event_args.event, 0, 0);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(1, wait_args.index);

wait_args.timeout = get_abs_timeout(1000);
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

ret = ioctl(event_args.event, NTSYNC_IOC_EVENT_PULSE, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);
check_event_state(event_args.event, 0, 0);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(1, wait_args.index);

close(event_args.event);

event_args.manual = true;
event_args.signaled = false;
ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
EXPECT_EQ(0, ret);

objs[1] = event_args.event;
wait_args.timeout = get_abs_timeout(1000);
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

ret = ioctl(event_args.event, NTSYNC_IOC_EVENT_SET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);
check_event_state(event_args.event, 1, 1);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(1, wait_args.index);

ret = ioctl(event_args.event, NTSYNC_IOC_EVENT_RESET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, signaled);

wait_args.timeout = get_abs_timeout(1000);
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

ret = ioctl(event_args.event, NTSYNC_IOC_EVENT_PULSE, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);
check_event_state(event_args.event, 0, 1);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(1, wait_args.index);

close(event_args.event);

/* delete an object while it's being waited on */

wait_args.timeout = get_abs_timeout(200);
wait_args.owner = 123;
objs[1] = mutex_args.mutex;
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

Expand All @@ -856,12 +963,14 @@ TEST(wake_any)

TEST(wake_all)
{
struct ntsync_event_args manual_event_args = {0};
struct ntsync_event_args auto_event_args = {0};
struct ntsync_mutex_args mutex_args = {0};
struct ntsync_wait_args wait_args = {0};
struct ntsync_sem_args sem_args = {0};
struct wait_args thread_args;
int objs[2], fd, ret;
__u32 count, index;
__u32 count, index, signaled;
int objs[4], fd, ret;
pthread_t thread;

fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
Expand All @@ -881,12 +990,24 @@ TEST(wake_all)
EXPECT_EQ(0, ret);
EXPECT_NE(0xdeadbeef, mutex_args.mutex);

manual_event_args.manual = true;
manual_event_args.signaled = true;
ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &manual_event_args);
EXPECT_EQ(0, ret);

auto_event_args.manual = false;
auto_event_args.signaled = true;
ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &auto_event_args);
EXPECT_EQ(0, ret);

objs[0] = sem_args.sem;
objs[1] = mutex_args.mutex;
objs[2] = manual_event_args.event;
objs[3] = auto_event_args.event;

wait_args.timeout = get_abs_timeout(1000);
wait_args.objs = (uintptr_t)objs;
wait_args.count = 2;
wait_args.count = 4;
wait_args.owner = 456;
thread_args.fd = fd;
thread_args.args = &wait_args;
Expand Down Expand Up @@ -920,12 +1041,32 @@ TEST(wake_all)

check_mutex_state(mutex_args.mutex, 0, 0);

ret = ioctl(manual_event_args.event, NTSYNC_IOC_EVENT_RESET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, signaled);

count = 2;
ret = post_sem(sem_args.sem, &count);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, count);
check_sem_state(sem_args.sem, 2, 3);

ret = ioctl(auto_event_args.event, NTSYNC_IOC_EVENT_RESET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, signaled);

ret = ioctl(manual_event_args.event, NTSYNC_IOC_EVENT_SET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);

ret = ioctl(auto_event_args.event, NTSYNC_IOC_EVENT_SET, &signaled);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, signaled);

check_sem_state(sem_args.sem, 1, 3);
check_mutex_state(mutex_args.mutex, 1, 456);
check_event_state(manual_event_args.event, 1, 1);
check_event_state(auto_event_args.event, 0, 0);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
Expand All @@ -943,6 +1084,8 @@ TEST(wake_all)

close(sem_args.sem);
close(mutex_args.mutex);
close(manual_event_args.event);
close(auto_event_args.event);

ret = wait_for_thread(thread, 200);
EXPECT_EQ(0, ret);
Expand Down

0 comments on commit 293b07e

Please sign in to comment.