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 <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/379930
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Shuhei Matsumoto 2017-09-30 13:01:07 +09:00 committed by Jim Harris
parent 4185f77862
commit 666dc8af4e
10 changed files with 34 additions and 35 deletions

View File

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

View File

@ -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_ */

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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;
}

View File

@ -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)
{
}