sock/posix: Fix the coredump when removing the sock from socks_has_data list

When entering the if case to order the list, there is bug should be
fixed. The original code does not address this.

The way this happens is when there is a connection left in the socks_with_data list
between polls and there are enough new events detected that it would exceed the
maximal number of events. A connection is left on this list between polls if it isn't
fully drained via reads by the upper layer on each poll loop.

Currently, the maximal socket event num is 32. Then we did not hit this issue
in our normal test cases. But when you use NVMe-oF tcp target to test which is
described in #2105, there are more than 32 active sockets, and it exceeeds
the maximal num of events of polling (32), so we will trigger this issue.

Fixes issue #2015

Change-Id: I9384476fdba8826f5fe55a5d2594e3f4ed3832ba
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8541
Community-CI: Mellanox Build Bot
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Ziye Yang 2021-06-30 19:52:49 +08:00 committed by Jim Harris
parent 358b84b40f
commit 05dc895bea

View File

@ -1499,7 +1499,6 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events,
/* Break the link between C and D */
pc->link.tqe_next = NULL;
pd->link.tqe_prev = NULL;
/* Connect F to A */
pf->link.tqe_next = pa;
@ -1508,6 +1507,9 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events,
/* Fix up the list first/last pointers */
group->socks_with_data.tqh_first = pd;
group->socks_with_data.tqh_last = &pc->link.tqe_next;
/* D is in front of the list, make tqe prev pointer point to the head of list */
pd->link.tqe_prev = &group->socks_with_data.tqh_first;
}
return num_events;