1/* 2 * AioContext POSIX event loop implementation internal APIs 3 * 4 * Copyright IBM, Corp. 2008 5 * Copyright Red Hat, Inc. 2020 6 * 7 * Authors: 8 * Anthony Liguori <aliguori@us.ibm.com> 9 * 10 * This work is licensed under the terms of the GNU GPL, version 2. See 11 * the COPYING file in the top-level directory. 12 * 13 * Contributions after 2012-01-13 are licensed under the terms of the 14 * GNU GPL, version 2 or (at your option) any later version. 15 */ 16 17#ifndef AIO_POSIX_H 18#define AIO_POSIX_H 19 20#include "block/aio.h" 21 22struct AioHandler { 23 GPollFD pfd; 24 IOHandler *io_read; 25 IOHandler *io_write; 26 AioPollFn *io_poll; 27 IOHandler *io_poll_ready; 28 IOHandler *io_poll_begin; 29 IOHandler *io_poll_end; 30 void *opaque; 31 QLIST_ENTRY(AioHandler) node; 32 QLIST_ENTRY(AioHandler) node_ready; /* only used during aio_poll() */ 33 QLIST_ENTRY(AioHandler) node_deleted; 34 QLIST_ENTRY(AioHandler) node_poll; 35#ifdef CONFIG_LINUX_IO_URING 36 QSLIST_ENTRY(AioHandler) node_submitted; 37 unsigned flags; /* see fdmon-io_uring.c */ 38#endif 39 int64_t poll_idle_timeout; /* when to stop userspace polling */ 40 bool poll_ready; /* has polling detected an event? */ 41 bool is_external; 42}; 43 44/* Add a handler to a ready list */ 45void aio_add_ready_handler(AioHandlerList *ready_list, AioHandler *node, 46 int revents); 47 48extern const FDMonOps fdmon_poll_ops; 49 50#ifdef CONFIG_EPOLL_CREATE1 51bool fdmon_epoll_try_upgrade(AioContext *ctx, unsigned npfd); 52void fdmon_epoll_setup(AioContext *ctx); 53void fdmon_epoll_disable(AioContext *ctx); 54#else 55static inline bool fdmon_epoll_try_upgrade(AioContext *ctx, unsigned npfd) 56{ 57 return false; 58} 59 60static inline void fdmon_epoll_setup(AioContext *ctx) 61{ 62} 63 64static inline void fdmon_epoll_disable(AioContext *ctx) 65{ 66} 67#endif /* !CONFIG_EPOLL_CREATE1 */ 68 69#ifdef CONFIG_LINUX_IO_URING 70bool fdmon_io_uring_setup(AioContext *ctx); 71void fdmon_io_uring_destroy(AioContext *ctx); 72#else 73static inline bool fdmon_io_uring_setup(AioContext *ctx) 74{ 75 return false; 76} 77 78static inline void fdmon_io_uring_destroy(AioContext *ctx) 79{ 80} 81#endif /* !CONFIG_LINUX_IO_URING */ 82 83#endif /* AIO_POSIX_H */ 84