lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 234/315] PCI: aardvark: Dont rely on jiffies while holding spinlock
    Date
    From: Remi Pommarel <repk@triplefau.lt>

    commit 7fbcb5da811be7d47468417c7795405058abb3da upstream.

    advk_pcie_wait_pio() can be called while holding a spinlock (from
    pci_bus_read_config_dword()), then depends on jiffies in order to
    timeout while polling on PIO state registers. In the case the PIO
    transaction failed, the timeout will never happen and will also cause
    the cpu to stall.

    This decrements a variable and wait instead of using jiffies.

    Signed-off-by: Remi Pommarel <repk@triplefau.lt>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Andrew Murray <andrew.murray@arm.com>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/pci/host/pci-aardvark.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    --- a/drivers/pci/host/pci-aardvark.c
    +++ b/drivers/pci/host/pci-aardvark.c
    @@ -185,7 +185,8 @@
    (PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn)) | \
    PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where))

    -#define PIO_TIMEOUT_MS 1
    +#define PIO_RETRY_CNT 500
    +#define PIO_RETRY_DELAY 2 /* 2 us*/

    #define LINK_WAIT_MAX_RETRIES 10
    #define LINK_WAIT_USLEEP_MIN 90000
    @@ -413,17 +414,16 @@ static void advk_pcie_check_pio_status(s
    static int advk_pcie_wait_pio(struct advk_pcie *pcie)
    {
    struct device *dev = &pcie->pdev->dev;
    - unsigned long timeout;
    -
    - timeout = jiffies + msecs_to_jiffies(PIO_TIMEOUT_MS);
    + int i;

    - while (time_before(jiffies, timeout)) {
    + for (i = 0; i < PIO_RETRY_CNT; i++) {
    u32 start, isr;

    start = advk_readl(pcie, PIO_START);
    isr = advk_readl(pcie, PIO_ISR);
    if (!start && isr)
    return 0;
    + udelay(PIO_RETRY_DELAY);
    }

    dev_err(dev, "config read/write timed out\n");

    \
     
     \ /
      Last update: 2021-07-19 18:10    [W:2.761 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site