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: Liu Xiaodong <xiaodong.liu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6277 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: <dongx.yi@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
2c436c00a0
commit
4c6c794be3
@ -49,7 +49,7 @@
|
|||||||
#include "spdk/queue.h"
|
#include "spdk/queue.h"
|
||||||
|
|
||||||
#define GET_IO_LOOP_COUNT 16
|
#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_BUSY_POLLING_INTERVAL_US 20000
|
||||||
#define NBD_IO_TIMEOUT_S 60
|
#define NBD_IO_TIMEOUT_S 60
|
||||||
|
|
||||||
@ -106,6 +106,9 @@ struct spdk_nbd_disk {
|
|||||||
struct spdk_interrupt *intr;
|
struct spdk_interrupt *intr;
|
||||||
uint32_t buf_align;
|
uint32_t buf_align;
|
||||||
|
|
||||||
|
struct spdk_poller *retry_poller;
|
||||||
|
int retry_count;
|
||||||
|
|
||||||
struct nbd_io *io_in_recv;
|
struct nbd_io *io_in_recv;
|
||||||
TAILQ_HEAD(, nbd_io) received_io_list;
|
TAILQ_HEAD(, nbd_io) received_io_list;
|
||||||
TAILQ_HEAD(, nbd_io) executed_io_list;
|
TAILQ_HEAD(, nbd_io) executed_io_list;
|
||||||
@ -907,8 +910,6 @@ struct spdk_nbd_start_ctx {
|
|||||||
struct spdk_nbd_disk *nbd;
|
struct spdk_nbd_disk *nbd;
|
||||||
spdk_nbd_start_cb cb_fn;
|
spdk_nbd_start_cb cb_fn;
|
||||||
void *cb_arg;
|
void *cb_arg;
|
||||||
struct spdk_poller *poller;
|
|
||||||
int polling_count;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1022,18 +1023,24 @@ nbd_enable_kernel(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (errno == EBUSY && ctx->polling_count-- > 0) {
|
if (errno == EBUSY) {
|
||||||
if (ctx->poller == NULL) {
|
if (ctx->nbd->retry_poller == NULL) {
|
||||||
ctx->poller = SPDK_POLLER_REGISTER(nbd_enable_kernel, ctx,
|
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);
|
NBD_BUSY_POLLING_INTERVAL_US);
|
||||||
}
|
|
||||||
/* If the kernel is busy, check back later */
|
|
||||||
return SPDK_POLLER_BUSY;
|
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));
|
SPDK_ERRLOG("ioctl(NBD_SET_SOCK) failed: %s\n", spdk_strerror(errno));
|
||||||
if (ctx->poller) {
|
if (ctx->nbd->retry_poller) {
|
||||||
spdk_poller_unregister(&ctx->poller);
|
spdk_poller_unregister(&ctx->nbd->retry_poller);
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_nbd_stop(ctx->nbd);
|
spdk_nbd_stop(ctx->nbd);
|
||||||
@ -1046,8 +1053,8 @@ nbd_enable_kernel(void *arg)
|
|||||||
return SPDK_POLLER_BUSY;
|
return SPDK_POLLER_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->poller) {
|
if (ctx->nbd->retry_poller) {
|
||||||
spdk_poller_unregister(&ctx->poller);
|
spdk_poller_unregister(&ctx->nbd->retry_poller);
|
||||||
}
|
}
|
||||||
|
|
||||||
nbd_start_complete(ctx);
|
nbd_start_complete(ctx);
|
||||||
@ -1084,7 +1091,6 @@ spdk_nbd_start(const char *bdev_name, const char *nbd_path,
|
|||||||
ctx->nbd = nbd;
|
ctx->nbd = nbd;
|
||||||
ctx->cb_fn = cb_fn;
|
ctx->cb_fn = cb_fn;
|
||||||
ctx->cb_arg = cb_arg;
|
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);
|
rc = spdk_bdev_open_ext(bdev_name, true, nbd_bdev_event_cb, nbd, &nbd->bdev_desc);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user