Skip to content

Commit dcecfcf

Browse files
shailend-gdavem330
authored andcommitted
gve: Make the GQ RX free queue funcs idempotent
Although this is not fixing any existing double free bug, making these functions idempotent allows for a simpler implementation of future ndo hooks that act on a single queue. Tested-by: Mina Almasry <almasrymina@google.com> Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com> Reviewed-by: Harshitha Ramamurthy <hramamurthy@google.com> Signed-off-by: Shailend Chand <shailend@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 087b24d commit dcecfcf

1 file changed

Lines changed: 19 additions & 10 deletions

File tree

drivers/net/ethernet/google/gve/gve_rx.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ static void gve_rx_unfill_pages(struct gve_priv *priv,
3030
u32 slots = rx->mask + 1;
3131
int i;
3232

33+
if (!rx->data.page_info)
34+
return;
35+
3336
if (rx->data.raw_addressing) {
3437
for (i = 0; i < slots; i++)
3538
gve_rx_free_buffer(&priv->pdev->dev, &rx->data.page_info[i],
@@ -69,20 +72,26 @@ static void gve_rx_free_ring_gqi(struct gve_priv *priv, struct gve_rx_ring *rx,
6972
int idx = rx->q_num;
7073
size_t bytes;
7174

72-
bytes = sizeof(struct gve_rx_desc) * cfg->ring_size;
73-
dma_free_coherent(dev, bytes, rx->desc.desc_ring, rx->desc.bus);
74-
rx->desc.desc_ring = NULL;
75+
if (rx->desc.desc_ring) {
76+
bytes = sizeof(struct gve_rx_desc) * cfg->ring_size;
77+
dma_free_coherent(dev, bytes, rx->desc.desc_ring, rx->desc.bus);
78+
rx->desc.desc_ring = NULL;
79+
}
7580

76-
dma_free_coherent(dev, sizeof(*rx->q_resources),
77-
rx->q_resources, rx->q_resources_bus);
78-
rx->q_resources = NULL;
81+
if (rx->q_resources) {
82+
dma_free_coherent(dev, sizeof(*rx->q_resources),
83+
rx->q_resources, rx->q_resources_bus);
84+
rx->q_resources = NULL;
85+
}
7986

8087
gve_rx_unfill_pages(priv, rx, cfg);
8188

82-
bytes = sizeof(*rx->data.data_ring) * slots;
83-
dma_free_coherent(dev, bytes, rx->data.data_ring,
84-
rx->data.data_bus);
85-
rx->data.data_ring = NULL;
89+
if (rx->data.data_ring) {
90+
bytes = sizeof(*rx->data.data_ring) * slots;
91+
dma_free_coherent(dev, bytes, rx->data.data_ring,
92+
rx->data.data_bus);
93+
rx->data.data_ring = NULL;
94+
}
8695

8796
kvfree(rx->qpl_copy_pool);
8897
rx->qpl_copy_pool = NULL;

0 commit comments

Comments
 (0)