From: Sasha Kotchubievsky <sashakot at dev.mellanox.co.il>
To: spdk@lists.01.org
Subject: Re: [SPDK] Some thoughts for the code in rdma.c
Date: Mon, 24 Dec 2018 07:51:32 +0200 [thread overview]
Message-ID: <aa0deb31-1af6-ce9e-5c20-4ece1cb23677@dev.mellanox.co.il> (raw)
In-Reply-To: FA6C2217B01E9D48A581BB48660210143E0A44BB@shsmsx102.ccr.corp.intel.com
[-- Attachment #1: Type: text/plain, Size: 9205 bytes --]
Hi Ziyn,
Yes, that's correct. "Control" events and "IO" should be handled by
different threads. But, QP destruction can be triggered also by
completions with errors. Today, QPs in the same polling group use the
shared CQ. We submitted alreay a patch that adds shared receive QP.
Shared resources need some cleanup in data path.
Some details you can find at :
https://github.com/spdk/spdk/commit/90b4bd6cf9bb5805c0c6d8df982ac5f2e3d90cce
Best regards
Sasha
On 12/24/2018 4:01 AM, Yang, Ziye wrote:
> Hi Sasha,
>
> Moreover, the following two functions:
>
> spdk_nvmf_process_cm_event
> spdk_nvmf_process_ib_event
>
> are executed by one CPU core inside (spdk_nvmf_rdma_accept) function. So at least in my mind, those cm_event and ib_event is handled by one thread, and the I/Os can be executed in other thread due to the core allocation strategy in new_qpair function. So if all the qpair destruction is finally routed into a same thread, do we still need the lock?
>
> Thanks.
>
>
>
>
>
> Best Regards
> Ziye Yang
>
>
> -----Original Message-----
> From: Yang, Ziye
> Sent: Monday, December 24, 2018 9:28 AM
> To: spdk(a)lists.01.org
> Subject: RE: [SPDK] Some thoughts for the code in rdma.c
>
> Hi Sasha,
>
> You mentioned that"
>
> " NVME-OF initiator closes QP in the middle of RDMA_READ/RDMA_WRITE from target side and only then generate disconnect event in librdmacm. Target gets 2 events: completion with error code and disconnect event (doesn't matter in which order)".
>
> So my question is that: Could we ignore one of this event? (I mean do nothing for one event.) Since if there is qpair error, we will finally destroy the qpair.
>
> Thanks.
>
>
>
> Best Regards
> Ziye Yang
>
> -----Original Message-----
> From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sasha Kotchubievsky
> Sent: Sunday, December 23, 2018 10:09 PM
> To: spdk(a)lists.01.org
> Subject: Re: [SPDK] Some thoughts for the code in rdma.c
>
> Hi Ziye,
>
> Which problem do you solve: performance, stability or remove code complexity? Can you elaborate?
>
> If you ask me, the refcout, removed by your patch, is needed because qp can be disconnected in response for different events served in different threads. I believe, some synchronization is required.
>
> For example, NVME-OF initiator closes QP in the middle of RDMA_READ/RDMA_WRITE from target side and only then generate disconnect event in librdmacm. Target gets 2 events: completion with error code and disconnect event (doesn't matter in which order). In that case, qp disconnect in target can be triggered by two events coming from different sources and possible handled in different threads.
>
> Best regards
>
> Sasha
>
> On 12/21/2018 3:35 AM, Yang, Ziye wrote:
>> Hi Ben,
>>
>> According to my knowledge, I think that the inc/dec_refcnt is still not needed. I know that the qpair management related with the group (there is a thread which manages the rdma_cm event and another is for polling). The reason that caused this issue is that: we use the spdk_send_msg to add the qpair to the group during the connection, but we return the connection ready to the host side early. So there is a window, that the host sends the disconnect, and there will be no group binding to the qpair. My idea is that we do this checks in spdk_nvmf_qpair_disconnect. If the qpair is not adding to the group, there will be two reasons:
>>
>> 1 In the group adding operation, there is an issue, so the qpair is freed. So we do not need to handle the disconnect and free the qpair again.
>> 2 The qpair is still not added to the group.
>>
>> So I suggest if the qpair is not added in the case 2, we should deny
>> the disconnect operation or delay such operation. (This is related
>> with exceptional case, I think this handling is still reasonable. For
>> normal operation, it will not do the connect, and disconnect with
>> nothing operation. So deny the disconnect request this time is OK, and
>> the initiator can do the disconnect later, and we can make sure the
>> disconnect will only be accepted that the qpair is binding to the
>> group. And I do not think that this strategy to handle the exceptional
>> case will have any side effect.)
>>
>> BTW, only checking the qpair->group is not sufficient, but we can have other state of the qpair (which is already defined in struct spdk_nvmf_qpair_state).
>>
>> I would like to still post some patches to remove the inc/def_refcnt (may be as test), and let those patches tested by our validation team to see whether this really can solve this issue.
>>
>>
>>
>>
>> Best Regards
>> Ziye Yang
>>
>> -----Original Message-----
>> From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Walker,
>> Benjamin
>> Sent: Friday, December 21, 2018 1:16 AM
>> To: spdk(a)lists.01.org
>> Subject: Re: [SPDK] Some thoughts for the code in rdma.c
>>
>> 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
>> _______________________________________________
>> SPDK mailing list
>> SPDK(a)lists.01.org
>> https://lists.01.org/mailman/listinfo/spdk
>> _______________________________________________
>> SPDK mailing list
>> SPDK(a)lists.01.org
>> https://lists.01.org/mailman/listinfo/spdk
> _______________________________________________
> SPDK mailing list
> SPDK(a)lists.01.org
> https://lists.01.org/mailman/listinfo/spdk
> _______________________________________________
> SPDK mailing list
> SPDK(a)lists.01.org
> https://lists.01.org/mailman/listinfo/spdk
next reply other threads:[~2018-12-24 5:51 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-24 5:51 Sasha Kotchubievsky [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: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 17:15 Walker, Benjamin
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=aa0deb31-1af6-ce9e-5c20-4ece1cb23677@dev.mellanox.co.il \
--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