| From 8850acfa274205d766de71351a9d3ede2002d288 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 12 May 2022 22:49:00 +0530 |
| Subject: net: macb: Increment rx bd head after allocating skb and buffer |
| |
| From: Harini Katakam <harini.katakam@xilinx.com> |
| |
| [ Upstream commit 9500acc631dbb8b73166e25700e656b11f6007b6 ] |
| |
| In gem_rx_refill rx_prepared_head is incremented at the beginning of |
| the while loop preparing the skb and data buffers. If the skb or data |
| buffer allocation fails, this BD will be unusable BDs until the head |
| loops back to the same BD (and obviously buffer allocation succeeds). |
| In the unlikely event that there's a string of allocation failures, |
| there will be an equal number of unusable BDs and an inconsistent RX |
| BD chain. Hence increment the head at the end of the while loop to be |
| clean. |
| |
| Fixes: 4df95131ea80 ("net/macb: change RX path for GEM") |
| Signed-off-by: Harini Katakam <harini.katakam@xilinx.com> |
| Signed-off-by: Michal Simek <michal.simek@xilinx.com> |
| Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com> |
| Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Link: https://lore.kernel.org/r/20220512171900.32593-1-harini.katakam@xilinx.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/cadence/macb_main.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
| index d8e4842af055..50331b202f73 100644 |
| --- a/drivers/net/ethernet/cadence/macb_main.c |
| +++ b/drivers/net/ethernet/cadence/macb_main.c |
| @@ -915,7 +915,6 @@ static void gem_rx_refill(struct macb_queue *queue) |
| /* Make hw descriptor updates visible to CPU */ |
| rmb(); |
| |
| - queue->rx_prepared_head++; |
| desc = macb_rx_desc(queue, entry); |
| |
| if (!queue->rx_skbuff[entry]) { |
| @@ -954,6 +953,7 @@ static void gem_rx_refill(struct macb_queue *queue) |
| dma_wmb(); |
| desc->addr &= ~MACB_BIT(RX_USED); |
| } |
| + queue->rx_prepared_head++; |
| } |
| |
| /* Make descriptor updates visible to hardware */ |
| -- |
| 2.35.1 |
| |