sock: Allow null entries in sock_map

Allow the map to have entries with a valid placement_id, but no group.
This will be useful later when the order of placement_id discovery and
group assignment may be reversed.

Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Change-Id: Ia39adb3a030135940aeb9eeadf9df78056e59c0d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7209
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2021-03-30 11:16:08 -07:00 committed by Jim Harris
parent b997e957d8
commit 4ce63b9877

View File

@ -67,10 +67,19 @@ sock_map_insert(int placement_id, struct spdk_sock_group *group)
pthread_mutex_lock(&g_map_table_mutex); pthread_mutex_lock(&g_map_table_mutex);
STAILQ_FOREACH(entry, &g_placement_id_map, link) { STAILQ_FOREACH(entry, &g_placement_id_map, link) {
if (placement_id == entry->placement_id) { if (placement_id == entry->placement_id) {
if (entry->group != group) { /* Can't set group to NULL if it is already not-NULL */
if (group == NULL) {
pthread_mutex_unlock(&g_map_table_mutex);
return (entry->group == NULL) ? 0 : -EINVAL;
}
if (entry->group == NULL) {
entry->group = group;
} else if (entry->group != group) {
pthread_mutex_unlock(&g_map_table_mutex); pthread_mutex_unlock(&g_map_table_mutex);
return -EINVAL; return -EINVAL;
} }
entry->ref++; entry->ref++;
pthread_mutex_unlock(&g_map_table_mutex); pthread_mutex_unlock(&g_map_table_mutex);
return 0; return 0;
@ -85,8 +94,10 @@ sock_map_insert(int placement_id, struct spdk_sock_group *group)
} }
entry->placement_id = placement_id; entry->placement_id = placement_id;
entry->group = group; if (group) {
entry->ref++; entry->group = group;
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);
@ -105,6 +116,10 @@ sock_map_release(int placement_id)
if (placement_id == entry->placement_id) { if (placement_id == entry->placement_id) {
assert(entry->ref > 0); assert(entry->ref > 0);
entry->ref--; entry->ref--;
if (entry->ref == 0) {
entry->group = NULL;
}
break; break;
} }
} }
@ -113,10 +128,11 @@ sock_map_release(int placement_id)
} }
/* Look up the group for a placement_id. */ /* Look up the group for a placement_id. */
static void static int
sock_map_lookup(int placement_id, struct spdk_sock_group **group) sock_map_lookup(int placement_id, struct spdk_sock_group **group)
{ {
struct spdk_sock_placement_id_entry *entry; struct spdk_sock_placement_id_entry *entry;
int rc = -EINVAL;
*group = NULL; *group = NULL;
pthread_mutex_lock(&g_map_table_mutex); pthread_mutex_lock(&g_map_table_mutex);
@ -124,10 +140,13 @@ sock_map_lookup(int placement_id, struct spdk_sock_group **group)
if (placement_id == entry->placement_id) { if (placement_id == entry->placement_id) {
assert(entry->group != NULL); assert(entry->group != NULL);
*group = entry->group; *group = entry->group;
rc = 0;
break; break;
} }
} }
pthread_mutex_unlock(&g_map_table_mutex); pthread_mutex_unlock(&g_map_table_mutex);
return rc;
} }
/* Remove the socket group from the map table */ /* Remove the socket group from the map table */