lkml.org 
[lkml]   [2024]   [Mar]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 25/30] selftests: ntsync: Add some tests for wakeup signaling with events.
    Date
    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>
    ---
    .../testing/selftests/drivers/ntsync/ntsync.c | 151 +++++++++++++++++-
    1 file changed, 147 insertions(+), 4 deletions(-)

    diff --git a/tools/testing/selftests/drivers/ntsync/ntsync.c b/tools/testing/selftests/drivers/ntsync/ntsync.c
    index 12ccb4ec28e4..5d17eff6a370 100644
    --- a/tools/testing/selftests/drivers/ntsync/ntsync.c
    +++ b/tools/testing/selftests/drivers/ntsync/ntsync.c
    @@ -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;
    @@ -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;

    @@ -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);
    @@ -700,6 +714,7 @@ TEST(test_wait_all)

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

    close(fd);
    }
    @@ -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);
    @@ -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);

    @@ -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);
    @@ -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;
    @@ -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);
    @@ -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);
    --
    2.43.0

    \
     
     \ /
      Last update: 2024-05-27 16:14    [W:4.169 / U:26.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site