09/07/2026 06:07, Joshua Washington:
> The GQ TX datapath was set up to write the mbuf head into the sw_ring
> before writing the descriptors. This poses a problem because it's
> possible for the packet to be dropped due to lacking the FIFO space to
> do a proper TX. In such a case, the packet won't be sent, and will lead
> to leaked mbufs in the subsequent segments.
> 
> There is also no real reason that the head mbuf must be set in the
> sw_ring separately from the others; the mbuf chain is not actually
> walked as part of GQ TX.
> 
> Fixes: a46583cf43c8 ("net/gve: support Rx/Tx")
> Cc: [email protected]
> Signed-off-by: Joshua Washington <[email protected]>
> Reviewed-by: Jasper Tran O'Leary <[email protected]>

AI found this issue:

**Error:** Resource leak on early return from `gve_tx_burst_qpl()`.

The patch modifies the loop to store mbufs in `sw_ring` only after checking 
FIFO availability, but introduces a leak when `goto end_of_tx` is taken after 
the first segment has been processed. At line 306-307:

```c
if (!is_fifo_avail(txq, hlen)) {
    gve_tx_clean(txq);
    if (!is_fifo_avail(txq, hlen))
        goto end_of_tx;
}
```

If the second `is_fifo_avail()` check fails and we `goto end_of_tx`, the 
current `tx_pkt` (which is the mbuf chain head) has not been added to `sw_ring` 
yet (that happens later in the modified loop at lines 346-351). The function 
will return without freeing `tx_pkt`, and the mbuf chain is lost.

**Suggested fix:** Free the current packet before `goto end_of_tx`:

```c
if (!is_fifo_avail(txq, hlen)) {
    gve_tx_clean(txq);
    if (!is_fifo_avail(txq, hlen)) {
        rte_pktmbuf_free(tx_pkt);
        goto end_of_tx;
    }
}
```

Similarly, for the TSO path at lines 314-316, if the FIFO space check fails, 
`tx_pkt` should be freed before the goto.



Reply via email to