Re: [PATCH V1] scsi: megaraid_sas: reduce module load time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Mar 1, 2019 at 8:27 PM Steve Sistare <steven.sistare@xxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxx>

Acked-by: Sumit Saxena <sumit.saxena@xxxxxxxxxxxx>

> ---
>  drivers/scsi/megaraid/megaraid_sas_base.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
> index a30c1b3..a707af5 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -3932,12 +3932,12 @@ static irqreturn_t megasas_isr(int irq, void *devp)
>                 /*
>                  * 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;
>                 }
> --
> 1.8.3.1
>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux