summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSatish Kharat <satishkh@cisco.com>2019-01-14 20:09:29 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2019-01-22 21:18:34 -0500
commit18244e9445fef9eef7f3afd3b70a42b87be0f8fd (patch)
treea0c0ef1c05d6cc0a4bd098a698f5352a75e13fd9
parent68e3cc02bcfc4f55a47333ee7d8fe1a9b41d72c3 (diff)
scsi: fnic: Impose upper limit on max. # of CQs processed per intr
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>
-rw-r--r--drivers/scsi/fnic/fnic.h2
-rw-r--r--drivers/scsi/fnic/fnic_isr.c6
-rw-r--r--drivers/scsi/fnic/fnic_main.c7
3 files changed, 11 insertions, 4 deletions
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
index 5c9402c811c9..a3f20ae0add5 100644
--- a/drivers/scsi/fnic/fnic.h
+++ b/drivers/scsi/fnic/fnic.h
@@ -128,6 +128,7 @@
128 __fnic_set_state_flags(fnicp, st_flags, 1) 128 __fnic_set_state_flags(fnicp, st_flags, 1)
129 129
130extern unsigned int fnic_log_level; 130extern unsigned int fnic_log_level;
131extern unsigned int io_completions;
131 132
132#define FNIC_MAIN_LOGGING 0x01 133#define FNIC_MAIN_LOGGING 0x01
133#define FNIC_FCS_LOGGING 0x02 134#define FNIC_FCS_LOGGING 0x02
@@ -196,6 +197,7 @@ enum fnic_state {
196#define FNIC_WQ_MAX 1 197#define FNIC_WQ_MAX 1
197#define FNIC_RQ_MAX 1 198#define FNIC_RQ_MAX 1
198#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX) 199#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
200#define FNIC_DFLT_IO_COMPLETIONS 256
199 201
200struct mempool; 202struct mempool;
201 203
diff --git a/drivers/scsi/fnic/fnic_isr.c b/drivers/scsi/fnic/fnic_isr.c
index 4e3a50202e8c..da4602b63495 100644
--- a/drivers/scsi/fnic/fnic_isr.c
+++ b/drivers/scsi/fnic/fnic_isr.c
@@ -51,7 +51,7 @@ static irqreturn_t fnic_isr_legacy(int irq, void *data)
51 } 51 }
52 52
53 if (pba & (1 << FNIC_INTX_WQ_RQ_COPYWQ)) { 53 if (pba & (1 << FNIC_INTX_WQ_RQ_COPYWQ)) {
54 work_done += fnic_wq_copy_cmpl_handler(fnic, -1); 54 work_done += fnic_wq_copy_cmpl_handler(fnic, io_completions);
55 work_done += fnic_wq_cmpl_handler(fnic, -1); 55 work_done += fnic_wq_cmpl_handler(fnic, -1);
56 work_done += fnic_rq_cmpl_handler(fnic, -1); 56 work_done += fnic_rq_cmpl_handler(fnic, -1);
57 57
@@ -72,7 +72,7 @@ static irqreturn_t fnic_isr_msi(int irq, void *data)
72 fnic->fnic_stats.misc_stats.last_isr_time = jiffies; 72 fnic->fnic_stats.misc_stats.last_isr_time = jiffies;
73 atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count); 73 atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count);
74 74
75 work_done += fnic_wq_copy_cmpl_handler(fnic, -1); 75 work_done += fnic_wq_copy_cmpl_handler(fnic, io_completions);
76 work_done += fnic_wq_cmpl_handler(fnic, -1); 76 work_done += fnic_wq_cmpl_handler(fnic, -1);
77 work_done += fnic_rq_cmpl_handler(fnic, -1); 77 work_done += fnic_rq_cmpl_handler(fnic, -1);
78 78
@@ -125,7 +125,7 @@ static irqreturn_t fnic_isr_msix_wq_copy(int irq, void *data)
125 fnic->fnic_stats.misc_stats.last_isr_time = jiffies; 125 fnic->fnic_stats.misc_stats.last_isr_time = jiffies;
126 atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count); 126 atomic64_inc(&fnic->fnic_stats.misc_stats.isr_count);
127 127
128 wq_copy_work_done = fnic_wq_copy_cmpl_handler(fnic, -1); 128 wq_copy_work_done = fnic_wq_copy_cmpl_handler(fnic, io_completions);
129 vnic_intr_return_credits(&fnic->intr[FNIC_MSIX_WQ_COPY], 129 vnic_intr_return_credits(&fnic->intr[FNIC_MSIX_WQ_COPY],
130 wq_copy_work_done, 130 wq_copy_work_done,
131 1 /* unmask intr */, 131 1 /* unmask intr */,
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 25e0414b6cb0..1433ba94ea71 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -69,6 +69,11 @@ unsigned int fnic_log_level;
69module_param(fnic_log_level, int, S_IRUGO|S_IWUSR); 69module_param(fnic_log_level, int, S_IRUGO|S_IWUSR);
70MODULE_PARM_DESC(fnic_log_level, "bit mask of fnic logging levels"); 70MODULE_PARM_DESC(fnic_log_level, "bit mask of fnic logging levels");
71 71
72
73unsigned int io_completions = FNIC_DFLT_IO_COMPLETIONS;
74module_param(io_completions, int, S_IRUGO|S_IWUSR);
75MODULE_PARM_DESC(io_completions, "Max CQ entries to process at a time");
76
72unsigned int fnic_trace_max_pages = 16; 77unsigned int fnic_trace_max_pages = 16;
73module_param(fnic_trace_max_pages, uint, S_IRUGO|S_IWUSR); 78module_param(fnic_trace_max_pages, uint, S_IRUGO|S_IWUSR);
74MODULE_PARM_DESC(fnic_trace_max_pages, "Total allocated memory pages " 79MODULE_PARM_DESC(fnic_trace_max_pages, "Total allocated memory pages "
@@ -503,7 +508,7 @@ static int fnic_cleanup(struct fnic *fnic)
503 } 508 }
504 509
505 /* Clean up completed IOs and FCS frames */ 510 /* Clean up completed IOs and FCS frames */
506 fnic_wq_copy_cmpl_handler(fnic, -1); 511 fnic_wq_copy_cmpl_handler(fnic, io_completions);
507 fnic_wq_cmpl_handler(fnic, -1); 512 fnic_wq_cmpl_handler(fnic, -1);
508 fnic_rq_cmpl_handler(fnic, -1); 513 fnic_rq_cmpl_handler(fnic, -1);
509 514