From 5550beb8790ef20b5fffe4693f622cbb90fde8e4 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Wed, 1 Jul 2020 11:44:23 +0200 Subject: [PATCH] nbd: Make nbd_poll return real busy/idle status Signed-off-by: Maciej Szwed Change-Id: Ibced4f525b1fb8f57d493358f5b60a2d4009b5ac Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3150 Reviewed-by: Jeffry Molanus Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot --- lib/nbd/nbd.c | 64 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c index 0465390e5..7d96b9315 100644 --- a/lib/nbd/nbd.c +++ b/lib/nbd/nbd.c @@ -546,6 +546,7 @@ static int nbd_io_exec(struct spdk_nbd_disk *nbd) { struct nbd_io *io, *io_tmp; + int io_count = 0; int ret = 0; /* @@ -561,12 +562,14 @@ nbd_io_exec(struct spdk_nbd_disk *nbd) TAILQ_REMOVE(&nbd->received_io_list, io, tailq); ret = nbd_submit_bdev_io(nbd, io); if (ret < 0) { - break; + return ret; } + + io_count++; } } - return ret; + return io_count; } static int @@ -574,6 +577,7 @@ nbd_io_recv_internal(struct spdk_nbd_disk *nbd) { struct nbd_io *io; int ret = 0; + int received = 0; if (nbd->io_in_recv == NULL) { nbd->io_in_recv = nbd_get_io(nbd); @@ -594,6 +598,7 @@ nbd_io_recv_internal(struct spdk_nbd_disk *nbd) } io->offset += ret; + received = ret; /* request is fully received */ if (io->offset == sizeof(io->req)) { @@ -649,6 +654,7 @@ nbd_io_recv_internal(struct spdk_nbd_disk *nbd) } io->offset += ret; + received += ret; /* request payload is fully received */ if (io->offset == io->payload_size) { @@ -660,13 +666,13 @@ nbd_io_recv_internal(struct spdk_nbd_disk *nbd) } - return 0; + return received; } static int nbd_io_recv(struct spdk_nbd_disk *nbd) { - int i, ret = 0; + int i, rc, ret = 0; /* * nbd server should not accept request in both soft and hard @@ -677,13 +683,14 @@ nbd_io_recv(struct spdk_nbd_disk *nbd) } for (i = 0; i < GET_IO_LOOP_COUNT; i++) { - ret = nbd_io_recv_internal(nbd); - if (ret != 0) { - return ret; + rc = nbd_io_recv_internal(nbd); + if (rc < 0) { + return rc; } + ret += rc; } - return 0; + return ret; } static int @@ -691,6 +698,7 @@ nbd_io_xmit_internal(struct spdk_nbd_disk *nbd) { struct nbd_io *io; int ret = 0; + int sent = 0; io = TAILQ_FIRST(&nbd->executed_io_list); if (io == NULL) { @@ -713,6 +721,7 @@ nbd_io_xmit_internal(struct spdk_nbd_disk *nbd) } io->offset += ret; + sent = ret; /* response is fully transmitted */ if (io->offset == sizeof(io->resp)) { @@ -735,23 +744,25 @@ nbd_io_xmit_internal(struct spdk_nbd_disk *nbd) } io->offset += ret; + sent += ret; /* read payload is fully transmitted */ if (io->offset == io->payload_size) { nbd_put_io(nbd, io); - return 0; + return sent; } } reinsert: TAILQ_INSERT_HEAD(&nbd->executed_io_list, io, tailq); - return ret; + return ret < 0 ? ret : sent; } static int nbd_io_xmit(struct spdk_nbd_disk *nbd) { int ret = 0; + int rc; /* * For soft disconnection, nbd server must handle all outstanding @@ -762,10 +773,12 @@ nbd_io_xmit(struct spdk_nbd_disk *nbd) } while (!TAILQ_EMPTY(&nbd->executed_io_list)) { - ret = nbd_io_xmit_internal(nbd); - if (ret != 0) { - return ret; + rc = nbd_io_xmit_internal(nbd); + if (rc < 0) { + return rc; } + + ret += rc; } /* @@ -776,7 +789,7 @@ nbd_io_xmit(struct spdk_nbd_disk *nbd) return -1; } - return 0; + return ret; } /** @@ -787,22 +800,25 @@ nbd_io_xmit(struct spdk_nbd_disk *nbd) static int _nbd_poll(struct spdk_nbd_disk *nbd) { - int rc; + int received, sent, executed; /* transmit executed io first */ - rc = nbd_io_xmit(nbd); - if (rc < 0) { - return rc; + sent = nbd_io_xmit(nbd); + if (sent < 0) { + return sent; } - rc = nbd_io_recv(nbd); - if (rc < 0) { - return rc; + received = nbd_io_recv(nbd); + if (received < 0) { + return received; } - rc = nbd_io_exec(nbd); + executed = nbd_io_exec(nbd); + if (executed < 0) { + return executed; + } - return rc; + return sent + received + executed; } static int @@ -818,7 +834,7 @@ nbd_poll(void *arg) spdk_nbd_stop(nbd); } - return SPDK_POLLER_BUSY; + return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE; } static void *