30 Jun, 2011

1 commit

  • Driver was incorrectly using the SLAB_CACHE_DMA flag when creating a cache
    for SGLs. fnic device does not have 24-bit DMA restrictions. Remove the flag
    and allocations from ZONE_DMA.

    Thanks to Roland Dreier and David Rientjes for pointing out the bug.

    Signed-off-by: Abhijeet Joglekar
    Signed-off-by: James Bottomley

    Abhijeet Joglekar
     

31 Mar, 2011

1 commit


13 Feb, 2011

2 commits


17 Nov, 2010

1 commit

  • Move the mid-layer's ->queuecommand() invocation from being locked
    with the host lock to being unlocked to facilitate speeding up the
    critical path for drivers who don't need this lock taken anyway.

    The patch below presents a simple SCSI host lock push-down as an
    equivalent transformation. No locking or other behavior should change
    with this patch. All existing bugs and locking orders are preserved.

    Additionally, add one parameter to queuecommand,
    struct Scsi_Host *
    and remove one parameter from queuecommand,
    void (*done)(struct scsi_cmnd *)

    Scsi_Host* is a convenient pointer that most host drivers need anyway,
    and 'done' is redundant to struct scsi_cmnd->scsi_done.

    Minimal code disturbance was attempted with this change. Most drivers
    needed only two one-line modifications for their host lock push-down.

    Signed-off-by: Jeff Garzik
    Acked-by: James Bottomley
    Signed-off-by: Linus Torvalds

    Jeff Garzik
     

08 Oct, 2010

1 commit

  • This removes the driver's get_host_def_dev_loss_tmo
    callback and just has the driver set the dev loss
    using the fc class fc_host_dev_loss_tmo macro like is
    done for other fc params.

    This also adds a set rport dev loss function so the
    fc class host dev loss tmp sysfs support being added
    in the fc class patch can update rports.

    Signed-off-by: Mike Christie
    Signed-off-by: James Bottomley

    Mike Christie
     

06 Sep, 2010

1 commit


11 Aug, 2010

1 commit


28 Jul, 2010

3 commits

  • The FC-BB-6 committee is proposing a new FIP usage model called
    VN_port to VN_port mode. It allows VN_ports to discover each other
    over a loss-free L2 Ethernet without any FCF or Fibre-channel fabric
    services. This is point-to-multipoint. There is also a variant
    of this called point-to-point which provides for making sure there
    is just one pair of ports operating over the Ethernet fabric.

    We add these new states: VNMP_START, _PROBE1, _PROBE2, _CLAIM, and _UP.
    These usually go quickly in that sequence. After waiting a random
    amount of time up to 100 ms in START, we select a pseudo-random
    proposed locally-unique port ID and send out probes in states PROBE1
    and PROBE2, 100 ms apart. If no probe responses are heard, we
    proceed to CLAIM state 400 ms later and send a claim notification.
    We wait another 400 ms to receive claim responses, which give us
    a list of the other nodes on the network, including their FC-4
    capabilities. After another 400 ms we go to VNMP_UP state and
    should start interoperating with any of the nodes for whic we
    receivec claim responses. More details are in the spec.j

    Add the new mode as FIP_MODE_VN2VN. The driver must specify
    explicitly that it wants to operate in this mode. There is
    no automatic detection between point-to-multipoint and fabric
    mode, and the local port initialization is affected, so it isn't
    anticipated that there will ever be any such automatic switchover.

    It may eventually be possible to have both fabric and VN2VN
    modes on the same L2 network, which may be done by two separate
    local VN_ports (lports).

    When in VN2VN mode, FIP replaces libfc's fabric-oriented discovery
    module with its own simple code that adds remote ports as they
    are discovered from incoming claim notifications and responses.
    These hooks are placed by fcoe_disc_init().

    A linear list of discovered vn_ports is maintained under the
    fcoe_ctlr struct. It is expected to be short for now, and
    accessed infrequently. It is kept under RCU for lock-ordering
    reasons. The lport and/or rport mutexes may be held when we
    need to lookup a fcoe_vnport during an ELS send.

    Change fcoe_ctlr_encaps() to lookup the destination vn_port in
    the list of peers for the destination MAC address of the
    FIP-encapsulated frame.

    Add a new function fcoe_disc_init() to initialize just the
    discovery portion of libfcoe for VN2VN mode.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • There are three modes that libfcoe currently supports, and a new one
    is coming. Change the fcoe_ctlr_init() interface to add the mode
    desired. This should not change any functionality.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • In fnic_abort_cmd() and fnic_device_reset() assign `rport' earlier to make
    FNIC_SCSI_DBG() calls cleaner.

    In fnic_clean_pending_aborts() `rport' is not used.

    Signed-off-by: Roel Kluin
    Acked-by: Abhijeet Joglekar
    Signed-off-by: Andrew Morton
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Roel Kluin
     

12 Apr, 2010

3 commits


30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

18 Feb, 2010

3 commits


05 Dec, 2009

8 commits

  • Add initialization of .bsg_request in the scsi_transport_fc
    template so that fcping works.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • Use libfcoe as a common FIP implementation with fcoe.
    FIP or non-FIP mode is fully automatic if the firmware
    supports and enables it.

    Even if FIP is not supported, this uses libfcoe for the non-FIP
    handling of FLOGI and its response.

    Use the new lport_set_port_id() notification to capture
    successful FLOGI responses and port_id resets.

    While transitioning between Ethernet and FC mode, all rx and
    tx FC frames are queued. In Ethernet mode, all frames are
    passed to the exchange manager to capture FLOGI responses.

    Change to set data_src_addr to the ctl_src_addr whenever it
    would have previously been zero because we're not logged in.
    This seems safer so we'll never send a frame with a 0 source MAC.
    This also eliminates a special case for sending FLOGI frames.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • I'd like to keep basic initialization together with allocation, which means
    this can't just be a tail-call to scsi_host_alloc.

    This is needed to create a generic libfc host allocation routine for NPIV
    VN_Ports, which will share the exchange ID space (through sharing exchange
    manager structures) with the parent lport. In order to clone the exchange
    manager list when the lport is allocated, the list head must be initialized
    earlier.

    Also, update fnic to use the libfc_host_alloc so that later changes do not break
    it. (contribution by Joe Eykholt)

    Signed-off-by: Chris Leech
    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Chris Leech
     
  • The OS interrupt vectors were getting allocated before the interrupt
    resources were mapped from hardware. For Legacy interrupts, since
    they are shared with other devices, as soon as an interrupt is
    registered with the OS, it can fire while the fnic isr resource is
    still unmapped. This can cause crash because of access to unmapped resources.
    For MSIX and MSI, since interrupts are not shared with other devices,
    this problem didnt happen, because the interrupt is enabled as the last
    step before returning from _probe. For Legacy however, since the
    interrupt is shared, the handler can be called as soon as it is registered.

    Solution is to register interrupt handlers with OS as last step before
    enabling device interrupts.

    Signed-off-by: Abhijeet Joglekar
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Abhijeet Joglekar
     
  • Move the duplicated code from FC LLDs to SCSI FC transport class.

    Acked-by: James Smart
    Acked-by: Giridhar Malavali
    Acked-by: Abhijeet Joglekar
    Signed-off-by: Christof Schmitt
    Signed-off-by: James Bottomley

    Christof Schmitt
     
  • Signed-off-by: Abhijeet Joglekar
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Abhijeet Joglekar
     
  • Signed-off-by: Abhijeet Joglekar
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Abhijeet Joglekar
     
  • Driver was processing a fixed max number of cq descriptors per ISR. For
    instance, for the SCSI IO queue, number of IOs processed per ISR were 8.
    If hardware writes 9 cq descriptors to the cq and generates an interrupt,
    driver would process only 8 descriptors and decrement the outstanding
    credit count by 8. Unless another interrupt event happens, the hw does
    not generate any additional interrupt. This results in the cq descriptor
    sitting in the queue without being procesed and can cause IO timeouts
    and aborts.

    Modify all ISR functions to process all queued cq descriptors in one shot.
    Since bulk of ELS frame processing is done in thread context and bulk
    of SCSI IO processing is done in soft ISR deferred context, the cycles
    spent in the ISR per cq descriptor is small.

    Signed-off-by: Herman Lee
    Signed-off-by: Abhijeet Joglekar
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Abhijeet Joglekar
     

23 Aug, 2009

1 commit

  • Modifies current code to use EM anchor list in EM allocation, EM free,
    EM reset, exch allocation and exch lookup code paths.

    1. Modifies fc_exch_mgr_alloc to accept EM match function and then
    have allocated EM added to the lport using fc_exch_mgr_add API
    while also updating EM kref for newly added EM.

    2. Updates fc_exch_mgr_free API to accept only lport pointer instead
    EM and then have this API free all EMs of the lport from EM anchor
    list.

    3. Removes single lport pointer link from the EM, which was used in
    associating lport pointer in newly allocated exchange. Instead have
    lport pointer passed along new exchange allocation call path and
    then store passed lport pointer in newly allocated exchange, this
    will allow a single EM instance to be used across more than one
    lport and used in EM reset to reset only lport specific exchanges.

    4. Modifies fc_exch_mgr_reset to reset all EMs from the EM anchor list
    of the lport, adds additional exch lport pointer (ep->lp) check for
    shared EM case to reset exchange specific to a lport requested reset.

    5. Updates exch allocation API fc_exch_alloc to use EM anchor list and
    its anchor match func pointer. The fc_exch_alloc will walk the list
    of EMs until it finds a match, a match will be either null match
    func pointer or call to match function returning true value.

    6. Updates fc_exch_recv to accept incoming frame on local port using
    only lport pointer and frame pointer without specifying EM instance
    of incoming frame. Instead modified fc_exch_recv to locate EM for the
    incoming frame by matching xid of incoming frame against a EM xid range.
    This change was required to use EM list in libfc Rx path and after this
    change the lport fc_exch_mgr pointer emp is not needed anymore, so
    removed emp pointer.

    7. Updates fnic for removed lport emp pointer and above modified libfc APIs
    fc_exch_recv, fc_exch_mgr_alloc and fc_exch_mgr_free.

    8. Removes exch_get and exch_put from libfc_function_template as these
    are no longer needed with EM anchor list and its match function use.
    Also removes its default function fc_exch_get.

    A defect this patch introduced regarding the libfc initialization order in
    the fnic driver was fixed by Joe Eykholt .

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     

26 Jun, 2009

2 commits


24 May, 2009

1 commit


14 May, 2009

1 commit