05 Dec, 2009

40 commits

  • Add FDISC ELS handling to libfc and libfcoe, treat it the same as FLOGI where
    appropriate.

    Add checking for NPIV support in the FLOGI LS_ACC service parameters.

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

    Chris Leech
     
  • NPIV vports are managed in libfc by changing their virtual link state
    when the parent N_Ports internal state changes. The vport link is only
    online when the N_Port is in a ready state (logged into the fabric).

    vport_state is updated as needed in this patch as well, currently the states
    LINKDOWN, INITIALIZING, ACTIVE, DSIABLED, and NO_FABRIC_SUPP are used.

    This also changes the fc_host port_state handling to differentiate between
    LINKDOWN and OFFLINE.

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

    Chris Leech
     
  • Adds a function to create a new VN_Port instances, which share the EM
    list with the N_Port, VN_Port lookup by fabric ID when responding to a new
    request (otherwise the exchange lookup from the N_Ports EM list is trusted to
    return an exchange with a cached lport value for the correct VN_Port),
    a pointer to a fc_vport structure for VN_Ports, and flags to indicate if an
    N_Port supports NPIV and if the switch/fabric allows it.

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

    Chris Leech
     
  • 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
     
  • These routines are for the libfc kernel module and should be in
    the libfc .c file.

    Moving the libfc __init routine into fc_libfc.c caused the creation
    of the fc_setup_fcp() and fc_destroy_fcp() routines so that
    scsi_pkt_cachep was not exposed outside of fc_fcp.c.

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

    Robert Love
     
  • include/scsi/libfc.h is currently loaded with common code
    shared between libfc's sub-modules as well as shared between
    libfc and fcoe. Previous patches attempted to move out
    non-common code. This patch creates two files for common
    libfc routines that will not be shared with fcoe, fnic or
    any other LLDs.

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

    Robert Love
     
  • This function is never used, let's remove it.

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

    Robert Love
     
  • This patch moves all non-common routines and function prototypes
    out of libfc.h and into the appropriate .c files. It makes these
    routines 'static' when necessary and removes any unnecessary EXPORT_SYMBOL
    statements.

    A result of moving the fc_exch_seq_send, fc_seq_els_rsp_send, fc_exch_alloc
    and fc_seq_start_next prototypes out of libfc.h is that they were no longer
    being imported into fc_exch.c when libfc.h was included. This caused errors
    where routines in fc_exch.c were looking for undefined symbols. To fix this
    this patch reorganizes fc_seq_alloc, fc_seq_start_next and
    fc_seq_start_next_locked. This move also made it so that
    fc_seq_start_next_locked did not need to be prototyped at the top of
    fc_exch.c.

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

    Robert Love
     
  • The maximum number of LUNs was far too low. This value is
    what most other FC HBAs are using.

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

    Robert Love
     
  • 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
     
  • Stanse found a potential NULL dereference in scsi_kill_request.

    Instead of triggering BUG() in 'if (unlikely(cmd == NULL))' branch,
    the kernel will Oops earlier on cmd dereference.

    Move the dereferences after the if.

    Signed-off-by: Jiri Slaby
    Signed-off-by: James Bottomley

    Jiri Slaby
     
  • [jejb: fix up for new queue depth code]
    Signed-off-by: Adam Radford
    Signed-off-by: James Bottomley

    adam radford
     
  • While testing scsi_debug with these patches I found a
    problem with the Block Limits VPD page function. The
    length returned by the inquiry_evpd_b0() function was
    too short. A patch to fix that and a cosmetic change
    (that the form factor of scsi_debug is less than 1.8
    inches) is attached.

    Signed-off-by: Douglas Gilbert
    Signed-off-by: James Bottomley

    Douglas Gilbert
     
  • This is a driver for VMware's paravirtualized SCSI device,
    which should improve disk performance for guests running
    under control of VMware hypervisors that support such devices.

    Signed-off-by: Alok N Kataria
    Signed-off-by: James Bottomley

    Alok Kataria
     
  • Make the activate function asynchronous by using blk_execute_rq_nowait()

    Signed-off-by: Chandra Seetharaman
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Make the activate function asynchronous by using blk_execute_rq_nowait()

    Signed-off-by: Chandra Seetharaman
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Batch up MODE_SELECT in rdac device handler.

    LSI RDAC storage has the capability of handling mode selects for
    multiple luns in a same command. Make use of that ability to send
    as few MODE SELECTs as possible to the storage controller as possible.

    This patch creates a work queue and queues up activate requests
    when a MODE SELECT is sent down the wire. When that MODE SELECT
    completes, it compiles queued up activate requests for multiple
    luns into a single MODE SELECT.

    This reduces the time to do failover/failback of large number of LUNS.

    Signed-off-by: Babu Moger
    Signed-off-by: Chandra Seetharaman
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Make scsi_dh_activate() function asynchronous, by taking in two additional
    parameters, one is the callback function and the other is the data to call
    the callback function with.

    Signed-off-by: Chandra Seetharaman
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Adapt the change_queue_depth callback in zfcp for the new reason
    parameter. Simply pass each call back to the SCSI midlayer, there are
    no resource adjustments necessary for zfcp.

    Signed-off-by: Christof Schmitt

    Removes check for (depth
    Signed-off-by: James Bottomley

    Christof Schmitt
     
  • Adjust queue_depth on fc_change_queue_depth call back
    with reason SCSI_QDEPTH_RAMP_UP, no additional resource
    adjustments necessary for libfc.

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

    Vasu Dev
     
  • Current FC HBA queue_depth ramp up code depends on last queue
    full time. The sdev already has last_queue_full_time field to
    track last queue full time but stored value is truncated by
    last four bits.

    So this patch updates last_queue_full_time without truncating
    last 4 bits to store full value and then updates its only
    current usages in scsi_track_queue_full to ignore last four bits
    to keep current usages same while also use this field
    in added ramp up code.

    Adds scsi_handle_queue_ramp_up to ramp up queue_depth on
    successful completion of IO. The scsi_handle_queue_ramp_up will
    do ramp up on all luns of a target, just same as ramp down done
    on all luns on a target.

    The ramp up is skipped in case the change_queue_depth is not
    supported by LLD or already reached to added max_queue_depth.

    Updates added max_queue_depth on every new update to default
    queue_depth value.

    The ramp up is also skipped if lapsed time since either last
    queue ramp up or down is less than LLD specified
    queue_ramp_up_period.

    Adds queue_ramp_up_period to sysfs but only if change_queue_depth
    is supported since ramp up and queue_ramp_up_period is needed only
    in case change_queue_depth is supported first.

    Initializes queue_ramp_up_period to 120HZ jiffies as initial
    default value, it is same as used in existing lpfc and qla2xxx.

    -v2
    Combined all ramp code into this single patch.

    -v3
    Moves max_queue_depth initialization after slave_configure is
    called from after slave_alloc calling done. Also adjusted
    max_queue_depth check to skip ramp up if current queue_depth
    is >= max_queue_depth.

    -v4
    Changes sdev->queue_ramp_up_period unit to ms when using sysfs i/f
    to store or show its value.

    Signed-off-by: Vasu Dev
    Tested-by: Christof Schmitt
    Tested-by: Giridhar Malavali
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • The cmd_per_lun value is used by scsi-ml as fall back lowest
    queue_depth value but in case of libfc cmd_per_lun is set to
    same value as max queue_depth = 32.

    So this patch reduces cmd_per_lun value to 3 and configures
    each lun with default max queue_depth 32 in fc_slave_alloc.

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

    Vasu Dev
     
  • This converts the libfc using scsi_track_queue_full to
    track the queue full from the change_queue_depth callback.

    Signed-off-by: Mike Christie
    Signed-off-by: Vasu Dev
    Acked-by: Robert Love
    Signed-off-by: James Bottomley

    Mike Christie
     
  • This has scsi-ml call the change_queue_depth functions when
    we get a QUEUE_FULL. It will only change the queue depth if
    change_queue_depth is set because the LLD may have to
    modify some internal resources, so I thought this would
    be the safest route.

    Signed-off-by: Mike Christie

    -v2
    Limits change_queue_depth to only all luns of target by adding
    channel check while iterating for all luns of Scsi_Host. This is
    same as currently qla2xxx FC HBA does on QUEUE_FULL event.

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

    Mike Christie
     
  • This patch modifies scsi_host_template->change_queue_depth so that
    it takes an argument indicating why it is being called. This will be
    used so that if a LLD needs to do some extra processing when
    handling queue fulls or later ramp ups, it can do so.

    This is a simple port of the drivers setting a change_queue_depth
    callback. In the patch I just have these LLDs adjust the queue depth
    if the user was requesting it.

    Signed-off-by: Mike Christie

    [Vasu.Dev: v2
    Also converted pmcraid_change_queue_depth and then verified
    all modules compile using "make allmodconfig" for any new build
    warnings on X86_64.

    Updated original description after combing two original
    patches from Mike to make this patch git bisectable.]
    Signed-off-by: Vasu Dev
    [jejb: fixed up 53c700]
    Signed-off-by: James Bottomley

    Mike Christie
     
  • This driver supports PMC-Sierra PCIe SAS/SATA 8x6G SPC 8001 chip based
    host adapters.

    Signed-off-by: Jack Wang
    Signed-off-by: Lindar Liu
    Signed-off-by: Tom Peng
    Signed-off-by: Kevin Ao
    Signed-off-by: James Bottomley

    jack wang
     
  • This patch adds support for ring based wrbs

    Signed-off-by: Jayamohan Kallickal
    Signed-off-by: James Bottomley

    Jayamohan Kallickal
     
  • This patch enables msix for be2iscsi. It also enables use
    of mcc_rings for fw commands. Since the mcc eq creation is
    dependent on msix I am sending as one patch

    Signed-off-by: Jayamohan Kallickal
    Signed-off-by: James Bottomley

    Jayamohan Kallickal
     
  • Timer crashes were caused by freeing a struct fc_rport_priv
    with a timer pending, causing the timer facility list to be
    corrupted. This was during FC uplink flap tests with a lot
    of targets.

    After discovery, we were doing an PLOGI on an rdata that was
    in DELETE state but not yet removed from the lookup list.
    This moved the rdata from DELETE state to PLOGI state.
    If the PLOGI exchange allocation failed and needed to be
    retried, the timer scheduling could race with the free
    being done by fc_rport_work().

    When fc_rport_login() is called on a rport in DELETE state,
    move it to a new state RESTART. In fc_rport_work, when
    handling a LOGO, STOPPED or FAILED event, look for restart
    state. In the RESTART case, don't take the rdata off the
    list and after the transport remote port is deleted and
    exchanges are reset, re-login to the remote port.

    Note that the new RESTART state also corrects a problem we
    had when re-discovering a port that had moved to DELETE state.
    In that case, a new rdata was created, but the old rdata
    would do an exchange manager reset affecting the FC_ID
    for both the new rdata and old rdata. With the new state,
    the new port isn't logged into until after any old exchanges
    are reset.

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

    Joe Eykholt
     
  • 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
     
  • I was running into several different panics under stress, which I traced down
    to a few different possible slab corruption issues in error handling paths.
    I have not yet looked into why these exchange sends fail, but with these
    fixes my test system is much more stable under stress than before.

    fc_elsct_send() could fail and either leave the passed in frame intact
    (failure in fc_ct/els_fill) or the frame could have been freed if the
    failure was is fc_exch_seq_send(). The caller had no way of knowing, and
    there was a potential double free in the error handling in fc_fcp_rec().

    Make fc_elsct_send() always free the frame before returning, and remove the
    fc_frame_free() call in fc_fcp_rec().

    While fc_exch_seq_send() did always consume the frame, there were double free
    bugs in the error handling of fc_fcp_cmd_send() and fc_fcp_srr() as well.

    Numerous calls to error handling routines (fc_disc_error(),
    fc_lport_error(), fc_rport_error_retry() ) were passing in a frame pointer that
    had already been freed in the case of an error. I have changed the call
    sites to pass in a NULL pointer, but there may be more appropriate error
    codes to use.

    Question: Why do these error routines take a frame pointer anyway? I
    understand passing in a pointer encoded error to the response handlers, but
    the error routines take no action on a valid pointer and should never be
    called that way.

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

    Chris Leech
     
  • Calls ndo_fcoe_enabled() of the associated netdev upon creating the FCoE
    instance to make sure LLD has all necessary resources allocated and setup
    properly before passing FCoE traffic. Similarly, calls ndo_fcoe_disable()
    upon destroying the FCoE instance on the associated netdev to allow the LLD
    to release all allocated resources for FCoE.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Yi Zou
     
  • In case of sequence offload, in fc_fcp_send_data(), the skb_fill_page_info()
    called may end up adding more frags to the skb_shinfo(fp_skb(fp))->frags[],
    exceeding SKB_MAX_FRAGS, this eventually corrupts the memory. I am adding the
    FR_FRAME_SG_LEN back, but as SKB_MAX_FRAGS -1, leaving 1 for our fcoe_eof_crc
    page. And send will be broken into multiple large sends if the frame already
    contains more frags than skb handle.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Yi Zou
     
  • Add a define of FCOE_MTU as 2158 bytes and use FCOE_MTU when the LLD is found
    to support NETIF_F_FCOE_MTU. The lport->mfs is then calculated out of the
    2158 FCOE_MTU. Otherwise, we stick with the netdev->mtu, i.e., LAN MTU. Also,
    change the notification on NETDEV_CHANGEMTU event to bypass changing mfs when
    LAN MTU is changed if NETIF_F_FCOE_MTU is supported.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Yi Zou
     
  • When doing echo ethX > /sys..../destroy I am getting
    errors when the tear down succeeds. It looks like the
    reason for this is because the rc var is not getting set
    when the destruction works. This just sets it to zero.

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

    Mike Christie
     
  • Reported-by: Alex Lyakas
    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Adds missing exch release when RRQ is accepted by calling
    fc_seq_ls_acc. Adds common exch release for fc_exch_els_rrq
    by use of out label.

    Reported-by: Alex Lyakas
    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev