Skip to content
This repository has been archived by the owner on Oct 31, 2024. It is now read-only.

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 Sep 16, 2024
1 parent 4147829 commit c1088aa
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 c1088aa

Please sign in to comment.