max_nvme_queues was computed as min(IBMVFC_MAX_NVME_QUEUES, online_cpus),
silently ignoring the nr_nvme_hw_queues module parameter.  The SCSI path
correctly caps shost->nr_hw_queues with nr_scsi_hw_queues, but the NVMe
equivalent was never applied, making the 'nvme_host_queues' parameter a
no-op.

Apply the same pattern as the SCSI side: incorporate nr_nvme_hw_queues
into the max_nvme_queues calculation at probe time so that
nvme_scrqs.max_queues and nvme_scrqs.desired_queues both respect the
administrator-provided limit.

Fixes: 018fc3965291 ("scsi: ibmvfc: initialize NVMe channel configuration 
during driver probe")
Signed-off-by: Tyrel Datwyler <[email protected]>
---
 drivers/scsi/ibmvscsi/ibmvfc-core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc-core.c 
b/drivers/scsi/ibmvscsi/ibmvfc-core.c
index 914dafd576a0..ca9a0437fc0c 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc-core.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c
@@ -6871,7 +6871,9 @@ static int ibmvfc_probe(struct vio_dev *vdev, const 
struct vio_device_id *id)
        int rc = -ENOMEM;
        unsigned int online_cpus = num_online_cpus();
        unsigned int max_scsi_queues = min_t(unsigned int, 
IBMVFC_MAX_SCSI_QUEUES, online_cpus);
-       unsigned int max_nvme_queues = min_t(unsigned int, 
IBMVFC_MAX_NVME_QUEUES, online_cpus);
+       unsigned int max_nvme_queues = min_t(unsigned int,
+                                            min(IBMVFC_MAX_NVME_QUEUES, 
nr_nvme_hw_queues),
+                                            online_cpus);
 
        ENTER;
        shost = scsi_host_alloc(&driver_template, sizeof(*vhost));
-- 
2.55.0


Reply via email to