Commit e3e8fadc authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

sock: Eliminate init parameter of sock_map_insert



This can be handled in a cleaner way by having the sock group
create/close operations take an extra reference.

Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Change-Id: Id701b6dd9a19b01cd40e0d95eb870aef977eea99
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7208


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 4bcafd5b
Loading
Loading
Loading
Loading
+21 −12
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ static pthread_mutex_t g_map_table_mutex = PTHREAD_MUTEX_INITIALIZER;
 * If the group is already in the map, take a reference.
 */
static int
sock_map_insert(int placement_id, struct spdk_sock_group *group, bool init)
sock_map_insert(int placement_id, struct spdk_sock_group *group)
{
	struct spdk_sock_placement_id_entry *entry;

@@ -86,9 +86,7 @@ sock_map_insert(int placement_id, struct spdk_sock_group *group, bool init)

	entry->placement_id = placement_id;
	entry->group = group;
	if (!init) {
	entry->ref++;
	}

	STAILQ_INSERT_TAIL(&g_placement_id_map, entry, link);
	pthread_mutex_unlock(&g_map_table_mutex);
@@ -96,12 +94,7 @@ sock_map_insert(int placement_id, struct spdk_sock_group *group, bool init)
	return 0;
}

/* Release a reference to the group for a given placement_id.
 * We use lazy free method. If a placement_id with a sock is associated with the group,
 * it will possibly be associated again by another sock with the same placement_id. And
 * there will no memory leak, because if a polling group is destroyed, the
 * sock_remove_sock_group_from_map_table will be called to guarantee the mapping correctness.
 */
/* Release a reference to the group for a given placement_id */
static void
sock_map_release(int placement_id)
{
@@ -518,7 +511,7 @@ spdk_sock_group_create(void *ctx)

	/* if any net_impl is configured to use SO_INCOMING_CPU, initialize the sock map */
	if (enable_incoming_cpu) {
		sock_map_insert(spdk_env_get_current_core(), group, 1);
		sock_map_insert(spdk_env_get_current_core(), group);
	}

	return group;
@@ -577,7 +570,7 @@ spdk_sock_group_add_sock(struct spdk_sock_group *group, struct spdk_sock *sock,

	placement_id = sock_get_placement_id(sock);
	if (placement_id != -1) {
		rc = sock_map_insert(placement_id, group, 0);
		rc = sock_map_insert(placement_id, group);
		if (rc != 0) {
			SPDK_ERRLOG("Failed to insert sock group into map: %d", rc);
			/* Do not treat this as an error. The system will continue running. */
@@ -692,6 +685,9 @@ spdk_sock_group_close(struct spdk_sock_group **group)
{
	struct spdk_sock_group_impl *group_impl = NULL, *tmp;
	int rc;
	struct spdk_sock_impl_opts sock_opts = {};
	size_t sock_len;
	bool enable_incoming_cpu = false;

	if (*group == NULL) {
		errno = EBADF;
@@ -705,6 +701,19 @@ spdk_sock_group_close(struct spdk_sock_group **group)
		}
	}

	STAILQ_FOREACH_SAFE(group_impl, &(*group)->group_impls, link, tmp) {
		sock_len = sizeof(sock_opts);
		spdk_sock_impl_get_opts(group_impl->net_impl->name, &sock_opts, &sock_len);
		if (sock_opts.enable_placement_id == PLACEMENT_CPU) {
			enable_incoming_cpu = true;
			break;
		}
	}

	if (enable_incoming_cpu) {
		sock_map_release(spdk_env_get_current_core());
	}

	STAILQ_FOREACH_SAFE(group_impl, &(*group)->group_impls, link, tmp) {
		rc = group_impl->net_impl->group_impl_close(group_impl);
		if (rc != 0) {