Commit 4c6c794b authored by Liu Xiaodong's avatar Liu Xiaodong Committed by Tomasz Zawadzki
Browse files

nbd: use retry_poller and retry_count



This is better naming to represent their usage.
retry_poller and count can also be used to do
async nbd_stop procedure in the following patch.

Change-Id: Ie5a74e4add3f1a6c7257df00aded8b5d52a09955
Signed-off-by: default avatarLiu Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6277


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatar <dongx.yi@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 2c436c00
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@
#include "spdk/queue.h"

#define GET_IO_LOOP_COUNT		16
#define NBD_BUSY_WAITING_MS		1000
#define NBD_START_BUSY_WAITING_MS	1000
#define NBD_BUSY_POLLING_INTERVAL_US	20000
#define NBD_IO_TIMEOUT_S		60

@@ -106,6 +106,9 @@ struct spdk_nbd_disk {
	struct spdk_interrupt	*intr;
	uint32_t		buf_align;

	struct spdk_poller	*retry_poller;
	int			retry_count;

	struct nbd_io		*io_in_recv;
	TAILQ_HEAD(, nbd_io)	received_io_list;
	TAILQ_HEAD(, nbd_io)	executed_io_list;
@@ -907,8 +910,6 @@ struct spdk_nbd_start_ctx {
	struct spdk_nbd_disk	*nbd;
	spdk_nbd_start_cb	cb_fn;
	void			*cb_arg;
	struct spdk_poller	*poller;
	int			polling_count;
};

static void
@@ -1022,18 +1023,24 @@ nbd_enable_kernel(void *arg)
	}

	if (rc) {
		if (errno == EBUSY && ctx->polling_count-- > 0) {
			if (ctx->poller == NULL) {
				ctx->poller = SPDK_POLLER_REGISTER(nbd_enable_kernel, ctx,
		if (errno == EBUSY) {
			if (ctx->nbd->retry_poller == NULL) {
				ctx->nbd->retry_count = NBD_START_BUSY_WAITING_MS * 1000ULL / NBD_BUSY_POLLING_INTERVAL_US;
				ctx->nbd->retry_poller = SPDK_POLLER_REGISTER(nbd_enable_kernel, ctx,
							 NBD_BUSY_POLLING_INTERVAL_US);
			}
			/* If the kernel is busy, check back later */
				return SPDK_POLLER_BUSY;
			} else if (ctx->nbd->retry_count-- > 0) {
				/* Repeatedly unregiter and register retry poller to avoid scan-build error */
				spdk_poller_unregister(&ctx->nbd->retry_poller);
				ctx->nbd->retry_poller = SPDK_POLLER_REGISTER(nbd_enable_kernel, ctx,
							 NBD_BUSY_POLLING_INTERVAL_US);
				return SPDK_POLLER_BUSY;
			}
		}

		SPDK_ERRLOG("ioctl(NBD_SET_SOCK) failed: %s\n", spdk_strerror(errno));
		if (ctx->poller) {
			spdk_poller_unregister(&ctx->poller);
		if (ctx->nbd->retry_poller) {
			spdk_poller_unregister(&ctx->nbd->retry_poller);
		}

		spdk_nbd_stop(ctx->nbd);
@@ -1046,8 +1053,8 @@ nbd_enable_kernel(void *arg)
		return SPDK_POLLER_BUSY;
	}

	if (ctx->poller) {
		spdk_poller_unregister(&ctx->poller);
	if (ctx->nbd->retry_poller) {
		spdk_poller_unregister(&ctx->nbd->retry_poller);
	}

	nbd_start_complete(ctx);
@@ -1084,7 +1091,6 @@ spdk_nbd_start(const char *bdev_name, const char *nbd_path,
	ctx->nbd = nbd;
	ctx->cb_fn = cb_fn;
	ctx->cb_arg = cb_arg;
	ctx->polling_count = NBD_BUSY_WAITING_MS * 1000ULL / NBD_BUSY_POLLING_INTERVAL_US;

	rc = spdk_bdev_open_ext(bdev_name, true, nbd_bdev_event_cb, nbd, &nbd->bdev_desc);
	if (rc != 0) {