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 02/11] IB/ipoib: Return IPoIB devices matching connection parameters
Date: Tue, 16 Jun 2015 09:36:35 +0300 [thread overview]
Message-ID: <557FC3F3.8030902@mellanox.com> (raw)
In-Reply-To: <20150615172210.GB14982@obsidianresearch.com>
On 15/06/2015 20:22, Jason Gunthorpe wrote:
> On Mon, Jun 15, 2015 at 11:47:07AM +0300, Haggai Eran wrote:
>
>> +/* Called with an RCU read lock taken */
>
> Add _rcu to the name? That is the standard convention.
Sure, I'll change that.
>
>> +/* returns an IPoIB netdev on top a given ipoib device matching a pkey_index
>> + * and address, if one exists. */
>> +static struct net_device *ipoib_match_gid_pkey_addr(struct ipoib_dev_priv *priv,
>> + const union ib_gid *gid,
>> + u16 pkey_index,
>> + const struct sockaddr *addr)
>> +{
>> + struct ipoib_dev_priv *child_priv;
>> + struct net_device *net_dev = NULL;
>> +
>> + if (priv->pkey_index == pkey_index &&
>> + (!gid || !memcmp(gid, &priv->local_gid, sizeof(*gid)))) {
>> + net_dev = ipoib_get_net_dev_match_addr(addr, priv->dev);
>> + if (net_dev)
>> + return net_dev;
>
> As I said already, this should not even look at the sockaddr unless
> there are multiple possible hits on the other parameters,
What is the goal here? The only difference omitting the IP check will
make is when sending a request to a matching GID but with the wrong IP.
Is it important that we pass these requests here so that they will be
dropped at the rdma_cm module?
Also, note that ipoib_get_net_dev_match_addr can return a different
net_dev from the one ipoib created. When using bonding, it will find the
IP address on the bonding device, and return the bonding net_dev instead.
> and there
> should be a comment explaining the sockaddr is only a hack to make up
> for having an incomplete LLADDR.
Sure, I'll add a comment.
>
> That way people not using same guid children do not get incorrect
> functionality..
>
>> +static struct net_device *ipoib_get_net_dev_by_params(
>> + struct ib_device *dev, u8 port, u16 pkey,
>> + const union ib_gid *gid, const struct sockaddr *addr)
>
> [..]
>
>> + ret = ib_find_cached_pkey(dev, port, pkey, &pkey_index);
>> + if (ret)
>> + return NULL;
>> +
>> + if (!rdma_protocol_ib(dev, port))
>> + return NULL;
>
> This if should be first I'd think.
Okay.
>
>
>> + dev_list = ib_get_client_data(dev, &ipoib_client);
>> + if (!dev_list)
>> + return NULL;
>
> Is the locking OK here? This access protected by lists_rwsem -
> but for instance ib_unregister_device holds only the device_mutex when
> calling client->remove, which kfree's dev_list. Looks wrong to me.
I think you're right. Perhaps we can switch the client data to NULL in
ib_unregister_device under the lists_rwsem. Then the
ipoib_get_net_dev_by_params call will know to skip it. The remove()
callback will need to be augmented with the client data as a parameter,
because it won't be able to retrieve it using ib_get_client_data anymore.
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 02/11] IB/ipoib: Return IPoIB devices matching connection parameters
Date: Tue, 16 Jun 2015 09:36:35 +0300 [thread overview]
Message-ID: <557FC3F3.8030902@mellanox.com> (raw)
In-Reply-To: <20150615172210.GB14982@obsidianresearch.com>
On 15/06/2015 20:22, Jason Gunthorpe wrote:
> On Mon, Jun 15, 2015 at 11:47:07AM +0300, Haggai Eran wrote:
>
>> +/* Called with an RCU read lock taken */
>
> Add _rcu to the name? That is the standard convention.
Sure, I'll change that.
>
>> +/* returns an IPoIB netdev on top a given ipoib device matching a pkey_index
>> + * and address, if one exists. */
>> +static struct net_device *ipoib_match_gid_pkey_addr(struct ipoib_dev_priv *priv,
>> + const union ib_gid *gid,
>> + u16 pkey_index,
>> + const struct sockaddr *addr)
>> +{
>> + struct ipoib_dev_priv *child_priv;
>> + struct net_device *net_dev = NULL;
>> +
>> + if (priv->pkey_index == pkey_index &&
>> + (!gid || !memcmp(gid, &priv->local_gid, sizeof(*gid)))) {
>> + net_dev = ipoib_get_net_dev_match_addr(addr, priv->dev);
>> + if (net_dev)
>> + return net_dev;
>
> As I said already, this should not even look at the sockaddr unless
> there are multiple possible hits on the other parameters,
What is the goal here? The only difference omitting the IP check will
make is when sending a request to a matching GID but with the wrong IP.
Is it important that we pass these requests here so that they will be
dropped at the rdma_cm module?
Also, note that ipoib_get_net_dev_match_addr can return a different
net_dev from the one ipoib created. When using bonding, it will find the
IP address on the bonding device, and return the bonding net_dev instead.
> and there
> should be a comment explaining the sockaddr is only a hack to make up
> for having an incomplete LLADDR.
Sure, I'll add a comment.
>
> That way people not using same guid children do not get incorrect
> functionality..
>
>> +static struct net_device *ipoib_get_net_dev_by_params(
>> + struct ib_device *dev, u8 port, u16 pkey,
>> + const union ib_gid *gid, const struct sockaddr *addr)
>
> [..]
>
>> + ret = ib_find_cached_pkey(dev, port, pkey, &pkey_index);
>> + if (ret)
>> + return NULL;
>> +
>> + if (!rdma_protocol_ib(dev, port))
>> + return NULL;
>
> This if should be first I'd think.
Okay.
>
>
>> + dev_list = ib_get_client_data(dev, &ipoib_client);
>> + if (!dev_list)
>> + return NULL;
>
> Is the locking OK here? This access protected by lists_rwsem -
> but for instance ib_unregister_device holds only the device_mutex when
> calling client->remove, which kfree's dev_list. Looks wrong to me.
I think you're right. Perhaps we can switch the client data to NULL in
ib_unregister_device under the lists_rwsem. Then the
ipoib_get_net_dev_by_params call will know to skip it. The remove()
callback will need to be augmented with the client data as a parameter,
because it won't be able to retrieve it using ib_get_client_data anymore.
Haggai
next prev parent reply other threads:[~2015-06-16 6:36 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-15 8:47 [PATCH 00/11] Demux IB CM requests in the rdma_cm module Haggai Eran
[not found] ` <1434358036-15526-1-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 8:47 ` [PATCH 01/11] IB/core: Find the network device matching connection parameters Haggai Eran
2015-06-15 8:47 ` [PATCH 02/11] IB/ipoib: Return IPoIB devices " Haggai Eran
[not found] ` <1434358036-15526-3-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 17:22 ` Jason Gunthorpe
2015-06-16 6:36 ` Haggai Eran [this message]
2015-06-16 6:36 ` Haggai Eran
2015-06-15 8:47 ` [PATCH 03/11] IB/cm: Expose service ID in request events Haggai Eran
2015-06-15 21:25 ` Hefty, Sean
2015-06-15 8:47 ` [PATCH 04/11] IB/cm: Expose DGID in SIDR " Haggai Eran
[not found] ` <1434358036-15526-5-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 21:32 ` Hefty, Sean
[not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FF5A3F-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-15 22:08 ` Jason Gunthorpe
[not found] ` <20150615220852.GB4384-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-06-16 11:25 ` Haggai Eran
2015-06-17 17:06 ` Jason Gunthorpe
[not found] ` <20150617170612.GB27232-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-06-18 10:41 ` Haggai Eran
2015-06-16 6:51 ` Haggai Eran
[not found] ` <557FC77F.1090604-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-16 16:47 ` Hefty, Sean
[not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FF6017-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-17 10:45 ` Haggai Eran
2015-06-15 8:47 ` [PATCH 06/11] IB/cma: Refactor RDMA IP CM private-data parsing code Haggai Eran
[not found] ` <1434358036-15526-7-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 22:33 ` Hefty, Sean
[not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FF5AD7-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-16 13:02 ` Haggai Eran
2015-06-15 8:47 ` [PATCH 07/11] IB/cma: Helper functions to access port space IDRs Haggai Eran
[not found] ` <1434358036-15526-8-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 22:36 ` Hefty, Sean
[not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FF5AF3-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-21 12:51 ` Haggai Eran
2015-06-15 8:47 ` [PATCH 09/11] IB/cma: validate routing of incoming requests Haggai Eran
2015-06-15 8:47 ` [PATCH 10/11] IB/cma: Share ib_cm_ids between rdma_cm_ids Haggai Eran
2015-06-15 8:47 ` [PATCH 11/11] IB/cm: Remove compare_data checks Haggai Eran
2015-06-15 8:47 ` [PATCH 05/11] IB/cm: Share listening CM IDs Haggai Eran
[not found] ` <1434358036-15526-6-git-send-email-haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-15 22:13 ` Hefty, Sean
[not found] ` <1828884A29C6694DAF28B7E6B8A82373A8FF5AAE-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-16 12:50 ` Haggai Eran
2015-06-15 8:47 ` [PATCH 08/11] IB/cma: Add net_dev and private data checks to RDMA CM Haggai Eran
2015-06-15 17:08 ` Jason Gunthorpe
2015-06-16 5:26 ` Haggai Eran
2015-06-16 5:26 ` Haggai Eran
[not found] ` <557FB382.5090300-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-06-17 17:18 ` Jason Gunthorpe
[not found] ` <20150617171843.GC27232-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-06-18 8:34 ` Haggai Eran
2015-06-18 8:34 ` 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=557FC3F3.8030902@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: link
Be 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.