Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
IB/cma: cma_validate_port should verify the port and netdevice
Browse files Browse the repository at this point in the history
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@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
  • Loading branch information
matanb10 authored and Doug Ledford committed Oct 22, 2015
1 parent c2c6ff1 commit abae1b7
Showing 1 changed file with 18 additions and 8 deletions.
26 changes: 18 additions & 8 deletions drivers/infiniband/core/cma.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,20 +427,25 @@ 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;

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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -2296,8 +2303,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;
Expand Down

0 comments on commit abae1b7

Please sign in to comment.