lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 147/320] misc: lattice-ecp3-config: Fix task hung when firmware load failed
    Date
    From: Wei Yongjun <weiyongjun1@huawei.com>

    [ Upstream commit fcee5ce50bdb21116711e38635e3865594af907e ]

    When firmware load failed, kernel report task hung as follows:

    INFO: task xrun:5191 blocked for more than 147 seconds.
    Tainted: G W 5.16.0-rc5-next-20211220+ #11
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    task:xrun state:D stack: 0 pid: 5191 ppid: 270 flags:0x00000004
    Call Trace:
    __schedule+0xc12/0x4b50 kernel/sched/core.c:4986
    schedule+0xd7/0x260 kernel/sched/core.c:6369 (discriminator 1)
    schedule_timeout+0x7aa/0xa80 kernel/time/timer.c:1857
    wait_for_completion+0x181/0x290 kernel/sched/completion.c:85
    lattice_ecp3_remove+0x32/0x40 drivers/misc/lattice-ecp3-config.c:221
    spi_remove+0x72/0xb0 drivers/spi/spi.c:409

    lattice_ecp3_remove() wait for signals from firmware loading, but when
    load failed, firmware_load() does not send this signal. This cause
    device remove hung. Fix it by sending signal even if load failed.

    Fixes: 781551df57c7 ("misc: Add Lattice ECP3 FPGA configuration via SPI")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Link: https://lore.kernel.org/r/20211228125522.3122284-1-weiyongjun1@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/misc/lattice-ecp3-config.c | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    diff --git a/drivers/misc/lattice-ecp3-config.c b/drivers/misc/lattice-ecp3-config.c
    index 884485c3f7232..3a0d2b052ed29 100644
    --- a/drivers/misc/lattice-ecp3-config.c
    +++ b/drivers/misc/lattice-ecp3-config.c
    @@ -77,12 +77,12 @@ static void firmware_load(const struct firmware *fw, void *context)

    if (fw == NULL) {
    dev_err(&spi->dev, "Cannot load firmware, aborting\n");
    - return;
    + goto out;
    }

    if (fw->size == 0) {
    dev_err(&spi->dev, "Error: Firmware size is 0!\n");
    - return;
    + goto out;
    }

    /* Fill dummy data (24 stuffing bits for commands) */
    @@ -104,7 +104,7 @@ static void firmware_load(const struct firmware *fw, void *context)
    dev_err(&spi->dev,
    "Error: No supported FPGA detected (JEDEC_ID=%08x)!\n",
    jedec_id);
    - return;
    + goto out;
    }

    dev_info(&spi->dev, "FPGA %s detected\n", ecp3_dev[i].name);
    @@ -117,7 +117,7 @@ static void firmware_load(const struct firmware *fw, void *context)
    buffer = kzalloc(fw->size + 8, GFP_KERNEL);
    if (!buffer) {
    dev_err(&spi->dev, "Error: Can't allocate memory!\n");
    - return;
    + goto out;
    }

    /*
    @@ -156,7 +156,7 @@ static void firmware_load(const struct firmware *fw, void *context)
    "Error: Timeout waiting for FPGA to clear (status=%08x)!\n",
    status);
    kfree(buffer);
    - return;
    + goto out;
    }

    dev_info(&spi->dev, "Configuring the FPGA...\n");
    @@ -182,7 +182,7 @@ static void firmware_load(const struct firmware *fw, void *context)
    release_firmware(fw);

    kfree(buffer);
    -
    +out:
    complete(&data->fw_loaded);
    }

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-25 04:09    [W:4.036 / U:0.584 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site