Skip to content

Commit d4f9b88

Browse files
committed
Merge branch 'fix-rx-fatal-errors'
Jiawen Wu says: ==================== Fix Rx fatal errors There are some fatal errors on the Rx NAPI path, which can cause the kernel to crash. Fix known issues and potential risks. The part of the patches has been mentioned before[1]. [1]: https://lore.kernel.org/all/[email protected]/ v1: https://lore.kernel.org/[email protected] ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents e6176ab + d992ed7 commit d4f9b88

File tree

3 files changed

+10
-19
lines changed

3 files changed

+10
-19
lines changed

drivers/net/ethernet/wangxun/libwx/wx_hw.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,7 +1912,6 @@ static void wx_configure_rx_ring(struct wx *wx,
19121912
struct wx_ring *ring)
19131913
{
19141914
u16 reg_idx = ring->reg_idx;
1915-
union wx_rx_desc *rx_desc;
19161915
u64 rdba = ring->dma;
19171916
u32 rxdctl;
19181917

@@ -1942,9 +1941,9 @@ static void wx_configure_rx_ring(struct wx *wx,
19421941
memset(ring->rx_buffer_info, 0,
19431942
sizeof(struct wx_rx_buffer) * ring->count);
19441943

1945-
/* initialize Rx descriptor 0 */
1946-
rx_desc = WX_RX_DESC(ring, 0);
1947-
rx_desc->wb.upper.length = 0;
1944+
/* reset ntu and ntc to place SW in sync with hardware */
1945+
ring->next_to_clean = 0;
1946+
ring->next_to_use = 0;
19481947

19491948
/* enable receive descriptor ring */
19501949
wr32m(wx, WX_PX_RR_CFG(reg_idx),

drivers/net/ethernet/wangxun/libwx/wx_lib.c

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,6 @@ static void wx_dma_sync_frag(struct wx_ring *rx_ring,
174174
skb_frag_off(frag),
175175
skb_frag_size(frag),
176176
DMA_FROM_DEVICE);
177-
178-
/* If the page was released, just unmap it. */
179-
if (unlikely(WX_CB(skb)->page_released))
180-
page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false);
181177
}
182178

183179
static struct wx_rx_buffer *wx_get_rx_buffer(struct wx_ring *rx_ring,
@@ -227,10 +223,6 @@ static void wx_put_rx_buffer(struct wx_ring *rx_ring,
227223
struct sk_buff *skb,
228224
int rx_buffer_pgcnt)
229225
{
230-
if (!IS_ERR(skb) && WX_CB(skb)->dma == rx_buffer->dma)
231-
/* the page has been released from the ring */
232-
WX_CB(skb)->page_released = true;
233-
234226
/* clear contents of rx_buffer */
235227
rx_buffer->page = NULL;
236228
rx_buffer->skb = NULL;
@@ -315,7 +307,7 @@ static bool wx_alloc_mapped_page(struct wx_ring *rx_ring,
315307
return false;
316308
dma = page_pool_get_dma_addr(page);
317309

318-
bi->page_dma = dma;
310+
bi->dma = dma;
319311
bi->page = page;
320312
bi->page_offset = 0;
321313

@@ -352,7 +344,7 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count)
352344
DMA_FROM_DEVICE);
353345

354346
rx_desc->read.pkt_addr =
355-
cpu_to_le64(bi->page_dma + bi->page_offset);
347+
cpu_to_le64(bi->dma + bi->page_offset);
356348

357349
rx_desc++;
358350
bi++;
@@ -365,6 +357,8 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count)
365357

366358
/* clear the status bits for the next_to_use descriptor */
367359
rx_desc->wb.upper.status_error = 0;
360+
/* clear the length for the next_to_use descriptor */
361+
rx_desc->wb.upper.length = 0;
368362

369363
cleaned_count--;
370364
} while (cleaned_count);
@@ -2423,9 +2417,6 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring)
24232417
if (rx_buffer->skb) {
24242418
struct sk_buff *skb = rx_buffer->skb;
24252419

2426-
if (WX_CB(skb)->page_released)
2427-
page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false);
2428-
24292420
dev_kfree_skb(skb);
24302421
}
24312422

@@ -2449,6 +2440,9 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring)
24492440
}
24502441
}
24512442

2443+
/* Zero out the descriptor ring */
2444+
memset(rx_ring->desc, 0, rx_ring->size);
2445+
24522446
rx_ring->next_to_alloc = 0;
24532447
rx_ring->next_to_clean = 0;
24542448
rx_ring->next_to_use = 0;

drivers/net/ethernet/wangxun/libwx/wx_type.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,6 @@ enum wx_reset_type {
909909
struct wx_cb {
910910
dma_addr_t dma;
911911
u16 append_cnt; /* number of skb's appended */
912-
bool page_released;
913912
bool dma_released;
914913
};
915914

@@ -998,7 +997,6 @@ struct wx_tx_buffer {
998997
struct wx_rx_buffer {
999998
struct sk_buff *skb;
1000999
dma_addr_t dma;
1001-
dma_addr_t page_dma;
10021000
struct page *page;
10031001
unsigned int page_offset;
10041002
};

0 commit comments

Comments
 (0)