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(); }