On Tue,  3 Mar 2026 00:58:00 +0000
"Jasper Tran O'Leary" <[email protected]> wrote:

> This patch series adds flow steering support to the Google Virtual
> Ethernet (gve) driver. This functionality allows traffic to be directed
> to specific receive queues based on user-specified flow patterns.
> 
> The series includes foundational support for extended admin queue
> commands needed to handle flow rules, the specific adminqueue commands
> for flow rule management, and the integration with the DPDK rte_flow
> API. The series adds support flow matching on the following protocols:
> IPv4, IPv6, TCP, UDP, SCTP, ESP, and AH.
> 
> Patch Overview:
> 
> 1. "net/gve: add flow steering device option" checks for and enables
>    the flow steering capability in the device options during
>    initialization.
> 2. "net/gve: introduce extended adminq command" adds infrastructure
>    for sending extended admin queue commands. These commands use a
>    flexible buffer descriptor format required for flow rule management.
> 3. "net/gve: add adminq commands for flow steering" implements the
>    specific admin queue commands to add and remove flow rules on the
>    device, including handling of rule IDs and parameters.
> 4. "net/gve: add rte flow API integration" exposes the flow steering
>    functionality via the DPDK rte_flow API. This includes strict
>    pattern validation, rule parsing, and lifecycle management (create,
>    destroy, flush). It ensures thread-safe access to the flow subsystem
>    and proper resource cleanup during device reset.
> 
> Jasper Tran O'Leary (2):
>   net/gve: add adminq commands for flow steering
>   net/gve: add rte flow API integration
> 
> Vee Agarwal (2):
>   net/gve: add flow steering device option
>   net/gve: introduce extended adminq command
> 
>  doc/guides/nics/features/gve.ini       |  12 +
>  doc/guides/nics/gve.rst                |  26 +
>  doc/guides/rel_notes/release_26_03.rst |   1 +
>  drivers/net/gve/base/gve.h             |   3 +-
>  drivers/net/gve/base/gve_adminq.c      | 118 ++++-
>  drivers/net/gve/base/gve_adminq.h      |  57 +++
>  drivers/net/gve/gve_ethdev.c           |  83 +++-
>  drivers/net/gve/gve_ethdev.h           |  46 ++
>  drivers/net/gve/gve_flow_rule.c        | 656 +++++++++++++++++++++++++
>  drivers/net/gve/gve_flow_rule.h        |  65 +++
>  drivers/net/gve/meson.build            |   1 +
>  11 files changed, 1063 insertions(+), 5 deletions(-)
>  create mode 100644 dpdk/drivers/net/gve/gve_flow_rule.c
>  create mode 100644 dpdk/drivers/net/gve/gve_flow_rule.h
> 

Automated review spotted a few things:

1. rte_bitmap_scan usage is incorrect.
2. Using rte_malloc where not necessary
3. Grammar in the release note.

I can fix the last one when merging, the second one is not a big issue
but would be good to have.

---


Error: Incorrect rte_bitmap_scan usage — wrong rule ID allocation (~85% 
confidence)

In gve_create_flow_rule():
c

uint64_t bmp_slab __rte_unused;
...
if (rte_bitmap_scan(priv->avail_flow_rule_bmp, &flow->rule_id,
        &bmp_slab) == 1) {
    rte_bitmap_clear(priv->avail_flow_rule_bmp, flow->rule_id);
}

rte_bitmap_scan() writes the slab base position to pos and the slab bit pattern 
to slab. The actual bit position of the first available rule is pos + 
__builtin_ctzll(slab), not pos alone. The __rte_unused annotation on bmp_slab 
confirms the slab value is being ignored entirely.

After the first rule allocation clears bit 0, a subsequent scan returns the 
same slab base (pos=0) with bit 0 now clear in the slab. The code would again 
set rule_id=0 and attempt to clear an already-clear bit, then try to create a 
duplicate rule on the device.

Suggested fix:
c

uint64_t bmp_slab;
uint32_t pos;
...
if (rte_bitmap_scan(priv->avail_flow_rule_bmp, &pos,
        &bmp_slab) == 1) {
    flow->rule_id = pos + __builtin_ctzll(bmp_slab);
    rte_bitmap_clear(priv->avail_flow_rule_bmp, flow->rule_id);
}

Warning: rte_zmalloc used for ordinary control structures

Both avail_flow_rule_bmp_mem and individual gve_flow structures are allocated 
with rte_zmalloc, but they don't require DMA access, NUMA placement, or 
multi-process shared memory. Standard calloc/malloc would be more appropriate 
and wouldn't consume limited hugepage resources.

Warning: Release notes tense inconsistency
rst

* Added application-initiated device reset.
+ * Add support for receive flow steering.

"Added" (past tense) vs "Add" (imperative). Both entries should use the same 
tense for consistency. The DPDK convention is imperative mood.

Reply via email to