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 |
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>
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
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 --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
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(+)