Multiqueue devices should only allocate queues for the housekeeping CPUs
when isolcpus=managed_irq is set. This avoids that the isolated CPUs get
disturbed with OS workload.

Use helpers which calculates the correct number of queues which should
be used when isolcpus is used.

Reviewed-by: Martin K. Petersen <martin.peter...@oracle.com>
Reviewed-by: Hannes Reinecke <h...@suse.de>
Signed-off-by: Daniel Wagner <w...@kernel.org>
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++++++++------
 drivers/scsi/qla2xxx/qla_isr.c            | 10 +++++-----
 drivers/scsi/smartpqi/smartpqi_init.c     |  5 ++---
 3 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 
28c75865967af36c6390c5ee5767577ec1bcf779..a5f1117f3ddb20da04e0b29fd9d52d47ed1af3d8
 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5962,7 +5962,8 @@ megasas_alloc_irq_vectors(struct megasas_instance 
*instance)
                else
                        instance->iopoll_q_count = 0;
 
-               num_msix_req = num_online_cpus() + 
instance->low_latency_index_start;
+               num_msix_req = blk_mq_num_online_queues(0) +
+                       instance->low_latency_index_start;
                instance->msix_vectors = min(num_msix_req,
                                instance->msix_vectors);
 
@@ -5978,7 +5979,8 @@ megasas_alloc_irq_vectors(struct megasas_instance 
*instance)
                /* Disable Balanced IOPS mode and try realloc vectors */
                instance->perf_mode = MR_LATENCY_PERF_MODE;
                instance->low_latency_index_start = 1;
-               num_msix_req = num_online_cpus() + 
instance->low_latency_index_start;
+               num_msix_req = blk_mq_num_online_queues(0) +
+                       instance->low_latency_index_start;
 
                instance->msix_vectors = min(num_msix_req,
                                instance->msix_vectors);
@@ -6234,7 +6236,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
                intr_coalescing = (scratch_pad_1 & 
MR_INTR_COALESCING_SUPPORT_OFFSET) ?
                                                                true : false;
                if (intr_coalescing &&
-                       (num_online_cpus() >= MR_HIGH_IOPS_QUEUE_COUNT) &&
+                       (blk_mq_num_online_queues(0) >= 
MR_HIGH_IOPS_QUEUE_COUNT) &&
                        (instance->msix_vectors == MEGASAS_MAX_MSIX_QUEUES))
                        instance->perf_mode = MR_BALANCED_PERF_MODE;
                else
@@ -6278,7 +6280,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
                else
                        instance->low_latency_index_start = 1;
 
-               num_msix_req = num_online_cpus() + 
instance->low_latency_index_start;
+               num_msix_req = blk_mq_num_online_queues(0) +
+                       instance->low_latency_index_start;
 
                instance->msix_vectors = min(num_msix_req,
                                instance->msix_vectors);
@@ -6310,8 +6313,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
        megasas_setup_reply_map(instance);
 
        dev_info(&instance->pdev->dev,
-               "current msix/online cpus\t: (%d/%d)\n",
-               instance->msix_vectors, (unsigned int)num_online_cpus());
+               "current msix/max num queues\t: (%d/%u)\n",
+               instance->msix_vectors, blk_mq_num_online_queues(0));
        dev_info(&instance->pdev->dev,
                "RDPQ mode\t: (%s)\n", instance->is_rdpq ? "enabled" : 
"disabled");
 
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 
fe98c76e9be32ff03a1960f366f0d700d1168383..c4c6b5c6658c0734f7ff68bcc31b33dde87296dd
 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -4533,13 +4533,13 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct 
rsp_que *rsp)
        if (USER_CTRL_IRQ(ha) || !ha->mqiobase) {
                /* user wants to control IRQ setting for target mode */
                ret = pci_alloc_irq_vectors(ha->pdev, min_vecs,
-                   min((u16)ha->msix_count, (u16)(num_online_cpus() + 
min_vecs)),
-                   PCI_IRQ_MSIX);
+                       blk_mq_num_online_queues(ha->msix_count) + min_vecs,
+                       PCI_IRQ_MSIX);
        } else
                ret = pci_alloc_irq_vectors_affinity(ha->pdev, min_vecs,
-                   min((u16)ha->msix_count, (u16)(num_online_cpus() + 
min_vecs)),
-                   PCI_IRQ_MSIX | PCI_IRQ_AFFINITY,
-                   &desc);
+                       blk_mq_num_online_queues(ha->msix_count) + min_vecs,
+                       PCI_IRQ_MSIX | PCI_IRQ_AFFINITY,
+                       &desc);
 
        if (ret < 0) {
                ql_log(ql_log_fatal, vha, 0x00c7,
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c 
b/drivers/scsi/smartpqi/smartpqi_init.c
index 
0da7be40c925807519f5bff8d428a29e5ce454a5..7212cb96d0f9a337578fa2b982afa3ee6d17f4be
 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -5278,15 +5278,14 @@ static void pqi_calculate_queue_resources(struct 
pqi_ctrl_info *ctrl_info)
        if (reset_devices) {
                num_queue_groups = 1;
        } else {
-               int num_cpus;
                int max_queue_groups;
 
                max_queue_groups = min(ctrl_info->max_inbound_queues / 2,
                        ctrl_info->max_outbound_queues - 1);
                max_queue_groups = min(max_queue_groups, PQI_MAX_QUEUE_GROUPS);
 
-               num_cpus = num_online_cpus();
-               num_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors);
+               num_queue_groups =
+                       blk_mq_num_online_queues(ctrl_info->max_msix_vectors);
                num_queue_groups = min(num_queue_groups, max_queue_groups);
        }
 

-- 
2.49.0


Reply via email to