Commit dcecfcf2 authored by Shailend Chand's avatar Shailend Chand Committed by David S. Miller

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: default avatarMina Almasry <almasrymina@google.com>
Reviewed-by: default avatarPraveen Kaligineedi <pkaligineedi@google.com>
Reviewed-by: default avatarHarshitha Ramamurthy <hramamurthy@google.com>
Signed-off-by: default avatarShailend Chand <shailend@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 087b24de
...@@ -30,6 +30,9 @@ static void gve_rx_unfill_pages(struct gve_priv *priv, ...@@ -30,6 +30,9 @@ static void gve_rx_unfill_pages(struct gve_priv *priv,
u32 slots = rx->mask + 1; u32 slots = rx->mask + 1;
int i; int i;
if (!rx->data.page_info)
return;
if (rx->data.raw_addressing) { if (rx->data.raw_addressing) {
for (i = 0; i < slots; i++) for (i = 0; i < slots; i++)
gve_rx_free_buffer(&priv->pdev->dev, &rx->data.page_info[i], 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, ...@@ -69,20 +72,26 @@ static void gve_rx_free_ring_gqi(struct gve_priv *priv, struct gve_rx_ring *rx,
int idx = rx->q_num; int idx = rx->q_num;
size_t bytes; size_t bytes;
if (rx->desc.desc_ring) {
bytes = sizeof(struct gve_rx_desc) * cfg->ring_size; bytes = sizeof(struct gve_rx_desc) * cfg->ring_size;
dma_free_coherent(dev, bytes, rx->desc.desc_ring, rx->desc.bus); dma_free_coherent(dev, bytes, rx->desc.desc_ring, rx->desc.bus);
rx->desc.desc_ring = NULL; rx->desc.desc_ring = NULL;
}
if (rx->q_resources) {
dma_free_coherent(dev, sizeof(*rx->q_resources), dma_free_coherent(dev, sizeof(*rx->q_resources),
rx->q_resources, rx->q_resources_bus); rx->q_resources, rx->q_resources_bus);
rx->q_resources = NULL; rx->q_resources = NULL;
}
gve_rx_unfill_pages(priv, rx, cfg); gve_rx_unfill_pages(priv, rx, cfg);
if (rx->data.data_ring) {
bytes = sizeof(*rx->data.data_ring) * slots; bytes = sizeof(*rx->data.data_ring) * slots;
dma_free_coherent(dev, bytes, rx->data.data_ring, dma_free_coherent(dev, bytes, rx->data.data_ring,
rx->data.data_bus); rx->data.data_bus);
rx->data.data_ring = NULL; rx->data.data_ring = NULL;
}
kvfree(rx->qpl_copy_pool); kvfree(rx->qpl_copy_pool);
rx->qpl_copy_pool = NULL; rx->qpl_copy_pool = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment