On Wed, Jul 5, 2023 at 3:38 PM Tage Johansson <tage.j.lists@posteo.net> wrote:

As part of the Rust bindings for Libnbd, I try to integrate the asynchronous (aio_*) functions with Tokio, the most used asynchronous runtime in Rust. However, in its eventloop, Tokio uses epoll(7) instead of poll(2) (which is used internally in Libnbd). The difference is that poll(2) uses level-triggered notifications as aposed to epoll(7) which uses edge-triggered notifications.


According to epoll(7) section "Level-triggered and edge-triggered" says:

       By  contrast,  when  used  as a level-triggered interface (the default,
       when EPOLLET is not specified), epoll is simply a faster  poll(2),  and
       can be used wherever the latter is used since it shares the same seman‐
       tics.
 
So you should not have any issue using epoll instead of poll.

- After calling aio_get_direction(3), can I know that reading/writing would actually block?

No, this is just the events that libnbd wants to get.

- After calling for example aio_notify_read(3), can I know that the next reading from the file descriptor would block?

No, you have to call again aio_get_direction() and poll again until the event happens.

Nir