Skip to content

Commit

Permalink
selftests: winesync: Add some tests for mutex state
Browse files Browse the repository at this point in the history
  • Loading branch information
Zebediah Figura authored and xanmod committed May 30, 2022
1 parent 75f0fc3 commit c3359d5
Showing 1 changed file with 188 additions and 0 deletions.
188 changes: 188 additions & 0 deletions tools/testing/selftests/drivers/winesync/winesync.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,42 @@ static int put_sem(int fd, __u32 sem, __u32 *count)
return ret;
}

static int read_mutex_state(int fd, __u32 mutex, __u32 *count, __u32 *owner)
{
struct winesync_mutex_args args;
int ret;

args.mutex = mutex;
args.count = 0xdeadbeef;
args.owner = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &args);
*count = args.count;
*owner = args.owner;
return ret;
}

#define check_mutex_state(fd, mutex, count, owner) \
({ \
__u32 __count, __owner; \
int ret = read_mutex_state((fd), (mutex), &__count, &__owner); \
EXPECT_EQ(0, ret); \
EXPECT_EQ((count), __count); \
EXPECT_EQ((owner), __owner); \
})

static int put_mutex(int fd, __u32 mutex, __u32 owner, __u32 *count)
{
struct winesync_mutex_args args;
int ret;

args.mutex = mutex;
args.owner = owner;
args.count = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_PUT_MUTEX, &args);
*count = args.count;
return ret;
}

static int wait_any(int fd, __u32 count, const __u32 *objs, __u32 owner,
__u32 *index)
{
Expand Down Expand Up @@ -150,4 +186,156 @@ TEST(semaphore_state)
close(fd);
}

TEST(mutex_state)
{
struct winesync_mutex_args mutex_args;
__u32 mutex, owner, count, index;
struct timespec timeout;
int fd, ret;

clock_gettime(CLOCK_MONOTONIC, &timeout);

fd = open("/dev/winesync", O_CLOEXEC | O_RDONLY);
ASSERT_LE(0, fd);

mutex_args.owner = 123;
mutex_args.count = 0;
ret = ioctl(fd, WINESYNC_IOC_CREATE_MUTEX, &mutex_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

mutex_args.owner = 0;
mutex_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_CREATE_MUTEX, &mutex_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

mutex_args.owner = 123;
mutex_args.count = 2;
mutex_args.mutex = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_CREATE_MUTEX, &mutex_args);
EXPECT_EQ(0, ret);
EXPECT_NE(0xdeadbeef, mutex_args.mutex);
mutex = mutex_args.mutex;
check_mutex_state(fd, mutex, 2, 123);

ret = put_mutex(fd, mutex, 0, &count);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

ret = put_mutex(fd, mutex, 456, &count);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EPERM, errno);
check_mutex_state(fd, mutex, 2, 123);

ret = put_mutex(fd, mutex, 123, &count);
EXPECT_EQ(0, ret);
EXPECT_EQ(2, count);
check_mutex_state(fd, mutex, 1, 123);

ret = put_mutex(fd, mutex, 123, &count);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, count);
check_mutex_state(fd, mutex, 0, 0);

ret = put_mutex(fd, mutex, 123, &count);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EPERM, errno);

ret = wait_any(fd, 1, &mutex, 456, &index);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, index);
check_mutex_state(fd, mutex, 1, 456);

ret = wait_any(fd, 1, &mutex, 456, &index);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, index);
check_mutex_state(fd, mutex, 2, 456);

ret = put_mutex(fd, mutex, 456, &count);
EXPECT_EQ(0, ret);
EXPECT_EQ(2, count);
check_mutex_state(fd, mutex, 1, 456);

ret = wait_any(fd, 1, &mutex, 123, &index);
EXPECT_EQ(-1, ret);
EXPECT_EQ(ETIMEDOUT, errno);

owner = 0;
ret = ioctl(fd, WINESYNC_IOC_KILL_OWNER, &owner);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

owner = 123;
ret = ioctl(fd, WINESYNC_IOC_KILL_OWNER, &owner);
EXPECT_EQ(0, ret);
check_mutex_state(fd, mutex, 1, 456);

owner = 456;
ret = ioctl(fd, WINESYNC_IOC_KILL_OWNER, &owner);
EXPECT_EQ(0, ret);

mutex_args.count = 0xdeadbeef;
mutex_args.owner = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &mutex_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOWNERDEAD, errno);
EXPECT_EQ(0, mutex_args.count);
EXPECT_EQ(0, mutex_args.owner);

mutex_args.count = 0xdeadbeef;
mutex_args.owner = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &mutex_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOWNERDEAD, errno);
EXPECT_EQ(0, mutex_args.count);
EXPECT_EQ(0, mutex_args.owner);

ret = wait_any(fd, 1, &mutex, 123, &index);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOWNERDEAD, errno);
EXPECT_EQ(0, index);
check_mutex_state(fd, mutex, 1, 123);

owner = 123;
ret = ioctl(fd, WINESYNC_IOC_KILL_OWNER, &owner);
EXPECT_EQ(0, ret);

mutex_args.count = 0xdeadbeef;
mutex_args.owner = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &mutex_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOWNERDEAD, errno);
EXPECT_EQ(0, mutex_args.count);
EXPECT_EQ(0, mutex_args.owner);

ret = wait_any(fd, 1, &mutex, 123, &index);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOWNERDEAD, errno);
EXPECT_EQ(0, index);
check_mutex_state(fd, mutex, 1, 123);

ret = ioctl(fd, WINESYNC_IOC_DELETE, &mutex);
EXPECT_EQ(0, ret);

mutex_args.owner = 0;
mutex_args.count = 0;
mutex_args.mutex = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_CREATE_MUTEX, &mutex_args);
EXPECT_EQ(0, ret);
EXPECT_NE(0xdeadbeef, mutex_args.mutex);
mutex = mutex_args.mutex;
check_mutex_state(fd, mutex, 0, 0);

ret = wait_any(fd, 1, &mutex, 123, &index);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, index);
check_mutex_state(fd, mutex, 1, 123);

ret = ioctl(fd, WINESYNC_IOC_DELETE, &mutex_args.mutex);
EXPECT_EQ(0, ret);

close(fd);
}

TEST_HARNESS_MAIN

0 comments on commit c3359d5

Please sign in to comment.