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: Ben Walker <benjamin.walker@intel.com> Change-Id: Id701b6dd9a19b01cd40e0d95eb870aef977eea99 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7208 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
4bcafd5b15
commit
e3e8fadca4
@ -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.
|
* If the group is already in the map, take a reference.
|
||||||
*/
|
*/
|
||||||
static int
|
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;
|
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->placement_id = placement_id;
|
||||||
entry->group = group;
|
entry->group = group;
|
||||||
if (!init) {
|
entry->ref++;
|
||||||
entry->ref++;
|
|
||||||
}
|
|
||||||
|
|
||||||
STAILQ_INSERT_TAIL(&g_placement_id_map, entry, link);
|
STAILQ_INSERT_TAIL(&g_placement_id_map, entry, link);
|
||||||
pthread_mutex_unlock(&g_map_table_mutex);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release a reference to the group for a given placement_id.
|
/* 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.
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
sock_map_release(int placement_id)
|
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 any net_impl is configured to use SO_INCOMING_CPU, initialize the sock map */
|
||||||
if (enable_incoming_cpu) {
|
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;
|
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);
|
placement_id = sock_get_placement_id(sock);
|
||||||
if (placement_id != -1) {
|
if (placement_id != -1) {
|
||||||
rc = sock_map_insert(placement_id, group, 0);
|
rc = sock_map_insert(placement_id, group);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
SPDK_ERRLOG("Failed to insert sock group into map: %d", rc);
|
SPDK_ERRLOG("Failed to insert sock group into map: %d", rc);
|
||||||
/* Do not treat this as an error. The system will continue running. */
|
/* 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;
|
struct spdk_sock_group_impl *group_impl = NULL, *tmp;
|
||||||
int rc;
|
int rc;
|
||||||
|
struct spdk_sock_impl_opts sock_opts = {};
|
||||||
|
size_t sock_len;
|
||||||
|
bool enable_incoming_cpu = false;
|
||||||
|
|
||||||
if (*group == NULL) {
|
if (*group == NULL) {
|
||||||
errno = EBADF;
|
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) {
|
STAILQ_FOREACH_SAFE(group_impl, &(*group)->group_impls, link, tmp) {
|
||||||
rc = group_impl->net_impl->group_impl_close(group_impl);
|
rc = group_impl->net_impl->group_impl_close(group_impl);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user