lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 255/639] scsi: megaraid_sas: reduce module load time
    Date
    From: Steve Sistare <steven.sistare@oracle.com>

    [ Upstream commit 31b6a05f86e690e1818116fd23c3be915cc9d9ed ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 2f31d266339f8..99469f9057eea 100644
    --- a/drivers/scsi/megaraid/megaraid_sas_base.c
    +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
    @@ -3894,12 +3894,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->reg_set);

    if (abs_state == curr_abs_state) {
    - msleep(1000);
    + msleep(20);
    } else
    break;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:43    [W:4.153 / U:0.444 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site