* [PATCH v2 1/4] net/ark: add PCIe IDS for newly supported devices
@ 2025-09-10 18:57 Ed Czeck
2025-09-10 18:57 ` [PATCH v2 2/4] net/ark: remove double mbuf frees Ed Czeck
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Ed Czeck @ 2025-09-10 18:57 UTC (permalink / raw)
To: dev, stephen; +Cc: Shepard Siegel, John Miller
Update documentation and release notes
update link speed capabilities for 200G and 400G
Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
---
v2:
- included 2 more device id
- updated link speeds
---
doc/guides/nics/ark.rst | 7 +++++++
drivers/net/ark/ark_ethdev.c | 10 +++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/doc/guides/nics/ark.rst b/doc/guides/nics/ark.rst
index 6aabde2ed5..c8ed57289b 100644
--- a/doc/guides/nics/ark.rst
+++ b/doc/guides/nics/ark.rst
@@ -310,6 +310,12 @@ ARK PMD supports the following Arkville RTL PCIe instances including:
* ``1d6c:1024`` - AR-TK242 [2x100GbE Packet Capture Device]
* ``1d6c:1025`` - AR-TK242-FX2 [2x100GbE Gen5 Packet Capture Device]
* ``1d6c:1026`` - AR-TK242-FX2 [1x200GbE Gen5 Packet Capture Device]
+* ``1d6c:102a`` - AR-TK242-FX2 [4x100GbE Gen5 Packet Capture Device]
+* ``1d6c:102b`` - AR-ARKV-FX1 [Arkville 128B DPDK Data Mover for Versal/CPM5]
+* ``1d6c:102c`` - AR-TK242-V80 [Gen5 PCAP Processor]
+* ``1d6c:102d`` - AR-TK242-FX2 [8x10GbE Gen5 Packet Capture-Replay Device]
+* ``1d6c:102e`` - AR-TK242-FX2 [8x25GbE Gen5 Packet Capture-Replay Device]
+* ``1d6c:102f`` - AR-TK242-FX2 [1x400GbE Gen5 Packet Capture-Replay Device]
Arkville RTL Core Configurations
--------------------------------
@@ -322,6 +328,7 @@ stream interfaces for both AMD/Xilinx and Intel FPGAs.
* ARK-FX0 - 256-bit 32B datapath (PCIe Gen3, Gen4)
* ARK-FX1 - 512-bit 64B datapath (PCIe Gen3, Gen4, Gen5)
+* ARKV-FX1 - 1024-bit 128B datapath (AMD PCIe Versal, Gen5 )
* ARK-FX2 - 1024-bit 128B datapath (PCIe Gen5x16 Only)
DPDK and Arkville Firmware Versioning
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index c029dc46b3..8d3c0a1b02 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -102,6 +102,12 @@ static const struct rte_pci_id pci_id_ark_map[] = {
{RTE_PCI_DEVICE(AR_VENDOR_ID, 0x1024)},
{RTE_PCI_DEVICE(AR_VENDOR_ID, 0x1025)},
{RTE_PCI_DEVICE(AR_VENDOR_ID, 0x1026)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102a)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102b)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102c)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102d)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102e)},
+ {RTE_PCI_DEVICE(AR_VENDOR_ID, 0x102f)},
{.vendor_id = 0, /* sentinel */ },
};
@@ -733,7 +739,9 @@ eth_ark_dev_info_get(struct rte_eth_dev *dev,
RTE_ETH_LINK_SPEED_25G |
RTE_ETH_LINK_SPEED_40G |
RTE_ETH_LINK_SPEED_50G |
- RTE_ETH_LINK_SPEED_100G);
+ RTE_ETH_LINK_SPEED_100G |
+ RTE_ETH_LINK_SPEED_200G |
+ RTE_ETH_LINK_SPEED_400G);
dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_TIMESTAMP;
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] net/ark: remove double mbuf frees
2025-09-10 18:57 [PATCH v2 1/4] net/ark: add PCIe IDS for newly supported devices Ed Czeck
@ 2025-09-10 18:57 ` Ed Czeck
2025-09-10 18:57 ` [PATCH v2 3/4] net/ark: improve ring handling for segmented packets Ed Czeck
2025-09-10 18:57 ` [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion Ed Czeck
2 siblings, 0 replies; 6+ messages in thread
From: Ed Czeck @ 2025-09-10 18:57 UTC (permalink / raw)
To: dev, stephen; +Cc: John Miller, stable, Shepard Siegel
From: John Miller <john.miller@atomicrules.com>
Fixes: 8b154b690266 ("net/ark: add Rx initial version")
Cc: stable@dpdk.org
Signed-off-by: John Miller <john.miller@atomicrules.com>
---
drivers/net/ark/ark_ethdev_rx.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c
index 80e431f1ae..6077d98ae0 100644
--- a/drivers/net/ark/ark_ethdev_rx.c
+++ b/drivers/net/ark/ark_ethdev_rx.c
@@ -538,7 +538,6 @@ void
eth_ark_dev_rx_queue_release(void *vqueue)
{
struct ark_rx_queue *queue;
- uint32_t i;
queue = (struct ark_rx_queue *)vqueue;
if (queue == 0)
@@ -551,9 +550,6 @@ eth_ark_dev_rx_queue_release(void *vqueue)
/* Need to clear out mbufs here, dropping packets along the way */
eth_ark_rx_queue_drain(queue);
- for (i = 0; i < queue->queue_size; ++i)
- rte_pktmbuf_free(queue->reserve_q[i]);
-
rte_free(queue->reserve_q);
rte_free(queue->paddress_q);
rte_free(queue);
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/4] net/ark: improve ring handling for segmented packets
2025-09-10 18:57 [PATCH v2 1/4] net/ark: add PCIe IDS for newly supported devices Ed Czeck
2025-09-10 18:57 ` [PATCH v2 2/4] net/ark: remove double mbuf frees Ed Czeck
@ 2025-09-10 18:57 ` Ed Czeck
2025-09-10 18:57 ` [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion Ed Czeck
2 siblings, 0 replies; 6+ messages in thread
From: Ed Czeck @ 2025-09-10 18:57 UTC (permalink / raw)
To: dev, stephen; +Cc: Shepard Siegel, John Miller
handle case where complete packet is not yet available
Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
---
drivers/net/ark/ark_ethdev_rx.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c
index 6077d98ae0..1b5c4b64a4 100644
--- a/drivers/net/ark/ark_ethdev_rx.c
+++ b/drivers/net/ark/ark_ethdev_rx.c
@@ -313,11 +313,15 @@ eth_ark_recv_pkts(void *rx_queue,
}
}
- if (unlikely(meta->pkt_len > queue->dataroom))
- cons_index = eth_ark_rx_jumbo
- (queue, meta, mbuf, cons_index + 1);
- else
+ if (unlikely(meta->pkt_len > queue->dataroom)) {
+ uint32_t tcons = eth_ark_rx_jumbo(queue, meta, mbuf, cons_index + 1);
+ if ((int32_t)(prod_index - tcons) >= 0)
+ cons_index = tcons; /* nominal condition */
+ else
+ break;
+ } else {
cons_index += 1;
+ }
rx_pkts[nb] = mbuf;
nb++;
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion
2025-09-10 18:57 [PATCH v2 1/4] net/ark: add PCIe IDS for newly supported devices Ed Czeck
2025-09-10 18:57 ` [PATCH v2 2/4] net/ark: remove double mbuf frees Ed Czeck
2025-09-10 18:57 ` [PATCH v2 3/4] net/ark: improve ring handling for segmented packets Ed Czeck
@ 2025-09-10 18:57 ` Ed Czeck
2025-09-13 16:26 ` Stephen Hemminger
2 siblings, 1 reply; 6+ messages in thread
From: Ed Czeck @ 2025-09-10 18:57 UTC (permalink / raw)
To: dev, stephen; +Cc: Shepard Siegel, John Miller
use 4-K page aligned buffers to reduce PCIe requests
reduce message spew
attempt to allocate smaller chunks of buffers during starvation
Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
---
v2:
- reduced message to single line.
- Added comments on buffer alignment. PCIe devices deal with page
size of 4096 bytes. By aligning this buffer to a 4K boundary, we
will reduce the number of PCIe read requests.
---
drivers/net/ark/ark_ethdev_rx.c | 34 ++++++++++++++++++++++-----------
1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c
index 1b5c4b64a4..74f6d70d1e 100644
--- a/drivers/net/ark/ark_ethdev_rx.c
+++ b/drivers/net/ark/ark_ethdev_rx.c
@@ -42,6 +42,7 @@ struct __rte_cache_aligned ark_rx_queue {
rx_user_meta_hook_fn rx_user_meta_hook;
void *ext_user_data;
+ uint32_t starvation;
uint32_t dataroom;
uint32_t headroom;
@@ -57,8 +58,6 @@ struct __rte_cache_aligned ark_rx_queue {
/* The queue Index is used within the dpdk device structures */
uint16_t queue_index;
- uint32_t unused;
-
/* next cache line - fields written by device */
alignas(RTE_CACHE_LINE_MIN_SIZE) RTE_MARKER cacheline1;
@@ -187,10 +186,11 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev,
nb_desc * sizeof(struct rte_mbuf *),
512,
socket_id);
+ /* Align buffer to PCIe's page size of 4K to reduce upstream read requests from FPGA */
queue->paddress_q =
rte_zmalloc_socket("Ark_rx_queue paddr",
nb_desc * sizeof(rte_iova_t),
- 512,
+ 4096,
socket_id);
if (queue->reserve_q == 0 || queue->paddress_q == 0) {
@@ -265,6 +265,9 @@ eth_ark_recv_pkts(void *rx_queue,
return 0;
if (unlikely(nb_pkts == 0))
return 0;
+ if (unlikely(queue->starvation))
+ eth_ark_rx_seed_mbufs(queue);
+
prod_index = queue->prod_index;
cons_index = queue->cons_index;
if (prod_index == cons_index)
@@ -453,7 +456,7 @@ eth_ark_rx_stop_queue(struct rte_eth_dev *dev, uint16_t queue_id)
static inline int
eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
{
- uint32_t limit = (queue->cons_index & ~(ARK_RX_MPU_CHUNK - 1)) +
+ uint32_t limit = RTE_ALIGN_FLOOR(queue->cons_index, ARK_RX_MPU_CHUNK) +
queue->queue_size;
uint32_t seed_index = queue->seed_index;
@@ -461,23 +464,32 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
uint32_t seed_m = queue->seed_index & queue->queue_mask;
uint32_t nb = limit - seed_index;
+ int status;
/* Handle wrap around -- remainder is filled on the next call */
if (unlikely(seed_m + nb > queue->queue_size))
nb = queue->queue_size - seed_m;
struct rte_mbuf **mbufs = &queue->reserve_q[seed_m];
- int status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb);
+ do {
+ status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb);
+ if (status == 0)
+ break;
+ /* Try again with a smaller request, keeping aligned with chunk size */
+ nb = RTE_ALIGN_FLOOR(nb / 2, ARK_RX_MPU_CHUNK);
+ } while (nb >= ARK_RX_MPU_CHUNK);
if (unlikely(status != 0)) {
- ARK_PMD_LOG(NOTICE,
- "Could not allocate %u mbufs from pool"
- " for RX queue %u;"
- " %u free buffers remaining in queue\n",
- nb, queue->queue_index,
- queue->seed_index - queue->cons_index);
+ if (queue->starvation == 0) {
+ ARK_PMD_LOG(NOTICE,
+ "Could not allocate %u mbufs from pool for RX queue %u; %u free buffers remaining\n",
+ ARK_RX_MPU_CHUNK, queue->queue_index,
+ queue->seed_index - queue->cons_index);
+ queue->starvation = 1;
+ }
return -1;
}
+ queue->starvation = 0;
if (ARK_DEBUG_CORE) { /* DEBUG */
while (count != nb) {
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion
2025-09-10 19:04 ` [PATCH v2 " Ed Czeck
@ 2025-09-10 19:04 ` Ed Czeck
0 siblings, 0 replies; 6+ messages in thread
From: Ed Czeck @ 2025-09-10 19:04 UTC (permalink / raw)
To: dev, stephen; +Cc: Shepard Siegel, John Miller
use 4-K page aligned buffers to reduce PCIe requests
reduce message spew
attempt to allocate smaller chunks of buffers during starvation
Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
---
v2:
- reduced message to single line.
- Added comments on buffer alignment. PCIe devices deal with page
size of 4096 bytes. By aligning this buffer to a 4K boundary, we
will reduce the number of PCIe read requests.
---
drivers/net/ark/ark_ethdev_rx.c | 34 ++++++++++++++++++++++-----------
1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c
index 1b5c4b64a4..74f6d70d1e 100644
--- a/drivers/net/ark/ark_ethdev_rx.c
+++ b/drivers/net/ark/ark_ethdev_rx.c
@@ -42,6 +42,7 @@ struct __rte_cache_aligned ark_rx_queue {
rx_user_meta_hook_fn rx_user_meta_hook;
void *ext_user_data;
+ uint32_t starvation;
uint32_t dataroom;
uint32_t headroom;
@@ -57,8 +58,6 @@ struct __rte_cache_aligned ark_rx_queue {
/* The queue Index is used within the dpdk device structures */
uint16_t queue_index;
- uint32_t unused;
-
/* next cache line - fields written by device */
alignas(RTE_CACHE_LINE_MIN_SIZE) RTE_MARKER cacheline1;
@@ -187,10 +186,11 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev,
nb_desc * sizeof(struct rte_mbuf *),
512,
socket_id);
+ /* Align buffer to PCIe's page size of 4K to reduce upstream read requests from FPGA */
queue->paddress_q =
rte_zmalloc_socket("Ark_rx_queue paddr",
nb_desc * sizeof(rte_iova_t),
- 512,
+ 4096,
socket_id);
if (queue->reserve_q == 0 || queue->paddress_q == 0) {
@@ -265,6 +265,9 @@ eth_ark_recv_pkts(void *rx_queue,
return 0;
if (unlikely(nb_pkts == 0))
return 0;
+ if (unlikely(queue->starvation))
+ eth_ark_rx_seed_mbufs(queue);
+
prod_index = queue->prod_index;
cons_index = queue->cons_index;
if (prod_index == cons_index)
@@ -453,7 +456,7 @@ eth_ark_rx_stop_queue(struct rte_eth_dev *dev, uint16_t queue_id)
static inline int
eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
{
- uint32_t limit = (queue->cons_index & ~(ARK_RX_MPU_CHUNK - 1)) +
+ uint32_t limit = RTE_ALIGN_FLOOR(queue->cons_index, ARK_RX_MPU_CHUNK) +
queue->queue_size;
uint32_t seed_index = queue->seed_index;
@@ -461,23 +464,32 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
uint32_t seed_m = queue->seed_index & queue->queue_mask;
uint32_t nb = limit - seed_index;
+ int status;
/* Handle wrap around -- remainder is filled on the next call */
if (unlikely(seed_m + nb > queue->queue_size))
nb = queue->queue_size - seed_m;
struct rte_mbuf **mbufs = &queue->reserve_q[seed_m];
- int status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb);
+ do {
+ status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb);
+ if (status == 0)
+ break;
+ /* Try again with a smaller request, keeping aligned with chunk size */
+ nb = RTE_ALIGN_FLOOR(nb / 2, ARK_RX_MPU_CHUNK);
+ } while (nb >= ARK_RX_MPU_CHUNK);
if (unlikely(status != 0)) {
- ARK_PMD_LOG(NOTICE,
- "Could not allocate %u mbufs from pool"
- " for RX queue %u;"
- " %u free buffers remaining in queue\n",
- nb, queue->queue_index,
- queue->seed_index - queue->cons_index);
+ if (queue->starvation == 0) {
+ ARK_PMD_LOG(NOTICE,
+ "Could not allocate %u mbufs from pool for RX queue %u; %u free buffers remaining\n",
+ ARK_RX_MPU_CHUNK, queue->queue_index,
+ queue->seed_index - queue->cons_index);
+ queue->starvation = 1;
+ }
return -1;
}
+ queue->starvation = 0;
if (ARK_DEBUG_CORE) { /* DEBUG */
while (count != nb) {
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion
2025-09-10 18:57 ` [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion Ed Czeck
@ 2025-09-13 16:26 ` Stephen Hemminger
0 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2025-09-13 16:26 UTC (permalink / raw)
To: Ed Czeck; +Cc: dev, Shepard Siegel, John Miller
On Wed, 10 Sep 2025 14:57:20 -0400
Ed Czeck <ed.czeck@atomicrules.com> wrote:
> use 4-K page aligned buffers to reduce PCIe requests
> reduce message spew
> attempt to allocate smaller chunks of buffers during starvation
>
> Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
> ---
> v2:
> - reduced message to single line.
> - Added comments on buffer alignment. PCIe devices deal with page
> size of 4096 bytes. By aligning this buffer to a 4K boundary, we
> will reduce the number of PCIe read requests.
It would be clearer if there was a #define for the magic 4096 size.
Is the IOMMU page size? The PCI devices themselves don't usually
have page visibility.
Alignment in this case is really a workaround for "don't cross
the boundary". It looks like the rte_malloc library doesn't have
better way to express that.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-09-13 16:26 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-10 18:57 [PATCH v2 1/4] net/ark: add PCIe IDS for newly supported devices Ed Czeck
2025-09-10 18:57 ` [PATCH v2 2/4] net/ark: remove double mbuf frees Ed Czeck
2025-09-10 18:57 ` [PATCH v2 3/4] net/ark: improve ring handling for segmented packets Ed Czeck
2025-09-10 18:57 ` [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion Ed Czeck
2025-09-13 16:26 ` Stephen Hemminger
-- strict thread matches above, loose matches on Subject: below --
2025-09-03 21:28 [PATCH 1/4] net/ark: add PCIe IDS for newly supported devices Ed Czeck
2025-09-10 19:04 ` [PATCH v2 " Ed Czeck
2025-09-10 19:04 ` [PATCH v2 4/4] net/ark: improve Rx queue recovery after mbuf exhaustion Ed Czeck
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.