From 17d652d72009b7532eda6e816eb726b126b6f12b Mon Sep 17 00:00:00 2001 From: Piotr Pelplinski Date: Wed, 3 Oct 2018 15:32:00 +0200 Subject: [PATCH] bdev_aio: enable double buffering on write path Signed-off-by: Tomasz Zawadzki Signed-off-by: Piotr Pelplinski Change-Id: I621a8a3891c8f3829564940219c70c6520c6f9c7 Reviewed-on: https://review.gerrithub.io/427899 Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/bdev/aio/bdev_aio.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/bdev/aio/bdev_aio.c b/lib/bdev/aio/bdev_aio.c index 1e32d81c9..d9321004d 100644 --- a/lib/bdev/aio/bdev_aio.c +++ b/lib/bdev/aio/bdev_aio.c @@ -324,24 +324,17 @@ bdev_aio_reset(struct file_disk *fdisk, struct bdev_aio_task *aio_task) } static void bdev_aio_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) -{ - bdev_aio_readv((struct file_disk *)bdev_io->bdev->ctxt, - ch, - (struct bdev_aio_task *)bdev_io->driver_ctx, - bdev_io->u.bdev.iovs, - bdev_io->u.bdev.iovcnt, - bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen, - bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen); -} - -static int _bdev_aio_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: - spdk_bdev_io_get_buf(bdev_io, bdev_aio_get_buf_cb, - bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen); - return 0; - + bdev_aio_readv((struct file_disk *)bdev_io->bdev->ctxt, + ch, + (struct bdev_aio_task *)bdev_io->driver_ctx, + bdev_io->u.bdev.iovs, + bdev_io->u.bdev.iovcnt, + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen, + bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen); + break; case SPDK_BDEV_IO_TYPE_WRITE: bdev_aio_writev((struct file_disk *)bdev_io->bdev->ctxt, ch, @@ -350,6 +343,23 @@ static int _bdev_aio_submit_request(struct spdk_io_channel *ch, struct spdk_bdev bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen, bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen); + break; + default: + SPDK_ERRLOG("Wrong io type\n"); + break; + } +} + +static int _bdev_aio_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) +{ + switch (bdev_io->type) { + /* Read and write operations must be performed on buffers aligned to + * bdev->required_alignment. If user specified unaligned buffers, + * get the aligned buffer from the pool by calling spdk_bdev_io_get_buf. */ + case SPDK_BDEV_IO_TYPE_READ: + case SPDK_BDEV_IO_TYPE_WRITE: + spdk_bdev_io_get_buf(bdev_io, bdev_aio_get_buf_cb, + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen); return 0; case SPDK_BDEV_IO_TYPE_FLUSH: bdev_aio_flush((struct file_disk *)bdev_io->bdev->ctxt,