Skip to content

Add: Support for DPDK 26.07, ICE 2.6.7 and IAVF 4.13.35 - #1698

Open
DawidWesierski4 wants to merge 1 commit into
mainfrom
driver/dpdk-26.07-ice-2.6.7
Open

Add: Support for DPDK 26.07, ICE 2.6.7 and IAVF 4.13.35#1698
DawidWesierski4 wants to merge 1 commit into
mainfrom
driver/dpdk-26.07-ice-2.6.7

Conversation

@DawidWesierski4

Copy link
Copy Markdown
Collaborator

versions.env now pins DPDK 26.07, ICE 2.6.7 and, for the first time, an IAVF version of its own (4.13.35 with download id 18159). DPDK_REPO and ICE_REPO go, because no script read either one.

patches/dpdk/26.07/ is the 26.03 series, rebased, less what upstream 26.07 already holds. Two of them come from work this branch did on the 26.03 series first, so the two series say the same thing:

  • 0001-net-iavf-disable-runtime-queue-setup-during-queue-rate-limiting takes RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP and its TX partner away always, as the 26.03 patch does. The first shape of this patch made the capability follow vf->qtc_map, but MTL reads dev_capa once in mt_dev_create, before it commits the rate limit hierarchy, so the capability was still on. MTL then started and stopped one Rx queue per session, and an E810 VF queue that stops once never receives again: run 33161105103 reported fb_rec 0 with rx_hw_dropped_packets past two million. The same patch also dropped its two added rte_free() calls. One of them freed vf->qtc_map, which upstream 26.07 gets from libc calloc(), so rte_free() read a malloc element header the DPDK heap never wrote and faulted in librte_eal (run 33155049621); the other freed a block the next line frees again.
  • 0008-pcapng-add-user-timestamp-support is a copy of the 26.03 patch of the same name, which the first draft of this series left out. That patch is the only source of MTL_DPDK_HAS_PCAPNG_TS and of rte_pcapng_copy_ts(), and upstream 26.07 holds neither, so lib/src/mt_pcap.h took its #else branch and built the stub mt_pcap_open(). St20_rx.pcap_dump then failed on every NIC with "no pcap support for this build" (run 33166408995). It applies to 26.07 with no offset and no fuzz. patches/dpdk/26.07/windows/0001-mingw-build-and-runtime-fixes.patch carries the Windows build over.
    Two 26.03 patch files are renamed to the subject line they carry. One of them held a colon in its file name, which Windows cannot check out. The style pull request makes that one rename on its own, with no change of content, so after it lands only the content change of that file is left here and the two renames merge without a conflict. patches/ice_drv/2.6.7/ rebases the 2.6.6 series and adds 0002-ice-reduce-TX-scheduler-default-burst-size-to-2-KB. patches/iavf_drv/4.13.35/ holds the one virtchnl fix the out-of-tree IAVF module needs, so the two kernel modules of a test host can come from the same source revision.
    struct mtl_port_init_params gains uint32_t rl_burst_size. A non-zero value goes to the ice PF driver as the rl_burst_size devarg of that port, so an application can ask for a burst size other than the hardware default without a rebuild of the driver. Zero keeps the default.

Only a port that DPDK drives as an ice PF takes the key: the iavf driver rejects it and the VF fails to probe with -EINVAL. So mt_user_params_check() warns when the field is set on any other PMD type, and the ice driver, not MTL, owns the valid range.

dev_eal_init() builds one EAL argument per port into a fixed buffer, and the buffer size was the literal 2 * MTL_PORT_MAX_LEN in five places. It is now MT_EAL_PORT_ARG_MAX_LEN, with a comment that measures the widest writer, and each snprintf() and memset() takes sizeof the buffer instead of repeating the expression.

tests/unit/dev/mt_dev_devargs_test.cpp covers the builder: a bare BDF when the field is zero, the appended devarg when it is set, one port not taking another port's value, a value out of range passed through, and the longest BDF with UINT32_MAX not truncated. No other tier reaches this code, because CI runs auto and tsc pacing only.

dev_if_init_pacing() refused to initialize a port when dev_rl_init_nonleaf_nodes() failed, even when rl was the port's own auto-detected choice and not the user's. It now falls back to ST21_TX_PACING_WAY_TSC with a warning in that case, which is what a failing queue rate limit below it already does. An explicit --pacing_way rl still fails, because that one is the user's choice.

GNU patch recovers a stale @@ header by searching for the hunk, applying it at an offset, and still exits 0. So an exit code cannot find a patch that drifted from the tarball it was written against, but the absence of an "offset" or "fuzz" line can. The new script applies each patches/dpdk/<version>/*.patch to its pinned archive and fails on any offset or fuzz. A version with no archive is skipped, and a skip of the version versions.env pins is a failure, so a skip can never read as a pass.

doc/dma.md gains the DSA facts a host needs: 8086:0b25 is on the vfio-pci denylist, so vfio-pci must load with disable_denylist=1; one device is enough, because MTL enumerates every dmadev that was probed rather than looking for a name; and the accel-config mode does not apply, because its dmadevs have no multi-process support and the gtest suite runs a transmitter and a receiver as two processes.

rust/imtl-sys/examples/no_std.rs builds the two structures field by field, so it needed the new rl_burst_size field, and the port_packet_loss array and the wider dma_dev_port that it had not caught up with.

@DawidWesierski4 DawidWesierski4 added the DO NOT MERGE PR can be reviewed but must no be merged. label Aug 28, 2026
@DawidWesierski4

Copy link
Copy Markdown
Collaborator Author

Do not merge before #1700

`versions.env` now pins DPDK 26.07, ICE 2.6.7 and, for the first time, an
IAVF version of its own (4.13.35 with download id 18159). `DPDK_REPO` and
`ICE_REPO` go, because no script read either one.

`patches/dpdk/26.07/` is the 26.03 series, rebased, less what upstream
26.07 already holds. Two of them come from work this branch did on the
26.03 series first, so the two series say the same thing:

* `0001-net-iavf-disable-runtime-queue-setup-during-queue-rate-limiting`
  takes `RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP` and its TX partner away
  always, as the 26.03 patch does. The first shape of this patch made the
  capability follow `vf->qtc_map`, but MTL reads `dev_capa` once in
  `mt_dev_create`, before it commits the rate limit hierarchy, so the
  capability was still on. MTL then started and stopped one Rx queue per
  session, and an E810 VF queue that stops once never receives again: run
  33161105103 reported `fb_rec 0` with `rx_hw_dropped_packets` past two
  million. The same patch also dropped its two added `rte_free()` calls.
  One of them freed `vf->qtc_map`, which upstream 26.07 gets from libc
  `calloc()`, so `rte_free()` read a malloc element header the DPDK heap
  never wrote and faulted in `librte_eal` (run 33155049621); the other
  freed a block the next line frees again.
* `0008-pcapng-add-user-timestamp-support` is a copy of the 26.03 patch of
  the same name, which the first draft of this series left out. That patch
  is the only source of `MTL_DPDK_HAS_PCAPNG_TS` and of
  `rte_pcapng_copy_ts()`, and upstream 26.07 holds neither, so
  `lib/src/mt_pcap.h` took its `#else` branch and built the stub
  `mt_pcap_open()`. `St20_rx.pcap_dump` then failed on every NIC with
  "no pcap support for this build" (run 33166408995). It applies to 26.07
  with no offset and no fuzz.
`patches/dpdk/26.07/windows/0001-mingw-build-and-runtime-fixes.patch`
carries the Windows build over.
Two 26.03 patch files are renamed to the subject line they carry. One of
them held a colon in its file name, which Windows cannot check out. The
style pull request makes that one rename on its own, with no change of
content, so after it lands only the content change of that file is left
here and the two renames merge without a conflict.
`patches/ice_drv/2.6.7/` rebases the 2.6.6 series and adds
`0002-ice-reduce-TX-scheduler-default-burst-size-to-2-KB`.
`patches/iavf_drv/4.13.35/` holds the one virtchnl fix the out-of-tree
IAVF module needs, so the two kernel modules of a test host can come from
the same source revision.
`struct mtl_port_init_params` gains `uint32_t rl_burst_size`. A non-zero
value goes to the ice PF driver as the `rl_burst_size` devarg of that
port, so an application can ask for a burst size other than the hardware
default without a rebuild of the driver. Zero keeps the default.

Only a port that DPDK drives as an ice PF takes the key: the iavf driver
rejects it and the VF fails to probe with `-EINVAL`. So
`mt_user_params_check()` warns when the field is set on any other PMD
type, and the ice driver, not MTL, owns the valid range.

`dev_eal_init()` builds one EAL argument per port into a fixed buffer, and
the buffer size was the literal `2 * MTL_PORT_MAX_LEN` in five places.
It is now `MT_EAL_PORT_ARG_MAX_LEN`, with a comment that measures the
widest writer, and each `snprintf()` and `memset()` takes `sizeof` the
buffer instead of repeating the expression.

`tests/unit/dev/mt_dev_devargs_test.cpp` covers the builder: a bare BDF
when the field is zero, the appended devarg when it is set, one port not
taking another port's value, a value out of range passed through, and the
longest BDF with `UINT32_MAX` not truncated. No other tier reaches this
code, because CI runs `auto` and `tsc` pacing only.

`dev_if_init_pacing()` refused to initialize a port when
`dev_rl_init_nonleaf_nodes()` failed, even when `rl` was the port's own
auto-detected choice and not the user's. It now falls back to
`ST21_TX_PACING_WAY_TSC` with a warning in that case, which is what a
failing queue rate limit below it already does. An explicit `--pacing_way
rl` still fails, because that one is the user's choice.

GNU `patch` recovers a stale `@@` header by searching for the hunk,
applying it at an offset, and still exits 0. So an exit code cannot find
a patch that drifted from the tarball it was written against, but the
absence of an "offset" or "fuzz" line can. The new script applies each
`patches/dpdk/<version>/*.patch` to its pinned archive and fails on any
offset or fuzz. A version with no archive is skipped, and a skip of the
version `versions.env` pins is a failure, so a skip can never read as a
pass.

`doc/dma.md` gains the DSA facts a host needs: `8086:0b25` is on the
`vfio-pci` denylist, so `vfio-pci` must load with `disable_denylist=1`;
one device is enough, because MTL enumerates every dmadev that was probed
rather than looking for a name; and the `accel-config` mode does not
apply, because its dmadevs have no multi-process support and the gtest
suite runs a transmitter and a receiver as two processes.

`rust/imtl-sys/examples/no_std.rs` builds the two structures field by
field, so it needed the new `rl_burst_size` field, and the
`port_packet_loss` array and the wider `dma_dev_port` that it had not
caught up with.

Signed-off-by: Wesierski, Dawid <dawid.wesierski@intel.com>
@awilczyns
awilczyns force-pushed the driver/dpdk-26.07-ice-2.6.7 branch from 04db7cd to 09a2356 Compare September 1, 2026 14:03
Comment thread include/mtl_api.h
Comment on lines +550 to +557
/**
* Optional for MTL_PMD_DPDK_USER. TX scheduler rate limit burst size in bytes, passed
* to the ice PF driver as the rl_burst_size devarg on this port. Zero keeps the
* hardware default. Only set this for a port DPDK drives as an ice PF: the iavf driver
* rejects the key, so a VF port fails to probe with -EINVAL. The ice driver validates
* the range and fails the probe if the value is out of it.
*/
uint32_t rl_burst_size;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we really need this new parameter? I don't like API changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DO NOT MERGE PR can be reviewed but must no be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants