scsi: fnic: Impose upper limit on max. # of CQs processed per intr
authorSatish Kharat <satishkh@cisco.com>
Tue, 15 Jan 2019 01:09:29 +0000 (17:09 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 23 Jan 2019 02:18:34 +0000 (21:18 -0500)
Impose an upper limit on the max number of CQ entries (corresponding to the
copy wq) processed in an interrupt.  Use module parameter to set the limit.

Signed-off-by: Satish Kharat <satishkh@cisco.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/fnic/fnic.h
drivers/scsi/fnic/fnic_isr.c
drivers/scsi/fnic/fnic_main.c

index 5c9402c..a3f20ae 100644 (file)
        __fnic_set_state_flags(fnicp, st_flags, 1)
 
 extern unsigned int fnic_log_level;
+extern unsigned int io_completions;
 
 #define FNIC_MAIN_LOGGING 0x01
 #define FNIC_FCS_LOGGING 0x02
@@ -196,6 +197,7 @@ enum fnic_state {
 #define FNIC_WQ_MAX 1
 #define FNIC_RQ_MAX 1
 #define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
+#define FNIC_DFLT_IO_COMPLETIONS 256
 
 struct mempool;
 
index 4e3a502..da4602b 100644 (file)
@@ -51,7 +51,7 @@ static irqreturn_t fnic_isr_legacy(int irq, void *data)
        }
 
        if (pba & (1 << FNIC_INTX_WQ_RQ_COPYWQ)) {
-               work_done += fnic_wq_copy_cmpl_handler(fnic, -1);
+               work_done += fnic_wq_copy_cmpl_handler(fnic, io_completions);
                work_done += fnic_wq_cmpl_handler(fnic, -1);
                work_done += fnic_rq_cmpl_handler(fnic, -1);
 
@@ -72,7 +72,7 @@ static irqreturn_t fnic_isr_msi(int irq, void *data)
        fnic->fnic_stats.misc_stats.last_isr_time = jiffies;
        atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count);
 
-       work_done += fnic_wq_copy_cmpl_handler(fnic, -1);
+       work_done += fnic_wq_copy_cmpl_handler(fnic, io_completions);
        work_done += fnic_wq_cmpl_handler(fnic, -1);
        work_done += fnic_rq_cmpl_handler(fnic, -1);
 
@@ -125,7 +125,7 @@ static irqreturn_t fnic_isr_msix_wq_copy(int irq, void *data)
        fnic->fnic_stats.misc_stats.last_isr_time = jiffies;
        atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count);
 
-       wq_copy_work_done = fnic_wq_copy_cmpl_handler(fnic, -1);
+       wq_copy_work_done = fnic_wq_copy_cmpl_handler(fnic, io_completions);
        vnic_intr_return_credits(&fnic->intr[FNIC_MSIX_WQ_COPY],
                                 wq_copy_work_done,
                                 1 /* unmask intr */,
index 25e0414..1433ba9 100644 (file)
@@ -69,6 +69,11 @@ unsigned int fnic_log_level;
 module_param(fnic_log_level, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(fnic_log_level, "bit mask of fnic logging levels");
 
+
+unsigned int io_completions = FNIC_DFLT_IO_COMPLETIONS;
+module_param(io_completions, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(io_completions, "Max CQ entries to process at a time");
+
 unsigned int fnic_trace_max_pages = 16;
 module_param(fnic_trace_max_pages, uint, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(fnic_trace_max_pages, "Total allocated memory pages "
@@ -503,7 +508,7 @@ static int fnic_cleanup(struct fnic *fnic)
        }
 
        /* Clean up completed IOs and FCS frames */
-       fnic_wq_copy_cmpl_handler(fnic, -1);
+       fnic_wq_copy_cmpl_handler(fnic, io_completions);
        fnic_wq_cmpl_handler(fnic, -1);
        fnic_rq_cmpl_handler(fnic, -1);