| From bebc12c98d03b66eecf98eaf35a1d5d35bc63500 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 15 Sep 2018 12:02:46 +0800 |
| Subject: net: socionext: Fix two sleep-in-atomic-context bugs in |
| ave_rxfifo_reset() |
| |
| From: Jia-Ju Bai <baijiaju1990@gmail.com> |
| |
| [ Upstream commit 0020f5c807ef67954d9210eea0ba17a6134cdf7d ] |
| |
| The driver may sleep with holding a spinlock. |
| The function call paths (from bottom to top) in Linux-4.17 are: |
| |
| [FUNC] usleep_range |
| drivers/net/ethernet/socionext/sni_ave.c, 892: |
| usleep_range in ave_rxfifo_reset |
| drivers/net/ethernet/socionext/sni_ave.c, 932: |
| ave_rxfifo_reset in ave_irq_handler |
| |
| [FUNC] usleep_range |
| drivers/net/ethernet/socionext/sni_ave.c, 888: |
| usleep_range in ave_rxfifo_reset |
| drivers/net/ethernet/socionext/sni_ave.c, 932: |
| ave_rxfifo_reset in ave_irq_handler |
| |
| To fix these bugs, usleep_range() is replaced with udelay(). |
| |
| These bugs are found by my static analysis tool DSAC. |
| |
| Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/socionext/sni_ave.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c |
| index f27d67a4d3045..09d25b87cf7c0 100644 |
| --- a/drivers/net/ethernet/socionext/sni_ave.c |
| +++ b/drivers/net/ethernet/socionext/sni_ave.c |
| @@ -906,11 +906,11 @@ static void ave_rxfifo_reset(struct net_device *ndev) |
| |
| /* assert reset */ |
| writel(AVE_GRR_RXFFR, priv->base + AVE_GRR); |
| - usleep_range(40, 50); |
| + udelay(50); |
| |
| /* negate reset */ |
| writel(0, priv->base + AVE_GRR); |
| - usleep_range(10, 20); |
| + udelay(20); |
| |
| /* negate interrupt status */ |
| writel(AVE_GI_RXOVF, priv->base + AVE_GISR); |
| -- |
| 2.20.1 |
| |