Commit 666dc8af authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/379930


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 4185f778
Loading
Loading
Loading
Loading
+7 −22
Original line number Diff line number Diff line
@@ -45,11 +45,10 @@

#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];

@@ -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);
}
+4 −2
Original line number Diff line number Diff line
@@ -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_ */
+6 −0
Original line number Diff line number Diff line
@@ -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;
+6 −2
Original line number Diff line number Diff line
@@ -77,6 +77,10 @@ struct spdk_iscsi_conn {
	 *  are initialized when allocated.
	 */
	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;
+3 −4
Original line number Diff line number Diff line
@@ -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();
}
Loading