19ef91a67SChristoph Hellwig /*
29f8540ecSPaolo Bonzini * Declarations for AIO in the raw protocol
39ef91a67SChristoph Hellwig *
49ef91a67SChristoph Hellwig * Copyright IBM, Corp. 2008
59ef91a67SChristoph Hellwig *
69ef91a67SChristoph Hellwig * Authors:
79ef91a67SChristoph Hellwig * Anthony Liguori <aliguori@us.ibm.com>
89ef91a67SChristoph Hellwig *
99ef91a67SChristoph Hellwig * This work is licensed under the terms of the GNU GPL, version 2. See
109ef91a67SChristoph Hellwig * the COPYING file in the top-level directory.
119ef91a67SChristoph Hellwig *
126b620ca3SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the
136b620ca3SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version.
149ef91a67SChristoph Hellwig */
15ec150c7eSMarkus Armbruster
169f8540ecSPaolo Bonzini #ifndef QEMU_RAW_AIO_H
179f8540ecSPaolo Bonzini #define QEMU_RAW_AIO_H
189ef91a67SChristoph Hellwig
19ec150c7eSMarkus Armbruster #include "block/aio.h"
20*984a32f1SKevin Wolf #include "block/block-common.h"
21daf015efSMarkus Armbruster #include "qemu/iov.h"
22daf015efSMarkus Armbruster
239ef91a67SChristoph Hellwig /* AIO request types */
249ef91a67SChristoph Hellwig #define QEMU_AIO_READ 0x0001
259ef91a67SChristoph Hellwig #define QEMU_AIO_WRITE 0x0002
269ef91a67SChristoph Hellwig #define QEMU_AIO_IOCTL 0x0004
27b2e12bc6SChristoph Hellwig #define QEMU_AIO_FLUSH 0x0008
288238010bSPaolo Bonzini #define QEMU_AIO_DISCARD 0x0010
2997a2ae34SPaolo Bonzini #define QEMU_AIO_WRITE_ZEROES 0x0020
301efad060SFam Zheng #define QEMU_AIO_COPY_RANGE 0x0040
3193f4e2ffSKevin Wolf #define QEMU_AIO_TRUNCATE 0x0080
326d43eaa3SSam Li #define QEMU_AIO_ZONE_REPORT 0x0100
336d43eaa3SSam Li #define QEMU_AIO_ZONE_MGMT 0x0200
344751d09aSSam Li #define QEMU_AIO_ZONE_APPEND 0x0400
359ef91a67SChristoph Hellwig #define QEMU_AIO_TYPE_MASK \
361efad060SFam Zheng (QEMU_AIO_READ | \
371efad060SFam Zheng QEMU_AIO_WRITE | \
381efad060SFam Zheng QEMU_AIO_IOCTL | \
391efad060SFam Zheng QEMU_AIO_FLUSH | \
401efad060SFam Zheng QEMU_AIO_DISCARD | \
411efad060SFam Zheng QEMU_AIO_WRITE_ZEROES | \
4293f4e2ffSKevin Wolf QEMU_AIO_COPY_RANGE | \
436d43eaa3SSam Li QEMU_AIO_TRUNCATE | \
446d43eaa3SSam Li QEMU_AIO_ZONE_REPORT | \
454751d09aSSam Li QEMU_AIO_ZONE_MGMT | \
464751d09aSSam Li QEMU_AIO_ZONE_APPEND)
479ef91a67SChristoph Hellwig
489ef91a67SChristoph Hellwig /* AIO flags */
499ef91a67SChristoph Hellwig #define QEMU_AIO_MISALIGNED 0x1000
508238010bSPaolo Bonzini #define QEMU_AIO_BLKDEV 0x2000
51738301e1SKevin Wolf #define QEMU_AIO_NO_FALLBACK 0x4000
529ef91a67SChristoph Hellwig
539ef91a67SChristoph Hellwig
545c6c3a6cSChristoph Hellwig /* linux-aio.c - Linux native implementation */
559f8540ecSPaolo Bonzini #ifdef CONFIG_LINUX_AIO
56dd7f7ed1SPaolo Bonzini typedef struct LinuxAioState LinuxAioState;
57ed6e2161SNishanth Aravamudan LinuxAioState *laio_init(Error **errp);
58dd7f7ed1SPaolo Bonzini void laio_cleanup(LinuxAioState *s);
59ab50533bSEmanuele Giuseppe Esposito
60ab50533bSEmanuele Giuseppe Esposito /* laio_co_submit: submit I/O requests in the thread's current AioContext. */
61ab50533bSEmanuele Giuseppe Esposito int coroutine_fn laio_co_submit(int fd, uint64_t offset, QEMUIOVector *qiov,
62*984a32f1SKevin Wolf int type, BdrvRequestFlags flags,
63*984a32f1SKevin Wolf uint64_t dev_max_batch);
64ab50533bSEmanuele Giuseppe Esposito
6524687abfSPrasad Pandit bool laio_has_fdsync(int);
66*984a32f1SKevin Wolf bool laio_has_fua(void);
67dd7f7ed1SPaolo Bonzini void laio_detach_aio_context(LinuxAioState *s, AioContext *old_context);
68dd7f7ed1SPaolo Bonzini void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context);
69*984a32f1SKevin Wolf #else
laio_has_fua(void)70*984a32f1SKevin Wolf static inline bool laio_has_fua(void)
71*984a32f1SKevin Wolf {
72*984a32f1SKevin Wolf return false;
73*984a32f1SKevin Wolf }
749f8540ecSPaolo Bonzini #endif
756663a0a3SAarushi Mehta /* io_uring.c - Linux io_uring implementation */
766663a0a3SAarushi Mehta #ifdef CONFIG_LINUX_IO_URING
776663a0a3SAarushi Mehta LuringState *luring_init(Error **errp);
786663a0a3SAarushi Mehta void luring_cleanup(LuringState *s);
79a75e4e43SEmanuele Giuseppe Esposito
80a75e4e43SEmanuele Giuseppe Esposito /* luring_co_submit: submit I/O requests in the thread's current AioContext. */
81a75e4e43SEmanuele Giuseppe Esposito int coroutine_fn luring_co_submit(BlockDriverState *bs, int fd, uint64_t offset,
82*984a32f1SKevin Wolf QEMUIOVector *qiov, int type,
83*984a32f1SKevin Wolf BdrvRequestFlags flags);
846663a0a3SAarushi Mehta void luring_detach_aio_context(LuringState *s, AioContext *old_context);
856663a0a3SAarushi Mehta void luring_attach_aio_context(LuringState *s, AioContext *new_context);
86*984a32f1SKevin Wolf bool luring_has_fua(void);
87*984a32f1SKevin Wolf #else
luring_has_fua(void)88*984a32f1SKevin Wolf static inline bool luring_has_fua(void)
89*984a32f1SKevin Wolf {
90*984a32f1SKevin Wolf return false;
91*984a32f1SKevin Wolf }
926663a0a3SAarushi Mehta #endif
935c6c3a6cSChristoph Hellwig
94a2736526SPaolo Bonzini #ifdef _WIN32
95a2736526SPaolo Bonzini typedef struct QEMUWin32AIOState QEMUWin32AIOState;
96a2736526SPaolo Bonzini QEMUWin32AIOState *win32_aio_init(void);
9799cc5989SStefan Hajnoczi void win32_aio_cleanup(QEMUWin32AIOState *aio);
98a2736526SPaolo Bonzini int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile);
997c84b1b8SMarkus Armbruster BlockAIOCB *win32_aio_submit(BlockDriverState *bs,
100a2736526SPaolo Bonzini QEMUWin32AIOState *aio, HANDLE hfile,
101de7056a3SEric Blake uint64_t offset, uint64_t bytes, QEMUIOVector *qiov,
102097310b5SMarkus Armbruster BlockCompletionFunc *cb, void *opaque, int type);
10385ebd381SStefan Hajnoczi void win32_aio_detach_aio_context(QEMUWin32AIOState *aio,
10485ebd381SStefan Hajnoczi AioContext *old_context);
10585ebd381SStefan Hajnoczi void win32_aio_attach_aio_context(QEMUWin32AIOState *aio,
10685ebd381SStefan Hajnoczi AioContext *new_context);
107a2736526SPaolo Bonzini #endif
108a2736526SPaolo Bonzini
1099f8540ecSPaolo Bonzini #endif /* QEMU_RAW_AIO_H */
110