Here is the patched cma_acquire_dev() function. Where does it "build the gid in the pre rocee patches fashion and search again" for the iwarp case? Maybe I'm missing it?
--------------- static int cma_acquire_dev(struct rdma_id_private *id_priv) { struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; struct cma_device *cma_dev; union ib_gid gid; int ret = -ENODEV; if (dev_addr->dev_type != ARPHRD_INFINIBAND) { rocee_addr_get_sgid(dev_addr, &gid); list_for_each_entry(cma_dev, &dev_list, list) { ret = ib_find_cached_gid(cma_dev->device, &gid, &id_priv->id.port_num, NULL); if (!ret) break; } } else { memcpy(&gid, dev_addr->src_dev_addr + rdma_addr_gid_offset(dev_addr), sizeof gid); list_for_each_entry(cma_dev, &dev_list, list) { ret = ib_find_cached_gid(cma_dev->device, &gid, &id_priv->id.port_num, NULL); if (!ret) break; } } if (!ret) cma_attach_to_dev(id_priv, cma_dev); return ret; } ---------------- Eli Cohen wrote: > On Wed, Feb 03, 2010 at 09:20:05AM -0600, Steve Wise wrote: > >>> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c >>> index a2d5aad..76dce2b 100644 >>> --- a/drivers/infiniband/core/cma.c >>> +++ b/drivers/infiniband/core/cma.c >>> @@ -348,15 +348,28 @@ static int cma_acquire_dev(struct rdma_id_private >>> *id_priv) >>> union ib_gid gid; >>> int ret = -ENODEV; >>> - rdma_addr_get_sgid(dev_addr, &gid); >>> - list_for_each_entry(cma_dev, &dev_list, list) { >>> - ret = ib_find_cached_gid(cma_dev->device, &gid, >>> - &id_priv->id.port_num, NULL); >>> - if (!ret) { >>> - cma_attach_to_dev(id_priv, cma_dev); >>> - break; >>> + if (dev_addr->dev_type != ARPHRD_INFINIBAND) { >>> + rocee_addr_get_sgid(dev_addr, &gid); >>> + list_for_each_entry(cma_dev, &dev_list, list) { >>> + ret = ib_find_cached_gid(cma_dev->device, &gid, >>> + &id_priv->id.port_num, NULL); >>> + if (!ret) >>> + break; >>> + } >>> >> The above if statement is true for iwarp devices, so this patch is >> just wrong. rocee__addr_get_sgid() should only be used for ROCEE >> interfaces, correct? >> > > No, the idea is this: for non ARPHRD_INFINIBAND devices (e.g. rocee or > iwarp) I assume first this rocee, get the rocee gid, and check if this > gid appears in any device's gid table. It the mac address belongs to a > rocee device then it will be found; if it belongs to an iwarp device > then it won't be found. In the later case I build the gid in the pre > rocee patches fashion and search again. > >> >> >>> + } else { >>> + memcpy(&gid, dev_addr->src_dev_addr + >>> + rdma_addr_gid_offset(dev_addr), sizeof gid); >>> + list_for_each_entry(cma_dev, &dev_list, list) { >>> + ret = ib_find_cached_gid(cma_dev->device, &gid, >>> + &id_priv->id.port_num, NULL); >>> + if (!ret) >>> + break; >>> } >>> } >>> + >>> + if (!ret) >>> + cma_attach_to_dev(id_priv, cma_dev); >>> + >>> return ret; >>> } >>> _______________________________________________ ewg mailing list ewg@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg