public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH for-rc] RDMA/core: Fix ENODEV error for iWARP test over vlan
@ 2024-11-19  6:18 Anumula Murali Mohan Reddy
  2024-11-21 19:52 ` Zhu Yanjun
  0 siblings, 1 reply; 3+ messages in thread
From: Anumula Murali Mohan Reddy @ 2024-11-19  6:18 UTC (permalink / raw)
  To: jgg, leonro; +Cc: linux-rdma, bharat, Anumula Murali Mohan Reddy

If traffic is over vlan, cma_validate_port() fails to match
net_device ifindex with bound_if_index and results in ENODEV error.
As iWARP gid table is static, it contains entry corresponding  to
only one net device which is either real netdev or vlan netdev for
cases like  siw attached to a vlan interface.
This patch fixes the issue by assigning bound_if_index with net
device index, if real net device obtained from bound if index matches
with net device retrieved from gid table

Fixes: f8ef1be816bf ("RDMA/cma: Avoid GID lookups on iWARP devices")
Link: https://lore.kernel.org/all/ZzNgdrjo1kSCGbRz@chelsio.com/
Signed-off-by: Anumula Murali Mohan Reddy <anumula@chelsio.com>
Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
---
 drivers/infiniband/core/cma.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 64ace0b968f0..97657e1810d8 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -689,7 +689,7 @@ cma_validate_port(struct ib_device *device, u32 port,
 	const struct ib_gid_attr *sgid_attr = ERR_PTR(-ENODEV);
 	int bound_if_index = dev_addr->bound_dev_if;
 	int dev_type = dev_addr->dev_type;
-	struct net_device *ndev = NULL;
+	struct net_device *ndev = NULL, *pdev = NULL;
 
 	if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net))
 		goto out;
@@ -714,6 +714,21 @@ cma_validate_port(struct ib_device *device, u32 port,
 
 		rcu_read_lock();
 		ndev = rcu_dereference(sgid_attr->ndev);
+		if (ndev->ifindex != bound_if_index) {
+			pdev = dev_get_by_index_rcu(dev_addr->net, bound_if_index);
+			if (pdev) {
+				if (is_vlan_dev(pdev)) {
+					pdev = vlan_dev_real_dev(pdev);
+					if (ndev->ifindex == pdev->ifindex)
+						bound_if_index = pdev->ifindex;
+				}
+				if (is_vlan_dev(ndev)) {
+					pdev = vlan_dev_real_dev(ndev);
+					if (bound_if_index == pdev->ifindex)
+						bound_if_index = ndev->ifindex;
+				}
+			}
+		}
 		if (!net_eq(dev_net(ndev), dev_addr->net) ||
 		    ndev->ifindex != bound_if_index) {
 			rdma_put_gid_attr(sgid_attr);
-- 
2.39.3


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH for-rc] RDMA/core: Fix ENODEV error for iWARP test over vlan
  2024-11-19  6:18 [PATCH for-rc] RDMA/core: Fix ENODEV error for iWARP test over vlan Anumula Murali Mohan Reddy
@ 2024-11-21 19:52 ` Zhu Yanjun
  2024-11-25 19:50   ` Leon Romanovsky
  0 siblings, 1 reply; 3+ messages in thread
From: Zhu Yanjun @ 2024-11-21 19:52 UTC (permalink / raw)
  To: Anumula Murali Mohan Reddy, jgg, leonro; +Cc: linux-rdma, bharat

在 2024/11/19 7:18, Anumula Murali Mohan Reddy 写道:
> If traffic is over vlan, cma_validate_port() fails to match
> net_device ifindex with bound_if_index and results in ENODEV error.
> As iWARP gid table is static, it contains entry corresponding  to
> only one net device which is either real netdev or vlan netdev for
> cases like  siw attached to a vlan interface.
> This patch fixes the issue by assigning bound_if_index with net
> device index, if real net device obtained from bound if index matches
> with net device retrieved from gid table
> 
> Fixes: f8ef1be816bf ("RDMA/cma: Avoid GID lookups on iWARP devices")
> Link: https://lore.kernel.org/all/ZzNgdrjo1kSCGbRz@chelsio.com/
> Signed-off-by: Anumula Murali Mohan Reddy <anumula@chelsio.com>
> Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
> ---
>   drivers/infiniband/core/cma.c | 17 ++++++++++++++++-
>   1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
> index 64ace0b968f0..97657e1810d8 100644
> --- a/drivers/infiniband/core/cma.c
> +++ b/drivers/infiniband/core/cma.c
> @@ -689,7 +689,7 @@ cma_validate_port(struct ib_device *device, u32 port,
>   	const struct ib_gid_attr *sgid_attr = ERR_PTR(-ENODEV);
>   	int bound_if_index = dev_addr->bound_dev_if;
>   	int dev_type = dev_addr->dev_type;
> -	struct net_device *ndev = NULL;
> +	struct net_device *ndev = NULL, *pdev = NULL;

In the original source code, the local variables lay out in the form of 
Reverse Christmas Tree.
But the new code breaks the rule of Reverse Christmas Tree.

Zhu Yanjun

>   
>   	if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net))
>   		goto out;
> @@ -714,6 +714,21 @@ cma_validate_port(struct ib_device *device, u32 port,
>   
>   		rcu_read_lock();
>   		ndev = rcu_dereference(sgid_attr->ndev);
> +		if (ndev->ifindex != bound_if_index) {
> +			pdev = dev_get_by_index_rcu(dev_addr->net, bound_if_index);
> +			if (pdev) {
> +				if (is_vlan_dev(pdev)) {
> +					pdev = vlan_dev_real_dev(pdev);
> +					if (ndev->ifindex == pdev->ifindex)
> +						bound_if_index = pdev->ifindex;
> +				}
> +				if (is_vlan_dev(ndev)) {
> +					pdev = vlan_dev_real_dev(ndev);
> +					if (bound_if_index == pdev->ifindex)
> +						bound_if_index = ndev->ifindex;
> +				}
> +			}
> +		}
>   		if (!net_eq(dev_net(ndev), dev_addr->net) ||
>   		    ndev->ifindex != bound_if_index) {
>   			rdma_put_gid_attr(sgid_attr);


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH for-rc] RDMA/core: Fix ENODEV error for iWARP test over vlan
  2024-11-21 19:52 ` Zhu Yanjun
@ 2024-11-25 19:50   ` Leon Romanovsky
  0 siblings, 0 replies; 3+ messages in thread
From: Leon Romanovsky @ 2024-11-25 19:50 UTC (permalink / raw)
  To: Zhu Yanjun; +Cc: Anumula Murali Mohan Reddy, jgg, linux-rdma, bharat

On Thu, Nov 21, 2024 at 08:52:16PM +0100, Zhu Yanjun wrote:
> 在 2024/11/19 7:18, Anumula Murali Mohan Reddy 写道:
> > If traffic is over vlan, cma_validate_port() fails to match
> > net_device ifindex with bound_if_index and results in ENODEV error.
> > As iWARP gid table is static, it contains entry corresponding  to
> > only one net device which is either real netdev or vlan netdev for
> > cases like  siw attached to a vlan interface.
> > This patch fixes the issue by assigning bound_if_index with net
> > device index, if real net device obtained from bound if index matches
> > with net device retrieved from gid table
> > 
> > Fixes: f8ef1be816bf ("RDMA/cma: Avoid GID lookups on iWARP devices")
> > Link: https://lore.kernel.org/all/ZzNgdrjo1kSCGbRz@chelsio.com/
> > Signed-off-by: Anumula Murali Mohan Reddy <anumula@chelsio.com>
> > Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
> > ---
> >   drivers/infiniband/core/cma.c | 17 ++++++++++++++++-
> >   1 file changed, 16 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
> > index 64ace0b968f0..97657e1810d8 100644
> > --- a/drivers/infiniband/core/cma.c
> > +++ b/drivers/infiniband/core/cma.c
> > @@ -689,7 +689,7 @@ cma_validate_port(struct ib_device *device, u32 port,
> >   	const struct ib_gid_attr *sgid_attr = ERR_PTR(-ENODEV);
> >   	int bound_if_index = dev_addr->bound_dev_if;
> >   	int dev_type = dev_addr->dev_type;
> > -	struct net_device *ndev = NULL;
> > +	struct net_device *ndev = NULL, *pdev = NULL;
> 
> In the original source code, the local variables lay out in the form of
> Reverse Christmas Tree.
> But the new code breaks the rule of Reverse Christmas Tree.

There is no such rule outside of netdev world. I suggest to everyone in
RDMA to stick to that practice as sometimes we need to send the code to
netdev too and it is much easier to keep their coding style from the
beginning.

However, for pure RDMA patches, we don't care.

Thanks


> 
> Zhu Yanjun
> 
> >   	if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net))
> >   		goto out;
> > @@ -714,6 +714,21 @@ cma_validate_port(struct ib_device *device, u32 port,
> >   		rcu_read_lock();
> >   		ndev = rcu_dereference(sgid_attr->ndev);
> > +		if (ndev->ifindex != bound_if_index) {
> > +			pdev = dev_get_by_index_rcu(dev_addr->net, bound_if_index);
> > +			if (pdev) {
> > +				if (is_vlan_dev(pdev)) {
> > +					pdev = vlan_dev_real_dev(pdev);
> > +					if (ndev->ifindex == pdev->ifindex)
> > +						bound_if_index = pdev->ifindex;
> > +				}
> > +				if (is_vlan_dev(ndev)) {
> > +					pdev = vlan_dev_real_dev(ndev);
> > +					if (bound_if_index == pdev->ifindex)
> > +						bound_if_index = ndev->ifindex;
> > +				}
> > +			}
> > +		}
> >   		if (!net_eq(dev_net(ndev), dev_addr->net) ||
> >   		    ndev->ifindex != bound_if_index) {
> >   			rdma_put_gid_attr(sgid_attr);
> 
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-11-25 19:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-19  6:18 [PATCH for-rc] RDMA/core: Fix ENODEV error for iWARP test over vlan Anumula Murali Mohan Reddy
2024-11-21 19:52 ` Zhu Yanjun
2024-11-25 19:50   ` Leon Romanovsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox