From 5adeda4807c70d192d8c345139ef30416c214cce Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 21 Jan 2020 01:27:50 -0500 Subject: [PATCH] lib/iscsi: Send message to add connection to poll group even at startup The next patch will create a SPDK thread for each poll group at startup. Hence iSCSI configuration management will be done by different thread from these poll group threads. Hence send message explicitly to add connection to poll group even at startup. We can do this for the current master branch. Remove some code related with SPDK thread framework from unit tests for iSCSI portal group because thread management is moved to connection. Signed-off-by: Shuhei Matsumoto Change-Id: I40cacdb2066f65866f7ef83cf3b3e4e8b8cd322e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/489 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/iscsi/conn.c | 22 +++++++++++---- lib/iscsi/portal_grp.c | 28 ++----------------- lib/iscsi/portal_grp.h | 1 - .../lib/iscsi/portal_grp.c/portal_grp_ut.c | 21 -------------- 4 files changed, 19 insertions(+), 53 deletions(-) diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 8d0dc7368..7adbe876b 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -197,6 +197,14 @@ iscsi_poll_group_remove_conn(struct spdk_iscsi_poll_group *pg, struct spdk_iscsi STAILQ_REMOVE(&pg->connections, conn, spdk_iscsi_conn, link); } +static void +iscsi_conn_start(void *ctx) +{ + struct spdk_iscsi_conn *conn = ctx; + + iscsi_poll_group_add_conn(conn->pg, conn); +} + int spdk_iscsi_conn_construct(struct spdk_iscsi_portal *portal, struct spdk_sock *sock) @@ -284,13 +292,17 @@ spdk_iscsi_conn_construct(struct spdk_iscsi_portal *portal, SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "Launching connection on acceptor thread\n"); conn->pending_task_cnt = 0; - /* Get the acceptor poll group */ - pg = portal->acceptor_pg; - - assert(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(pg)) == spdk_get_thread()); + /* Get the first poll group. */ + pg = TAILQ_FIRST(&g_spdk_iscsi.poll_group_head); + if (pg == NULL) { + SPDK_ERRLOG("There is no poll group.\n"); + assert(false); + goto error_return; + } conn->pg = pg; - iscsi_poll_group_add_conn(pg, conn); + spdk_thread_send_msg(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(pg)), + iscsi_conn_start, conn); return 0; error_return: diff --git a/lib/iscsi/portal_grp.c b/lib/iscsi/portal_grp.c index 798292b51..4ece6c07d 100644 --- a/lib/iscsi/portal_grp.c +++ b/lib/iscsi/portal_grp.c @@ -82,30 +82,6 @@ iscsi_portal_accept(void *arg) return count; } -static void -iscsi_acceptor_start(struct spdk_iscsi_portal *p) -{ - struct spdk_io_channel *ch; - - p->acceptor_poller = spdk_poller_register(iscsi_portal_accept, p, ACCEPT_TIMEOUT_US); - - ch = spdk_get_io_channel(&g_spdk_iscsi); - assert(ch != NULL); - p->acceptor_pg = spdk_io_channel_get_ctx(ch); -} - -static void -iscsi_acceptor_stop(struct spdk_iscsi_portal *p) -{ - struct spdk_io_channel *ch; - - spdk_poller_unregister(&p->acceptor_poller); - - assert(p->acceptor_pg != NULL); - ch = spdk_io_channel_from_ctx(p->acceptor_pg); - spdk_put_io_channel(ch); -} - static struct spdk_iscsi_portal * iscsi_portal_find_by_addr(const char *host, const char *port) { @@ -222,7 +198,7 @@ iscsi_portal_open(struct spdk_iscsi_portal *p) * the requests will be queued by the nonzero backlog of the socket * or resend by TCP. */ - iscsi_acceptor_start(p); + p->acceptor_poller = spdk_poller_register(iscsi_portal_accept, p, ACCEPT_TIMEOUT_US); return 0; } @@ -233,7 +209,7 @@ iscsi_portal_close(struct spdk_iscsi_portal *p) if (p->sock) { SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "close portal (%s, %s)\n", p->host, p->port); - iscsi_acceptor_stop(p); + spdk_poller_unregister(&p->acceptor_poller); spdk_sock_close(&p->sock); } } diff --git a/lib/iscsi/portal_grp.h b/lib/iscsi/portal_grp.h index fe3242125..fd629c8db 100644 --- a/lib/iscsi/portal_grp.h +++ b/lib/iscsi/portal_grp.h @@ -47,7 +47,6 @@ struct spdk_iscsi_portal { char port[MAX_PORTAL_PORT + 1]; struct spdk_sock *sock; struct spdk_poller *acceptor_poller; - struct spdk_iscsi_poll_group *acceptor_pg; TAILQ_ENTRY(spdk_iscsi_portal) per_pg_tailq; TAILQ_ENTRY(spdk_iscsi_portal) g_tailq; }; diff --git a/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c b/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c index b9e943989..9705c0957 100644 --- a/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c +++ b/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c @@ -280,17 +280,6 @@ portal_grp_register_twice_case(void) CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); } -static int -ut_poll_group_create(void *io_device, void *ctx_buf) -{ - return 0; -} - -static void -ut_poll_group_destroy(void *io_device, void *ctx_buf) -{ -} - static void portal_grp_add_delete_case(void) { @@ -305,9 +294,6 @@ portal_grp_add_delete_case(void) allocate_threads(1); set_thread(0); - spdk_io_device_register(&g_spdk_iscsi, ut_poll_group_create, ut_poll_group_destroy, - sizeof(struct spdk_iscsi_poll_group), "ut_portal_grp"); - /* internal of iscsi_create_portal_group */ pg1 = spdk_iscsi_portal_grp_create(1); CU_ASSERT(pg1 != NULL); @@ -337,8 +323,6 @@ portal_grp_add_delete_case(void) CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head)); - spdk_io_device_unregister(&g_spdk_iscsi, NULL); - free_threads(); } @@ -356,9 +340,6 @@ portal_grp_add_delete_twice_case(void) allocate_threads(1); set_thread(0); - spdk_io_device_register(&g_spdk_iscsi, ut_poll_group_create, ut_poll_group_destroy, - sizeof(struct spdk_iscsi_poll_group), "ut_portal_grp"); - /* internal of iscsi_create_portal_group related */ pg1 = spdk_iscsi_portal_grp_create(1); CU_ASSERT(pg1 != NULL); @@ -403,8 +384,6 @@ portal_grp_add_delete_twice_case(void) MOCK_CLEAR_P(spdk_sock_listen); - spdk_io_device_unregister(&g_spdk_iscsi, NULL); - free_threads(); }