qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

file-posix: Switch to .bdrv_co_ioctl

No real reason to keep using the callback based mechanism here when the
rest of the file-posix driver is coroutine based. Changing it brings
ioctls more in line with how other request types work.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>

+24 -28
+11 -10
block/file-posix.c
··· 3109 3109 } 3110 3110 3111 3111 #if defined(__linux__) 3112 - 3113 - static BlockAIOCB *hdev_aio_ioctl(BlockDriverState *bs, 3114 - unsigned long int req, void *buf, 3115 - BlockCompletionFunc *cb, void *opaque) 3112 + static int coroutine_fn 3113 + hdev_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf) 3116 3114 { 3117 3115 BDRVRawState *s = bs->opaque; 3118 3116 RawPosixAIOData *acb; 3119 3117 ThreadPool *pool; 3118 + int ret; 3120 3119 3121 - if (fd_open(bs) < 0) 3122 - return NULL; 3120 + ret = fd_open(bs); 3121 + if (ret < 0) { 3122 + return ret; 3123 + } 3123 3124 3124 3125 if (req == SG_IO && s->pr_mgr) { 3125 3126 struct sg_io_hdr *io_hdr = buf; 3126 3127 if (io_hdr->cmdp[0] == PERSISTENT_RESERVE_OUT || 3127 3128 io_hdr->cmdp[0] == PERSISTENT_RESERVE_IN) { 3128 3129 return pr_manager_execute(s->pr_mgr, bdrv_get_aio_context(bs), 3129 - s->fd, io_hdr, cb, opaque); 3130 + s->fd, io_hdr); 3130 3131 } 3131 3132 } 3132 3133 ··· 3138 3139 acb->ioctl.buf = buf; 3139 3140 acb->ioctl.cmd = req; 3140 3141 pool = aio_get_thread_pool(bdrv_get_aio_context(bs)); 3141 - return thread_pool_submit_aio(pool, aio_worker, acb, cb, opaque); 3142 + return thread_pool_submit_co(pool, aio_worker, acb); 3142 3143 } 3143 3144 #endif /* linux */ 3144 3145 ··· 3279 3280 3280 3281 /* generic scsi device */ 3281 3282 #ifdef __linux__ 3282 - .bdrv_aio_ioctl = hdev_aio_ioctl, 3283 + .bdrv_co_ioctl = hdev_co_ioctl, 3283 3284 #endif 3284 3285 }; 3285 3286 ··· 3401 3402 .bdrv_lock_medium = cdrom_lock_medium, 3402 3403 3403 3404 /* generic scsi device */ 3404 - .bdrv_aio_ioctl = hdev_aio_ioctl, 3405 + .bdrv_co_ioctl = hdev_co_ioctl, 3405 3406 }; 3406 3407 #endif /* __linux__ */ 3407 3408
+3 -5
include/scsi/pr-manager.h
··· 5 5 #include "qapi/visitor.h" 6 6 #include "qom/object_interfaces.h" 7 7 #include "block/aio.h" 8 + #include "qemu/coroutine.h" 8 9 9 10 #define TYPE_PR_MANAGER "pr-manager" 10 11 ··· 37 38 } PRManagerClass; 38 39 39 40 bool pr_manager_is_connected(PRManager *pr_mgr); 40 - BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, 41 - AioContext *ctx, int fd, 42 - struct sg_io_hdr *hdr, 43 - BlockCompletionFunc *complete, 44 - void *opaque); 41 + int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd, 42 + struct sg_io_hdr *hdr); 45 43 46 44 PRManager *pr_manager_lookup(const char *id, Error **errp); 47 45
+9 -12
scsi/pr-manager.c
··· 48 48 } 49 49 50 50 51 - BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, 52 - AioContext *ctx, int fd, 53 - struct sg_io_hdr *hdr, 54 - BlockCompletionFunc *complete, 55 - void *opaque) 51 + int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd, 52 + struct sg_io_hdr *hdr) 56 53 { 57 - PRManagerData *data = g_new(PRManagerData, 1); 58 54 ThreadPool *pool = aio_get_thread_pool(ctx); 55 + PRManagerData data = { 56 + .pr_mgr = pr_mgr, 57 + .fd = fd, 58 + .hdr = hdr, 59 + }; 59 60 60 - trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1], opaque); 61 - data->pr_mgr = pr_mgr; 62 - data->fd = fd; 63 - data->hdr = hdr; 61 + trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1]); 64 62 65 63 /* The matching object_unref is in pr_manager_worker. */ 66 64 object_ref(OBJECT(pr_mgr)); 67 - return thread_pool_submit_aio(pool, pr_manager_worker, 68 - data, complete, opaque); 65 + return thread_pool_submit_co(pool, pr_manager_worker, &data); 69 66 } 70 67 71 68 bool pr_manager_is_connected(PRManager *pr_mgr)
+1 -1
scsi/trace-events
··· 1 1 # scsi/pr-manager.c 2 - pr_manager_execute(int fd, int cmd, int sa, void *opaque) "fd=%d cmd=0x%02x service action=0x%02x opaque=%p" 2 + pr_manager_execute(int fd, int cmd, int sa) "fd=%d cmd=0x%02x service action=0x%02x" 3 3 pr_manager_run(int fd, int cmd, int sa) "fd=%d cmd=0x%02x service action=0x%02x"