From 666dc8af4e7ab8ed366358d852a73005c81f43e2 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Sat, 30 Sep 2017 13:01:07 +0900 Subject: [PATCH] iscsi: login poller per portal and portal cache A few foundational change to support safe removal of portal. - global login poller -> login poller per portal - Caching portal data for active connection Change-Id: I62f4d90c9ac11a433ad47421b2b0c69bfc3c70b7 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/379930 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Daniel Verkamp --- lib/iscsi/acceptor.c | 29 +++++++------------------- lib/iscsi/acceptor.h | 6 ++++-- lib/iscsi/conn.c | 6 ++++++ lib/iscsi/conn.h | 8 +++++-- lib/iscsi/iscsi.c | 7 +++---- lib/iscsi/iscsi_subsystem.c | 3 --- lib/iscsi/portal_grp.c | 5 +++++ lib/iscsi/portal_grp.h | 1 + lib/iscsi/tgt_node.c | 2 +- test/unit/lib/iscsi/iscsi.c/iscsi_ut.c | 2 +- 10 files changed, 34 insertions(+), 35 deletions(-) diff --git a/lib/iscsi/acceptor.c b/lib/iscsi/acceptor.c index 5ccdd7084..7b72f3030 100644 --- a/lib/iscsi/acceptor.c +++ b/lib/iscsi/acceptor.c @@ -45,13 +45,12 @@ #define ACCEPT_TIMEOUT_US 1000 /* 1ms */ -static struct spdk_poller *g_acceptor_poller; - static void -spdk_iscsi_portal_accept(struct spdk_iscsi_portal *portal) +spdk_iscsi_portal_accept(void *arg) { + struct spdk_iscsi_portal *portal = arg; int rc, sock; - char buf[64]; + char buf[64]; if (portal->sock < 0) { return; @@ -77,29 +76,15 @@ spdk_iscsi_portal_accept(struct spdk_iscsi_portal *portal) } } -static void -spdk_acceptor(void *arg) -{ - struct spdk_iscsi_globals *iscsi = arg; - struct spdk_iscsi_portal_grp *portal_group; - struct spdk_iscsi_portal *portal; - - TAILQ_FOREACH(portal_group, &iscsi->pg_head, tailq) { - TAILQ_FOREACH(portal, &portal_group->head, per_pg_tailq) { - spdk_iscsi_portal_accept(portal); - } - } -} - void -spdk_iscsi_acceptor_start(void) +spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p) { - spdk_poller_register(&g_acceptor_poller, spdk_acceptor, &g_spdk_iscsi, spdk_env_get_current_core(), + spdk_poller_register(&p->acceptor_poller, spdk_iscsi_portal_accept, p, spdk_env_get_current_core(), ACCEPT_TIMEOUT_US); } void -spdk_iscsi_acceptor_stop(void) +spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p) { - spdk_poller_unregister(&g_acceptor_poller, NULL); + spdk_poller_unregister(&p->acceptor_poller, NULL); } diff --git a/lib/iscsi/acceptor.h b/lib/iscsi/acceptor.h index f84c4d5dc..9060ee7db 100644 --- a/lib/iscsi/acceptor.h +++ b/lib/iscsi/acceptor.h @@ -35,7 +35,9 @@ #ifndef SPDK_ACCEPTOR_H_ #define SPDK_ACCEPTOR_H_ -void spdk_iscsi_acceptor_start(void); -void spdk_iscsi_acceptor_stop(void); +struct spdk_iscsi_portal; + +void spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p); +void spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p); #endif /* SPDK_ACCEPTOR_H_ */ diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index ec31d92bc..3ca5c53d1 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -125,6 +125,8 @@ allocate_conn(void) static void free_conn(struct spdk_iscsi_conn *conn) { + free(conn->portal_host); + free(conn->portal_port); conn->is_valid = 0; } @@ -433,6 +435,10 @@ spdk_iscsi_conn_construct(struct spdk_iscsi_portal *portal, conn->MaxRecvDataSegmentLength = 8192; // RFC3720(12.12) conn->portal = portal; + conn->pg_tag = portal->group->tag; + conn->portal_host = strdup(portal->host); + conn->portal_port = strdup(portal->port); + conn->portal_cpumask = portal->cpumask; conn->sock = sock; conn->state = ISCSI_CONN_STATE_INVALID; diff --git a/lib/iscsi/conn.h b/lib/iscsi/conn.h index db2a2dba9..b32f467f4 100644 --- a/lib/iscsi/conn.h +++ b/lib/iscsi/conn.h @@ -76,10 +76,14 @@ struct spdk_iscsi_conn { * SPDK_ISCSI_CONNECTION_MEMSET() macro if changing which fields * are initialized when allocated. */ - struct spdk_iscsi_portal *portal; + struct spdk_iscsi_portal *portal; + int pg_tag; + char *portal_host; + char *portal_port; + uint64_t portal_cpumask; uint32_t lcore; int sock; - struct spdk_iscsi_sess *sess; + struct spdk_iscsi_sess *sess; enum iscsi_connection_state state; int login_phase; diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 0b2c56f00..30e1dbfc1 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -2527,14 +2527,14 @@ spdk_iscsi_op_logout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) snprintf(buf, sizeof buf, "Logout(login failed) from %s (%s) on" " (%s:%s,%d)\n", conn->initiator_name, conn->initiator_addr, - conn->portal->host, conn->portal->port, conn->portal->group->tag); + conn->portal_host, conn->portal_port, conn->pg_tag); } else if (spdk_iscsi_param_eq_val(conn->sess->params, "SessionType", "Normal")) { snprintf(buf, sizeof buf, "Logout from %s (%s) on %s tgt_node%d" " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u," " CID=%u, HeaderDigest=%s, DataDigest=%s\n", conn->initiator_name, conn->initiator_addr, conn->target->name, conn->target->num, - conn->portal->host, conn->portal->port, conn->portal->group->tag, + conn->portal_host, conn->portal_port, conn->pg_tag, conn->sess->isid, conn->sess->tsih, conn->cid, (spdk_iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C") ? "on" : "off"), @@ -2546,7 +2546,7 @@ spdk_iscsi_op_logout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u," " CID=%u, HeaderDigest=%s, DataDigest=%s\n", conn->initiator_name, conn->initiator_addr, - conn->portal->host, conn->portal->port, conn->portal->group->tag, + conn->portal_host, conn->portal_port, conn->pg_tag, conn->sess->isid, conn->sess->tsih, conn->cid, (spdk_iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C") ? "on" : "off"), @@ -4688,7 +4688,6 @@ spdk_append_iscsi_sess(struct spdk_iscsi_conn *conn, void spdk_iscsi_shutdown(void) { - spdk_iscsi_acceptor_stop(); spdk_iscsi_portal_grp_close_all(); spdk_shutdown_iscsi_conns(); } diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index f5442fcf2..6d0404032 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -41,7 +41,6 @@ #include "iscsi/iscsi.h" #include "iscsi/init_grp.h" #include "iscsi/portal_grp.h" -#include "iscsi/acceptor.h" #include "iscsi/conn.h" #include "iscsi/task.h" @@ -956,8 +955,6 @@ spdk_iscsi_setup(void *arg1, void *arg2) SPDK_ERRLOG("spdk_iscsi_portal_grp_open_all() failed\n"); return; } - - spdk_iscsi_acceptor_start(); } int diff --git a/lib/iscsi/portal_grp.c b/lib/iscsi/portal_grp.c index 87fac87d9..5c3266dd8 100644 --- a/lib/iscsi/portal_grp.c +++ b/lib/iscsi/portal_grp.c @@ -43,6 +43,7 @@ #include "iscsi/tgt_node.h" #include "iscsi/conn.h" #include "iscsi/portal_grp.h" +#include "iscsi/acceptor.h" #define PORTNUMSTRLEN 32 @@ -88,6 +89,7 @@ spdk_iscsi_portal_create(const char *host, const char *port, uint64_t cpumask) p->cpumask = cpumask; p->sock = -1; p->group = NULL; /* set at a later time by caller */ + p->acceptor_poller = NULL; TAILQ_INSERT_TAIL(&g_spdk_iscsi.portal_head, p, g_tailq); @@ -126,6 +128,8 @@ spdk_iscsi_portal_open(struct spdk_iscsi_portal *p) p->sock = sock; + spdk_iscsi_acceptor_start(p); + return 0; } @@ -135,6 +139,7 @@ spdk_iscsi_portal_close(struct spdk_iscsi_portal *p) if (p->sock >= 0) { SPDK_DEBUGLOG(SPDK_TRACE_NET, "close portal (%s, %s)\n", p->host, p->port); + spdk_iscsi_acceptor_stop(p); close(p->sock); p->sock = -1; } diff --git a/lib/iscsi/portal_grp.h b/lib/iscsi/portal_grp.h index 7690a79fe..e681b9ca6 100644 --- a/lib/iscsi/portal_grp.h +++ b/lib/iscsi/portal_grp.h @@ -43,6 +43,7 @@ struct spdk_iscsi_portal { char *port; int sock; uint64_t cpumask; + struct spdk_poller *acceptor_poller; TAILQ_ENTRY(spdk_iscsi_portal) per_pg_tailq; TAILQ_ENTRY(spdk_iscsi_portal) g_tailq; }; diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index 2a1e12b3b..1fea70cfe 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -368,7 +368,7 @@ spdk_iscsi_send_tgts(struct spdk_iscsi_conn *conn, const char *iiqn, continue; } rc = spdk_iscsi_tgt_node_visible(target, iiqn, - conn->portal->group->tag); + conn->pg_tag); if (rc == 0) { continue; } diff --git a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c index 3151c4266..95bd419b5 100644 --- a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c +++ b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c @@ -68,7 +68,7 @@ spdk_iscsi_send_tgts(struct spdk_iscsi_conn *conn, const char *iiqn, } void -spdk_iscsi_acceptor_stop(void) +spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p) { }