* [PATCH 0/7] intel network and pcapng updates
@ 2026-06-08 16:40 Dawid Wesierski
2026-06-08 16:40 ` [PATCH 1/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
` (9 more replies)
0 siblings, 10 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Wesierski, Dawid
From: "Wesierski, Dawid" <dawid.wesierski@intel.com>
These patches provide various updates for Intel iavf/ice drivers and pcapng.
The changes include:
- Hardware limit ring descriptor increases for iavf.
- Runtime queue rate limit configuration for iavf.
- Scheduler burst size reductions for ice base.
- Global PTP timestamping for ice.
- Disabling runtime queue setup for iavf.
- User-supplied timestamp support in pcapng.
- Header split mbuf callback support for ice.
Marek Kasiewicz (7):
net/iavf: increase max ring descriptors to hardware limit
net/iavf: allow runtime queue rate limit configuration
net/ice/base: reduce default scheduler burst size
net/ice: timestamp all received packets when PTP is enabled
net/iavf: disable runtime queue setup capability
pcapng: add user-supplied timestamp support
net/ice: add header split mbuf callback support
drivers/net/intel/common/rx.h | 2 +
drivers/net/intel/iavf/iavf_ethdev.c | 3 --
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
drivers/net/intel/iavf/iavf_tm.c | 11 ++--
drivers/net/intel/ice/base/ice_type.h | 2 +-
drivers/net/intel/ice/ice_ethdev.c | 1 +
drivers/net/intel/ice/ice_rxtx.c | 72 ++++++++++++++++++++++++---
drivers/net/intel/ice/ice_rxtx.h | 2 +
lib/ethdev/ethdev_driver.h | 10 ++++
lib/ethdev/rte_ethdev.c | 17 +++++++
lib/ethdev/rte_ethdev.h | 46 +++++++++++++++++
lib/pcapng/rte_pcapng.c | 19 ++-----
lib/pcapng/rte_pcapng.h | 41 ++++++++++++++-
13 files changed, 196 insertions(+), 32 deletions(-)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 1/7] net/iavf: increase max ring descriptors to hardware limit
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:40 ` [PATCH 2/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
` (8 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
The Intel E810 hardware supports up to 8160 (8K - 32) descriptors per
TX/RX ring, but IAVF_MAX_RING_DESC caps it at 4096. Applications that
need deep descriptor rings for hardware rate-limited pacing (e.g.,
ST2110 video with thousands of packets per frame) cannot queue enough
packets before the pacing epoch begins.
Increase IAVF_MAX_RING_DESC to the hardware maximum of 8160 to allow
full utilization of the ring depth on E810 VFs.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/intel/iavf/iavf_rxtx.h b/drivers/net/intel/iavf/iavf_rxtx.h
index 8449236d4d..22ea415f44 100644
--- a/drivers/net/intel/iavf/iavf_rxtx.h
+++ b/drivers/net/intel/iavf/iavf_rxtx.h
@@ -16,7 +16,7 @@
/* In QLEN must be whole number of 32 descriptors. */
#define IAVF_ALIGN_RING_DESC 32
#define IAVF_MIN_RING_DESC 64
-#define IAVF_MAX_RING_DESC 4096
+#define IAVF_MAX_RING_DESC (8192 - 32)
#define IAVF_DMA_MEM_ALIGN 4096
/* Base address of the HW descriptor ring should be 128B aligned. */
#define IAVF_RING_BASE_ALIGN 128
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 2/7] net/iavf: allow runtime queue rate limit configuration
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
2026-06-08 16:40 ` [PATCH 1/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:40 ` [PATCH 3/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
` (7 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Allow per-queue bandwidth rate limiting to be configured without
stopping the port when only a single TC node and single QoS element
are involved. This enables dynamic session management where individual
queue pacing rates can be changed while other queues continue
transmitting.
Also fix the queue ID assignment in the bandwidth configuration to
use the actual TM node ID rather than a sequential counter index, and
only mark the TM hierarchy as committed when the port is stopped to
permit subsequent reconfiguration.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_tm.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_tm.c b/drivers/net/intel/iavf/iavf_tm.c
index 1cf7bfb106..43d7a44337 100644
--- a/drivers/net/intel/iavf/iavf_tm.c
+++ b/drivers/net/intel/iavf/iavf_tm.c
@@ -804,8 +804,10 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
int index = 0, node_committed = 0;
int i, ret_val = IAVF_SUCCESS;
- /* check if port is stopped */
- if (adapter->stopped != 1) {
+ /* check if port is stopped, except for setting queue bandwidth */
+ if (vf->tm_conf.nb_tc_node != 1 &&
+ vf->qos_cap->num_elem != 1 &&
+ adapter->stopped != 1) {
PMD_DRV_LOG(ERR, "Please stop port first");
ret_val = IAVF_ERR_NOT_READY;
goto err;
@@ -856,7 +858,7 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
q_tc_mapping->tc[tm_node->tc].req.queue_count++;
if (tm_node->shaper_profile) {
- q_bw->cfg[node_committed].queue_id = node_committed;
+ q_bw->cfg[node_committed].queue_id = tm_node->id;
q_bw->cfg[node_committed].shaper.peak =
tm_node->shaper_profile->profile.peak.rate /
1000 * IAVF_BITS_PER_BYTE;
@@ -900,7 +902,8 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
goto fail_clear;
vf->qtc_map = qtc_map;
- vf->tm_conf.committed = true;
+ if (adapter->stopped == 1)
+ vf->tm_conf.committed = true;
return ret_val;
fail_clear:
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 3/7] net/ice/base: reduce default scheduler burst size
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
2026-06-08 16:40 ` [PATCH 1/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-06-08 16:40 ` [PATCH 2/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:40 ` [PATCH 4/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
` (6 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Reduce ICE_SCHED_DFLT_BURST_SIZE from 15 KB to 2 KB to improve
TX rate limiter granularity. The E810 TX scheduler uses a token
bucket algorithm where the burst size controls the maximum bytes
sent in a single burst before the rate limiter throttles.
A 15 KB burst allows micro-bursts of ~10 max-size frames, which
violates tight inter-packet spacing requirements in time-sensitive
networking applications such as SMPTE ST 2110-21 narrow-sender
compliance. Reducing to 2 KB forces near-constant-rate output
matching the configured shaper profile.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/ice/base/ice_type.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/intel/ice/base/ice_type.h b/drivers/net/intel/ice/base/ice_type.h
index 6d8c187689..39569ff3e3 100644
--- a/drivers/net/intel/ice/base/ice_type.h
+++ b/drivers/net/intel/ice/base/ice_type.h
@@ -1100,7 +1100,7 @@ enum ice_rl_type {
#define ICE_SCHED_NO_SHARED_RL_PROF_ID 0xFFFF
#define ICE_SCHED_DFLT_BW_WT 4
#define ICE_SCHED_INVAL_PROF_ID 0xFFFF
-#define ICE_SCHED_DFLT_BURST_SIZE (15 * 1024) /* in bytes (15k) */
+#define ICE_SCHED_DFLT_BURST_SIZE (2 * 1024) /* in bytes (2k) */
/* Access Macros for Tx Sched RL Profile data */
#define ICE_TXSCHED_GET_RL_PROF_ID(p) LE16_TO_CPU((p)->info.profile_id)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 4/7] net/ice: timestamp all received packets when PTP is enabled
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (2 preceding siblings ...)
2026-06-08 16:40 ` [PATCH 3/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:40 ` [PATCH 5/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
` (5 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
When PTP is enabled on the ICE PMD, hardware RX timestamps are only
applied to packets classified as IEEE 1588 (Ethertype 0x88F7). This
prevents applications from obtaining hardware timestamps on regular
UDP/IP traffic.
Remove the TIMESYNC packet type filter so that all received packets
get hardware timestamps when PTP is enabled. This is required for
time-sensitive networking applications that need per-packet arrival
timing on media traffic, such as ST 2110-21 receiver compliance
monitoring.
The change affects all three RX paths: scan, scattered, and single
packet receive functions.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/ice/ice_rxtx.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index c4b5454c53..8d709125f7 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -2023,8 +2023,7 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((mb->packet_type &
- RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxdp[j].wb.flex_ts.ts_high);
mb->timesync = rxq->queue_id;
@@ -2390,8 +2389,7 @@ ice_recv_scattered_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((first_seg->packet_type & RTE_PTYPE_L2_MASK)
- == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
first_seg->timesync = rxq->queue_id;
@@ -2881,8 +2879,7 @@ ice_recv_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((rxm->packet_type & RTE_PTYPE_L2_MASK) ==
- RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
rxm->timesync = rxq->queue_id;
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 5/7] net/iavf: disable runtime queue setup capability
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (3 preceding siblings ...)
2026-06-08 16:40 ` [PATCH 4/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:40 ` [PATCH 6/7] pcapng: add user-supplied timestamp support Dawid Wesierski
` (4 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Remove the advertisement of RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
and RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP capabilities from the
iavf VF driver.
Runtime queue setup on E810 VFs causes queue state corruption when
queues are dynamically reconfigured while the hardware rate limiter
is actively pacing TX queues. Queue configuration messages to the PF
via virtchnl can race with ongoing TX operations, leading to undefined
behavior.
By not advertising these capabilities, all queues are configured at
port start and remain stable throughout the port lifecycle.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_ethdev.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index a8031e23a5..4f6325ef78 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -1159,9 +1159,6 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
dev_info->reta_size = vf->vf_res->rss_lut_size;
dev_info->flow_type_rss_offloads = IAVF_RSS_OFFLOAD_ALL;
dev_info->max_mac_addrs = IAVF_NUM_MACADDR_MAX;
- dev_info->dev_capa =
- RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
- RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
dev_info->rx_offload_capa =
RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
RTE_ETH_RX_OFFLOAD_QINQ_STRIP |
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 6/7] pcapng: add user-supplied timestamp support
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (4 preceding siblings ...)
2026-06-08 16:40 ` [PATCH 5/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 17:09 ` Stephen Hemminger
2026-06-08 16:40 ` [PATCH 7/7] net/ice: add header split mbuf callback support Dawid Wesierski
` (3 subsequent siblings)
9 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Add rte_pcapng_copy_ts() which accepts an optional timestamp parameter
in nanoseconds. When the timestamp is non-zero, it is used directly
instead of reading the TSC. This allows applications to provide
hardware PTP timestamps from the NIC, enabling accurate packet capture
with PTP-domain timing rather than host-local TSC values.
The existing rte_pcapng_copy() function is preserved as a static inline
wrapper that passes zero for backward compatibility.
The TSC-to-epoch conversion in the write path is removed since callers
providing hardware timestamps have already performed the conversion.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
lib/pcapng/rte_pcapng.c | 19 ++++---------------
lib/pcapng/rte_pcapng.h | 41 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 43 insertions(+), 17 deletions(-)
diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c
index b5d1026891..96b3aafeb6 100644
--- a/lib/pcapng/rte_pcapng.c
+++ b/lib/pcapng/rte_pcapng.c
@@ -546,14 +546,14 @@ pcapng_vlan_insert(struct rte_mbuf *m, uint16_t ether_type, uint16_t tci)
*/
/* Make a copy of original mbuf with pcapng header and options */
-RTE_EXPORT_SYMBOL(rte_pcapng_copy)
+RTE_EXPORT_SYMBOL(rte_pcapng_copy_ts)
struct rte_mbuf *
-rte_pcapng_copy(uint16_t port_id, uint32_t queue,
+rte_pcapng_copy_ts(uint16_t port_id, uint32_t queue,
const struct rte_mbuf *md,
struct rte_mempool *mp,
uint32_t length,
enum rte_pcapng_direction direction,
- const char *comment)
+ const char *comment, uint64_t ts)
{
struct pcapng_enhance_packet_block *epb;
uint32_t orig_len, pkt_len, padding, flags;
@@ -691,7 +691,7 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
mc->port = port_id;
/* Put timestamp in cycles here - adjust in packet write */
- timestamp = rte_get_tsc_cycles();
+ timestamp = ts ? ts : rte_get_tsc_cycles();
epb->timestamp_hi = timestamp >> 32;
epb->timestamp_lo = (uint32_t)timestamp;
epb->capture_length = pkt_len;
@@ -720,7 +720,6 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
for (i = 0; i < nb_pkts; i++) {
struct rte_mbuf *m = pkts[i];
struct pcapng_enhance_packet_block *epb;
- uint64_t cycles, timestamp;
/* sanity check that is really a pcapng mbuf */
epb = rte_pktmbuf_mtod(m, struct pcapng_enhance_packet_block *);
@@ -737,16 +736,6 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
return -1;
}
- /*
- * When data is captured by pcapng_copy the current TSC is stored.
- * Adjust the value recorded in file to PCAP epoch units.
- */
- cycles = (uint64_t)epb->timestamp_hi << 32;
- cycles += epb->timestamp_lo;
- timestamp = tsc_to_ns_epoch(&self->clock, cycles);
- epb->timestamp_hi = timestamp >> 32;
- epb->timestamp_lo = (uint32_t)timestamp;
-
/*
* Handle case of highly fragmented and large burst size
* Note: this assumes that max segments per mbuf < IOV_MAX
diff --git a/lib/pcapng/rte_pcapng.h b/lib/pcapng/rte_pcapng.h
index d8d328f710..3d735e4ebe 100644
--- a/lib/pcapng/rte_pcapng.h
+++ b/lib/pcapng/rte_pcapng.h
@@ -109,7 +109,7 @@ enum rte_pcapng_direction {
};
/**
- * Format an mbuf for writing to file.
+ * Format an mbuf with time stamp for writing to file.
*
* @param port_id
* The Ethernet port on which packet was received
@@ -129,16 +129,53 @@ enum rte_pcapng_direction {
* @param comment
* Optional per packet comment.
* Truncated to UINT16_MAX characters.
+ * @param ts
+ * Optional timestamp in nanoseconds. If zero, the current TSC is used.
*
* @return
* - The pointer to the new mbuf formatted for pcapng_write
* - NULL on error such as invalid port or out of memory.
*/
struct rte_mbuf *
+rte_pcapng_copy_ts(uint16_t port_id, uint32_t queue,
+ const struct rte_mbuf *m, struct rte_mempool *mp,
+ uint32_t length,
+ enum rte_pcapng_direction direction, const char *comment, uint64_t ts);
+
+/**
+ * Format an mbuf for writing to file.
+ *
+ * @param port_id
+ * The Ethernet port on which packet was received
+ * or is going to be transmitted.
+ * @param queue
+ * The queue on the Ethernet port where packet was received
+ * or is going to be transmitted.
+ * @param mp
+ * The mempool from which the "clone" mbufs are allocated.
+ * @param m
+ * The mbuf to copy
+ * @param length
+ * The upper limit on bytes to copy. Passing UINT32_MAX
+ * means all data (after offset).
+ * @param direction
+ * The direction of the packer: receive, transmit or unknown.
+ * @param comment
+ * Packet comment.
+ *
+ * @return
+ * - The pointer to the new mbuf formatted for pcapng_write
+ * - NULL if allocation fails.
+ */
+static inline struct rte_mbuf *
rte_pcapng_copy(uint16_t port_id, uint32_t queue,
const struct rte_mbuf *m, struct rte_mempool *mp,
uint32_t length,
- enum rte_pcapng_direction direction, const char *comment);
+ enum rte_pcapng_direction direction, const char *comment)
+{
+ return rte_pcapng_copy_ts(port_id, queue, m, mp, length, direction,
+ comment, 0);
+}
/**
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 7/7] net/ice: add header split mbuf callback support
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (5 preceding siblings ...)
2026-06-08 16:40 ` [PATCH 6/7] pcapng: add user-supplied timestamp support Dawid Wesierski
@ 2026-06-08 16:40 ` Dawid Wesierski
2026-06-08 16:59 ` [PATCH 0/7] intel network and pcapng updates Thomas Monjalon
` (2 subsequent siblings)
9 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-08 16:40 UTC (permalink / raw)
To: dev
Cc: thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Marek Kasiewicz,
Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Add an ethdev API rte_eth_hdrs_set_mbuf_callback() that allows
applications to register a callback providing custom payload mbufs
for header split RX mode. When registered, the ICE PMD calls this
callback at mbuf allocation points to obtain user-provided payload
buffers instead of allocating from the mempool.
This enables zero-copy RX for header split: the NIC DMAs the payload
directly into application-managed buffers (e.g., mapped frame buffers
with known IOVA), bypassing an extra memcpy from the mempool mbuf.
The callback is invoked at three allocation points in the ICE driver:
initial queue setup, bulk buffer allocation, and single-packet
receive path.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/common/rx.h | 2 +
drivers/net/intel/ice/ice_ethdev.c | 1 +
drivers/net/intel/ice/ice_rxtx.c | 63 ++++++++++++++++++++++++++++++
drivers/net/intel/ice/ice_rxtx.h | 2 +
lib/ethdev/ethdev_driver.h | 10 +++++
lib/ethdev/rte_ethdev.c | 17 ++++++++
lib/ethdev/rte_ethdev.h | 46 ++++++++++++++++++++++
7 files changed, 141 insertions(+)
diff --git a/drivers/net/intel/common/rx.h b/drivers/net/intel/common/rx.h
index e0bf520ebd..8abb2a3ce9 100644
--- a/drivers/net/intel/common/rx.h
+++ b/drivers/net/intel/common/rx.h
@@ -113,6 +113,8 @@ struct ci_rx_queue {
uint32_t hw_time_low; /* low 32 bits of timestamp */
int ts_offset; /* dynamic mbuf timestamp field offset */
uint64_t ts_flag; /* dynamic mbuf timestamp flag */
+ rte_eth_hdrs_mbuf_callback_fn hdrs_mbuf_cb; /* hdr split mbuf cb */
+ void *hdrs_mbuf_cb_priv; /* hdr split mbuf cb priv */
};
struct { /* iavf specific values */
const struct iavf_rxq_ops *ops; /**< queue ops */
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index b7cea3bfc1..fb15438dbc 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -282,6 +282,7 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
.dev_set_link_down = ice_dev_set_link_down,
.dev_led_on = ice_dev_led_on,
.dev_led_off = ice_dev_led_off,
+ .hdrs_mbuf_set_cb = ice_hdrs_mbuf_set_cb,
.rx_queue_start = ice_rx_queue_start,
.rx_queue_stop = ice_rx_queue_stop,
.tx_queue_start = ice_tx_queue_start,
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index 8d709125f7..867f595291 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -487,6 +487,17 @@ ice_alloc_rx_queue_mbufs(struct ci_rx_queue *rxq)
return -ENOMEM;
}
+ if (rxq->hdrs_mbuf_cb) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ mbuf_pay->buf_addr = hdrs_mbuf.buf_addr;
+ mbuf_pay->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
+
mbuf_pay->next = NULL;
mbuf_pay->data_off = RTE_PKTMBUF_HEADROOM;
mbuf_pay->nb_segs = 1;
@@ -2126,6 +2137,16 @@ ice_rx_alloc_bufs(struct ci_rx_queue *rxq)
rxdp[i].read.pkt_addr = dma_addr;
} else {
mb->next = rxq->sw_split_buf[i].mbuf;
+ if (rxq->hdrs_mbuf_cb && mb->next) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ mb->next->buf_addr = hdrs_mbuf.buf_addr;
+ mb->next->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
pay_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(mb->next));
rxdp[i].read.hdr_addr = dma_addr;
rxdp[i].read.pkt_addr = pay_addr;
@@ -2810,6 +2831,17 @@ ice_recv_pkts(void *rx_queue,
break;
}
+ if (rxq->hdrs_mbuf_cb) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ nmb_pay->buf_addr = hdrs_mbuf.buf_addr;
+ nmb_pay->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
+
nmb->next = nmb_pay;
nmb_pay->next = NULL;
@@ -4533,3 +4565,34 @@ ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc)
}
+
+int
+ice_hdrs_mbuf_set_cb(struct rte_eth_dev *dev, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb)
+{
+ struct ci_rx_queue *rxq;
+
+ if (rx_queue_id >= dev->data->nb_rx_queues) {
+ PMD_DRV_LOG(ERR, "RX queue %u out of range", rx_queue_id);
+ return -EINVAL;
+ }
+
+ rxq = dev->data->rx_queues[rx_queue_id];
+ if (rxq == NULL) {
+ PMD_DRV_LOG(ERR, "RX queue %u not available or setup", rx_queue_id);
+ return -EINVAL;
+ }
+
+ if (rxq->hdrs_mbuf_cb) {
+ PMD_DRV_LOG(ERR, "RX queue %u has hdrs mbuf cb already",
+ rx_queue_id);
+ return -EEXIST;
+ }
+
+ rxq->hdrs_mbuf_cb_priv = priv;
+ rxq->hdrs_mbuf_cb = cb;
+ PMD_DRV_LOG(NOTICE, "RX queue %u register hdrs mbuf cb at %p",
+ rx_queue_id, cb);
+
+ return 0;
+}
diff --git a/drivers/net/intel/ice/ice_rxtx.h b/drivers/net/intel/ice/ice_rxtx.h
index 999b6b30d6..7ed114ee94 100644
--- a/drivers/net/intel/ice/ice_rxtx.h
+++ b/drivers/net/intel/ice/ice_rxtx.h
@@ -303,6 +303,8 @@ uint16_t ice_xmit_pkts_vec_avx512_offload(void *tx_queue,
int ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc);
int ice_tx_done_cleanup(void *txq, uint32_t free_cnt);
int ice_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc);
+int ice_hdrs_mbuf_set_cb(struct rte_eth_dev *dev, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb);
enum rte_vect_max_simd ice_get_max_simd_bitwidth(void);
#define FDIR_PARSING_ENABLE_PER_QUEUE(ad, on) do { \
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 0f336f9567..b48681268c 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -1292,6 +1292,13 @@ typedef int (*eth_cman_config_set_t)(struct rte_eth_dev *dev,
typedef int (*eth_cman_config_get_t)(struct rte_eth_dev *dev,
struct rte_eth_cman_config *config);
+/** @internal
+ * Set header split payload mbuf callback for a receive queue.
+ */
+typedef int (*eth_hdrs_mbuf_set_cb_t)(struct rte_eth_dev *dev,
+ uint16_t rx_queue_id, void *priv,
+ rte_eth_hdrs_mbuf_callback_fn cb);
+
/**
* @internal
* Dump Rx descriptor info to a file.
@@ -1652,6 +1659,9 @@ struct eth_dev_ops {
/** Dump Tx descriptor info */
eth_tx_descriptor_dump_t eth_tx_descriptor_dump;
+ /** Set header split mbuf callback */
+ eth_hdrs_mbuf_set_cb_t hdrs_mbuf_set_cb;
+
/** Get congestion management information */
eth_cman_info_get_t cman_info_get;
/** Initialize congestion management structure with default values */
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 9efeaf77cb..d5820ccd22 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -7316,6 +7316,23 @@ rte_eth_ip_reassembly_conf_set(uint16_t port_id,
return ret;
}
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_hdrs_set_mbuf_callback, 26.07)
+int
+rte_eth_hdrs_set_mbuf_callback(uint16_t port_id, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb)
+{
+ struct rte_eth_dev *dev;
+
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+ dev = &rte_eth_devices[port_id];
+
+ if (dev->dev_ops->hdrs_mbuf_set_cb == NULL)
+ return -ENOTSUP;
+
+ return eth_err(port_id,
+ dev->dev_ops->hdrs_mbuf_set_cb(dev, rx_queue_id, priv, cb));
+}
+
RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_dev_priv_dump, 22.03)
int
rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index ee400b386f..dbf2c23a35 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -6985,6 +6985,52 @@ rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
return rte_eth_tx_buffer_flush(port_id, queue_id, buffer);
}
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice.
+ *
+ * Buffer descriptor for header split payload mbuf callback.
+ */
+struct rte_eth_hdrs_mbuf {
+ void *buf_addr; /**< Virtual address of payload buffer. */
+ rte_iova_t buf_iova; /**< IOVA of payload buffer. */
+};
+
+/**
+ * Callback function type for providing custom payload mbufs
+ * in header split mode.
+ *
+ * @param priv
+ * User-provided private context.
+ * @param mbuf
+ * Pointer to buffer descriptor to be filled by the callback.
+ * @return
+ * 0 on success, negative errno on failure.
+ */
+typedef int (*rte_eth_hdrs_mbuf_callback_fn)(void *priv,
+ struct rte_eth_hdrs_mbuf *mbuf);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice.
+ *
+ * Register a callback to provide custom payload mbufs for header split RX.
+ *
+ * @param port_id
+ * The port identifier of the Ethernet device.
+ * @param rx_queue_id
+ * The index of the receive queue.
+ * @param priv
+ * User-provided private context passed to the callback.
+ * @param cb
+ * Callback function that provides payload buffer descriptors.
+ * @return
+ * 0 on success, negative errno on failure.
+ */
+__rte_experimental
+int rte_eth_hdrs_set_mbuf_callback(uint16_t port_id, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb);
+
/**
* @warning
* @b EXPERIMENTAL: this API may change, or be removed, without prior notice
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH 0/7] intel network and pcapng updates
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (6 preceding siblings ...)
2026-06-08 16:40 ` [PATCH 7/7] net/ice: add header split mbuf callback support Dawid Wesierski
@ 2026-06-08 16:59 ` Thomas Monjalon
2026-06-18 14:44 ` [PATCH v3 1/1] pcapng: add user-supplied timestamp support Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
9 siblings, 0 replies; 44+ messages in thread
From: Thomas Monjalon @ 2026-06-08 16:59 UTC (permalink / raw)
To: Dawid Wesierski
Cc: dev, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, stephen, Wesierski, Dawid
08/06/2026 18:40, Dawid Wesierski:
> From: "Wesierski, Dawid" <dawid.wesierski@intel.com>
>
> These patches provide various updates for Intel iavf/ice drivers and pcapng.
Please would you mind sending the pcapng changes in a separate series?
Thank you
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 6/7] pcapng: add user-supplied timestamp support
2026-06-08 16:40 ` [PATCH 6/7] pcapng: add user-supplied timestamp support Dawid Wesierski
@ 2026-06-08 17:09 ` Stephen Hemminger
0 siblings, 0 replies; 44+ messages in thread
From: Stephen Hemminger @ 2026-06-08 17:09 UTC (permalink / raw)
To: Dawid Wesierski
Cc: dev, thomas, david.marchand, vladimir.medvedkin, bruce.richardson,
anatoly.burakov, reshma.pattan, Marek Kasiewicz
On Mon, 8 Jun 2026 12:40:58 -0400
Dawid Wesierski <dawid.wesierski@intel.com> wrote:
> @@ -737,16 +736,6 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
> return -1;
> }
>
> - /*
> - * When data is captured by pcapng_copy the current TSC is stored.
> - * Adjust the value recorded in file to PCAP epoch units.
> - */
> - cycles = (uint64_t)epb->timestamp_hi << 32;
> - cycles += epb->timestamp_lo;
> - timestamp = tsc_to_ns_epoch(&self->clock, cycles);
> - epb->timestamp_hi = timestamp >> 32;
> - epb->timestamp_lo = (uint32_t)timestamp;
> -
You can't generate valid pcapng timestamps without this.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v3 1/1] pcapng: add user-supplied timestamp support
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (7 preceding siblings ...)
2026-06-08 16:59 ` [PATCH 0/7] intel network and pcapng updates Thomas Monjalon
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 15:20 ` Stephen Hemminger
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
9 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: stephen, thomas, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Add rte_pcapng_copy_ts() which accepts a timestamp parameter in
nanoseconds since the Unix epoch. When non-zero, the supplied value is
used directly. This allows applications to provide hardware PTP
timestamps from the NIC, enabling accurate packet capture with
PTP-domain timing rather than host-local TSC values.
The existing rte_pcapng_copy() function is preserved as a static
inline wrapper that passes zero, keeping the original TSC-based
behaviour for callers that do not have a hardware timestamp.
To support both timestamp sources, the per-mbuf timestamp now carries
a sentinel bit: when rte_pcapng_copy_ts() is called with ts == 0 it
stores the current TSC with bit 63 set. rte_pcapng_write_packets()
detects the sentinel, clears it and converts TSC -> epoch ns using
the per-file clock before writing. A timestamp supplied by the caller
has bit 63 clear and is written unchanged. The sentinel space is safe
because the TSC counter does not reach bit 63 for centuries and
epoch-ns values stay below bit 63 until the year 2554.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
.mailmap | 2 ++
lib/pcapng/rte_pcapng.c | 42 +++++++++++++++++++++++++++-------------
lib/pcapng/rte_pcapng.h | 43 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 72 insertions(+), 15 deletions(-)
diff --git a/.mailmap b/.mailmap
index 4001e5fb0e..a7d97a631e 100644
--- a/.mailmap
+++ b/.mailmap
@@ -366,6 +366,7 @@ David Zeng <zengxhsh@cn.ibm.com>
Davide Caratti <dcaratti@redhat.com>
Dawid Gorecki <dgr@semihalf.com>
Dawid Jurczak <dawid_jurek@vp.pl>
+Dawid Wesierski <dawid.wesierski@intel.com> Wesierski, Dawid <dawid.wesierski@intel.com>
Dawid Zielinski <dawid.zielinski@intel.com>
Dawid Łukwiński <dawid.lukwinski@intel.com>
Daxue Gao <daxuex.gao@intel.com>
@@ -1014,6 +1015,7 @@ Marcin Wilk <marcin.wilk@caviumnetworks.com>
Marcin Wojtas <mw@semihalf.com>
Marcin Zapolski <marcinx.a.zapolski@intel.com>
Marco Varlese <mvarlese@suse.de>
+Marek Kasiewicz <marek.kasiewicz@intel.com>
Marek Mical <marekx.mical@intel.com>
Marek Zalfresso-jundzillo <marekx.zalfresso-jundzillo@intel.com>
Maria Lingemark <maria.lingemark@ericsson.com>
diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c
index b5d1026891..29090a2ae4 100644
--- a/lib/pcapng/rte_pcapng.c
+++ b/lib/pcapng/rte_pcapng.c
@@ -546,14 +546,14 @@ pcapng_vlan_insert(struct rte_mbuf *m, uint16_t ether_type, uint16_t tci)
*/
/* Make a copy of original mbuf with pcapng header and options */
-RTE_EXPORT_SYMBOL(rte_pcapng_copy)
+RTE_EXPORT_SYMBOL(rte_pcapng_copy_ts)
struct rte_mbuf *
-rte_pcapng_copy(uint16_t port_id, uint32_t queue,
+rte_pcapng_copy_ts(uint16_t port_id, uint32_t queue,
const struct rte_mbuf *md,
struct rte_mempool *mp,
uint32_t length,
enum rte_pcapng_direction direction,
- const char *comment)
+ const char *comment, uint64_t ts)
{
struct pcapng_enhance_packet_block *epb;
uint32_t orig_len, pkt_len, padding, flags;
@@ -690,8 +690,20 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
/* Interface index is filled in later during write */
mc->port = port_id;
- /* Put timestamp in cycles here - adjust in packet write */
- timestamp = rte_get_tsc_cycles();
+ /*
+ * Timestamp handling:
+ * - If the caller supplied an explicit timestamp (ts != 0), it is
+ * already in nanoseconds since the Unix epoch, so store it as-is.
+ * - If the caller did not (ts == 0), store the current TSC and set
+ * the high bit as a sentinel so rte_pcapng_write_packets() knows
+ * it must convert TSC -> epoch ns at write time. The TSC counter
+ * will not reach bit 63 for centuries, and epoch-ns values stay
+ * below bit 63 until the year 2554, so the bit is safe to use.
+ */
+ if (ts != 0)
+ timestamp = ts;
+ else
+ timestamp = rte_get_tsc_cycles() | (UINT64_C(1) << 63);
epb->timestamp_hi = timestamp >> 32;
epb->timestamp_lo = (uint32_t)timestamp;
epb->capture_length = pkt_len;
@@ -720,7 +732,7 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
for (i = 0; i < nb_pkts; i++) {
struct rte_mbuf *m = pkts[i];
struct pcapng_enhance_packet_block *epb;
- uint64_t cycles, timestamp;
+ uint64_t timestamp;
/* sanity check that is really a pcapng mbuf */
epb = rte_pktmbuf_mtod(m, struct pcapng_enhance_packet_block *);
@@ -738,14 +750,18 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
}
/*
- * When data is captured by pcapng_copy the current TSC is stored.
- * Adjust the value recorded in file to PCAP epoch units.
+ * If rte_pcapng_copy[_ts]() stored a TSC value (high bit set
+ * as sentinel), convert it to nanoseconds since the Unix epoch
+ * using the per-file clock. Otherwise the timestamp is already
+ * in epoch ns and is written unchanged.
*/
- cycles = (uint64_t)epb->timestamp_hi << 32;
- cycles += epb->timestamp_lo;
- timestamp = tsc_to_ns_epoch(&self->clock, cycles);
- epb->timestamp_hi = timestamp >> 32;
- epb->timestamp_lo = (uint32_t)timestamp;
+ timestamp = ((uint64_t)epb->timestamp_hi << 32) | epb->timestamp_lo;
+ if (timestamp & (UINT64_C(1) << 63)) {
+ timestamp &= ~(UINT64_C(1) << 63);
+ timestamp = tsc_to_ns_epoch(&self->clock, timestamp);
+ epb->timestamp_hi = timestamp >> 32;
+ epb->timestamp_lo = (uint32_t)timestamp;
+ }
/*
* Handle case of highly fragmented and large burst size
diff --git a/lib/pcapng/rte_pcapng.h b/lib/pcapng/rte_pcapng.h
index d8d328f710..975e7996f0 100644
--- a/lib/pcapng/rte_pcapng.h
+++ b/lib/pcapng/rte_pcapng.h
@@ -109,7 +109,7 @@ enum rte_pcapng_direction {
};
/**
- * Format an mbuf for writing to file.
+ * Format an mbuf with time stamp for writing to file.
*
* @param port_id
* The Ethernet port on which packet was received
@@ -129,16 +129,55 @@ enum rte_pcapng_direction {
* @param comment
* Optional per packet comment.
* Truncated to UINT16_MAX characters.
+ * @param ts
+ * Packet timestamp in nanoseconds since the Unix epoch. If zero, the
+ * current TSC is captured and converted to epoch ns by
+ * rte_pcapng_write_packets() when the packet is written.
*
* @return
* - The pointer to the new mbuf formatted for pcapng_write
* - NULL on error such as invalid port or out of memory.
*/
struct rte_mbuf *
+rte_pcapng_copy_ts(uint16_t port_id, uint32_t queue,
+ const struct rte_mbuf *m, struct rte_mempool *mp,
+ uint32_t length,
+ enum rte_pcapng_direction direction, const char *comment, uint64_t ts);
+
+/**
+ * Format an mbuf for writing to file.
+ *
+ * @param port_id
+ * The Ethernet port on which packet was received
+ * or is going to be transmitted.
+ * @param queue
+ * The queue on the Ethernet port where packet was received
+ * or is going to be transmitted.
+ * @param mp
+ * The mempool from which the "clone" mbufs are allocated.
+ * @param m
+ * The mbuf to copy
+ * @param length
+ * The upper limit on bytes to copy. Passing UINT32_MAX
+ * means all data (after offset).
+ * @param direction
+ * The direction of the packer: receive, transmit or unknown.
+ * @param comment
+ * Packet comment.
+ *
+ * @return
+ * - The pointer to the new mbuf formatted for pcapng_write
+ * - NULL if allocation fails.
+ */
+static inline struct rte_mbuf *
rte_pcapng_copy(uint16_t port_id, uint32_t queue,
const struct rte_mbuf *m, struct rte_mempool *mp,
uint32_t length,
- enum rte_pcapng_direction direction, const char *comment);
+ enum rte_pcapng_direction direction, const char *comment)
+{
+ return rte_pcapng_copy_ts(port_id, queue, m, mp, length, direction,
+ comment, 0);
+}
/**
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 0/7] Intel network drivers enhancements
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
` (8 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v3 1/1] pcapng: add user-supplied timestamp support Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 1/7] ethdev: add header split mbuf callback API Dawid Wesierski
` (8 more replies)
9 siblings, 9 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
This series introduces several improvements to Intel iavf and ice
drivers, including a new ethdev API for header split mbuf callbacks,
increased ring descriptors, and improved PTP timestamping.
Marek Kasiewicz (7):
ethdev: add header split mbuf callback API
net/iavf: increase max ring descriptors to hardware limit
net/iavf: allow runtime queue rate limit configuration
net/ice/base: reduce default scheduler burst size
net/ice: timestamp all received packets when PTP is enabled
net/iavf: disable runtime queue setup capability
net/intel: support header split mbuf callback
drivers/net/intel/common/rx.h | 2 +
drivers/net/intel/iavf/iavf_ethdev.c | 3 --
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
drivers/net/intel/iavf/iavf_tm.c | 11 ++--
drivers/net/intel/ice/base/ice_type.h | 2 +-
drivers/net/intel/ice/ice_ethdev.c | 1 +
drivers/net/intel/ice/ice_rxtx.c | 72 ++++++++++++++++++++++++---
drivers/net/intel/ice/ice_rxtx.h | 2 +
lib/ethdev/ethdev_driver.h | 15 +++++++
lib/ethdev/rte_ethdev.c | 51 ++++++++++++++++++++++
lib/ethdev/rte_ethdev.h | 7 +++
11 files changed, 153 insertions(+), 15 deletions(-)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v2 1/7] ethdev: add header split mbuf callback API
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 16:26 ` Thomas Monjalon
2026-06-18 14:44 ` [PATCH v2 2/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
` (7 subsequent siblings)
8 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Add rte_eth_hdrs_set_mbuf_callback() that allows applications to
register a callback providing custom payload mbufs for header split RX
mode. When registered, a PMD that supports header split is expected to
call this callback at mbuf allocation points to obtain user-provided
payload buffers instead of allocating from the mempool.
This enables zero-copy RX for header split: the NIC DMAs the payload
directly into application-managed buffers (e.g., mapped frame buffers
with known IOVA), bypassing an extra memcpy from the mempool mbuf.
A new struct rte_eth_hdrs_mbuf describes the payload buffer (virtual
address and IOVA), and the new dev_ops hook hdrs_mbuf_set_cb lets each
PMD wire the callback to its receive queue state.
The API is marked experimental and exported with version 26.07.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
lib/ethdev/ethdev_driver.h | 10 +++++++++
lib/ethdev/rte_ethdev.c | 17 ++++++++++++++
lib/ethdev/rte_ethdev.h | 46 ++++++++++++++++++++++++++++++++++++++
3 files changed, 73 insertions(+)
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 0f336f9567..b48681268c 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -1292,6 +1292,13 @@ typedef int (*eth_cman_config_set_t)(struct rte_eth_dev *dev,
typedef int (*eth_cman_config_get_t)(struct rte_eth_dev *dev,
struct rte_eth_cman_config *config);
+/** @internal
+ * Set header split payload mbuf callback for a receive queue.
+ */
+typedef int (*eth_hdrs_mbuf_set_cb_t)(struct rte_eth_dev *dev,
+ uint16_t rx_queue_id, void *priv,
+ rte_eth_hdrs_mbuf_callback_fn cb);
+
/**
* @internal
* Dump Rx descriptor info to a file.
@@ -1652,6 +1659,9 @@ struct eth_dev_ops {
/** Dump Tx descriptor info */
eth_tx_descriptor_dump_t eth_tx_descriptor_dump;
+ /** Set header split mbuf callback */
+ eth_hdrs_mbuf_set_cb_t hdrs_mbuf_set_cb;
+
/** Get congestion management information */
eth_cman_info_get_t cman_info_get;
/** Initialize congestion management structure with default values */
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 9efeaf77cb..d5820ccd22 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -7316,6 +7316,23 @@ rte_eth_ip_reassembly_conf_set(uint16_t port_id,
return ret;
}
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_hdrs_set_mbuf_callback, 26.07)
+int
+rte_eth_hdrs_set_mbuf_callback(uint16_t port_id, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb)
+{
+ struct rte_eth_dev *dev;
+
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+ dev = &rte_eth_devices[port_id];
+
+ if (dev->dev_ops->hdrs_mbuf_set_cb == NULL)
+ return -ENOTSUP;
+
+ return eth_err(port_id,
+ dev->dev_ops->hdrs_mbuf_set_cb(dev, rx_queue_id, priv, cb));
+}
+
RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_dev_priv_dump, 22.03)
int
rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index ee400b386f..dbf2c23a35 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -6985,6 +6985,52 @@ rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
return rte_eth_tx_buffer_flush(port_id, queue_id, buffer);
}
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice.
+ *
+ * Buffer descriptor for header split payload mbuf callback.
+ */
+struct rte_eth_hdrs_mbuf {
+ void *buf_addr; /**< Virtual address of payload buffer. */
+ rte_iova_t buf_iova; /**< IOVA of payload buffer. */
+};
+
+/**
+ * Callback function type for providing custom payload mbufs
+ * in header split mode.
+ *
+ * @param priv
+ * User-provided private context.
+ * @param mbuf
+ * Pointer to buffer descriptor to be filled by the callback.
+ * @return
+ * 0 on success, negative errno on failure.
+ */
+typedef int (*rte_eth_hdrs_mbuf_callback_fn)(void *priv,
+ struct rte_eth_hdrs_mbuf *mbuf);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice.
+ *
+ * Register a callback to provide custom payload mbufs for header split RX.
+ *
+ * @param port_id
+ * The port identifier of the Ethernet device.
+ * @param rx_queue_id
+ * The index of the receive queue.
+ * @param priv
+ * User-provided private context passed to the callback.
+ * @param cb
+ * Callback function that provides payload buffer descriptors.
+ * @return
+ * 0 on success, negative errno on failure.
+ */
+__rte_experimental
+int rte_eth_hdrs_set_mbuf_callback(uint16_t port_id, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb);
+
/**
* @warning
* @b EXPERIMENTAL: this API may change, or be removed, without prior notice
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 2/7] net/iavf: increase max ring descriptors to hardware limit
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 1/7] ethdev: add header split mbuf callback API Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 3/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
` (6 subsequent siblings)
8 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
The Intel E810 hardware supports up to 8160 (8K - 32) descriptors per
TX/RX ring, but IAVF_MAX_RING_DESC caps it at 4096. Applications that
need deep descriptor rings for hardware rate-limited pacing (e.g.,
ST2110 video with thousands of packets per frame) cannot queue enough
packets before the pacing epoch begins.
Increase IAVF_MAX_RING_DESC to the hardware maximum of 8160 to allow
full utilization of the ring depth on E810 VFs.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/intel/iavf/iavf_rxtx.h b/drivers/net/intel/iavf/iavf_rxtx.h
index 8449236d4d..22ea415f44 100644
--- a/drivers/net/intel/iavf/iavf_rxtx.h
+++ b/drivers/net/intel/iavf/iavf_rxtx.h
@@ -16,7 +16,7 @@
/* In QLEN must be whole number of 32 descriptors. */
#define IAVF_ALIGN_RING_DESC 32
#define IAVF_MIN_RING_DESC 64
-#define IAVF_MAX_RING_DESC 4096
+#define IAVF_MAX_RING_DESC (8192 - 32)
#define IAVF_DMA_MEM_ALIGN 4096
/* Base address of the HW descriptor ring should be 128B aligned. */
#define IAVF_RING_BASE_ALIGN 128
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 3/7] net/iavf: allow runtime queue rate limit configuration
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 1/7] ethdev: add header split mbuf callback API Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 2/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 4/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
` (5 subsequent siblings)
8 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Allow per-queue bandwidth rate limiting to be configured without
stopping the port when only a single TC node and single QoS element
are involved. This enables dynamic session management where individual
queue pacing rates can be changed while other queues continue
transmitting.
Also fix the queue ID assignment in the bandwidth configuration to
use the actual TM node ID rather than a sequential counter index, and
only mark the TM hierarchy as committed when the port is stopped to
permit subsequent reconfiguration.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_tm.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_tm.c b/drivers/net/intel/iavf/iavf_tm.c
index 1cf7bfb106..43d7a44337 100644
--- a/drivers/net/intel/iavf/iavf_tm.c
+++ b/drivers/net/intel/iavf/iavf_tm.c
@@ -804,8 +804,10 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
int index = 0, node_committed = 0;
int i, ret_val = IAVF_SUCCESS;
- /* check if port is stopped */
- if (adapter->stopped != 1) {
+ /* check if port is stopped, except for setting queue bandwidth */
+ if (vf->tm_conf.nb_tc_node != 1 &&
+ vf->qos_cap->num_elem != 1 &&
+ adapter->stopped != 1) {
PMD_DRV_LOG(ERR, "Please stop port first");
ret_val = IAVF_ERR_NOT_READY;
goto err;
@@ -856,7 +858,7 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
q_tc_mapping->tc[tm_node->tc].req.queue_count++;
if (tm_node->shaper_profile) {
- q_bw->cfg[node_committed].queue_id = node_committed;
+ q_bw->cfg[node_committed].queue_id = tm_node->id;
q_bw->cfg[node_committed].shaper.peak =
tm_node->shaper_profile->profile.peak.rate /
1000 * IAVF_BITS_PER_BYTE;
@@ -900,7 +902,8 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
goto fail_clear;
vf->qtc_map = qtc_map;
- vf->tm_conf.committed = true;
+ if (adapter->stopped == 1)
+ vf->tm_conf.committed = true;
return ret_val;
fail_clear:
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 4/7] net/ice/base: reduce default scheduler burst size
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (2 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v2 3/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 5/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
` (4 subsequent siblings)
8 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Reduce ICE_SCHED_DFLT_BURST_SIZE from 15 KB to 2 KB to improve
TX rate limiter granularity. The E810 TX scheduler uses a token
bucket algorithm where the burst size controls the maximum bytes
sent in a single burst before the rate limiter throttles.
A 15 KB burst allows micro-bursts of ~10 max-size frames, which
violates tight inter-packet spacing requirements in time-sensitive
networking applications such as SMPTE ST 2110-21 narrow-sender
compliance. Reducing to 2 KB forces near-constant-rate output
matching the configured shaper profile.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/ice/base/ice_type.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/intel/ice/base/ice_type.h b/drivers/net/intel/ice/base/ice_type.h
index 6d8c187689..39569ff3e3 100644
--- a/drivers/net/intel/ice/base/ice_type.h
+++ b/drivers/net/intel/ice/base/ice_type.h
@@ -1100,7 +1100,7 @@ enum ice_rl_type {
#define ICE_SCHED_NO_SHARED_RL_PROF_ID 0xFFFF
#define ICE_SCHED_DFLT_BW_WT 4
#define ICE_SCHED_INVAL_PROF_ID 0xFFFF
-#define ICE_SCHED_DFLT_BURST_SIZE (15 * 1024) /* in bytes (15k) */
+#define ICE_SCHED_DFLT_BURST_SIZE (2 * 1024) /* in bytes (2k) */
/* Access Macros for Tx Sched RL Profile data */
#define ICE_TXSCHED_GET_RL_PROF_ID(p) LE16_TO_CPU((p)->info.profile_id)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 5/7] net/ice: timestamp all received packets when PTP is enabled
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (3 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v2 4/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 6/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
` (3 subsequent siblings)
8 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
When PTP is enabled on the ICE PMD, hardware RX timestamps are only
applied to packets classified as IEEE 1588 (Ethertype 0x88F7). This
prevents applications from obtaining hardware timestamps on regular
UDP/IP traffic.
Remove the TIMESYNC packet type filter so that all received packets
get hardware timestamps when PTP is enabled. This is required for
time-sensitive networking applications that need per-packet arrival
timing on media traffic, such as ST 2110-21 receiver compliance
monitoring.
The change affects all three RX paths: scan, scattered, and single
packet receive functions.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/ice/ice_rxtx.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index c4b5454c53..8d709125f7 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -2023,8 +2023,7 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((mb->packet_type &
- RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxdp[j].wb.flex_ts.ts_high);
mb->timesync = rxq->queue_id;
@@ -2390,8 +2389,7 @@ ice_recv_scattered_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((first_seg->packet_type & RTE_PTYPE_L2_MASK)
- == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
first_seg->timesync = rxq->queue_id;
@@ -2881,8 +2879,7 @@ ice_recv_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((rxm->packet_type & RTE_PTYPE_L2_MASK) ==
- RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
rxm->timesync = rxq->queue_id;
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 6/7] net/iavf: disable runtime queue setup capability
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (4 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v2 5/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 7/7] net/intel: support header split mbuf callback Dawid Wesierski
` (2 subsequent siblings)
8 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Remove the advertisement of RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
and RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP capabilities from the
iavf VF driver.
Runtime queue setup on E810 VFs causes queue state corruption when
queues are dynamically reconfigured while the hardware rate limiter
is actively pacing TX queues. Queue configuration messages to the PF
via virtchnl can race with ongoing TX operations, leading to undefined
behavior.
By not advertising these capabilities, all queues are configured at
port start and remain stable throughout the port lifecycle.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_ethdev.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index ec1ad02826..ab223e6afd 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -1160,9 +1160,6 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
dev_info->reta_size = vf->vf_res->rss_lut_size;
dev_info->flow_type_rss_offloads = IAVF_RSS_OFFLOAD_ALL;
dev_info->max_mac_addrs = IAVF_NUM_MACADDR_MAX;
- dev_info->dev_capa =
- RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
- RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
dev_info->rx_offload_capa =
RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
RTE_ETH_RX_OFFLOAD_QINQ_STRIP |
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v2 7/7] net/intel: support header split mbuf callback
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (5 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v2 6/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
@ 2026-06-18 14:44 ` Dawid Wesierski
2026-06-29 15:33 ` Tested the v3 series on Intel E810-C (Columbiaville) hardware Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
2026-06-18 15:45 ` [PATCH v2 0/7] Intel network drivers enhancements Stephen Hemminger
2026-06-18 15:46 ` Stephen Hemminger
8 siblings, 2 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-18 14:44 UTC (permalink / raw)
To: dev; +Cc: thomas, david.marchand, Marek Kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Wire the new ethdev header split mbuf callback API into the ICE PMD.
A new dev_ops hook, hdrs_mbuf_set_cb, lets applications register a
callback (and private context) on a receive queue; the callback returns
a payload buffer (virtual address and IOVA) that overrides the default
mempool-backed payload mbuf for header split RX.
The callback is invoked at three allocation points in the ICE driver:
- initial queue setup (ice_alloc_rx_queue_mbufs),
- bulk buffer allocation (ice_rx_alloc_bufs),
- single-packet receive path (ice_recv_pkts).
This enables zero-copy RX for header split: the NIC DMAs the payload
directly into application-managed buffers (e.g., mapped frame buffers
with known IOVA), bypassing an extra memcpy from the mempool mbuf.
Depends on: "ethdev: add header split mbuf callback API"
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/common/rx.h | 2 +
drivers/net/intel/ice/ice_ethdev.c | 1 +
drivers/net/intel/ice/ice_rxtx.c | 63 ++++++++++++++++++++++++++++++
drivers/net/intel/ice/ice_rxtx.h | 2 +
4 files changed, 68 insertions(+)
diff --git a/drivers/net/intel/common/rx.h b/drivers/net/intel/common/rx.h
index e0bf520ebd..8abb2a3ce9 100644
--- a/drivers/net/intel/common/rx.h
+++ b/drivers/net/intel/common/rx.h
@@ -113,6 +113,8 @@ struct ci_rx_queue {
uint32_t hw_time_low; /* low 32 bits of timestamp */
int ts_offset; /* dynamic mbuf timestamp field offset */
uint64_t ts_flag; /* dynamic mbuf timestamp flag */
+ rte_eth_hdrs_mbuf_callback_fn hdrs_mbuf_cb; /* hdr split mbuf cb */
+ void *hdrs_mbuf_cb_priv; /* hdr split mbuf cb priv */
};
struct { /* iavf specific values */
const struct iavf_rxq_ops *ops; /**< queue ops */
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index ad9c49b339..353da8f2bd 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -282,6 +282,7 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
.dev_set_link_down = ice_dev_set_link_down,
.dev_led_on = ice_dev_led_on,
.dev_led_off = ice_dev_led_off,
+ .hdrs_mbuf_set_cb = ice_hdrs_mbuf_set_cb,
.rx_queue_start = ice_rx_queue_start,
.rx_queue_stop = ice_rx_queue_stop,
.tx_queue_start = ice_tx_queue_start,
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index 8d709125f7..867f595291 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -487,6 +487,17 @@ ice_alloc_rx_queue_mbufs(struct ci_rx_queue *rxq)
return -ENOMEM;
}
+ if (rxq->hdrs_mbuf_cb) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ mbuf_pay->buf_addr = hdrs_mbuf.buf_addr;
+ mbuf_pay->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
+
mbuf_pay->next = NULL;
mbuf_pay->data_off = RTE_PKTMBUF_HEADROOM;
mbuf_pay->nb_segs = 1;
@@ -2126,6 +2137,16 @@ ice_rx_alloc_bufs(struct ci_rx_queue *rxq)
rxdp[i].read.pkt_addr = dma_addr;
} else {
mb->next = rxq->sw_split_buf[i].mbuf;
+ if (rxq->hdrs_mbuf_cb && mb->next) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ mb->next->buf_addr = hdrs_mbuf.buf_addr;
+ mb->next->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
pay_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(mb->next));
rxdp[i].read.hdr_addr = dma_addr;
rxdp[i].read.pkt_addr = pay_addr;
@@ -2810,6 +2831,17 @@ ice_recv_pkts(void *rx_queue,
break;
}
+ if (rxq->hdrs_mbuf_cb) {
+ struct rte_eth_hdrs_mbuf hdrs_mbuf = {0};
+ int ret = rxq->hdrs_mbuf_cb(rxq->hdrs_mbuf_cb_priv,
+ &hdrs_mbuf);
+
+ if (ret >= 0) {
+ nmb_pay->buf_addr = hdrs_mbuf.buf_addr;
+ nmb_pay->buf_iova = hdrs_mbuf.buf_iova;
+ }
+ }
+
nmb->next = nmb_pay;
nmb_pay->next = NULL;
@@ -4533,3 +4565,34 @@ ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc)
}
+
+int
+ice_hdrs_mbuf_set_cb(struct rte_eth_dev *dev, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb)
+{
+ struct ci_rx_queue *rxq;
+
+ if (rx_queue_id >= dev->data->nb_rx_queues) {
+ PMD_DRV_LOG(ERR, "RX queue %u out of range", rx_queue_id);
+ return -EINVAL;
+ }
+
+ rxq = dev->data->rx_queues[rx_queue_id];
+ if (rxq == NULL) {
+ PMD_DRV_LOG(ERR, "RX queue %u not available or setup", rx_queue_id);
+ return -EINVAL;
+ }
+
+ if (rxq->hdrs_mbuf_cb) {
+ PMD_DRV_LOG(ERR, "RX queue %u has hdrs mbuf cb already",
+ rx_queue_id);
+ return -EEXIST;
+ }
+
+ rxq->hdrs_mbuf_cb_priv = priv;
+ rxq->hdrs_mbuf_cb = cb;
+ PMD_DRV_LOG(NOTICE, "RX queue %u register hdrs mbuf cb at %p",
+ rx_queue_id, cb);
+
+ return 0;
+}
diff --git a/drivers/net/intel/ice/ice_rxtx.h b/drivers/net/intel/ice/ice_rxtx.h
index 999b6b30d6..7ed114ee94 100644
--- a/drivers/net/intel/ice/ice_rxtx.h
+++ b/drivers/net/intel/ice/ice_rxtx.h
@@ -303,6 +303,8 @@ uint16_t ice_xmit_pkts_vec_avx512_offload(void *tx_queue,
int ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc);
int ice_tx_done_cleanup(void *txq, uint32_t free_cnt);
int ice_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc);
+int ice_hdrs_mbuf_set_cb(struct rte_eth_dev *dev, uint16_t rx_queue_id,
+ void *priv, rte_eth_hdrs_mbuf_callback_fn cb);
enum rte_vect_max_simd ice_get_max_simd_bitwidth(void);
#define FDIR_PARSING_ENABLE_PER_QUEUE(ad, on) do { \
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH v3 1/1] pcapng: add user-supplied timestamp support
2026-06-18 14:44 ` [PATCH v3 1/1] pcapng: add user-supplied timestamp support Dawid Wesierski
@ 2026-06-18 15:20 ` Stephen Hemminger
0 siblings, 0 replies; 44+ messages in thread
From: Stephen Hemminger @ 2026-06-18 15:20 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, Marek Kasiewicz
On Thu, 18 Jun 2026 10:44:29 -0400
Dawid Wesierski <dawid.wesierski@intel.com> wrote:
> +static inline struct rte_mbuf *
> rte_pcapng_copy(uint16_t port_id, uint32_t queue,
> const struct rte_mbuf *m, struct rte_mempool *mp,
> uint32_t length,
> - enum rte_pcapng_direction direction, const char *comment);
> + enum rte_pcapng_direction direction, const char *comment)
> +{
> + return rte_pcapng_copy_ts(port_id, queue, m, mp, length, direction,
> + comment, 0);
> +}
>
Switching from function to inline in header would cause ABI breakage.
New build would not have old function to runtime linking.
In this case, please just keep the old function name but add
a parameter using function versioning.
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v2 0/7] Intel network drivers enhancements
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (6 preceding siblings ...)
2026-06-18 14:44 ` [PATCH v2 7/7] net/intel: support header split mbuf callback Dawid Wesierski
@ 2026-06-18 15:45 ` Stephen Hemminger
2026-06-18 15:46 ` Stephen Hemminger
8 siblings, 0 replies; 44+ messages in thread
From: Stephen Hemminger @ 2026-06-18 15:45 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, david.marchand, Marek Kasiewicz
On Thu, 18 Jun 2026 10:44:35 -0400
Dawid Wesierski <dawid.wesierski@intel.com> wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> This series introduces several improvements to Intel iavf and ice
> drivers, including a new ethdev API for header split mbuf callbacks,
> increased ring descriptors, and improved PTP timestamping.
>
> Marek Kasiewicz (7):
> ethdev: add header split mbuf callback API
> net/iavf: increase max ring descriptors to hardware limit
> net/iavf: allow runtime queue rate limit configuration
> net/ice/base: reduce default scheduler burst size
> net/ice: timestamp all received packets when PTP is enabled
> net/iavf: disable runtime queue setup capability
> net/intel: support header split mbuf callback
>
> drivers/net/intel/common/rx.h | 2 +
> drivers/net/intel/iavf/iavf_ethdev.c | 3 --
> drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
> drivers/net/intel/iavf/iavf_tm.c | 11 ++--
> drivers/net/intel/ice/base/ice_type.h | 2 +-
> drivers/net/intel/ice/ice_ethdev.c | 1 +
> drivers/net/intel/ice/ice_rxtx.c | 72 ++++++++++++++++++++++++---
> drivers/net/intel/ice/ice_rxtx.h | 2 +
> lib/ethdev/ethdev_driver.h | 15 +++++++
> lib/ethdev/rte_ethdev.c | 51 ++++++++++++++++++++++
> lib/ethdev/rte_ethdev.h | 7 +++
> 11 files changed, 153 insertions(+), 15 deletions(-)
>
This looks interesting but I don't understand the motivation
or use case for the new code. There is no documentation, examples
or test integration. At this point the patch is in pure RFC state.
More wordy answer from AI...
Documentation and motivation
This adds a new public ethdev RX mechanism but ships no prose
rationale, no documentation, and no worked example. For a new API
the series needs to make the case before the code can be evaluated.
Missing documentation:
- No prog_guide section. A new RX model -- header split where the
application supplies the payload buffer -- needs a write-up (e.g.
in doc/guides/prog_guide) covering the buffer-lifetime contract,
the IOVA/headroom semantics, which offloads must be enabled
(RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT), and what happens on a PMD that
does not implement the hook.
- No example or testpmd integration. There is no end-to-end flow a
reviewer can read or run: register the callback, supply buffers,
receive, consume, recycle. Without one there is no demonstrated
use case and no way to validate the design (the mempool-corruption
and headroom issues in 7/7 would likely have surfaced in a working
example).
Missing motivation:
- The actual use case is not named. "Zero-copy RX into mapped frame
buffers with known IOVA" describes a mechanism, not a user. Who
needs this -- an AF_XDP-style external umem, a GPU/DMA target
(gpudev), something else? State it.
- The benefit is unquantified. The claim is avoiding "an extra
memcpy from the mempool mbuf," but the patch replaces that with a
per-allocation indirect callback on the Rx fast path
(ice_recv_pkts, ice_rx_alloc_bufs). The rationale should show the
memcpy actually exists in the path being optimized and that the
indirect call per buffer is a net win.
- It does not explain why existing mechanisms are insufficient. DPDK
already lets an application own payload memory via
rte_pktmbuf_attach_extbuf() and via external-buffer mempools
(pinned external memory passed to the Rx mempool). The series must
argue why a new callback API is needed instead of those -- this is
the same alternative raised against the 7/7 implementation, so the
motivation and the correctness fix point at the same question.
- Constraints are undocumented: PMD support scope, fast-path
threading and reentrancy of the callback, and interaction with the
buffer-split configuration.
Until there is a documented model and at least one example showing
the buffer lifecycle, it is hard to tell whether the callback API is
the right shape -- or whether attach_extbuf / an external-mempool
already covers the use case.
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v2 0/7] Intel network drivers enhancements
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
` (7 preceding siblings ...)
2026-06-18 15:45 ` [PATCH v2 0/7] Intel network drivers enhancements Stephen Hemminger
@ 2026-06-18 15:46 ` Stephen Hemminger
8 siblings, 0 replies; 44+ messages in thread
From: Stephen Hemminger @ 2026-06-18 15:46 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, david.marchand, Marek Kasiewicz
On Thu, 18 Jun 2026 10:44:35 -0400
Dawid Wesierski <dawid.wesierski@intel.com> wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> This series introduces several improvements to Intel iavf and ice
> drivers, including a new ethdev API for header split mbuf callbacks,
> increased ring descriptors, and improved PTP timestamping.
>
> Marek Kasiewicz (7):
> ethdev: add header split mbuf callback API
> net/iavf: increase max ring descriptors to hardware limit
> net/iavf: allow runtime queue rate limit configuration
> net/ice/base: reduce default scheduler burst size
> net/ice: timestamp all received packets when PTP is enabled
> net/iavf: disable runtime queue setup capability
> net/intel: support header split mbuf callback
>
> drivers/net/intel/common/rx.h | 2 +
> drivers/net/intel/iavf/iavf_ethdev.c | 3 --
> drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
> drivers/net/intel/iavf/iavf_tm.c | 11 ++--
> drivers/net/intel/ice/base/ice_type.h | 2 +-
> drivers/net/intel/ice/ice_ethdev.c | 1 +
> drivers/net/intel/ice/ice_rxtx.c | 72 ++++++++++++++++++++++++---
> drivers/net/intel/ice/ice_rxtx.h | 2 +
> lib/ethdev/ethdev_driver.h | 15 +++++++
> lib/ethdev/rte_ethdev.c | 51 ++++++++++++++++++++++
> lib/ethdev/rte_ethdev.h | 7 +++
> 11 files changed, 153 insertions(+), 15 deletions(-)
>
AI review found lots of problems with the implementation as well.
Series composition
This v2 series bundles seven patches under one cover letter, but only
1/7 (ethdev API) and 7/7 (net/intel) implement the header-split mbuf
callback. Patches 2/7 (iavf max ring desc), 3/7 (iavf queue rate
limit), 4/7 (ice base burst size), 5/7 (ice PTP timestamp), and 6/7
(iavf runtime queue setup) are unrelated driver changes. Please split
these into a separate series so each can be reviewed and merged on its
own merits; mixing them obscures the dependency and complicates bisect.
[PATCH v2 1/7] ethdev: add header split mbuf callback API
Warning: struct rte_eth_hdrs_mbuf carries only buf_addr and buf_iova,
no length. The callback therefore cannot tell the PMD how large the
application buffer is. In buffer-split mode the NIC DMAs up to the
queue's configured payload buffer size; if the application buffer is
smaller, the hardware writes past it. Add a length field and have the
PMD (and/or ethdev) validate it against the configured payload size.
Warning: the buffer lifetime and ownership are undocumented. The
Doxygen does not state who owns the buffer after the payload mbuf is
freed, whether the address is consumed as-is or with headroom applied
(the 7/7 implementation adds RTE_PKTMBUF_HEADROOM to the IOVA -- see
below), or that the callback must return a distinct buffer per call.
These are contract details an application cannot guess.
Warning: new experimental API with no testpmd hook and no functional
test in app/test. Both are required for new ethdev API.
Warning: new experimental public API but no release notes entry
(doc/guides/rel_notes/release_26_07.rst). The series touches only the
three code files.
Info: rte_eth_hdrs_set_mbuf_callback() validates port_id and the
hdrs_mbuf_set_cb hook, but passes rx_queue_id to the PMD without
checking it against dev->data->nb_rx_queues. Sibling per-queue ethdev
calls (e.g. rte_eth_rx_queue_setup) validate the queue id at the
ethdev layer. The ICE PMD does check it in 7/7, but validating in the
wrapper would be consistent and would protect future PMDs that forget.
[PATCH v2 7/7] net/intel: support header split mbuf callback
Error: overwriting buf_addr/buf_iova on a pool mbuf corrupts the
payload mempool. At all three sites (ice_alloc_rx_queue_mbufs,
ice_rx_alloc_bufs, ice_recv_pkts) the payload mbuf is allocated from
rxq->rxseg[1].mp and then has its buf_addr/buf_iova rewritten to point
at application memory:
if (ret >= 0) {
mbuf_pay->buf_addr = hdrs_mbuf.buf_addr;
mbuf_pay->buf_iova = hdrs_mbuf.buf_iova;
}
DPDK never restores buf_addr/buf_iova on free. When these mbufs are
returned to rxseg[1].mp (via rte_pktmbuf_free of the received chain,
or _ice_rx_queue_release_mbufs on queue stop), the pool objects retain
the foreign buffer pointer, and buf_len still describes the original
mempool buffer. The next rte_mbuf_raw_alloc()/raw_alloc_bulk() from
that pool hands back an mbuf pointing at application memory. The
correct mechanism for pointing an mbuf at non-pool memory is
rte_pktmbuf_attach_extbuf() (sets buf_addr/buf_iova/buf_len, the
EXTERNAL flag, and a free callback), or a dedicated external-buffer
mempool. As written the payload pool is progressively poisoned.
Error: the callback's failure return is swallowed. On ret < 0 the code
skips the address update but still programs the descriptor from the
mbuf's current buf_iova:
rxdp->read.pkt_addr =
rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb_pay));
Because of the pool corruption above, a recycled mbuf's buf_iova may
point at a buffer the application already reclaimed, so a failed
callback silently arms the NIC to DMA into stale/foreign memory. A
callback failure should abort the refill (or fall back to a known-good
pool buffer), not fall through. Separately, the documented contract is
"0 on success, negative on failure"; the test should be ret == 0, not
ret >= 0.
Warning: RTE_PKTMBUF_HEADROOM is silently applied to the supplied
IOVA. The descriptor is programmed with rte_mbuf_data_iova_default(),
i.e. buf_iova + data_off (128), but the API documents buf_iova as "the
IOVA of the payload buffer". The NIC therefore writes 128 bytes into
the application buffer, and the tail of a buffer sized to the payload
overruns by the headroom. Either document that the headroom offset is
applied, or program pkt_addr from the raw buf_iova for callback-
provided buffers.
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v2 1/7] ethdev: add header split mbuf callback API
2026-06-18 14:44 ` [PATCH v2 1/7] ethdev: add header split mbuf callback API Dawid Wesierski
@ 2026-06-18 16:26 ` Thomas Monjalon
0 siblings, 0 replies; 44+ messages in thread
From: Thomas Monjalon @ 2026-06-18 16:26 UTC (permalink / raw)
To: Marek Kasiewicz, Dawid Wesierski
Cc: dev, david.marchand, Stephen Hemminger, andrew.rybchenko
Hello,
Please use --cc-cmd devtools/get-maintainer.sh so maintainers are Cc'ed.
18/06/2026 16:44, Dawid Wesierski:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> Add rte_eth_hdrs_set_mbuf_callback() that allows applications to
> register a callback providing custom payload mbufs for header split RX
> mode. When registered, a PMD that supports header split is expected to
> call this callback at mbuf allocation points to obtain user-provided
> payload buffers instead of allocating from the mempool.
What is not working with the current API?
You can already use an external buffer.
> This enables zero-copy RX for header split: the NIC DMAs the payload
> directly into application-managed buffers (e.g., mapped frame buffers
> with known IOVA), bypassing an extra memcpy from the mempool mbuf.
Do you know the flag RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF?
> A new struct rte_eth_hdrs_mbuf describes the payload buffer (virtual
> address and IOVA), and the new dev_ops hook hdrs_mbuf_set_cb lets each
> PMD wire the callback to its receive queue state.
>
> The API is marked experimental and exported with version 26.07.
I think this API is not necessary.
^ permalink raw reply [flat|nested] 44+ messages in thread
* Tested the v3 series on Intel E810-C (Columbiaville) hardware.
2026-06-18 14:44 ` [PATCH v2 7/7] net/intel: support header split mbuf callback Dawid Wesierski
@ 2026-06-29 15:33 ` Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
1 sibling, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-29 15:33 UTC (permalink / raw)
To: dev; +Cc: dawid.wesierski, marek.kasiewicz, stephen, bruce.richardson
app/testpmd: The 'create pinned-rxpool' command successfully creates
pinned external-buffer mempools for buffer-split segments.
net/ice: The 'rl_burst_size' devarg correctly configures the scheduler
burst size, verified via debug traces.
net/iavf: The 'no_runtime_queue_setup' devarg successfully disables
the advertisement of runtime queue setup capabilities.
net/iavf: Verified max ring descriptors increased to 8160.
Tested-by: Dawid Wesierski <dawid.wesierski@intel.com>
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v3 0/6] Intel network drivers enhancements
2026-06-18 14:44 ` [PATCH v2 7/7] net/intel: support header split mbuf callback Dawid Wesierski
2026-06-29 15:33 ` Tested the v3 series on Intel E810-C (Columbiaville) hardware Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
` (7 more replies)
1 sibling, 8 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
This series collects Intel E810 iavf and ice driver enhancements developed
for the Media Transport Library (MTL) to support high-performance SMPTE
ST 2110 media streaming workflows.
The "new code" in this series (specifically the testpmd enhancement in
patch 6) demonstrates how the standard DPDK buffer-split offload can be
orchestrated with pinned external-buffer mempools
(RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF) to achieve this. By pinning mbufs to
contiguous hugepages, the NIC DMAs RTP payloads directly into application-
owned memory. This eliminates the need for the header-split.
Documentation and a concrete configuration example for this workflow are
included in the testpmd user guide (patch 6/6). The new 'create pinned-rxpool'
command serves as both a test vehicle and a reference implementation for
integrators.
In this series:
- iavf maximum ring descriptor count to raised 4096 (HW limit).
- iavf queue rate limit enabled reconfiguration at runtime.
- Added opt-in "rl_burst_size" ice devarg for tighter packet spacing (jitter reduction).
- Enabled PTP timestamping for all packets on ice.
- Added opt-in "no_runtime_queue_setup" iavf devarg to restore strict
initialization semantics when required.
- Dropped the ethdev and net/intel "header-split mbuf callback" API
- Replaced the out-of-tree approach with a testpmd demonstration (patch 6)
of the standard, upstream-preferred pinned-external-buffer workflow.
- Fixed iavf error propagation and committed-state logic (Stephen Hemminger).
- Converted the ice scheduler burst reduction and iavf runtime-config
disabling into opt-in devargs to preserve default behavior.
- Updated documentation, commit messages, and .mailmap.
Dawid Wesierski (1):
app/testpmd: add pinned external-buffer Rx pool command
Marek Kasiewicz (5):
net/iavf: increase max ring descriptors to hardware limit
net/iavf: allow runtime queue rate limit configuration
net/ice: add scheduler rate-limiter burst size devarg
net/ice: timestamp all received packets when PTP is enabled
net/iavf: disable runtime queue setup capability
.mailmap | 2 +
app/test-pmd/cmdline.c | 123 ++++++++++++++++++++
doc/guides/nics/ice.rst | 12 ++
doc/guides/nics/intel_vf.rst | 9 ++
doc/guides/rel_notes/release_26_07.rst | 7 ++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 82 +++++++++++++
drivers/net/intel/iavf/iavf.h | 1 +
drivers/net/intel/iavf/iavf_ethdev.c | 22 +++-
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
drivers/net/intel/iavf/iavf_tm.c | 25 ++--
drivers/net/intel/ice/ice_ethdev.c | 46 ++++++++
drivers/net/intel/ice/ice_ethdev.h | 1 +
drivers/net/intel/ice/ice_rxtx.c | 9 +-
13 files changed, 321 insertions(+), 20 deletions(-)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 14:29 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
` (6 subsequent siblings)
7 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
The Intel E810 hardware supports up to 8160 (8K - 32) descriptors per
TX/RX ring, but IAVF_MAX_RING_DESC caps it at 4096. Applications that
need deep descriptor rings for hardware rate-limited pacing (e.g.,
ST2110 video with thousands of packets per frame) cannot queue enough
packets before the pacing epoch begins.
Increase IAVF_MAX_RING_DESC to the hardware maximum of 8160 to allow
full utilization of the ring depth on E810 VFs.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
.mailmap | 2 ++
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/.mailmap b/.mailmap
index 4001e5fb0e..d7b175de2a 100644
--- a/.mailmap
+++ b/.mailmap
@@ -366,6 +366,7 @@ David Zeng <zengxhsh@cn.ibm.com>
Davide Caratti <dcaratti@redhat.com>
Dawid Gorecki <dgr@semihalf.com>
Dawid Jurczak <dawid_jurek@vp.pl>
+Dawid Wesierski <dawid.wesierski@intel.com>
Dawid Zielinski <dawid.zielinski@intel.com>
Dawid Łukwiński <dawid.lukwinski@intel.com>
Daxue Gao <daxuex.gao@intel.com>
@@ -1014,6 +1015,7 @@ Marcin Wilk <marcin.wilk@caviumnetworks.com>
Marcin Wojtas <mw@semihalf.com>
Marcin Zapolski <marcinx.a.zapolski@intel.com>
Marco Varlese <mvarlese@suse.de>
+Marek Kasiewicz <marek.kasiewicz@intel.com>
Marek Mical <marekx.mical@intel.com>
Marek Zalfresso-jundzillo <marekx.zalfresso-jundzillo@intel.com>
Maria Lingemark <maria.lingemark@ericsson.com>
diff --git a/drivers/net/intel/iavf/iavf_rxtx.h b/drivers/net/intel/iavf/iavf_rxtx.h
index 8449236d4d..22ea415f44 100644
--- a/drivers/net/intel/iavf/iavf_rxtx.h
+++ b/drivers/net/intel/iavf/iavf_rxtx.h
@@ -16,7 +16,7 @@
/* In QLEN must be whole number of 32 descriptors. */
#define IAVF_ALIGN_RING_DESC 32
#define IAVF_MIN_RING_DESC 64
-#define IAVF_MAX_RING_DESC 4096
+#define IAVF_MAX_RING_DESC (8192 - 32)
#define IAVF_DMA_MEM_ALIGN 4096
/* Base address of the HW descriptor ring should be 128B aligned. */
#define IAVF_RING_BASE_ALIGN 128
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 14:46 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
` (5 subsequent siblings)
7 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Allow per-queue bandwidth rate limiting to be configured without
stopping the port when only a single TC node and single QoS element
are involved. This enables dynamic session management where individual
queue pacing rates can be changed while other queues continue
transmitting.
Also fix the queue ID assignment in the bandwidth configuration to
use the actual TM node ID rather than a sequential counter index, and
only mark the TM hierarchy as committed when the port is stopped to
permit subsequent reconfiguration.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_tm.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_tm.c b/drivers/net/intel/iavf/iavf_tm.c
index 1cf7bfb106..e3492ec491 100644
--- a/drivers/net/intel/iavf/iavf_tm.c
+++ b/drivers/net/intel/iavf/iavf_tm.c
@@ -804,19 +804,25 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
int index = 0, node_committed = 0;
int i, ret_val = IAVF_SUCCESS;
- /* check if port is stopped */
- if (adapter->stopped != 1) {
- PMD_DRV_LOG(ERR, "Please stop port first");
- ret_val = IAVF_ERR_NOT_READY;
- goto err;
- }
-
if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS)) {
PMD_DRV_LOG(ERR, "VF queue tc mapping is not supported");
ret_val = IAVF_NOT_SUPPORTED;
goto fail_clear;
}
+ /*
+ * Allow reconfiguration on a running port only when a single queue is
+ * involved (single TC node and single QoS element); otherwise the port
+ * must be stopped first. qos_cap is valid here because the
+ * VIRTCHNL_VF_OFFLOAD_QOS capability was checked above.
+ */
+ if ((vf->tm_conf.nb_tc_node != 1 || vf->qos_cap->num_elem != 1) &&
+ adapter->stopped != 1) {
+ PMD_DRV_LOG(ERR, "Please stop port first");
+ ret_val = IAVF_ERR_NOT_READY;
+ goto err;
+ }
+
/* check if all TC nodes are set with VF vsi */
if (vf->tm_conf.nb_tc_node != vf->qos_cap->num_elem) {
PMD_DRV_LOG(ERR, "Does not set VF vsi nodes to all TCs");
@@ -856,7 +862,7 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
q_tc_mapping->tc[tm_node->tc].req.queue_count++;
if (tm_node->shaper_profile) {
- q_bw->cfg[node_committed].queue_id = node_committed;
+ q_bw->cfg[node_committed].queue_id = tm_node->id;
q_bw->cfg[node_committed].shaper.peak =
tm_node->shaper_profile->profile.peak.rate /
1000 * IAVF_BITS_PER_BYTE;
@@ -900,7 +906,8 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
goto fail_clear;
vf->qtc_map = qtc_map;
- vf->tm_conf.committed = true;
+ if (adapter->stopped == 1)
+ vf->tm_conf.committed = true;
return ret_val;
fail_clear:
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 15:20 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
` (4 subsequent siblings)
7 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
The E810 Tx scheduler uses a token bucket algorithm where the burst
size controls the maximum bytes sent in a single burst before the
rate limiter throttles. The hardware default of 15 KB allows
micro-bursts of ~10 max-size frames, which violates tight
inter-packet spacing requirements in time-sensitive networking
applications such as SMPTE ST 2110-21 narrow-sender compliance.
Add a "rl_burst_size" device argument that lets the application lower
the scheduler rate-limiter burst size (for example to 2 KB) to force
near-constant-rate output matching the configured shaper profile.
The burst size is a global scheduler resource, so the override is
applied once at probe time and only when the user explicitly requests
it; the hardware default is left unchanged otherwise.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
doc/guides/nics/ice.rst | 12 +++++++
doc/guides/rel_notes/release_26_07.rst | 5 +++
drivers/net/intel/ice/ice_ethdev.c | 46 ++++++++++++++++++++++++++
drivers/net/intel/ice/ice_ethdev.h | 1 +
4 files changed, 64 insertions(+)
diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst
index 8251416918..187c7e821f 100644
--- a/doc/guides/nics/ice.rst
+++ b/doc/guides/nics/ice.rst
@@ -158,6 +158,18 @@ Runtime Configuration
-a 80:00.0,source-prune=1
+- ``Scheduler rate-limiter burst size`` (default ``0``)
+
+ The hardware Tx scheduler uses a default rate-limiter burst size that favours
+ throughput. Time-sensitive applications can lower this value to reduce Tx
+ latency jitter at the cost of throughput by setting the ``rl_burst_size``
+ devargs parameter, in bytes. The value is clamped to the hardware-allowed
+ range. A value of ``0`` (the default) keeps the hardware default.
+
+ For example::
+
+ -a 80:00.0,rl_burst_size=2048
+
- ``Protocol extraction for per queue``
Configure the RX queues to do protocol extraction into mbuf for protocol
diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
index 5d7aa8d1bf..db8c4d5b16 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -136,6 +136,11 @@ New Features
* Added support for transmitting LLDP packets based on mbuf packet type.
* Implemented AVX2 context descriptor transmit paths.
+* **Updated Intel ice driver.**
+
+ * Added ``rl_burst_size`` devarg to configure the scheduler rate-limiter
+ burst size, reducing Tx latency jitter for time-sensitive traffic.
+
* **Updated NVIDIA mlx5 ethernet driver.**
* Added support for selective Rx in scalar SPRQ Rx path.
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index ad9c49b339..465cf07383 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -41,6 +41,7 @@
#define ICE_DDP_FILENAME_ARG "ddp_pkg_file"
#define ICE_DDP_LOAD_SCHED_ARG "ddp_load_sched_topo"
#define ICE_TM_LEVELS_ARG "tm_sched_levels"
+#define ICE_RL_BURST_SIZE_ARG "rl_burst_size"
#define ICE_SOURCE_PRUNE_ARG "source-prune"
#define ICE_LINK_STATE_ON_CLOSE "link_state_on_close"
@@ -59,6 +60,7 @@ static const char * const ice_valid_args[] = {
ICE_DDP_FILENAME_ARG,
ICE_DDP_LOAD_SCHED_ARG,
ICE_TM_LEVELS_ARG,
+ ICE_RL_BURST_SIZE_ARG,
ICE_SOURCE_PRUNE_ARG,
ICE_LINK_STATE_ON_CLOSE,
NULL
@@ -2147,6 +2149,29 @@ parse_u64(const char *key, const char *value, void *args)
return 0;
}
+static int
+parse_u32(const char *key, const char *value, void *args)
+{
+ uint32_t *num = args;
+ unsigned long tmp;
+ char *endptr;
+
+ errno = 0;
+ tmp = strtoul(value, &endptr, 0);
+ if (errno != 0 || endptr == value || *endptr != '\0') {
+ PMD_DRV_LOG(WARNING, "%s: \"%s\" is not a valid u32", key, value);
+ return -1;
+ }
+ if (tmp > UINT32_MAX) {
+ PMD_DRV_LOG(WARNING, "%s: value \"%s\" is out of range", key, value);
+ return -1;
+ }
+
+ *num = (uint32_t)tmp;
+
+ return 0;
+}
+
static int
parse_tx_sched_levels(const char *key, const char *value, void *args)
{
@@ -2448,6 +2473,11 @@ static int ice_parse_devargs(struct rte_eth_dev *dev)
if (ret)
goto bail;
+ ret = rte_kvargs_process(kvlist, ICE_RL_BURST_SIZE_ARG,
+ &parse_u32, &ad->devargs.rl_burst_size);
+ if (ret)
+ goto bail;
+
ret = rte_kvargs_process(kvlist, ICE_SOURCE_PRUNE_ARG,
&parse_bool, &ad->devargs.source_prune);
if (ret)
@@ -2662,6 +2692,21 @@ ice_dev_init(struct rte_eth_dev *dev)
return -EINVAL;
}
+ /*
+ * Override the hardware default scheduler rate-limiter burst size only
+ * when the user explicitly requests it. A smaller burst reduces Tx
+ * latency jitter for time-sensitive traffic at the cost of throughput,
+ * so it must not change for every port. ice_cfg_rl_burst_size()
+ * validates the value against the hardware-allowed range.
+ */
+ if (ad->devargs.rl_burst_size != 0 &&
+ ice_cfg_rl_burst_size(hw, ad->devargs.rl_burst_size) != 0) {
+ PMD_INIT_LOG(ERR, "Invalid rl_burst_size %u bytes",
+ ad->devargs.rl_burst_size);
+ ice_deinit_hw(hw);
+ return -EINVAL;
+ }
+
#ifndef RTE_EXEC_ENV_WINDOWS
use_dsn = false;
dsn = 0;
@@ -7713,6 +7758,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_ice,
ICE_DDP_FILENAME_ARG "=</path/to/file>"
ICE_DDP_LOAD_SCHED_ARG "=<0|1>"
ICE_TM_LEVELS_ARG "=<N>"
+ ICE_RL_BURST_SIZE_ARG "=<N>"
ICE_SOURCE_PRUNE_ARG "=<0|1>"
ICE_RX_LOW_LATENCY_ARG "=<0|1>"
ICE_LINK_STATE_ON_CLOSE "=<down|up|initial>");
diff --git a/drivers/net/intel/ice/ice_ethdev.h b/drivers/net/intel/ice/ice_ethdev.h
index 20e8a13fe9..0a9d75b9cd 100644
--- a/drivers/net/intel/ice/ice_ethdev.h
+++ b/drivers/net/intel/ice/ice_ethdev.h
@@ -631,6 +631,7 @@ struct ice_devargs {
uint8_t ddp_load_sched;
uint8_t tm_exposed_levels;
uint8_t source_prune;
+ uint32_t rl_burst_size;
int link_state_on_close;
int xtr_field_offs;
uint8_t xtr_flag_offs[PROTO_XTR_MAX];
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
` (2 preceding siblings ...)
2026-06-30 12:06 ` [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 15:39 ` Bruce Richardson
2026-07-03 20:00 ` Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 5/6] net/iavf: disable runtime queue setup capability Dawid Wesierski
` (3 subsequent siblings)
7 siblings, 2 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
When PTP is enabled on the ICE PMD, hardware RX timestamps are only
applied to packets classified as IEEE 1588 (Ethertype 0x88F7). This
prevents applications from obtaining hardware timestamps on regular
UDP/IP traffic.
Remove the TIMESYNC packet type filter so that all received packets
get hardware timestamps when PTP is enabled. This is required for
time-sensitive networking applications that need per-packet arrival
timing on media traffic, such as ST 2110-21 receiver compliance
monitoring.
The change affects all three RX paths: scan, scattered, and single
packet receive functions.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/ice/ice_rxtx.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index c4b5454c53..8d709125f7 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -2023,8 +2023,7 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((mb->packet_type &
- RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxdp[j].wb.flex_ts.ts_high);
mb->timesync = rxq->queue_id;
@@ -2390,8 +2389,7 @@ ice_recv_scattered_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((first_seg->packet_type & RTE_PTYPE_L2_MASK)
- == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
first_seg->timesync = rxq->queue_id;
@@ -2881,8 +2879,7 @@ ice_recv_pkts(void *rx_queue,
pkt_flags |= rxq->ts_flag;
}
- if (ad->ptp_ena && ((rxm->packet_type & RTE_PTYPE_L2_MASK) ==
- RTE_PTYPE_L2_ETHER_TIMESYNC)) {
+ if (ad->ptp_ena) {
rxq->time_high =
rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
rxm->timesync = rxq->queue_id;
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v3 5/6] net/iavf: disable runtime queue setup capability
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
` (3 preceding siblings ...)
2026-06-30 12:06 ` [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-06-30 15:44 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 6/6] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
` (2 subsequent siblings)
7 siblings, 1 reply; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
From: Marek Kasiewicz <marek.kasiewicz@intel.com>
Remove the advertisement of RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
and RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP capabilities from the
iavf VF driver.
Runtime queue setup on E810 VFs causes queue state corruption when
queues are dynamically reconfigured while the hardware rate limiter
is actively pacing TX queues. Queue configuration messages to the PF
via virtchnl can race with ongoing TX operations, leading to undefined
behavior.
By not advertising these capabilities, all queues are configured at
port start and remain stable throughout the port lifecycle.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
doc/guides/nics/intel_vf.rst | 9 +++++++++
doc/guides/rel_notes/release_26_07.rst | 2 ++
drivers/net/intel/iavf/iavf.h | 1 +
drivers/net/intel/iavf/iavf_ethdev.c | 22 ++++++++++++++++++----
4 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/doc/guides/nics/intel_vf.rst b/doc/guides/nics/intel_vf.rst
index e010f852cf..86878330f2 100644
--- a/doc/guides/nics/intel_vf.rst
+++ b/doc/guides/nics/intel_vf.rst
@@ -131,6 +131,15 @@ IAVF PMD parameters
* ``segment``: Check number of mbuf segments does not exceed HW limits.
* ``offload``: Check for use of an unsupported offload flag.
+``no_runtime_queue_setup``
+ Runtime (post-start) Rx/Tx queue setup can race with the hardware Tx rate
+ limiter on E810 VFs and corrupt queue state.
+ It is advertised by default.
+ Applications that pace queues through the traffic manager can opt out
+ of advertising the runtime queue setup capability
+ by setting ``no_runtime_queue_setup`` to 1,
+ for example, ``-a 18:01.0,no_runtime_queue_setup=1``.
+
HW-Specific Notes For IAVF
^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
index db8c4d5b16..d3e9dc6cf4 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -135,6 +135,8 @@ New Features
* Added support for transmitting LLDP packets based on mbuf packet type.
* Implemented AVX2 context descriptor transmit paths.
+ * Added ``no_runtime_queue_setup`` devarg to disable runtime queue setup
+ on devices that pace queues through the traffic manager.
* **Updated Intel ice driver.**
diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
index 4444602a30..146f02ea13 100644
--- a/drivers/net/intel/iavf/iavf.h
+++ b/drivers/net/intel/iavf/iavf.h
@@ -326,6 +326,7 @@ struct iavf_devargs {
int no_poll_on_link_down;
uint64_t mbuf_check;
int enable_ptype_lldp;
+ int no_runtime_queue_setup;
};
struct iavf_security_ctx;
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index ec1ad02826..be733f9edf 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -46,6 +46,7 @@
#define IAVF_NO_POLL_ON_LINK_DOWN_ARG "no-poll-on-link-down"
#define IAVF_MBUF_CHECK_ARG "mbuf_check"
#define IAVF_ENABLE_PTYPE_LLDP_ARG "enable_ptype_lldp"
+#define IAVF_NO_RUNTIME_QUEUE_SETUP_ARG "no_runtime_queue_setup"
uint64_t iavf_timestamp_dynflag;
int iavf_timestamp_dynfield_offset = -1;
int rte_pmd_iavf_tx_lldp_dynfield_offset = -1;
@@ -59,6 +60,7 @@ static const char * const iavf_valid_args[] = {
IAVF_NO_POLL_ON_LINK_DOWN_ARG,
IAVF_MBUF_CHECK_ARG,
IAVF_ENABLE_PTYPE_LLDP_ARG,
+ IAVF_NO_RUNTIME_QUEUE_SETUP_ARG,
NULL
};
@@ -1160,9 +1162,15 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
dev_info->reta_size = vf->vf_res->rss_lut_size;
dev_info->flow_type_rss_offloads = IAVF_RSS_OFFLOAD_ALL;
dev_info->max_mac_addrs = IAVF_NUM_MACADDR_MAX;
- dev_info->dev_capa =
- RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
- RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
+ /*
+ * Runtime queue setup can race with the hardware Tx rate limiter on
+ * E810 VFs and corrupt queue state. Applications that pace queues via
+ * the traffic manager can opt out with no_runtime_queue_setup=1.
+ */
+ if (!adapter->devargs.no_runtime_queue_setup)
+ dev_info->dev_capa =
+ RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
+ RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
dev_info->rx_offload_capa =
RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
RTE_ETH_RX_OFFLOAD_QINQ_STRIP |
@@ -2533,6 +2541,11 @@ static int iavf_parse_devargs(struct rte_eth_dev *dev)
if (ret)
goto bail;
+ ret = rte_kvargs_process(kvlist, IAVF_NO_RUNTIME_QUEUE_SETUP_ARG,
+ &parse_bool, &ad->devargs.no_runtime_queue_setup);
+ if (ret)
+ goto bail;
+
bail:
rte_kvargs_free(kvlist);
return ret;
@@ -3619,7 +3632,8 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
-RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf");
+RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf"
+ IAVF_NO_RUNTIME_QUEUE_SETUP_ARG "=<0|1>");
RTE_LOG_REGISTER_SUFFIX(iavf_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(iavf_logtype_driver, driver, NOTICE);
#ifdef RTE_ETHDEV_DEBUG_RX
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v3 6/6] app/testpmd: add pinned external-buffer Rx pool command
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
` (4 preceding siblings ...)
2026-06-30 12:06 ` [PATCH v3 5/6] net/iavf: disable runtime queue setup capability Dawid Wesierski
@ 2026-06-30 12:06 ` Dawid Wesierski
2026-07-01 10:42 ` [PATCH v3 0/6] Intel network drivers enhancements Bruce Richardson
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
7 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-06-30 12:06 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, marek.kasiewicz, Dawid Wesierski
Add the 'create pinned-rxpool <seg-idx> <count> <elt-size>' testpmd
command to demonstrate zero-copy header/payload split receive using
pinned external-buffer mempools (RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF).
Motivation: the DPDK buffer-split offload (RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT)
with two Rx segments allows an application to direct the NIC to place
the protocol header and the payload into separate mbufs. Combining it
with a pinned external-buffer pool for the payload segment lets the NIC
DMA the payload directly into application-owned hugepage memory without
any extra copy or new ethdev API.
This is the mechanism needed by streaming applications such as the
Media Transport Library (MTL) for SMPTE ST 2110-21 video reception,
where 1260-byte RTP payload chunks must land zero-copy in pre-allocated
per-frame video buffers. The existing rte_pktmbuf_pool_create_extbuf()
API covers this use case; no new callback or out-of-tree PMD hook is
required.
The command allocates a hugepage region via rte_zmalloc_socket(),
creates a pinned pool over it with rte_pktmbuf_pool_create_extbuf(),
and registers the pool with testpmd's pool index so that
rx_queue_setup() automatically selects it for the configured split
segment. The complete workflow and a worked video-streaming example are
documented in doc/guides/testpmd_app_ug/testpmd_funcs.rst.
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
---
app/test-pmd/cmdline.c | 123 ++++++++++++++++++++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 82 +++++++++++++
2 files changed, 205 insertions(+)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 3c39e27aa8..83ea6d2cd2 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -371,6 +371,11 @@ static void cmd_help_long_parsed(void *parsed_result,
"inner-ipv6-tcp|inner-ipv4-udp|inner-ipv6-udp|"
"inner-ipv4-sctp|inner-ipv6-sctp\n\n"
+ "create pinned-rxpool (seg-idx) (count) (elt-size)\n"
+ " Create a pinned external-buffer Rx mempool for"
+ " buffer-split segment <seg-idx>. Payloads DMA directly"
+ " into application-owned hugepage memory without copy.\n\n"
+
"set txpkts (x[,y]*)\n"
" Set the length of each segment of TXONLY"
" and optionally CSUM packets.\n\n"
@@ -4483,6 +4488,123 @@ static cmdline_parse_inst_t cmd_set_rxhdrs = {
},
};
+/* *** CREATE PINNED EXTERNAL BUFFER POOL FOR RX SPLIT SEGMENT *** */
+struct cmd_create_pinned_rxpool_result {
+ cmdline_fixed_string_t create;
+ cmdline_fixed_string_t pinned_rxpool;
+ uint16_t seg_idx;
+ uint32_t count;
+ uint16_t elt_size;
+};
+
+static void
+cmd_create_pinned_rxpool_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_create_pinned_rxpool_result *res = parsed_result;
+ char pool_name[RTE_MEMPOOL_NAMESIZE];
+ struct rte_pktmbuf_extmem ext_mem;
+ struct rte_mempool *mp;
+ unsigned int socket_id;
+ size_t mem_size;
+ void *frames;
+
+ if (res->seg_idx >= MAX_SEGS_BUFFER_SPLIT) {
+ fprintf(stderr, "seg-idx must be less than %u\n",
+ MAX_SEGS_BUFFER_SPLIT);
+ return;
+ }
+
+ socket_id = (num_sockets > 0) ? (unsigned int)socket_ids[0] : 0;
+ mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name),
+ res->seg_idx);
+
+ if (mbuf_pool_find(socket_id, res->seg_idx) != NULL) {
+ fprintf(stderr,
+ "Pool '%s' already exists; stop/close port before recreating\n",
+ pool_name);
+ return;
+ }
+
+ mem_size = (size_t)res->count * res->elt_size;
+ frames = rte_zmalloc_socket("pinned_rxpool_mem", mem_size,
+ RTE_CACHE_LINE_SIZE, socket_id);
+ if (frames == NULL) {
+ fprintf(stderr,
+ "Failed to allocate %zu bytes for pinned pool\n",
+ mem_size);
+ return;
+ }
+
+ ext_mem.buf_ptr = frames;
+ ext_mem.buf_iova = rte_malloc_virt2iova(frames);
+ if (ext_mem.buf_iova == RTE_BAD_IOVA) {
+ fprintf(stderr,
+ "No IOVA mapping for pinned pool (VFIO/IOMMU required)\n");
+ rte_free(frames);
+ return;
+ }
+ ext_mem.buf_len = mem_size;
+ ext_mem.elt_size = res->elt_size;
+
+ mp = rte_pktmbuf_pool_create_extbuf(pool_name, res->count,
+ 0, 0, res->elt_size,
+ socket_id, &ext_mem, 1);
+ if (mp == NULL) {
+ fprintf(stderr, "Failed to create pinned pool '%s': %s\n",
+ pool_name, rte_strerror(rte_errno));
+ rte_free(frames);
+ return;
+ }
+
+ /* Register with testpmd so rx_queue_setup() uses this pool for
+ * segment <seg_idx> when buffer-split is configured.
+ */
+ mbuf_data_size[res->seg_idx] = res->elt_size;
+ if ((uint32_t)(res->seg_idx + 1) > mbuf_data_size_n)
+ mbuf_data_size_n = res->seg_idx + 1;
+
+ printf("Created pinned ext-buf pool '%s':\n"
+ " socket=%u seg-idx=%u count=%u elt-size=%u "
+ "mem=%p iova=0x%" PRIx64 "\n",
+ pool_name, socket_id, res->seg_idx, res->count,
+ res->elt_size, frames, ext_mem.buf_iova);
+}
+
+static cmdline_parse_token_string_t cmd_create_pinned_rxpool_create =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ create, "create");
+static cmdline_parse_token_string_t cmd_create_pinned_rxpool_kw =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ pinned_rxpool, "pinned-rxpool");
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_seg_idx =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ seg_idx, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_count =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ count, RTE_UINT32);
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_elt_size =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ elt_size, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_create_pinned_rxpool = {
+ .f = cmd_create_pinned_rxpool_parsed,
+ .data = NULL,
+ .help_str = "create pinned-rxpool <seg-idx> <count> <elt-size>: "
+ "create a pinned external-buffer Rx mempool for split "
+ "segment <seg-idx>; payloads DMA directly into hugepage "
+ "memory owned by the application without an extra copy",
+ .tokens = {
+ (void *)&cmd_create_pinned_rxpool_create,
+ (void *)&cmd_create_pinned_rxpool_kw,
+ (void *)&cmd_create_pinned_rxpool_seg_idx,
+ (void *)&cmd_create_pinned_rxpool_count,
+ (void *)&cmd_create_pinned_rxpool_elt_size,
+ NULL,
+ },
+};
+
/* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */
struct cmd_set_txpkts_result {
@@ -14238,6 +14360,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
&cmd_set_rxoffs,
&cmd_set_rxpkts,
&cmd_set_rxhdrs,
+ &cmd_create_pinned_rxpool,
&cmd_set_txflows,
&cmd_set_txpkts,
&cmd_set_txsplit,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index f0f2b0758b..0ca263cc4e 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -867,6 +867,88 @@ Where eth[,ipv4]* represents a CSV list of values, without white space.
If the list of offsets is shorter than the list of segments,
zero offsets will be used for the remaining segments.
+create pinned-rxpool
+~~~~~~~~~~~~~~~~~~~~
+
+Create a pinned external-buffer Rx mempool for a buffer-split payload
+segment. Each mbuf in the pool is permanently bound to a fixed slot in
+a contiguous hugepage region allocated by testpmd. When the NIC
+performs a buffer-split receive, the payload DMA-writes directly into
+that hugepage memory without any extra copy from a normal mbuf.
+
+.. code-block:: none
+
+ testpmd> create pinned-rxpool (seg-idx) (count) (elt-size)
+
+Where:
+
+seg-idx
+ Index of the Rx split segment that will use the pinned pool.
+ 0 is the header segment (usually left as the default pool);
+ 1 is the first payload segment and is the typical target.
+
+count
+ Number of mbufs in the pool. Should be at least as large as the
+ number of Rx descriptors on all queues using this pool, plus a
+ safety margin (e.g. ``nb_rxd * nb_rxq * 2``).
+
+elt-size
+ Size of each pool element in bytes. This is the total slot stride,
+ including ``RTE_PKTMBUF_HEADROOM`` (default 128 B). For example,
+ to hold 1260-byte video payloads (SMPTE ST 2110-21 BPM size) with
+ a standard headroom, set ``elt-size`` to 1388 (= 128 + 1260).
+
+The pool is named according to testpmd's internal convention so that
+``rx_queue_setup()`` automatically selects it for segment ``seg-idx``
+when ``RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT`` is enabled.
+
+.. note::
+
+ VFIO or another IOMMU driver is required so that hugepage memory
+ has a valid IOVA. The backing hugepage allocation is not freed when
+ the port is stopped or the pool is re-created; restart testpmd to
+ reclaim it.
+
+**Example — zero-copy header/payload split for video streaming**
+
+This example mirrors the use case in the Media Transport Library (MTL)
+for SMPTE ST 2110-21 video reception. Headers land in the default
+pool; 1260-byte video payloads DMA directly into a pinned hugepage
+region without any copy. The pool holds enough slots for 4 K
+descriptors on 4 queues with headroom:
+
+.. code-block:: console
+
+ # Start testpmd with a default header pool (segment 0)
+ dpdk-testpmd -a 0000:31:00.0,enable-rx-timestamp=0 \
+ --mbuf-size=256 -- -i --rxq=4 --txq=4 --rxd=4096
+
+ # Inside testpmd:
+
+ # 1. Create the pinned payload pool for segment 1 (4*4096 mbufs,
+ # 1388 bytes each: 128 B headroom + 1260 B payload)
+ testpmd> create pinned-rxpool 1 32768 1388
+
+ # 2. Configure buffer split: segment 0 = UDP+lower headers,
+ # segment 1 = payload (length 0 means "rest of packet")
+ testpmd> set rxhdrs ipv4-udp
+ testpmd> set rxpkts 0,0
+
+ # 3. Enable buffer split on the port
+ testpmd> port config 0 rx_offload buffer_split on
+
+ # 4. Restart the queues so the new configuration takes effect
+ testpmd> stop
+ testpmd> port stop 0
+ testpmd> port start 0
+ testpmd> start
+
+After this sequence, each received UDP packet is split by the NIC:
+the header mbuf (chain head) comes from the default pool, and the
+payload mbuf (chain next) has its ``buf_addr`` pointing into the
+pinned hugepage region owned by the application — no copy, no
+callback, no new ethdev API.
+
set txpkts
~~~~~~~~~~
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit
2026-06-30 12:06 ` [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
@ 2026-06-30 14:29 ` Bruce Richardson
0 siblings, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-06-30 14:29 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:51AM -0400, Dawid Wesierski wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> The Intel E810 hardware supports up to 8160 (8K - 32) descriptors per
> TX/RX ring, but IAVF_MAX_RING_DESC caps it at 4096. Applications that
> need deep descriptor rings for hardware rate-limited pacing (e.g.,
> ST2110 video with thousands of packets per frame) cannot queue enough
> packets before the pacing epoch begins.
>
> Increase IAVF_MAX_RING_DESC to the hardware maximum of 8160 to allow
> full utilization of the ring depth on E810 VFs.
>
> Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
> Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> .mailmap | 2 ++
> drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
> 2 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/.mailmap b/.mailmap
> index 4001e5fb0e..d7b175de2a 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -366,6 +366,7 @@ David Zeng <zengxhsh@cn.ibm.com>
> Davide Caratti <dcaratti@redhat.com>
> Dawid Gorecki <dgr@semihalf.com>
> Dawid Jurczak <dawid_jurek@vp.pl>
> +Dawid Wesierski <dawid.wesierski@intel.com>
> Dawid Zielinski <dawid.zielinski@intel.com>
> Dawid Łukwiński <dawid.lukwinski@intel.com>
> Daxue Gao <daxuex.gao@intel.com>
> @@ -1014,6 +1015,7 @@ Marcin Wilk <marcin.wilk@caviumnetworks.com>
> Marcin Wojtas <mw@semihalf.com>
> Marcin Zapolski <marcinx.a.zapolski@intel.com>
> Marco Varlese <mvarlese@suse.de>
> +Marek Kasiewicz <marek.kasiewicz@intel.com>
> Marek Mical <marekx.mical@intel.com>
> Marek Zalfresso-jundzillo <marekx.zalfresso-jundzillo@intel.com>
> Maria Lingemark <maria.lingemark@ericsson.com>
> diff --git a/drivers/net/intel/iavf/iavf_rxtx.h b/drivers/net/intel/iavf/iavf_rxtx.h
> index 8449236d4d..22ea415f44 100644
> --- a/drivers/net/intel/iavf/iavf_rxtx.h
> +++ b/drivers/net/intel/iavf/iavf_rxtx.h
> @@ -16,7 +16,7 @@
> /* In QLEN must be whole number of 32 descriptors. */
> #define IAVF_ALIGN_RING_DESC 32
> #define IAVF_MIN_RING_DESC 64
> -#define IAVF_MAX_RING_DESC 4096
> +#define IAVF_MAX_RING_DESC (8192 - 32)
> #define IAVF_DMA_MEM_ALIGN 4096
> /* Base address of the HW descriptor ring should be 128B aligned. */
> #define IAVF_RING_BASE_ALIGN 128
> --
> 2.47.3
>
> ---------------------------------------------------------------------
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
>
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration
2026-06-30 12:06 ` [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
@ 2026-06-30 14:46 ` Bruce Richardson
0 siblings, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-06-30 14:46 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:52AM -0400, Dawid Wesierski wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> Allow per-queue bandwidth rate limiting to be configured without
> stopping the port when only a single TC node and single QoS element
> are involved. This enables dynamic session management where individual
> queue pacing rates can be changed while other queues continue
> transmitting.
>
> Also fix the queue ID assignment in the bandwidth configuration to
> use the actual TM node ID rather than a sequential counter index, and
> only mark the TM hierarchy as committed when the port is stopped to
> permit subsequent reconfiguration.
>
> Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
> Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
> ---
> drivers/net/intel/iavf/iavf_tm.c | 25 ++++++++++++++++---------
> 1 file changed, 16 insertions(+), 9 deletions(-)
>
AI review that I ran indicates that this function has some memory leaks
around the tc_mapping, q_bw and qtc_map variables, which are allocated
using rte_zmalloc. However, those are not introduced by this patch, so ok
to take this as-is for now. We should look to ensure leaks are fixed in
future patches. (Also, we should ideally change from using rte_zmalloc to
regular malloc/calloc, unless there is a strong reason why the need these
nodes in hugepage memory).
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> diff --git a/drivers/net/intel/iavf/iavf_tm.c b/drivers/net/intel/iavf/iavf_tm.c
> index 1cf7bfb106..e3492ec491 100644
> --- a/drivers/net/intel/iavf/iavf_tm.c
> +++ b/drivers/net/intel/iavf/iavf_tm.c
> @@ -804,19 +804,25 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
> int index = 0, node_committed = 0;
> int i, ret_val = IAVF_SUCCESS;
>
> - /* check if port is stopped */
> - if (adapter->stopped != 1) {
> - PMD_DRV_LOG(ERR, "Please stop port first");
> - ret_val = IAVF_ERR_NOT_READY;
> - goto err;
> - }
> -
> if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS)) {
> PMD_DRV_LOG(ERR, "VF queue tc mapping is not supported");
> ret_val = IAVF_NOT_SUPPORTED;
> goto fail_clear;
> }
>
> + /*
> + * Allow reconfiguration on a running port only when a single queue is
> + * involved (single TC node and single QoS element); otherwise the port
> + * must be stopped first. qos_cap is valid here because the
> + * VIRTCHNL_VF_OFFLOAD_QOS capability was checked above.
> + */
> + if ((vf->tm_conf.nb_tc_node != 1 || vf->qos_cap->num_elem != 1) &&
> + adapter->stopped != 1) {
> + PMD_DRV_LOG(ERR, "Please stop port first");
> + ret_val = IAVF_ERR_NOT_READY;
> + goto err;
> + }
> +
> /* check if all TC nodes are set with VF vsi */
> if (vf->tm_conf.nb_tc_node != vf->qos_cap->num_elem) {
> PMD_DRV_LOG(ERR, "Does not set VF vsi nodes to all TCs");
> @@ -856,7 +862,7 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
> q_tc_mapping->tc[tm_node->tc].req.queue_count++;
>
> if (tm_node->shaper_profile) {
> - q_bw->cfg[node_committed].queue_id = node_committed;
> + q_bw->cfg[node_committed].queue_id = tm_node->id;
> q_bw->cfg[node_committed].shaper.peak =
> tm_node->shaper_profile->profile.peak.rate /
> 1000 * IAVF_BITS_PER_BYTE;
> @@ -900,7 +906,8 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
> goto fail_clear;
>
> vf->qtc_map = qtc_map;
> - vf->tm_conf.committed = true;
> + if (adapter->stopped == 1)
> + vf->tm_conf.committed = true;
> return ret_val;
>
> fail_clear:
> --
> 2.47.3
>
> ---------------------------------------------------------------------
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
>
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg
2026-06-30 12:06 ` [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
@ 2026-06-30 15:20 ` Bruce Richardson
0 siblings, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-06-30 15:20 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:53AM -0400, Dawid Wesierski wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> The E810 Tx scheduler uses a token bucket algorithm where the burst
> size controls the maximum bytes sent in a single burst before the
> rate limiter throttles. The hardware default of 15 KB allows
> micro-bursts of ~10 max-size frames, which violates tight
> inter-packet spacing requirements in time-sensitive networking
> applications such as SMPTE ST 2110-21 narrow-sender compliance.
>
> Add a "rl_burst_size" device argument that lets the application lower
> the scheduler rate-limiter burst size (for example to 2 KB) to force
> near-constant-rate output matching the configured shaper profile.
> The burst size is a global scheduler resource, so the override is
> applied once at probe time and only when the user explicitly requests
> it; the hardware default is left unchanged otherwise.
>
> Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
> Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
However, one issue flagged below that needs resolution before merge.
> doc/guides/nics/ice.rst | 12 +++++++
> doc/guides/rel_notes/release_26_07.rst | 5 +++
> drivers/net/intel/ice/ice_ethdev.c | 46 ++++++++++++++++++++++++++
> drivers/net/intel/ice/ice_ethdev.h | 1 +
> 4 files changed, 64 insertions(+)
>
> diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst
> index 8251416918..187c7e821f 100644
> --- a/doc/guides/nics/ice.rst
> +++ b/doc/guides/nics/ice.rst
> @@ -158,6 +158,18 @@ Runtime Configuration
>
> -a 80:00.0,source-prune=1
>
> +- ``Scheduler rate-limiter burst size`` (default ``0``)
> +
> + The hardware Tx scheduler uses a default rate-limiter burst size that favours
> + throughput. Time-sensitive applications can lower this value to reduce Tx
> + latency jitter at the cost of throughput by setting the ``rl_burst_size``
> + devargs parameter, in bytes. The value is clamped to the hardware-allowed
> + range. A value of ``0`` (the default) keeps the hardware default.
The documentation here is wrong, in that values are not clamped, but are
instead rejected if they are out of range.
ICE_INIT: ice_dev_init(): Invalid rl_burst_size 2097152 bytes
testpmd: No probed ethernet devices
If you like, I can update the docs on apply to remove this clamping
reference. Alternatively, if you do want to clamp the values, please respin
this patchset. If you do, you can keep my ack on the new version.
> +
> + For example::
> +
> + -a 80:00.0,rl_burst_size=2048
> +
> - ``Protocol extraction for per queue``
>
> Configure the RX queues to do protocol extraction into mbuf for protocol
> diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
> index 5d7aa8d1bf..db8c4d5b16 100644
> --- a/doc/guides/rel_notes/release_26_07.rst
> +++ b/doc/guides/rel_notes/release_26_07.rst
> @@ -136,6 +136,11 @@ New Features
> * Added support for transmitting LLDP packets based on mbuf packet type.
> * Implemented AVX2 context descriptor transmit paths.
>
> +* **Updated Intel ice driver.**
> +
> + * Added ``rl_burst_size`` devarg to configure the scheduler rate-limiter
> + burst size, reducing Tx latency jitter for time-sensitive traffic.
> +
> * **Updated NVIDIA mlx5 ethernet driver.**
>
> * Added support for selective Rx in scalar SPRQ Rx path.
> diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
> index ad9c49b339..465cf07383 100644
> --- a/drivers/net/intel/ice/ice_ethdev.c
> +++ b/drivers/net/intel/ice/ice_ethdev.c
> @@ -41,6 +41,7 @@
> #define ICE_DDP_FILENAME_ARG "ddp_pkg_file"
> #define ICE_DDP_LOAD_SCHED_ARG "ddp_load_sched_topo"
> #define ICE_TM_LEVELS_ARG "tm_sched_levels"
> +#define ICE_RL_BURST_SIZE_ARG "rl_burst_size"
> #define ICE_SOURCE_PRUNE_ARG "source-prune"
> #define ICE_LINK_STATE_ON_CLOSE "link_state_on_close"
>
> @@ -59,6 +60,7 @@ static const char * const ice_valid_args[] = {
> ICE_DDP_FILENAME_ARG,
> ICE_DDP_LOAD_SCHED_ARG,
> ICE_TM_LEVELS_ARG,
> + ICE_RL_BURST_SIZE_ARG,
> ICE_SOURCE_PRUNE_ARG,
> ICE_LINK_STATE_ON_CLOSE,
> NULL
> @@ -2147,6 +2149,29 @@ parse_u64(const char *key, const char *value, void *args)
> return 0;
> }
>
> +static int
> +parse_u32(const char *key, const char *value, void *args)
> +{
> + uint32_t *num = args;
> + unsigned long tmp;
> + char *endptr;
> +
> + errno = 0;
> + tmp = strtoul(value, &endptr, 0);
> + if (errno != 0 || endptr == value || *endptr != '\0') {
> + PMD_DRV_LOG(WARNING, "%s: \"%s\" is not a valid u32", key, value);
> + return -1;
> + }
> + if (tmp > UINT32_MAX) {
> + PMD_DRV_LOG(WARNING, "%s: value \"%s\" is out of range", key, value);
> + return -1;
> + }
> +
> + *num = (uint32_t)tmp;
> +
> + return 0;
> +}
> +
> static int
> parse_tx_sched_levels(const char *key, const char *value, void *args)
> {
> @@ -2448,6 +2473,11 @@ static int ice_parse_devargs(struct rte_eth_dev *dev)
> if (ret)
> goto bail;
>
> + ret = rte_kvargs_process(kvlist, ICE_RL_BURST_SIZE_ARG,
> + &parse_u32, &ad->devargs.rl_burst_size);
> + if (ret)
> + goto bail;
> +
> ret = rte_kvargs_process(kvlist, ICE_SOURCE_PRUNE_ARG,
> &parse_bool, &ad->devargs.source_prune);
> if (ret)
> @@ -2662,6 +2692,21 @@ ice_dev_init(struct rte_eth_dev *dev)
> return -EINVAL;
> }
>
> + /*
> + * Override the hardware default scheduler rate-limiter burst size only
> + * when the user explicitly requests it. A smaller burst reduces Tx
> + * latency jitter for time-sensitive traffic at the cost of throughput,
> + * so it must not change for every port. ice_cfg_rl_burst_size()
> + * validates the value against the hardware-allowed range.
> + */
> + if (ad->devargs.rl_burst_size != 0 &&
> + ice_cfg_rl_burst_size(hw, ad->devargs.rl_burst_size) != 0) {
> + PMD_INIT_LOG(ERR, "Invalid rl_burst_size %u bytes",
> + ad->devargs.rl_burst_size);
> + ice_deinit_hw(hw);
> + return -EINVAL;
> + }
> +
> #ifndef RTE_EXEC_ENV_WINDOWS
> use_dsn = false;
> dsn = 0;
> @@ -7713,6 +7758,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_ice,
> ICE_DDP_FILENAME_ARG "=</path/to/file>"
> ICE_DDP_LOAD_SCHED_ARG "=<0|1>"
> ICE_TM_LEVELS_ARG "=<N>"
> + ICE_RL_BURST_SIZE_ARG "=<N>"
> ICE_SOURCE_PRUNE_ARG "=<0|1>"
> ICE_RX_LOW_LATENCY_ARG "=<0|1>"
> ICE_LINK_STATE_ON_CLOSE "=<down|up|initial>");
> diff --git a/drivers/net/intel/ice/ice_ethdev.h b/drivers/net/intel/ice/ice_ethdev.h
> index 20e8a13fe9..0a9d75b9cd 100644
> --- a/drivers/net/intel/ice/ice_ethdev.h
> +++ b/drivers/net/intel/ice/ice_ethdev.h
> @@ -631,6 +631,7 @@ struct ice_devargs {
> uint8_t ddp_load_sched;
> uint8_t tm_exposed_levels;
> uint8_t source_prune;
> + uint32_t rl_burst_size;
> int link_state_on_close;
> int xtr_field_offs;
> uint8_t xtr_flag_offs[PROTO_XTR_MAX];
> --
> 2.47.3
>
> ---------------------------------------------------------------------
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
>
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled
2026-06-30 12:06 ` [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
@ 2026-06-30 15:39 ` Bruce Richardson
2026-07-03 20:00 ` Dawid Wesierski
1 sibling, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-06-30 15:39 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:54AM -0400, Dawid Wesierski wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> When PTP is enabled on the ICE PMD, hardware RX timestamps are only
> applied to packets classified as IEEE 1588 (Ethertype 0x88F7). This
> prevents applications from obtaining hardware timestamps on regular
> UDP/IP traffic.
>
> Remove the TIMESYNC packet type filter so that all received packets
> get hardware timestamps when PTP is enabled. This is required for
> time-sensitive networking applications that need per-packet arrival
> timing on media traffic, such as ST 2110-21 receiver compliance
> monitoring.
>
> The change affects all three RX paths: scan, scattered, and single
> packet receive functions.
>
> Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
> Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
> ---
> drivers/net/intel/ice/ice_rxtx.c | 9 +++------
> 1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
> index c4b5454c53..8d709125f7 100644
> --- a/drivers/net/intel/ice/ice_rxtx.c
> +++ b/drivers/net/intel/ice/ice_rxtx.c
> @@ -2023,8 +2023,7 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
> pkt_flags |= rxq->ts_flag;
> }
>
> - if (ad->ptp_ena && ((mb->packet_type &
> - RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
> + if (ad->ptp_ena) {
Dropping this condition means that all packets are now marked as PTP
packets, even though they are not, which is incorrect. At minimum we need
to check the packet type before setting the PTP flag on them.
However, at a higher level again, I think if we want timestamps for all
packets that that should be a separate feature from PTP support, which
should be more limited in scope. I see there is already an
RTE_ETH_RX_OFFLOAD_TIMESTAMP block above this in the code - does specifying
that offload flag not cause all packets to get properly timestamped? If
not, I would suggest that that be enhanced rather than pretending all
packets are PTP. If that doesn't work, do we need a third alternative,
perhaps?
Regards,
/Bruce
> rxq->time_high =
> rte_le_to_cpu_32(rxdp[j].wb.flex_ts.ts_high);
> mb->timesync = rxq->queue_id;
> @@ -2390,8 +2389,7 @@ ice_recv_scattered_pkts(void *rx_queue,
> pkt_flags |= rxq->ts_flag;
> }
>
> - if (ad->ptp_ena && ((first_seg->packet_type & RTE_PTYPE_L2_MASK)
> - == RTE_PTYPE_L2_ETHER_TIMESYNC)) {
> + if (ad->ptp_ena) {
> rxq->time_high =
> rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
> first_seg->timesync = rxq->queue_id;
> @@ -2881,8 +2879,7 @@ ice_recv_pkts(void *rx_queue,
> pkt_flags |= rxq->ts_flag;
> }
>
> - if (ad->ptp_ena && ((rxm->packet_type & RTE_PTYPE_L2_MASK) ==
> - RTE_PTYPE_L2_ETHER_TIMESYNC)) {
> + if (ad->ptp_ena) {
> rxq->time_high =
> rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
> rxm->timesync = rxq->queue_id;
> --
> 2.47.3
>
> ---------------------------------------------------------------------
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
>
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v3 5/6] net/iavf: disable runtime queue setup capability
2026-06-30 12:06 ` [PATCH v3 5/6] net/iavf: disable runtime queue setup capability Dawid Wesierski
@ 2026-06-30 15:44 ` Bruce Richardson
0 siblings, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-06-30 15:44 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:55AM -0400, Dawid Wesierski wrote:
> From: Marek Kasiewicz <marek.kasiewicz@intel.com>
>
> Remove the advertisement of RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
> and RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP capabilities from the
> iavf VF driver.
>
> Runtime queue setup on E810 VFs causes queue state corruption when
> queues are dynamically reconfigured while the hardware rate limiter
> is actively pacing TX queues. Queue configuration messages to the PF
> via virtchnl can race with ongoing TX operations, leading to undefined
> behavior.
>
> By not advertising these capabilities, all queues are configured at
> port start and remain stable throughout the port lifecycle.
>
> Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
> Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
> ---
> doc/guides/nics/intel_vf.rst | 9 +++++++++
> doc/guides/rel_notes/release_26_07.rst | 2 ++
> drivers/net/intel/iavf/iavf.h | 1 +
> drivers/net/intel/iavf/iavf_ethdev.c | 22 ++++++++++++++++++----
> 4 files changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/doc/guides/nics/intel_vf.rst b/doc/guides/nics/intel_vf.rst
> index e010f852cf..86878330f2 100644
> --- a/doc/guides/nics/intel_vf.rst
> +++ b/doc/guides/nics/intel_vf.rst
> @@ -131,6 +131,15 @@ IAVF PMD parameters
> * ``segment``: Check number of mbuf segments does not exceed HW limits.
> * ``offload``: Check for use of an unsupported offload flag.
>
> +``no_runtime_queue_setup``
> + Runtime (post-start) Rx/Tx queue setup can race with the hardware Tx rate
> + limiter on E810 VFs and corrupt queue state.
> + It is advertised by default.
> + Applications that pace queues through the traffic manager can opt out
> + of advertising the runtime queue setup capability
> + by setting ``no_runtime_queue_setup`` to 1,
> + for example, ``-a 18:01.0,no_runtime_queue_setup=1``.
> +
Do we really need a commandline arg for this? If it's known enough to have
the extra arg passed at device init, is it not also known enough to have
the app not do dynamic reconfiguration in the first place?
Alternatively, if the user configures packet pacing through rte_tm, can we
not at that point adjust the driver to disallow runtime config by returning
-ENOTSUP when reconfig is attempted, and no longer advertising the capabilities?
Runtime configuration, whether with or without user interaction, should be
preferred over devargs whenever possible.
/Bruce
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH v3 0/6] Intel network drivers enhancements
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
` (5 preceding siblings ...)
2026-06-30 12:06 ` [PATCH v3 6/6] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
@ 2026-07-01 10:42 ` Bruce Richardson
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
7 siblings, 0 replies; 44+ messages in thread
From: Bruce Richardson @ 2026-07-01 10:42 UTC (permalink / raw)
To: Dawid Wesierski; +Cc: dev, thomas, stephen, marek.kasiewicz
On Tue, Jun 30, 2026 at 08:06:50AM -0400, Dawid Wesierski wrote:
> This series collects Intel E810 iavf and ice driver enhancements developed
> for the Media Transport Library (MTL) to support high-performance SMPTE
> ST 2110 media streaming workflows.
>
> The "new code" in this series (specifically the testpmd enhancement in
> patch 6) demonstrates how the standard DPDK buffer-split offload can be
> orchestrated with pinned external-buffer mempools
> (RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF) to achieve this. By pinning mbufs to
> contiguous hugepages, the NIC DMAs RTP payloads directly into application-
> owned memory. This eliminates the need for the header-split.
>
> Documentation and a concrete configuration example for this workflow are
> included in the testpmd user guide (patch 6/6). The new 'create pinned-rxpool'
> command serves as both a test vehicle and a reference implementation for
> integrators.
>
> In this series:
> - iavf maximum ring descriptor count to raised 4096 (HW limit).
> - iavf queue rate limit enabled reconfiguration at runtime.
> - Added opt-in "rl_burst_size" ice devarg for tighter packet spacing (jitter reduction).
> - Enabled PTP timestamping for all packets on ice.
> - Added opt-in "no_runtime_queue_setup" iavf devarg to restore strict
> initialization semantics when required.
>
> - Dropped the ethdev and net/intel "header-split mbuf callback" API
> - Replaced the out-of-tree approach with a testpmd demonstration (patch 6)
> of the standard, upstream-preferred pinned-external-buffer workflow.
> - Fixed iavf error propagation and committed-state logic (Stephen Hemminger).
> - Converted the ice scheduler burst reduction and iavf runtime-config
> disabling into opt-in devargs to preserve default behavior.
> - Updated documentation, commit messages, and .mailmap.
>
> Dawid Wesierski (1):
> app/testpmd: add pinned external-buffer Rx pool command
>
> Marek Kasiewicz (5):
> net/iavf: increase max ring descriptors to hardware limit
> net/iavf: allow runtime queue rate limit configuration
> net/ice: add scheduler rate-limiter burst size devarg
> net/ice: timestamp all received packets when PTP is enabled
> net/iavf: disable runtime queue setup capability
>
Since RC2 is fast approaching, I've taken the first 3 patches of this
series into next-net-intel.
For the remaining 3 patches, the two driver patches need some more
discussion and probably rework. The final patch, for test-pmd, goes in a
different tree (not next-net-intel), so please send it as a separate
standalone patch.
Thanks,
/Bruce
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v4 0/5] Intel network drivers enhancements
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
` (6 preceding siblings ...)
2026-07-01 10:42 ` [PATCH v3 0/6] Intel network drivers enhancements Bruce Richardson
@ 2026-07-03 12:19 ` Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 1/5] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
` (4 more replies)
7 siblings, 5 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
This series collects Intel E810 iavf and ice driver enhancements developed
for the Media Transport Library (MTL) to support high-performance SMPTE
ST 2110 media streaming workflows.
The header/payload split use case is served by the standard DPDK
buffer-split offload combined with pinned external-buffer mempools
(RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF): by pinning mbufs to contiguous
hugepages, the NIC DMAs RTP payloads directly into application-owned
memory. A concrete configuration example and the 'create pinned-rxpool'
testpmd command that serves as a reference implementation are documented
in the testpmd user guide (patch 5/5).
In this series:
- iavf maximum ring descriptor count raised to the E810 hardware limit.
- iavf queue rate limit reconfiguration allowed at runtime.
- Added opt-in "rl_burst_size" ice devarg for tighter packet spacing
(jitter reduction).
- Added opt-in "no_runtime_queue_setup" iavf devarg to restore strict
initialization semantics when required.
v3 -> v4:
- Dropped the ice PTP documentation patch entirely. Applications that
need a hardware Rx timestamp on all traffic (not just IEEE 1588
packets) already have RTE_ETH_RX_OFFLOAD_TIMESTAMP available today;
this is an existing, generic offload and does not need a dedicated
patch to point it out. The datapath change that misidentified regular
traffic as PTP (flagged by Bruce Richardson) is also dropped with it.
- Set the whole series author to Dawid Wesierski.
- Rebased onto latest main.
v2 -> v3:
- Dropped the ethdev and net/intel "header-split mbuf callback" API in
favour of the upstream-preferred pinned-external-buffer workflow, now
demonstrated in testpmd (patch 5).
- Fixed iavf error propagation and committed-state logic
(Stephen Hemminger).
- Converted the ice scheduler burst reduction and iavf runtime-config
disabling into opt-in devargs to preserve default behaviour.
- Updated documentation, commit messages, and .mailmap.
Dawid Wesierski (5):
net/iavf: increase max ring descriptors to hardware limit
net/iavf: allow runtime queue rate limit configuration
net/ice: add scheduler rate-limiter burst size devarg
net/iavf: disable runtime queue setup capability
app/testpmd: add pinned external-buffer Rx pool command
.mailmap | 2 +
app/test-pmd/cmdline.c | 123 ++++++++++++++++++++
doc/guides/nics/ice.rst | 12 ++
doc/guides/nics/intel_vf.rst | 9 ++
doc/guides/rel_notes/release_26_07.rst | 7 ++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 82 +++++++++++++
drivers/net/intel/iavf/iavf.h | 1 +
drivers/net/intel/iavf/iavf_ethdev.c | 22 +++-
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
drivers/net/intel/iavf/iavf_tm.c | 25 ++--
drivers/net/intel/ice/ice_ethdev.c | 46 ++++++++
drivers/net/intel/ice/ice_ethdev.h | 1 +
12 files changed, 318 insertions(+), 14 deletions(-)
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH v4 1/5] net/iavf: increase max ring descriptors to hardware limit
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
@ 2026-07-03 12:19 ` Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 2/5] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
` (3 subsequent siblings)
4 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
The Intel E810 hardware supports up to 8160 (8K - 32) descriptors per
TX/RX ring, but IAVF_MAX_RING_DESC caps it at 4096. Applications that
need deep descriptor rings for hardware rate-limited pacing (e.g.,
ST2110 video with thousands of packets per frame) cannot queue enough
packets before the pacing epoch begins.
Increase IAVF_MAX_RING_DESC to the hardware maximum of 8160 to allow
full utilization of the ring depth on E810 VFs.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
.mailmap | 2 ++
drivers/net/intel/iavf/iavf_rxtx.h | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/.mailmap b/.mailmap
index 4001e5fb0e..d7b175de2a 100644
--- a/.mailmap
+++ b/.mailmap
@@ -366,6 +366,7 @@ David Zeng <zengxhsh@cn.ibm.com>
Davide Caratti <dcaratti@redhat.com>
Dawid Gorecki <dgr@semihalf.com>
Dawid Jurczak <dawid_jurek@vp.pl>
+Dawid Wesierski <dawid.wesierski@intel.com>
Dawid Zielinski <dawid.zielinski@intel.com>
Dawid Łukwiński <dawid.lukwinski@intel.com>
Daxue Gao <daxuex.gao@intel.com>
@@ -1014,6 +1015,7 @@ Marcin Wilk <marcin.wilk@caviumnetworks.com>
Marcin Wojtas <mw@semihalf.com>
Marcin Zapolski <marcinx.a.zapolski@intel.com>
Marco Varlese <mvarlese@suse.de>
+Marek Kasiewicz <marek.kasiewicz@intel.com>
Marek Mical <marekx.mical@intel.com>
Marek Zalfresso-jundzillo <marekx.zalfresso-jundzillo@intel.com>
Maria Lingemark <maria.lingemark@ericsson.com>
diff --git a/drivers/net/intel/iavf/iavf_rxtx.h b/drivers/net/intel/iavf/iavf_rxtx.h
index 8449236d4d..22ea415f44 100644
--- a/drivers/net/intel/iavf/iavf_rxtx.h
+++ b/drivers/net/intel/iavf/iavf_rxtx.h
@@ -16,7 +16,7 @@
/* In QLEN must be whole number of 32 descriptors. */
#define IAVF_ALIGN_RING_DESC 32
#define IAVF_MIN_RING_DESC 64
-#define IAVF_MAX_RING_DESC 4096
+#define IAVF_MAX_RING_DESC (8192 - 32)
#define IAVF_DMA_MEM_ALIGN 4096
/* Base address of the HW descriptor ring should be 128B aligned. */
#define IAVF_RING_BASE_ALIGN 128
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v4 2/5] net/iavf: allow runtime queue rate limit configuration
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 1/5] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
@ 2026-07-03 12:19 ` Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 3/5] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
` (2 subsequent siblings)
4 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
Allow per-queue bandwidth rate limiting to be configured without
stopping the port when only a single TC node and single QoS element
are involved. This enables dynamic session management where individual
queue pacing rates can be changed while other queues continue
transmitting.
Also fix the queue ID assignment in the bandwidth configuration to
use the actual TM node ID rather than a sequential counter index, and
only mark the TM hierarchy as committed when the port is stopped to
permit subsequent reconfiguration.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
drivers/net/intel/iavf/iavf_tm.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_tm.c b/drivers/net/intel/iavf/iavf_tm.c
index 1cf7bfb106..e3492ec491 100644
--- a/drivers/net/intel/iavf/iavf_tm.c
+++ b/drivers/net/intel/iavf/iavf_tm.c
@@ -804,19 +804,25 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
int index = 0, node_committed = 0;
int i, ret_val = IAVF_SUCCESS;
- /* check if port is stopped */
- if (adapter->stopped != 1) {
- PMD_DRV_LOG(ERR, "Please stop port first");
- ret_val = IAVF_ERR_NOT_READY;
- goto err;
- }
-
if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS)) {
PMD_DRV_LOG(ERR, "VF queue tc mapping is not supported");
ret_val = IAVF_NOT_SUPPORTED;
goto fail_clear;
}
+ /*
+ * Allow reconfiguration on a running port only when a single queue is
+ * involved (single TC node and single QoS element); otherwise the port
+ * must be stopped first. qos_cap is valid here because the
+ * VIRTCHNL_VF_OFFLOAD_QOS capability was checked above.
+ */
+ if ((vf->tm_conf.nb_tc_node != 1 || vf->qos_cap->num_elem != 1) &&
+ adapter->stopped != 1) {
+ PMD_DRV_LOG(ERR, "Please stop port first");
+ ret_val = IAVF_ERR_NOT_READY;
+ goto err;
+ }
+
/* check if all TC nodes are set with VF vsi */
if (vf->tm_conf.nb_tc_node != vf->qos_cap->num_elem) {
PMD_DRV_LOG(ERR, "Does not set VF vsi nodes to all TCs");
@@ -856,7 +862,7 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
q_tc_mapping->tc[tm_node->tc].req.queue_count++;
if (tm_node->shaper_profile) {
- q_bw->cfg[node_committed].queue_id = node_committed;
+ q_bw->cfg[node_committed].queue_id = tm_node->id;
q_bw->cfg[node_committed].shaper.peak =
tm_node->shaper_profile->profile.peak.rate /
1000 * IAVF_BITS_PER_BYTE;
@@ -900,7 +906,8 @@ static int iavf_hierarchy_commit(struct rte_eth_dev *dev,
goto fail_clear;
vf->qtc_map = qtc_map;
- vf->tm_conf.committed = true;
+ if (adapter->stopped == 1)
+ vf->tm_conf.committed = true;
return ret_val;
fail_clear:
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v4 3/5] net/ice: add scheduler rate-limiter burst size devarg
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 1/5] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 2/5] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
@ 2026-07-03 12:19 ` Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 4/5] net/iavf: disable runtime queue setup capability Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 5/5] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
4 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
The E810 Tx scheduler uses a token bucket algorithm where the burst
size controls the maximum bytes sent in a single burst before the
rate limiter throttles. The hardware default of 15 KB allows
micro-bursts of ~10 max-size frames, which violates tight
inter-packet spacing requirements in time-sensitive networking
applications such as SMPTE ST 2110-21 narrow-sender compliance.
Add a "rl_burst_size" device argument that lets the application lower
the scheduler rate-limiter burst size (for example to 2 KB) to force
near-constant-rate output matching the configured shaper profile.
The burst size is a global scheduler resource, so the override is
applied once at probe time and only when the user explicitly requests
it; the hardware default is left unchanged otherwise.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
doc/guides/nics/ice.rst | 12 +++++++
doc/guides/rel_notes/release_26_07.rst | 5 +++
drivers/net/intel/ice/ice_ethdev.c | 46 ++++++++++++++++++++++++++
drivers/net/intel/ice/ice_ethdev.h | 1 +
4 files changed, 64 insertions(+)
diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst
index 8251416918..6c2063d47e 100644
--- a/doc/guides/nics/ice.rst
+++ b/doc/guides/nics/ice.rst
@@ -158,6 +158,18 @@ Runtime Configuration
-a 80:00.0,source-prune=1
+- ``Scheduler rate-limiter burst size`` (default ``0``)
+
+ The hardware Tx scheduler uses a default rate-limiter burst size that favours
+ throughput. Time-sensitive applications can lower this value to reduce Tx
+ latency jitter at the cost of throughput by setting the ``rl_burst_size``
+ devargs parameter, in bytes. Values that are out of range are rejected.
+ A value of ``0`` (the default) keeps the hardware default.
+
+ For example::
+
+ -a 80:00.0,rl_burst_size=2048
+
- ``Protocol extraction for per queue``
Configure the RX queues to do protocol extraction into mbuf for protocol
diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
index 0b1cac3e0d..43b20b97e2 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -136,6 +136,11 @@ New Features
* Added support for transmitting LLDP packets based on mbuf packet type.
* Implemented AVX2 context descriptor transmit paths.
+* **Updated Intel ice driver.**
+
+ * Added ``rl_burst_size`` devarg to configure the scheduler rate-limiter
+ burst size, reducing Tx latency jitter for time-sensitive traffic.
+
* **Updated NVIDIA mlx5 ethernet driver.**
* Added support for selective Rx in scalar SPRQ Rx path.
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index ad9c49b339..465cf07383 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -41,6 +41,7 @@
#define ICE_DDP_FILENAME_ARG "ddp_pkg_file"
#define ICE_DDP_LOAD_SCHED_ARG "ddp_load_sched_topo"
#define ICE_TM_LEVELS_ARG "tm_sched_levels"
+#define ICE_RL_BURST_SIZE_ARG "rl_burst_size"
#define ICE_SOURCE_PRUNE_ARG "source-prune"
#define ICE_LINK_STATE_ON_CLOSE "link_state_on_close"
@@ -59,6 +60,7 @@ static const char * const ice_valid_args[] = {
ICE_DDP_FILENAME_ARG,
ICE_DDP_LOAD_SCHED_ARG,
ICE_TM_LEVELS_ARG,
+ ICE_RL_BURST_SIZE_ARG,
ICE_SOURCE_PRUNE_ARG,
ICE_LINK_STATE_ON_CLOSE,
NULL
@@ -2147,6 +2149,29 @@ parse_u64(const char *key, const char *value, void *args)
return 0;
}
+static int
+parse_u32(const char *key, const char *value, void *args)
+{
+ uint32_t *num = args;
+ unsigned long tmp;
+ char *endptr;
+
+ errno = 0;
+ tmp = strtoul(value, &endptr, 0);
+ if (errno != 0 || endptr == value || *endptr != '\0') {
+ PMD_DRV_LOG(WARNING, "%s: \"%s\" is not a valid u32", key, value);
+ return -1;
+ }
+ if (tmp > UINT32_MAX) {
+ PMD_DRV_LOG(WARNING, "%s: value \"%s\" is out of range", key, value);
+ return -1;
+ }
+
+ *num = (uint32_t)tmp;
+
+ return 0;
+}
+
static int
parse_tx_sched_levels(const char *key, const char *value, void *args)
{
@@ -2448,6 +2473,11 @@ static int ice_parse_devargs(struct rte_eth_dev *dev)
if (ret)
goto bail;
+ ret = rte_kvargs_process(kvlist, ICE_RL_BURST_SIZE_ARG,
+ &parse_u32, &ad->devargs.rl_burst_size);
+ if (ret)
+ goto bail;
+
ret = rte_kvargs_process(kvlist, ICE_SOURCE_PRUNE_ARG,
&parse_bool, &ad->devargs.source_prune);
if (ret)
@@ -2662,6 +2692,21 @@ ice_dev_init(struct rte_eth_dev *dev)
return -EINVAL;
}
+ /*
+ * Override the hardware default scheduler rate-limiter burst size only
+ * when the user explicitly requests it. A smaller burst reduces Tx
+ * latency jitter for time-sensitive traffic at the cost of throughput,
+ * so it must not change for every port. ice_cfg_rl_burst_size()
+ * validates the value against the hardware-allowed range.
+ */
+ if (ad->devargs.rl_burst_size != 0 &&
+ ice_cfg_rl_burst_size(hw, ad->devargs.rl_burst_size) != 0) {
+ PMD_INIT_LOG(ERR, "Invalid rl_burst_size %u bytes",
+ ad->devargs.rl_burst_size);
+ ice_deinit_hw(hw);
+ return -EINVAL;
+ }
+
#ifndef RTE_EXEC_ENV_WINDOWS
use_dsn = false;
dsn = 0;
@@ -7713,6 +7758,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_ice,
ICE_DDP_FILENAME_ARG "=</path/to/file>"
ICE_DDP_LOAD_SCHED_ARG "=<0|1>"
ICE_TM_LEVELS_ARG "=<N>"
+ ICE_RL_BURST_SIZE_ARG "=<N>"
ICE_SOURCE_PRUNE_ARG "=<0|1>"
ICE_RX_LOW_LATENCY_ARG "=<0|1>"
ICE_LINK_STATE_ON_CLOSE "=<down|up|initial>");
diff --git a/drivers/net/intel/ice/ice_ethdev.h b/drivers/net/intel/ice/ice_ethdev.h
index 20e8a13fe9..0a9d75b9cd 100644
--- a/drivers/net/intel/ice/ice_ethdev.h
+++ b/drivers/net/intel/ice/ice_ethdev.h
@@ -631,6 +631,7 @@ struct ice_devargs {
uint8_t ddp_load_sched;
uint8_t tm_exposed_levels;
uint8_t source_prune;
+ uint32_t rl_burst_size;
int link_state_on_close;
int xtr_field_offs;
uint8_t xtr_flag_offs[PROTO_XTR_MAX];
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v4 4/5] net/iavf: disable runtime queue setup capability
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
` (2 preceding siblings ...)
2026-07-03 12:19 ` [PATCH v4 3/5] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
@ 2026-07-03 12:19 ` Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 5/5] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
4 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
Remove the advertisement of RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
and RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP capabilities from the
iavf VF driver.
Runtime queue setup on E810 VFs causes queue state corruption when
queues are dynamically reconfigured while the hardware rate limiter
is actively pacing TX queues. Queue configuration messages to the PF
via virtchnl can race with ongoing TX operations, leading to undefined
behavior.
By not advertising these capabilities, all queues are configured at
port start and remain stable throughout the port lifecycle.
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
---
doc/guides/nics/intel_vf.rst | 9 +++++++++
doc/guides/rel_notes/release_26_07.rst | 2 ++
drivers/net/intel/iavf/iavf.h | 1 +
drivers/net/intel/iavf/iavf_ethdev.c | 22 ++++++++++++++++++----
4 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/doc/guides/nics/intel_vf.rst b/doc/guides/nics/intel_vf.rst
index e010f852cf..86878330f2 100644
--- a/doc/guides/nics/intel_vf.rst
+++ b/doc/guides/nics/intel_vf.rst
@@ -131,6 +131,15 @@ IAVF PMD parameters
* ``segment``: Check number of mbuf segments does not exceed HW limits.
* ``offload``: Check for use of an unsupported offload flag.
+``no_runtime_queue_setup``
+ Runtime (post-start) Rx/Tx queue setup can race with the hardware Tx rate
+ limiter on E810 VFs and corrupt queue state.
+ It is advertised by default.
+ Applications that pace queues through the traffic manager can opt out
+ of advertising the runtime queue setup capability
+ by setting ``no_runtime_queue_setup`` to 1,
+ for example, ``-a 18:01.0,no_runtime_queue_setup=1``.
+
HW-Specific Notes For IAVF
^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
index 43b20b97e2..124e074a11 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -135,6 +135,8 @@ New Features
* Added support for transmitting LLDP packets based on mbuf packet type.
* Implemented AVX2 context descriptor transmit paths.
+ * Added ``no_runtime_queue_setup`` devarg to disable runtime queue setup
+ on devices that pace queues through the traffic manager.
* **Updated Intel ice driver.**
diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
index 4444602a30..146f02ea13 100644
--- a/drivers/net/intel/iavf/iavf.h
+++ b/drivers/net/intel/iavf/iavf.h
@@ -326,6 +326,7 @@ struct iavf_devargs {
int no_poll_on_link_down;
uint64_t mbuf_check;
int enable_ptype_lldp;
+ int no_runtime_queue_setup;
};
struct iavf_security_ctx;
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index ec1ad02826..be733f9edf 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -46,6 +46,7 @@
#define IAVF_NO_POLL_ON_LINK_DOWN_ARG "no-poll-on-link-down"
#define IAVF_MBUF_CHECK_ARG "mbuf_check"
#define IAVF_ENABLE_PTYPE_LLDP_ARG "enable_ptype_lldp"
+#define IAVF_NO_RUNTIME_QUEUE_SETUP_ARG "no_runtime_queue_setup"
uint64_t iavf_timestamp_dynflag;
int iavf_timestamp_dynfield_offset = -1;
int rte_pmd_iavf_tx_lldp_dynfield_offset = -1;
@@ -59,6 +60,7 @@ static const char * const iavf_valid_args[] = {
IAVF_NO_POLL_ON_LINK_DOWN_ARG,
IAVF_MBUF_CHECK_ARG,
IAVF_ENABLE_PTYPE_LLDP_ARG,
+ IAVF_NO_RUNTIME_QUEUE_SETUP_ARG,
NULL
};
@@ -1160,9 +1162,15 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
dev_info->reta_size = vf->vf_res->rss_lut_size;
dev_info->flow_type_rss_offloads = IAVF_RSS_OFFLOAD_ALL;
dev_info->max_mac_addrs = IAVF_NUM_MACADDR_MAX;
- dev_info->dev_capa =
- RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
- RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
+ /*
+ * Runtime queue setup can race with the hardware Tx rate limiter on
+ * E810 VFs and corrupt queue state. Applications that pace queues via
+ * the traffic manager can opt out with no_runtime_queue_setup=1.
+ */
+ if (!adapter->devargs.no_runtime_queue_setup)
+ dev_info->dev_capa =
+ RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
+ RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
dev_info->rx_offload_capa =
RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
RTE_ETH_RX_OFFLOAD_QINQ_STRIP |
@@ -2533,6 +2541,11 @@ static int iavf_parse_devargs(struct rte_eth_dev *dev)
if (ret)
goto bail;
+ ret = rte_kvargs_process(kvlist, IAVF_NO_RUNTIME_QUEUE_SETUP_ARG,
+ &parse_bool, &ad->devargs.no_runtime_queue_setup);
+ if (ret)
+ goto bail;
+
bail:
rte_kvargs_free(kvlist);
return ret;
@@ -3619,7 +3632,8 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
-RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf");
+RTE_PMD_REGISTER_PARAM_STRING(net_iavf, "cap=dcf"
+ IAVF_NO_RUNTIME_QUEUE_SETUP_ARG "=<0|1>");
RTE_LOG_REGISTER_SUFFIX(iavf_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(iavf_logtype_driver, driver, NOTICE);
#ifdef RTE_ETHDEV_DEBUG_RX
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH v4 5/5] app/testpmd: add pinned external-buffer Rx pool command
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
` (3 preceding siblings ...)
2026-07-03 12:19 ` [PATCH v4 4/5] net/iavf: disable runtime queue setup capability Dawid Wesierski
@ 2026-07-03 12:19 ` Dawid Wesierski
4 siblings, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 12:19 UTC (permalink / raw)
To: dev; +Cc: thomas, stephen, bruce.richardson, marek.kasiewicz,
Dawid Wesierski
Add the 'create pinned-rxpool <seg-idx> <count> <elt-size>' testpmd
command to demonstrate zero-copy header/payload split receive using
pinned external-buffer mempools (RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF).
Motivation: the DPDK buffer-split offload (RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT)
with two Rx segments allows an application to direct the NIC to place
the protocol header and the payload into separate mbufs. Combining it
with a pinned external-buffer pool for the payload segment lets the NIC
DMA the payload directly into application-owned hugepage memory without
any extra copy or new ethdev API.
This is the mechanism needed by streaming applications such as the
Media Transport Library (MTL) for SMPTE ST 2110-21 video reception,
where 1260-byte RTP payload chunks must land zero-copy in pre-allocated
per-frame video buffers. The existing rte_pktmbuf_pool_create_extbuf()
API covers this use case; no new callback or out-of-tree PMD hook is
required.
The command allocates a hugepage region via rte_zmalloc_socket(),
creates a pinned pool over it with rte_pktmbuf_pool_create_extbuf(),
and registers the pool with testpmd's pool index so that
rx_queue_setup() automatically selects it for the configured split
segment. The complete workflow and a worked video-streaming example are
documented in doc/guides/testpmd_app_ug/testpmd_funcs.rst.
Signed-off-by: Dawid Wesierski <dawid.wesierski@intel.com>
Signed-off-by: Marek Kasiewicz <marek.kasiewicz@intel.com>
---
app/test-pmd/cmdline.c | 123 ++++++++++++++++++++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 82 +++++++++++++
2 files changed, 205 insertions(+)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 3c39e27aa8..83ea6d2cd2 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -371,6 +371,11 @@ static void cmd_help_long_parsed(void *parsed_result,
"inner-ipv6-tcp|inner-ipv4-udp|inner-ipv6-udp|"
"inner-ipv4-sctp|inner-ipv6-sctp\n\n"
+ "create pinned-rxpool (seg-idx) (count) (elt-size)\n"
+ " Create a pinned external-buffer Rx mempool for"
+ " buffer-split segment <seg-idx>. Payloads DMA directly"
+ " into application-owned hugepage memory without copy.\n\n"
+
"set txpkts (x[,y]*)\n"
" Set the length of each segment of TXONLY"
" and optionally CSUM packets.\n\n"
@@ -4483,6 +4488,123 @@ static cmdline_parse_inst_t cmd_set_rxhdrs = {
},
};
+/* *** CREATE PINNED EXTERNAL BUFFER POOL FOR RX SPLIT SEGMENT *** */
+struct cmd_create_pinned_rxpool_result {
+ cmdline_fixed_string_t create;
+ cmdline_fixed_string_t pinned_rxpool;
+ uint16_t seg_idx;
+ uint32_t count;
+ uint16_t elt_size;
+};
+
+static void
+cmd_create_pinned_rxpool_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_create_pinned_rxpool_result *res = parsed_result;
+ char pool_name[RTE_MEMPOOL_NAMESIZE];
+ struct rte_pktmbuf_extmem ext_mem;
+ struct rte_mempool *mp;
+ unsigned int socket_id;
+ size_t mem_size;
+ void *frames;
+
+ if (res->seg_idx >= MAX_SEGS_BUFFER_SPLIT) {
+ fprintf(stderr, "seg-idx must be less than %u\n",
+ MAX_SEGS_BUFFER_SPLIT);
+ return;
+ }
+
+ socket_id = (num_sockets > 0) ? (unsigned int)socket_ids[0] : 0;
+ mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name),
+ res->seg_idx);
+
+ if (mbuf_pool_find(socket_id, res->seg_idx) != NULL) {
+ fprintf(stderr,
+ "Pool '%s' already exists; stop/close port before recreating\n",
+ pool_name);
+ return;
+ }
+
+ mem_size = (size_t)res->count * res->elt_size;
+ frames = rte_zmalloc_socket("pinned_rxpool_mem", mem_size,
+ RTE_CACHE_LINE_SIZE, socket_id);
+ if (frames == NULL) {
+ fprintf(stderr,
+ "Failed to allocate %zu bytes for pinned pool\n",
+ mem_size);
+ return;
+ }
+
+ ext_mem.buf_ptr = frames;
+ ext_mem.buf_iova = rte_malloc_virt2iova(frames);
+ if (ext_mem.buf_iova == RTE_BAD_IOVA) {
+ fprintf(stderr,
+ "No IOVA mapping for pinned pool (VFIO/IOMMU required)\n");
+ rte_free(frames);
+ return;
+ }
+ ext_mem.buf_len = mem_size;
+ ext_mem.elt_size = res->elt_size;
+
+ mp = rte_pktmbuf_pool_create_extbuf(pool_name, res->count,
+ 0, 0, res->elt_size,
+ socket_id, &ext_mem, 1);
+ if (mp == NULL) {
+ fprintf(stderr, "Failed to create pinned pool '%s': %s\n",
+ pool_name, rte_strerror(rte_errno));
+ rte_free(frames);
+ return;
+ }
+
+ /* Register with testpmd so rx_queue_setup() uses this pool for
+ * segment <seg_idx> when buffer-split is configured.
+ */
+ mbuf_data_size[res->seg_idx] = res->elt_size;
+ if ((uint32_t)(res->seg_idx + 1) > mbuf_data_size_n)
+ mbuf_data_size_n = res->seg_idx + 1;
+
+ printf("Created pinned ext-buf pool '%s':\n"
+ " socket=%u seg-idx=%u count=%u elt-size=%u "
+ "mem=%p iova=0x%" PRIx64 "\n",
+ pool_name, socket_id, res->seg_idx, res->count,
+ res->elt_size, frames, ext_mem.buf_iova);
+}
+
+static cmdline_parse_token_string_t cmd_create_pinned_rxpool_create =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ create, "create");
+static cmdline_parse_token_string_t cmd_create_pinned_rxpool_kw =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ pinned_rxpool, "pinned-rxpool");
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_seg_idx =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ seg_idx, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_count =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ count, RTE_UINT32);
+static cmdline_parse_token_num_t cmd_create_pinned_rxpool_elt_size =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_pinned_rxpool_result,
+ elt_size, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_create_pinned_rxpool = {
+ .f = cmd_create_pinned_rxpool_parsed,
+ .data = NULL,
+ .help_str = "create pinned-rxpool <seg-idx> <count> <elt-size>: "
+ "create a pinned external-buffer Rx mempool for split "
+ "segment <seg-idx>; payloads DMA directly into hugepage "
+ "memory owned by the application without an extra copy",
+ .tokens = {
+ (void *)&cmd_create_pinned_rxpool_create,
+ (void *)&cmd_create_pinned_rxpool_kw,
+ (void *)&cmd_create_pinned_rxpool_seg_idx,
+ (void *)&cmd_create_pinned_rxpool_count,
+ (void *)&cmd_create_pinned_rxpool_elt_size,
+ NULL,
+ },
+};
+
/* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */
struct cmd_set_txpkts_result {
@@ -14238,6 +14360,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
&cmd_set_rxoffs,
&cmd_set_rxpkts,
&cmd_set_rxhdrs,
+ &cmd_create_pinned_rxpool,
&cmd_set_txflows,
&cmd_set_txpkts,
&cmd_set_txsplit,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index f0f2b0758b..0ca263cc4e 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -867,6 +867,88 @@ Where eth[,ipv4]* represents a CSV list of values, without white space.
If the list of offsets is shorter than the list of segments,
zero offsets will be used for the remaining segments.
+create pinned-rxpool
+~~~~~~~~~~~~~~~~~~~~
+
+Create a pinned external-buffer Rx mempool for a buffer-split payload
+segment. Each mbuf in the pool is permanently bound to a fixed slot in
+a contiguous hugepage region allocated by testpmd. When the NIC
+performs a buffer-split receive, the payload DMA-writes directly into
+that hugepage memory without any extra copy from a normal mbuf.
+
+.. code-block:: none
+
+ testpmd> create pinned-rxpool (seg-idx) (count) (elt-size)
+
+Where:
+
+seg-idx
+ Index of the Rx split segment that will use the pinned pool.
+ 0 is the header segment (usually left as the default pool);
+ 1 is the first payload segment and is the typical target.
+
+count
+ Number of mbufs in the pool. Should be at least as large as the
+ number of Rx descriptors on all queues using this pool, plus a
+ safety margin (e.g. ``nb_rxd * nb_rxq * 2``).
+
+elt-size
+ Size of each pool element in bytes. This is the total slot stride,
+ including ``RTE_PKTMBUF_HEADROOM`` (default 128 B). For example,
+ to hold 1260-byte video payloads (SMPTE ST 2110-21 BPM size) with
+ a standard headroom, set ``elt-size`` to 1388 (= 128 + 1260).
+
+The pool is named according to testpmd's internal convention so that
+``rx_queue_setup()`` automatically selects it for segment ``seg-idx``
+when ``RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT`` is enabled.
+
+.. note::
+
+ VFIO or another IOMMU driver is required so that hugepage memory
+ has a valid IOVA. The backing hugepage allocation is not freed when
+ the port is stopped or the pool is re-created; restart testpmd to
+ reclaim it.
+
+**Example — zero-copy header/payload split for video streaming**
+
+This example mirrors the use case in the Media Transport Library (MTL)
+for SMPTE ST 2110-21 video reception. Headers land in the default
+pool; 1260-byte video payloads DMA directly into a pinned hugepage
+region without any copy. The pool holds enough slots for 4 K
+descriptors on 4 queues with headroom:
+
+.. code-block:: console
+
+ # Start testpmd with a default header pool (segment 0)
+ dpdk-testpmd -a 0000:31:00.0,enable-rx-timestamp=0 \
+ --mbuf-size=256 -- -i --rxq=4 --txq=4 --rxd=4096
+
+ # Inside testpmd:
+
+ # 1. Create the pinned payload pool for segment 1 (4*4096 mbufs,
+ # 1388 bytes each: 128 B headroom + 1260 B payload)
+ testpmd> create pinned-rxpool 1 32768 1388
+
+ # 2. Configure buffer split: segment 0 = UDP+lower headers,
+ # segment 1 = payload (length 0 means "rest of packet")
+ testpmd> set rxhdrs ipv4-udp
+ testpmd> set rxpkts 0,0
+
+ # 3. Enable buffer split on the port
+ testpmd> port config 0 rx_offload buffer_split on
+
+ # 4. Restart the queues so the new configuration takes effect
+ testpmd> stop
+ testpmd> port stop 0
+ testpmd> port start 0
+ testpmd> start
+
+After this sequence, each received UDP packet is split by the NIC:
+the header mbuf (chain head) comes from the default pool, and the
+payload mbuf (chain next) has its ``buf_addr`` pointing into the
+pinned hugepage region owned by the application — no copy, no
+callback, no new ethdev API.
+
set txpkts
~~~~~~~~~~
--
2.47.3
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled
2026-06-30 12:06 ` [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
2026-06-30 15:39 ` Bruce Richardson
@ 2026-07-03 20:00 ` Dawid Wesierski
1 sibling, 0 replies; 44+ messages in thread
From: Dawid Wesierski @ 2026-07-03 20:00 UTC (permalink / raw)
To: dawid.wesierski; +Cc: dev, bruce.richardson
I agree with Bruce's.
Mislabeling all packets with the PTP flag (RTE_MBUF_F_RX_IEEE1588_PTP) is incorrect.
The goal is to provide hardware timestamps for all received traffic (for high-resolution packet capture),
the existing RTE_ETH_RX_OFFLOAD_TIMESTAMP offload flag is the appropriate way to achieve this.
I am testing the "proper" way and it seems to be working, will drop this patch from the series.
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
^ permalink raw reply [flat|nested] 44+ messages in thread
end of thread, other threads:[~2026-07-03 19:35 UTC | newest]
Thread overview: 44+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-08 16:40 [PATCH 0/7] intel network and pcapng updates Dawid Wesierski
2026-06-08 16:40 ` [PATCH 1/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-06-08 16:40 ` [PATCH 2/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
2026-06-08 16:40 ` [PATCH 3/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
2026-06-08 16:40 ` [PATCH 4/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
2026-06-08 16:40 ` [PATCH 5/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
2026-06-08 16:40 ` [PATCH 6/7] pcapng: add user-supplied timestamp support Dawid Wesierski
2026-06-08 17:09 ` Stephen Hemminger
2026-06-08 16:40 ` [PATCH 7/7] net/ice: add header split mbuf callback support Dawid Wesierski
2026-06-08 16:59 ` [PATCH 0/7] intel network and pcapng updates Thomas Monjalon
2026-06-18 14:44 ` [PATCH v3 1/1] pcapng: add user-supplied timestamp support Dawid Wesierski
2026-06-18 15:20 ` Stephen Hemminger
2026-06-18 14:44 ` [PATCH v2 0/7] Intel network drivers enhancements Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 1/7] ethdev: add header split mbuf callback API Dawid Wesierski
2026-06-18 16:26 ` Thomas Monjalon
2026-06-18 14:44 ` [PATCH v2 2/7] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 3/7] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 4/7] net/ice/base: reduce default scheduler burst size Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 5/7] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 6/7] net/iavf: disable runtime queue setup capability Dawid Wesierski
2026-06-18 14:44 ` [PATCH v2 7/7] net/intel: support header split mbuf callback Dawid Wesierski
2026-06-29 15:33 ` Tested the v3 series on Intel E810-C (Columbiaville) hardware Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 0/6] Intel network drivers enhancements Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 1/6] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-06-30 14:29 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 2/6] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
2026-06-30 14:46 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 3/6] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
2026-06-30 15:20 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 4/6] net/ice: timestamp all received packets when PTP is enabled Dawid Wesierski
2026-06-30 15:39 ` Bruce Richardson
2026-07-03 20:00 ` Dawid Wesierski
2026-06-30 12:06 ` [PATCH v3 5/6] net/iavf: disable runtime queue setup capability Dawid Wesierski
2026-06-30 15:44 ` Bruce Richardson
2026-06-30 12:06 ` [PATCH v3 6/6] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
2026-07-01 10:42 ` [PATCH v3 0/6] Intel network drivers enhancements Bruce Richardson
2026-07-03 12:19 ` [PATCH v4 0/5] " Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 1/5] net/iavf: increase max ring descriptors to hardware limit Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 2/5] net/iavf: allow runtime queue rate limit configuration Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 3/5] net/ice: add scheduler rate-limiter burst size devarg Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 4/5] net/iavf: disable runtime queue setup capability Dawid Wesierski
2026-07-03 12:19 ` [PATCH v4 5/5] app/testpmd: add pinned external-buffer Rx pool command Dawid Wesierski
2026-06-18 15:45 ` [PATCH v2 0/7] Intel network drivers enhancements Stephen Hemminger
2026-06-18 15:46 ` Stephen Hemminger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox