From c95dcb657ef9ceef005a00a35883a3495b1870cf Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 20 Sep 2021 07:06:37 +0900 Subject: [PATCH] nvme_tcp: Use qpair->poll_group only if it is not NULL nvme_transport_poll_group_remove() clears qpair->poll_group. Hence we should not use it after that. Fixes #2170 Signed-off-by: Shuhei Matsumoto Change-Id: I57ceee8c66684e2d02b51b8a0f3d66aacbcb9915 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9560 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: GangCao Reviewed-by: Ziye Yang Reviewed-by: Aleksey Marchuk Reviewed-by: Dong Yi Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/nvme/nvme_tcp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index dad3b770e..856984f00 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -383,7 +383,7 @@ _pdu_write_done(void *cb_arg, int err) { struct nvme_tcp_pdu *pdu = cb_arg; struct nvme_tcp_qpair *tqpair = pdu->qpair; - struct nvme_tcp_poll_group *pgroup = nvme_tcp_poll_group(tqpair->qpair.poll_group); + struct nvme_tcp_poll_group *pgroup; /* If there are queued requests, we assume they are queued because they are waiting * for resources to be released. Those resources are almost certainly released in @@ -391,7 +391,10 @@ _pdu_write_done(void *cb_arg, int err) * the qpair needs to be polled and we can't rely on another network event to make * that happen. Add it to a list of qpairs to poll regardless of network activity * here. */ - if (pgroup && !STAILQ_EMPTY(&tqpair->qpair.queued_req) && !tqpair->needs_poll) { + if (tqpair->qpair.poll_group && !STAILQ_EMPTY(&tqpair->qpair.queued_req) && + !tqpair->needs_poll) { + pgroup = nvme_tcp_poll_group(tqpair->qpair.poll_group); + TAILQ_INSERT_TAIL(&pgroup->needs_poll, tqpair, link); tqpair->needs_poll = true; } @@ -1073,7 +1076,7 @@ tcp_data_recv_crc32_done(void *cb_arg, int status) tqpair = tcp_req->tqpair; assert(tqpair != NULL); - if (!tqpair->needs_poll) { + if (tqpair->qpair.poll_group && !tqpair->needs_poll) { pgroup = nvme_tcp_poll_group(tqpair->qpair.poll_group); TAILQ_INSERT_TAIL(&pgroup->needs_poll, tqpair, link); tqpair->needs_poll = true;