diff mbox series

[for-rc] RDMA/core: Make sure the netdev is not already associated

Message ID 20221212092240.21694-1-kheib@redhat.com (mailing list archive)
State Changes Requested
Delegated to: Jason Gunthorpe
Headers show
Series [for-rc] RDMA/core: Make sure the netdev is not already associated | expand

Commit Message

Kamal Heib Dec. 12, 2022, 9:22 a.m. UTC
Make sure that the requested net_device is not already associated with
an ib_device before trying to create a new ib_device that will be
associated with the same net_device, this is needed to avoid creating
siw and rxe devices that will be associated with the same net_device.

Fixes: 3856ec4b93c9 ("RDMA/core: Add RDMA_NLDEV_CMD_NEWLINK/DELLINK support")
Signed-off-by: Kamal Heib <kheib@redhat.com>
---
 drivers/infiniband/core/nldev.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Leon Romanovsky Dec. 12, 2022, 10:16 a.m. UTC | #1
On Mon, Dec 12, 2022 at 11:22:40AM +0200, Kamal Heib wrote:
> Make sure that the requested net_device is not already associated with
> an ib_device before trying to create a new ib_device that will be
> associated with the same net_device, this is needed to avoid creating
> siw and rxe devices that will be associated with the same net_device.
> 
> Fixes: 3856ec4b93c9 ("RDMA/core: Add RDMA_NLDEV_CMD_NEWLINK/DELLINK support")
> Signed-off-by: Kamal Heib <kheib@redhat.com>
> ---
>  drivers/infiniband/core/nldev.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 

Thanks,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Jason Gunthorpe Dec. 12, 2022, 12:51 p.m. UTC | #2
On Mon, Dec 12, 2022 at 11:22:40AM +0200, Kamal Heib wrote:
> Make sure that the requested net_device is not already associated with
> an ib_device before trying to create a new ib_device that will be
> associated with the same net_device, this is needed to avoid creating
> siw and rxe devices that will be associated with the same net_device.
> 
> Fixes: 3856ec4b93c9 ("RDMA/core: Add RDMA_NLDEV_CMD_NEWLINK/DELLINK support")
> Signed-off-by: Kamal Heib <kheib@redhat.com>
> ---
>  drivers/infiniband/core/nldev.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
> index a981ac2f0975..376c9e158556 100644
> --- a/drivers/infiniband/core/nldev.c
> +++ b/drivers/infiniband/core/nldev.c
> @@ -1696,6 +1696,7 @@ static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
>  	const struct rdma_link_ops *ops;
>  	char ndev_name[IFNAMSIZ];
>  	struct net_device *ndev;
> +	struct ib_device *ibdev;
>  	char type[IFNAMSIZ];
>  	int err;
>  
> @@ -1718,6 +1719,12 @@ static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
>  	if (!ndev)
>  		return -ENODEV;
>  
> +	ibdev = ib_device_get_by_netdev(ndev, RDMA_DRIVER_UNKNOWN);
> +	if (ibdev) {
> +		ib_device_put(ibdev);
> +		return -EINVAL;
> +	}

This is racy

What is wrong with creating two IB devices on top of the same net device?

Jason
Leon Romanovsky Dec. 12, 2022, 1:18 p.m. UTC | #3
On Mon, Dec 12, 2022 at 08:51:19AM -0400, Jason Gunthorpe wrote:
> On Mon, Dec 12, 2022 at 11:22:40AM +0200, Kamal Heib wrote:
> > Make sure that the requested net_device is not already associated with
> > an ib_device before trying to create a new ib_device that will be
> > associated with the same net_device, this is needed to avoid creating
> > siw and rxe devices that will be associated with the same net_device.
> > 
> > Fixes: 3856ec4b93c9 ("RDMA/core: Add RDMA_NLDEV_CMD_NEWLINK/DELLINK support")
> > Signed-off-by: Kamal Heib <kheib@redhat.com>
> > ---
> >  drivers/infiniband/core/nldev.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
> > index a981ac2f0975..376c9e158556 100644
> > --- a/drivers/infiniband/core/nldev.c
> > +++ b/drivers/infiniband/core/nldev.c
> > @@ -1696,6 +1696,7 @@ static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
> >  	const struct rdma_link_ops *ops;
> >  	char ndev_name[IFNAMSIZ];
> >  	struct net_device *ndev;
> > +	struct ib_device *ibdev;
> >  	char type[IFNAMSIZ];
> >  	int err;
> >  
> > @@ -1718,6 +1719,12 @@ static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
> >  	if (!ndev)
> >  		return -ENODEV;
> >  
> > +	ibdev = ib_device_get_by_netdev(ndev, RDMA_DRIVER_UNKNOWN);
> > +	if (ibdev) {
> > +		ib_device_put(ibdev);
> > +		return -EINVAL;
> > +	}
> 
> This is racy

It can be seen as best effort.

> 
> What is wrong with creating two IB devices on top of the same net device?

Any place where we need to convert from ndev to ib will return random answer.

> 
> Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
index a981ac2f0975..376c9e158556 100644
--- a/drivers/infiniband/core/nldev.c
+++ b/drivers/infiniband/core/nldev.c
@@ -1696,6 +1696,7 @@  static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
 	const struct rdma_link_ops *ops;
 	char ndev_name[IFNAMSIZ];
 	struct net_device *ndev;
+	struct ib_device *ibdev;
 	char type[IFNAMSIZ];
 	int err;
 
@@ -1718,6 +1719,12 @@  static int nldev_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
 	if (!ndev)
 		return -ENODEV;
 
+	ibdev = ib_device_get_by_netdev(ndev, RDMA_DRIVER_UNKNOWN);
+	if (ibdev) {
+		ib_device_put(ibdev);
+		return -EINVAL;
+	}
+
 	down_read(&link_ops_rwsem);
 	ops = link_ops_get(type);
 #ifdef CONFIG_MODULES