Commit 855d8e03 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

iscsi: change master_lcore to first_core for idle connection management



Currently idle iSCSI connections are managed by the master lcore,
but the master lcore is like BSP of OS and for initialization.

To manage idle iSCSI connections it is important that the core is
consistent.

Hence the first core is better than the master lcore.

In this patch the following are changed together:
- Errors of kqueue() and epoll_create1() are not related with master
  lcore. "master lcore" is removed and errno is added into the log.
- In spdk_iscsi_conn_allocate_reactor(), when cpumask is 0, 0 is
  selected as core number. 0 is not safe and first_core is used instead.

In spdk_iscsi_conn_allocate_reactor(), when first_core is used instead
of master_lcore, we may observe some contradiction in the following
code. But few changes are done in this patch.

In the current implementation we can assume the first lcore is
equal to the master lcore and the following code will be removed
in the subsequent patch.

/*
 * DPDK returns WAIT for the master lcore instead of RUNNING.
 * So we always treat the reactor on master core as RUNNING.
 */
if (i == master_lcore) {
    state = RUNNING;
} else {
    state = rte_eal_get_lcore_state(i);
}

Change-Id: I6cac06c27b289db5ea1f9452e33489286c64d2fa
Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/391338


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 77679908
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -146,10 +146,13 @@ spdk_find_iscsi_connection_by_id(int cid)
static int
init_idle_conns(void)
{
	char buf[64];

	assert(g_poll_fd == 0);
	g_poll_fd = kqueue();
	if (g_poll_fd < 0) {
		SPDK_ERRLOG("kqueue failed master lcore\n");
		spdk_strerror_r(errno, buf, sizeof(buf));
		SPDK_ERRLOG("kqueue() failed, errno %d: %s\n", errno, buf);
		return -1;
	}

@@ -248,10 +251,13 @@ check_idle_conns(void)
static int
init_idle_conns(void)
{
	char buf[64];

	assert(g_poll_fd == 0);
	g_poll_fd = epoll_create1(0);
	if (g_poll_fd < 0) {
		SPDK_ERRLOG("epoll_create1 failed master lcore\n");
		spdk_strerror_r(errno, buf, sizeof(buf));
		SPDK_ERRLOG("epoll_create1() failed, errno %d: %s\n", errno, buf);
		return -1;
	}

@@ -1369,7 +1375,7 @@ static void spdk_iscsi_conn_handle_idle(struct spdk_iscsi_conn *conn)
	    conn->pending_task_cnt == 0) {

		spdk_trace_record(TRACE_ISCSI_CONN_IDLE, conn->id, 0, 0, 0);
		spdk_iscsi_conn_stop_poller(conn, __add_idle_conn, rte_get_master_lcore());
		spdk_iscsi_conn_stop_poller(conn, __add_idle_conn, spdk_env_get_first_core());
	}
}

@@ -1487,7 +1493,7 @@ spdk_iscsi_conn_full_feature_do_work(void *arg)

	/* Check if the session was idle during this access pass. If it was,
	   and it was idle longer than the configured timeout, migrate this
	   session to the master core. */
	   session to the first core. */
	spdk_iscsi_conn_handle_idle(conn);
}

@@ -1586,12 +1592,12 @@ spdk_iscsi_conn_allocate_reactor(uint64_t cpumask)
{
	uint32_t i, selected_core;
	enum rte_lcore_state_t state;
	uint32_t master_lcore = rte_get_master_lcore();
	uint32_t first_core = spdk_env_get_first_core();
	int32_t num_pollers, min_pollers;

	cpumask &= spdk_app_get_core_mask();
	if (cpumask == 0) {
		return 0;
		return first_core;
	}

	min_pollers = INT_MAX;
@@ -1604,10 +1610,10 @@ spdk_iscsi_conn_allocate_reactor(uint64_t cpumask)
		}

		/*
		 * DPDK returns WAIT for the master lcore instead of RUNNING.
		 * DPDK returns WAIT for the master core instead of RUNNING.
		 * So we always treat the reactor on master core as RUNNING.
		 */
		if (i == master_lcore) {
		if (i == first_core) {
			state = RUNNING;
		} else {
			state = rte_eal_get_lcore_state(i);