From: Haggai Eran <haggaie@mellanox.com> To: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Cc: Doug Ledford <dledford@redhat.com>, linux-rdma@vger.kernel.org, netdev@vger.kernel.org, Liran Liss <liranl@mellanox.com>, Guy Shapiro <guysh@mellanox.com>, Shachar Raindel <raindel@mellanox.com>, Yotam Kenneth <yotamke@mellanox.com> Subject: Re: [PATCH v3 for-next 05/13] IB/cm: Reference count ib_cm_ids Date: Tue, 12 May 2015 09:50:51 +0300 [thread overview] Message-ID: <5551A2CB.1010407@mellanox.com> (raw) In-Reply-To: <20150511183459.GB25405@obsidianresearch.com> On 11/05/2015 21:34, Jason Gunthorpe wrote: > On Sun, May 10, 2015 at 01:26:36PM +0300, Haggai Eran wrote: >> Add reference count (kref) to the ib_cm_id to allow automatic destruction >> of an ib_cm_id. This will allow multiple RDMA CM IDs to use a single >> ib_cm_id when they are on different network namespaces. >> >> Signed-off-by: Haggai Eran <haggaie@mellanox.com> >> drivers/infiniband/core/cm.c | 41 +++++++++++++++++++++++++++++++++++++---- >> include/rdma/ib_cm.h | 10 +++++++--- >> 2 files changed, 44 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c >> index 08b18044552a..6b68402fd6df 100644 >> +++ b/drivers/infiniband/core/cm.c >> @@ -711,6 +711,7 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device, >> cm_id_priv->id.cm_handler = cm_handler; >> cm_id_priv->id.context = context; >> cm_id_priv->id.remote_cm_qpn = 1; >> + kref_init(&cm_id_priv->id.ref); >> ret = cm_alloc_id(cm_id_priv); >> if (ret) >> goto error; > > Idiomatically, once kref_init is called, kfree should not be used, you > have to kref_put to destroy it, this error path calls kfree directly. > > Probably best to just move the kref_init to after the failable call. Sure. > >> -void ib_destroy_cm_id(struct ib_cm_id *cm_id) >> +static void __ib_destroy_cm_id(struct kref *ref) >> { >> + struct ib_cm_id *cm_id = container_of(ref, struct ib_cm_id, ref); >> + >> cm_destroy_id(cm_id, 0); >> } > > Hum, this is quite a heavy free function. Did you check that this is > safe to do asynchronously, that there are no implicit kref's being > held by the caller? I'm not sure what you mean. The function is called by the last kref_put, and destroys the ID synchronously. Looking at the code though, I now notice that the other call site to cm_destroy_id, from within the error path of cm_process_work could now theoretically destroy an ID with existing references. Is that what you meant? Since only listening CM IDs are now shared in RDMA CM, this should not happen in this patch-set, but perhaps the code can be changed to make sure it is safe even if that changes. How about if we decrease the reference count in cm_process_work instead of calling cm_destroy_id directly? The error code could be stored in the ID. Alternatively, I can add a WARN macro similar to the one I added in ib_destroy_cm_id, to verify the reference count is zero when reaching cm_destroy_id. Haggai
WARNING: multiple messages have this Message-ID (diff)
From: Haggai Eran <haggaie@mellanox.com> To: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Cc: Doug Ledford <dledford@redhat.com>, <linux-rdma@vger.kernel.org>, <netdev@vger.kernel.org>, Liran Liss <liranl@mellanox.com>, Guy Shapiro <guysh@mellanox.com>, Shachar Raindel <raindel@mellanox.com>, Yotam Kenneth <yotamke@mellanox.com> Subject: Re: [PATCH v3 for-next 05/13] IB/cm: Reference count ib_cm_ids Date: Tue, 12 May 2015 09:50:51 +0300 [thread overview] Message-ID: <5551A2CB.1010407@mellanox.com> (raw) In-Reply-To: <20150511183459.GB25405@obsidianresearch.com> On 11/05/2015 21:34, Jason Gunthorpe wrote: > On Sun, May 10, 2015 at 01:26:36PM +0300, Haggai Eran wrote: >> Add reference count (kref) to the ib_cm_id to allow automatic destruction >> of an ib_cm_id. This will allow multiple RDMA CM IDs to use a single >> ib_cm_id when they are on different network namespaces. >> >> Signed-off-by: Haggai Eran <haggaie@mellanox.com> >> drivers/infiniband/core/cm.c | 41 +++++++++++++++++++++++++++++++++++++---- >> include/rdma/ib_cm.h | 10 +++++++--- >> 2 files changed, 44 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c >> index 08b18044552a..6b68402fd6df 100644 >> +++ b/drivers/infiniband/core/cm.c >> @@ -711,6 +711,7 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device, >> cm_id_priv->id.cm_handler = cm_handler; >> cm_id_priv->id.context = context; >> cm_id_priv->id.remote_cm_qpn = 1; >> + kref_init(&cm_id_priv->id.ref); >> ret = cm_alloc_id(cm_id_priv); >> if (ret) >> goto error; > > Idiomatically, once kref_init is called, kfree should not be used, you > have to kref_put to destroy it, this error path calls kfree directly. > > Probably best to just move the kref_init to after the failable call. Sure. > >> -void ib_destroy_cm_id(struct ib_cm_id *cm_id) >> +static void __ib_destroy_cm_id(struct kref *ref) >> { >> + struct ib_cm_id *cm_id = container_of(ref, struct ib_cm_id, ref); >> + >> cm_destroy_id(cm_id, 0); >> } > > Hum, this is quite a heavy free function. Did you check that this is > safe to do asynchronously, that there are no implicit kref's being > held by the caller? I'm not sure what you mean. The function is called by the last kref_put, and destroys the ID synchronously. Looking at the code though, I now notice that the other call site to cm_destroy_id, from within the error path of cm_process_work could now theoretically destroy an ID with existing references. Is that what you meant? Since only listening CM IDs are now shared in RDMA CM, this should not happen in this patch-set, but perhaps the code can be changed to make sure it is safe even if that changes. How about if we decrease the reference count in cm_process_work instead of calling cm_destroy_id directly? The error code could be stored in the ID. Alternatively, I can add a WARN macro similar to the one I added in ib_destroy_cm_id, to verify the reference count is zero when reaching cm_destroy_id. Haggai
next prev parent reply other threads:[~2015-05-12 6:50 UTC|newest] Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-05-10 10:26 [PATCH v3 for-next 00/13] Add network namespace support in the RDMA-CM Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 01/13] IB/core: Use SRCU when reading client_list or device_list Haggai Eran 2015-05-11 18:18 ` Jason Gunthorpe 2015-05-12 6:07 ` Haggai Eran 2015-05-12 6:07 ` Haggai Eran 2015-05-12 18:23 ` Jason Gunthorpe 2015-05-13 8:10 ` Haggai Eran 2015-05-13 8:10 ` Haggai Eran [not found] ` <555306E7.9020000-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-13 15:57 ` Jason Gunthorpe 2015-05-14 10:35 ` Haggai Eran 2015-05-14 10:35 ` Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 02/13] IB/addr: Pass network namespace as a parameter Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 05/13] IB/cm: Reference count ib_cm_ids Haggai Eran [not found] ` <1431253604-9214-6-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-11 18:34 ` Jason Gunthorpe 2015-05-12 6:50 ` Haggai Eran [this message] 2015-05-12 6:50 ` Haggai Eran [not found] ` <5551A2CB.1010407-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-12 18:54 ` Jason Gunthorpe [not found] ` <20150512185447.GA3503-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> 2015-05-13 10:20 ` Haggai Eran 2015-05-13 10:20 ` Haggai Eran 2015-05-13 16:58 ` Jason Gunthorpe [not found] ` <20150513165823.GA20343-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> 2015-05-14 6:48 ` Haggai Eran 2015-05-14 6:48 ` Haggai Eran 2015-05-15 19:11 ` Hefty, Sean [not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FDC0C3-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2015-05-17 6:27 ` Haggai Eran 2015-05-19 19:23 ` Jason Gunthorpe [not found] ` <20150519192353.GA23612-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> 2015-05-19 22:52 ` Hefty, Sean [not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FDD412-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2015-05-19 23:46 ` Jason Gunthorpe [not found] ` <20150519234654.GA26634-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> 2015-05-20 0:49 ` Hefty, Sean 2015-05-21 6:51 ` Haggai Eran [not found] ` <555D806B.1090002-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-21 12:56 ` Hefty, Sean [not found] ` <1431253604-9214-1-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-10 10:26 ` [PATCH v3 for-next 03/13] IB/core: Find the network namespace matching connection parameters Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 04/13] IB/ipoib: Return IPoIB devices " Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 06/13] IB/cm: API to retrieve existing listening CM IDs Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 07/13] IB/cm: Expose service ID in request events Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 08/13] IB/cma: Refactor RDMA IP CM private-data parsing code Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 09/13] IB/cma: Add compare_data checks to the RDMA CM module Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 10/13] IB/cma: Separate port allocation to network namespaces Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 11/13] IB/cma: Share CM IDs between namespaces Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 12/13] IB/cma: Add support for network namespaces Haggai Eran 2015-05-10 10:26 ` [PATCH v3 for-next 13/13] IB/ucma: Take the network namespace from the process Haggai Eran 2015-05-12 17:52 ` [PATCH v3 for-next 00/13] Add network namespace support in the RDMA-CM Hefty, Sean [not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FD7B85-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2015-05-13 8:50 ` Haggai Eran [not found] ` <55531073.1000305-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-05-13 16:45 ` Hefty, Sean [not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FDA13B-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2015-05-13 17:18 ` Jason Gunthorpe [not found] ` <20150513171823.GB20343-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> 2015-05-13 17:30 ` Hefty, Sean [not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FDA1AB-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2015-05-14 5:35 ` Haggai Eran
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=5551A2CB.1010407@mellanox.com \ --to=haggaie@mellanox.com \ --cc=dledford@redhat.com \ --cc=guysh@mellanox.com \ --cc=jgunthorpe@obsidianresearch.com \ --cc=linux-rdma@vger.kernel.org \ --cc=liranl@mellanox.com \ --cc=netdev@vger.kernel.org \ --cc=raindel@mellanox.com \ --cc=yotamke@mellanox.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.