On 06/13/2017 01:08 AM, James Smart wrote:
> On 5/16/2017 12:59 PM, Roland Dreier wrote:
>> On Sun, Mar 5, 2017 at 8:35 AM, Sebastian Herbszt <herb...@gmx.de> wrote:
>>> Just like Hannes I do favour integration. I guess it could be
>>> comparable to qla2xxx + tcm_qla2xxx, lpfc + lpfc_scst and
>>> lpfc + tcm_lpfc. That approach might even help Bart with his
>>> target driver unification if he didn't give up on that topic.
>> Resurrecting this old topic - sorry for not seeing this go by initially.
>>
>> For context, I have a lot of experience debugging the qla2xxx target
>> code - we did a lot of work to get error/exception paths correct.
>> Basic FC target support is pretty straightforward but handling SAN log
>> in / log out events and other strange things that initiators do took a
>> lot of effort.
>>
>> Anyway, my feeling is that the integration of tcm_qla2xxx and qla2xxx
>> was overall a net negative.  Having the target driver grafted onto the
>> side of an already-complex driver that has a bunch of code not
>> relevant to the target (SCSI error handling, logging into and timing
>> out remote target ports, etc) made the code harder to debug and harder
>> to get right.
>>
>> Of course I'm in favor of making common code really common.  So
>> certainly we should have a common library of SLI-4 code that both the
>> initiator and target driver share.  And if there is more commonality,
>> that's great.  But any code similar to "if (initiator) ... else ..."
>> is really suspect to me - grepping for "qla_ini_mode_enabled" shows
>> great examples like
>>
>> ...
>>
>> Handling "dual mode" (both initiator and target on the same port at
>> the same time) is a design challenge, but I don't think the current
>> qla2xxx driver is an example of a maintainable way to do that.
>>
>> (I'm agnostic about what to do about SLI-3 - perhaps the cleanest
>> thing to do is split the driver between SLI-4 and SLI-3, and handle
>> the initiator and target drivers for those two cases as appropriate)
>>
>> I'd love to discuss this further and come up with a design that meets
>> the concerns about integration but also learns the lessons from
>> tcm_qla2xxx.
>>
>>   - R.
> 
> 
> Thanks for the feedback.  I believe you echo many of our concerns as we
> look at "merging them into one".  I agree with your statements on the
> number of if-else roles and know that we made this even more complicated
> by the driver doing fc-nvme initiator and fc-nvme target as well.  Your
> small list of "mode_enabled" hits pales in comparison to a hit list in
> the current driver if looking for SCSI initiator support
> (LPFC_ENABLE_FCP), NVME initiator support (LPFC_ENABLE_NVME), or NVME
> target support (phba->nvmet_support). And that's before adding SCSI
> target support.   We're also concerned about the discovery engines as
> not only are there lots of different paths for the different roles as
> well as support for fcoe, but there are a lot of carefully managed
> accommodations for various oem and switch environments. It's very
> difficult to replicate and retest all these different configurations and
> scenarios.
> 
> Here's what I'd like to propose for a direction:
> 1) Create an initiator driver and a target driver.  For now, initiator
> would support both SCSI and NVME initiator. Target would support SCSI
> and NVME target.
Well, _actually_ you only would need to move the NVMe target
functionality into a new driver...

> 2) SLI3 support would be contained only within the initiator driver and
> limited to SCSI (as it is today in lpfc).
> 3) SLI4 support would be library-ized,so that the code can be shared
> between the two drivers.  Library-izing SLI-4 means SLI-3 will also be
> library-ized.
> 4) Discovery support would be librarized so it can be shared. As part of
> this effort we will minimally move generic functions from the library to
> drivers/scsi/libfc (example: setting RPA payloads, etc).  At this time,
> the drivers will not attempt to use libfc for discovery. There is too
> much sensitive code tied to interlocks with adapter api design that are
> visible in the discovery state machine. Use of libfc can be a future,
> but for the short term, the goal is a single library for the broadcom
> initiator/target drivers.
> 5) lpfc will be refactored, addressing concerns that have been desired
> for a while.
> 
That all sound reasonable.

> 
> To start this effort, I'd like a bcmlpfc directory to be made within the
> drivers staging tree. The directory would be populated with the efct
> driver and a copy of the existing lpfc driver.   Work can then commence
> on refactoring lpfc and creating the libraries and integrating the
> libraries into both drivers.  As lpfc is updated in the main tree,
> patches would be posted to the staging version of lpfc to keep them on par.
> 
Ok.

> 
> Questions:
> a) How best to deal with overlapping pci id's ?  E.g. if we do (1) and
> we have an initiator and target driver, there is a lot of adapters that
> are fully functional for target operation, but were sold as primarily an
> initiator adapter. How could we manage target mode enablement without
> code mod or hard pci id partitioning ?   I know individual pci
> unbind/bind could work, but its been frowned upon as a long term option.
> Same thing goes for module parameters to select which ports do what role.
> 
That indeed is a problem.

Ideally we should be able to set the required mode on a per-port base;
having it per PCI device might be too coarse. Unless you represent each
port as a PCI function; not sure if that's the case, though.
If we were to allow to set the mode on a per-port base we could easily
implement kernel parameters like fctarget=WWPN and/or fcinitiator=WWPN;
NVMe could be treated similarly.
And have a config option specifying if the default FC mode should be
initiator or target.
With that we could configure the ports during boot-up and would avoid
the rebinding.

> b) Assuming we have the lpfc copy in the bcmlpfc directory in the
> staging tree: are there any issues with having a version of lpfc in the
> main tree and another in the staging tree ?     For many reasons, I'd
> like to keep the name lpfc on the initiator driver in the staging tree.
> But is that possible ? I assume we would need to develop in the staging
> tree as a new name and pci id space separate from the base driver, and
> we can rename the staging driver to the lpfc name when it merges into
> the main kernel and replaces the existing driver.
> 
Why not splitting the _existing_ lpfc driver along the above lines, and
keep the new target mode driver in staging?
That would be 'just' be a refactoring of the current lpfc driver, which
would be fully in keeping with the existing rules.
Hence I don't think that it would require to have the initiator driver
in staging, too.
And I do think that staging drivers can use library function from
'mainline' drivers.

Unless you want to go for a full split, and remove SLI-4 functionality
from the existing lpfc driver.
But then you'll be having a issue with driver renaming etc.
Not sure if I would want to go that route.

Cheers,

Hannes

Reply via email to