Re: [PATCH 1/9] ib_mad: incoming sminfo SMPs gets discarded if no process_mad function is registered

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

 



On 9/8/2016 1:22 PM, Knut Omang wrote:
> On Thu, 2016-09-08 at 07:33 -0400, Hal Rosenstock wrote:
>> On 9/7/2016 7:42 AM, Knut Omang wrote:
>>> On Tue, 2016-09-06 at 10:01 -0400, Hal Rosenstock wrote:
>>>> On 9/1/2016 8:09 PM, Knut Omang wrote:
>>>>>
>>>>> From: Dag Moxnes <dag.moxnes@xxxxxxxxxx>
>>>>>
>>>>> The process_mad function is an optional IB driver entry point
>>>>> allows a driver to intercept or modify MAD traffic.
>>>>
>>>> process_mad is optional but currently that optionality is based on
>>>> whether MADs (QP0 and/or QP1) are supported or not. This is reflected in
>>>> the core_cap_flags and is related to the device type: IB including RoCE
>>>> v. non IB. The current in tree device drivers that do not support
>>>> process_mad are i40iw (iWARP) and usnic.
>>>
>>> I see - we are introducing a new case here, then.
>>>>>
>>>>> This fix allows MAD traffic to flow down to the device also
>>>>> when MAD traffic is completely handled by the device
>>>>
>>>> All MAD traffic is not handled by the device.
>>>
>>> Yes, in our case all MAD packet handling is done by the device,
>>
>> SMInfo is not handled by device unless you have SM in hardware.
>> It also depends on management class, method, and direction
>> (outgoing/incoming) and in case of DR SMP the DR path.
> 
> Yes, with "handling" here we really mean "deciding what to do with it" -
> in our case, the driver is not involved in those decisions at all.
> That includes both inbound and outbound DR and LID routed SMInfo packets.
> 
>>> the driver's task for MAD packets is just to forward.
>>
>> I think that it's a little more complex than that. See above.
>>
>> Perhaps some of this is due to not understanding what the effects of
>> forwarding are with device such as SIF where SMA (and SMI) as well as
>> PMA are totally in hardware. If MAD is locally handled rather than
>> "forwarded", I assume that the device generates and sends the response
>> MAD, right ?
> 
> Yes, correct.
> 
>> Do locally handled MADs work correctly ?
> 
> Yes
> 
>> Does OpenSM properly run on SIF?
> 
> The goal is to have OpenSM work seamlessly with SIF, yes.

More than whether it's a goal, I'm asking whether OpenSM currently works
seamlessly with SIF with your changes (including driver not yet
submitted to linux-rdma) ?

>> I saw a post yesterday on issue with running OpenSM on SIF in terms of
>> obtaining the local PortInfo via DR SMP with hop count of 0.
> 
> Do you have a link ref to this?

http://lists.openfabrics.org/pipermail/users/2016-September/000607.html

>>>>> and no process_mad function is provided.
>>>>>
>>>>> Signed-off-by: Knut Omang <knut.omang@xxxxxxxxxx>
>>>>> ---
>>>>>  drivers/infiniband/core/mad.c | 6 ++++++
>>>>>  drivers/infiniband/core/smi.h | 6 ++----
>>>>>  2 files changed, 8 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
>>>>> index 2d49228..ece33ec 100644
>>>>> --- a/drivers/infiniband/core/mad.c
>>>>> +++ b/drivers/infiniband/core/mad.c
>>>>> @@ -813,6 +813,12 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
>>>>>  			goto out;
>>>>>  	}
>>>>>
>>>>> +	/* If device does not define the optional process_mad function it means that
>>>>> +	 * everything is handled in hardware:
>>>>> +	 */
>>>>> +	if (!device->process_mad)
>>>>> +		goto out;
>>>>> +
>>>> This changes the ib_post_send_mad flow for those devices in that it
>>>> takes the send rather than error path.
>>>
>>> Yes, but no packets will ever be received by this function for the i40iw and usnic
>>> devices because they have said in their capabilities that they do not support SMI?
>>
>> You're right - it shouldn't get here for those devices (it's based on
>> MAD rather than SMI cap) - umad open would fail for the port GUID.
> 
> Ok, I see - good!
> 
>>>>>  	local = kmalloc(sizeof *local, GFP_ATOMIC);
>>>>>  	if (!local) {
>>>>>  		ret = -ENOMEM;
>>>>> diff --git a/drivers/infiniband/core/smi.h b/drivers/infiniband/core/smi.h
>>>>> index 33c91c8..16a9f9a 100644
>>>>> --- a/drivers/infiniband/core/smi.h
>>>>> +++ b/drivers/infiniband/core/smi.h
>>>>> @@ -67,8 +67,7 @@ static inline enum smi_action smi_check_local_smp(struct ib_smp *smp,
>>>>>  {
>>>>>  	/* C14-9:3 -- We're at the end of the DR segment of path */
>>>>>  	/* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */
>>>>> -	return ((device->process_mad &&
>>>>> -		!ib_get_smp_direction(smp) &&
>>>>> +	return ((!ib_get_smp_direction(smp) &&
>>>>>  		(smp->hop_ptr == smp->hop_cnt + 1)) ?
>>>>>  		IB_SMI_HANDLE : IB_SMI_DISCARD);
>>>>>  }
>>>>> @@ -82,8 +81,7 @@ static inline enum smi_action smi_check_local_returning_smp(struct ib_smp *smp,
>>>>>  {
>>>>>  	/* C14-13:3 -- We're at the end of the DR segment of path */
>>>>>  	/* C14-13:4 -- Hop Pointer == 0 -> give to SM */
>>>>> -	return ((device->process_mad &&
>>>>> -		ib_get_smp_direction(smp) &&
>>>>> +	return ((ib_get_smp_direction(smp) &&
>>>>>  		!smp->hop_ptr) ? IB_SMI_HANDLE : IB_SMI_DISCARD);
>>>>>  }
>>>> Also, with this approach of optional process_mad for IB device, will/how
>>>> will sysfs port counters be supported for this device ? This currently
>>>> relies on process_mad.
>>>
>>> Yes, that is actually a problem for us right now.
>>> We do however think that the solution of composing a packet to send via process_mad is
>>> kind of overkill as this doesn't allow devices to optimize the way to retrieve this info.
>>
>> Is there a way other than via PMA to get these counters ?
> 
> Yes, the driver have a work request based model to request such info from the device.
> This is partly firmware based so it can be extended/adapted if necessary.

sysfs.c could be extended to support this in addition to the current PMA
approach for PortCounters/PortCountersExtended although PMA access to
your device needs to work anyhow for at least PortCounters. Perhaps a
new optional device driver entry point for get_port_stats taking
ib_device struct and port number and returning some stats struct ?

>>>> It should be possible to implement a process_mad routine to return
>>>> ib_mad_result based on management class and perhaps attribute ID in the
>>>> case of SMInfo. Can this alternative approach be used for SIF ?
>>>
>>> The problem is that the handle_outgoing_dr_smp function has an implicit assumption that
>>> some packets are handled by the process_mad function itself. There is no way to provide return
>>> values from the process_mad function that ensures that packets are always forwarded to the device,
>>> so the only viable solution without breaking the API seems to be to not implement process_mad.
>>
>> Are you referring to the difference between returning 0 when no
>> process_mad function as this patch does and what happens when
>> process_mad returns 0 inside of the ib_mad_post_send routine ?
> 
> Yes, that sounds about right, it's been a while since we struggled with this.
> 
>> Doesn't the send MAD need to be tracked in the MAD layer ?
> 
> The MAD layer tracking happens above the driver, it creates and manages QP0

and QP1 too

> and sees all mad packets that gets sent as with Connect-X<n> ?

Yes. That's what I'm referring to here as this is skipped since
process_mad is NULL. Why wouldn't this be needed with SIF ? What happens
if SIF device doesn't respond when it should ?
Is there some error scenario where no response would come back ?

-- Hal

>> Is there some problem invoking ib_send_mad (or ib_send_rmpp_mad) ?
> 
> No, to my knowledge we are able to support the normal management
> applications just as one would expect.
> 
> Thanks,
> Knut
> 
> 
--
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