RDMA/cma: resolve to first active ib port
When we try to resolve a dest addr, if we don't give src addr, cma core will try to resolve to our source ib device automatically. The current logic only checks if a given port has the same subnet_prefix as our dest, which is not enough if we use default well known subnet_prefix on our active port, as it will be the same as the subnet_prefix on inactive ports and we might match against an inactive port by accident. To resolve this, we should also check if port is active before we resolve it as a suitable src address for a given dest. Signed-off-by: Jack Wang <jinpu.wang@profitbricks.com> Reviewed-by: Michael Wang <yun.wang@profitbricks.com> Acked-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
9e2c3f1c7f
Коммит
93b1f29de7
|
@ -709,6 +709,7 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
|
|||
union ib_gid gid, sgid, *dgid;
|
||||
u16 pkey, index;
|
||||
u8 p;
|
||||
enum ib_port_state port_state;
|
||||
int i;
|
||||
|
||||
cma_dev = NULL;
|
||||
|
@ -724,6 +725,8 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
|
|||
if (ib_find_cached_pkey(cur_dev->device, p, pkey, &index))
|
||||
continue;
|
||||
|
||||
if (ib_get_cached_port_state(cur_dev->device, p, &port_state))
|
||||
continue;
|
||||
for (i = 0; !ib_get_cached_gid(cur_dev->device, p, i,
|
||||
&gid, NULL);
|
||||
i++) {
|
||||
|
@ -735,7 +738,8 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
|
|||
}
|
||||
|
||||
if (!cma_dev && (gid.global.subnet_prefix ==
|
||||
dgid->global.subnet_prefix)) {
|
||||
dgid->global.subnet_prefix) &&
|
||||
port_state == IB_PORT_ACTIVE) {
|
||||
cma_dev = cur_dev;
|
||||
sgid = gid;
|
||||
id_priv->id.port_num = p;
|
||||
|
|
Загрузка…
Ссылка в новой задаче