bdev/uring: handle the out of resoruce from uring
To fix issue: #2775 Change-Id: I57172ba58419be56702157931d7a617c2e959041 Signed-off-by: GangCao <gang.cao@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15424 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Xiaodong Liu <xiaodong.liu@intel.com> Reviewed-by: wanghailiang <hailiangx.e.wang@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
parent
8dc878483d
commit
969df28bdb
@ -132,6 +132,11 @@ bdev_uring_readv(struct bdev_uring *uring, struct spdk_io_channel *ch,
|
|||||||
struct io_uring_sqe *sqe;
|
struct io_uring_sqe *sqe;
|
||||||
|
|
||||||
sqe = io_uring_get_sqe(&group_ch->uring);
|
sqe = io_uring_get_sqe(&group_ch->uring);
|
||||||
|
if (!sqe) {
|
||||||
|
SPDK_DEBUGLOG(uring, "get sqe failed as out of resource\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
io_uring_prep_readv(sqe, uring->fd, iov, iovcnt, offset);
|
io_uring_prep_readv(sqe, uring->fd, iov, iovcnt, offset);
|
||||||
io_uring_sqe_set_data(sqe, uring_task);
|
io_uring_sqe_set_data(sqe, uring_task);
|
||||||
uring_task->len = nbytes;
|
uring_task->len = nbytes;
|
||||||
@ -154,6 +159,11 @@ bdev_uring_writev(struct bdev_uring *uring, struct spdk_io_channel *ch,
|
|||||||
struct io_uring_sqe *sqe;
|
struct io_uring_sqe *sqe;
|
||||||
|
|
||||||
sqe = io_uring_get_sqe(&group_ch->uring);
|
sqe = io_uring_get_sqe(&group_ch->uring);
|
||||||
|
if (!sqe) {
|
||||||
|
SPDK_DEBUGLOG(uring, "get sqe failed as out of resource\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
io_uring_prep_writev(sqe, uring->fd, iov, iovcnt, offset);
|
io_uring_prep_writev(sqe, uring->fd, iov, iovcnt, offset);
|
||||||
io_uring_sqe_set_data(sqe, uring_task);
|
io_uring_sqe_set_data(sqe, uring_task);
|
||||||
uring_task->len = nbytes;
|
uring_task->len = nbytes;
|
||||||
@ -255,6 +265,8 @@ static void
|
|||||||
bdev_uring_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
|
bdev_uring_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
|
||||||
bool success)
|
bool success)
|
||||||
{
|
{
|
||||||
|
int64_t ret = 0;
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
return;
|
return;
|
||||||
@ -262,27 +274,31 @@ bdev_uring_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
|
|||||||
|
|
||||||
switch (bdev_io->type) {
|
switch (bdev_io->type) {
|
||||||
case SPDK_BDEV_IO_TYPE_READ:
|
case SPDK_BDEV_IO_TYPE_READ:
|
||||||
bdev_uring_readv((struct bdev_uring *)bdev_io->bdev->ctxt,
|
ret = bdev_uring_readv((struct bdev_uring *)bdev_io->bdev->ctxt,
|
||||||
ch,
|
ch,
|
||||||
(struct bdev_uring_task *)bdev_io->driver_ctx,
|
(struct bdev_uring_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.bdev.iovs,
|
bdev_io->u.bdev.iovs,
|
||||||
bdev_io->u.bdev.iovcnt,
|
bdev_io->u.bdev.iovcnt,
|
||||||
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen,
|
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen,
|
||||||
bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen);
|
bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen);
|
||||||
break;
|
break;
|
||||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||||
bdev_uring_writev((struct bdev_uring *)bdev_io->bdev->ctxt,
|
ret = bdev_uring_writev((struct bdev_uring *)bdev_io->bdev->ctxt,
|
||||||
ch,
|
ch,
|
||||||
(struct bdev_uring_task *)bdev_io->driver_ctx,
|
(struct bdev_uring_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.bdev.iovs,
|
bdev_io->u.bdev.iovs,
|
||||||
bdev_io->u.bdev.iovcnt,
|
bdev_io->u.bdev.iovcnt,
|
||||||
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen,
|
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen,
|
||||||
bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen);
|
bdev_io->u.bdev.offset_blocks * bdev_io->bdev->blocklen);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SPDK_ERRLOG("Wrong io type\n");
|
SPDK_ERRLOG("Wrong io type\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret == -ENOMEM) {
|
||||||
|
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_NOMEM);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SPDK_CONFIG_URING_ZNS
|
#ifdef SPDK_CONFIG_URING_ZNS
|
||||||
|
Loading…
Reference in New Issue
Block a user