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

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

    +output, or not at all.
    +
    +The ioctls on the device file are as follows:
    +
    +.. c:macro:: NTSYNC_IOC_CREATE_SEM
    +
    + Create a semaphore object. Takes a pointer to struct
    + :c:type:`ntsync_sem_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``count``
    + - Initial count of the semaphore.
    + * - ``max``
    + - Maximum count of the semaphore.
    +
    + Fails with ``EINVAL`` if ``count`` is greater than ``max``.
    + On success, returns a file descriptor the created semaphore.
    +
    +.. c:macro:: NTSYNC_IOC_CREATE_MUTEX
    +
    + Create a mutex object. Takes a pointer to struct
    + :c:type:`ntsync_mutex_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``count``
    + - Initial recursion count of the mutex.
    + * - ``owner``
    + - Initial owner of the mutex.
    +
    + If ``owner`` is nonzero and ``count`` is zero, or if ``owner`` is
    + zero and ``count`` is nonzero, the function fails with ``EINVAL``.
    + On success, returns a file descriptor the created mutex.
    +
    +.. c:macro:: NTSYNC_IOC_CREATE_EVENT
    +
    + Create an event object. Takes a pointer to struct
    + :c:type:`ntsync_event_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``signaled``
    + - If nonzero, the event is initially signaled, otherwise
    + nonsignaled.
    + * - ``manual``
    + - If nonzero, the event is a manual-reset event, otherwise
    + auto-reset.
    +
    + On success, returns a file descriptor the created event.
    +
    +The ioctls on the individual objects are as follows:
    +
    +.. c:macro:: NTSYNC_IOC_SEM_POST
    +
    + Post to a semaphore object. Takes a pointer to a 32-bit integer,
    + which on input holds the count to be added to the semaphore, and on
    + output contains its previous count.
    +
    + If adding to the semaphore's current count would raise the latter
    + past the semaphore's maximum count, the ioctl fails with
    + ``EOVERFLOW`` and the semaphore is not affected. If raising the
    + semaphore's count causes it to become signaled, eligible threads
    + waiting on this semaphore will be woken and the semaphore's count
    + decremented appropriately.
    +
    +.. c:macro:: NTSYNC_IOC_MUTEX_UNLOCK
    +
    + Release a mutex object. Takes a pointer to struct
    + :c:type:`ntsync_mutex_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``owner``
    + - Specifies the owner trying to release this mutex.
    + * - ``count``
    + - On output, contains the previous recursion count.
    +
    + If ``owner`` is zero, the ioctl fails with ``EINVAL``. If ``owner``
    + is not the current owner of the mutex, the ioctl fails with
    + ``EPERM``.
    +
    + The mutex's count will be decremented by one. If decrementing the
    + mutex's count causes it to become zero, the mutex is marked as
    + unowned and signaled, and eligible threads waiting on it will be
    + woken as appropriate.
    +
    +.. c:macro:: NTSYNC_IOC_SET_EVENT
    +
    + Signal an event object. Takes a pointer to a 32-bit integer, which on
    + output contains the previous state of the event.
    +
    + Eligible threads will be woken, and auto-reset events will be
    + designaled appropriately.
    +
    +.. c:macro:: NTSYNC_IOC_RESET_EVENT
    +
    + Designal an event object. Takes a pointer to a 32-bit integer, which
    + on output contains the previous state of the event.
    +
    +.. c:macro:: NTSYNC_IOC_PULSE_EVENT
    +
    + Wake threads waiting on an event object while leaving it in an
    + unsignaled state. Takes a pointer to a 32-bit integer, which on
    + output contains the previous state of the event.
    +
    + A pulse operation can be thought of as a set followed by a reset,
    + performed as a single atomic operation. If two threads are waiting on
    + an auto-reset event which is pulsed, only one will be woken. If two
    + threads are waiting a manual-reset event which is pulsed, both will
    + be woken. However, in both cases, the event will be unsignaled
    + afterwards, and a simultaneous read operation will always report the
    + event as unsignaled.
    +
    +.. c:macro:: NTSYNC_IOC_READ_SEM
    +
    + Read the current state of a semaphore object. Takes a pointer to
    + struct :c:type:`ntsync_sem_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``count``
    + - On output, contains the current count of the semaphore.
    + * - ``max``
    + - On output, contains the maximum count of the semaphore.
    +
    +.. c:macro:: NTSYNC_IOC_READ_MUTEX
    +
    + Read the current state of a mutex object. Takes a pointer to struct
    + :c:type:`ntsync_mutex_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``owner``
    + - On output, contains the current owner of the mutex, or zero
    + if the mutex is not currently owned.
    + * - ``count``
    + - On output, contains the current recursion count of the mutex.
    +
    + If the mutex is marked as abandoned, the function fails with
    + ``EOWNERDEAD``. In this case, ``count`` and ``owner`` are set to
    + zero.
    +
    +.. c:macro:: NTSYNC_IOC_READ_EVENT
    +
    + Read the current state of an event object. Takes a pointer to struct
    + :c:type:`ntsync_event_args`, which is used as follows:
    +
    + .. list-table::
    +
    + * - ``signaled``
    + - On output, contains the current state of the event.
    + * - ``manual``
    + - On output, contains 1 if the event is a manual-reset event,
    + and 0 otherwise.
    +
    +.. c:macro:: NTSYNC_IOC_KILL_OWNER
    +
    + Mark a mutex as unowned and abandoned if it is owned by the given
    + owner. Takes an input-only pointer to a 32-bit integer denoting the
    + owner. If the owner is zero, the ioctl fails with ``EINVAL``. If the
    + owner does not own the mutex, the function fails with ``EPERM``.
    +
    + Eligible threads waiting on the mutex will be woken as appropriate
    + (and such waits will fail with ``EOWNERDEAD``, as described below).
    +
    +.. c:macro:: NTSYNC_IOC_WAIT_ANY
    +
    + Poll on any of a list of objects, atomically acquiring at most one.
    + Takes a pointer to struct :c:type:`ntsync_wait_args`, which is
    + used as follows:
    +
    + .. list-table::
    +
    + * - ``timeout``
    + - Absolute timeout in nanoseconds. If ``NTSYNC_WAIT_REALTIME``
    + is set, the timeout is measured against the REALTIME clock;
    + otherwise it is measured against the MONOTONIC clock. If the
    + timeout is equal to or earlier than the current time, the
    + function returns immediately without sleeping. If ``timeout``
    + is U64_MAX, the function will sleep until an object is
    + signaled, and will not fail with ``ETIMEDOUT``.
    + * - ``objs``
    + - Pointer to an array of ``count`` file descriptors
    + (specified as an integer so that the structure has the same
    + size regardless of architecture). If any object is
    + invalid, the function fails with ``EINVAL``.
    + * - ``count``
    + - Number of objects specified in the ``objs`` array.
    + If greater than ``NTSYNC_MAX_WAIT_COUNT``, the function fails
    + with ``EINVAL``.
    + * - ``owner``
    + - Mutex owner identifier. If any object in ``objs`` is a mutex,
    + the ioctl will attempt to acquire that mutex on behalf of
    + ``owner``. If ``owner`` is zero, the ioctl fails with
    + ``EINVAL``.
    + * - ``index``
    + - On success, contains the index (into ``objs``) of the object
    + which was signaled. If ``alert`` was signaled instead,
    + this contains ``count``.
    + * - ``alert``
    + - Optional event object file descriptor. If nonzero, this

    [continued in next message]

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