• Bug#1105129: Please backport ntsync driver from Linux-6.14 to trixie (9

    From Piotr Morgwai Kotarbinski@1:229/2 to All on Sun May 11 22:50:01 2025
    [continued from previous message]

    + 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(mutex, 1, 123);
    +
    + close(mutex);
    +
    + mutex_args.owner = 0;
    + mutex_args.count = 0;
    + mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args);
    + EXPECT_LE(0, mutex);
    + check_mutex_state(mutex, 0, 0);
    +
    + ret = wait_any(fd, 1, &mutex, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_mutex_state(mutex, 1, 123);
    +
    + close(mutex);
    +
    + mutex_args.owner = 123;
    + mutex_args.count = ~0u;
    + mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args);
    + EXPECT_LE(0, mutex);
    + check_mutex_state(mutex, ~0u, 123);
    +
    + ret = wait_any(fd, 1, &mutex, 123, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);
    +
    + close(mutex);
    +
    + close(fd);
    +}
    +
    +TEST(manual_event_state)
    +{
    + struct ntsync_event_args event_args;
    + __u32 index, signaled;
    + int fd, event, ret;
    +
    + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
    + ASSERT_LE(0, fd);
    +
    + event_args.manual = 1;
    + event_args.signaled = 0;
    + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
    + EXPECT_LE(0, event);
    + check_event_state(event, 0, 1);
    +
    + signaled = 0xdeadbeef;
    + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    + check_event_state(event, 1, 1);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, signaled);
    + check_event_state(event, 1, 1);
    +
    + ret = wait_any(fd, 1, &event, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_event_state(event, 1, 1);
    +
    + signaled = 0xdeadbeef;
    + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, signaled);
    + check_event_state(event, 0, 1);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    + check_event_state(event, 0, 1);
    +
    + ret = wait_any(fd, 1, &event, 123, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, signaled);
    + check_event_state(event, 0, 1);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    + check_event_state(event, 0, 1);
    +
    + close(event);
    +
    + close(fd);
    +}
    +
    +TEST(auto_event_state)
    +{
    + struct ntsync_event_args event_args;
    + __u32 index, signaled;
    + int fd, event, ret;
    +
    + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
    + ASSERT_LE(0, fd);
    +
    + event_args.manual = 0;
    + event_args.signaled = 1;
    + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
    + EXPECT_LE(0, event);
    +
    + check_event_state(event, 1, 0);
    +
    + signaled = 0xdeadbeef;
    + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, signaled);
    + check_event_state(event, 1, 0);
    +
    + ret = wait_any(fd, 1, &event, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_event_state(event, 0, 0);
    +
    + signaled = 0xdeadbeef;
    + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    + check_event_state(event, 0, 0);
    +
    + ret = wait_any(fd, 1, &event, 123, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, signaled);
    + check_event_state(event, 0, 0);
    +
    + ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, signaled);
    + check_event_state(event, 0, 0);
    +
    + close(event);
    +
    + close(fd);
    +}
    +
    +TEST(test_wait_any)
    +{
    + int objs[NTSYNC_MAX_WAIT_COUNT + 1], fd, ret;
    + struct ntsync_mutex_args mutex_args = {0};
    + struct ntsync_sem_args sem_args = {0};
    + __u32 owner, index, count, i;
    + struct timespec timeout;
    +
    + clock_gettime(CLOCK_MONOTONIC, &timeout);
    +
    + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
    + ASSERT_LE(0, fd);
    +
    + sem_args.count = 2;
    + sem_args.max = 3;
    + objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args);
    + EXPECT_LE(0, objs[0]);
    +
    + mutex_args.owner = 0;
    + mutex_args.count = 0;
    + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args);
    + EXPECT_LE(0, objs[1]);
    +
    + ret = wait_any(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_sem_state(objs[0], 1, 3);
    + check_mutex_state(objs[1], 0, 0);
    +
    + ret = wait_any(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_sem_state(objs[0], 0, 3);
    + check_mutex_state(objs[1], 0, 0);
    +
    + ret = wait_any(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, index);
    + check_sem_state(objs[0], 0, 3);
    + check_mutex_state(objs[1], 1, 123);
    +
    + count = 1;
    + ret = release_sem(objs[0], &count);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, count);
    +
    + ret = wait_any(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_sem_state(objs[0], 0, 3);
    + check_mutex_state(objs[1], 1, 123);
    +
    + ret = wait_any(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, index);
    + check_sem_state(objs[0], 0, 3);
    + check_mutex_state(objs[1], 2, 123);
    +
    + ret = wait_any(fd, 2, objs, 456, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);
    +
    + owner = 123;
    + ret = ioctl(objs[1], NTSYNC_IOC_MUTEX_KILL, &owner);
    + EXPECT_EQ(0, ret);
    +
    + ret = wait_any(fd, 2, objs, 456, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(EOWNERDEAD, errno);
    + EXPECT_EQ(1, index);
    +
    + ret = wait_any(fd, 2, objs, 456, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(1, index);
    +
    + close(objs[1]);
    +
    + /* test waiting on the same object twice */
    +
    + count = 2;
    + ret = release_sem(objs[0], &count);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, count);
    +
    + objs[1] = objs[0];
    + ret = wait_any(fd, 2, objs, 456, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_sem_state(objs[0], 1, 3);
    +
    + ret = wait_any(fd, 0, NULL, 456, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);
    +
    + for (i = 1; i < NTSYNC_MAX_WAIT_COUNT + 1; ++i)
    + objs[i] = objs[0];
    +
    + ret = wait_any(fd, NTSYNC_MAX_WAIT_COUNT, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    +
    + ret = wait_any(fd, NTSYNC_MAX_WAIT_COUNT + 1, objs, 123, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(EINVAL, errno);
    +
    + ret = wait_any(fd, -1, objs, 123, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(EINVAL, errno);
    +
    + close(objs[0]);
    +
    + close(fd);
    +}
    +
    +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;
    + int objs[2], fd, ret;
    +
    + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
    + ASSERT_LE(0, fd);
    +
    + sem_args.count = 2;
    + sem_args.max = 3;
    + objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args);
    + EXPECT_LE(0, objs[0]);
    +
    + mutex_args.owner = 0;
    + mutex_args.count = 0;
    + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args);
    + EXPECT_LE(0, objs[1]);
    +
    + ret = wait_all(fd, 2, objs, 123, &index);
    + EXPECT_EQ(0, ret);
    + EXPECT_EQ(0, index);
    + check_sem_state(objs[0], 1, 3);
    + check_mutex_state(objs[1], 1, 123);
    +
    + ret = wait_all(fd, 2, objs, 456, &index);
    + EXPECT_EQ(-1, ret);
    + EXPECT_EQ(ETIMEDOUT, errno);

    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: you cannot sedate... all the things you hate (1:229/2)