| From bb7c7164148e9df08d6a05213c1ab96ec8ea3d5f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 16 Jul 2024 10:10:41 -0700 |
| Subject: gve: Fix XDP TX completion handling when counters overflow |
| |
| From: Joshua Washington <joshwash@google.com> |
| |
| [ Upstream commit 03b54bad26f3c78bb1f90410ec3e4e7fe197adc9 ] |
| |
| In gve_clean_xdp_done, the driver processes the TX completions based on |
| a 32-bit NIC counter and a 32-bit completion counter stored in the tx |
| queue. |
| |
| Fix the for loop so that the counter wraparound is handled correctly. |
| |
| Fixes: 75eaae158b1b ("gve: Add XDP DROP and TX support for GQI-QPL format") |
| Signed-off-by: Joshua Washington <joshwash@google.com> |
| Signed-off-by: Praveen Kaligineedi <pkaligineedi@google.com> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Link: https://patch.msgid.link/20240716171041.1561142-1-pkaligineedi@google.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/google/gve/gve_tx.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c |
| index 24a64ec1073e2..e7fb7d6d283df 100644 |
| --- a/drivers/net/ethernet/google/gve/gve_tx.c |
| +++ b/drivers/net/ethernet/google/gve/gve_tx.c |
| @@ -158,15 +158,16 @@ static int gve_clean_xdp_done(struct gve_priv *priv, struct gve_tx_ring *tx, |
| u32 to_do) |
| { |
| struct gve_tx_buffer_state *info; |
| - u32 clean_end = tx->done + to_do; |
| u64 pkts = 0, bytes = 0; |
| size_t space_freed = 0; |
| u32 xsk_complete = 0; |
| u32 idx; |
| + int i; |
| |
| - for (; tx->done < clean_end; tx->done++) { |
| + for (i = 0; i < to_do; i++) { |
| idx = tx->done & tx->mask; |
| info = &tx->info[idx]; |
| + tx->done++; |
| |
| if (unlikely(!info->xdp.size)) |
| continue; |
| -- |
| 2.43.0 |
| |