Never mind.  I see you already committed the change.  I just pulled the 
latest and rping works over iwarp.

Thanks,

Steve.


Steve Wise wrote:
> Hey Eli,
>
> This patch doesn't apply.
>
> If you give me one that applies and builds against RH5.3, I'll test it.
>
> Thanks,
>
> Steve.
>
>
> Eli Cohen wrote:
>   
>> Oops, you're right.
>>
>> Please try this one:
>>
>> commit 483fe703b03b1db99fa4a968fc3a918aa43f856f
>> Author: Eli Cohen <e...@mellanox.co.il>
>> Date:   Wed Feb 3 13:10:14 2010 +0200
>>
>>     CMA: Fix iWarp failures to bind to a device
>>     
>>     rdma_addr_get_sgid() relies on dev_addr->transport to retrieve the 
>> correct GID
>>     based on the hardware address. However, when called from 
>> cma_acquire_dev(), the
>>     transport field is not yet valid. The solution is to avoid calling
>>     rdma_addr_get_sgid() from cma_acquire_dev() and find the device based on 
>> it's
>>     GID: for ethernet, assume first it is rocee and search the GID table, if 
>> not
>>     found generate the GID by copying it from the hardware address.
>>     
>>     Signed-off-by: Eli Cohen <e...@mellanox.co.il>
>>
>> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
>> index a2d5aad..3c5c59f 100644
>> --- a/drivers/infiniband/core/cma.c
>> +++ b/drivers/infiniband/core/cma.c
>> @@ -348,15 +348,29 @@ 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);
>> +    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)
>> +                            goto out;
>> +            }
>> +    }
>> +
>> +    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) {
>> -                    cma_attach_to_dev(id_priv, cma_dev);
>> +            if (!ret)
>>                      break;
>> -            }
>>      }
>> +
>> +out:
>> +    if (!ret)
>> +            cma_attach_to_dev(id_priv, cma_dev);
>> +
>>      return ret;
>>  }
>>  
>>
>>   
>>     
>>>>>               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
>   

_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to