]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
scsi: megaraid_sas: reduce module load time
authorSteve Sistare <steven.sistare@oracle.com>
Fri, 1 Mar 2019 14:46:28 +0000 (06:46 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 7 Mar 2019 00:26:45 +0000 (19:26 -0500)
megaraid_sas takes 1+ seconds to load while waiting for firmware:

[2.822603] megaraid_sas 0000:03:00.0: Waiting for FW to come to ready state
[3.871003] megaraid_sas 0000:03:00.0: FW now in Ready state

This is due to the following loop in megasas_transition_to_ready(), which
waits a minimum of 1 second, even though the FW becomes ready in tens of
millisecs:

        /*
         * The cur_state should not last for more than max_wait secs
         */
        for (i = 0; i < max_wait; i++) {
                ...
                msleep(1000);
        ...
        dev_info(&instance->pdev->dev, "FW now in Ready state\n");

This is a regression, caused by a change of the msleep granularity from 1
to 1000 due to concern about waiting too long on systems with coarse
jiffies.

To fix, increase iterations and use msleep(20), which results in:

[2.670627] megaraid_sas 0000:03:00.0: Waiting for FW to come to ready state
[2.739386] megaraid_sas 0000:03:00.0: FW now in Ready state

Fixes: fb2f3e96d80f ("scsi: megaraid_sas: Fix msleep granularity")
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Acked-by: Sumit Saxena <sumit.saxena@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas_base.c

index 8a2ee4cf26b078e31f935711fea2c74610a879ea..387fb930f79961e2f3f91209f8db2c9f9ebd26b0 100644 (file)
@@ -3924,12 +3924,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
                /*
                 * The cur_state should not last for more than max_wait secs
                 */
-               for (i = 0; i < max_wait; i++) {
+               for (i = 0; i < max_wait * 50; i++) {
                        curr_abs_state = instance->instancet->
                                read_fw_status_reg(instance);
 
                        if (abs_state == curr_abs_state) {
-                               msleep(1000);
+                               msleep(20);
                        } else
                                break;
                }