bdev/iscsi: add poller when there is no master channel

Target might want to send Asynchronous Message that we need to handle.
Of course this need further work but at least we can respond to NOP

This patch also open a way to remove bdev_iscsi_conn_req structure as it
make more troubles than need when managing connections request.

Change-Id: Ib5bc8ae3bc5f90219bb4e13aee1b2e637b458236
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/410891
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Pawel Wodkowski 2018-05-11 13:12:54 +02:00 committed by Jim Harris
parent b3497d5da7
commit bd52bfecb5

View File

@ -53,7 +53,9 @@
struct bdev_iscsi_lun;
#define BDEV_ISCSI_CONNECTION_POLL_US 500
#define BDEV_ISCSI_CONNECTION_POLL_US 500 /* 0.5 ms */
#define BDEV_ISCSI_NO_MASTER_CH_POLL_US 10000 /* 10ms */
#define DEFAULT_INITIATOR_NAME "iqn.2016-06.io.spdk:init"
static int bdev_iscsi_initialize(void);
@ -80,6 +82,8 @@ struct bdev_iscsi_lun {
uint32_t ch_count;
struct bdev_iscsi_io_channel *master_ch;
struct spdk_thread *master_td;
struct spdk_poller *no_master_ch_poller;
struct spdk_thread *no_master_ch_poller_td;
TAILQ_ENTRY(bdev_iscsi_lun) link;
};
@ -279,14 +283,24 @@ bdev_iscsi_writev(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io,
#endif
}
static void
bdev_iscsi_destruct_cb(void *ctx)
{
struct bdev_iscsi_lun *lun = ctx;
spdk_poller_unregister(&lun->no_master_ch_poller);
bdev_iscsi_lun_cleanup(lun);
spdk_bdev_destruct_done(&lun->bdev, 0);
}
static int
bdev_iscsi_destruct(void *ctx)
{
struct bdev_iscsi_lun *lun = ctx;
int rc = 0;
TAILQ_REMOVE(&g_iscsi_lun_head, lun, link);
return rc;
assert(lun->no_master_ch_poller_td);
spdk_thread_send_msg(lun->no_master_ch_poller_td, bdev_iscsi_destruct_cb, lun);
return 1;
}
static void
@ -305,10 +319,8 @@ bdev_iscsi_flush(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io, uin
}
static int
bdev_iscsi_poll(void *arg)
bdev_iscsi_poll_lun(struct bdev_iscsi_lun *lun)
{
struct bdev_iscsi_io_channel *ch = arg;
struct bdev_iscsi_lun *lun = ch->lun;
struct pollfd pfd = {};
pfd.fd = iscsi_get_fd(lun->context);
@ -328,6 +340,33 @@ bdev_iscsi_poll(void *arg)
return 0;
}
static int
bdev_iscsi_no_master_ch_poll(void *arg)
{
struct bdev_iscsi_lun *lun = arg;
int rc = 0;
if (pthread_mutex_trylock(&lun->mutex)) {
/* Don't care about the error code here. */
return -1;
}
if (lun->ch_count == 0) {
rc = bdev_iscsi_poll_lun(arg);
}
pthread_mutex_unlock(&lun->mutex);
return rc;
}
static int
bdev_iscsi_poll(void *arg)
{
struct bdev_iscsi_io_channel *ch = arg;
return bdev_iscsi_poll_lun(ch->lun);
}
static void bdev_iscsi_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
{
bdev_iscsi_readv((struct bdev_iscsi_lun *)bdev_io->bdev->ctxt,
@ -430,6 +469,8 @@ bdev_iscsi_destroy_cb(void *io_device, void *ctx_buf)
if (lun->ch_count == 0) {
assert(lun->master_ch != NULL);
assert(lun->master_td != NULL);
assert(lun->master_td == spdk_get_thread());
lun->master_ch = NULL;
lun->master_td = NULL;
spdk_poller_unregister(&io_channel->poller);
@ -535,6 +576,10 @@ create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn,
goto error_return;
}
lun->no_master_ch_poller_td = spdk_get_thread();
lun->no_master_ch_poller = spdk_poller_register(bdev_iscsi_no_master_ch_poll, lun,
BDEV_ISCSI_NO_MASTER_CH_POLL_US);
TAILQ_INSERT_TAIL(&g_iscsi_lun_head, lun, link);
*bdev = &lun->bdev;
return 0;