Commit 43022da3 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvmf: remove accept poller from generic layer



Not every transport requires accept poller - transport specific
layer can have its own policy and way of handling new connection.
APIs to notify generic layer are already in place
 - spdk_nvmf_poll_group_add
 - spdk_nvmf_tgt_new_qpair

Having accept poller removed should simplify interrupt mode impl
in transport specific layer.

Fixes issue #1876

Change-Id: Ia6cac0c2da67a298e88956734c50fb6e6b7521f1
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7268


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent bace0549
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -46,10 +46,8 @@
#include "spdk_internal/event.h"

#define NVMF_DEFAULT_SUBSYSTEMS		32
#define ACCEPT_TIMEOUT_US		10000 /* 10ms */

static const char *g_rpc_addr = SPDK_DEFAULT_RPC_ADDR;
static uint32_t g_acceptor_poll_rate = ACCEPT_TIMEOUT_US;

enum nvmf_target_state {
	NVMF_INIT_SUBSYSTEM = 0,
@@ -122,7 +120,6 @@ usage(char *program_name)
	printf("\t[-i shared memory ID (optional)]\n");
	printf("\t[-m core mask for DPDK]\n");
	printf("\t[-n max subsystems for target(default: 32)]\n");
	printf("\t[-p acceptor poller rate in us for target(default: 10000us)]\n");
	printf("\t[-r RPC listen address (default /var/tmp/spdk.sock)]\n");
	printf("\t[-s memory size in MB for DPDK (default: 0MB)]\n");
	printf("\t[-u disable PCI access]\n");
@@ -162,14 +159,6 @@ parse_args(int argc, char **argv, struct spdk_env_opts *opts)
				return -EINVAL;
			}
			break;
		case 'p':
			value = spdk_strtol(optarg, 10);
			if (value < 0) {
				fprintf(stderr, "converting a string to integer failed\n");
				return -EINVAL;
			}
			g_acceptor_poll_rate = value;
			break;
		case 'r':
			g_rpc_addr = optarg;
			break;
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,6 @@ enum spdk_nvmf_tgt_discovery_filter {
struct spdk_nvmf_target_opts {
	char		name[NVMF_TGT_NAME_MAX_LENGTH];
	uint32_t	max_subsystems;
	uint32_t	acceptor_poll_rate;
	uint16_t	crdt[3];
	enum spdk_nvmf_tgt_discovery_filter discovery_filter;
};
@@ -114,6 +113,7 @@ struct spdk_nvmf_transport_opts {
	 * New added fields should be put at the end of the struct.
	 */
	size_t opts_size;
	uint32_t acceptor_poll_rate;
};

struct spdk_nvmf_listen_opts {
+2 −5
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@
#define NVMF_DATA_BUFFER_ALIGNMENT	VALUE_4KB
#define NVMF_DATA_BUFFER_MASK		(NVMF_DATA_BUFFER_ALIGNMENT - 1LL)

#define SPDK_NVMF_DEFAULT_ACCEPT_POLL_RATE_US 10000

union nvmf_h2c_msg {
	struct spdk_nvmf_capsule_cmd			nvmf_cmd;
	struct spdk_nvme_cmd				nvme_cmd;
@@ -304,11 +306,6 @@ struct spdk_nvmf_transport_ops {
	void (*subsystem_remove_ns)(struct spdk_nvmf_transport *transport,
				    const struct spdk_nvmf_subsystem *subsystem, uint32_t nsid);

	/**
	 * Check for new connections on the transport.
	 */
	uint32_t (*accept)(struct spdk_nvmf_transport *transport);

	/**
	 * Initialize subset of identify controller data.
	 */
+18 −4
Original line number Diff line number Diff line
@@ -229,6 +229,7 @@ struct spdk_nvmf_fc_adm_hw_port_reset_ctx {

struct spdk_nvmf_fc_transport {
	struct spdk_nvmf_transport transport;
	struct spdk_poller *accept_poller;
	pthread_mutex_t lock;
};

@@ -1957,6 +1958,9 @@ nvmf_fc_opts_init(struct spdk_nvmf_transport_opts *opts)
	opts->num_shared_buffers =   SPDK_NVMF_FC_DEFAULT_NUM_SHARED_BUFFERS;
}

static int
nvmf_fc_accept(void *ctx);

static struct spdk_nvmf_transport *
nvmf_fc_create(struct spdk_nvmf_transport_opts *opts)
{
@@ -2005,6 +2009,14 @@ nvmf_fc_create(struct spdk_nvmf_transport_opts *opts)
		return NULL;
	}

	g_nvmf_ftransport->accept_poller = SPDK_POLLER_REGISTER(nvmf_fc_accept,
					   &g_nvmf_ftransport->transport, g_nvmf_ftransport->transport.opts.acceptor_poll_rate);
	if (!g_nvmf_ftransport->accept_poller) {
		free(g_nvmf_ftransport);
		g_nvmf_ftransport = NULL;
		return NULL;
	}

	/* initialize the low level FC driver */
	nvmf_fc_lld_init();

@@ -2033,6 +2045,8 @@ nvmf_fc_destroy(struct spdk_nvmf_transport *transport,
			TAILQ_REMOVE(&g_nvmf_fgroups, fgroup, link);
			free(fgroup);
		}

		spdk_poller_unregister(&g_nvmf_ftransport->accept_poller);
		g_nvmf_fgroup_count = 0;
		g_transport_destroy_done_cb = cb_fn;

@@ -2056,9 +2070,10 @@ nvmf_fc_stop_listen(struct spdk_nvmf_transport *transport,
{
}

static uint32_t
nvmf_fc_accept(struct spdk_nvmf_transport *transport)
static int
nvmf_fc_accept(void *ctx)
{
	struct spdk_nvmf_transport *transport = ctx;
	struct spdk_nvmf_fc_port *fc_port = NULL;
	uint32_t count = 0;
	static bool start_lld = false;
@@ -2075,7 +2090,7 @@ nvmf_fc_accept(struct spdk_nvmf_transport *transport)
		}
	}

	return count;
	return count > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
}

static void
@@ -2323,7 +2338,6 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = {

	.listen = nvmf_fc_listen,
	.stop_listen = nvmf_fc_stop_listen,
	.accept = nvmf_fc_accept,

	.listener_discover = nvmf_fc_discover,

+0 −32
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@
SPDK_LOG_REGISTER_COMPONENT(nvmf)

#define SPDK_NVMF_DEFAULT_MAX_SUBSYSTEMS 1024
#define SPDK_NVMF_DEFAULT_ACCEPT_POLL_RATE_US 10000

static TAILQ_HEAD(, spdk_nvmf_tgt) g_nvmf_tgts = TAILQ_HEAD_INITIALIZER(g_nvmf_tgts);

@@ -242,25 +241,10 @@ nvmf_tgt_destroy_poll_group_qpairs(struct spdk_nvmf_poll_group *group)
	_nvmf_tgt_disconnect_next_qpair(ctx);
}

static int
nvmf_tgt_accept(void *ctx)
{
	struct spdk_nvmf_tgt *tgt = ctx;
	struct spdk_nvmf_transport *transport, *tmp;
	int count = 0;

	TAILQ_FOREACH_SAFE(transport, &tgt->transports, link, tmp) {
		count += nvmf_transport_accept(transport);
	}

	return count > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
}

struct spdk_nvmf_tgt *
spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts)
{
	struct spdk_nvmf_tgt *tgt, *tmp_tgt;
	uint32_t acceptor_poll_rate;

	if (strnlen(opts->name, NVMF_TGT_NAME_MAX_LENGTH) == NVMF_TGT_NAME_MAX_LENGTH) {
		SPDK_ERRLOG("Provided target name exceeds the max length of %u.\n", NVMF_TGT_NAME_MAX_LENGTH);
@@ -287,12 +271,6 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts)
		tgt->max_subsystems = opts->max_subsystems;
	}

	if (!opts || !opts->acceptor_poll_rate) {
		acceptor_poll_rate = SPDK_NVMF_DEFAULT_ACCEPT_POLL_RATE_US;
	} else {
		acceptor_poll_rate = opts->acceptor_poll_rate;
	}

	if (!opts) {
		tgt->crdt[0] = 0;
		tgt->crdt[1] = 0;
@@ -321,14 +299,6 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts)

	pthread_mutex_init(&tgt->mutex, NULL);

	tgt->accept_poller = SPDK_POLLER_REGISTER(nvmf_tgt_accept, tgt, acceptor_poll_rate);
	if (!tgt->accept_poller) {
		pthread_mutex_destroy(&tgt->mutex);
		free(tgt->subsystems);
		free(tgt);
		return NULL;
	}

	spdk_io_device_register(tgt,
				nvmf_tgt_create_poll_group,
				nvmf_tgt_destroy_poll_group,
@@ -402,8 +372,6 @@ spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt,
	tgt->destroy_cb_fn = cb_fn;
	tgt->destroy_cb_arg = cb_arg;

	spdk_poller_unregister(&tgt->accept_poller);

	TAILQ_REMOVE(&g_nvmf_tgts, tgt, link);

	spdk_io_device_unregister(tgt, nvmf_tgt_destroy_cb);
Loading