Re: [PATCH for-next v2 05/10] IB/cma: cma_validate_port should verify the port and netdevice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Looks Good
Reveiwed-By: Devesh Sharma <devesh.sharma@xxxxxxxxxxxxx>

On Thu, Oct 15, 2015 at 9:08 PM, Matan Barak <matanb@xxxxxxxxxxxx> wrote:
> Previously, cma_validate_port searched for GIDs in IB cache and then
> tried to verify the found port. This could fail when there are
> identical GIDs on both ports. In addition, netdevice should be taken
> into account when searching the GID table.
> Fixing cma_validate_port to search only the relevant port's cache
> and netdevice.
>
> Signed-off-by: Matan Barak <matanb@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/core/cma.c | 26 ++++++++++++++++++--------
>  1 file changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
> index b15d9d5..849c280 100644
> --- a/drivers/infiniband/core/cma.c
> +++ b/drivers/infiniband/core/cma.c
> @@ -427,10 +427,11 @@ static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_a
>  }
>
>  static inline int cma_validate_port(struct ib_device *device, u8 port,
> -                                     union ib_gid *gid, int dev_type)
> +                                     union ib_gid *gid, int dev_type,
> +                                     int bound_if_index)
>  {
> -       u8 found_port;
>         int ret = -ENODEV;
> +       struct net_device *ndev = NULL;
>
>         if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port))
>                 return ret;
> @@ -438,9 +439,13 @@ static inline int cma_validate_port(struct ib_device *device, u8 port,
>         if ((dev_type != ARPHRD_INFINIBAND) && rdma_protocol_ib(device, port))
>                 return ret;
>
> -       ret = ib_find_cached_gid(device, gid, NULL, &found_port, NULL);
> -       if (port != found_port)
> -               return -ENODEV;
> +       if (dev_type == ARPHRD_ETHER)
> +               ndev = dev_get_by_index(&init_net, bound_if_index);
> +
> +       ret = ib_find_cached_gid_by_port(device, gid, port, ndev, NULL);
> +
> +       if (ndev)
> +               dev_put(ndev);
>
>         return ret;
>  }
> @@ -472,7 +477,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv,
>                        &iboe_gid : &gid;
>
>                 ret = cma_validate_port(cma_dev->device, port, gidp,
> -                                       dev_addr->dev_type);
> +                                       dev_addr->dev_type,
> +                                       dev_addr->bound_dev_if);
>                 if (!ret) {
>                         id_priv->id.port_num = port;
>                         goto out;
> @@ -490,7 +496,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv,
>                                &iboe_gid : &gid;
>
>                         ret = cma_validate_port(cma_dev->device, port, gidp,
> -                                               dev_addr->dev_type);
> +                                               dev_addr->dev_type,
> +                                               dev_addr->bound_dev_if);
>                         if (!ret) {
>                                 id_priv->id.port_num = port;
>                                 goto out;
> @@ -2270,8 +2277,11 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
>
>         route->num_paths = 1;
>
> -       if (addr->dev_addr.bound_dev_if)
> +       if (addr->dev_addr.bound_dev_if) {
>                 ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if);
> +               route->path_rec->net = &init_net;
> +               route->path_rec->ifindex = addr->dev_addr.bound_dev_if;
> +       }
>         if (!ndev) {
>                 ret = -ENODEV;
>                 goto err2;
> --
> 2.1.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux