OOPS, I forgot to add the RFC tag. Just to clarify: this series is still an RFC.
Cheers, Eelco On 26 Sep 2025, at 13:41, Eelco Chaudron via dev wrote: > This RFC patch series introduces a major architectural > refactoring of Open vSwitch's hardware offload > infrastructure. It replaces the tightly coupled > `netdev-offload` implementation with a new, modular > `dpif-offload-provider` framework. > > MOTIVATION > ------------------------------------------------------------- > The existing `netdev-offload` API tightly couples datapath > implementations (like `dpif-netdev`) with specific offload > technologies (rte_flow). This design has several > limitations: > > - Rigid Architecture: It creates complex dependencies, > making the code difficult to maintain and extend. > > - Limited Flexibility: Supporting multiple offload backends > simultaneously or adding new ones is cumbersome. > > - Inconsistent APIs: The logic for handling different > offload types is scattered, leading to an inconsistent > and hard-to-follow API surface. > > This refactoring aims to resolve these issues by creating a > clean separation of concerns, improving modularity, and > establishing a clear path for future hardware offload > integrations. > > PROPOSED SOLUTION: THE `DPIF-OFFLOAD-PROVIDER` FRAMEWORK > ------------------------------------------------------------- > This series introduces the `dpif-offload-provider` > framework, which functions similarly to the existing > `dpif-provider` pattern. It treats hardware offload as a > distinct layer with multiple, dynamically selectable > backends. > > Key features of the new framework include: > > 1. Modular Architecture: A clean separation between the > generic datapath interface and specific offload > provider implementations (e.g., `dpif-offload-tc`, > `dpif-offload-rte_flow`). `dpif` layers are now generic > clients of the offload API. > > 2. Provider-based System: Allows multiple offload backends > to coexist. > > 3. Unified and Asynchronous API: Establishes a consistent > API across all offload providers. For userspace > datapaths, the API is extended to support asynchronous > flow operations with callbacks, making `dpif-netdev` a > more efficient client. > > 4. Enhanced Configuration: Provides granular control over > offload provider selection through a global and per-port > priority system (`hw-offload-priority`), allowing > fine-tuned policies for different hardware. > > 5. Improved Testing: Includes a new test framework > specifically for validating RTE_Flow offloads, enhancing > long-term maintainability. > > PATCH SERIES ORGANIZATION > ------------------------------------------------------------- > This large series is organized logically to facilitate > review: > > 1. Framework Foundation: The initial patches establish the > core `dpif-offload-provider` framework, including the > necessary APIs for port management, flow mark > allocation, configuration, and a dummy provider for > testing. > > 2. Provider Implementation: These patches introduce the new > `dpif-offload-tc` and `dpif-offload-rte_flow` providers, > building out their specific implementations on top of > the new framework. > > 3. API Migration and Decoupling: The bulk of the series > systematically migrates functionality from the legacy > `netdev-offload` layer to the new providers. Key > commits here decouple `dpif-netdev` and, crucially, > `dpif-netlink` from their hardware offload > entanglements. > > 4. Cleanup: The final patches remove the now-redundant > global APIs and structures from `netdev-offload`, > completing the transition. > > BACKWARD COMPATIBILITY > ------------------------------------------------------------- > This refactoring maintains full API compatibility from a > user's perspective. All existing `ovs-vsctl` and > `ovs-appctl` commands continue to function as before. The > changes are primarily internal architectural improvements > designed to make OVS more robust and extensible. > > REQUEST FOR COMMENTS > ------------------------------------------------------------- > This is a significant architectural change that affects > core OVS infrastructure. We welcome feedback on: > > - The overall architectural approach and the > `dpif-offload-provider` concept. > - The API design, particularly the new asynchronous model > for `dpif-netdev`. > - The migration strategy and any potential backward > compatibility concerns. > - Performance implications of the new framework. > > ------------------------------------------------------------- > > v2: > - Fixed some minor AI review comments (see individual patches) > - Fix some Coverity issues reported on this patch set. > - Fixed and investigated some rte_flow unit test. > > > Eelco Chaudron (41): > dpif-offload-provider: Add dpif-offload-provider implementation. > dpif-offload: Add provider for tc offload. > dpif-offload: Add provider for rte_flow. > dpif-offload: Allow configuration of offload provider priority. > dpif-offload: Move hw-offload configuration to dpif-offload. > dpif-offload: Add offload provider set_config API. > dpif-offload: Add port registration and management APIs. > dpif-offload-tc: Add port management framework. > dpif-offload-rte_flow: Add port management framework. > dpif-offload: Validate mandatory port class callbacks on registration. > dpif-offload: Allow per-port offload provider priority config. > dpif-offload: Introduce provider debug information API. > dpif-offload: Call flow-flush netdev-offload APIs via dpif-offload. > dpif-offload: Call meter netdev-offload APIs via dpif-offload. > dpif-offload: Move the flow_get_n_flows() netdev-offload API to dpif. > dpif-offload: Move the hw_miss_packet_recover netdev API to dpif. > dpif-offload: Add flow dump APIs to dpif-offload. > dpif-offload: Move the tc flow dump netdev APIs to dpif-offload. > dpif-netlink: Remove netlink-offload integration. > dpif-netlink: Add API to get offloaded netdev from port_id. > dpif-offload: Add API to find offload implementation type. > dpif-offload: Add operate implementation to dpif-offload. > netdev-offload: Temporarily move thread-related APIs to dpif-netdev. > dpif-offload: Add port dump APIs to dpif-offload. > dpif-netdev: Remove indirect DPDK netdev offload API calls. > dpif: Add dpif_get_features() API. > dpif-offload: Add flow operations to dpif-offload-tc. > dpif-netlink: Remove entangled hardware offload. > dpif-offload-tc: Remove netdev-offload dependency. > netdev_dummy: Remove hardware offload override. > dpif-offload: Move the netdev_any_oor() API to dpif-offload. > netdev-offload: Remove the global netdev-offload API. > dpif-offload: Add flow mark allocation API. > dpif-offload: Add inline flow APIs for userspace datapaths. > dpif_netdev: Fix nullable memcpy in queue_netdev_flow_put(). > dpif-offload: Move offload_stats_get() API to dpif-offload. > dpif-netdev: Add full name to the dp_netdev structure. > dpif-offload-rte: Abstract rte_flow implementation from dpif-netdev. > dpif-offload-dummy: Add flow add/del/get APIs. > tests: Fix NSH decap header test for real Ethernet devices. > tests: Add a simple rte_flow test framework. > > Documentation/topics/testing.rst | 19 + > include/openvswitch/json.h | 1 + > include/openvswitch/netdev.h | 1 + > lib/automake.mk | 12 +- > lib/dpctl.c | 50 +- > lib/dpdk.c | 2 - > lib/dpif-netdev-avx512.c | 3 +- > lib/dpif-netdev-private-flow.h | 5 - > lib/dpif-netdev.c | 1090 +++---------- > lib/dpif-netlink.c | 556 +------ > lib/dpif-offload-dummy.c | 642 ++++++++ > lib/dpif-offload-provider.h | 399 +++++ > lib/dpif-offload-rte_flow-private.h | 34 + > lib/dpif-offload-rte_flow.c | 1228 ++++++++++++++ > lib/dpif-offload-tc.c | 873 ++++++++++ > lib/dpif-offload.c | 1805 +++++++++++++++++++++ > lib/dpif-offload.h | 214 +++ > lib/dpif-provider.h | 65 +- > lib/dpif.c | 139 +- > lib/dpif.h | 14 +- > lib/dummy.h | 9 + > lib/json.c | 7 + > lib/netdev-dpdk.c | 9 +- > lib/netdev-dpdk.h | 2 +- > lib/netdev-dummy.c | 199 +-- > lib/netdev-linux.c | 3 +- > lib/netdev-offload-dpdk.c | 178 +- > lib/netdev-offload-dpdk.h | 51 + > lib/netdev-offload-provider.h | 148 -- > lib/netdev-offload-tc.c | 261 +-- > lib/netdev-offload-tc.h | 76 + > lib/netdev-offload.c | 838 +--------- > lib/netdev-offload.h | 118 -- > lib/netdev-provider.h | 9 +- > lib/netdev.c | 18 +- > lib/netdev.h | 1 + > ofproto/ofproto-dpif-upcall.c | 47 +- > ofproto/ofproto-dpif.c | 89 +- > tests/.gitignore | 3 + > tests/automake.mk | 24 + > tests/dpif-netdev.at | 22 +- > tests/ofproto-dpif.at | 164 ++ > tests/ofproto-macros.at | 17 +- > tests/system-dpdk.at | 35 + > tests/system-kmod-macros.at | 5 + > tests/system-offloads-testsuite-macros.at | 5 + > tests/system-offloads-traffic.at | 44 + > tests/system-rte-offloads-macros.at | 230 +++ > tests/system-rte-offloads-testsuite.at | 28 + > tests/system-rte-offloads.at | 111 ++ > tests/system-traffic.at | 8 +- > tests/system-userspace-macros.at | 5 + > vswitchd/bridge.c | 6 +- > vswitchd/vswitch.xml | 42 + > 54 files changed, 6874 insertions(+), 3090 deletions(-) > create mode 100644 lib/dpif-offload-dummy.c > create mode 100644 lib/dpif-offload-provider.h > create mode 100644 lib/dpif-offload-rte_flow-private.h > create mode 100644 lib/dpif-offload-rte_flow.c > create mode 100644 lib/dpif-offload-tc.c > create mode 100644 lib/dpif-offload.c > create mode 100644 lib/dpif-offload.h > create mode 100644 lib/netdev-offload-dpdk.h > delete mode 100644 lib/netdev-offload-provider.h > create mode 100644 lib/netdev-offload-tc.h > create mode 100644 tests/system-rte-offloads-macros.at > create mode 100644 tests/system-rte-offloads-testsuite.at > create mode 100644 tests/system-rte-offloads.at > > -- > 2.50.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
