Commit 645d5944 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Ben Walker
Browse files

rdma: Store poll groups in RDMA transport.



Operations with poll groups list must be protected by rtransport->lock.
Make rtranposrt->lock recursive to avoid unnecessary mutex operations when
the poll group is being destroyed within spdk_nvmf_rdma_poll_group_create

Change-Id: If0856429c10ad3bfcc9942da613796cc86d68d8d
Signed-off-by: default avatarAlexey Marchuk <alexeymar@mellanox.com>
Signed-off-by: default avatarSasha Kotchubievsky <sashakot@mellanox.com>
Signed-off-by: default avatarEvgenii Kochetov <evgeniik@mellanox.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468992


Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 44cf09c3
Loading
Loading
Loading
Loading
+53 −8
Original line number Diff line number Diff line
@@ -456,13 +456,9 @@ struct spdk_nvmf_rdma_poll_group_stat {

struct spdk_nvmf_rdma_poll_group {
	struct spdk_nvmf_transport_poll_group		group;

	/* Requests that are waiting to obtain a data buffer */

	TAILQ_HEAD(, spdk_nvmf_rdma_poller)		pollers;

	struct spdk_nvmf_rdma_poll_group_stat		stat;

	TAILQ_HEAD(, spdk_nvmf_rdma_poller)		pollers;
	TAILQ_ENTRY(spdk_nvmf_rdma_poll_group)		link;
	/*
	 * buffers which are split across multiple RDMA
	 * memory regions cannot be used by this transport.
@@ -470,6 +466,11 @@ struct spdk_nvmf_rdma_poll_group {
	STAILQ_HEAD(, spdk_nvmf_transport_pg_cache_buf)	retired_bufs;
};

struct spdk_nvmf_rdma_conn_sched {
	struct spdk_nvmf_rdma_poll_group *next_admin_pg;
	struct spdk_nvmf_rdma_poll_group *next_io_pg;
};

/* Assuming rdma_cm uses just one protection domain per ibv_context. */
struct spdk_nvmf_rdma_device {
	struct ibv_device_attr			attr;
@@ -494,6 +495,8 @@ struct spdk_nvmf_rdma_port {
struct spdk_nvmf_rdma_transport {
	struct spdk_nvmf_transport	transport;

	struct spdk_nvmf_rdma_conn_sched conn_sched;

	struct rdma_event_channel	*event_channel;

	struct spdk_mempool		*data_wr_pool;
@@ -506,6 +509,7 @@ struct spdk_nvmf_rdma_transport {

	TAILQ_HEAD(, spdk_nvmf_rdma_device)	devices;
	TAILQ_HEAD(, spdk_nvmf_rdma_port)	ports;
	TAILQ_HEAD(, spdk_nvmf_rdma_poll_group)	poll_groups;
};

static inline void
@@ -2308,20 +2312,38 @@ spdk_nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
	uint32_t			sge_count;
	uint32_t			min_shared_buffers;
	int				max_device_sge = SPDK_NVMF_MAX_SGL_ENTRIES;
	pthread_mutexattr_t		attr;

	rtransport = calloc(1, sizeof(*rtransport));
	if (!rtransport) {
		return NULL;
	}

	if (pthread_mutex_init(&rtransport->lock, NULL)) {
	if (pthread_mutexattr_init(&attr)) {
		SPDK_ERRLOG("pthread_mutexattr_init() failed\n");
		free(rtransport);
		return NULL;
	}

	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) {
		SPDK_ERRLOG("pthread_mutexattr_settype() failed\n");
		pthread_mutexattr_destroy(&attr);
		free(rtransport);
		return NULL;
	}

	if (pthread_mutex_init(&rtransport->lock, &attr)) {
		SPDK_ERRLOG("pthread_mutex_init() failed\n");
		pthread_mutexattr_destroy(&attr);
		free(rtransport);
		return NULL;
	}

	pthread_mutexattr_destroy(&attr);

	TAILQ_INIT(&rtransport->devices);
	TAILQ_INIT(&rtransport->ports);
	TAILQ_INIT(&rtransport->poll_groups);

	rtransport->transport.ops = &spdk_nvmf_transport_rdma;

@@ -2567,6 +2589,7 @@ spdk_nvmf_rdma_destroy(struct spdk_nvmf_transport *transport)
	}

	spdk_mempool_free(rtransport->data_wr_pool);

	pthread_mutex_destroy(&rtransport->lock);
	free(rtransport);

@@ -3237,6 +3260,12 @@ spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport)
		poller->num_cqe = num_cqe;
	}

	TAILQ_INSERT_TAIL(&rtransport->poll_groups, rgroup, link);
	if (rtransport->conn_sched.next_admin_pg == NULL) {
		rtransport->conn_sched.next_admin_pg = rgroup;
		rtransport->conn_sched.next_io_pg = rgroup;
	}

	pthread_mutex_unlock(&rtransport->lock);
	return &rgroup->group;
}
@@ -3244,12 +3273,14 @@ spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport)
static void
spdk_nvmf_rdma_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group)
{
	struct spdk_nvmf_rdma_poll_group	*rgroup;
	struct spdk_nvmf_rdma_poll_group	*rgroup, *next_rgroup;
	struct spdk_nvmf_rdma_poller		*poller, *tmp;
	struct spdk_nvmf_rdma_qpair		*qpair, *tmp_qpair;
	struct spdk_nvmf_transport_pg_cache_buf	*buf, *tmp_buf;
	struct spdk_nvmf_rdma_transport		*rtransport;

	rgroup = SPDK_CONTAINEROF(group, struct spdk_nvmf_rdma_poll_group, group);
	rtransport = SPDK_CONTAINEROF(rgroup->group.transport, struct spdk_nvmf_rdma_transport, transport);

	if (!rgroup) {
		return;
@@ -3282,6 +3313,20 @@ spdk_nvmf_rdma_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group)
		free(poller);
	}

	pthread_mutex_lock(&rtransport->lock);
	next_rgroup = TAILQ_NEXT(rgroup, link);
	TAILQ_REMOVE(&rtransport->poll_groups, rgroup, link);
	if (next_rgroup == NULL) {
		next_rgroup = TAILQ_FIRST(&rtransport->poll_groups);
	}
	if (rtransport->conn_sched.next_admin_pg == rgroup) {
		rtransport->conn_sched.next_admin_pg = next_rgroup;
	}
	if (rtransport->conn_sched.next_io_pg == rgroup) {
		rtransport->conn_sched.next_io_pg = next_rgroup;
	}
	pthread_mutex_unlock(&rtransport->lock);

	free(rgroup);
}