11f050a46SStefan Hajnoczi /* 21f050a46SStefan Hajnoczi * AioContext POSIX event loop implementation internal APIs 31f050a46SStefan Hajnoczi * 41f050a46SStefan Hajnoczi * Copyright IBM, Corp. 2008 51f050a46SStefan Hajnoczi * Copyright Red Hat, Inc. 2020 61f050a46SStefan Hajnoczi * 71f050a46SStefan Hajnoczi * Authors: 81f050a46SStefan Hajnoczi * Anthony Liguori <aliguori@us.ibm.com> 91f050a46SStefan Hajnoczi * 101f050a46SStefan Hajnoczi * This work is licensed under the terms of the GNU GPL, version 2. See 111f050a46SStefan Hajnoczi * the COPYING file in the top-level directory. 121f050a46SStefan Hajnoczi * 131f050a46SStefan Hajnoczi * Contributions after 2012-01-13 are licensed under the terms of the 141f050a46SStefan Hajnoczi * GNU GPL, version 2 or (at your option) any later version. 151f050a46SStefan Hajnoczi */ 161f050a46SStefan Hajnoczi 171f050a46SStefan Hajnoczi #ifndef AIO_POSIX_H 181f050a46SStefan Hajnoczi #define AIO_POSIX_H 191f050a46SStefan Hajnoczi 201f050a46SStefan Hajnoczi #include "block/aio.h" 211f050a46SStefan Hajnoczi 221f050a46SStefan Hajnoczi struct AioHandler { 231f050a46SStefan Hajnoczi GPollFD pfd; 241f050a46SStefan Hajnoczi IOHandler *io_read; 251f050a46SStefan Hajnoczi IOHandler *io_write; 261f050a46SStefan Hajnoczi AioPollFn *io_poll; 27826cc324SStefan Hajnoczi IOHandler *io_poll_ready; 281f050a46SStefan Hajnoczi IOHandler *io_poll_begin; 291f050a46SStefan Hajnoczi IOHandler *io_poll_end; 301f050a46SStefan Hajnoczi void *opaque; 311f050a46SStefan Hajnoczi QLIST_ENTRY(AioHandler) node; 321f050a46SStefan Hajnoczi QLIST_ENTRY(AioHandler) node_ready; /* only used during aio_poll() */ 331f050a46SStefan Hajnoczi QLIST_ENTRY(AioHandler) node_deleted; 34d37d0e36SStefan Hajnoczi QLIST_ENTRY(AioHandler) node_poll; 3573fd282eSStefan Hajnoczi #ifdef CONFIG_LINUX_IO_URING 3673fd282eSStefan Hajnoczi QSLIST_ENTRY(AioHandler) node_submitted; 3773fd282eSStefan Hajnoczi unsigned flags; /* see fdmon-io_uring.c */ 3873fd282eSStefan Hajnoczi #endif 39d37d0e36SStefan Hajnoczi int64_t poll_idle_timeout; /* when to stop userspace polling */ 40*fc879646SStefan Hajnoczi bool poll_ready; /* has polling detected an event? */ 411f050a46SStefan Hajnoczi }; 421f050a46SStefan Hajnoczi 431f050a46SStefan Hajnoczi /* Add a handler to a ready list */ 441f050a46SStefan Hajnoczi void aio_add_ready_handler(AioHandlerList *ready_list, AioHandler *node, 451f050a46SStefan Hajnoczi int revents); 461f050a46SStefan Hajnoczi 471f050a46SStefan Hajnoczi extern const FDMonOps fdmon_poll_ops; 481f050a46SStefan Hajnoczi 491f050a46SStefan Hajnoczi #ifdef CONFIG_EPOLL_CREATE1 501f050a46SStefan Hajnoczi bool fdmon_epoll_try_upgrade(AioContext *ctx, unsigned npfd); 511f050a46SStefan Hajnoczi void fdmon_epoll_setup(AioContext *ctx); 521f050a46SStefan Hajnoczi void fdmon_epoll_disable(AioContext *ctx); 531f050a46SStefan Hajnoczi #else fdmon_epoll_try_upgrade(AioContext * ctx,unsigned npfd)541f050a46SStefan Hajnoczistatic inline bool fdmon_epoll_try_upgrade(AioContext *ctx, unsigned npfd) 551f050a46SStefan Hajnoczi { 561f050a46SStefan Hajnoczi return false; 571f050a46SStefan Hajnoczi } 581f050a46SStefan Hajnoczi fdmon_epoll_setup(AioContext * ctx)591f050a46SStefan Hajnoczistatic inline void fdmon_epoll_setup(AioContext *ctx) 601f050a46SStefan Hajnoczi { 611f050a46SStefan Hajnoczi } 621f050a46SStefan Hajnoczi fdmon_epoll_disable(AioContext * ctx)631f050a46SStefan Hajnoczistatic inline void fdmon_epoll_disable(AioContext *ctx) 641f050a46SStefan Hajnoczi { 651f050a46SStefan Hajnoczi } 661f050a46SStefan Hajnoczi #endif /* !CONFIG_EPOLL_CREATE1 */ 671f050a46SStefan Hajnoczi 6873fd282eSStefan Hajnoczi #ifdef CONFIG_LINUX_IO_URING 6973fd282eSStefan Hajnoczi bool fdmon_io_uring_setup(AioContext *ctx); 7073fd282eSStefan Hajnoczi void fdmon_io_uring_destroy(AioContext *ctx); 7173fd282eSStefan Hajnoczi #else fdmon_io_uring_setup(AioContext * ctx)7273fd282eSStefan Hajnoczistatic inline bool fdmon_io_uring_setup(AioContext *ctx) 7373fd282eSStefan Hajnoczi { 7473fd282eSStefan Hajnoczi return false; 7573fd282eSStefan Hajnoczi } 7673fd282eSStefan Hajnoczi fdmon_io_uring_destroy(AioContext * ctx)7773fd282eSStefan Hajnoczistatic inline void fdmon_io_uring_destroy(AioContext *ctx) 7873fd282eSStefan Hajnoczi { 7973fd282eSStefan Hajnoczi } 8073fd282eSStefan Hajnoczi #endif /* !CONFIG_LINUX_IO_URING */ 8173fd282eSStefan Hajnoczi 821f050a46SStefan Hajnoczi #endif /* AIO_POSIX_H */ 83