linux/drivers/scsi/lpfc
James Smart 32517fc097 scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing
When driving high iop counts, auto_imax coalescing kicks in and drives the
performance to extremely small iops levels.

There are two issues:

 1) auto_imax is enabled by default. The auto algorithm, when iops gets
    high, divides the iops by the hdwq count and uses that value to
    calculate EQ_Delay. The EQ_Delay is set uniformly on all EQs whether
    they have load or not. The EQ_delay is only manipulated every 5s (a
    long time). Thus there were large 5s swings of no interrupt delay
    followed by large/maximum delay, before repeating.

 2) When processing a CQ, the driver got mixed up on the rate of when
    to ring the doorbell to keep the chip appraised of the eqe or cqe
    consumption as well as how how long to sit in the thread and
    process queue entries. Currently, the driver capped its work at
    64 entries (very small) and exited/rearmed the CQ.  Thus, on heavy
    loads, additional overheads were taken to exit and re-enter the
    interrupt handler. Worse, if in the large/maximum coalescing
    windows,k it could be a while before getting back to servicing.

The issues are corrected by the following:

 - A change in defaults. Auto_imax is turned OFF and fcp_imax is set
   to 0. Thus all interrupts are immediate.

 - Cleanup of field names and their meanings. Existing names were
   non-intuitive or used for duplicate things.

 - Added max_proc_limit field, to control the length of time the
   handlers would service completions.

 - Reworked EQ handling:
    Added common routine that walks eq, applying notify interval and max
      processing limits. Use queue_claimed to claim ownership of the queue
      while processing. Always rearm the queue whenever the common routine
      is called.
    Rework queue element processing, namely to eliminate hba_index vs
      host_index. Only one index is necessary. The queue entry can be
      marked invalid and the host_index updated immediately after eqe
      processing.
    After rework, xx_release routines are now DB write functions. Renamed
      the routines as such.
    Moved lpfc_sli4_eq_flush(), which does similar action, to same area.
    Replaced the 2 individual loops that walk an eq with a call to the
      common routine.
    Slightly revised lpfc_sli4_hba_handle_eqe() calling syntax.
    Added per-cpu counters to detect interrupt rates and scale
      interrupt coalescing values.

 - Reworked CQ handling:
    Added common routine that walks cq, applying notify interval and max
      processing limits. Use queue_claimed to claim ownership of the queue
      while processing. Always rearm the queue whenever the common routine
      is called.
    Rework queue element processing, namely to eliminate hba_index vs
      host_index. Only one index is necessary. The queue entry can be
      marked invalid and the host_index updated immediately after cqe
      processing.
    After rework, xx_release routines are now DB write functions.  Renamed
      the routines as such.
    Replaced the 3 individual loops that walk a cq with a call to the
      common routine.
    Redefined lpfc_sli4_sp_handle_mcqe() to commong handler definition with
      queue reference. Add increment for mbox completion to handler.

 - Added a new module/sysfs attribute: lpfc_cq_max_proc_limit To allow
   dynamic changing of the CQ max_proc_limit value being used.

Although this leaves an EQ as an immediate interrupt, that interrupt will
only occur if a CQ bound to it is in an armed state and has cqe's to
process.  By staying in the cq processing routine longer, high loads will
avoid generating more interrupts as they will only rearm as the processing
thread exits. The immediately interrupt is also beneficial to idle or
lower-processing CQ's as they get serviced immediately without being
penalized by sharing an EQ with a more loaded CQ.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2019-02-05 22:29:49 -05:00
..
lpfc_attr.c scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_attr.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc_bsg.c scsi: lpfc: Enable Management features for IF_TYPE=6 2018-12-12 20:33:08 -05:00
lpfc_bsg.h scsi: lpfc: add Trunking support 2018-11-06 20:42:51 -05:00
lpfc_compat.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc_crtn.h scsi: lpfc: Support non-uniform allocation of MSIX vectors to hardware queues 2019-02-05 22:29:49 -05:00
lpfc_ct.c scsi: lpfc: Add log messages to aid in debugging fc4type discovery issues 2018-12-19 22:13:07 -05:00
lpfc_debugfs.c scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_debugfs.h scsi: lpfc: Support non-uniform allocation of MSIX vectors to hardware queues 2019-02-05 22:29:49 -05:00
lpfc_disc.h scsi: lpfc: Fix discovery failures during port failovers with lots of vports 2018-12-07 22:35:32 -05:00
lpfc_els.c scsi: lpfc: Enable Management features for IF_TYPE=6 2018-12-12 20:33:08 -05:00
lpfc_hbadisc.c scsi: lpfc: cleanup: Remove unused FCP_XRI_ABORT_EVENT slowpath event 2019-02-05 22:24:22 -05:00
lpfc_hw4.h scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_hw.h Revert "scsi: lpfc: ls_rjt erroneus FLOGIs" 2018-12-12 20:26:56 -05:00
lpfc_ids.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc_init.c scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_logmsg.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc_mbox.c scsi: lpfc: Correct topology type reporting on G7 adapters 2018-12-07 22:35:33 -05:00
lpfc_mem.c scsi: lpfc: refactor mailbox structure context fields 2018-12-07 22:35:32 -05:00
lpfc_nl.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc_nportdisc.c scsi: lpfc: Fix discovery failures during port failovers with lots of vports 2018-12-07 22:35:32 -05:00
lpfc_nvme.c scsi: lpfc: Support non-uniform allocation of MSIX vectors to hardware queues 2019-02-05 22:29:49 -05:00
lpfc_nvme.h scsi: lpfc: Adapt partitioned XRI lists to efficient sharing 2019-02-05 22:29:09 -05:00
lpfc_nvmet.c scsi: lpfc: Convert ring number to hardware queue for nvme wqe posting. 2019-02-05 22:29:09 -05:00
lpfc_nvmet.h scsi: lpfc: Convert ring number to hardware queue for nvme wqe posting. 2019-02-05 22:29:09 -05:00
lpfc_scsi.c scsi: lpfc: Support non-uniform allocation of MSIX vectors to hardware queues 2019-02-05 22:29:49 -05:00
lpfc_scsi.h scsi: lpfc: Adapt partitioned XRI lists to efficient sharing 2019-02-05 22:29:09 -05:00
lpfc_sli4.h scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_sli.c scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
lpfc_sli.h scsi: lpfc: Adapt partitioned XRI lists to efficient sharing 2019-02-05 22:29:09 -05:00
lpfc_version.h scsi: lpfc: Update lpfc version to 12.0.0.10 2018-12-19 22:13:08 -05:00
lpfc_vport.c scsi: lpfc: refactor mailbox structure context fields 2018-12-07 22:35:32 -05:00
lpfc_vport.h scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00
lpfc.h scsi: lpfc: Rework EQ/CQ processing to address interrupt coalescing 2019-02-05 22:29:49 -05:00
Makefile scsi: lpfc: Revise copyright for new company language 2018-07-10 22:15:09 -04:00