From: Walker, Benjamin <benjamin.walker at intel.com>
To: spdk@lists.01.org
Subject: Re: [SPDK] Some thoughts for the code in rdma.c
Date: Thu, 20 Dec 2018 17:15:57 +0000 [thread overview]
Message-ID: <7e50eaacb6fdd055c5f5ee0d1f13ce92bdc635ed.camel@intel.com> (raw)
In-Reply-To: FA6C2217B01E9D48A581BB48660210143E0A3963@shsmsx102.ccr.corp.intel.com
[-- Attachment #1: Type: text/plain, Size: 3574 bytes --]
On Thu, 2018-12-20 at 02:59 +0000, Yang, Ziye wrote:
> Hi all,
>
> I would like to discuss the following functions in /lib/nvmf/rdma.c
>
> 1 I do not think that the _nvmf_rdma_disconnect_retry function is necessary.
> This function is used in nvmf_rdma_disconnect. And there is a description as
> follows:
>
> /* Read the group out of the qpair. This is normally set and
> accessed only from
> * the thread that created the group. Here, we're not on that
> thread necessarily.
> * The data member qpair->group begins it's life as NULL and
> then is assigned to
> * a pointer and never changes. So fortunately reading this and
> checking for
> * non-NULL is thread safe in the x86_64 memory model. */
>
> But for group adding for the qpair, it is related with this
> function: spdk_nvmf_poll_group_add, if the group is not ready, we can just
> call spdk_nvmf_qpair_disconnect in that function. And the
> spdk_nvmf_qpair_disconnect should have the strategy to prevent the second time
> entering if the qpair is not destroyed due to async behavior.
There are two threads involved here typically - a management thread that is
polling the RDMA CM Event channel and for IBV async events (which are
independent things), and the poll group thread that owns the qpair.
The RDMA CM Event channel notifies the target of two relevant events for a qpair
- connect and disconnect. The IBV async event mechanism independently notifies
the target of IBV_EVENT_QP_FATAL conditions. The target's response to both an
RDMA_CM_EVENT_DISCONNECT and to an IBV_EVENT_QP_FATAL is to disconnect the queue
pair, but there are scenarios where we could legitimately get both events for
the same qpair. The processing of both of these events involves passing a
message to the poll group thread, which is an asynchronous process and may take
an arbitrarily long time. The refcnt coordinates between those two events, such
that the first event does not destroy the qpair while there is another event in-
flight still.
The qpair itself, after the initial set up phase, is also managed by the poll
group thread. If the user destroys a poll group, or manipulates the poll group
to add or remove a different qpair, or the qpair gets a completion entry that it
begins processing, then the qpair data structure is being modified by the poll
group thread. You can't disconnect it on the management thread while this is
happening or you risk corrupting some of the data structures - in particular the
poll group's qpair list.
Checking that the qpair hasn't been assigned to a poll group yet (by looking for
qpair.group set to NULL) isn't a sufficient protection because a message to add
the qpair to the poll group may already be in-flight. I made some suggestions to
use the refcnt to deal with this scenario on your most recent patch:
https://review.gerrithub.io/#/c/spdk/spdk/+/437232/
>
> 2 If that, the following two functions in rdma.c are also unnecessary:
>
> spdk_nvmf_rdma_qpair_inc_refcnt
> spdk_nvmf_rdma_qpair_dec_refcnt
>
>
> Generally, my idea is that, we should use spdk_nvmf_qpair_disconnect directly
> in every transport, and do not use two many async messaging for doing this
> because I do not think those are necessary.
>
> Thanks.
>
>
>
>
> Best Regards
> Ziye Yang
>
> _______________________________________________
> SPDK mailing list
> SPDK(a)lists.01.org
> https://lists.01.org/mailman/listinfo/spdk
next reply other threads:[~2018-12-20 17:15 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-20 17:15 Walker, Benjamin [this message]
-- strict thread matches above, loose matches on Subject: below --
2019-01-08 1:45 [SPDK] Some thoughts for the code in rdma.c Yang, Ziye
2019-01-07 14:18 Walker, Benjamin
2018-12-24 6:19 Yang, Ziye
2018-12-24 6:13 Sasha Kotchubievsky
2018-12-24 5:51 Sasha Kotchubievsky
2018-12-24 5:49 Yang, Ziye
2018-12-24 5:40 Sasha Kotchubievsky
2018-12-24 2:01 Yang, Ziye
2018-12-24 1:27 Yang, Ziye
2018-12-23 14:09 Sasha Kotchubievsky
2018-12-21 1:35 Yang, Ziye
2018-12-20 2:59 Yang, Ziye
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7e50eaacb6fdd055c5f5ee0d1f13ce92bdc635ed.camel@intel.com \
--to=spdk@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox